(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["rup"] = factory();
	else
		root["rup"] = factory();
})(window, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({

/***/ "./node_modules/@babel/polyfill/lib/index.js":
/*!***************************************************!*\
  !*** ./node_modules/@babel/polyfill/lib/index.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n__webpack_require__(/*! ./noConflict */ \"./node_modules/@babel/polyfill/lib/noConflict.js\");\n\nvar _global = _interopRequireDefault(__webpack_require__(/*! core-js/library/fn/global */ \"./node_modules/core-js/library/fn/global.js\"));\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nif (_global[\"default\"]._babelPolyfill && typeof console !== \"undefined\" && console.warn) {\n  console.warn(\"@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended \" + \"and may have consequences if different versions of the polyfills are applied sequentially. \" + \"If you do need to load the polyfill more than once, use @babel/polyfill/noConflict \" + \"instead to bypass the warning.\");\n}\n\n_global[\"default\"]._babelPolyfill = true;\n\n//# sourceURL=webpack://rup/./node_modules/@babel/polyfill/lib/index.js?");

/***/ }),

/***/ "./node_modules/@babel/polyfill/lib/noConflict.js":
/*!********************************************************!*\
  !*** ./node_modules/@babel/polyfill/lib/noConflict.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n__webpack_require__(/*! core-js/es6 */ \"./node_modules/core-js/es6/index.js\");\n\n__webpack_require__(/*! core-js/fn/array/includes */ \"./node_modules/core-js/fn/array/includes.js\");\n\n__webpack_require__(/*! core-js/fn/array/flat-map */ \"./node_modules/core-js/fn/array/flat-map.js\");\n\n__webpack_require__(/*! core-js/fn/string/pad-start */ \"./node_modules/core-js/fn/string/pad-start.js\");\n\n__webpack_require__(/*! core-js/fn/string/pad-end */ \"./node_modules/core-js/fn/string/pad-end.js\");\n\n__webpack_require__(/*! core-js/fn/string/trim-start */ \"./node_modules/core-js/fn/string/trim-start.js\");\n\n__webpack_require__(/*! core-js/fn/string/trim-end */ \"./node_modules/core-js/fn/string/trim-end.js\");\n\n__webpack_require__(/*! core-js/fn/symbol/async-iterator */ \"./node_modules/core-js/fn/symbol/async-iterator.js\");\n\n__webpack_require__(/*! core-js/fn/object/get-own-property-descriptors */ \"./node_modules/core-js/fn/object/get-own-property-descriptors.js\");\n\n__webpack_require__(/*! core-js/fn/object/values */ \"./node_modules/core-js/fn/object/values.js\");\n\n__webpack_require__(/*! core-js/fn/object/entries */ \"./node_modules/core-js/fn/object/entries.js\");\n\n__webpack_require__(/*! core-js/fn/promise/finally */ \"./node_modules/core-js/fn/promise/finally.js\");\n\n__webpack_require__(/*! core-js/web */ \"./node_modules/core-js/web/index.js\");\n\n__webpack_require__(/*! regenerator-runtime/runtime */ \"./node_modules/regenerator-runtime/runtime.js\");\n\n//# sourceURL=webpack://rup/./node_modules/@babel/polyfill/lib/noConflict.js?");

/***/ }),

/***/ "./node_modules/block-ui/jquery.blockUI.js":
/*!*************************************************!*\
  !*** ./node_modules/block-ui/jquery.blockUI.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\r\n * jQuery blockUI plugin\r\n * Version 2.70.0-2014.11.23\r\n * Requires jQuery v1.7 or later\r\n *\r\n * Examples at: http://malsup.com/jquery/block/\r\n * Copyright (c) 2007-2013 M. Alsup\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl.html\r\n *\r\n * Thanks to Amir-Hossein Sobhi for some excellent contributions!\r\n */\n;\n\n(function () {\n  /*jshint eqeqeq:false curly:false latedef:false */\n  \"use strict\";\n\n  function setup($) {\n    $.fn._fadeIn = $.fn.fadeIn;\n\n    var noOp = $.noop || function () {}; // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle\n    // confusing userAgent strings on Vista)\n\n\n    var msie = /MSIE/.test(navigator.userAgent);\n    var ie6 = /MSIE 6.0/.test(navigator.userAgent) && !/MSIE 8.0/.test(navigator.userAgent);\n    var mode = document.documentMode || 0;\n    var setExpr = $.isFunction(document.createElement('div').style.setExpression); // global $ methods for blocking/unblocking the entire page\n\n    $.blockUI = function (opts) {\n      install(window, opts);\n    };\n\n    $.unblockUI = function (opts) {\n      remove(window, opts);\n    }; // convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)\n\n\n    $.growlUI = function (title, message, timeout, onClose) {\n      var $m = $('<div class=\"growlUI\"></div>');\n      if (title) $m.append('<h1>' + title + '</h1>');\n      if (message) $m.append('<h2>' + message + '</h2>');\n      if (timeout === undefined) timeout = 3000; // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications\n\n      var callBlock = function callBlock(opts) {\n        opts = opts || {};\n        $.blockUI({\n          message: $m,\n          fadeIn: typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700,\n          fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,\n          timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,\n          centerY: false,\n          showOverlay: false,\n          onUnblock: onClose,\n          css: $.blockUI.defaults.growlCSS\n        });\n      };\n\n      callBlock();\n      var nonmousedOpacity = $m.css('opacity');\n      $m.mouseover(function () {\n        callBlock({\n          fadeIn: 0,\n          timeout: 30000\n        });\n        var displayBlock = $('.blockMsg');\n        displayBlock.stop(); // cancel fadeout if it has started\n\n        displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency\n      }).mouseout(function () {\n        $('.blockMsg').fadeOut(1000);\n      }); // End konapun additions\n    }; // plugin method for blocking element content\n\n\n    $.fn.block = function (opts) {\n      if (this[0] === window) {\n        $.blockUI(opts);\n        return this;\n      }\n\n      var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});\n      this.each(function () {\n        var $el = $(this);\n        if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) return;\n        $el.unblock({\n          fadeOut: 0\n        });\n      });\n      return this.each(function () {\n        if ($.css(this, 'position') == 'static') {\n          this.style.position = 'relative';\n          $(this).data('blockUI.static', true);\n        }\n\n        this.style.zoom = 1; // force 'hasLayout' in ie\n\n        install(this, opts);\n      });\n    }; // plugin method for unblocking element content\n\n\n    $.fn.unblock = function (opts) {\n      if (this[0] === window) {\n        $.unblockUI(opts);\n        return this;\n      }\n\n      return this.each(function () {\n        remove(this, opts);\n      });\n    };\n\n    $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost!\n    // override these in your code to change the default behavior and style\n\n    $.blockUI.defaults = {\n      // message displayed when blocking (use null for no message)\n      message: '<h1>Please wait...</h1>',\n      title: null,\n      // title string; only used when theme == true\n      draggable: true,\n      // only used when theme == true (requires jquery-ui.js to be loaded)\n      theme: false,\n      // set to true to use with jQuery UI themes\n      // styles for the message when blocking; if you wish to disable\n      // these and use an external stylesheet then do this in your code:\n      // $.blockUI.defaults.css = {};\n      css: {\n        padding: 0,\n        margin: 0,\n        width: '30%',\n        top: '40%',\n        left: '35%',\n        textAlign: 'center',\n        color: '#000',\n        border: '3px solid #aaa',\n        backgroundColor: '#fff',\n        cursor: 'wait'\n      },\n      // minimal style set used when themes are used\n      themedCSS: {\n        width: '30%',\n        top: '40%',\n        left: '35%'\n      },\n      // styles for the overlay\n      overlayCSS: {\n        backgroundColor: '#000',\n        opacity: 0.6,\n        cursor: 'wait'\n      },\n      // style to replace wait cursor before unblocking to correct issue\n      // of lingering wait cursor\n      cursorReset: 'default',\n      // styles applied when using $.growlUI\n      growlCSS: {\n        width: '350px',\n        top: '10px',\n        left: '',\n        right: '10px',\n        border: 'none',\n        padding: '5px',\n        opacity: 0.6,\n        cursor: 'default',\n        color: '#fff',\n        backgroundColor: '#000',\n        '-webkit-border-radius': '10px',\n        '-moz-border-radius': '10px',\n        'border-radius': '10px'\n      },\n      // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w\n      // (hat tip to Jorge H. N. de Vasconcelos)\n\n      /*jshint scripturl:true */\n      iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',\n      // force usage of iframe in non-IE browsers (handy for blocking applets)\n      forceIframe: false,\n      // z-index for the blocking overlay\n      baseZ: 1000,\n      // set these to true to have the message automatically centered\n      centerX: true,\n      // <-- only effects element blocking (page block controlled via css above)\n      centerY: true,\n      // allow body element to be stetched in ie6; this makes blocking look better\n      // on \"short\" pages.  disable if you wish to prevent changes to the body height\n      allowBodyStretch: true,\n      // enable if you want key and mouse events to be disabled for content that is blocked\n      bindEvents: true,\n      // be default blockUI will supress tab navigation from leaving blocking content\n      // (if bindEvents is true)\n      constrainTabKey: true,\n      // fadeIn time in millis; set to 0 to disable fadeIn on block\n      fadeIn: 200,\n      // fadeOut time in millis; set to 0 to disable fadeOut on unblock\n      fadeOut: 400,\n      // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock\n      timeout: 0,\n      // disable if you don't want to show the overlay\n      showOverlay: true,\n      // if true, focus will be placed in the first available input field when\n      // page blocking\n      focusInput: true,\n      // elements that can receive focus\n      focusableElements: ':input:enabled:visible',\n      // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)\n      // no longer needed in 2012\n      // applyPlatformOpacityRules: true,\n      // callback method invoked when fadeIn has completed and blocking message is visible\n      onBlock: null,\n      // callback method invoked when unblocking has completed; the callback is\n      // passed the element that has been unblocked (which is the window object for page\n      // blocks) and the options that were passed to the unblock call:\n      //\tonUnblock(element, options)\n      onUnblock: null,\n      // callback method invoked when the overlay area is clicked.\n      // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.\n      onOverlayClick: null,\n      // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493\n      quirksmodeOffsetHack: 4,\n      // class name of the message block\n      blockMsgClass: 'blockMsg',\n      // if it is already blocked, then ignore it (don't unblock and reblock)\n      ignoreIfBlocked: false\n    }; // private data and functions follow...\n\n    var pageBlock = null;\n    var pageBlockEls = [];\n\n    function install(el, opts) {\n      var css, themedCSS;\n      var full = el == window;\n      var msg = opts && opts.message !== undefined ? opts.message : undefined;\n      opts = $.extend({}, $.blockUI.defaults, opts || {});\n      if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) return;\n      opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});\n      css = $.extend({}, $.blockUI.defaults.css, opts.css || {});\n      if (opts.onOverlayClick) opts.overlayCSS.cursor = 'pointer';\n      themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});\n      msg = msg === undefined ? opts.message : msg; // remove the current block (if there is one)\n\n      if (full && pageBlock) remove(window, {\n        fadeOut: 0\n      }); // if an existing element is being used as the blocking content then we capture\n      // its current place in the DOM (and current display style) so we can restore\n      // it when we unblock\n\n      if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {\n        var node = msg.jquery ? msg[0] : msg;\n        var data = {};\n        $(el).data('blockUI.history', data);\n        data.el = node;\n        data.parent = node.parentNode;\n        data.display = node.style.display;\n        data.position = node.style.position;\n        if (data.parent) data.parent.removeChild(node);\n      }\n\n      $(el).data('blockUI.onUnblock', opts.onUnblock);\n      var z = opts.baseZ; // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;\n      // layer1 is the iframe layer which is used to supress bleed through of underlying content\n      // layer2 is the overlay layer which has opacity and a wait cursor (by default)\n      // layer3 is the message content that is displayed while blocking\n\n      var lyr1, lyr2, lyr3, s;\n      if (msie || opts.forceIframe) lyr1 = $('<iframe class=\"blockUI\" style=\"z-index:' + z++ + ';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0\" src=\"' + opts.iframeSrc + '\"></iframe>');else lyr1 = $('<div class=\"blockUI\" style=\"display:none\"></div>');\n      if (opts.theme) lyr2 = $('<div class=\"blockUI blockOverlay ui-widget-overlay\" style=\"z-index:' + z++ + ';display:none\"></div>');else lyr2 = $('<div class=\"blockUI blockOverlay\" style=\"z-index:' + z++ + ';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0\"></div>');\n\n      if (opts.theme && full) {\n        s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all\" style=\"z-index:' + (z + 10) + ';display:none;position:fixed\">';\n\n        if (opts.title) {\n          s += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">' + (opts.title || '&nbsp;') + '</div>';\n        }\n\n        s += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\n        s += '</div>';\n      } else if (opts.theme) {\n        s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all\" style=\"z-index:' + (z + 10) + ';display:none;position:absolute\">';\n\n        if (opts.title) {\n          s += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">' + (opts.title || '&nbsp;') + '</div>';\n        }\n\n        s += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\n        s += '</div>';\n      } else if (full) {\n        s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage\" style=\"z-index:' + (z + 10) + ';display:none;position:fixed\"></div>';\n      } else {\n        s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement\" style=\"z-index:' + (z + 10) + ';display:none;position:absolute\"></div>';\n      }\n\n      lyr3 = $(s); // if we have a message, style it\n\n      if (msg) {\n        if (opts.theme) {\n          lyr3.css(themedCSS);\n          lyr3.addClass('ui-widget-content');\n        } else lyr3.css(css);\n      } // style the overlay\n\n\n      if (!opts.theme\n      /*&& (!opts.applyPlatformOpacityRules)*/\n      ) lyr2.css(opts.overlayCSS);\n      lyr2.css('position', full ? 'fixed' : 'absolute'); // make iframe layer transparent in IE\n\n      if (msie || opts.forceIframe) lyr1.css('opacity', 0.0); //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);\n\n      var layers = [lyr1, lyr2, lyr3],\n          $par = full ? $('body') : $(el);\n      $.each(layers, function () {\n        this.appendTo($par);\n      });\n\n      if (opts.theme && opts.draggable && $.fn.draggable) {\n        lyr3.draggable({\n          handle: '.ui-dialog-titlebar',\n          cancel: 'li'\n        });\n      } // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)\n\n\n      var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);\n\n      if (ie6 || expr) {\n        // give body 100% height\n        if (full && opts.allowBodyStretch && $.support.boxModel) $('html,body').css('height', '100%'); // fix ie6 issue when blocked element has a border width\n\n        if ((ie6 || !$.support.boxModel) && !full) {\n          var t = sz(el, 'borderTopWidth'),\n              l = sz(el, 'borderLeftWidth');\n          var fixT = t ? '(0 - ' + t + ')' : 0;\n          var fixL = l ? '(0 - ' + l + ')' : 0;\n        } // simulate fixed position\n\n\n        $.each(layers, function (i, o) {\n          var s = o[0].style;\n          s.position = 'absolute';\n\n          if (i < 2) {\n            if (full) s.setExpression('height', 'Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:' + opts.quirksmodeOffsetHack + ') + \"px\"');else s.setExpression('height', 'this.parentNode.offsetHeight + \"px\"');\n            if (full) s.setExpression('width', 'jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + \"px\"');else s.setExpression('width', 'this.parentNode.offsetWidth + \"px\"');\n            if (fixL) s.setExpression('left', fixL);\n            if (fixT) s.setExpression('top', fixT);\n          } else if (opts.centerY) {\n            if (full) s.setExpression('top', '(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + \"px\"');\n            s.marginTop = 0;\n          } else if (!opts.centerY && full) {\n            var top = opts.css && opts.css.top ? parseInt(opts.css.top, 10) : 0;\n            var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + ' + top + ') + \"px\"';\n            s.setExpression('top', expression);\n          }\n        });\n      } // show the message\n\n\n      if (msg) {\n        if (opts.theme) lyr3.find('.ui-widget-content').append(msg);else lyr3.append(msg);\n        if (msg.jquery || msg.nodeType) $(msg).show();\n      }\n\n      if ((msie || opts.forceIframe) && opts.showOverlay) lyr1.show(); // opacity is zero\n\n      if (opts.fadeIn) {\n        var cb = opts.onBlock ? opts.onBlock : noOp;\n        var cb1 = opts.showOverlay && !msg ? cb : noOp;\n        var cb2 = msg ? cb : noOp;\n        if (opts.showOverlay) lyr2._fadeIn(opts.fadeIn, cb1);\n        if (msg) lyr3._fadeIn(opts.fadeIn, cb2);\n      } else {\n        if (opts.showOverlay) lyr2.show();\n        if (msg) lyr3.show();\n        if (opts.onBlock) opts.onBlock.bind(lyr3)();\n      } // bind key and mouse events\n\n\n      bind(1, el, opts);\n\n      if (full) {\n        pageBlock = lyr3[0];\n        pageBlockEls = $(opts.focusableElements, pageBlock);\n        if (opts.focusInput) setTimeout(focus, 20);\n      } else center(lyr3[0], opts.centerX, opts.centerY);\n\n      if (opts.timeout) {\n        // auto-unblock\n        var to = setTimeout(function () {\n          if (full) $.unblockUI(opts);else $(el).unblock(opts);\n        }, opts.timeout);\n        $(el).data('blockUI.timeout', to);\n      }\n    } // remove the block\n\n\n    function remove(el, opts) {\n      var count;\n      var full = el == window;\n      var $el = $(el);\n      var data = $el.data('blockUI.history');\n      var to = $el.data('blockUI.timeout');\n\n      if (to) {\n        clearTimeout(to);\n        $el.removeData('blockUI.timeout');\n      }\n\n      opts = $.extend({}, $.blockUI.defaults, opts || {});\n      bind(0, el, opts); // unbind events\n\n      if (opts.onUnblock === null) {\n        opts.onUnblock = $el.data('blockUI.onUnblock');\n        $el.removeData('blockUI.onUnblock');\n      }\n\n      var els;\n      if (full) // crazy selector to handle odd field errors in ie6/7\n        els = $('body').children().filter('.blockUI').add('body > .blockUI');else els = $el.find('>.blockUI'); // fix cursor issue\n\n      if (opts.cursorReset) {\n        if (els.length > 1) els[1].style.cursor = opts.cursorReset;\n        if (els.length > 2) els[2].style.cursor = opts.cursorReset;\n      }\n\n      if (full) pageBlock = pageBlockEls = null;\n\n      if (opts.fadeOut) {\n        count = els.length;\n        els.stop().fadeOut(opts.fadeOut, function () {\n          if (--count === 0) reset(els, data, opts, el);\n        });\n      } else reset(els, data, opts, el);\n    } // move blocking element back into the DOM where it started\n\n\n    function reset(els, data, opts, el) {\n      var $el = $(el);\n      if ($el.data('blockUI.isBlocked')) return;\n      els.each(function (i, o) {\n        // remove via DOM calls so we don't lose event handlers\n        if (this.parentNode) this.parentNode.removeChild(this);\n      });\n\n      if (data && data.el) {\n        data.el.style.display = data.display;\n        data.el.style.position = data.position;\n        data.el.style.cursor = 'default'; // #59\n\n        if (data.parent) data.parent.appendChild(data.el);\n        $el.removeData('blockUI.history');\n      }\n\n      if ($el.data('blockUI.static')) {\n        $el.css('position', 'static'); // #22\n      }\n\n      if (typeof opts.onUnblock == 'function') opts.onUnblock(el, opts); // fix issue in Safari 6 where block artifacts remain until reflow\n\n      var body = $(document.body),\n          w = body.width(),\n          cssW = body[0].style.width;\n      body.width(w - 1).width(w);\n      body[0].style.width = cssW;\n    } // bind/unbind the handler\n\n\n    function bind(b, el, opts) {\n      var full = el == window,\n          $el = $(el); // don't bother unbinding if there is nothing to unbind\n\n      if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) return;\n      $el.data('blockUI.isBlocked', b); // don't bind events when overlay is not in use or if bindEvents is false\n\n      if (!full || !opts.bindEvents || b && !opts.showOverlay) return; // bind anchors and inputs for mouse and key events\n\n      var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';\n      if (b) $(document).bind(events, opts, handler);else $(document).unbind(events, handler); // former impl...\n      //\t\tvar $e = $('a,:input');\n      //\t\tb ? $e.bind(events, opts, handler) : $e.unbind(events, handler);\n    } // event handler to suppress keyboard/mouse events when blocking\n\n\n    function handler(e) {\n      // allow tab navigation (conditionally)\n      if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {\n        if (pageBlock && e.data.constrainTabKey) {\n          var els = pageBlockEls;\n          var fwd = !e.shiftKey && e.target === els[els.length - 1];\n          var back = e.shiftKey && e.target === els[0];\n\n          if (fwd || back) {\n            setTimeout(function () {\n              focus(back);\n            }, 10);\n            return false;\n          }\n        }\n      }\n\n      var opts = e.data;\n      var target = $(e.target);\n      if (target.hasClass('blockOverlay') && opts.onOverlayClick) opts.onOverlayClick(e); // allow events within the message content\n\n      if (target.parents('div.' + opts.blockMsgClass).length > 0) return true; // allow events for content that is not being blocked\n\n      return target.parents().children().filter('div.blockUI').length === 0;\n    }\n\n    function focus(back) {\n      if (!pageBlockEls) return;\n      var e = pageBlockEls[back === true ? pageBlockEls.length - 1 : 0];\n      if (e) e.focus();\n    }\n\n    function center(el, x, y) {\n      var p = el.parentNode,\n          s = el.style;\n      var l = (p.offsetWidth - el.offsetWidth) / 2 - sz(p, 'borderLeftWidth');\n      var t = (p.offsetHeight - el.offsetHeight) / 2 - sz(p, 'borderTopWidth');\n      if (x) s.left = l > 0 ? l + 'px' : '0';\n      if (y) s.top = t > 0 ? t + 'px' : '0';\n    }\n\n    function sz(el, p) {\n      return parseInt($.css(el, p), 10) || 0;\n    }\n  }\n  /*global define:true */\n\n\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (setup),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})();\n\n//# sourceURL=webpack://rup/./node_modules/block-ui/jquery.blockUI.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/js/jquery.fileupload-audio.js":
/*!************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/js/jquery.fileupload-audio.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * jQuery File Upload Audio Preview Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2013, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n\n/* global define, require, window, document */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! load-image */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js\"), __webpack_require__(/*! ./jquery.fileupload-process */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-process.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, loadImage) {\n  'use strict'; // Prepend to the default processQueue:\n\n  $.blueimp.fileupload.prototype.options.processQueue.unshift({\n    action: 'loadAudio',\n    // Use the action as prefix for the \"@\" options:\n    prefix: true,\n    fileTypes: '@',\n    maxFileSize: '@',\n    disabled: '@disableAudioPreview'\n  }, {\n    action: 'setAudio',\n    name: '@audioPreviewName',\n    disabled: '@disableAudioPreview'\n  }); // The File Upload Audio Preview plugin extends the fileupload widget\n  // with audio preview functionality:\n\n  $.widget('blueimp.fileupload', $.blueimp.fileupload, {\n    options: {\n      // The regular expression for the types of audio files to load,\n      // matched against the file type:\n      loadAudioFileTypes: /^audio\\/.*$/\n    },\n    _audioElement: document.createElement('audio'),\n    processActions: {\n      // Loads the audio file given via data.files and data.index\n      // as audio element if the browser supports playing it.\n      // Accepts the options fileTypes (regular expression)\n      // and maxFileSize (integer) to limit the files to load:\n      loadAudio: function loadAudio(data, options) {\n        if (options.disabled) {\n          return data;\n        }\n\n        var file = data.files[data.index],\n            url,\n            audio;\n\n        if (this._audioElement.canPlayType && this._audioElement.canPlayType(file.type) && ($.type(options.maxFileSize) !== 'number' || file.size <= options.maxFileSize) && (!options.fileTypes || options.fileTypes.test(file.type))) {\n          url = loadImage.createObjectURL(file);\n\n          if (url) {\n            audio = this._audioElement.cloneNode(false);\n            audio.src = url;\n            audio.controls = true;\n            data.audio = audio;\n            return data;\n          }\n        }\n\n        return data;\n      },\n      // Sets the audio element as a property of the file object:\n      setAudio: function setAudio(data, options) {\n        if (data.audio && !options.disabled) {\n          data.files[data.index][options.name || 'preview'] = data.audio;\n        }\n\n        return data;\n      }\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/js/jquery.fileupload-audio.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/js/jquery.fileupload-image.js":
/*!************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/js/jquery.fileupload-image.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * jQuery File Upload Image Preview & Resize Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2013, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n\n/* global define, require, window, Blob */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! load-image */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js\"), __webpack_require__(/*! load-image-meta */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-meta.js\"), __webpack_require__(/*! load-image-scale */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-scale.js\"), __webpack_require__(/*! load-image-exif */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-exif.js\"), __webpack_require__(/*! canvas-to-blob */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-canvas-to-blob/js/canvas-to-blob.js\"), __webpack_require__(/*! ./jquery.fileupload-process */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-process.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, _loadImage) {\n  'use strict'; // Prepend to the default processQueue:\n\n  $.blueimp.fileupload.prototype.options.processQueue.unshift({\n    action: 'loadImageMetaData',\n    disableImageHead: '@',\n    disableExif: '@',\n    disableExifThumbnail: '@',\n    disableExifSub: '@',\n    disableExifGps: '@',\n    disabled: '@disableImageMetaDataLoad'\n  }, {\n    action: 'loadImage',\n    // Use the action as prefix for the \"@\" options:\n    prefix: true,\n    fileTypes: '@',\n    maxFileSize: '@',\n    noRevoke: '@',\n    disabled: '@disableImageLoad'\n  }, {\n    action: 'resizeImage',\n    // Use \"image\" as prefix for the \"@\" options:\n    prefix: 'image',\n    maxWidth: '@',\n    maxHeight: '@',\n    minWidth: '@',\n    minHeight: '@',\n    crop: '@',\n    orientation: '@',\n    forceResize: '@',\n    disabled: '@disableImageResize'\n  }, {\n    action: 'saveImage',\n    quality: '@imageQuality',\n    type: '@imageType',\n    disabled: '@disableImageResize'\n  }, {\n    action: 'saveImageMetaData',\n    disabled: '@disableImageMetaDataSave'\n  }, {\n    action: 'resizeImage',\n    // Use \"preview\" as prefix for the \"@\" options:\n    prefix: 'preview',\n    maxWidth: '@',\n    maxHeight: '@',\n    minWidth: '@',\n    minHeight: '@',\n    crop: '@',\n    orientation: '@',\n    thumbnail: '@',\n    canvas: '@',\n    disabled: '@disableImagePreview'\n  }, {\n    action: 'setImage',\n    name: '@imagePreviewName',\n    disabled: '@disableImagePreview'\n  }, {\n    action: 'deleteImageReferences',\n    disabled: '@disableImageReferencesDeletion'\n  }); // The File Upload Resize plugin extends the fileupload widget\n  // with image resize functionality:\n\n  $.widget('blueimp.fileupload', $.blueimp.fileupload, {\n    options: {\n      // The regular expression for the types of images to load:\n      // matched against the file type:\n      loadImageFileTypes: /^image\\/(gif|jpeg|png|svg\\+xml)$/,\n      // The maximum file size of images to load:\n      loadImageMaxFileSize: 10000000,\n      // 10MB\n      // The maximum width of resized images:\n      imageMaxWidth: 1920,\n      // The maximum height of resized images:\n      imageMaxHeight: 1080,\n      // Defines the image orientation (1-8) or takes the orientation\n      // value from Exif data if set to true:\n      imageOrientation: false,\n      // Define if resized images should be cropped or only scaled:\n      imageCrop: false,\n      // Disable the resize image functionality by default:\n      disableImageResize: true,\n      // The maximum width of the preview images:\n      previewMaxWidth: 80,\n      // The maximum height of the preview images:\n      previewMaxHeight: 80,\n      // Defines the preview orientation (1-8) or takes the orientation\n      // value from Exif data if set to true:\n      previewOrientation: true,\n      // Create the preview using the Exif data thumbnail:\n      previewThumbnail: true,\n      // Define if preview images should be cropped or only scaled:\n      previewCrop: false,\n      // Define if preview images should be resized as canvas elements:\n      previewCanvas: true\n    },\n    processActions: {\n      // Loads the image given via data.files and data.index\n      // as img element, if the browser supports the File API.\n      // Accepts the options fileTypes (regular expression)\n      // and maxFileSize (integer) to limit the files to load:\n      loadImage: function loadImage(data, options) {\n        if (options.disabled) {\n          return data;\n        }\n\n        var that = this,\n            file = data.files[data.index],\n            dfd = $.Deferred();\n\n        if ($.type(options.maxFileSize) === 'number' && file.size > options.maxFileSize || options.fileTypes && !options.fileTypes.test(file.type) || !_loadImage(file, function (img) {\n          if (img.src) {\n            data.img = img;\n          }\n\n          dfd.resolveWith(that, [data]);\n        }, options)) {\n          return data;\n        }\n\n        return dfd.promise();\n      },\n      // Resizes the image given as data.canvas or data.img\n      // and updates data.canvas or data.img with the resized image.\n      // Also stores the resized image as preview property.\n      // Accepts the options maxWidth, maxHeight, minWidth,\n      // minHeight, canvas and crop:\n      resizeImage: function resizeImage(data, options) {\n        if (options.disabled || !(data.canvas || data.img)) {\n          return data;\n        }\n\n        options = $.extend({\n          canvas: true\n        }, options);\n\n        var that = this,\n            dfd = $.Deferred(),\n            img = options.canvas && data.canvas || data.img,\n            resolve = function resolve(newImg) {\n          if (newImg && (newImg.width !== img.width || newImg.height !== img.height || options.forceResize)) {\n            data[newImg.getContext ? 'canvas' : 'img'] = newImg;\n          }\n\n          data.preview = newImg;\n          dfd.resolveWith(that, [data]);\n        },\n            thumbnail;\n\n        if (data.exif) {\n          if (options.orientation === true) {\n            options.orientation = data.exif.get('Orientation');\n          }\n\n          if (options.thumbnail) {\n            thumbnail = data.exif.get('Thumbnail');\n\n            if (thumbnail) {\n              _loadImage(thumbnail, resolve, options);\n\n              return dfd.promise();\n            }\n          } // Prevent orienting the same image twice:\n\n\n          if (data.orientation) {\n            delete options.orientation;\n          } else {\n            data.orientation = options.orientation;\n          }\n        }\n\n        if (img) {\n          resolve(_loadImage.scale(img, options));\n          return dfd.promise();\n        }\n\n        return data;\n      },\n      // Saves the processed image given as data.canvas\n      // inplace at data.index of data.files:\n      saveImage: function saveImage(data, options) {\n        if (!data.canvas || options.disabled) {\n          return data;\n        }\n\n        var that = this,\n            file = data.files[data.index],\n            dfd = $.Deferred();\n\n        if (data.canvas.toBlob) {\n          data.canvas.toBlob(function (blob) {\n            if (!blob.name) {\n              if (file.type === blob.type) {\n                blob.name = file.name;\n              } else if (file.name) {\n                blob.name = file.name.replace(/\\.\\w+$/, '.' + blob.type.substr(6));\n              }\n            } // Don't restore invalid meta data:\n\n\n            if (file.type !== blob.type) {\n              delete data.imageHead;\n            } // Store the created blob at the position\n            // of the original file in the files list:\n\n\n            data.files[data.index] = blob;\n            dfd.resolveWith(that, [data]);\n          }, options.type || file.type, options.quality);\n        } else {\n          return data;\n        }\n\n        return dfd.promise();\n      },\n      loadImageMetaData: function loadImageMetaData(data, options) {\n        if (options.disabled) {\n          return data;\n        }\n\n        var that = this,\n            dfd = $.Deferred();\n\n        _loadImage.parseMetaData(data.files[data.index], function (result) {\n          $.extend(data, result);\n          dfd.resolveWith(that, [data]);\n        }, options);\n\n        return dfd.promise();\n      },\n      saveImageMetaData: function saveImageMetaData(data, options) {\n        if (!(data.imageHead && data.canvas && data.canvas.toBlob && !options.disabled)) {\n          return data;\n        }\n\n        var file = data.files[data.index],\n            blob = new Blob([data.imageHead, // Resized images always have a head size of 20 bytes,\n        // including the JPEG marker and a minimal JFIF header:\n        this._blobSlice.call(file, 20)], {\n          type: file.type\n        });\n        blob.name = file.name;\n        data.files[data.index] = blob;\n        return data;\n      },\n      // Sets the resized version of the image as a property of the\n      // file object, must be called after \"saveImage\":\n      setImage: function setImage(data, options) {\n        if (data.preview && !options.disabled) {\n          data.files[data.index][options.name || 'preview'] = data.preview;\n        }\n\n        return data;\n      },\n      deleteImageReferences: function deleteImageReferences(data, options) {\n        if (!options.disabled) {\n          delete data.img;\n          delete data.canvas;\n          delete data.preview;\n          delete data.imageHead;\n        }\n\n        return data;\n      }\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/js/jquery.fileupload-image.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/js/jquery.fileupload-process.js":
/*!**************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/js/jquery.fileupload-process.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * jQuery File Upload Processing Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2012, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n\n/* global define, require, window */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./jquery.fileupload */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  'use strict';\n\n  var originalAdd = $.blueimp.fileupload.prototype.options.add; // The File Upload Processing plugin extends the fileupload widget\n  // with file processing functionality:\n\n  $.widget('blueimp.fileupload', $.blueimp.fileupload, {\n    options: {\n      // The list of processing actions:\n      processQueue: [\n        /*\n        {\n            action: 'log',\n            type: 'debug'\n        }\n        */\n      ],\n      add: function add(e, data) {\n        var $this = $(this);\n        data.process(function () {\n          return $this.fileupload('process', data);\n        });\n        originalAdd.call(this, e, data);\n      }\n    },\n    processActions: {\n      /*\n      log: function (data, options) {\n          console[options.type](\n              'Processing \"' + data.files[data.index].name + '\"'\n          );\n      }\n      */\n    },\n    _processFile: function _processFile(data, originalData) {\n      var that = this,\n          dfd = $.Deferred().resolveWith(that, [data]),\n          chain = dfd.promise();\n\n      this._trigger('process', null, data);\n\n      $.each(data.processQueue, function (i, settings) {\n        var func = function func(data) {\n          if (originalData.errorThrown) {\n            return $.Deferred().rejectWith(that, [originalData]).promise();\n          }\n\n          return that.processActions[settings.action].call(that, data, settings);\n        };\n\n        chain = chain.then(func, settings.always && func);\n      });\n      chain.done(function () {\n        that._trigger('processdone', null, data);\n\n        that._trigger('processalways', null, data);\n      }).fail(function () {\n        that._trigger('processfail', null, data);\n\n        that._trigger('processalways', null, data);\n      });\n      return chain;\n    },\n    // Replaces the settings of each processQueue item that\n    // are strings starting with an \"@\", using the remaining\n    // substring as key for the option map,\n    // e.g. \"@autoUpload\" is replaced with options.autoUpload:\n    _transformProcessQueue: function _transformProcessQueue(options) {\n      var processQueue = [];\n      $.each(options.processQueue, function () {\n        var settings = {},\n            action = this.action,\n            prefix = this.prefix === true ? action : this.prefix;\n        $.each(this, function (key, value) {\n          if ($.type(value) === 'string' && value.charAt(0) === '@') {\n            settings[key] = options[value.slice(1) || (prefix ? prefix + key.charAt(0).toUpperCase() + key.slice(1) : key)];\n          } else {\n            settings[key] = value;\n          }\n        });\n        processQueue.push(settings);\n      });\n      options.processQueue = processQueue;\n    },\n    // Returns the number of files currently in the processsing queue:\n    processing: function processing() {\n      return this._processing;\n    },\n    // Processes the files given as files property of the data parameter,\n    // returns a Promise object that allows to bind callbacks:\n    process: function process(data) {\n      var that = this,\n          options = $.extend({}, this.options, data);\n\n      if (options.processQueue && options.processQueue.length) {\n        this._transformProcessQueue(options);\n\n        if (this._processing === 0) {\n          this._trigger('processstart');\n        }\n\n        $.each(data.files, function (index) {\n          var opts = index ? $.extend({}, options) : options,\n              func = function func() {\n            if (data.errorThrown) {\n              return $.Deferred().rejectWith(that, [data]).promise();\n            }\n\n            return that._processFile(opts, data);\n          };\n\n          opts.index = index;\n          that._processing += 1;\n          that._processingQueue = that._processingQueue.then(func, func).always(function () {\n            that._processing -= 1;\n\n            if (that._processing === 0) {\n              that._trigger('processstop');\n            }\n          });\n        });\n      }\n\n      return this._processingQueue;\n    },\n    _create: function _create() {\n      this._super();\n\n      this._processing = 0;\n      this._processingQueue = $.Deferred().resolveWith(this).promise();\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/js/jquery.fileupload-process.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/js/jquery.fileupload-ui.js":
/*!*********************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/js/jquery.fileupload-ui.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * jQuery File Upload User Interface Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2010, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n\n/* global define, require, window */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! blueimp-tmpl */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-tmpl/js/tmpl.js\"), __webpack_require__(/*! ./jquery.fileupload-image */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-image.js\"), __webpack_require__(/*! ./jquery.fileupload-audio */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-audio.js\"), __webpack_require__(/*! ./jquery.fileupload-video */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-video.js\"), __webpack_require__(/*! ./jquery.fileupload-validate */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-validate.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, tmpl) {\n  'use strict';\n\n  $.blueimp.fileupload.prototype._specialOptions.push('filesContainer', 'uploadTemplateId', 'downloadTemplateId'); // The UI version extends the file upload widget\n  // and adds complete user interface interaction:\n\n\n  $.widget('blueimp.fileupload', $.blueimp.fileupload, {\n    options: {\n      // By default, files added to the widget are uploaded as soon\n      // as the user clicks on the start buttons. To enable automatic\n      // uploads, set the following option to true:\n      autoUpload: false,\n      // The ID of the upload template:\n      uploadTemplateId: 'template-upload',\n      // The ID of the download template:\n      downloadTemplateId: 'template-download',\n      // The container for the list of files. If undefined, it is set to\n      // an element with class \"files\" inside of the widget element:\n      filesContainer: undefined,\n      // By default, files are appended to the files container.\n      // Set the following option to true, to prepend files instead:\n      prependFiles: false,\n      // The expected data type of the upload response, sets the dataType\n      // option of the $.ajax upload requests:\n      dataType: 'json',\n      // Error and info messages:\n      messages: {\n        unknownError: 'Unknown error'\n      },\n      // Function returning the current number of files,\n      // used by the maxNumberOfFiles validation:\n      getNumberOfFiles: function getNumberOfFiles() {\n        return this.filesContainer.children().not('.processing').length;\n      },\n      // Callback to retrieve the list of files from the server response:\n      getFilesFromResponse: function getFilesFromResponse(data) {\n        if (data.result && $.isArray(data.result.files)) {\n          return data.result.files;\n        }\n\n        return [];\n      },\n      // The add callback is invoked as soon as files are added to the fileupload\n      // widget (via file input selection, drag & drop or add API call).\n      // See the basic file upload widget for more information:\n      add: function add(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var $this = $(this),\n            that = $this.data('blueimp-fileupload') || $this.data('fileupload'),\n            options = that.options;\n        data.context = that._renderUpload(data.files).data('data', data).addClass('processing');\n        options.filesContainer[options.prependFiles ? 'prepend' : 'append'](data.context);\n\n        that._forceReflow(data.context);\n\n        that._transition(data.context);\n\n        data.process(function () {\n          return $this.fileupload('process', data);\n        }).always(function () {\n          data.context.each(function (index) {\n            $(this).find('.size').text(that._formatFileSize(data.files[index].size));\n          }).removeClass('processing');\n\n          that._renderPreviews(data);\n        }).done(function () {\n          data.context.find('.start').prop('disabled', false);\n\n          if (that._trigger('added', e, data) !== false && (options.autoUpload || data.autoUpload) && data.autoUpload !== false) {\n            data.submit();\n          }\n        }).fail(function () {\n          if (data.files.error) {\n            data.context.each(function (index) {\n              var error = data.files[index].error;\n\n              if (error) {\n                $(this).find('.error').text(error);\n              }\n            });\n          }\n        });\n      },\n      // Callback for the start of each file upload request:\n      send: function send(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload');\n\n        if (data.context && data.dataType && data.dataType.substr(0, 6) === 'iframe') {\n          // Iframe Transport does not support progress events.\n          // In lack of an indeterminate progress bar, we set\n          // the progress to 100%, showing the full animated bar:\n          data.context.find('.progress').addClass(!$.support.transition && 'progress-animated').attr('aria-valuenow', 100).children().first().css('width', '100%');\n        }\n\n        return that._trigger('sent', e, data);\n      },\n      // Callback for successful uploads:\n      done: function done(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload'),\n            getFilesFromResponse = data.getFilesFromResponse || that.options.getFilesFromResponse,\n            files = getFilesFromResponse(data),\n            template,\n            deferred;\n\n        if (data.context) {\n          data.context.each(function (index) {\n            var file = files[index] || {\n              error: 'Empty file upload result'\n            };\n            deferred = that._addFinishedDeferreds();\n\n            that._transition($(this)).done(function () {\n              var node = $(this);\n              template = that._renderDownload([file]).replaceAll(node);\n\n              that._forceReflow(template);\n\n              that._transition(template).done(function () {\n                data.context = $(this);\n\n                that._trigger('completed', e, data);\n\n                that._trigger('finished', e, data);\n\n                deferred.resolve();\n              });\n            });\n          });\n        } else {\n          template = that._renderDownload(files)[that.options.prependFiles ? 'prependTo' : 'appendTo'](that.options.filesContainer);\n\n          that._forceReflow(template);\n\n          deferred = that._addFinishedDeferreds();\n\n          that._transition(template).done(function () {\n            data.context = $(this);\n\n            that._trigger('completed', e, data);\n\n            that._trigger('finished', e, data);\n\n            deferred.resolve();\n          });\n        }\n      },\n      // Callback for failed (abort or error) uploads:\n      fail: function fail(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload'),\n            template,\n            deferred;\n\n        if (data.context) {\n          data.context.each(function (index) {\n            if (data.errorThrown !== 'abort') {\n              var file = data.files[index];\n              file.error = file.error || data.errorThrown || data.i18n('unknownError');\n              deferred = that._addFinishedDeferreds();\n\n              that._transition($(this)).done(function () {\n                var node = $(this);\n                template = that._renderDownload([file]).replaceAll(node);\n\n                that._forceReflow(template);\n\n                that._transition(template).done(function () {\n                  data.context = $(this);\n\n                  that._trigger('failed', e, data);\n\n                  that._trigger('finished', e, data);\n\n                  deferred.resolve();\n                });\n              });\n            } else {\n              deferred = that._addFinishedDeferreds();\n\n              that._transition($(this)).done(function () {\n                $(this).remove();\n\n                that._trigger('failed', e, data);\n\n                that._trigger('finished', e, data);\n\n                deferred.resolve();\n              });\n            }\n          });\n        } else if (data.errorThrown !== 'abort') {\n          data.context = that._renderUpload(data.files)[that.options.prependFiles ? 'prependTo' : 'appendTo'](that.options.filesContainer).data('data', data);\n\n          that._forceReflow(data.context);\n\n          deferred = that._addFinishedDeferreds();\n\n          that._transition(data.context).done(function () {\n            data.context = $(this);\n\n            that._trigger('failed', e, data);\n\n            that._trigger('finished', e, data);\n\n            deferred.resolve();\n          });\n        } else {\n          that._trigger('failed', e, data);\n\n          that._trigger('finished', e, data);\n\n          that._addFinishedDeferreds().resolve();\n        }\n      },\n      // Callback for upload progress events:\n      progress: function progress(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var progress = Math.floor(data.loaded / data.total * 100);\n\n        if (data.context) {\n          data.context.each(function () {\n            $(this).find('.progress').attr('aria-valuenow', progress).children().first().css('width', progress + '%');\n          });\n        }\n      },\n      // Callback for global upload progress events:\n      progressall: function progressall(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var $this = $(this),\n            progress = Math.floor(data.loaded / data.total * 100),\n            globalProgressNode = $this.find('.fileupload-progress'),\n            extendedProgressNode = globalProgressNode.find('.progress-extended');\n\n        if (extendedProgressNode.length) {\n          extendedProgressNode.html(($this.data('blueimp-fileupload') || $this.data('fileupload'))._renderExtendedProgress(data));\n        }\n\n        globalProgressNode.find('.progress').attr('aria-valuenow', progress).children().first().css('width', progress + '%');\n      },\n      // Callback for uploads start, equivalent to the global ajaxStart event:\n      start: function start(e) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload');\n\n        that._resetFinishedDeferreds();\n\n        that._transition($(this).find('.fileupload-progress')).done(function () {\n          that._trigger('started', e);\n        });\n      },\n      // Callback for uploads stop, equivalent to the global ajaxStop event:\n      stop: function stop(e) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload'),\n            deferred = that._addFinishedDeferreds();\n\n        $.when.apply($, that._getFinishedDeferreds()).done(function () {\n          that._trigger('stopped', e);\n        });\n\n        that._transition($(this).find('.fileupload-progress')).done(function () {\n          $(this).find('.progress').attr('aria-valuenow', '0').children().first().css('width', '0%');\n          $(this).find('.progress-extended').html('&nbsp;');\n          deferred.resolve();\n        });\n      },\n      processstart: function processstart(e) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        $(this).addClass('fileupload-processing');\n      },\n      processstop: function processstop(e) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        $(this).removeClass('fileupload-processing');\n      },\n      // Callback for file deletion:\n      destroy: function destroy(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload'),\n            removeNode = function removeNode() {\n          that._transition(data.context).done(function () {\n            $(this).remove();\n\n            that._trigger('destroyed', e, data);\n          });\n        };\n\n        if (data.url) {\n          data.dataType = data.dataType || that.options.dataType;\n          $.ajax(data).done(removeNode).fail(function () {\n            that._trigger('destroyfailed', e, data);\n          });\n        } else {\n          removeNode();\n        }\n      }\n    },\n    _resetFinishedDeferreds: function _resetFinishedDeferreds() {\n      this._finishedUploads = [];\n    },\n    _addFinishedDeferreds: function _addFinishedDeferreds(deferred) {\n      if (!deferred) {\n        deferred = $.Deferred();\n      }\n\n      this._finishedUploads.push(deferred);\n\n      return deferred;\n    },\n    _getFinishedDeferreds: function _getFinishedDeferreds() {\n      return this._finishedUploads;\n    },\n    // Link handler, that allows to download files\n    // by drag & drop of the links to the desktop:\n    _enableDragToDesktop: function _enableDragToDesktop() {\n      var link = $(this),\n          url = link.prop('href'),\n          name = link.prop('download'),\n          type = 'application/octet-stream';\n      link.bind('dragstart', function (e) {\n        try {\n          e.originalEvent.dataTransfer.setData('DownloadURL', [type, name, url].join(':'));\n        } catch (ignore) {}\n      });\n    },\n    _formatFileSize: function _formatFileSize(bytes) {\n      if (typeof bytes !== 'number') {\n        return '';\n      }\n\n      if (bytes >= 1000000000) {\n        return (bytes / 1000000000).toFixed(2) + ' GB';\n      }\n\n      if (bytes >= 1000000) {\n        return (bytes / 1000000).toFixed(2) + ' MB';\n      }\n\n      return (bytes / 1000).toFixed(2) + ' KB';\n    },\n    _formatBitrate: function _formatBitrate(bits) {\n      if (typeof bits !== 'number') {\n        return '';\n      }\n\n      if (bits >= 1000000000) {\n        return (bits / 1000000000).toFixed(2) + ' Gbit/s';\n      }\n\n      if (bits >= 1000000) {\n        return (bits / 1000000).toFixed(2) + ' Mbit/s';\n      }\n\n      if (bits >= 1000) {\n        return (bits / 1000).toFixed(2) + ' kbit/s';\n      }\n\n      return bits.toFixed(2) + ' bit/s';\n    },\n    _formatTime: function _formatTime(seconds) {\n      var date = new Date(seconds * 1000),\n          days = Math.floor(seconds / 86400);\n      days = days ? days + 'd ' : '';\n      return days + ('0' + date.getUTCHours()).slice(-2) + ':' + ('0' + date.getUTCMinutes()).slice(-2) + ':' + ('0' + date.getUTCSeconds()).slice(-2);\n    },\n    _formatPercentage: function _formatPercentage(floatValue) {\n      return (floatValue * 100).toFixed(2) + ' %';\n    },\n    _renderExtendedProgress: function _renderExtendedProgress(data) {\n      return this._formatBitrate(data.bitrate) + ' | ' + this._formatTime((data.total - data.loaded) * 8 / data.bitrate) + ' | ' + this._formatPercentage(data.loaded / data.total) + ' | ' + this._formatFileSize(data.loaded) + ' / ' + this._formatFileSize(data.total);\n    },\n    _renderTemplate: function _renderTemplate(func, files) {\n      if (!func) {\n        return $();\n      }\n\n      var result = func({\n        files: files,\n        formatFileSize: this._formatFileSize,\n        options: this.options\n      });\n\n      if (result instanceof $) {\n        return result;\n      }\n\n      return $(this.options.templatesContainer).html(result).children();\n    },\n    _renderPreviews: function _renderPreviews(data) {\n      data.context.find('.preview').each(function (index, elm) {\n        $(elm).append(data.files[index].preview);\n      });\n    },\n    _renderUpload: function _renderUpload(files) {\n      return this._renderTemplate(this.options.uploadTemplate, files);\n    },\n    _renderDownload: function _renderDownload(files) {\n      return this._renderTemplate(this.options.downloadTemplate, files).find('a[download]').each(this._enableDragToDesktop).end();\n    },\n    _startHandler: function _startHandler(e) {\n      e.preventDefault();\n      var button = $(e.currentTarget),\n          template = button.closest('.template-upload'),\n          data = template.data('data');\n      button.prop('disabled', true);\n\n      if (data && data.submit) {\n        data.submit();\n      }\n    },\n    _cancelHandler: function _cancelHandler(e) {\n      e.preventDefault();\n      var template = $(e.currentTarget).closest('.template-upload,.template-download'),\n          data = template.data('data') || {};\n      data.context = data.context || template;\n\n      if (data.abort) {\n        data.abort();\n      } else {\n        data.errorThrown = 'abort';\n\n        this._trigger('fail', e, data);\n      }\n    },\n    _deleteHandler: function _deleteHandler(e) {\n      e.preventDefault();\n      var button = $(e.currentTarget);\n\n      this._trigger('destroy', e, $.extend({\n        context: button.closest('.template-download'),\n        type: 'DELETE'\n      }, button.data()));\n    },\n    _forceReflow: function _forceReflow(node) {\n      return $.support.transition && node.length && node[0].offsetWidth;\n    },\n    _transition: function _transition(node) {\n      var dfd = $.Deferred();\n\n      if ($.support.transition && node.hasClass('fade') && node.is(':visible')) {\n        node.bind($.support.transition.end, function (e) {\n          // Make sure we don't respond to other transitions events\n          // in the container element, e.g. from button elements:\n          if (e.target === node[0]) {\n            node.unbind($.support.transition.end);\n            dfd.resolveWith(node);\n          }\n        }).toggleClass('in');\n      } else {\n        node.toggleClass('in');\n        dfd.resolveWith(node);\n      }\n\n      return dfd;\n    },\n    _initButtonBarEventHandlers: function _initButtonBarEventHandlers() {\n      var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'),\n          filesList = this.options.filesContainer;\n\n      this._on(fileUploadButtonBar.find('.start'), {\n        click: function click(e) {\n          e.preventDefault();\n          filesList.find('.start').click();\n        }\n      });\n\n      this._on(fileUploadButtonBar.find('.cancel'), {\n        click: function click(e) {\n          e.preventDefault();\n          filesList.find('.cancel').click();\n        }\n      });\n\n      this._on(fileUploadButtonBar.find('.delete'), {\n        click: function click(e) {\n          e.preventDefault();\n          filesList.find('.toggle:checked').closest('.template-download').find('.delete').click();\n          fileUploadButtonBar.find('.toggle').prop('checked', false);\n        }\n      });\n\n      this._on(fileUploadButtonBar.find('.toggle'), {\n        change: function change(e) {\n          filesList.find('.toggle').prop('checked', $(e.currentTarget).is(':checked'));\n        }\n      });\n    },\n    _destroyButtonBarEventHandlers: function _destroyButtonBarEventHandlers() {\n      this._off(this.element.find('.fileupload-buttonbar').find('.start, .cancel, .delete'), 'click');\n\n      this._off(this.element.find('.fileupload-buttonbar .toggle'), 'change.');\n    },\n    _initEventHandlers: function _initEventHandlers() {\n      this._super();\n\n      this._on(this.options.filesContainer, {\n        'click .start': this._startHandler,\n        'click .cancel': this._cancelHandler,\n        'click .delete': this._deleteHandler\n      });\n\n      this._initButtonBarEventHandlers();\n    },\n    _destroyEventHandlers: function _destroyEventHandlers() {\n      this._destroyButtonBarEventHandlers();\n\n      this._off(this.options.filesContainer, 'click');\n\n      this._super();\n    },\n    _enableFileInputButton: function _enableFileInputButton() {\n      this.element.find('.fileinput-button input').prop('disabled', false).parent().removeClass('disabled');\n    },\n    _disableFileInputButton: function _disableFileInputButton() {\n      this.element.find('.fileinput-button input').prop('disabled', true).parent().addClass('disabled');\n    },\n    _initTemplates: function _initTemplates() {\n      var options = this.options;\n      options.templatesContainer = this.document[0].createElement(options.filesContainer.prop('nodeName'));\n\n      if (tmpl) {\n        if (options.uploadTemplateId) {\n          options.uploadTemplate = tmpl(options.uploadTemplateId);\n        }\n\n        if (options.downloadTemplateId) {\n          options.downloadTemplate = tmpl(options.downloadTemplateId);\n        }\n      }\n    },\n    _initFilesContainer: function _initFilesContainer() {\n      var options = this.options;\n\n      if (options.filesContainer === undefined) {\n        options.filesContainer = this.element.find('.files');\n      } else if (!(options.filesContainer instanceof $)) {\n        options.filesContainer = $(options.filesContainer);\n      }\n    },\n    _initSpecialOptions: function _initSpecialOptions() {\n      this._super();\n\n      this._initFilesContainer();\n\n      this._initTemplates();\n    },\n    _create: function _create() {\n      this._super();\n\n      this._resetFinishedDeferreds();\n\n      if (!$.support.fileInput) {\n        this._disableFileInputButton();\n      }\n    },\n    enable: function enable() {\n      var wasDisabled = false;\n\n      if (this.options.disabled) {\n        wasDisabled = true;\n      }\n\n      this._super();\n\n      if (wasDisabled) {\n        this.element.find('input, button').prop('disabled', false);\n\n        this._enableFileInputButton();\n      }\n    },\n    disable: function disable() {\n      if (!this.options.disabled) {\n        this.element.find('input, button').prop('disabled', true);\n\n        this._disableFileInputButton();\n      }\n\n      this._super();\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/js/jquery.fileupload-ui.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/js/jquery.fileupload-validate.js":
/*!***************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/js/jquery.fileupload-validate.js ***!
  \***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * jQuery File Upload Validation Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2013, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* global define, require, window */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./jquery.fileupload-process */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-process.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  'use strict'; // Append to the default processQueue:\n\n  $.blueimp.fileupload.prototype.options.processQueue.push({\n    action: 'validate',\n    // Always trigger this action,\n    // even if the previous action was rejected:\n    always: true,\n    // Options taken from the global options map:\n    acceptFileTypes: '@',\n    maxFileSize: '@',\n    minFileSize: '@',\n    maxNumberOfFiles: '@',\n    disabled: '@disableValidation'\n  }); // The File Upload Validation plugin extends the fileupload widget\n  // with file validation functionality:\n\n  $.widget('blueimp.fileupload', $.blueimp.fileupload, {\n    options: {\n      /*\n      // The regular expression for allowed file types, matches\n      // against either file type or file name:\n      acceptFileTypes: /(\\.|\\/)(gif|jpe?g|png)$/i,\n      // The maximum allowed file size in bytes:\n      maxFileSize: 10000000, // 10 MB\n      // The minimum allowed file size in bytes:\n      minFileSize: undefined, // No minimal file size\n      // The limit of files to be uploaded:\n      maxNumberOfFiles: 10,\n      */\n      // Function returning the current number of files,\n      // has to be overriden for maxNumberOfFiles validation:\n      getNumberOfFiles: $.noop,\n      // Error and info messages:\n      messages: {\n        maxNumberOfFiles: 'Maximum number of files exceeded',\n        acceptFileTypes: 'File type not allowed',\n        maxFileSize: 'File is too large',\n        minFileSize: 'File is too small'\n      }\n    },\n    processActions: {\n      validate: function validate(data, options) {\n        if (options.disabled) {\n          return data;\n        }\n\n        var dfd = $.Deferred(),\n            settings = this.options,\n            file = data.files[data.index],\n            fileSize;\n\n        if (options.minFileSize || options.maxFileSize) {\n          fileSize = file.size;\n        }\n\n        if ($.type(options.maxNumberOfFiles) === 'number' && (settings.getNumberOfFiles() || 0) + data.files.length > options.maxNumberOfFiles) {\n          file.error = settings.i18n('maxNumberOfFiles');\n        } else if (options.acceptFileTypes && !(options.acceptFileTypes.test(file.type) || options.acceptFileTypes.test(file.name))) {\n          file.error = settings.i18n('acceptFileTypes');\n        } else if (fileSize > options.maxFileSize) {\n          file.error = settings.i18n('maxFileSize');\n        } else if ($.type(fileSize) === 'number' && fileSize < options.minFileSize) {\n          file.error = settings.i18n('minFileSize');\n        } else {\n          delete file.error;\n        }\n\n        if (file.error || data.files.error) {\n          data.files.error = true;\n          dfd.rejectWith(this, [data]);\n        } else {\n          dfd.resolveWith(this, [data]);\n        }\n\n        return dfd.promise();\n      }\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/js/jquery.fileupload-validate.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/js/jquery.fileupload-video.js":
/*!************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/js/jquery.fileupload-video.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * jQuery File Upload Video Preview Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2013, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n\n/* global define, require, window, document */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! load-image */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js\"), __webpack_require__(/*! ./jquery.fileupload-process */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-process.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, loadImage) {\n  'use strict'; // Prepend to the default processQueue:\n\n  $.blueimp.fileupload.prototype.options.processQueue.unshift({\n    action: 'loadVideo',\n    // Use the action as prefix for the \"@\" options:\n    prefix: true,\n    fileTypes: '@',\n    maxFileSize: '@',\n    disabled: '@disableVideoPreview'\n  }, {\n    action: 'setVideo',\n    name: '@videoPreviewName',\n    disabled: '@disableVideoPreview'\n  }); // The File Upload Video Preview plugin extends the fileupload widget\n  // with video preview functionality:\n\n  $.widget('blueimp.fileupload', $.blueimp.fileupload, {\n    options: {\n      // The regular expression for the types of video files to load,\n      // matched against the file type:\n      loadVideoFileTypes: /^video\\/.*$/\n    },\n    _videoElement: document.createElement('video'),\n    processActions: {\n      // Loads the video file given via data.files and data.index\n      // as video element if the browser supports playing it.\n      // Accepts the options fileTypes (regular expression)\n      // and maxFileSize (integer) to limit the files to load:\n      loadVideo: function loadVideo(data, options) {\n        if (options.disabled) {\n          return data;\n        }\n\n        var file = data.files[data.index],\n            url,\n            video;\n\n        if (this._videoElement.canPlayType && this._videoElement.canPlayType(file.type) && ($.type(options.maxFileSize) !== 'number' || file.size <= options.maxFileSize) && (!options.fileTypes || options.fileTypes.test(file.type))) {\n          url = loadImage.createObjectURL(file);\n\n          if (url) {\n            video = this._videoElement.cloneNode(false);\n            video.src = url;\n            video.controls = true;\n            data.video = video;\n            return data;\n          }\n        }\n\n        return data;\n      },\n      // Sets the video element as a property of the file object:\n      setVideo: function setVideo(data, options) {\n        if (data.video && !options.disabled) {\n          data.files[data.index][options.name || 'preview'] = data.video;\n        }\n\n        return data;\n      }\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/js/jquery.fileupload-video.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/js/jquery.fileupload.js":
/*!******************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/js/jquery.fileupload.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * jQuery File Upload Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2010, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n\n/* global define, require, window, document, location, Blob, FormData */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! jquery-ui/ui/widget */ \"./node_modules/jquery-ui/ui/widget.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  'use strict'; // Detect file input support, based on\n  // http://viljamis.com/blog/2012/file-upload-support-on-mobile/\n\n  $.support.fileInput = !(new RegExp( // Handle devices which give false positives for the feature detection:\n  '(Android (1\\\\.[0156]|2\\\\.[01]))' + '|(Windows Phone (OS 7|8\\\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' + '|(w(eb)?OSBrowser)|(webOS)' + '|(Kindle/(1\\\\.0|2\\\\.[05]|3\\\\.0))').test(window.navigator.userAgent) || // Feature detection for all other devices:\n  $('<input type=\"file\"/>').prop('disabled')); // The FileReader API is not actually used, but works as feature detection,\n  // as some Safari versions (5?) support XHR file uploads via the FormData API,\n  // but not non-multipart XHR file uploads.\n  // window.XMLHttpRequestUpload is not available on IE10, so we check for\n  // window.ProgressEvent instead to detect XHR2 file upload capability:\n\n  $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);\n  $.support.xhrFormDataFileUpload = !!window.FormData; // Detect support for Blob slicing (required for chunked uploads):\n\n  $.support.blobSlice = window.Blob && (Blob.prototype.slice || Blob.prototype.webkitSlice || Blob.prototype.mozSlice); // Helper function to create drag handlers for dragover/dragenter/dragleave:\n\n  function getDragHandler(type) {\n    var isDragOver = type === 'dragover';\n    return function (e) {\n      e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n      var dataTransfer = e.dataTransfer;\n\n      if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 && this._trigger(type, $.Event(type, {\n        delegatedEvent: e\n      })) !== false) {\n        e.preventDefault();\n\n        if (isDragOver) {\n          dataTransfer.dropEffect = 'copy';\n        }\n      }\n    };\n  } // The fileupload widget listens for change events on file input fields defined\n  // via fileInput setting and paste or drop events of the given dropZone.\n  // In addition to the default jQuery Widget methods, the fileupload widget\n  // exposes the \"add\" and \"send\" methods, to add or directly send files using\n  // the fileupload API.\n  // By default, files added via file input selection, paste, drag & drop or\n  // \"add\" method are uploaded immediately, but it is possible to override\n  // the \"add\" callback option to queue file uploads.\n\n\n  $.widget('blueimp.fileupload', {\n    options: {\n      // The drop target element(s), by the default the complete document.\n      // Set to null to disable drag & drop support:\n      dropZone: $(document),\n      // The paste target element(s), by the default undefined.\n      // Set to a DOM node or jQuery object to enable file pasting:\n      pasteZone: undefined,\n      // The file input field(s), that are listened to for change events.\n      // If undefined, it is set to the file input fields inside\n      // of the widget element on plugin initialization.\n      // Set to null to disable the change listener.\n      fileInput: undefined,\n      // By default, the file input field is replaced with a clone after\n      // each input field change event. This is required for iframe transport\n      // queues and allows change events to be fired for the same file\n      // selection, but can be disabled by setting the following option to false:\n      replaceFileInput: true,\n      // The parameter name for the file form data (the request argument name).\n      // If undefined or empty, the name property of the file input field is\n      // used, or \"files[]\" if the file input name property is also empty,\n      // can be a string or an array of strings:\n      paramName: undefined,\n      // By default, each file of a selection is uploaded using an individual\n      // request for XHR type uploads. Set to false to upload file\n      // selections in one request each:\n      singleFileUploads: true,\n      // To limit the number of files uploaded with one XHR request,\n      // set the following option to an integer greater than 0:\n      limitMultiFileUploads: undefined,\n      // The following option limits the number of files uploaded with one\n      // XHR request to keep the request size under or equal to the defined\n      // limit in bytes:\n      limitMultiFileUploadSize: undefined,\n      // Multipart file uploads add a number of bytes to each uploaded file,\n      // therefore the following option adds an overhead for each file used\n      // in the limitMultiFileUploadSize configuration:\n      limitMultiFileUploadSizeOverhead: 512,\n      // Set the following option to true to issue all file upload requests\n      // in a sequential order:\n      sequentialUploads: false,\n      // To limit the number of concurrent uploads,\n      // set the following option to an integer greater than 0:\n      limitConcurrentUploads: undefined,\n      // Set the following option to true to force iframe transport uploads:\n      forceIframeTransport: false,\n      // Set the following option to the location of a redirect url on the\n      // origin server, for cross-domain iframe transport uploads:\n      redirect: undefined,\n      // The parameter name for the redirect url, sent as part of the form\n      // data and set to 'redirect' if this option is empty:\n      redirectParamName: undefined,\n      // Set the following option to the location of a postMessage window,\n      // to enable postMessage transport uploads:\n      postMessage: undefined,\n      // By default, XHR file uploads are sent as multipart/form-data.\n      // The iframe transport is always using multipart/form-data.\n      // Set to false to enable non-multipart XHR uploads:\n      multipart: true,\n      // To upload large files in smaller chunks, set the following option\n      // to a preferred maximum chunk size. If set to 0, null or undefined,\n      // or the browser does not support the required Blob API, files will\n      // be uploaded as a whole.\n      maxChunkSize: undefined,\n      // When a non-multipart upload or a chunked multipart upload has been\n      // aborted, this option can be used to resume the upload by setting\n      // it to the size of the already uploaded bytes. This option is most\n      // useful when modifying the options object inside of the \"add\" or\n      // \"send\" callbacks, as the options are cloned for each file upload.\n      uploadedBytes: undefined,\n      // By default, failed (abort or error) file uploads are removed from the\n      // global progress calculation. Set the following option to false to\n      // prevent recalculating the global progress data:\n      recalculateProgress: true,\n      // Interval in milliseconds to calculate and trigger progress events:\n      progressInterval: 100,\n      // Interval in milliseconds to calculate progress bitrate:\n      bitrateInterval: 500,\n      // By default, uploads are started automatically when adding files:\n      autoUpload: true,\n      // Error and info messages:\n      messages: {\n        uploadedBytes: 'Uploaded bytes exceed file size'\n      },\n      // Translation function, gets the message key to be translated\n      // and an object with context specific data as arguments:\n      i18n: function i18n(message, context) {\n        message = this.messages[message] || message.toString();\n\n        if (context) {\n          $.each(context, function (key, value) {\n            message = message.replace('{' + key + '}', value);\n          });\n        }\n\n        return message;\n      },\n      // Additional form data to be sent along with the file uploads can be set\n      // using this option, which accepts an array of objects with name and\n      // value properties, a function returning such an array, a FormData\n      // object (for XHR file uploads), or a simple object.\n      // The form of the first fileInput is given as parameter to the function:\n      formData: function formData(form) {\n        return form.serializeArray();\n      },\n      // The add callback is invoked as soon as files are added to the fileupload\n      // widget (via file input selection, drag & drop, paste or add API call).\n      // If the singleFileUploads option is enabled, this callback will be\n      // called once for each file in the selection for XHR file uploads, else\n      // once for each file selection.\n      //\n      // The upload starts when the submit method is invoked on the data parameter.\n      // The data object contains a files property holding the added files\n      // and allows you to override plugin options as well as define ajax settings.\n      //\n      // Listeners for this callback can also be bound the following way:\n      // .bind('fileuploadadd', func);\n      //\n      // data.submit() returns a Promise object and allows to attach additional\n      // handlers using jQuery's Deferred callbacks:\n      // data.submit().done(func).fail(func).always(func);\n      add: function add(e, data) {\n        if (e.isDefaultPrevented()) {\n          return false;\n        }\n\n        if (data.autoUpload || data.autoUpload !== false && $(this).fileupload('option', 'autoUpload')) {\n          data.process().done(function () {\n            data.submit();\n          });\n        }\n      },\n      // Other callbacks:\n      // Callback for the submit event of each file upload:\n      // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);\n      // Callback for the start of each file upload request:\n      // send: function (e, data) {}, // .bind('fileuploadsend', func);\n      // Callback for successful uploads:\n      // done: function (e, data) {}, // .bind('fileuploaddone', func);\n      // Callback for failed (abort or error) uploads:\n      // fail: function (e, data) {}, // .bind('fileuploadfail', func);\n      // Callback for completed (success, abort or error) requests:\n      // always: function (e, data) {}, // .bind('fileuploadalways', func);\n      // Callback for upload progress events:\n      // progress: function (e, data) {}, // .bind('fileuploadprogress', func);\n      // Callback for global upload progress events:\n      // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);\n      // Callback for uploads start, equivalent to the global ajaxStart event:\n      // start: function (e) {}, // .bind('fileuploadstart', func);\n      // Callback for uploads stop, equivalent to the global ajaxStop event:\n      // stop: function (e) {}, // .bind('fileuploadstop', func);\n      // Callback for change events of the fileInput(s):\n      // change: function (e, data) {}, // .bind('fileuploadchange', func);\n      // Callback for paste events to the pasteZone(s):\n      // paste: function (e, data) {}, // .bind('fileuploadpaste', func);\n      // Callback for drop events of the dropZone(s):\n      // drop: function (e, data) {}, // .bind('fileuploaddrop', func);\n      // Callback for dragover events of the dropZone(s):\n      // dragover: function (e) {}, // .bind('fileuploaddragover', func);\n      // Callback for the start of each chunk upload request:\n      // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);\n      // Callback for successful chunk uploads:\n      // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);\n      // Callback for failed (abort or error) chunk uploads:\n      // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);\n      // Callback for completed (success, abort or error) chunk upload requests:\n      // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);\n      // The plugin options are used as settings object for the ajax calls.\n      // The following are jQuery ajax settings required for the file uploads:\n      processData: false,\n      contentType: false,\n      cache: false,\n      timeout: 0\n    },\n    // A list of options that require reinitializing event listeners and/or\n    // special initialization code:\n    _specialOptions: ['fileInput', 'dropZone', 'pasteZone', 'multipart', 'forceIframeTransport'],\n    _blobSlice: $.support.blobSlice && function () {\n      var slice = this.slice || this.webkitSlice || this.mozSlice;\n      return slice.apply(this, arguments);\n    },\n    _BitrateTimer: function _BitrateTimer() {\n      this.timestamp = Date.now ? Date.now() : new Date().getTime();\n      this.loaded = 0;\n      this.bitrate = 0;\n\n      this.getBitrate = function (now, loaded, interval) {\n        var timeDiff = now - this.timestamp;\n\n        if (!this.bitrate || !interval || timeDiff > interval) {\n          this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;\n          this.loaded = loaded;\n          this.timestamp = now;\n        }\n\n        return this.bitrate;\n      };\n    },\n    _isXHRUpload: function _isXHRUpload(options) {\n      return !options.forceIframeTransport && (!options.multipart && $.support.xhrFileUpload || $.support.xhrFormDataFileUpload);\n    },\n    _getFormData: function _getFormData(options) {\n      var formData;\n\n      if ($.type(options.formData) === 'function') {\n        return options.formData(options.form);\n      }\n\n      if ($.isArray(options.formData)) {\n        return options.formData;\n      }\n\n      if ($.type(options.formData) === 'object') {\n        formData = [];\n        $.each(options.formData, function (name, value) {\n          formData.push({\n            name: name,\n            value: value\n          });\n        });\n        return formData;\n      }\n\n      return [];\n    },\n    _getTotal: function _getTotal(files) {\n      var total = 0;\n      $.each(files, function (index, file) {\n        total += file.size || 1;\n      });\n      return total;\n    },\n    _initProgressObject: function _initProgressObject(obj) {\n      var progress = {\n        loaded: 0,\n        total: 0,\n        bitrate: 0\n      };\n\n      if (obj._progress) {\n        $.extend(obj._progress, progress);\n      } else {\n        obj._progress = progress;\n      }\n    },\n    _initResponseObject: function _initResponseObject(obj) {\n      var prop;\n\n      if (obj._response) {\n        for (prop in obj._response) {\n          if (obj._response.hasOwnProperty(prop)) {\n            delete obj._response[prop];\n          }\n        }\n      } else {\n        obj._response = {};\n      }\n    },\n    _onProgress: function _onProgress(e, data) {\n      if (e.lengthComputable) {\n        var now = Date.now ? Date.now() : new Date().getTime(),\n            loaded;\n\n        if (data._time && data.progressInterval && now - data._time < data.progressInterval && e.loaded !== e.total) {\n          return;\n        }\n\n        data._time = now;\n        loaded = Math.floor(e.loaded / e.total * (data.chunkSize || data._progress.total)) + (data.uploadedBytes || 0); // Add the difference from the previously loaded state\n        // to the global loaded counter:\n\n        this._progress.loaded += loaded - data._progress.loaded;\n        this._progress.bitrate = this._bitrateTimer.getBitrate(now, this._progress.loaded, data.bitrateInterval);\n        data._progress.loaded = data.loaded = loaded;\n        data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(now, loaded, data.bitrateInterval); // Trigger a custom progress event with a total data property set\n        // to the file size(s) of the current upload and a loaded data\n        // property calculated accordingly:\n\n        this._trigger('progress', $.Event('progress', {\n          delegatedEvent: e\n        }), data); // Trigger a global progress event for all current file uploads,\n        // including ajax calls queued for sequential file uploads:\n\n\n        this._trigger('progressall', $.Event('progressall', {\n          delegatedEvent: e\n        }), this._progress);\n      }\n    },\n    _initProgressListener: function _initProgressListener(options) {\n      var that = this,\n          xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); // Accesss to the native XHR object is required to add event listeners\n      // for the upload progress event:\n\n      if (xhr.upload) {\n        $(xhr.upload).bind('progress', function (e) {\n          var oe = e.originalEvent; // Make sure the progress event properties get copied over:\n\n          e.lengthComputable = oe.lengthComputable;\n          e.loaded = oe.loaded;\n          e.total = oe.total;\n\n          that._onProgress(e, options);\n        });\n\n        options.xhr = function () {\n          return xhr;\n        };\n      }\n    },\n    _isInstanceOf: function _isInstanceOf(type, obj) {\n      // Cross-frame instanceof check\n      return Object.prototype.toString.call(obj) === '[object ' + type + ']';\n    },\n    _initXHRData: function _initXHRData(options) {\n      var that = this,\n          formData,\n          file = options.files[0],\n          // Ignore non-multipart setting if not supported:\n      multipart = options.multipart || !$.support.xhrFileUpload,\n          paramName = $.type(options.paramName) === 'array' ? options.paramName[0] : options.paramName;\n      options.headers = $.extend({}, options.headers);\n\n      if (options.contentRange) {\n        options.headers['Content-Range'] = options.contentRange;\n      }\n\n      if (!multipart || options.blob || !this._isInstanceOf('File', file)) {\n        options.headers['Content-Disposition'] = 'attachment; filename=\"' + encodeURI(file.uploadName || file.name) + '\"';\n      }\n\n      if (!multipart) {\n        options.contentType = file.type || 'application/octet-stream';\n        options.data = options.blob || file;\n      } else if ($.support.xhrFormDataFileUpload) {\n        if (options.postMessage) {\n          // window.postMessage does not allow sending FormData\n          // objects, so we just add the File/Blob objects to\n          // the formData array and let the postMessage window\n          // create the FormData object out of this array:\n          formData = this._getFormData(options);\n\n          if (options.blob) {\n            formData.push({\n              name: paramName,\n              value: options.blob\n            });\n          } else {\n            $.each(options.files, function (index, file) {\n              formData.push({\n                name: $.type(options.paramName) === 'array' && options.paramName[index] || paramName,\n                value: file\n              });\n            });\n          }\n        } else {\n          if (that._isInstanceOf('FormData', options.formData)) {\n            formData = options.formData;\n          } else {\n            formData = new FormData();\n            $.each(this._getFormData(options), function (index, field) {\n              formData.append(field.name, field.value);\n            });\n          }\n\n          if (options.blob) {\n            formData.append(paramName, options.blob, file.uploadName || file.name);\n          } else {\n            $.each(options.files, function (index, file) {\n              // This check allows the tests to run with\n              // dummy objects:\n              if (that._isInstanceOf('File', file) || that._isInstanceOf('Blob', file)) {\n                formData.append($.type(options.paramName) === 'array' && options.paramName[index] || paramName, file, file.uploadName || file.name);\n              }\n            });\n          }\n        }\n\n        options.data = formData;\n      } // Blob reference is not needed anymore, free memory:\n\n\n      options.blob = null;\n    },\n    _initIframeSettings: function _initIframeSettings(options) {\n      var targetHost = $('<a></a>').prop('href', options.url).prop('host'); // Setting the dataType to iframe enables the iframe transport:\n\n      options.dataType = 'iframe ' + (options.dataType || ''); // The iframe transport accepts a serialized array as form data:\n\n      options.formData = this._getFormData(options); // Add redirect url to form data on cross-domain uploads:\n\n      if (options.redirect && targetHost && targetHost !== location.host) {\n        options.formData.push({\n          name: options.redirectParamName || 'redirect',\n          value: options.redirect\n        });\n      }\n    },\n    _initDataSettings: function _initDataSettings(options) {\n      if (this._isXHRUpload(options)) {\n        if (!this._chunkedUpload(options, true)) {\n          if (!options.data) {\n            this._initXHRData(options);\n          }\n\n          this._initProgressListener(options);\n        }\n\n        if (options.postMessage) {\n          // Setting the dataType to postmessage enables the\n          // postMessage transport:\n          options.dataType = 'postmessage ' + (options.dataType || '');\n        }\n      } else {\n        this._initIframeSettings(options);\n      }\n    },\n    _getParamName: function _getParamName(options) {\n      var fileInput = $(options.fileInput),\n          paramName = options.paramName;\n\n      if (!paramName) {\n        paramName = [];\n        fileInput.each(function () {\n          var input = $(this),\n              name = input.prop('name') || 'files[]',\n              i = (input.prop('files') || [1]).length;\n\n          while (i) {\n            paramName.push(name);\n            i -= 1;\n          }\n        });\n\n        if (!paramName.length) {\n          paramName = [fileInput.prop('name') || 'files[]'];\n        }\n      } else if (!$.isArray(paramName)) {\n        paramName = [paramName];\n      }\n\n      return paramName;\n    },\n    _initFormSettings: function _initFormSettings(options) {\n      // Retrieve missing options from the input field and the\n      // associated form, if available:\n      if (!options.form || !options.form.length) {\n        options.form = $(options.fileInput.prop('form')); // If the given file input doesn't have an associated form,\n        // use the default widget file input's form:\n\n        if (!options.form.length) {\n          options.form = $(this.options.fileInput.prop('form'));\n        }\n      }\n\n      options.paramName = this._getParamName(options);\n\n      if (!options.url) {\n        options.url = options.form.prop('action') || location.href;\n      } // The HTTP request method must be \"POST\" or \"PUT\":\n\n\n      options.type = (options.type || $.type(options.form.prop('method')) === 'string' && options.form.prop('method') || '').toUpperCase();\n\n      if (options.type !== 'POST' && options.type !== 'PUT' && options.type !== 'PATCH') {\n        options.type = 'POST';\n      }\n\n      if (!options.formAcceptCharset) {\n        options.formAcceptCharset = options.form.attr('accept-charset');\n      }\n    },\n    _getAJAXSettings: function _getAJAXSettings(data) {\n      var options = $.extend({}, this.options, data);\n\n      this._initFormSettings(options);\n\n      this._initDataSettings(options);\n\n      return options;\n    },\n    // jQuery 1.6 doesn't provide .state(),\n    // while jQuery 1.8+ removed .isRejected() and .isResolved():\n    _getDeferredState: function _getDeferredState(deferred) {\n      if (deferred.state) {\n        return deferred.state();\n      }\n\n      if (deferred.isResolved()) {\n        return 'resolved';\n      }\n\n      if (deferred.isRejected()) {\n        return 'rejected';\n      }\n\n      return 'pending';\n    },\n    // Maps jqXHR callbacks to the equivalent\n    // methods of the given Promise object:\n    _enhancePromise: function _enhancePromise(promise) {\n      promise.success = promise.done;\n      promise.error = promise.fail;\n      promise.complete = promise.always;\n      return promise;\n    },\n    // Creates and returns a Promise object enhanced with\n    // the jqXHR methods abort, success, error and complete:\n    _getXHRPromise: function _getXHRPromise(resolveOrReject, context, args) {\n      var dfd = $.Deferred(),\n          promise = dfd.promise();\n      context = context || this.options.context || promise;\n\n      if (resolveOrReject === true) {\n        dfd.resolveWith(context, args);\n      } else if (resolveOrReject === false) {\n        dfd.rejectWith(context, args);\n      }\n\n      promise.abort = dfd.promise;\n      return this._enhancePromise(promise);\n    },\n    // Adds convenience methods to the data callback argument:\n    _addConvenienceMethods: function _addConvenienceMethods(e, data) {\n      var that = this,\n          getPromise = function getPromise(args) {\n        return $.Deferred().resolveWith(that, args).promise();\n      };\n\n      data.process = function (resolveFunc, rejectFunc) {\n        if (resolveFunc || rejectFunc) {\n          data._processQueue = this._processQueue = (this._processQueue || getPromise([this])).then(function () {\n            if (data.errorThrown) {\n              return $.Deferred().rejectWith(that, [data]).promise();\n            }\n\n            return getPromise(arguments);\n          }).then(resolveFunc, rejectFunc);\n        }\n\n        return this._processQueue || getPromise([this]);\n      };\n\n      data.submit = function () {\n        if (this.state() !== 'pending') {\n          data.jqXHR = this.jqXHR = that._trigger('submit', $.Event('submit', {\n            delegatedEvent: e\n          }), this) !== false && that._onSend(e, this);\n        }\n\n        return this.jqXHR || that._getXHRPromise();\n      };\n\n      data.abort = function () {\n        if (this.jqXHR) {\n          return this.jqXHR.abort();\n        }\n\n        this.errorThrown = 'abort';\n\n        that._trigger('fail', null, this);\n\n        return that._getXHRPromise(false);\n      };\n\n      data.state = function () {\n        if (this.jqXHR) {\n          return that._getDeferredState(this.jqXHR);\n        }\n\n        if (this._processQueue) {\n          return that._getDeferredState(this._processQueue);\n        }\n      };\n\n      data.processing = function () {\n        return !this.jqXHR && this._processQueue && that._getDeferredState(this._processQueue) === 'pending';\n      };\n\n      data.progress = function () {\n        return this._progress;\n      };\n\n      data.response = function () {\n        return this._response;\n      };\n    },\n    // Parses the Range header from the server response\n    // and returns the uploaded bytes:\n    _getUploadedBytes: function _getUploadedBytes(jqXHR) {\n      var range = jqXHR.getResponseHeader('Range'),\n          parts = range && range.split('-'),\n          upperBytesPos = parts && parts.length > 1 && parseInt(parts[1], 10);\n      return upperBytesPos && upperBytesPos + 1;\n    },\n    // Uploads a file in multiple, sequential requests\n    // by splitting the file up in multiple blob chunks.\n    // If the second parameter is true, only tests if the file\n    // should be uploaded in chunks, but does not invoke any\n    // upload requests:\n    _chunkedUpload: function _chunkedUpload(options, testOnly) {\n      options.uploadedBytes = options.uploadedBytes || 0;\n\n      var that = this,\n          file = options.files[0],\n          fs = file.size,\n          ub = options.uploadedBytes,\n          mcs = options.maxChunkSize || fs,\n          slice = this._blobSlice,\n          dfd = $.Deferred(),\n          promise = dfd.promise(),\n          jqXHR,\n          _upload;\n\n      if (!(this._isXHRUpload(options) && slice && (ub || ($.type(mcs) === 'function' ? mcs(options) : mcs) < fs)) || options.data) {\n        return false;\n      }\n\n      if (testOnly) {\n        return true;\n      }\n\n      if (ub >= fs) {\n        file.error = options.i18n('uploadedBytes');\n        return this._getXHRPromise(false, options.context, [null, 'error', file.error]);\n      } // The chunk upload method:\n\n\n      _upload = function upload() {\n        // Clone the options object for each chunk upload:\n        var o = $.extend({}, options),\n            currentLoaded = o._progress.loaded;\n        o.blob = slice.call(file, ub, ub + ($.type(mcs) === 'function' ? mcs(o) : mcs), file.type); // Store the current chunk size, as the blob itself\n        // will be dereferenced after data processing:\n\n        o.chunkSize = o.blob.size; // Expose the chunk bytes position range:\n\n        o.contentRange = 'bytes ' + ub + '-' + (ub + o.chunkSize - 1) + '/' + fs; // Process the upload data (the blob and potential form data):\n\n        that._initXHRData(o); // Add progress listeners for this chunk upload:\n\n\n        that._initProgressListener(o);\n\n        jqXHR = (that._trigger('chunksend', null, o) !== false && $.ajax(o) || that._getXHRPromise(false, o.context)).done(function (result, textStatus, jqXHR) {\n          ub = that._getUploadedBytes(jqXHR) || ub + o.chunkSize; // Create a progress event if no final progress event\n          // with loaded equaling total has been triggered\n          // for this chunk:\n\n          if (currentLoaded + o.chunkSize - o._progress.loaded) {\n            that._onProgress($.Event('progress', {\n              lengthComputable: true,\n              loaded: ub - o.uploadedBytes,\n              total: ub - o.uploadedBytes\n            }), o);\n          }\n\n          options.uploadedBytes = o.uploadedBytes = ub;\n          o.result = result;\n          o.textStatus = textStatus;\n          o.jqXHR = jqXHR;\n\n          that._trigger('chunkdone', null, o);\n\n          that._trigger('chunkalways', null, o);\n\n          if (ub < fs) {\n            // File upload not yet complete,\n            // continue with the next chunk:\n            _upload();\n          } else {\n            dfd.resolveWith(o.context, [result, textStatus, jqXHR]);\n          }\n        }).fail(function (jqXHR, textStatus, errorThrown) {\n          o.jqXHR = jqXHR;\n          o.textStatus = textStatus;\n          o.errorThrown = errorThrown;\n\n          that._trigger('chunkfail', null, o);\n\n          that._trigger('chunkalways', null, o);\n\n          dfd.rejectWith(o.context, [jqXHR, textStatus, errorThrown]);\n        });\n      };\n\n      this._enhancePromise(promise);\n\n      promise.abort = function () {\n        return jqXHR.abort();\n      };\n\n      _upload();\n\n      return promise;\n    },\n    _beforeSend: function _beforeSend(e, data) {\n      if (this._active === 0) {\n        // the start callback is triggered when an upload starts\n        // and no other uploads are currently running,\n        // equivalent to the global ajaxStart event:\n        this._trigger('start'); // Set timer for global bitrate progress calculation:\n\n\n        this._bitrateTimer = new this._BitrateTimer(); // Reset the global progress values:\n\n        this._progress.loaded = this._progress.total = 0;\n        this._progress.bitrate = 0;\n      } // Make sure the container objects for the .response() and\n      // .progress() methods on the data object are available\n      // and reset to their initial state:\n\n\n      this._initResponseObject(data);\n\n      this._initProgressObject(data);\n\n      data._progress.loaded = data.loaded = data.uploadedBytes || 0;\n      data._progress.total = data.total = this._getTotal(data.files) || 1;\n      data._progress.bitrate = data.bitrate = 0;\n      this._active += 1; // Initialize the global progress values:\n\n      this._progress.loaded += data.loaded;\n      this._progress.total += data.total;\n    },\n    _onDone: function _onDone(result, textStatus, jqXHR, options) {\n      var total = options._progress.total,\n          response = options._response;\n\n      if (options._progress.loaded < total) {\n        // Create a progress event if no final progress event\n        // with loaded equaling total has been triggered:\n        this._onProgress($.Event('progress', {\n          lengthComputable: true,\n          loaded: total,\n          total: total\n        }), options);\n      }\n\n      response.result = options.result = result;\n      response.textStatus = options.textStatus = textStatus;\n      response.jqXHR = options.jqXHR = jqXHR;\n\n      this._trigger('done', null, options);\n    },\n    _onFail: function _onFail(jqXHR, textStatus, errorThrown, options) {\n      var response = options._response;\n\n      if (options.recalculateProgress) {\n        // Remove the failed (error or abort) file upload from\n        // the global progress calculation:\n        this._progress.loaded -= options._progress.loaded;\n        this._progress.total -= options._progress.total;\n      }\n\n      response.jqXHR = options.jqXHR = jqXHR;\n      response.textStatus = options.textStatus = textStatus;\n      response.errorThrown = options.errorThrown = errorThrown;\n\n      this._trigger('fail', null, options);\n    },\n    _onAlways: function _onAlways(jqXHRorResult, textStatus, jqXHRorError, options) {\n      // jqXHRorResult, textStatus and jqXHRorError are added to the\n      // options object via done and fail callbacks\n      this._trigger('always', null, options);\n    },\n    _onSend: function _onSend(e, data) {\n      if (!data.submit) {\n        this._addConvenienceMethods(e, data);\n      }\n\n      var that = this,\n          jqXHR,\n          aborted,\n          slot,\n          pipe,\n          options = that._getAJAXSettings(data),\n          send = function send() {\n        that._sending += 1; // Set timer for bitrate progress calculation:\n\n        options._bitrateTimer = new that._BitrateTimer();\n        jqXHR = jqXHR || ((aborted || that._trigger('send', $.Event('send', {\n          delegatedEvent: e\n        }), options) === false) && that._getXHRPromise(false, options.context, aborted) || that._chunkedUpload(options) || $.ajax(options)).done(function (result, textStatus, jqXHR) {\n          that._onDone(result, textStatus, jqXHR, options);\n        }).fail(function (jqXHR, textStatus, errorThrown) {\n          that._onFail(jqXHR, textStatus, errorThrown, options);\n        }).always(function (jqXHRorResult, textStatus, jqXHRorError) {\n          that._onAlways(jqXHRorResult, textStatus, jqXHRorError, options);\n\n          that._sending -= 1;\n          that._active -= 1;\n\n          if (options.limitConcurrentUploads && options.limitConcurrentUploads > that._sending) {\n            // Start the next queued upload,\n            // that has not been aborted:\n            var nextSlot = that._slots.shift();\n\n            while (nextSlot) {\n              if (that._getDeferredState(nextSlot) === 'pending') {\n                nextSlot.resolve();\n                break;\n              }\n\n              nextSlot = that._slots.shift();\n            }\n          }\n\n          if (that._active === 0) {\n            // The stop callback is triggered when all uploads have\n            // been completed, equivalent to the global ajaxStop event:\n            that._trigger('stop');\n          }\n        });\n        return jqXHR;\n      };\n\n      this._beforeSend(e, options);\n\n      if (this.options.sequentialUploads || this.options.limitConcurrentUploads && this.options.limitConcurrentUploads <= this._sending) {\n        if (this.options.limitConcurrentUploads > 1) {\n          slot = $.Deferred();\n\n          this._slots.push(slot);\n\n          pipe = slot.then(send);\n        } else {\n          this._sequence = this._sequence.then(send, send);\n          pipe = this._sequence;\n        } // Return the piped Promise object, enhanced with an abort method,\n        // which is delegated to the jqXHR object of the current upload,\n        // and jqXHR callbacks mapped to the equivalent Promise methods:\n\n\n        pipe.abort = function () {\n          aborted = [undefined, 'abort', 'abort'];\n\n          if (!jqXHR) {\n            if (slot) {\n              slot.rejectWith(options.context, aborted);\n            }\n\n            return send();\n          }\n\n          return jqXHR.abort();\n        };\n\n        return this._enhancePromise(pipe);\n      }\n\n      return send();\n    },\n    _onAdd: function _onAdd(e, data) {\n      var that = this,\n          result = true,\n          options = $.extend({}, this.options, data),\n          files = data.files,\n          filesLength = files.length,\n          limit = options.limitMultiFileUploads,\n          limitSize = options.limitMultiFileUploadSize,\n          overhead = options.limitMultiFileUploadSizeOverhead,\n          batchSize = 0,\n          paramName = this._getParamName(options),\n          paramNameSet,\n          paramNameSlice,\n          fileSet,\n          i,\n          j = 0;\n\n      if (!filesLength) {\n        return false;\n      }\n\n      if (limitSize && files[0].size === undefined) {\n        limitSize = undefined;\n      }\n\n      if (!(options.singleFileUploads || limit || limitSize) || !this._isXHRUpload(options)) {\n        fileSet = [files];\n        paramNameSet = [paramName];\n      } else if (!(options.singleFileUploads || limitSize) && limit) {\n        fileSet = [];\n        paramNameSet = [];\n\n        for (i = 0; i < filesLength; i += limit) {\n          fileSet.push(files.slice(i, i + limit));\n          paramNameSlice = paramName.slice(i, i + limit);\n\n          if (!paramNameSlice.length) {\n            paramNameSlice = paramName;\n          }\n\n          paramNameSet.push(paramNameSlice);\n        }\n      } else if (!options.singleFileUploads && limitSize) {\n        fileSet = [];\n        paramNameSet = [];\n\n        for (i = 0; i < filesLength; i = i + 1) {\n          batchSize += files[i].size + overhead;\n\n          if (i + 1 === filesLength || batchSize + files[i + 1].size + overhead > limitSize || limit && i + 1 - j >= limit) {\n            fileSet.push(files.slice(j, i + 1));\n            paramNameSlice = paramName.slice(j, i + 1);\n\n            if (!paramNameSlice.length) {\n              paramNameSlice = paramName;\n            }\n\n            paramNameSet.push(paramNameSlice);\n            j = i + 1;\n            batchSize = 0;\n          }\n        }\n      } else {\n        paramNameSet = paramName;\n      }\n\n      data.originalFiles = files;\n      $.each(fileSet || files, function (index, element) {\n        var newData = $.extend({}, data);\n        newData.files = fileSet ? element : [element];\n        newData.paramName = paramNameSet[index];\n\n        that._initResponseObject(newData);\n\n        that._initProgressObject(newData);\n\n        that._addConvenienceMethods(e, newData);\n\n        result = that._trigger('add', $.Event('add', {\n          delegatedEvent: e\n        }), newData);\n        return result;\n      });\n      return result;\n    },\n    _replaceFileInput: function _replaceFileInput(data) {\n      var input = data.fileInput,\n          inputClone = input.clone(true),\n          restoreFocus = input.is(document.activeElement); // Add a reference for the new cloned file input to the data argument:\n\n      data.fileInputClone = inputClone;\n      $('<form></form>').append(inputClone)[0].reset(); // Detaching allows to insert the fileInput on another form\n      // without loosing the file input value:\n\n      input.after(inputClone).detach(); // If the fileInput had focus before it was detached,\n      // restore focus to the inputClone.\n\n      if (restoreFocus) {\n        inputClone.focus();\n      } // Avoid memory leaks with the detached file input:\n\n\n      $.cleanData(input.unbind('remove')); // Replace the original file input element in the fileInput\n      // elements set with the clone, which has been copied including\n      // event handlers:\n\n      this.options.fileInput = this.options.fileInput.map(function (i, el) {\n        if (el === input[0]) {\n          return inputClone[0];\n        }\n\n        return el;\n      }); // If the widget has been initialized on the file input itself,\n      // override this.element with the file input clone:\n\n      if (input[0] === this.element[0]) {\n        this.element = inputClone;\n      }\n    },\n    _handleFileTreeEntry: function _handleFileTreeEntry(entry, path) {\n      var that = this,\n          dfd = $.Deferred(),\n          entries = [],\n          dirReader,\n          errorHandler = function errorHandler(e) {\n        if (e && !e.entry) {\n          e.entry = entry;\n        } // Since $.when returns immediately if one\n        // Deferred is rejected, we use resolve instead.\n        // This allows valid files and invalid items\n        // to be returned together in one set:\n\n\n        dfd.resolve([e]);\n      },\n          successHandler = function successHandler(entries) {\n        that._handleFileTreeEntries(entries, path + entry.name + '/').done(function (files) {\n          dfd.resolve(files);\n        }).fail(errorHandler);\n      },\n          readEntries = function readEntries() {\n        dirReader.readEntries(function (results) {\n          if (!results.length) {\n            successHandler(entries);\n          } else {\n            entries = entries.concat(results);\n            readEntries();\n          }\n        }, errorHandler);\n      };\n\n      path = path || '';\n\n      if (entry.isFile) {\n        if (entry._file) {\n          // Workaround for Chrome bug #149735\n          entry._file.relativePath = path;\n          dfd.resolve(entry._file);\n        } else {\n          entry.file(function (file) {\n            file.relativePath = path;\n            dfd.resolve(file);\n          }, errorHandler);\n        }\n      } else if (entry.isDirectory) {\n        dirReader = entry.createReader();\n        readEntries();\n      } else {\n        // Return an empty list for file system items\n        // other than files or directories:\n        dfd.resolve([]);\n      }\n\n      return dfd.promise();\n    },\n    _handleFileTreeEntries: function _handleFileTreeEntries(entries, path) {\n      var that = this;\n      return $.when.apply($, $.map(entries, function (entry) {\n        return that._handleFileTreeEntry(entry, path);\n      })).then(function () {\n        return Array.prototype.concat.apply([], arguments);\n      });\n    },\n    _getDroppedFiles: function _getDroppedFiles(dataTransfer) {\n      dataTransfer = dataTransfer || {};\n      var items = dataTransfer.items;\n\n      if (items && items.length && (items[0].webkitGetAsEntry || items[0].getAsEntry)) {\n        return this._handleFileTreeEntries($.map(items, function (item) {\n          var entry;\n\n          if (item.webkitGetAsEntry) {\n            entry = item.webkitGetAsEntry();\n\n            if (entry) {\n              // Workaround for Chrome bug #149735:\n              entry._file = item.getAsFile();\n            }\n\n            return entry;\n          }\n\n          return item.getAsEntry();\n        }));\n      }\n\n      return $.Deferred().resolve($.makeArray(dataTransfer.files)).promise();\n    },\n    _getSingleFileInputFiles: function _getSingleFileInputFiles(fileInput) {\n      fileInput = $(fileInput);\n      var entries = fileInput.prop('webkitEntries') || fileInput.prop('entries'),\n          files,\n          value;\n\n      if (entries && entries.length) {\n        return this._handleFileTreeEntries(entries);\n      }\n\n      files = $.makeArray(fileInput.prop('files'));\n\n      if (!files.length) {\n        value = fileInput.prop('value');\n\n        if (!value) {\n          return $.Deferred().resolve([]).promise();\n        } // If the files property is not available, the browser does not\n        // support the File API and we add a pseudo File object with\n        // the input value as name with path information removed:\n\n\n        files = [{\n          name: value.replace(/^.*\\\\/, '')\n        }];\n      } else if (files[0].name === undefined && files[0].fileName) {\n        // File normalization for Safari 4 and Firefox 3:\n        $.each(files, function (index, file) {\n          file.name = file.fileName;\n          file.size = file.fileSize;\n        });\n      }\n\n      return $.Deferred().resolve(files).promise();\n    },\n    _getFileInputFiles: function _getFileInputFiles(fileInput) {\n      if (!(fileInput instanceof $) || fileInput.length === 1) {\n        return this._getSingleFileInputFiles(fileInput);\n      }\n\n      return $.when.apply($, $.map(fileInput, this._getSingleFileInputFiles)).then(function () {\n        return Array.prototype.concat.apply([], arguments);\n      });\n    },\n    _onChange: function _onChange(e) {\n      var that = this,\n          data = {\n        fileInput: $(e.target),\n        form: $(e.target.form)\n      };\n\n      this._getFileInputFiles(data.fileInput).always(function (files) {\n        data.files = files;\n\n        if (that.options.replaceFileInput) {\n          that._replaceFileInput(data);\n        }\n\n        if (that._trigger('change', $.Event('change', {\n          delegatedEvent: e\n        }), data) !== false) {\n          that._onAdd(e, data);\n        }\n      });\n    },\n    _onPaste: function _onPaste(e) {\n      var items = e.originalEvent && e.originalEvent.clipboardData && e.originalEvent.clipboardData.items,\n          data = {\n        files: []\n      };\n\n      if (items && items.length) {\n        $.each(items, function (index, item) {\n          var file = item.getAsFile && item.getAsFile();\n\n          if (file) {\n            data.files.push(file);\n          }\n        });\n\n        if (this._trigger('paste', $.Event('paste', {\n          delegatedEvent: e\n        }), data) !== false) {\n          this._onAdd(e, data);\n        }\n      }\n    },\n    _onDrop: function _onDrop(e) {\n      e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n      var that = this,\n          dataTransfer = e.dataTransfer,\n          data = {};\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        e.preventDefault();\n\n        this._getDroppedFiles(dataTransfer).always(function (files) {\n          data.files = files;\n\n          if (that._trigger('drop', $.Event('drop', {\n            delegatedEvent: e\n          }), data) !== false) {\n            that._onAdd(e, data);\n          }\n        });\n      }\n    },\n    _onDragOver: getDragHandler('dragover'),\n    _onDragEnter: getDragHandler('dragenter'),\n    _onDragLeave: getDragHandler('dragleave'),\n    _initEventHandlers: function _initEventHandlers() {\n      if (this._isXHRUpload(this.options)) {\n        this._on(this.options.dropZone, {\n          dragover: this._onDragOver,\n          drop: this._onDrop,\n          // event.preventDefault() on dragenter is required for IE10+:\n          dragenter: this._onDragEnter,\n          // dragleave is not required, but added for completeness:\n          dragleave: this._onDragLeave\n        });\n\n        this._on(this.options.pasteZone, {\n          paste: this._onPaste\n        });\n      }\n\n      if ($.support.fileInput) {\n        this._on(this.options.fileInput, {\n          change: this._onChange\n        });\n      }\n    },\n    _destroyEventHandlers: function _destroyEventHandlers() {\n      this._off(this.options.dropZone, 'dragenter dragleave dragover drop');\n\n      this._off(this.options.pasteZone, 'paste');\n\n      this._off(this.options.fileInput, 'change');\n    },\n    _destroy: function _destroy() {\n      this._destroyEventHandlers();\n    },\n    _setOption: function _setOption(key, value) {\n      var reinit = $.inArray(key, this._specialOptions) !== -1;\n\n      if (reinit) {\n        this._destroyEventHandlers();\n      }\n\n      this._super(key, value);\n\n      if (reinit) {\n        this._initSpecialOptions();\n\n        this._initEventHandlers();\n      }\n    },\n    _initSpecialOptions: function _initSpecialOptions() {\n      var options = this.options;\n\n      if (options.fileInput === undefined) {\n        options.fileInput = this.element.is('input[type=\"file\"]') ? this.element : this.element.find('input[type=\"file\"]');\n      } else if (!(options.fileInput instanceof $)) {\n        options.fileInput = $(options.fileInput);\n      }\n\n      if (!(options.dropZone instanceof $)) {\n        options.dropZone = $(options.dropZone);\n      }\n\n      if (!(options.pasteZone instanceof $)) {\n        options.pasteZone = $(options.pasteZone);\n      }\n    },\n    _getRegExp: function _getRegExp(str) {\n      var parts = str.split('/'),\n          modifiers = parts.pop();\n      parts.shift();\n      return new RegExp(parts.join('/'), modifiers);\n    },\n    _isRegExpOption: function _isRegExpOption(key, value) {\n      return key !== 'url' && $.type(value) === 'string' && /^\\/.*\\/[igm]{0,3}$/.test(value);\n    },\n    _initDataAttributes: function _initDataAttributes() {\n      var that = this,\n          options = this.options,\n          data = this.element.data(); // Initialize options set via HTML5 data-attributes:\n\n      $.each(this.element[0].attributes, function (index, attr) {\n        var key = attr.name.toLowerCase(),\n            value;\n\n        if (/^data-/.test(key)) {\n          // Convert hyphen-ated key to camelCase:\n          key = key.slice(5).replace(/-[a-z]/g, function (str) {\n            return str.charAt(1).toUpperCase();\n          });\n          value = data[key];\n\n          if (that._isRegExpOption(key, value)) {\n            value = that._getRegExp(value);\n          }\n\n          options[key] = value;\n        }\n      });\n    },\n    _create: function _create() {\n      this._initDataAttributes();\n\n      this._initSpecialOptions();\n\n      this._slots = [];\n      this._sequence = this._getXHRPromise(true);\n      this._sending = this._active = 0;\n\n      this._initProgressObject(this);\n\n      this._initEventHandlers();\n    },\n    // This method is exposed to the widget API and allows to query\n    // the number of active uploads:\n    active: function active() {\n      return this._active;\n    },\n    // This method is exposed to the widget API and allows to query\n    // the widget upload progress.\n    // It returns an object with loaded, total and bitrate properties\n    // for the running uploads:\n    progress: function progress() {\n      return this._progress;\n    },\n    // This method is exposed to the widget API and allows adding files\n    // using the fileupload API. The data parameter accepts an object which\n    // must have a files property and can contain additional options:\n    // .fileupload('add', {files: filesList});\n    add: function add(data) {\n      var that = this;\n\n      if (!data || this.options.disabled) {\n        return;\n      }\n\n      if (data.fileInput && !data.files) {\n        this._getFileInputFiles(data.fileInput).always(function (files) {\n          data.files = files;\n\n          that._onAdd(null, data);\n        });\n      } else {\n        data.files = $.makeArray(data.files);\n\n        this._onAdd(null, data);\n      }\n    },\n    // This method is exposed to the widget API and allows sending files\n    // using the fileupload API. The data parameter accepts an object which\n    // must have a files or fileInput property and can contain additional options:\n    // .fileupload('send', {files: filesList});\n    // The method returns a Promise object for the file upload call.\n    send: function send(data) {\n      if (data && !this.options.disabled) {\n        if (data.fileInput && !data.files) {\n          var that = this,\n              dfd = $.Deferred(),\n              promise = dfd.promise(),\n              jqXHR,\n              aborted;\n\n          promise.abort = function () {\n            aborted = true;\n\n            if (jqXHR) {\n              return jqXHR.abort();\n            }\n\n            dfd.reject(null, 'abort', 'abort');\n            return promise;\n          };\n\n          this._getFileInputFiles(data.fileInput).always(function (files) {\n            if (aborted) {\n              return;\n            }\n\n            if (!files.length) {\n              dfd.reject();\n              return;\n            }\n\n            data.files = files;\n            jqXHR = that._onSend(null, data);\n            jqXHR.then(function (result, textStatus, jqXHR) {\n              dfd.resolve(result, textStatus, jqXHR);\n            }, function (jqXHR, textStatus, errorThrown) {\n              dfd.reject(jqXHR, textStatus, errorThrown);\n            });\n          });\n\n          return this._enhancePromise(promise);\n        }\n\n        data.files = $.makeArray(data.files);\n\n        if (data.files.length) {\n          return this._onSend(null, data);\n        }\n      }\n\n      return this._getXHRPromise(false, data && data.context);\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/js/jquery.fileupload.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/node_modules/blueimp-canvas-to-blob/js/canvas-to-blob.js":
/*!***************************************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/node_modules/blueimp-canvas-to-blob/js/canvas-to-blob.js ***!
  \***************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * JavaScript Canvas to Blob\n * https://github.com/blueimp/JavaScript-Canvas-to-Blob\n *\n * Copyright 2012, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n *\n * Based on stackoverflow user Stoive's code snippet:\n * http://stackoverflow.com/q/4998908\n */\n\n/* global atob, Blob, define */\n;\n\n(function (window) {\n  'use strict';\n\n  var CanvasPrototype = window.HTMLCanvasElement && window.HTMLCanvasElement.prototype;\n\n  var hasBlobConstructor = window.Blob && function () {\n    try {\n      return Boolean(new Blob());\n    } catch (e) {\n      return false;\n    }\n  }();\n\n  var hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && function () {\n    try {\n      return new Blob([new Uint8Array(100)]).size === 100;\n    } catch (e) {\n      return false;\n    }\n  }();\n\n  var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n  var dataURIPattern = /^data:((.*?)(;charset=.*?)?)(;base64)?,/;\n\n  var dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array && function (dataURI) {\n    var matches, mediaType, isBase64, dataString, byteString, arrayBuffer, intArray, i, bb; // Parse the dataURI components as per RFC 2397\n\n    matches = dataURI.match(dataURIPattern);\n\n    if (!matches) {\n      throw new Error('invalid data URI');\n    } // Default to text/plain;charset=US-ASCII\n\n\n    mediaType = matches[2] ? matches[1] : 'text/plain' + (matches[3] || ';charset=US-ASCII');\n    isBase64 = !!matches[4];\n    dataString = dataURI.slice(matches[0].length);\n\n    if (isBase64) {\n      // Convert base64 to raw binary data held in a string:\n      byteString = atob(dataString);\n    } else {\n      // Convert base64/URLEncoded data component to raw binary:\n      byteString = decodeURIComponent(dataString);\n    } // Write the bytes of the string to an ArrayBuffer:\n\n\n    arrayBuffer = new ArrayBuffer(byteString.length);\n    intArray = new Uint8Array(arrayBuffer);\n\n    for (i = 0; i < byteString.length; i += 1) {\n      intArray[i] = byteString.charCodeAt(i);\n    } // Write the ArrayBuffer (or ArrayBufferView) to a blob:\n\n\n    if (hasBlobConstructor) {\n      return new Blob([hasArrayBufferViewSupport ? intArray : arrayBuffer], {\n        type: mediaType\n      });\n    }\n\n    bb = new BlobBuilder();\n    bb.append(arrayBuffer);\n    return bb.getBlob(mediaType);\n  };\n\n  if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {\n    if (CanvasPrototype.mozGetAsFile) {\n      CanvasPrototype.toBlob = function (callback, type, quality) {\n        if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {\n          callback(dataURLtoBlob(this.toDataURL(type, quality)));\n        } else {\n          callback(this.mozGetAsFile('blob', type));\n        }\n      };\n    } else if (CanvasPrototype.toDataURL && dataURLtoBlob) {\n      CanvasPrototype.toBlob = function (callback, type, quality) {\n        callback(dataURLtoBlob(this.toDataURL(type, quality)));\n      };\n    }\n  }\n\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n      return dataURLtoBlob;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(window);\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/node_modules/blueimp-canvas-to-blob/js/canvas-to-blob.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-exif.js":
/*!************************************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-exif.js ***!
  \************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * JavaScript Load Image Exif Parser\n * https://github.com/blueimp/JavaScript-Load-Image\n *\n * Copyright 2013, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* global define */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./load-image */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js\"), __webpack_require__(/*! ./load-image-meta */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-meta.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (loadImage) {\n  'use strict';\n\n  loadImage.ExifMap = function () {\n    return this;\n  };\n\n  loadImage.ExifMap.prototype.map = {\n    'Orientation': 0x0112\n  };\n\n  loadImage.ExifMap.prototype.get = function (id) {\n    return this[id] || this[this.map[id]];\n  };\n\n  loadImage.getExifThumbnail = function (dataView, offset, length) {\n    var hexData, i, b;\n\n    if (!length || offset + length > dataView.byteLength) {\n      console.log('Invalid Exif data: Invalid thumbnail data.');\n      return;\n    }\n\n    hexData = [];\n\n    for (i = 0; i < length; i += 1) {\n      b = dataView.getUint8(offset + i);\n      hexData.push((b < 16 ? '0' : '') + b.toString(16));\n    }\n\n    return 'data:image/jpeg,%' + hexData.join('%');\n  };\n\n  loadImage.exifTagTypes = {\n    // byte, 8-bit unsigned int:\n    1: {\n      getValue: function getValue(dataView, dataOffset) {\n        return dataView.getUint8(dataOffset);\n      },\n      size: 1\n    },\n    // ascii, 8-bit byte:\n    2: {\n      getValue: function getValue(dataView, dataOffset) {\n        return String.fromCharCode(dataView.getUint8(dataOffset));\n      },\n      size: 1,\n      ascii: true\n    },\n    // short, 16 bit int:\n    3: {\n      getValue: function getValue(dataView, dataOffset, littleEndian) {\n        return dataView.getUint16(dataOffset, littleEndian);\n      },\n      size: 2\n    },\n    // long, 32 bit int:\n    4: {\n      getValue: function getValue(dataView, dataOffset, littleEndian) {\n        return dataView.getUint32(dataOffset, littleEndian);\n      },\n      size: 4\n    },\n    // rational = two long values, first is numerator, second is denominator:\n    5: {\n      getValue: function getValue(dataView, dataOffset, littleEndian) {\n        return dataView.getUint32(dataOffset, littleEndian) / dataView.getUint32(dataOffset + 4, littleEndian);\n      },\n      size: 8\n    },\n    // slong, 32 bit signed int:\n    9: {\n      getValue: function getValue(dataView, dataOffset, littleEndian) {\n        return dataView.getInt32(dataOffset, littleEndian);\n      },\n      size: 4\n    },\n    // srational, two slongs, first is numerator, second is denominator:\n    10: {\n      getValue: function getValue(dataView, dataOffset, littleEndian) {\n        return dataView.getInt32(dataOffset, littleEndian) / dataView.getInt32(dataOffset + 4, littleEndian);\n      },\n      size: 8\n    }\n  }; // undefined, 8-bit byte, value depending on field:\n\n  loadImage.exifTagTypes[7] = loadImage.exifTagTypes[1];\n\n  loadImage.getExifValue = function (dataView, tiffOffset, offset, type, length, littleEndian) {\n    var tagType = loadImage.exifTagTypes[type];\n    var tagSize;\n    var dataOffset;\n    var values;\n    var i;\n    var str;\n    var c;\n\n    if (!tagType) {\n      console.log('Invalid Exif data: Invalid tag type.');\n      return;\n    }\n\n    tagSize = tagType.size * length; // Determine if the value is contained in the dataOffset bytes,\n    // or if the value at the dataOffset is a pointer to the actual data:\n\n    dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32(offset + 8, littleEndian) : offset + 8;\n\n    if (dataOffset + tagSize > dataView.byteLength) {\n      console.log('Invalid Exif data: Invalid data offset.');\n      return;\n    }\n\n    if (length === 1) {\n      return tagType.getValue(dataView, dataOffset, littleEndian);\n    }\n\n    values = [];\n\n    for (i = 0; i < length; i += 1) {\n      values[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian);\n    }\n\n    if (tagType.ascii) {\n      str = ''; // Concatenate the chars:\n\n      for (i = 0; i < values.length; i += 1) {\n        c = values[i]; // Ignore the terminating NULL byte(s):\n\n        if (c === \"\\0\") {\n          break;\n        }\n\n        str += c;\n      }\n\n      return str;\n    }\n\n    return values;\n  };\n\n  loadImage.parseExifTag = function (dataView, tiffOffset, offset, littleEndian, data) {\n    var tag = dataView.getUint16(offset, littleEndian);\n    data.exif[tag] = loadImage.getExifValue(dataView, tiffOffset, offset, dataView.getUint16(offset + 2, littleEndian), // tag type\n    dataView.getUint32(offset + 4, littleEndian), // tag length\n    littleEndian);\n  };\n\n  loadImage.parseExifTags = function (dataView, tiffOffset, dirOffset, littleEndian, data) {\n    var tagsNumber, dirEndOffset, i;\n\n    if (dirOffset + 6 > dataView.byteLength) {\n      console.log('Invalid Exif data: Invalid directory offset.');\n      return;\n    }\n\n    tagsNumber = dataView.getUint16(dirOffset, littleEndian);\n    dirEndOffset = dirOffset + 2 + 12 * tagsNumber;\n\n    if (dirEndOffset + 4 > dataView.byteLength) {\n      console.log('Invalid Exif data: Invalid directory size.');\n      return;\n    }\n\n    for (i = 0; i < tagsNumber; i += 1) {\n      this.parseExifTag(dataView, tiffOffset, dirOffset + 2 + 12 * i, // tag offset\n      littleEndian, data);\n    } // Return the offset to the next directory:\n\n\n    return dataView.getUint32(dirEndOffset, littleEndian);\n  };\n\n  loadImage.parseExifData = function (dataView, offset, length, data, options) {\n    if (options.disableExif) {\n      return;\n    }\n\n    var tiffOffset = offset + 10;\n    var littleEndian;\n    var dirOffset;\n    var thumbnailData; // Check for the ASCII code for \"Exif\" (0x45786966):\n\n    if (dataView.getUint32(offset + 4) !== 0x45786966) {\n      // No Exif data, might be XMP data instead\n      return;\n    }\n\n    if (tiffOffset + 8 > dataView.byteLength) {\n      console.log('Invalid Exif data: Invalid segment size.');\n      return;\n    } // Check for the two null bytes:\n\n\n    if (dataView.getUint16(offset + 8) !== 0x0000) {\n      console.log('Invalid Exif data: Missing byte alignment offset.');\n      return;\n    } // Check the byte alignment:\n\n\n    switch (dataView.getUint16(tiffOffset)) {\n      case 0x4949:\n        littleEndian = true;\n        break;\n\n      case 0x4D4D:\n        littleEndian = false;\n        break;\n\n      default:\n        console.log('Invalid Exif data: Invalid byte alignment marker.');\n        return;\n    } // Check for the TIFF tag marker (0x002A):\n\n\n    if (dataView.getUint16(tiffOffset + 2, littleEndian) !== 0x002A) {\n      console.log('Invalid Exif data: Missing TIFF marker.');\n      return;\n    } // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\n\n\n    dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian); // Create the exif object to store the tags:\n\n    data.exif = new loadImage.ExifMap(); // Parse the tags of the main image directory and retrieve the\n    // offset to the next directory, usually the thumbnail directory:\n\n    dirOffset = loadImage.parseExifTags(dataView, tiffOffset, tiffOffset + dirOffset, littleEndian, data);\n\n    if (dirOffset && !options.disableExifThumbnail) {\n      thumbnailData = {\n        exif: {}\n      };\n      dirOffset = loadImage.parseExifTags(dataView, tiffOffset, tiffOffset + dirOffset, littleEndian, thumbnailData); // Check for JPEG Thumbnail offset:\n\n      if (thumbnailData.exif[0x0201]) {\n        data.exif.Thumbnail = loadImage.getExifThumbnail(dataView, tiffOffset + thumbnailData.exif[0x0201], thumbnailData.exif[0x0202] // Thumbnail data length\n        );\n      }\n    } // Check for Exif Sub IFD Pointer:\n\n\n    if (data.exif[0x8769] && !options.disableExifSub) {\n      loadImage.parseExifTags(dataView, tiffOffset, tiffOffset + data.exif[0x8769], // directory offset\n      littleEndian, data);\n    } // Check for GPS Info IFD Pointer:\n\n\n    if (data.exif[0x8825] && !options.disableExifGps) {\n      loadImage.parseExifTags(dataView, tiffOffset, tiffOffset + data.exif[0x8825], // directory offset\n      littleEndian, data);\n    }\n  }; // Registers the Exif parser for the APP1 JPEG meta data segment:\n\n\n  loadImage.metaDataParsers.jpeg[0xffe1].push(loadImage.parseExifData); // Adds the following properties to the parseMetaData callback data:\n  // * exif: The exif tags, parsed by the parseExifData method\n  // Adds the following options to the parseMetaData method:\n  // * disableExif: Disables Exif parsing.\n  // * disableExifThumbnail: Disables parsing of the Exif Thumbnail.\n  // * disableExifSub: Disables parsing of the Exif Sub IFD.\n  // * disableExifGps: Disables parsing of the Exif GPS Info IFD.\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-exif.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-meta.js":
/*!************************************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-meta.js ***!
  \************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * JavaScript Load Image Meta\n * https://github.com/blueimp/JavaScript-Load-Image\n *\n * Copyright 2013, Sebastian Tschan\n * https://blueimp.net\n *\n * Image meta data handling implementation\n * based on the help and contribution of\n * Achim Stöhr.\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* global define, Blob */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./load-image */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (loadImage) {\n  'use strict';\n\n  var hasblobSlice = window.Blob && (Blob.prototype.slice || Blob.prototype.webkitSlice || Blob.prototype.mozSlice);\n\n  loadImage.blobSlice = hasblobSlice && function () {\n    var slice = this.slice || this.webkitSlice || this.mozSlice;\n    return slice.apply(this, arguments);\n  };\n\n  loadImage.metaDataParsers = {\n    jpeg: {\n      0xffe1: [] // APP1 marker\n\n    }\n  }; // Parses image meta data and calls the callback with an object argument\n  // with the following properties:\n  // * imageHead: The complete image head as ArrayBuffer (Uint8Array for IE10)\n  // The options arguments accepts an object and supports the following properties:\n  // * maxMetaDataSize: Defines the maximum number of bytes to parse.\n  // * disableImageHead: Disables creating the imageHead property.\n\n  loadImage.parseMetaData = function (file, callback, options, data) {\n    options = options || {};\n    data = data || {};\n    var that = this; // 256 KiB should contain all EXIF/ICC/IPTC segments:\n\n    var maxMetaDataSize = options.maxMetaDataSize || 262144;\n    var noMetaData = !(window.DataView && file && file.size >= 12 && file.type === 'image/jpeg' && loadImage.blobSlice);\n\n    if (noMetaData || !loadImage.readFile(loadImage.blobSlice.call(file, 0, maxMetaDataSize), function (e) {\n      if (e.target.error) {\n        // FileReader error\n        console.log(e.target.error);\n        callback(data);\n        return;\n      } // Note on endianness:\n      // Since the marker and length bytes in JPEG files are always\n      // stored in big endian order, we can leave the endian parameter\n      // of the DataView methods undefined, defaulting to big endian.\n\n\n      var buffer = e.target.result;\n      var dataView = new DataView(buffer);\n      var offset = 2;\n      var maxOffset = dataView.byteLength - 4;\n      var headLength = offset;\n      var markerBytes;\n      var markerLength;\n      var parsers;\n      var i; // Check for the JPEG marker (0xffd8):\n\n      if (dataView.getUint16(0) === 0xffd8) {\n        while (offset < maxOffset) {\n          markerBytes = dataView.getUint16(offset); // Search for APPn (0xffeN) and COM (0xfffe) markers,\n          // which contain application-specific meta-data like\n          // Exif, ICC and IPTC data and text comments:\n\n          if (markerBytes >= 0xffe0 && markerBytes <= 0xffef || markerBytes === 0xfffe) {\n            // The marker bytes (2) are always followed by\n            // the length bytes (2), indicating the length of the\n            // marker segment, which includes the length bytes,\n            // but not the marker bytes, so we add 2:\n            markerLength = dataView.getUint16(offset + 2) + 2;\n\n            if (offset + markerLength > dataView.byteLength) {\n              console.log('Invalid meta data: Invalid segment size.');\n              break;\n            }\n\n            parsers = loadImage.metaDataParsers.jpeg[markerBytes];\n\n            if (parsers) {\n              for (i = 0; i < parsers.length; i += 1) {\n                parsers[i].call(that, dataView, offset, markerLength, data, options);\n              }\n            }\n\n            offset += markerLength;\n            headLength = offset;\n          } else {\n            // Not an APPn or COM marker, probably safe to\n            // assume that this is the end of the meta data\n            break;\n          }\n        } // Meta length must be longer than JPEG marker (2)\n        // plus APPn marker (2), followed by length bytes (2):\n\n\n        if (!options.disableImageHead && headLength > 6) {\n          if (buffer.slice) {\n            data.imageHead = buffer.slice(0, headLength);\n          } else {\n            // Workaround for IE10, which does not yet\n            // support ArrayBuffer.slice:\n            data.imageHead = new Uint8Array(buffer).subarray(0, headLength);\n          }\n        }\n      } else {\n        console.log('Invalid JPEG file: Missing JPEG marker.');\n      }\n\n      callback(data);\n    }, 'readAsArrayBuffer')) {\n      callback(data);\n    }\n  }; // Determines if meta data should be loaded automatically:\n\n\n  loadImage.hasMetaOption = function (options) {\n    return options && options.meta;\n  };\n\n  var originalTransform = loadImage.transform;\n\n  loadImage.transform = function (img, options, callback, file, data) {\n    if (loadImage.hasMetaOption(options)) {\n      loadImage.parseMetaData(file, function (data) {\n        originalTransform.call(loadImage, img, options, callback, file, data);\n      }, options, data);\n    } else {\n      originalTransform.apply(loadImage, arguments);\n    }\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-meta.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-scale.js":
/*!*************************************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-scale.js ***!
  \*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * JavaScript Load Image Scaling\n * https://github.com/blueimp/JavaScript-Load-Image\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* global define */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // Register as an anonymous AMD module:\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./load-image */ \"./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (loadImage) {\n  'use strict';\n\n  var originalTransform = loadImage.transform;\n\n  loadImage.transform = function (img, options, callback, file, data) {\n    originalTransform.call(loadImage, loadImage.scale(img, options, data), options, callback, file, data);\n  }; // Transform image coordinates, allows to override e.g.\n  // the canvas orientation based on the orientation option,\n  // gets canvas, options passed as arguments:\n\n\n  loadImage.transformCoordinates = function () {\n    return;\n  }; // Returns transformed options, allows to override e.g.\n  // maxWidth, maxHeight and crop options based on the aspectRatio.\n  // gets img, options passed as arguments:\n\n\n  loadImage.getTransformedOptions = function (img, options) {\n    var aspectRatio = options.aspectRatio;\n    var newOptions;\n    var i;\n    var width;\n    var height;\n\n    if (!aspectRatio) {\n      return options;\n    }\n\n    newOptions = {};\n\n    for (i in options) {\n      if (options.hasOwnProperty(i)) {\n        newOptions[i] = options[i];\n      }\n    }\n\n    newOptions.crop = true;\n    width = img.naturalWidth || img.width;\n    height = img.naturalHeight || img.height;\n\n    if (width / height > aspectRatio) {\n      newOptions.maxWidth = height * aspectRatio;\n      newOptions.maxHeight = height;\n    } else {\n      newOptions.maxWidth = width;\n      newOptions.maxHeight = width / aspectRatio;\n    }\n\n    return newOptions;\n  }; // Canvas render method, allows to implement a different rendering algorithm:\n\n\n  loadImage.renderImageToCanvas = function (canvas, img, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) {\n    canvas.getContext('2d').drawImage(img, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight);\n    return canvas;\n  }; // Determines if the target image should be a canvas element:\n\n\n  loadImage.hasCanvasOption = function (options) {\n    return options.canvas || options.crop || !!options.aspectRatio;\n  }; // Scales and/or crops the given image (img or canvas HTML element)\n  // using the given options.\n  // Returns a canvas object if the browser supports canvas\n  // and the hasCanvasOption method returns true or a canvas\n  // object is passed as image, else the scaled image:\n\n\n  loadImage.scale = function (img, options, data) {\n    options = options || {};\n    var canvas = document.createElement('canvas');\n    var useCanvas = img.getContext || loadImage.hasCanvasOption(options) && canvas.getContext;\n    var width = img.naturalWidth || img.width;\n    var height = img.naturalHeight || img.height;\n    var destWidth = width;\n    var destHeight = height;\n    var maxWidth;\n    var maxHeight;\n    var minWidth;\n    var minHeight;\n    var sourceWidth;\n    var sourceHeight;\n    var sourceX;\n    var sourceY;\n    var pixelRatio;\n    var downsamplingRatio;\n    var tmp;\n\n    function scaleUp() {\n      var scale = Math.max((minWidth || destWidth) / destWidth, (minHeight || destHeight) / destHeight);\n\n      if (scale > 1) {\n        destWidth *= scale;\n        destHeight *= scale;\n      }\n    }\n\n    function scaleDown() {\n      var scale = Math.min((maxWidth || destWidth) / destWidth, (maxHeight || destHeight) / destHeight);\n\n      if (scale < 1) {\n        destWidth *= scale;\n        destHeight *= scale;\n      }\n    }\n\n    if (useCanvas) {\n      options = loadImage.getTransformedOptions(img, options, data);\n      sourceX = options.left || 0;\n      sourceY = options.top || 0;\n\n      if (options.sourceWidth) {\n        sourceWidth = options.sourceWidth;\n\n        if (options.right !== undefined && options.left === undefined) {\n          sourceX = width - sourceWidth - options.right;\n        }\n      } else {\n        sourceWidth = width - sourceX - (options.right || 0);\n      }\n\n      if (options.sourceHeight) {\n        sourceHeight = options.sourceHeight;\n\n        if (options.bottom !== undefined && options.top === undefined) {\n          sourceY = height - sourceHeight - options.bottom;\n        }\n      } else {\n        sourceHeight = height - sourceY - (options.bottom || 0);\n      }\n\n      destWidth = sourceWidth;\n      destHeight = sourceHeight;\n    }\n\n    maxWidth = options.maxWidth;\n    maxHeight = options.maxHeight;\n    minWidth = options.minWidth;\n    minHeight = options.minHeight;\n\n    if (useCanvas && maxWidth && maxHeight && options.crop) {\n      destWidth = maxWidth;\n      destHeight = maxHeight;\n      tmp = sourceWidth / sourceHeight - maxWidth / maxHeight;\n\n      if (tmp < 0) {\n        sourceHeight = maxHeight * sourceWidth / maxWidth;\n\n        if (options.top === undefined && options.bottom === undefined) {\n          sourceY = (height - sourceHeight) / 2;\n        }\n      } else if (tmp > 0) {\n        sourceWidth = maxWidth * sourceHeight / maxHeight;\n\n        if (options.left === undefined && options.right === undefined) {\n          sourceX = (width - sourceWidth) / 2;\n        }\n      }\n    } else {\n      if (options.contain || options.cover) {\n        minWidth = maxWidth = maxWidth || minWidth;\n        minHeight = maxHeight = maxHeight || minHeight;\n      }\n\n      if (options.cover) {\n        scaleDown();\n        scaleUp();\n      } else {\n        scaleUp();\n        scaleDown();\n      }\n    }\n\n    if (useCanvas) {\n      pixelRatio = options.pixelRatio;\n\n      if (pixelRatio > 1) {\n        canvas.style.width = destWidth + 'px';\n        canvas.style.height = destHeight + 'px';\n        destWidth *= pixelRatio;\n        destHeight *= pixelRatio;\n        canvas.getContext('2d').scale(pixelRatio, pixelRatio);\n      }\n\n      downsamplingRatio = options.downsamplingRatio;\n\n      if (downsamplingRatio > 0 && downsamplingRatio < 1 && destWidth < sourceWidth && destHeight < sourceHeight) {\n        while (sourceWidth * downsamplingRatio > destWidth) {\n          canvas.width = sourceWidth * downsamplingRatio;\n          canvas.height = sourceHeight * downsamplingRatio;\n          loadImage.renderImageToCanvas(canvas, img, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, canvas.width, canvas.height);\n          sourceX = 0;\n          sourceY = 0;\n          sourceWidth = canvas.width;\n          sourceHeight = canvas.height;\n          img = document.createElement('canvas');\n          img.width = sourceWidth;\n          img.height = sourceHeight;\n          loadImage.renderImageToCanvas(img, canvas, 0, 0, sourceWidth, sourceHeight, 0, 0, sourceWidth, sourceHeight);\n        }\n      }\n\n      canvas.width = destWidth;\n      canvas.height = destHeight;\n      loadImage.transformCoordinates(canvas, options);\n      return loadImage.renderImageToCanvas(canvas, img, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, destWidth, destHeight);\n    }\n\n    img.width = destWidth;\n    img.height = destHeight;\n    return img;\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image-scale.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js":
/*!*******************************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js ***!
  \*******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * JavaScript Load Image\n * https://github.com/blueimp/JavaScript-Load-Image\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* global define, URL, webkitURL, FileReader */\n;\n\n(function ($) {\n  'use strict'; // Loads an image for a given File object.\n  // Invokes the callback with an img or optional canvas\n  // element (if supported by the browser) as parameter:\n\n  function loadImage(file, callback, options) {\n    var img = document.createElement('img');\n    var url;\n\n    img.onerror = function (event) {\n      return loadImage.onerror(img, event, file, callback, options);\n    };\n\n    img.onload = function (event) {\n      return loadImage.onload(img, event, file, callback, options);\n    };\n\n    if (typeof file === 'string') {\n      loadImage.fetchBlob(file, function (blob) {\n        if (blob) {\n          file = blob;\n          url = loadImage.createObjectURL(file);\n        } else {\n          url = file;\n\n          if (options && options.crossOrigin) {\n            img.crossOrigin = options.crossOrigin;\n          }\n        }\n\n        img.src = url;\n      }, options);\n      return img;\n    } else if (loadImage.isInstanceOf('Blob', file) || // Files are also Blob instances, but some browsers\n    // (Firefox 3.6) support the File API but not Blobs:\n    loadImage.isInstanceOf('File', file)) {\n      url = img._objectURL = loadImage.createObjectURL(file);\n\n      if (url) {\n        img.src = url;\n        return img;\n      }\n\n      return loadImage.readFile(file, function (e) {\n        var target = e.target;\n\n        if (target && target.result) {\n          img.src = target.result;\n        } else if (callback) {\n          callback(e);\n        }\n      });\n    }\n  } // The check for URL.revokeObjectURL fixes an issue with Opera 12,\n  // which provides URL.createObjectURL but doesn't properly implement it:\n\n\n  var urlAPI = window.createObjectURL && window || window.URL && URL.revokeObjectURL && URL || window.webkitURL && webkitURL;\n\n  function revokeHelper(img, options) {\n    if (img._objectURL && !(options && options.noRevoke)) {\n      loadImage.revokeObjectURL(img._objectURL);\n      delete img._objectURL;\n    }\n  } // If the callback given to this function returns a blob, it is used as image\n  // source instead of the original url and overrides the file argument used in\n  // the onload and onerror event callbacks:\n\n\n  loadImage.fetchBlob = function (url, callback, options) {\n    callback();\n  };\n\n  loadImage.isInstanceOf = function (type, obj) {\n    // Cross-frame instanceof check\n    return Object.prototype.toString.call(obj) === '[object ' + type + ']';\n  };\n\n  loadImage.transform = function (img, options, callback, file, data) {\n    callback(img, data);\n  };\n\n  loadImage.onerror = function (img, event, file, callback, options) {\n    revokeHelper(img, options);\n\n    if (callback) {\n      callback.call(img, event);\n    }\n  };\n\n  loadImage.onload = function (img, event, file, callback, options) {\n    revokeHelper(img, options);\n\n    if (callback) {\n      loadImage.transform(img, options, callback, file, {});\n    }\n  };\n\n  loadImage.createObjectURL = function (file) {\n    return urlAPI ? urlAPI.createObjectURL(file) : false;\n  };\n\n  loadImage.revokeObjectURL = function (url) {\n    return urlAPI ? urlAPI.revokeObjectURL(url) : false;\n  }; // Loads a given File object via FileReader interface,\n  // invokes the callback with the event object (load or error).\n  // The result can be read via event.target.result:\n\n\n  loadImage.readFile = function (file, callback, method) {\n    if (window.FileReader) {\n      var fileReader = new FileReader();\n      fileReader.onload = fileReader.onerror = callback;\n      method = method || 'readAsDataURL';\n\n      if (fileReader[method]) {\n        fileReader[method](file);\n        return fileReader;\n      }\n    }\n\n    return false;\n  };\n\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n      return loadImage;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(window);\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/node_modules/blueimp-load-image/js/load-image.js?");

/***/ }),

/***/ "./node_modules/blueimp-file-upload/node_modules/blueimp-tmpl/js/tmpl.js":
/*!*******************************************************************************!*\
  !*** ./node_modules/blueimp-file-upload/node_modules/blueimp-tmpl/js/tmpl.js ***!
  \*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * JavaScript Templates\n * https://github.com/blueimp/JavaScript-Templates\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n *\n * Inspired by John Resig's JavaScript Micro-Templating:\n * http://ejohn.org/blog/javascript-micro-templating/\n */\n\n/* global define */\n;\n\n(function ($) {\n  'use strict';\n\n  var tmpl = function tmpl(str, data) {\n    var f = !/[^\\w\\-\\.:]/.test(str) ? tmpl.cache[str] = tmpl.cache[str] || tmpl(tmpl.load(str)) : new Function( // eslint-disable-line no-new-func\n    tmpl.arg + ',tmpl', 'var _e=tmpl.encode' + tmpl.helper + \",_s='\" + str.replace(tmpl.regexp, tmpl.func) + \"';return _s;\");\n    return data ? f(data, tmpl) : function (data) {\n      return f(data, tmpl);\n    };\n  };\n\n  tmpl.cache = {};\n\n  tmpl.load = function (id) {\n    return document.getElementById(id).innerHTML;\n  };\n\n  tmpl.regexp = /([\\s'\\\\])(?!(?:[^{]|\\{(?!%))*%\\})|(?:\\{%(=|#)([\\s\\S]+?)%\\})|(\\{%)|(%\\})/g;\n\n  tmpl.func = function (s, p1, p2, p3, p4, p5) {\n    if (p1) {\n      // whitespace, quote and backspace in HTML context\n      return {\n        '\\n': '\\\\n',\n        '\\r': '\\\\r',\n        '\\t': '\\\\t',\n        ' ': ' '\n      }[p1] || '\\\\' + p1;\n    }\n\n    if (p2) {\n      // interpolation: {%=prop%}, or unescaped: {%#prop%}\n      if (p2 === '=') {\n        return \"'+_e(\" + p3 + \")+'\";\n      }\n\n      return \"'+(\" + p3 + \"==null?'':\" + p3 + \")+'\";\n    }\n\n    if (p4) {\n      // evaluation start tag: {%\n      return \"';\";\n    }\n\n    if (p5) {\n      // evaluation end tag: %}\n      return \"_s+='\";\n    }\n  };\n\n  tmpl.encReg = /[<>&\"'\\x00]/g; // eslint-disable-line no-control-regex\n\n  tmpl.encMap = {\n    '<': '&lt;',\n    '>': '&gt;',\n    '&': '&amp;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  tmpl.encode = function (s) {\n    return (s == null ? '' : '' + s).replace(tmpl.encReg, function (c) {\n      return tmpl.encMap[c] || '';\n    });\n  };\n\n  tmpl.arg = 'o';\n  tmpl.helper = \",print=function(s,e){_s+=e?(s==null?'':s):_e(s);}\" + ',include=function(s,d){_s+=tmpl(s,d);}';\n\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n      return tmpl;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this);\n\n//# sourceURL=webpack://rup/./node_modules/blueimp-file-upload/node_modules/blueimp-tmpl/js/tmpl.js?");

/***/ }),

/***/ "./node_modules/bootstrap/dist/js/bootstrap.js":
/*!*****************************************************!*\
  !*** ./node_modules/bootstrap/dist/js/bootstrap.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n  * Bootstrap v4.6.2 (https://getbootstrap.com/)\n  * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? factory(exports, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! popper.js */ \"./node_modules/popper.js/dist/esm/popper.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! popper.js */ \"./node_modules/popper.js/dist/esm/popper.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : (undefined);\n})(this, function (exports, $, Popper) {\n  'use strict';\n\n  function _interopDefaultLegacy(e) {\n    return e && _typeof(e) === 'object' && 'default' in e ? e : {\n      'default': e\n    };\n  }\n\n  var $__default = /*#__PURE__*/_interopDefaultLegacy($);\n\n  var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    Object.defineProperty(Constructor, \"prototype\", {\n      writable: false\n    });\n    return Constructor;\n  }\n\n  function _extends() {\n    _extends = Object.assign ? Object.assign.bind() : function (target) {\n      for (var i = 1; i < arguments.length; i++) {\n        var source = arguments[i];\n\n        for (var key in source) {\n          if (Object.prototype.hasOwnProperty.call(source, key)) {\n            target[key] = source[key];\n          }\n        }\n      }\n\n      return target;\n    };\n    return _extends.apply(this, arguments);\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n\n    _setPrototypeOf(subClass, superClass);\n  }\n\n  function _setPrototypeOf(o, p) {\n    _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n      o.__proto__ = p;\n      return o;\n    };\n    return _setPrototypeOf(o, p);\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.6.2): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * Private TransitionEnd Helpers\n   */\n\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    if (obj === null || typeof obj === 'undefined') {\n      return \"\" + obj;\n    }\n\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($__default[\"default\"](event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined;\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $__default[\"default\"](this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $__default[\"default\"].fn.emulateTransitionEnd = transitionEndEmulator;\n    $__default[\"default\"].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * Public Util API\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (_) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $__default[\"default\"](element).css('transition-duration');\n      var transitionDelay = $__default[\"default\"](element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $__default[\"default\"](element).trigger(TRANSITION_END);\n    },\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    },\n    jQueryDetection: function jQueryDetection() {\n      if (typeof $__default[\"default\"] === 'undefined') {\n        throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n      }\n\n      var version = $__default[\"default\"].fn.jquery.split(' ')[0].split('.');\n      var minMajor = 1;\n      var ltMajor = 2;\n      var minMinor = 9;\n      var minPatch = 1;\n      var maxMajor = 4;\n\n      if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n        throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n      }\n    }\n  };\n  Util.jQueryDetection();\n  setTransitionEndSupport();\n  /**\n   * Constants\n   */\n\n  var NAME$a = 'alert';\n  var VERSION$a = '4.6.2';\n  var DATA_KEY$a = 'bs.alert';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$a = $__default[\"default\"].fn[NAME$a];\n  var CLASS_NAME_ALERT = 'alert';\n  var CLASS_NAME_FADE$5 = 'fade';\n  var CLASS_NAME_SHOW$7 = 'show';\n  var EVENT_CLOSE = \"close\" + EVENT_KEY$a;\n  var EVENT_CLOSED = \"closed\" + EVENT_KEY$a;\n  var EVENT_CLICK_DATA_API$6 = \"click\" + EVENT_KEY$a + DATA_API_KEY$7;\n  var SELECTOR_DISMISS = '[data-dismiss=\"alert\"]';\n  /**\n   * Class definition\n   */\n\n  var Alert = /*#__PURE__*/function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype; // Public\n\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $__default[\"default\"].removeData(this._element, DATA_KEY$a);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $__default[\"default\"](element).closest(\".\" + CLASS_NAME_ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $__default[\"default\"].Event(EVENT_CLOSE);\n      $__default[\"default\"](element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $__default[\"default\"](element).removeClass(CLASS_NAME_SHOW$7);\n\n      if (!$__default[\"default\"](element).hasClass(CLASS_NAME_FADE$5)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $__default[\"default\"](element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $__default[\"default\"](element).detach().trigger(EVENT_CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $__default[\"default\"](this);\n        var data = $element.data(DATA_KEY$a);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$6, SELECTOR_DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$a] = Alert._jQueryInterface;\n  $__default[\"default\"].fn[NAME$a].Constructor = Alert;\n\n  $__default[\"default\"].fn[NAME$a].noConflict = function () {\n    $__default[\"default\"].fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Alert._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$9 = 'button';\n  var VERSION$9 = '4.6.2';\n  var DATA_KEY$9 = 'bs.button';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $__default[\"default\"].fn[NAME$9];\n  var CLASS_NAME_ACTIVE$3 = 'active';\n  var CLASS_NAME_BUTTON = 'btn';\n  var CLASS_NAME_FOCUS = 'focus';\n  var EVENT_CLICK_DATA_API$5 = \"click\" + EVENT_KEY$9 + DATA_API_KEY$6;\n  var EVENT_FOCUS_BLUR_DATA_API = \"focus\" + EVENT_KEY$9 + DATA_API_KEY$6 + \" \" + (\"blur\" + EVENT_KEY$9 + DATA_API_KEY$6);\n  var EVENT_LOAD_DATA_API$2 = \"load\" + EVENT_KEY$9 + DATA_API_KEY$6;\n  var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^=\"button\"]';\n  var SELECTOR_DATA_TOGGLES = '[data-toggle=\"buttons\"]';\n  var SELECTOR_DATA_TOGGLE$4 = '[data-toggle=\"button\"]';\n  var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle=\"buttons\"] .btn';\n  var SELECTOR_INPUT = 'input:not([type=\"hidden\"])';\n  var SELECTOR_ACTIVE$2 = '.active';\n  var SELECTOR_BUTTON = '.btn';\n  /**\n   * Class definition\n   */\n\n  var Button = /*#__PURE__*/function () {\n    function Button(element) {\n      this._element = element;\n      this.shouldAvoidTriggerChange = false;\n    } // Getters\n\n\n    var _proto = Button.prototype; // Public\n\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $__default[\"default\"](this._element).closest(SELECTOR_DATA_TOGGLES)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(SELECTOR_INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE$3)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(SELECTOR_ACTIVE$2);\n\n              if (activeElement) {\n                $__default[\"default\"](activeElement).removeClass(CLASS_NAME_ACTIVE$3);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input\n            if (input.type === 'checkbox' || input.type === 'radio') {\n              input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE$3);\n            }\n\n            if (!this.shouldAvoidTriggerChange) {\n              $__default[\"default\"](input).trigger('change');\n            }\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {\n        if (addAriaPressed) {\n          this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE$3));\n        }\n\n        if (triggerChangeEvent) {\n          $__default[\"default\"](this._element).toggleClass(CLASS_NAME_ACTIVE$3);\n        }\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $__default[\"default\"].removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) {\n      return this.each(function () {\n        var $element = $__default[\"default\"](this);\n        var data = $element.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Button(this);\n          $element.data(DATA_KEY$9, data);\n        }\n\n        data.shouldAvoidTriggerChange = avoidTriggerChange;\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE_CARROT, function (event) {\n    var button = event.target;\n    var initialButton = button;\n\n    if (!$__default[\"default\"](button).hasClass(CLASS_NAME_BUTTON)) {\n      button = $__default[\"default\"](button).closest(SELECTOR_BUTTON)[0];\n    }\n\n    if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {\n      event.preventDefault(); // work around Firefox bug #1540995\n    } else {\n      var inputBtn = button.querySelector(SELECTOR_INPUT);\n\n      if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {\n        event.preventDefault(); // work around Firefox bug #1540995\n\n        return;\n      }\n\n      if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {\n        Button._jQueryInterface.call($__default[\"default\"](button), 'toggle', initialButton.tagName === 'INPUT');\n      }\n    }\n  }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {\n    var button = $__default[\"default\"](event.target).closest(SELECTOR_BUTTON)[0];\n    $__default[\"default\"](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  $__default[\"default\"](window).on(EVENT_LOAD_DATA_API$2, function () {\n    // ensure correct active class is set to match the controls' actual values/states\n    // find all checkboxes/readio buttons inside data-toggle groups\n    var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS));\n\n    for (var i = 0, len = buttons.length; i < len; i++) {\n      var button = buttons[i];\n      var input = button.querySelector(SELECTOR_INPUT);\n\n      if (input.checked || input.hasAttribute('checked')) {\n        button.classList.add(CLASS_NAME_ACTIVE$3);\n      } else {\n        button.classList.remove(CLASS_NAME_ACTIVE$3);\n      }\n    } // find all button toggles\n\n\n    buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$4));\n\n    for (var _i = 0, _len = buttons.length; _i < _len; _i++) {\n      var _button = buttons[_i];\n\n      if (_button.getAttribute('aria-pressed') === 'true') {\n        _button.classList.add(CLASS_NAME_ACTIVE$3);\n      } else {\n        _button.classList.remove(CLASS_NAME_ACTIVE$3);\n      }\n    }\n  });\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$9] = Button._jQueryInterface;\n  $__default[\"default\"].fn[NAME$9].Constructor = Button;\n\n  $__default[\"default\"].fn[NAME$9].noConflict = function () {\n    $__default[\"default\"].fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Button._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$8 = 'carousel';\n  var VERSION$8 = '4.6.2';\n  var DATA_KEY$8 = 'bs.carousel';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $__default[\"default\"].fn[NAME$8];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var CLASS_NAME_CAROUSEL = 'carousel';\n  var CLASS_NAME_ACTIVE$2 = 'active';\n  var CLASS_NAME_SLIDE = 'slide';\n  var CLASS_NAME_RIGHT = 'carousel-item-right';\n  var CLASS_NAME_LEFT = 'carousel-item-left';\n  var CLASS_NAME_NEXT = 'carousel-item-next';\n  var CLASS_NAME_PREV = 'carousel-item-prev';\n  var CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  var DIRECTION_NEXT = 'next';\n  var DIRECTION_PREV = 'prev';\n  var DIRECTION_LEFT = 'left';\n  var DIRECTION_RIGHT = 'right';\n  var EVENT_SLIDE = \"slide\" + EVENT_KEY$8;\n  var EVENT_SLID = \"slid\" + EVENT_KEY$8;\n  var EVENT_KEYDOWN = \"keydown\" + EVENT_KEY$8;\n  var EVENT_MOUSEENTER = \"mouseenter\" + EVENT_KEY$8;\n  var EVENT_MOUSELEAVE = \"mouseleave\" + EVENT_KEY$8;\n  var EVENT_TOUCHSTART = \"touchstart\" + EVENT_KEY$8;\n  var EVENT_TOUCHMOVE = \"touchmove\" + EVENT_KEY$8;\n  var EVENT_TOUCHEND = \"touchend\" + EVENT_KEY$8;\n  var EVENT_POINTERDOWN = \"pointerdown\" + EVENT_KEY$8;\n  var EVENT_POINTERUP = \"pointerup\" + EVENT_KEY$8;\n  var EVENT_DRAG_START = \"dragstart\" + EVENT_KEY$8;\n  var EVENT_LOAD_DATA_API$1 = \"load\" + EVENT_KEY$8 + DATA_API_KEY$5;\n  var EVENT_CLICK_DATA_API$4 = \"click\" + EVENT_KEY$8 + DATA_API_KEY$5;\n  var SELECTOR_ACTIVE$1 = '.active';\n  var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';\n  var SELECTOR_ITEM = '.carousel-item';\n  var SELECTOR_ITEM_IMG = '.carousel-item img';\n  var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';\n  var SELECTOR_INDICATORS = '.carousel-indicators';\n  var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]';\n  var SELECTOR_DATA_RIDE = '[data-ride=\"carousel\"]';\n  var Default$7 = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType$7 = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n  };\n  /**\n   * Class definition\n   */\n\n  var Carousel = /*#__PURE__*/function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype; // Public\n\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(DIRECTION_NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      var $element = $__default[\"default\"](this._element); // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n\n      if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(DIRECTION_PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(SELECTOR_NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._updateInterval();\n\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $__default[\"default\"](this._element).one(EVENT_SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $__default[\"default\"](this._element).off(EVENT_KEY$8);\n      $__default[\"default\"].removeData(this._element, DATA_KEY$8);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default$7, config);\n      Util.typeCheckConfig(NAME$8, config, DefaultType$7);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX;\n      this.touchDeltaX = 0; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $__default[\"default\"](this._element).on(EVENT_KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $__default[\"default\"](this._element).on(EVENT_MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(EVENT_MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        _this3.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ? 0 : event.originalEvent.touches[0].clientX - _this3.touchStartX;\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $__default[\"default\"](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $__default[\"default\"](this._element).on(EVENT_POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $__default[\"default\"](this._element).on(EVENT_POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        $__default[\"default\"](this._element).on(EVENT_TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $__default[\"default\"](this._element).on(EVENT_TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $__default[\"default\"](this._element).on(EVENT_TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === DIRECTION_NEXT;\n      var isPrevDirection = direction === DIRECTION_PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === DIRECTION_PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM));\n\n      var slideEvent = $__default[\"default\"].Event(EVENT_SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $__default[\"default\"](this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1));\n        $__default[\"default\"](indicators).removeClass(CLASS_NAME_ACTIVE$2);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $__default[\"default\"](nextIndicator).addClass(CLASS_NAME_ACTIVE$2);\n        }\n      }\n    };\n\n    _proto._updateInterval = function _updateInterval() {\n      var element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM);\n\n      if (!element) {\n        return;\n      }\n\n      var elementInterval = parseInt(element.getAttribute('data-interval'), 10);\n\n      if (elementInterval) {\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n        this._config.interval = elementInterval;\n      } else {\n        this._config.interval = this._config.defaultInterval || this._config.interval;\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === DIRECTION_NEXT) {\n        directionalClassName = CLASS_NAME_LEFT;\n        orderClassName = CLASS_NAME_NEXT;\n        eventDirectionName = DIRECTION_LEFT;\n      } else {\n        directionalClassName = CLASS_NAME_RIGHT;\n        orderClassName = CLASS_NAME_PREV;\n        eventDirectionName = DIRECTION_RIGHT;\n      }\n\n      if (nextElement && $__default[\"default\"](nextElement).hasClass(CLASS_NAME_ACTIVE$2)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      this._activeElement = nextElement;\n      var slidEvent = $__default[\"default\"].Event(EVENT_SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_SLIDE)) {\n        $__default[\"default\"](nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $__default[\"default\"](activeElement).addClass(directionalClassName);\n        $__default[\"default\"](nextElement).addClass(directionalClassName);\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $__default[\"default\"](activeElement).one(Util.TRANSITION_END, function () {\n          $__default[\"default\"](nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(CLASS_NAME_ACTIVE$2);\n          $__default[\"default\"](activeElement).removeClass(CLASS_NAME_ACTIVE$2 + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $__default[\"default\"](_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $__default[\"default\"](activeElement).removeClass(CLASS_NAME_ACTIVE$2);\n        $__default[\"default\"](nextElement).addClass(CLASS_NAME_ACTIVE$2);\n        this._isSliding = false;\n        $__default[\"default\"](this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default[\"default\"](this).data(DATA_KEY$8);\n\n        var _config = _extends({}, Default$7, $__default[\"default\"](this).data());\n\n        if (_typeof(config) === 'object') {\n          _config = _extends({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $__default[\"default\"](this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $__default[\"default\"](selector)[0];\n\n      if (!target || !$__default[\"default\"](target).hasClass(CLASS_NAME_CAROUSEL)) {\n        return;\n      }\n\n      var config = _extends({}, $__default[\"default\"](target).data(), $__default[\"default\"](this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($__default[\"default\"](target), config);\n\n      if (slideIndex) {\n        $__default[\"default\"](target).data(DATA_KEY$8).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler);\n  $__default[\"default\"](window).on(EVENT_LOAD_DATA_API$1, function () {\n    var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $__default[\"default\"](carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$8] = Carousel._jQueryInterface;\n  $__default[\"default\"].fn[NAME$8].Constructor = Carousel;\n\n  $__default[\"default\"].fn[NAME$8].noConflict = function () {\n    $__default[\"default\"].fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return Carousel._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$7 = 'collapse';\n  var VERSION$7 = '4.6.2';\n  var DATA_KEY$7 = 'bs.collapse';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$7 = $__default[\"default\"].fn[NAME$7];\n  var CLASS_NAME_SHOW$6 = 'show';\n  var CLASS_NAME_COLLAPSE = 'collapse';\n  var CLASS_NAME_COLLAPSING = 'collapsing';\n  var CLASS_NAME_COLLAPSED = 'collapsed';\n  var DIMENSION_WIDTH = 'width';\n  var DIMENSION_HEIGHT = 'height';\n  var EVENT_SHOW$4 = \"show\" + EVENT_KEY$7;\n  var EVENT_SHOWN$4 = \"shown\" + EVENT_KEY$7;\n  var EVENT_HIDE$4 = \"hide\" + EVENT_KEY$7;\n  var EVENT_HIDDEN$4 = \"hidden\" + EVENT_KEY$7;\n  var EVENT_CLICK_DATA_API$3 = \"click\" + EVENT_KEY$7 + DATA_API_KEY$4;\n  var SELECTOR_ACTIVES = '.show, .collapsing';\n  var SELECTOR_DATA_TOGGLE$3 = '[data-toggle=\"collapse\"]';\n  var Default$6 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$6 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  /**\n   * Class definition\n   */\n\n  var Collapse = /*#__PURE__*/function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$3));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype; // Public\n\n    _proto.toggle = function toggle() {\n      if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_SHOW$6)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $__default[\"default\"](this._element).hasClass(CLASS_NAME_SHOW$6)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(CLASS_NAME_COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $__default[\"default\"](actives).not(this._selector).data(DATA_KEY$7);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $__default[\"default\"].Event(EVENT_SHOW$4);\n      $__default[\"default\"](this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($__default[\"default\"](actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $__default[\"default\"](actives).data(DATA_KEY$7, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $__default[\"default\"](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $__default[\"default\"](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $__default[\"default\"](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + \" \" + CLASS_NAME_SHOW$6);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $__default[\"default\"](_this._element).trigger(EVENT_SHOWN$4);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$__default[\"default\"](this._element).hasClass(CLASS_NAME_SHOW$6)) {\n        return;\n      }\n\n      var startEvent = $__default[\"default\"].Event(EVENT_HIDE$4);\n      $__default[\"default\"](this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $__default[\"default\"](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + \" \" + CLASS_NAME_SHOW$6);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $__default[\"default\"]([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(CLASS_NAME_SHOW$6)) {\n              $__default[\"default\"](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $__default[\"default\"](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN$4);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $__default[\"default\"].removeData(this._element, DATA_KEY$7);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default$6, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$7, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $__default[\"default\"](this._element).hasClass(DIMENSION_WIDTH);\n      return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $__default[\"default\"](children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $__default[\"default\"](element).hasClass(CLASS_NAME_SHOW$6);\n\n      if (triggerArray.length) {\n        $__default[\"default\"](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $__default[\"default\"](this);\n        var data = $element.data(DATA_KEY$7);\n\n        var _config = _extends({}, Default$6, $element.data(), _typeof(config) === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $element.data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $__default[\"default\"](this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $__default[\"default\"](selectors).each(function () {\n      var $target = $__default[\"default\"](this);\n      var data = $target.data(DATA_KEY$7);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$7] = Collapse._jQueryInterface;\n  $__default[\"default\"].fn[NAME$7].Constructor = Collapse;\n\n  $__default[\"default\"].fn[NAME$7].noConflict = function () {\n    $__default[\"default\"].fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Collapse._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$6 = 'dropdown';\n  var VERSION$6 = '4.6.2';\n  var DATA_KEY$6 = 'bs.dropdown';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$6 = $__default[\"default\"].fn[NAME$6];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE$1);\n  var CLASS_NAME_DISABLED$1 = 'disabled';\n  var CLASS_NAME_SHOW$5 = 'show';\n  var CLASS_NAME_DROPUP = 'dropup';\n  var CLASS_NAME_DROPRIGHT = 'dropright';\n  var CLASS_NAME_DROPLEFT = 'dropleft';\n  var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';\n  var CLASS_NAME_POSITION_STATIC = 'position-static';\n  var EVENT_HIDE$3 = \"hide\" + EVENT_KEY$6;\n  var EVENT_HIDDEN$3 = \"hidden\" + EVENT_KEY$6;\n  var EVENT_SHOW$3 = \"show\" + EVENT_KEY$6;\n  var EVENT_SHOWN$3 = \"shown\" + EVENT_KEY$6;\n  var EVENT_CLICK = \"click\" + EVENT_KEY$6;\n  var EVENT_CLICK_DATA_API$2 = \"click\" + EVENT_KEY$6 + DATA_API_KEY$3;\n  var EVENT_KEYDOWN_DATA_API = \"keydown\" + EVENT_KEY$6 + DATA_API_KEY$3;\n  var EVENT_KEYUP_DATA_API = \"keyup\" + EVENT_KEY$6 + DATA_API_KEY$3;\n  var SELECTOR_DATA_TOGGLE$2 = '[data-toggle=\"dropdown\"]';\n  var SELECTOR_FORM_CHILD = '.dropdown form';\n  var SELECTOR_MENU = '.dropdown-menu';\n  var SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  var PLACEMENT_TOP = 'top-start';\n  var PLACEMENT_TOPEND = 'top-end';\n  var PLACEMENT_BOTTOM = 'bottom-start';\n  var PLACEMENT_BOTTOMEND = 'bottom-end';\n  var PLACEMENT_RIGHT = 'right-start';\n  var PLACEMENT_LEFT = 'left-start';\n  var Default$5 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic',\n    popperConfig: null\n  };\n  var DefaultType$5 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string',\n    popperConfig: '(null|object)'\n  };\n  /**\n   * Class definition\n   */\n\n  var Dropdown = /*#__PURE__*/function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype; // Public\n\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED$1)) {\n        return;\n      }\n\n      var isActive = $__default[\"default\"](this._menu).hasClass(CLASS_NAME_SHOW$5);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      this.show(true);\n    };\n\n    _proto.show = function show(usePopper) {\n      if (usePopper === void 0) {\n        usePopper = false;\n      }\n\n      if (this._element.disabled || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED$1) || $__default[\"default\"](this._menu).hasClass(CLASS_NAME_SHOW$5)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $__default[\"default\"].Event(EVENT_SHOW$3, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $__default[\"default\"](parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Totally disable Popper for Dropdowns in Navbar\n\n\n      if (!this._inNavbar && usePopper) {\n        // Check for Popper dependency\n        if (typeof Popper__default[\"default\"] === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $__default[\"default\"](parent).addClass(CLASS_NAME_POSITION_STATIC);\n        }\n\n        this._popper = new Popper__default[\"default\"](referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $__default[\"default\"](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {\n        $__default[\"default\"](document.body).children().on('mouseover', null, $__default[\"default\"].noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $__default[\"default\"](this._menu).toggleClass(CLASS_NAME_SHOW$5);\n      $__default[\"default\"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default[\"default\"].Event(EVENT_SHOWN$3, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED$1) || !$__default[\"default\"](this._menu).hasClass(CLASS_NAME_SHOW$5)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$3, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $__default[\"default\"](parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      $__default[\"default\"](this._menu).toggleClass(CLASS_NAME_SHOW$5);\n      $__default[\"default\"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default[\"default\"].Event(EVENT_HIDDEN$3, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $__default[\"default\"].removeData(this._element, DATA_KEY$6);\n      $__default[\"default\"](this._element).off(EVENT_KEY$6);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $__default[\"default\"](this._element).on(EVENT_CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, this.constructor.Default, $__default[\"default\"](this._element).data(), config);\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(SELECTOR_MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $__default[\"default\"](this._element.parentNode);\n      var placement = PLACEMENT_BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {\n        placement = $__default[\"default\"](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {\n        placement = PLACEMENT_RIGHT;\n      } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {\n        placement = PLACEMENT_LEFT;\n      } else if ($__default[\"default\"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {\n        placement = PLACEMENT_BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $__default[\"default\"](this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element));\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        }\n      }; // Disable Popper if we have a static display\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return _extends({}, popperConfig, this._config.popperConfig);\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default[\"default\"](this).data(DATA_KEY$6);\n\n        var _config = _typeof(config) === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $__default[\"default\"](this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $__default[\"default\"](toggles[i]).data(DATA_KEY$6);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$__default[\"default\"](parent).hasClass(CLASS_NAME_SHOW$5)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default[\"default\"].contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$3, relatedTarget);\n        $__default[\"default\"](parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $__default[\"default\"](document.body).children().off('mouseover', null, $__default[\"default\"].noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n\n        if (context._popper) {\n          context._popper.destroy();\n        }\n\n        $__default[\"default\"](dropdownMenu).removeClass(CLASS_NAME_SHOW$5);\n        $__default[\"default\"](parent).removeClass(CLASS_NAME_SHOW$5).trigger($__default[\"default\"].Event(EVENT_HIDDEN$3, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE$1 && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default[\"default\"](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      if (this.disabled || $__default[\"default\"](this).hasClass(CLASS_NAME_DISABLED$1)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $__default[\"default\"](parent).hasClass(CLASS_NAME_SHOW$5);\n\n      if (!isActive && event.which === ESCAPE_KEYCODE$1) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (!isActive || event.which === ESCAPE_KEYCODE$1 || event.which === SPACE_KEYCODE) {\n        if (event.which === ESCAPE_KEYCODE$1) {\n          $__default[\"default\"](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus');\n        }\n\n        $__default[\"default\"](this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {\n        return $__default[\"default\"](item).is(':visible');\n      });\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$2 + \" \" + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($__default[\"default\"](this), 'toggle');\n  }).on(EVENT_CLICK_DATA_API$2, SELECTOR_FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$6] = Dropdown._jQueryInterface;\n  $__default[\"default\"].fn[NAME$6].Constructor = Dropdown;\n\n  $__default[\"default\"].fn[NAME$6].noConflict = function () {\n    $__default[\"default\"].fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Dropdown._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.6.2';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $__default[\"default\"].fn[NAME$5];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable';\n  var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure';\n  var CLASS_NAME_BACKDROP = 'modal-backdrop';\n  var CLASS_NAME_OPEN = 'modal-open';\n  var CLASS_NAME_FADE$4 = 'fade';\n  var CLASS_NAME_SHOW$4 = 'show';\n  var CLASS_NAME_STATIC = 'modal-static';\n  var EVENT_HIDE$2 = \"hide\" + EVENT_KEY$5;\n  var EVENT_HIDE_PREVENTED = \"hidePrevented\" + EVENT_KEY$5;\n  var EVENT_HIDDEN$2 = \"hidden\" + EVENT_KEY$5;\n  var EVENT_SHOW$2 = \"show\" + EVENT_KEY$5;\n  var EVENT_SHOWN$2 = \"shown\" + EVENT_KEY$5;\n  var EVENT_FOCUSIN = \"focusin\" + EVENT_KEY$5;\n  var EVENT_RESIZE = \"resize\" + EVENT_KEY$5;\n  var EVENT_CLICK_DISMISS$1 = \"click.dismiss\" + EVENT_KEY$5;\n  var EVENT_KEYDOWN_DISMISS = \"keydown.dismiss\" + EVENT_KEY$5;\n  var EVENT_MOUSEUP_DISMISS = \"mouseup.dismiss\" + EVENT_KEY$5;\n  var EVENT_MOUSEDOWN_DISMISS = \"mousedown.dismiss\" + EVENT_KEY$5;\n  var EVENT_CLICK_DATA_API$1 = \"click\" + EVENT_KEY$5 + DATA_API_KEY$2;\n  var SELECTOR_DIALOG = '.modal-dialog';\n  var SELECTOR_MODAL_BODY = '.modal-body';\n  var SELECTOR_DATA_TOGGLE$1 = '[data-toggle=\"modal\"]';\n  var SELECTOR_DATA_DISMISS$1 = '[data-dismiss=\"modal\"]';\n  var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  var SELECTOR_STICKY_CONTENT = '.sticky-top';\n  var Default$4 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$4 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  /**\n   * Class definition\n   */\n\n  var Modal = /*#__PURE__*/function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(SELECTOR_DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype; // Public\n\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var showEvent = $__default[\"default\"].Event(EVENT_SHOW$2, {\n        relatedTarget: relatedTarget\n      });\n      $__default[\"default\"](this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4)) {\n        this._isTransitioning = true;\n      }\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $__default[\"default\"](this._element).on(EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, function (event) {\n        return _this.hide(event);\n      });\n      $__default[\"default\"](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () {\n        $__default[\"default\"](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) {\n          if ($__default[\"default\"](event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$2);\n      $__default[\"default\"](this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $__default[\"default\"](document).off(EVENT_FOCUSIN);\n      $__default[\"default\"](this._element).removeClass(CLASS_NAME_SHOW$4);\n      $__default[\"default\"](this._element).off(EVENT_CLICK_DISMISS$1);\n      $__default[\"default\"](this._dialog).off(EVENT_MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $__default[\"default\"](this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $__default[\"default\"](htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `EVENT_CLICK_DATA_API` event that should remain\n       */\n\n      $__default[\"default\"](document).off(EVENT_FOCUSIN);\n      $__default[\"default\"].removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default$4, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$4);\n      return config;\n    };\n\n    _proto._triggerBackdropTransition = function _triggerBackdropTransition() {\n      var _this3 = this;\n\n      var hideEventPrevented = $__default[\"default\"].Event(EVENT_HIDE_PREVENTED);\n      $__default[\"default\"](this._element).trigger(hideEventPrevented);\n\n      if (hideEventPrevented.isDefaultPrevented()) {\n        return;\n      }\n\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!isModalOverflowing) {\n        this._element.style.overflowY = 'hidden';\n      }\n\n      this._element.classList.add(CLASS_NAME_STATIC);\n\n      var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n      $__default[\"default\"](this._element).off(Util.TRANSITION_END);\n      $__default[\"default\"](this._element).one(Util.TRANSITION_END, function () {\n        _this3._element.classList.remove(CLASS_NAME_STATIC);\n\n        if (!isModalOverflowing) {\n          $__default[\"default\"](_this3._element).one(Util.TRANSITION_END, function () {\n            _this3._element.style.overflowY = '';\n          }).emulateTransitionEnd(_this3._element, modalTransitionDuration);\n        }\n      }).emulateTransitionEnd(modalTransitionDuration);\n\n      this._element.focus();\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this4 = this;\n\n      var transition = $__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4);\n      var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null;\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      if ($__default[\"default\"](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {\n        modalBody.scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $__default[\"default\"](this._element).addClass(CLASS_NAME_SHOW$4);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $__default[\"default\"].Event(EVENT_SHOWN$2, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this4._config.focus) {\n          _this4._element.focus();\n        }\n\n        _this4._isTransitioning = false;\n        $__default[\"default\"](_this4._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $__default[\"default\"](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this5 = this;\n\n      $__default[\"default\"](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop\n      .on(EVENT_FOCUSIN, function (event) {\n        if (document !== event.target && _this5._element !== event.target && $__default[\"default\"](_this5._element).has(event.target).length === 0) {\n          _this5._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $__default[\"default\"](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) {\n          if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {\n            event.preventDefault();\n\n            _this6.hide();\n          } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {\n            _this6._triggerBackdropTransition();\n          }\n        });\n      } else if (!this._isShown) {\n        $__default[\"default\"](this._element).off(EVENT_KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this7 = this;\n\n      if (this._isShown) {\n        $__default[\"default\"](window).on(EVENT_RESIZE, function (event) {\n          return _this7.handleUpdate(event);\n        });\n      } else {\n        $__default[\"default\"](window).off(EVENT_RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this8 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._element.removeAttribute('role');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $__default[\"default\"](document.body).removeClass(CLASS_NAME_OPEN);\n\n        _this8._resetAdjustments();\n\n        _this8._resetScrollbar();\n\n        $__default[\"default\"](_this8._element).trigger(EVENT_HIDDEN$2);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $__default[\"default\"](this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this9 = this;\n\n      var animate = $__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4) ? CLASS_NAME_FADE$4 : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = CLASS_NAME_BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $__default[\"default\"](this._backdrop).appendTo(document.body);\n        $__default[\"default\"](this._element).on(EVENT_CLICK_DISMISS$1, function (event) {\n          if (_this9._ignoreBackdropClick) {\n            _this9._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this9._config.backdrop === 'static') {\n            _this9._triggerBackdropTransition();\n          } else {\n            _this9.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $__default[\"default\"](this._backdrop).addClass(CLASS_NAME_SHOW$4);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $__default[\"default\"](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $__default[\"default\"](this._backdrop).removeClass(CLASS_NAME_SHOW$4);\n\n        var callbackRemove = function callbackRemove() {\n          _this9._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $__default[\"default\"](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this10 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding\n\n        $__default[\"default\"](fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $__default[\"default\"](element).css('padding-right');\n          $__default[\"default\"](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $__default[\"default\"](stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $__default[\"default\"](element).css('margin-right');\n          $__default[\"default\"](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $__default[\"default\"](document.body).css('padding-right');\n        $__default[\"default\"](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $__default[\"default\"](document.body).addClass(CLASS_NAME_OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));\n      $__default[\"default\"](fixedContent).each(function (index, element) {\n        var padding = $__default[\"default\"](element).data('padding-right');\n        $__default[\"default\"](element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + SELECTOR_STICKY_CONTENT));\n      $__default[\"default\"](elements).each(function (index, element) {\n        var margin = $__default[\"default\"](element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $__default[\"default\"](element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $__default[\"default\"](document.body).data('padding-right');\n      $__default[\"default\"](document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $__default[\"default\"](this).data(DATA_KEY$5);\n\n        var _config = _extends({}, Default$4, $__default[\"default\"](this).data(), _typeof(config) === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $__default[\"default\"](this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n    var _this11 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $__default[\"default\"](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default[\"default\"](target).data(), $__default[\"default\"](this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $__default[\"default\"](target).one(EVENT_SHOW$2, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(EVENT_HIDDEN$2, function () {\n        if ($__default[\"default\"](_this11).is(':visible')) {\n          _this11.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($__default[\"default\"](target), config, this);\n  });\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$5] = Modal._jQueryInterface;\n  $__default[\"default\"].fn[NAME$5].Constructor = Modal;\n\n  $__default[\"default\"].fn[NAME$5].noConflict = function () {\n    $__default[\"default\"].fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.6.2): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  /**\n   * A pattern that recognizes a commonly useful subset of URLs that are safe.\n   *\n   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, len = regExp.length; i < len; i++) {\n      if (regExp[i].test(attrName)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes); // eslint-disable-next-line unicorn/prefer-spread\n\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n  /**\n   * Constants\n   */\n\n\n  var NAME$4 = 'tooltip';\n  var VERSION$4 = '4.6.2';\n  var DATA_KEY$4 = 'bs.tooltip';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var JQUERY_NO_CONFLICT$4 = $__default[\"default\"].fn[NAME$4];\n  var CLASS_PREFIX$1 = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var CLASS_NAME_FADE$3 = 'fade';\n  var CLASS_NAME_SHOW$3 = 'show';\n  var HOVER_STATE_SHOW = 'show';\n  var HOVER_STATE_OUT = 'out';\n  var SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  var SELECTOR_ARROW = '.arrow';\n  var TRIGGER_HOVER = 'hover';\n  var TRIGGER_FOCUS = 'focus';\n  var TRIGGER_CLICK = 'click';\n  var TRIGGER_MANUAL = 'manual';\n  var AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$3 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    customClass: '',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist,\n    popperConfig: null\n  };\n  var DefaultType$3 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    customClass: '(string|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object',\n    popperConfig: '(null|object)'\n  };\n  var Event$1 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    INSERTED: \"inserted\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    FOCUSIN: \"focusin\" + EVENT_KEY$4,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$4,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$4,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$4\n  };\n  /**\n   * Class definition\n   */\n\n  var Tooltip = /*#__PURE__*/function () {\n    function Tooltip(element, config) {\n      if (typeof Popper__default[\"default\"] === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n      } // Private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype; // Public\n\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $__default[\"default\"](event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $__default[\"default\"](event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($__default[\"default\"](this.getTipElement()).hasClass(CLASS_NAME_SHOW$3)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $__default[\"default\"].removeData(this.element, this.constructor.DATA_KEY);\n      $__default[\"default\"](this.element).off(this.constructor.EVENT_KEY);\n      $__default[\"default\"](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);\n\n      if (this.tip) {\n        $__default[\"default\"](this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($__default[\"default\"](this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $__default[\"default\"].Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $__default[\"default\"](this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $__default[\"default\"].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $__default[\"default\"](tip).addClass(CLASS_NAME_FADE$3);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $__default[\"default\"](tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$__default[\"default\"].contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $__default[\"default\"](tip).appendTo(container);\n        }\n\n        $__default[\"default\"](this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper__default[\"default\"](this.element, tip, this._getPopperConfig(attachment));\n        $__default[\"default\"](tip).addClass(CLASS_NAME_SHOW$3);\n        $__default[\"default\"](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $__default[\"default\"](document.body).children().on('mouseover', null, $__default[\"default\"].noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $__default[\"default\"](_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HOVER_STATE_OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($__default[\"default\"](this.tip).hasClass(CLASS_NAME_FADE$3)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $__default[\"default\"](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $__default[\"default\"].Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $__default[\"default\"](_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $__default[\"default\"](this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $__default[\"default\"](tip).removeClass(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $__default[\"default\"](document.body).children().off('mouseover', null, $__default[\"default\"].noop);\n      }\n\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n\n      if ($__default[\"default\"](this.tip).hasClass(CLASS_NAME_FADE$3)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $__default[\"default\"](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $__default[\"default\"](this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $__default[\"default\"](this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($__default[\"default\"](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle());\n      $__default[\"default\"](tip).removeClass(CLASS_NAME_FADE$3 + \" \" + CLASS_NAME_SHOW$3);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (_typeof(content) === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$__default[\"default\"](content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($__default[\"default\"](content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getPopperConfig = function _getPopperConfig(attachment) {\n      var _this3 = this;\n\n      var defaultBsConfig = {\n        placement: attachment,\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            behavior: this.config.fallbackPlacement\n          },\n          arrow: {\n            element: SELECTOR_ARROW\n          },\n          preventOverflow: {\n            boundariesElement: this.config.boundary\n          }\n        },\n        onCreate: function onCreate(data) {\n          if (data.originalPlacement !== data.placement) {\n            _this3._handlePopperPlacementChange(data);\n          }\n        },\n        onUpdate: function onUpdate(data) {\n          return _this3._handlePopperPlacementChange(data);\n        }\n      };\n      return _extends({}, defaultBsConfig, this.config.popperConfig);\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this4 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element));\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $__default[\"default\"](this.config.container);\n      }\n\n      return $__default[\"default\"](document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this5 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $__default[\"default\"](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {\n            return _this5.toggle(event);\n          });\n        } else if (trigger !== TRIGGER_MANUAL) {\n          var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;\n          var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;\n          $__default[\"default\"](_this5.element).on(eventIn, _this5.config.selector, function (event) {\n            return _this5._enter(event);\n          }).on(eventOut, _this5.config.selector, function (event) {\n            return _this5._leave(event);\n          });\n        }\n      });\n\n      this._hideModalHandler = function () {\n        if (_this5.element) {\n          _this5.hide();\n        }\n      };\n\n      $__default[\"default\"](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);\n\n      if (this.config.selector) {\n        this.config = _extends({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = _typeof(this.element.getAttribute('data-original-title'));\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $__default[\"default\"](event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $__default[\"default\"](event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n      }\n\n      if ($__default[\"default\"](context.getTipElement()).hasClass(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) {\n        context._hoverState = HOVER_STATE_SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HOVER_STATE_SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $__default[\"default\"](event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $__default[\"default\"](event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HOVER_STATE_OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $__default[\"default\"](this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _extends({}, this.constructor.Default, dataAttributes, _typeof(config) === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $__default[\"default\"](this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      this.tip = popperData.instance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $__default[\"default\"](tip).removeClass(CLASS_NAME_FADE$3);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $__default[\"default\"](this);\n        var data = $element.data(DATA_KEY$4);\n\n        var _config = _typeof(config) === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $element.data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$4;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$4;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$1;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$4;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$3;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * jQuery\n   */\n\n\n  $__default[\"default\"].fn[NAME$4] = Tooltip._jQueryInterface;\n  $__default[\"default\"].fn[NAME$4].Constructor = Tooltip;\n\n  $__default[\"default\"].fn[NAME$4].noConflict = function () {\n    $__default[\"default\"].fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Tooltip._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$3 = 'popover';\n  var VERSION$3 = '4.6.2';\n  var DATA_KEY$3 = 'bs.popover';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var JQUERY_NO_CONFLICT$3 = $__default[\"default\"].fn[NAME$3];\n  var CLASS_PREFIX = 'bs-popover';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var CLASS_NAME_FADE$2 = 'fade';\n  var CLASS_NAME_SHOW$2 = 'show';\n  var SELECTOR_TITLE = '.popover-header';\n  var SELECTOR_CONTENT = '.popover-body';\n\n  var Default$2 = _extends({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$2 = _extends({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    INSERTED: \"inserted\" + EVENT_KEY$3,\n    CLICK: \"click\" + EVENT_KEY$3,\n    FOCUSIN: \"focusin\" + EVENT_KEY$3,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$3,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$3,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$3\n  };\n  /**\n   * Class definition\n   */\n\n  var Popover = /*#__PURE__*/function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype; // Overrides\n\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $__default[\"default\"](this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $__default[\"default\"](this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $__default[\"default\"](this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(SELECTOR_CONTENT), content);\n      $tip.removeClass(CLASS_NAME_FADE$2 + \" \" + CLASS_NAME_SHOW$2);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $__default[\"default\"](this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default[\"default\"](this).data(DATA_KEY$3);\n\n        var _config = _typeof(config) === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $__default[\"default\"](this).data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      get: // Getters\n      function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$3;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$3;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$3;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * jQuery\n   */\n\n\n  $__default[\"default\"].fn[NAME$3] = Popover._jQueryInterface;\n  $__default[\"default\"].fn[NAME$3].Constructor = Popover;\n\n  $__default[\"default\"].fn[NAME$3].noConflict = function () {\n    $__default[\"default\"].fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Popover._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$2 = 'scrollspy';\n  var VERSION$2 = '4.6.2';\n  var DATA_KEY$2 = 'bs.scrollspy';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $__default[\"default\"].fn[NAME$2];\n  var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  var CLASS_NAME_ACTIVE$1 = 'active';\n  var EVENT_ACTIVATE = \"activate\" + EVENT_KEY$2;\n  var EVENT_SCROLL = \"scroll\" + EVENT_KEY$2;\n  var EVENT_LOAD_DATA_API = \"load\" + EVENT_KEY$2 + DATA_API_KEY$1;\n  var METHOD_OFFSET = 'offset';\n  var METHOD_POSITION = 'position';\n  var SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]';\n  var SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\n  var SELECTOR_NAV_LINKS = '.nav-link';\n  var SELECTOR_NAV_ITEMS = '.nav-item';\n  var SELECTOR_LIST_ITEMS = '.list-group-item';\n  var SELECTOR_DROPDOWN$1 = '.dropdown';\n  var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item';\n  var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n  var Default$1 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$1 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  /**\n   * Class definition\n   */\n\n  var ScrollSpy = /*#__PURE__*/function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + SELECTOR_NAV_LINKS + \",\" + (this._config.target + \" \" + SELECTOR_LIST_ITEMS + \",\") + (this._config.target + \" \" + SELECTOR_DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $__default[\"default\"](this._scrollElement).on(EVENT_SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype; // Public\n\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$__default[\"default\"](target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(Boolean).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $__default[\"default\"].removeData(this._element, DATA_KEY$2);\n      $__default[\"default\"](this._scrollElement).off(EVENT_KEY$2);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default$1, _typeof(config) === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string' && Util.isElement(config.target)) {\n        var id = $__default[\"default\"](config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$2);\n          $__default[\"default\"](config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$2, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      for (var i = this._offsets.length; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $__default[\"default\"]([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {\n        $link.closest(SELECTOR_DROPDOWN$1).find(SELECTOR_DROPDOWN_TOGGLE$1).addClass(CLASS_NAME_ACTIVE$1);\n        $link.addClass(CLASS_NAME_ACTIVE$1);\n      } else {\n        // Set triggered link as active\n        $link.addClass(CLASS_NAME_ACTIVE$1); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_LINKS + \", \" + SELECTOR_LIST_ITEMS).addClass(CLASS_NAME_ACTIVE$1); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE$1);\n      }\n\n      $__default[\"default\"](this._scrollElement).trigger(EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(CLASS_NAME_ACTIVE$1);\n      }).forEach(function (node) {\n        return node.classList.remove(CLASS_NAME_ACTIVE$1);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default[\"default\"](this).data(DATA_KEY$2);\n\n        var _config = _typeof(config) === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $__default[\"default\"](this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](window).on(EVENT_LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $__default[\"default\"](scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$2] = ScrollSpy._jQueryInterface;\n  $__default[\"default\"].fn[NAME$2].Constructor = ScrollSpy;\n\n  $__default[\"default\"].fn[NAME$2].noConflict = function () {\n    $__default[\"default\"].fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return ScrollSpy._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME$1 = 'tab';\n  var VERSION$1 = '4.6.2';\n  var DATA_KEY$1 = 'bs.tab';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $__default[\"default\"].fn[NAME$1];\n  var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\n  var CLASS_NAME_ACTIVE = 'active';\n  var CLASS_NAME_DISABLED = 'disabled';\n  var CLASS_NAME_FADE$1 = 'fade';\n  var CLASS_NAME_SHOW$1 = 'show';\n  var EVENT_HIDE$1 = \"hide\" + EVENT_KEY$1;\n  var EVENT_HIDDEN$1 = \"hidden\" + EVENT_KEY$1;\n  var EVENT_SHOW$1 = \"show\" + EVENT_KEY$1;\n  var EVENT_SHOWN$1 = \"shown\" + EVENT_KEY$1;\n  var EVENT_CLICK_DATA_API = \"click\" + EVENT_KEY$1 + DATA_API_KEY;\n  var SELECTOR_DROPDOWN = '.dropdown';\n  var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  var SELECTOR_ACTIVE = '.active';\n  var SELECTOR_ACTIVE_UL = '> li > .active';\n  var SELECTOR_DATA_TOGGLE = '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]';\n  var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active';\n  /**\n   * Class definition\n   */\n\n  var Tab = /*#__PURE__*/function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype; // Public\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default[\"default\"](this._element).hasClass(CLASS_NAME_ACTIVE) || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED) || this._element.hasAttribute('disabled')) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $__default[\"default\"](this._element).closest(SELECTOR_NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;\n        previous = $__default[\"default\"].makeArray($__default[\"default\"](listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$1, {\n        relatedTarget: this._element\n      });\n      var showEvent = $__default[\"default\"].Event(EVENT_SHOW$1, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $__default[\"default\"](previous).trigger(hideEvent);\n      }\n\n      $__default[\"default\"](this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $__default[\"default\"].Event(EVENT_HIDDEN$1, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $__default[\"default\"].Event(EVENT_SHOWN$1, {\n          relatedTarget: previous\n        });\n        $__default[\"default\"](previous).trigger(hiddenEvent);\n        $__default[\"default\"](_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $__default[\"default\"].removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default[\"default\"](container).find(SELECTOR_ACTIVE_UL) : $__default[\"default\"](container).children(SELECTOR_ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $__default[\"default\"](active).hasClass(CLASS_NAME_FADE$1);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $__default[\"default\"](active).removeClass(CLASS_NAME_SHOW$1).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $__default[\"default\"](active).removeClass(CLASS_NAME_ACTIVE);\n        var dropdownChild = $__default[\"default\"](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $__default[\"default\"](dropdownChild).removeClass(CLASS_NAME_ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $__default[\"default\"](element).addClass(CLASS_NAME_ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(CLASS_NAME_FADE$1)) {\n        element.classList.add(CLASS_NAME_SHOW$1);\n      }\n\n      var parent = element.parentNode;\n\n      if (parent && parent.nodeName === 'LI') {\n        parent = parent.parentNode;\n      }\n\n      if (parent && $__default[\"default\"](parent).hasClass(CLASS_NAME_DROPDOWN_MENU)) {\n        var dropdownElement = $__default[\"default\"](element).closest(SELECTOR_DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE));\n          $__default[\"default\"](dropdownToggleList).addClass(CLASS_NAME_ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $__default[\"default\"](this);\n        var data = $this.data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$1, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * Data API implementation\n   */\n\n\n  $__default[\"default\"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($__default[\"default\"](this), 'show');\n  });\n  /**\n   * jQuery\n   */\n\n  $__default[\"default\"].fn[NAME$1] = Tab._jQueryInterface;\n  $__default[\"default\"].fn[NAME$1].Constructor = Tab;\n\n  $__default[\"default\"].fn[NAME$1].noConflict = function () {\n    $__default[\"default\"].fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Tab._jQueryInterface;\n  };\n  /**\n   * Constants\n   */\n\n\n  var NAME = 'toast';\n  var VERSION = '4.6.2';\n  var DATA_KEY = 'bs.toast';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $__default[\"default\"].fn[NAME];\n  var CLASS_NAME_FADE = 'fade';\n  var CLASS_NAME_HIDE = 'hide';\n  var CLASS_NAME_SHOW = 'show';\n  var CLASS_NAME_SHOWING = 'showing';\n  var EVENT_CLICK_DISMISS = \"click.dismiss\" + EVENT_KEY;\n  var EVENT_HIDE = \"hide\" + EVENT_KEY;\n  var EVENT_HIDDEN = \"hidden\" + EVENT_KEY;\n  var EVENT_SHOW = \"show\" + EVENT_KEY;\n  var EVENT_SHOWN = \"shown\" + EVENT_KEY;\n  var SELECTOR_DATA_DISMISS = '[data-dismiss=\"toast\"]';\n  var Default = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  /**\n   * Class definition\n   */\n\n  var Toast = /*#__PURE__*/function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype; // Public\n\n    _proto.show = function show() {\n      var _this = this;\n\n      var showEvent = $__default[\"default\"].Event(EVENT_SHOW);\n      $__default[\"default\"](this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._clearTimeout();\n\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        _this._element.classList.add(CLASS_NAME_SHOW);\n\n        $__default[\"default\"](_this._element).trigger(EVENT_SHOWN);\n\n        if (_this._config.autohide) {\n          _this._timeout = setTimeout(function () {\n            _this.hide();\n          }, _this._config.delay);\n        }\n      };\n\n      this._element.classList.remove(CLASS_NAME_HIDE);\n\n      Util.reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide() {\n      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n        return;\n      }\n\n      var hideEvent = $__default[\"default\"].Event(EVENT_HIDE);\n      $__default[\"default\"](this._element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._close();\n    };\n\n    _proto.dispose = function dispose() {\n      this._clearTimeout();\n\n      if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n\n      $__default[\"default\"](this._element).off(EVENT_CLICK_DISMISS);\n      $__default[\"default\"].removeData(this._element, DATA_KEY);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, $__default[\"default\"](this._element).data(), _typeof(config) === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this2 = this;\n\n      $__default[\"default\"](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function () {\n        return _this2.hide();\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this3 = this;\n\n      var complete = function complete() {\n        _this3._element.classList.add(CLASS_NAME_HIDE);\n\n        $__default[\"default\"](_this3._element).trigger(EVENT_HIDDEN);\n      };\n\n      this._element.classList.remove(CLASS_NAME_SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._clearTimeout = function _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $__default[\"default\"](this);\n        var data = $element.data(DATA_KEY);\n\n        var _config = _typeof(config) === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * jQuery\n   */\n\n\n  $__default[\"default\"].fn[NAME] = Toast._jQueryInterface;\n  $__default[\"default\"].fn[NAME].Constructor = Toast;\n\n  $__default[\"default\"].fn[NAME].noConflict = function () {\n    $__default[\"default\"].fn[NAME] = JQUERY_NO_CONFLICT;\n    return Toast._jQueryInterface;\n  };\n\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n  exports.Util = Util;\n  Object.defineProperty(exports, '__esModule', {\n    value: true\n  });\n});\n\n//# sourceURL=webpack://rup/./node_modules/bootstrap/dist/js/bootstrap.js?");

/***/ }),

/***/ "./node_modules/bootstrap/scss/bootstrap.scss":
/*!****************************************************!*\
  !*** ./node_modules/bootstrap/scss/bootstrap.scss ***!
  \****************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://rup/./node_modules/bootstrap/scss/bootstrap.scss?");

/***/ }),

/***/ "./node_modules/chart.js/dist/Chart.js":
/*!*********************************************!*\
  !*** ./node_modules/chart.js/dist/Chart.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * Chart.js v2.9.4\n * https://www.chartjs.org\n * (c) 2020 Chart.js Contributors\n * Released under the MIT License\n */\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory(function () {\n    try {\n      return __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n    } catch (e) {}\n  }()) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require) {\n    return factory(function () {\n      try {\n        return __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n      } catch (e) {}\n    }());\n  }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : (undefined);\n})(this, function (moment) {\n  'use strict';\n\n  moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;\n\n  function createCommonjsModule(fn, module) {\n    return module = {\n      exports: {}\n    }, fn(module, module.exports), module.exports;\n  }\n\n  function getCjsExportFromNamespace(n) {\n    return n && n['default'] || n;\n  }\n\n  var colorName = {\n    \"aliceblue\": [240, 248, 255],\n    \"antiquewhite\": [250, 235, 215],\n    \"aqua\": [0, 255, 255],\n    \"aquamarine\": [127, 255, 212],\n    \"azure\": [240, 255, 255],\n    \"beige\": [245, 245, 220],\n    \"bisque\": [255, 228, 196],\n    \"black\": [0, 0, 0],\n    \"blanchedalmond\": [255, 235, 205],\n    \"blue\": [0, 0, 255],\n    \"blueviolet\": [138, 43, 226],\n    \"brown\": [165, 42, 42],\n    \"burlywood\": [222, 184, 135],\n    \"cadetblue\": [95, 158, 160],\n    \"chartreuse\": [127, 255, 0],\n    \"chocolate\": [210, 105, 30],\n    \"coral\": [255, 127, 80],\n    \"cornflowerblue\": [100, 149, 237],\n    \"cornsilk\": [255, 248, 220],\n    \"crimson\": [220, 20, 60],\n    \"cyan\": [0, 255, 255],\n    \"darkblue\": [0, 0, 139],\n    \"darkcyan\": [0, 139, 139],\n    \"darkgoldenrod\": [184, 134, 11],\n    \"darkgray\": [169, 169, 169],\n    \"darkgreen\": [0, 100, 0],\n    \"darkgrey\": [169, 169, 169],\n    \"darkkhaki\": [189, 183, 107],\n    \"darkmagenta\": [139, 0, 139],\n    \"darkolivegreen\": [85, 107, 47],\n    \"darkorange\": [255, 140, 0],\n    \"darkorchid\": [153, 50, 204],\n    \"darkred\": [139, 0, 0],\n    \"darksalmon\": [233, 150, 122],\n    \"darkseagreen\": [143, 188, 143],\n    \"darkslateblue\": [72, 61, 139],\n    \"darkslategray\": [47, 79, 79],\n    \"darkslategrey\": [47, 79, 79],\n    \"darkturquoise\": [0, 206, 209],\n    \"darkviolet\": [148, 0, 211],\n    \"deeppink\": [255, 20, 147],\n    \"deepskyblue\": [0, 191, 255],\n    \"dimgray\": [105, 105, 105],\n    \"dimgrey\": [105, 105, 105],\n    \"dodgerblue\": [30, 144, 255],\n    \"firebrick\": [178, 34, 34],\n    \"floralwhite\": [255, 250, 240],\n    \"forestgreen\": [34, 139, 34],\n    \"fuchsia\": [255, 0, 255],\n    \"gainsboro\": [220, 220, 220],\n    \"ghostwhite\": [248, 248, 255],\n    \"gold\": [255, 215, 0],\n    \"goldenrod\": [218, 165, 32],\n    \"gray\": [128, 128, 128],\n    \"green\": [0, 128, 0],\n    \"greenyellow\": [173, 255, 47],\n    \"grey\": [128, 128, 128],\n    \"honeydew\": [240, 255, 240],\n    \"hotpink\": [255, 105, 180],\n    \"indianred\": [205, 92, 92],\n    \"indigo\": [75, 0, 130],\n    \"ivory\": [255, 255, 240],\n    \"khaki\": [240, 230, 140],\n    \"lavender\": [230, 230, 250],\n    \"lavenderblush\": [255, 240, 245],\n    \"lawngreen\": [124, 252, 0],\n    \"lemonchiffon\": [255, 250, 205],\n    \"lightblue\": [173, 216, 230],\n    \"lightcoral\": [240, 128, 128],\n    \"lightcyan\": [224, 255, 255],\n    \"lightgoldenrodyellow\": [250, 250, 210],\n    \"lightgray\": [211, 211, 211],\n    \"lightgreen\": [144, 238, 144],\n    \"lightgrey\": [211, 211, 211],\n    \"lightpink\": [255, 182, 193],\n    \"lightsalmon\": [255, 160, 122],\n    \"lightseagreen\": [32, 178, 170],\n    \"lightskyblue\": [135, 206, 250],\n    \"lightslategray\": [119, 136, 153],\n    \"lightslategrey\": [119, 136, 153],\n    \"lightsteelblue\": [176, 196, 222],\n    \"lightyellow\": [255, 255, 224],\n    \"lime\": [0, 255, 0],\n    \"limegreen\": [50, 205, 50],\n    \"linen\": [250, 240, 230],\n    \"magenta\": [255, 0, 255],\n    \"maroon\": [128, 0, 0],\n    \"mediumaquamarine\": [102, 205, 170],\n    \"mediumblue\": [0, 0, 205],\n    \"mediumorchid\": [186, 85, 211],\n    \"mediumpurple\": [147, 112, 219],\n    \"mediumseagreen\": [60, 179, 113],\n    \"mediumslateblue\": [123, 104, 238],\n    \"mediumspringgreen\": [0, 250, 154],\n    \"mediumturquoise\": [72, 209, 204],\n    \"mediumvioletred\": [199, 21, 133],\n    \"midnightblue\": [25, 25, 112],\n    \"mintcream\": [245, 255, 250],\n    \"mistyrose\": [255, 228, 225],\n    \"moccasin\": [255, 228, 181],\n    \"navajowhite\": [255, 222, 173],\n    \"navy\": [0, 0, 128],\n    \"oldlace\": [253, 245, 230],\n    \"olive\": [128, 128, 0],\n    \"olivedrab\": [107, 142, 35],\n    \"orange\": [255, 165, 0],\n    \"orangered\": [255, 69, 0],\n    \"orchid\": [218, 112, 214],\n    \"palegoldenrod\": [238, 232, 170],\n    \"palegreen\": [152, 251, 152],\n    \"paleturquoise\": [175, 238, 238],\n    \"palevioletred\": [219, 112, 147],\n    \"papayawhip\": [255, 239, 213],\n    \"peachpuff\": [255, 218, 185],\n    \"peru\": [205, 133, 63],\n    \"pink\": [255, 192, 203],\n    \"plum\": [221, 160, 221],\n    \"powderblue\": [176, 224, 230],\n    \"purple\": [128, 0, 128],\n    \"rebeccapurple\": [102, 51, 153],\n    \"red\": [255, 0, 0],\n    \"rosybrown\": [188, 143, 143],\n    \"royalblue\": [65, 105, 225],\n    \"saddlebrown\": [139, 69, 19],\n    \"salmon\": [250, 128, 114],\n    \"sandybrown\": [244, 164, 96],\n    \"seagreen\": [46, 139, 87],\n    \"seashell\": [255, 245, 238],\n    \"sienna\": [160, 82, 45],\n    \"silver\": [192, 192, 192],\n    \"skyblue\": [135, 206, 235],\n    \"slateblue\": [106, 90, 205],\n    \"slategray\": [112, 128, 144],\n    \"slategrey\": [112, 128, 144],\n    \"snow\": [255, 250, 250],\n    \"springgreen\": [0, 255, 127],\n    \"steelblue\": [70, 130, 180],\n    \"tan\": [210, 180, 140],\n    \"teal\": [0, 128, 128],\n    \"thistle\": [216, 191, 216],\n    \"tomato\": [255, 99, 71],\n    \"turquoise\": [64, 224, 208],\n    \"violet\": [238, 130, 238],\n    \"wheat\": [245, 222, 179],\n    \"white\": [255, 255, 255],\n    \"whitesmoke\": [245, 245, 245],\n    \"yellow\": [255, 255, 0],\n    \"yellowgreen\": [154, 205, 50]\n  };\n  var conversions = createCommonjsModule(function (module) {\n    /* MIT license */\n    // NOTE: conversions should only return primitive values (i.e. arrays, or\n    //       values that give correct `typeof` results).\n    //       do not use box values types (i.e. Number(), String(), etc.)\n    var reverseKeywords = {};\n\n    for (var key in colorName) {\n      if (colorName.hasOwnProperty(key)) {\n        reverseKeywords[colorName[key]] = key;\n      }\n    }\n\n    var convert = module.exports = {\n      rgb: {\n        channels: 3,\n        labels: 'rgb'\n      },\n      hsl: {\n        channels: 3,\n        labels: 'hsl'\n      },\n      hsv: {\n        channels: 3,\n        labels: 'hsv'\n      },\n      hwb: {\n        channels: 3,\n        labels: 'hwb'\n      },\n      cmyk: {\n        channels: 4,\n        labels: 'cmyk'\n      },\n      xyz: {\n        channels: 3,\n        labels: 'xyz'\n      },\n      lab: {\n        channels: 3,\n        labels: 'lab'\n      },\n      lch: {\n        channels: 3,\n        labels: 'lch'\n      },\n      hex: {\n        channels: 1,\n        labels: ['hex']\n      },\n      keyword: {\n        channels: 1,\n        labels: ['keyword']\n      },\n      ansi16: {\n        channels: 1,\n        labels: ['ansi16']\n      },\n      ansi256: {\n        channels: 1,\n        labels: ['ansi256']\n      },\n      hcg: {\n        channels: 3,\n        labels: ['h', 'c', 'g']\n      },\n      apple: {\n        channels: 3,\n        labels: ['r16', 'g16', 'b16']\n      },\n      gray: {\n        channels: 1,\n        labels: ['gray']\n      }\n    }; // hide .channels and .labels properties\n\n    for (var model in convert) {\n      if (convert.hasOwnProperty(model)) {\n        if (!('channels' in convert[model])) {\n          throw new Error('missing channels property: ' + model);\n        }\n\n        if (!('labels' in convert[model])) {\n          throw new Error('missing channel labels property: ' + model);\n        }\n\n        if (convert[model].labels.length !== convert[model].channels) {\n          throw new Error('channel and label counts mismatch: ' + model);\n        }\n\n        var channels = convert[model].channels;\n        var labels = convert[model].labels;\n        delete convert[model].channels;\n        delete convert[model].labels;\n        Object.defineProperty(convert[model], 'channels', {\n          value: channels\n        });\n        Object.defineProperty(convert[model], 'labels', {\n          value: labels\n        });\n      }\n    }\n\n    convert.rgb.hsl = function (rgb) {\n      var r = rgb[0] / 255;\n      var g = rgb[1] / 255;\n      var b = rgb[2] / 255;\n      var min = Math.min(r, g, b);\n      var max = Math.max(r, g, b);\n      var delta = max - min;\n      var h;\n      var s;\n      var l;\n\n      if (max === min) {\n        h = 0;\n      } else if (r === max) {\n        h = (g - b) / delta;\n      } else if (g === max) {\n        h = 2 + (b - r) / delta;\n      } else if (b === max) {\n        h = 4 + (r - g) / delta;\n      }\n\n      h = Math.min(h * 60, 360);\n\n      if (h < 0) {\n        h += 360;\n      }\n\n      l = (min + max) / 2;\n\n      if (max === min) {\n        s = 0;\n      } else if (l <= 0.5) {\n        s = delta / (max + min);\n      } else {\n        s = delta / (2 - max - min);\n      }\n\n      return [h, s * 100, l * 100];\n    };\n\n    convert.rgb.hsv = function (rgb) {\n      var rdif;\n      var gdif;\n      var bdif;\n      var h;\n      var s;\n      var r = rgb[0] / 255;\n      var g = rgb[1] / 255;\n      var b = rgb[2] / 255;\n      var v = Math.max(r, g, b);\n      var diff = v - Math.min(r, g, b);\n\n      var diffc = function diffc(c) {\n        return (v - c) / 6 / diff + 1 / 2;\n      };\n\n      if (diff === 0) {\n        h = s = 0;\n      } else {\n        s = diff / v;\n        rdif = diffc(r);\n        gdif = diffc(g);\n        bdif = diffc(b);\n\n        if (r === v) {\n          h = bdif - gdif;\n        } else if (g === v) {\n          h = 1 / 3 + rdif - bdif;\n        } else if (b === v) {\n          h = 2 / 3 + gdif - rdif;\n        }\n\n        if (h < 0) {\n          h += 1;\n        } else if (h > 1) {\n          h -= 1;\n        }\n      }\n\n      return [h * 360, s * 100, v * 100];\n    };\n\n    convert.rgb.hwb = function (rgb) {\n      var r = rgb[0];\n      var g = rgb[1];\n      var b = rgb[2];\n      var h = convert.rgb.hsl(rgb)[0];\n      var w = 1 / 255 * Math.min(r, Math.min(g, b));\n      b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n      return [h, w * 100, b * 100];\n    };\n\n    convert.rgb.cmyk = function (rgb) {\n      var r = rgb[0] / 255;\n      var g = rgb[1] / 255;\n      var b = rgb[2] / 255;\n      var c;\n      var m;\n      var y;\n      var k;\n      k = Math.min(1 - r, 1 - g, 1 - b);\n      c = (1 - r - k) / (1 - k) || 0;\n      m = (1 - g - k) / (1 - k) || 0;\n      y = (1 - b - k) / (1 - k) || 0;\n      return [c * 100, m * 100, y * 100, k * 100];\n    };\n    /**\n     * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n     * */\n\n\n    function comparativeDistance(x, y) {\n      return Math.pow(x[0] - y[0], 2) + Math.pow(x[1] - y[1], 2) + Math.pow(x[2] - y[2], 2);\n    }\n\n    convert.rgb.keyword = function (rgb) {\n      var reversed = reverseKeywords[rgb];\n\n      if (reversed) {\n        return reversed;\n      }\n\n      var currentClosestDistance = Infinity;\n      var currentClosestKeyword;\n\n      for (var keyword in colorName) {\n        if (colorName.hasOwnProperty(keyword)) {\n          var value = colorName[keyword]; // Compute comparative distance\n\n          var distance = comparativeDistance(rgb, value); // Check if its less, if so set as closest\n\n          if (distance < currentClosestDistance) {\n            currentClosestDistance = distance;\n            currentClosestKeyword = keyword;\n          }\n        }\n      }\n\n      return currentClosestKeyword;\n    };\n\n    convert.keyword.rgb = function (keyword) {\n      return colorName[keyword];\n    };\n\n    convert.rgb.xyz = function (rgb) {\n      var r = rgb[0] / 255;\n      var g = rgb[1] / 255;\n      var b = rgb[2] / 255; // assume sRGB\n\n      r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n      g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n      b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n      var x = r * 0.4124 + g * 0.3576 + b * 0.1805;\n      var y = r * 0.2126 + g * 0.7152 + b * 0.0722;\n      var z = r * 0.0193 + g * 0.1192 + b * 0.9505;\n      return [x * 100, y * 100, z * 100];\n    };\n\n    convert.rgb.lab = function (rgb) {\n      var xyz = convert.rgb.xyz(rgb);\n      var x = xyz[0];\n      var y = xyz[1];\n      var z = xyz[2];\n      var l;\n      var a;\n      var b;\n      x /= 95.047;\n      y /= 100;\n      z /= 108.883;\n      x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n      y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n      z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n      l = 116 * y - 16;\n      a = 500 * (x - y);\n      b = 200 * (y - z);\n      return [l, a, b];\n    };\n\n    convert.hsl.rgb = function (hsl) {\n      var h = hsl[0] / 360;\n      var s = hsl[1] / 100;\n      var l = hsl[2] / 100;\n      var t1;\n      var t2;\n      var t3;\n      var rgb;\n      var val;\n\n      if (s === 0) {\n        val = l * 255;\n        return [val, val, val];\n      }\n\n      if (l < 0.5) {\n        t2 = l * (1 + s);\n      } else {\n        t2 = l + s - l * s;\n      }\n\n      t1 = 2 * l - t2;\n      rgb = [0, 0, 0];\n\n      for (var i = 0; i < 3; i++) {\n        t3 = h + 1 / 3 * -(i - 1);\n\n        if (t3 < 0) {\n          t3++;\n        }\n\n        if (t3 > 1) {\n          t3--;\n        }\n\n        if (6 * t3 < 1) {\n          val = t1 + (t2 - t1) * 6 * t3;\n        } else if (2 * t3 < 1) {\n          val = t2;\n        } else if (3 * t3 < 2) {\n          val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n        } else {\n          val = t1;\n        }\n\n        rgb[i] = val * 255;\n      }\n\n      return rgb;\n    };\n\n    convert.hsl.hsv = function (hsl) {\n      var h = hsl[0];\n      var s = hsl[1] / 100;\n      var l = hsl[2] / 100;\n      var smin = s;\n      var lmin = Math.max(l, 0.01);\n      var sv;\n      var v;\n      l *= 2;\n      s *= l <= 1 ? l : 2 - l;\n      smin *= lmin <= 1 ? lmin : 2 - lmin;\n      v = (l + s) / 2;\n      sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s);\n      return [h, sv * 100, v * 100];\n    };\n\n    convert.hsv.rgb = function (hsv) {\n      var h = hsv[0] / 60;\n      var s = hsv[1] / 100;\n      var v = hsv[2] / 100;\n      var hi = Math.floor(h) % 6;\n      var f = h - Math.floor(h);\n      var p = 255 * v * (1 - s);\n      var q = 255 * v * (1 - s * f);\n      var t = 255 * v * (1 - s * (1 - f));\n      v *= 255;\n\n      switch (hi) {\n        case 0:\n          return [v, t, p];\n\n        case 1:\n          return [q, v, p];\n\n        case 2:\n          return [p, v, t];\n\n        case 3:\n          return [p, q, v];\n\n        case 4:\n          return [t, p, v];\n\n        case 5:\n          return [v, p, q];\n      }\n    };\n\n    convert.hsv.hsl = function (hsv) {\n      var h = hsv[0];\n      var s = hsv[1] / 100;\n      var v = hsv[2] / 100;\n      var vmin = Math.max(v, 0.01);\n      var lmin;\n      var sl;\n      var l;\n      l = (2 - s) * v;\n      lmin = (2 - s) * vmin;\n      sl = s * vmin;\n      sl /= lmin <= 1 ? lmin : 2 - lmin;\n      sl = sl || 0;\n      l /= 2;\n      return [h, sl * 100, l * 100];\n    }; // http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n\n\n    convert.hwb.rgb = function (hwb) {\n      var h = hwb[0] / 360;\n      var wh = hwb[1] / 100;\n      var bl = hwb[2] / 100;\n      var ratio = wh + bl;\n      var i;\n      var v;\n      var f;\n      var n; // wh + bl cant be > 1\n\n      if (ratio > 1) {\n        wh /= ratio;\n        bl /= ratio;\n      }\n\n      i = Math.floor(6 * h);\n      v = 1 - bl;\n      f = 6 * h - i;\n\n      if ((i & 0x01) !== 0) {\n        f = 1 - f;\n      }\n\n      n = wh + f * (v - wh); // linear interpolation\n\n      var r;\n      var g;\n      var b;\n\n      switch (i) {\n        default:\n        case 6:\n        case 0:\n          r = v;\n          g = n;\n          b = wh;\n          break;\n\n        case 1:\n          r = n;\n          g = v;\n          b = wh;\n          break;\n\n        case 2:\n          r = wh;\n          g = v;\n          b = n;\n          break;\n\n        case 3:\n          r = wh;\n          g = n;\n          b = v;\n          break;\n\n        case 4:\n          r = n;\n          g = wh;\n          b = v;\n          break;\n\n        case 5:\n          r = v;\n          g = wh;\n          b = n;\n          break;\n      }\n\n      return [r * 255, g * 255, b * 255];\n    };\n\n    convert.cmyk.rgb = function (cmyk) {\n      var c = cmyk[0] / 100;\n      var m = cmyk[1] / 100;\n      var y = cmyk[2] / 100;\n      var k = cmyk[3] / 100;\n      var r;\n      var g;\n      var b;\n      r = 1 - Math.min(1, c * (1 - k) + k);\n      g = 1 - Math.min(1, m * (1 - k) + k);\n      b = 1 - Math.min(1, y * (1 - k) + k);\n      return [r * 255, g * 255, b * 255];\n    };\n\n    convert.xyz.rgb = function (xyz) {\n      var x = xyz[0] / 100;\n      var y = xyz[1] / 100;\n      var z = xyz[2] / 100;\n      var r;\n      var g;\n      var b;\n      r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n      g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n      b = x * 0.0557 + y * -0.2040 + z * 1.0570; // assume sRGB\n\n      r = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r * 12.92;\n      g = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g * 12.92;\n      b = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b * 12.92;\n      r = Math.min(Math.max(0, r), 1);\n      g = Math.min(Math.max(0, g), 1);\n      b = Math.min(Math.max(0, b), 1);\n      return [r * 255, g * 255, b * 255];\n    };\n\n    convert.xyz.lab = function (xyz) {\n      var x = xyz[0];\n      var y = xyz[1];\n      var z = xyz[2];\n      var l;\n      var a;\n      var b;\n      x /= 95.047;\n      y /= 100;\n      z /= 108.883;\n      x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n      y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n      z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n      l = 116 * y - 16;\n      a = 500 * (x - y);\n      b = 200 * (y - z);\n      return [l, a, b];\n    };\n\n    convert.lab.xyz = function (lab) {\n      var l = lab[0];\n      var a = lab[1];\n      var b = lab[2];\n      var x;\n      var y;\n      var z;\n      y = (l + 16) / 116;\n      x = a / 500 + y;\n      z = y - b / 200;\n      var y2 = Math.pow(y, 3);\n      var x2 = Math.pow(x, 3);\n      var z2 = Math.pow(z, 3);\n      y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n      x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n      z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n      x *= 95.047;\n      y *= 100;\n      z *= 108.883;\n      return [x, y, z];\n    };\n\n    convert.lab.lch = function (lab) {\n      var l = lab[0];\n      var a = lab[1];\n      var b = lab[2];\n      var hr;\n      var h;\n      var c;\n      hr = Math.atan2(b, a);\n      h = hr * 360 / 2 / Math.PI;\n\n      if (h < 0) {\n        h += 360;\n      }\n\n      c = Math.sqrt(a * a + b * b);\n      return [l, c, h];\n    };\n\n    convert.lch.lab = function (lch) {\n      var l = lch[0];\n      var c = lch[1];\n      var h = lch[2];\n      var a;\n      var b;\n      var hr;\n      hr = h / 360 * 2 * Math.PI;\n      a = c * Math.cos(hr);\n      b = c * Math.sin(hr);\n      return [l, a, b];\n    };\n\n    convert.rgb.ansi16 = function (args) {\n      var r = args[0];\n      var g = args[1];\n      var b = args[2];\n      var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n      value = Math.round(value / 50);\n\n      if (value === 0) {\n        return 30;\n      }\n\n      var ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255));\n\n      if (value === 2) {\n        ansi += 60;\n      }\n\n      return ansi;\n    };\n\n    convert.hsv.ansi16 = function (args) {\n      // optimization here; we already know the value and don't need to get\n      // it converted for us.\n      return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n    };\n\n    convert.rgb.ansi256 = function (args) {\n      var r = args[0];\n      var g = args[1];\n      var b = args[2]; // we use the extended greyscale palette here, with the exception of\n      // black and white. normal palette only has 4 greyscale shades.\n\n      if (r === g && g === b) {\n        if (r < 8) {\n          return 16;\n        }\n\n        if (r > 248) {\n          return 231;\n        }\n\n        return Math.round((r - 8) / 247 * 24) + 232;\n      }\n\n      var ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5);\n      return ansi;\n    };\n\n    convert.ansi16.rgb = function (args) {\n      var color = args % 10; // handle greyscale\n\n      if (color === 0 || color === 7) {\n        if (args > 50) {\n          color += 3.5;\n        }\n\n        color = color / 10.5 * 255;\n        return [color, color, color];\n      }\n\n      var mult = (~~(args > 50) + 1) * 0.5;\n      var r = (color & 1) * mult * 255;\n      var g = (color >> 1 & 1) * mult * 255;\n      var b = (color >> 2 & 1) * mult * 255;\n      return [r, g, b];\n    };\n\n    convert.ansi256.rgb = function (args) {\n      // handle greyscale\n      if (args >= 232) {\n        var c = (args - 232) * 10 + 8;\n        return [c, c, c];\n      }\n\n      args -= 16;\n      var rem;\n      var r = Math.floor(args / 36) / 5 * 255;\n      var g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n      var b = rem % 6 / 5 * 255;\n      return [r, g, b];\n    };\n\n    convert.rgb.hex = function (args) {\n      var integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF);\n      var string = integer.toString(16).toUpperCase();\n      return '000000'.substring(string.length) + string;\n    };\n\n    convert.hex.rgb = function (args) {\n      var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\n      if (!match) {\n        return [0, 0, 0];\n      }\n\n      var colorString = match[0];\n\n      if (match[0].length === 3) {\n        colorString = colorString.split('').map(function (_char) {\n          return _char + _char;\n        }).join('');\n      }\n\n      var integer = parseInt(colorString, 16);\n      var r = integer >> 16 & 0xFF;\n      var g = integer >> 8 & 0xFF;\n      var b = integer & 0xFF;\n      return [r, g, b];\n    };\n\n    convert.rgb.hcg = function (rgb) {\n      var r = rgb[0] / 255;\n      var g = rgb[1] / 255;\n      var b = rgb[2] / 255;\n      var max = Math.max(Math.max(r, g), b);\n      var min = Math.min(Math.min(r, g), b);\n      var chroma = max - min;\n      var grayscale;\n      var hue;\n\n      if (chroma < 1) {\n        grayscale = min / (1 - chroma);\n      } else {\n        grayscale = 0;\n      }\n\n      if (chroma <= 0) {\n        hue = 0;\n      } else if (max === r) {\n        hue = (g - b) / chroma % 6;\n      } else if (max === g) {\n        hue = 2 + (b - r) / chroma;\n      } else {\n        hue = 4 + (r - g) / chroma + 4;\n      }\n\n      hue /= 6;\n      hue %= 1;\n      return [hue * 360, chroma * 100, grayscale * 100];\n    };\n\n    convert.hsl.hcg = function (hsl) {\n      var s = hsl[1] / 100;\n      var l = hsl[2] / 100;\n      var c = 1;\n      var f = 0;\n\n      if (l < 0.5) {\n        c = 2.0 * s * l;\n      } else {\n        c = 2.0 * s * (1.0 - l);\n      }\n\n      if (c < 1.0) {\n        f = (l - 0.5 * c) / (1.0 - c);\n      }\n\n      return [hsl[0], c * 100, f * 100];\n    };\n\n    convert.hsv.hcg = function (hsv) {\n      var s = hsv[1] / 100;\n      var v = hsv[2] / 100;\n      var c = s * v;\n      var f = 0;\n\n      if (c < 1.0) {\n        f = (v - c) / (1 - c);\n      }\n\n      return [hsv[0], c * 100, f * 100];\n    };\n\n    convert.hcg.rgb = function (hcg) {\n      var h = hcg[0] / 360;\n      var c = hcg[1] / 100;\n      var g = hcg[2] / 100;\n\n      if (c === 0.0) {\n        return [g * 255, g * 255, g * 255];\n      }\n\n      var pure = [0, 0, 0];\n      var hi = h % 1 * 6;\n      var v = hi % 1;\n      var w = 1 - v;\n      var mg = 0;\n\n      switch (Math.floor(hi)) {\n        case 0:\n          pure[0] = 1;\n          pure[1] = v;\n          pure[2] = 0;\n          break;\n\n        case 1:\n          pure[0] = w;\n          pure[1] = 1;\n          pure[2] = 0;\n          break;\n\n        case 2:\n          pure[0] = 0;\n          pure[1] = 1;\n          pure[2] = v;\n          break;\n\n        case 3:\n          pure[0] = 0;\n          pure[1] = w;\n          pure[2] = 1;\n          break;\n\n        case 4:\n          pure[0] = v;\n          pure[1] = 0;\n          pure[2] = 1;\n          break;\n\n        default:\n          pure[0] = 1;\n          pure[1] = 0;\n          pure[2] = w;\n      }\n\n      mg = (1.0 - c) * g;\n      return [(c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255];\n    };\n\n    convert.hcg.hsv = function (hcg) {\n      var c = hcg[1] / 100;\n      var g = hcg[2] / 100;\n      var v = c + g * (1.0 - c);\n      var f = 0;\n\n      if (v > 0.0) {\n        f = c / v;\n      }\n\n      return [hcg[0], f * 100, v * 100];\n    };\n\n    convert.hcg.hsl = function (hcg) {\n      var c = hcg[1] / 100;\n      var g = hcg[2] / 100;\n      var l = g * (1.0 - c) + 0.5 * c;\n      var s = 0;\n\n      if (l > 0.0 && l < 0.5) {\n        s = c / (2 * l);\n      } else if (l >= 0.5 && l < 1.0) {\n        s = c / (2 * (1 - l));\n      }\n\n      return [hcg[0], s * 100, l * 100];\n    };\n\n    convert.hcg.hwb = function (hcg) {\n      var c = hcg[1] / 100;\n      var g = hcg[2] / 100;\n      var v = c + g * (1.0 - c);\n      return [hcg[0], (v - c) * 100, (1 - v) * 100];\n    };\n\n    convert.hwb.hcg = function (hwb) {\n      var w = hwb[1] / 100;\n      var b = hwb[2] / 100;\n      var v = 1 - b;\n      var c = v - w;\n      var g = 0;\n\n      if (c < 1) {\n        g = (v - c) / (1 - c);\n      }\n\n      return [hwb[0], c * 100, g * 100];\n    };\n\n    convert.apple.rgb = function (apple) {\n      return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255];\n    };\n\n    convert.rgb.apple = function (rgb) {\n      return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535];\n    };\n\n    convert.gray.rgb = function (args) {\n      return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n    };\n\n    convert.gray.hsl = convert.gray.hsv = function (args) {\n      return [0, 0, args[0]];\n    };\n\n    convert.gray.hwb = function (gray) {\n      return [0, 100, gray[0]];\n    };\n\n    convert.gray.cmyk = function (gray) {\n      return [0, 0, 0, gray[0]];\n    };\n\n    convert.gray.lab = function (gray) {\n      return [gray[0], 0, 0];\n    };\n\n    convert.gray.hex = function (gray) {\n      var val = Math.round(gray[0] / 100 * 255) & 0xFF;\n      var integer = (val << 16) + (val << 8) + val;\n      var string = integer.toString(16).toUpperCase();\n      return '000000'.substring(string.length) + string;\n    };\n\n    convert.rgb.gray = function (rgb) {\n      var val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n      return [val / 255 * 100];\n    };\n  });\n  var conversions_1 = conversions.rgb;\n  var conversions_2 = conversions.hsl;\n  var conversions_3 = conversions.hsv;\n  var conversions_4 = conversions.hwb;\n  var conversions_5 = conversions.cmyk;\n  var conversions_6 = conversions.xyz;\n  var conversions_7 = conversions.lab;\n  var conversions_8 = conversions.lch;\n  var conversions_9 = conversions.hex;\n  var conversions_10 = conversions.keyword;\n  var conversions_11 = conversions.ansi16;\n  var conversions_12 = conversions.ansi256;\n  var conversions_13 = conversions.hcg;\n  var conversions_14 = conversions.apple;\n  var conversions_15 = conversions.gray;\n  /*\n  \tthis function routes a model to all other models.\n  \n  \tall functions that are routed have a property `.conversion` attached\n  \tto the returned synthetic function. This property is an array\n  \tof strings, each with the steps in between the 'from' and 'to'\n  \tcolor models (inclusive).\n  \n  \tconversions that are not possible simply are not included.\n  */\n\n  function buildGraph() {\n    var graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\n    var models = Object.keys(conversions);\n\n    for (var len = models.length, i = 0; i < len; i++) {\n      graph[models[i]] = {\n        // http://jsperf.com/1-vs-infinity\n        // micro-opt, but this is simple.\n        distance: -1,\n        parent: null\n      };\n    }\n\n    return graph;\n  } // https://en.wikipedia.org/wiki/Breadth-first_search\n\n\n  function deriveBFS(fromModel) {\n    var graph = buildGraph();\n    var queue = [fromModel]; // unshift -> queue -> pop\n\n    graph[fromModel].distance = 0;\n\n    while (queue.length) {\n      var current = queue.pop();\n      var adjacents = Object.keys(conversions[current]);\n\n      for (var len = adjacents.length, i = 0; i < len; i++) {\n        var adjacent = adjacents[i];\n        var node = graph[adjacent];\n\n        if (node.distance === -1) {\n          node.distance = graph[current].distance + 1;\n          node.parent = current;\n          queue.unshift(adjacent);\n        }\n      }\n    }\n\n    return graph;\n  }\n\n  function link(from, to) {\n    return function (args) {\n      return to(from(args));\n    };\n  }\n\n  function wrapConversion(toModel, graph) {\n    var path = [graph[toModel].parent, toModel];\n    var fn = conversions[graph[toModel].parent][toModel];\n    var cur = graph[toModel].parent;\n\n    while (graph[cur].parent) {\n      path.unshift(graph[cur].parent);\n      fn = link(conversions[graph[cur].parent][cur], fn);\n      cur = graph[cur].parent;\n    }\n\n    fn.conversion = path;\n    return fn;\n  }\n\n  var route = function route(fromModel) {\n    var graph = deriveBFS(fromModel);\n    var conversion = {};\n    var models = Object.keys(graph);\n\n    for (var len = models.length, i = 0; i < len; i++) {\n      var toModel = models[i];\n      var node = graph[toModel];\n\n      if (node.parent === null) {\n        // no possible conversion, or this node is the source model.\n        continue;\n      }\n\n      conversion[toModel] = wrapConversion(toModel, graph);\n    }\n\n    return conversion;\n  };\n\n  var convert = {};\n  var models = Object.keys(conversions);\n\n  function wrapRaw(fn) {\n    var wrappedFn = function wrappedFn(args) {\n      if (args === undefined || args === null) {\n        return args;\n      }\n\n      if (arguments.length > 1) {\n        args = Array.prototype.slice.call(arguments);\n      }\n\n      return fn(args);\n    }; // preserve .conversion property if there is one\n\n\n    if ('conversion' in fn) {\n      wrappedFn.conversion = fn.conversion;\n    }\n\n    return wrappedFn;\n  }\n\n  function wrapRounded(fn) {\n    var wrappedFn = function wrappedFn(args) {\n      if (args === undefined || args === null) {\n        return args;\n      }\n\n      if (arguments.length > 1) {\n        args = Array.prototype.slice.call(arguments);\n      }\n\n      var result = fn(args); // we're assuming the result is an array here.\n      // see notice in conversions.js; don't use box types\n      // in conversion functions.\n\n      if (_typeof(result) === 'object') {\n        for (var len = result.length, i = 0; i < len; i++) {\n          result[i] = Math.round(result[i]);\n        }\n      }\n\n      return result;\n    }; // preserve .conversion property if there is one\n\n\n    if ('conversion' in fn) {\n      wrappedFn.conversion = fn.conversion;\n    }\n\n    return wrappedFn;\n  }\n\n  models.forEach(function (fromModel) {\n    convert[fromModel] = {};\n    Object.defineProperty(convert[fromModel], 'channels', {\n      value: conversions[fromModel].channels\n    });\n    Object.defineProperty(convert[fromModel], 'labels', {\n      value: conversions[fromModel].labels\n    });\n    var routes = route(fromModel);\n    var routeModels = Object.keys(routes);\n    routeModels.forEach(function (toModel) {\n      var fn = routes[toModel];\n      convert[fromModel][toModel] = wrapRounded(fn);\n      convert[fromModel][toModel].raw = wrapRaw(fn);\n    });\n  });\n  var colorConvert = convert;\n  var colorName$1 = {\n    \"aliceblue\": [240, 248, 255],\n    \"antiquewhite\": [250, 235, 215],\n    \"aqua\": [0, 255, 255],\n    \"aquamarine\": [127, 255, 212],\n    \"azure\": [240, 255, 255],\n    \"beige\": [245, 245, 220],\n    \"bisque\": [255, 228, 196],\n    \"black\": [0, 0, 0],\n    \"blanchedalmond\": [255, 235, 205],\n    \"blue\": [0, 0, 255],\n    \"blueviolet\": [138, 43, 226],\n    \"brown\": [165, 42, 42],\n    \"burlywood\": [222, 184, 135],\n    \"cadetblue\": [95, 158, 160],\n    \"chartreuse\": [127, 255, 0],\n    \"chocolate\": [210, 105, 30],\n    \"coral\": [255, 127, 80],\n    \"cornflowerblue\": [100, 149, 237],\n    \"cornsilk\": [255, 248, 220],\n    \"crimson\": [220, 20, 60],\n    \"cyan\": [0, 255, 255],\n    \"darkblue\": [0, 0, 139],\n    \"darkcyan\": [0, 139, 139],\n    \"darkgoldenrod\": [184, 134, 11],\n    \"darkgray\": [169, 169, 169],\n    \"darkgreen\": [0, 100, 0],\n    \"darkgrey\": [169, 169, 169],\n    \"darkkhaki\": [189, 183, 107],\n    \"darkmagenta\": [139, 0, 139],\n    \"darkolivegreen\": [85, 107, 47],\n    \"darkorange\": [255, 140, 0],\n    \"darkorchid\": [153, 50, 204],\n    \"darkred\": [139, 0, 0],\n    \"darksalmon\": [233, 150, 122],\n    \"darkseagreen\": [143, 188, 143],\n    \"darkslateblue\": [72, 61, 139],\n    \"darkslategray\": [47, 79, 79],\n    \"darkslategrey\": [47, 79, 79],\n    \"darkturquoise\": [0, 206, 209],\n    \"darkviolet\": [148, 0, 211],\n    \"deeppink\": [255, 20, 147],\n    \"deepskyblue\": [0, 191, 255],\n    \"dimgray\": [105, 105, 105],\n    \"dimgrey\": [105, 105, 105],\n    \"dodgerblue\": [30, 144, 255],\n    \"firebrick\": [178, 34, 34],\n    \"floralwhite\": [255, 250, 240],\n    \"forestgreen\": [34, 139, 34],\n    \"fuchsia\": [255, 0, 255],\n    \"gainsboro\": [220, 220, 220],\n    \"ghostwhite\": [248, 248, 255],\n    \"gold\": [255, 215, 0],\n    \"goldenrod\": [218, 165, 32],\n    \"gray\": [128, 128, 128],\n    \"green\": [0, 128, 0],\n    \"greenyellow\": [173, 255, 47],\n    \"grey\": [128, 128, 128],\n    \"honeydew\": [240, 255, 240],\n    \"hotpink\": [255, 105, 180],\n    \"indianred\": [205, 92, 92],\n    \"indigo\": [75, 0, 130],\n    \"ivory\": [255, 255, 240],\n    \"khaki\": [240, 230, 140],\n    \"lavender\": [230, 230, 250],\n    \"lavenderblush\": [255, 240, 245],\n    \"lawngreen\": [124, 252, 0],\n    \"lemonchiffon\": [255, 250, 205],\n    \"lightblue\": [173, 216, 230],\n    \"lightcoral\": [240, 128, 128],\n    \"lightcyan\": [224, 255, 255],\n    \"lightgoldenrodyellow\": [250, 250, 210],\n    \"lightgray\": [211, 211, 211],\n    \"lightgreen\": [144, 238, 144],\n    \"lightgrey\": [211, 211, 211],\n    \"lightpink\": [255, 182, 193],\n    \"lightsalmon\": [255, 160, 122],\n    \"lightseagreen\": [32, 178, 170],\n    \"lightskyblue\": [135, 206, 250],\n    \"lightslategray\": [119, 136, 153],\n    \"lightslategrey\": [119, 136, 153],\n    \"lightsteelblue\": [176, 196, 222],\n    \"lightyellow\": [255, 255, 224],\n    \"lime\": [0, 255, 0],\n    \"limegreen\": [50, 205, 50],\n    \"linen\": [250, 240, 230],\n    \"magenta\": [255, 0, 255],\n    \"maroon\": [128, 0, 0],\n    \"mediumaquamarine\": [102, 205, 170],\n    \"mediumblue\": [0, 0, 205],\n    \"mediumorchid\": [186, 85, 211],\n    \"mediumpurple\": [147, 112, 219],\n    \"mediumseagreen\": [60, 179, 113],\n    \"mediumslateblue\": [123, 104, 238],\n    \"mediumspringgreen\": [0, 250, 154],\n    \"mediumturquoise\": [72, 209, 204],\n    \"mediumvioletred\": [199, 21, 133],\n    \"midnightblue\": [25, 25, 112],\n    \"mintcream\": [245, 255, 250],\n    \"mistyrose\": [255, 228, 225],\n    \"moccasin\": [255, 228, 181],\n    \"navajowhite\": [255, 222, 173],\n    \"navy\": [0, 0, 128],\n    \"oldlace\": [253, 245, 230],\n    \"olive\": [128, 128, 0],\n    \"olivedrab\": [107, 142, 35],\n    \"orange\": [255, 165, 0],\n    \"orangered\": [255, 69, 0],\n    \"orchid\": [218, 112, 214],\n    \"palegoldenrod\": [238, 232, 170],\n    \"palegreen\": [152, 251, 152],\n    \"paleturquoise\": [175, 238, 238],\n    \"palevioletred\": [219, 112, 147],\n    \"papayawhip\": [255, 239, 213],\n    \"peachpuff\": [255, 218, 185],\n    \"peru\": [205, 133, 63],\n    \"pink\": [255, 192, 203],\n    \"plum\": [221, 160, 221],\n    \"powderblue\": [176, 224, 230],\n    \"purple\": [128, 0, 128],\n    \"rebeccapurple\": [102, 51, 153],\n    \"red\": [255, 0, 0],\n    \"rosybrown\": [188, 143, 143],\n    \"royalblue\": [65, 105, 225],\n    \"saddlebrown\": [139, 69, 19],\n    \"salmon\": [250, 128, 114],\n    \"sandybrown\": [244, 164, 96],\n    \"seagreen\": [46, 139, 87],\n    \"seashell\": [255, 245, 238],\n    \"sienna\": [160, 82, 45],\n    \"silver\": [192, 192, 192],\n    \"skyblue\": [135, 206, 235],\n    \"slateblue\": [106, 90, 205],\n    \"slategray\": [112, 128, 144],\n    \"slategrey\": [112, 128, 144],\n    \"snow\": [255, 250, 250],\n    \"springgreen\": [0, 255, 127],\n    \"steelblue\": [70, 130, 180],\n    \"tan\": [210, 180, 140],\n    \"teal\": [0, 128, 128],\n    \"thistle\": [216, 191, 216],\n    \"tomato\": [255, 99, 71],\n    \"turquoise\": [64, 224, 208],\n    \"violet\": [238, 130, 238],\n    \"wheat\": [245, 222, 179],\n    \"white\": [255, 255, 255],\n    \"whitesmoke\": [245, 245, 245],\n    \"yellow\": [255, 255, 0],\n    \"yellowgreen\": [154, 205, 50]\n  };\n  /* MIT license */\n\n  var colorString = {\n    getRgba: getRgba,\n    getHsla: getHsla,\n    getRgb: getRgb,\n    getHsl: getHsl,\n    getHwb: getHwb,\n    getAlpha: getAlpha,\n    hexString: hexString,\n    rgbString: rgbString,\n    rgbaString: rgbaString,\n    percentString: percentString,\n    percentaString: percentaString,\n    hslString: hslString,\n    hslaString: hslaString,\n    hwbString: hwbString,\n    keyword: keyword\n  };\n\n  function getRgba(string) {\n    if (!string) {\n      return;\n    }\n\n    var abbr = /^#([a-fA-F0-9]{3,4})$/i,\n        hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,\n        rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n        per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n        keyword = /(\\w+)/;\n    var rgb = [0, 0, 0],\n        a = 1,\n        match = string.match(abbr),\n        hexAlpha = \"\";\n\n    if (match) {\n      match = match[1];\n      hexAlpha = match[3];\n\n      for (var i = 0; i < rgb.length; i++) {\n        rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n\n      if (hexAlpha) {\n        a = Math.round(parseInt(hexAlpha + hexAlpha, 16) / 255 * 100) / 100;\n      }\n    } else if (match = string.match(hex)) {\n      hexAlpha = match[2];\n      match = match[1];\n\n      for (var i = 0; i < rgb.length; i++) {\n        rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n\n      if (hexAlpha) {\n        a = Math.round(parseInt(hexAlpha, 16) / 255 * 100) / 100;\n      }\n    } else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n        rgb[i] = parseInt(match[i + 1]);\n      }\n\n      a = parseFloat(match[4]);\n    } else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n        rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n\n      a = parseFloat(match[4]);\n    } else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n        return [0, 0, 0, 0];\n      }\n\n      rgb = colorName$1[match[1]];\n\n      if (!rgb) {\n        return;\n      }\n    }\n\n    for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n    }\n\n    if (!a && a != 0) {\n      a = 1;\n    } else {\n      a = scale(a, 0, 1);\n    }\n\n    rgb[3] = a;\n    return rgb;\n  }\n\n  function getHsla(string) {\n    if (!string) {\n      return;\n    }\n\n    var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n    var match = string.match(hsl);\n\n    if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, s, l, a];\n    }\n  }\n\n  function getHwb(string) {\n    if (!string) {\n      return;\n    }\n\n    var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n    var match = string.match(hwb);\n\n    if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          w = scale(parseFloat(match[2]), 0, 100),\n          b = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, w, b, a];\n    }\n  }\n\n  function getRgb(string) {\n    var rgba = getRgba(string);\n    return rgba && rgba.slice(0, 3);\n  }\n\n  function getHsl(string) {\n    var hsla = getHsla(string);\n    return hsla && hsla.slice(0, 3);\n  }\n\n  function getAlpha(string) {\n    var vals = getRgba(string);\n\n    if (vals) {\n      return vals[3];\n    } else if (vals = getHsla(string)) {\n      return vals[3];\n    } else if (vals = getHwb(string)) {\n      return vals[3];\n    }\n  } // generators\n\n\n  function hexString(rgba, a) {\n    var a = a !== undefined && rgba.length === 3 ? a : rgba[3];\n    return \"#\" + hexDouble(rgba[0]) + hexDouble(rgba[1]) + hexDouble(rgba[2]) + (a >= 0 && a < 1 ? hexDouble(Math.round(a * 255)) : \"\");\n  }\n\n  function rgbString(rgba, alpha) {\n    if (alpha < 1 || rgba[3] && rgba[3] < 1) {\n      return rgbaString(rgba, alpha);\n    }\n\n    return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n  }\n\n  function rgbaString(rgba, alpha) {\n    if (alpha === undefined) {\n      alpha = rgba[3] !== undefined ? rgba[3] : 1;\n    }\n\n    return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \", \" + alpha + \")\";\n  }\n\n  function percentString(rgba, alpha) {\n    if (alpha < 1 || rgba[3] && rgba[3] < 1) {\n      return percentaString(rgba, alpha);\n    }\n\n    var r = Math.round(rgba[0] / 255 * 100),\n        g = Math.round(rgba[1] / 255 * 100),\n        b = Math.round(rgba[2] / 255 * 100);\n    return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n  }\n\n  function percentaString(rgba, alpha) {\n    var r = Math.round(rgba[0] / 255 * 100),\n        g = Math.round(rgba[1] / 255 * 100),\n        b = Math.round(rgba[2] / 255 * 100);\n    return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n  }\n\n  function hslString(hsla, alpha) {\n    if (alpha < 1 || hsla[3] && hsla[3] < 1) {\n      return hslaString(hsla, alpha);\n    }\n\n    return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n  }\n\n  function hslaString(hsla, alpha) {\n    if (alpha === undefined) {\n      alpha = hsla[3] !== undefined ? hsla[3] : 1;\n    }\n\n    return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \" + alpha + \")\";\n  } // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n  // (hwb have alpha optional & 1 is default value)\n\n\n  function hwbString(hwb, alpha) {\n    if (alpha === undefined) {\n      alpha = hwb[3] !== undefined ? hwb[3] : 1;\n    }\n\n    return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\" + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n  }\n\n  function keyword(rgb) {\n    return reverseNames[rgb.slice(0, 3)];\n  } // helpers\n\n\n  function scale(num, min, max) {\n    return Math.min(Math.max(min, num), max);\n  }\n\n  function hexDouble(num) {\n    var str = num.toString(16).toUpperCase();\n    return str.length < 2 ? \"0\" + str : str;\n  } //create a list of reverse color names\n\n\n  var reverseNames = {};\n\n  for (var name in colorName$1) {\n    reverseNames[colorName$1[name]] = name;\n  }\n  /* MIT license */\n\n\n  var Color = function Color(obj) {\n    if (obj instanceof Color) {\n      return obj;\n    }\n\n    if (!(this instanceof Color)) {\n      return new Color(obj);\n    }\n\n    this.valid = false;\n    this.values = {\n      rgb: [0, 0, 0],\n      hsl: [0, 0, 0],\n      hsv: [0, 0, 0],\n      hwb: [0, 0, 0],\n      cmyk: [0, 0, 0, 0],\n      alpha: 1\n    }; // parse Color() argument\n\n    var vals;\n\n    if (typeof obj === 'string') {\n      vals = colorString.getRgba(obj);\n\n      if (vals) {\n        this.setValues('rgb', vals);\n      } else if (vals = colorString.getHsla(obj)) {\n        this.setValues('hsl', vals);\n      } else if (vals = colorString.getHwb(obj)) {\n        this.setValues('hwb', vals);\n      }\n    } else if (_typeof(obj) === 'object') {\n      vals = obj;\n\n      if (vals.r !== undefined || vals.red !== undefined) {\n        this.setValues('rgb', vals);\n      } else if (vals.l !== undefined || vals.lightness !== undefined) {\n        this.setValues('hsl', vals);\n      } else if (vals.v !== undefined || vals.value !== undefined) {\n        this.setValues('hsv', vals);\n      } else if (vals.w !== undefined || vals.whiteness !== undefined) {\n        this.setValues('hwb', vals);\n      } else if (vals.c !== undefined || vals.cyan !== undefined) {\n        this.setValues('cmyk', vals);\n      }\n    }\n  };\n\n  Color.prototype = {\n    isValid: function isValid() {\n      return this.valid;\n    },\n    rgb: function rgb() {\n      return this.setSpace('rgb', arguments);\n    },\n    hsl: function hsl() {\n      return this.setSpace('hsl', arguments);\n    },\n    hsv: function hsv() {\n      return this.setSpace('hsv', arguments);\n    },\n    hwb: function hwb() {\n      return this.setSpace('hwb', arguments);\n    },\n    cmyk: function cmyk() {\n      return this.setSpace('cmyk', arguments);\n    },\n    rgbArray: function rgbArray() {\n      return this.values.rgb;\n    },\n    hslArray: function hslArray() {\n      return this.values.hsl;\n    },\n    hsvArray: function hsvArray() {\n      return this.values.hsv;\n    },\n    hwbArray: function hwbArray() {\n      var values = this.values;\n\n      if (values.alpha !== 1) {\n        return values.hwb.concat([values.alpha]);\n      }\n\n      return values.hwb;\n    },\n    cmykArray: function cmykArray() {\n      return this.values.cmyk;\n    },\n    rgbaArray: function rgbaArray() {\n      var values = this.values;\n      return values.rgb.concat([values.alpha]);\n    },\n    hslaArray: function hslaArray() {\n      var values = this.values;\n      return values.hsl.concat([values.alpha]);\n    },\n    alpha: function alpha(val) {\n      if (val === undefined) {\n        return this.values.alpha;\n      }\n\n      this.setValues('alpha', val);\n      return this;\n    },\n    red: function red(val) {\n      return this.setChannel('rgb', 0, val);\n    },\n    green: function green(val) {\n      return this.setChannel('rgb', 1, val);\n    },\n    blue: function blue(val) {\n      return this.setChannel('rgb', 2, val);\n    },\n    hue: function hue(val) {\n      if (val) {\n        val %= 360;\n        val = val < 0 ? 360 + val : val;\n      }\n\n      return this.setChannel('hsl', 0, val);\n    },\n    saturation: function saturation(val) {\n      return this.setChannel('hsl', 1, val);\n    },\n    lightness: function lightness(val) {\n      return this.setChannel('hsl', 2, val);\n    },\n    saturationv: function saturationv(val) {\n      return this.setChannel('hsv', 1, val);\n    },\n    whiteness: function whiteness(val) {\n      return this.setChannel('hwb', 1, val);\n    },\n    blackness: function blackness(val) {\n      return this.setChannel('hwb', 2, val);\n    },\n    value: function value(val) {\n      return this.setChannel('hsv', 2, val);\n    },\n    cyan: function cyan(val) {\n      return this.setChannel('cmyk', 0, val);\n    },\n    magenta: function magenta(val) {\n      return this.setChannel('cmyk', 1, val);\n    },\n    yellow: function yellow(val) {\n      return this.setChannel('cmyk', 2, val);\n    },\n    black: function black(val) {\n      return this.setChannel('cmyk', 3, val);\n    },\n    hexString: function hexString() {\n      return colorString.hexString(this.values.rgb);\n    },\n    rgbString: function rgbString() {\n      return colorString.rgbString(this.values.rgb, this.values.alpha);\n    },\n    rgbaString: function rgbaString() {\n      return colorString.rgbaString(this.values.rgb, this.values.alpha);\n    },\n    percentString: function percentString() {\n      return colorString.percentString(this.values.rgb, this.values.alpha);\n    },\n    hslString: function hslString() {\n      return colorString.hslString(this.values.hsl, this.values.alpha);\n    },\n    hslaString: function hslaString() {\n      return colorString.hslaString(this.values.hsl, this.values.alpha);\n    },\n    hwbString: function hwbString() {\n      return colorString.hwbString(this.values.hwb, this.values.alpha);\n    },\n    keyword: function keyword() {\n      return colorString.keyword(this.values.rgb, this.values.alpha);\n    },\n    rgbNumber: function rgbNumber() {\n      var rgb = this.values.rgb;\n      return rgb[0] << 16 | rgb[1] << 8 | rgb[2];\n    },\n    luminosity: function luminosity() {\n      // http://www.w3.org/TR/WCAG20/#relativeluminancedef\n      var rgb = this.values.rgb;\n      var lum = [];\n\n      for (var i = 0; i < rgb.length; i++) {\n        var chan = rgb[i] / 255;\n        lum[i] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4);\n      }\n\n      return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n    },\n    contrast: function contrast(color2) {\n      // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n      var lum1 = this.luminosity();\n      var lum2 = color2.luminosity();\n\n      if (lum1 > lum2) {\n        return (lum1 + 0.05) / (lum2 + 0.05);\n      }\n\n      return (lum2 + 0.05) / (lum1 + 0.05);\n    },\n    level: function level(color2) {\n      var contrastRatio = this.contrast(color2);\n\n      if (contrastRatio >= 7.1) {\n        return 'AAA';\n      }\n\n      return contrastRatio >= 4.5 ? 'AA' : '';\n    },\n    dark: function dark() {\n      // YIQ equation from http://24ways.org/2010/calculating-color-contrast\n      var rgb = this.values.rgb;\n      var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n      return yiq < 128;\n    },\n    light: function light() {\n      return !this.dark();\n    },\n    negate: function negate() {\n      var rgb = [];\n\n      for (var i = 0; i < 3; i++) {\n        rgb[i] = 255 - this.values.rgb[i];\n      }\n\n      this.setValues('rgb', rgb);\n      return this;\n    },\n    lighten: function lighten(ratio) {\n      var hsl = this.values.hsl;\n      hsl[2] += hsl[2] * ratio;\n      this.setValues('hsl', hsl);\n      return this;\n    },\n    darken: function darken(ratio) {\n      var hsl = this.values.hsl;\n      hsl[2] -= hsl[2] * ratio;\n      this.setValues('hsl', hsl);\n      return this;\n    },\n    saturate: function saturate(ratio) {\n      var hsl = this.values.hsl;\n      hsl[1] += hsl[1] * ratio;\n      this.setValues('hsl', hsl);\n      return this;\n    },\n    desaturate: function desaturate(ratio) {\n      var hsl = this.values.hsl;\n      hsl[1] -= hsl[1] * ratio;\n      this.setValues('hsl', hsl);\n      return this;\n    },\n    whiten: function whiten(ratio) {\n      var hwb = this.values.hwb;\n      hwb[1] += hwb[1] * ratio;\n      this.setValues('hwb', hwb);\n      return this;\n    },\n    blacken: function blacken(ratio) {\n      var hwb = this.values.hwb;\n      hwb[2] += hwb[2] * ratio;\n      this.setValues('hwb', hwb);\n      return this;\n    },\n    greyscale: function greyscale() {\n      var rgb = this.values.rgb; // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\n      var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n      this.setValues('rgb', [val, val, val]);\n      return this;\n    },\n    clearer: function clearer(ratio) {\n      var alpha = this.values.alpha;\n      this.setValues('alpha', alpha - alpha * ratio);\n      return this;\n    },\n    opaquer: function opaquer(ratio) {\n      var alpha = this.values.alpha;\n      this.setValues('alpha', alpha + alpha * ratio);\n      return this;\n    },\n    rotate: function rotate(degrees) {\n      var hsl = this.values.hsl;\n      var hue = (hsl[0] + degrees) % 360;\n      hsl[0] = hue < 0 ? 360 + hue : hue;\n      this.setValues('hsl', hsl);\n      return this;\n    },\n\n    /**\n     * Ported from sass implementation in C\n     * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n     */\n    mix: function mix(mixinColor, weight) {\n      var color1 = this;\n      var color2 = mixinColor;\n      var p = weight === undefined ? 0.5 : weight;\n      var w = 2 * p - 1;\n      var a = color1.alpha() - color2.alpha();\n      var w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n      var w2 = 1 - w1;\n      return this.rgb(w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue()).alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n    },\n    toJSON: function toJSON() {\n      return this.rgb();\n    },\n    clone: function clone() {\n      // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n      // making the final build way to big to embed in Chart.js. So let's do it manually,\n      // assuming that values to clone are 1 dimension arrays containing only numbers,\n      // except 'alpha' which is a number.\n      var result = new Color();\n      var source = this.values;\n      var target = result.values;\n      var value, type;\n\n      for (var prop in source) {\n        if (source.hasOwnProperty(prop)) {\n          value = source[prop];\n          type = {}.toString.call(value);\n\n          if (type === '[object Array]') {\n            target[prop] = value.slice(0);\n          } else if (type === '[object Number]') {\n            target[prop] = value;\n          } else {\n            console.error('unexpected color value:', value);\n          }\n        }\n      }\n\n      return result;\n    }\n  };\n  Color.prototype.spaces = {\n    rgb: ['red', 'green', 'blue'],\n    hsl: ['hue', 'saturation', 'lightness'],\n    hsv: ['hue', 'saturation', 'value'],\n    hwb: ['hue', 'whiteness', 'blackness'],\n    cmyk: ['cyan', 'magenta', 'yellow', 'black']\n  };\n  Color.prototype.maxes = {\n    rgb: [255, 255, 255],\n    hsl: [360, 100, 100],\n    hsv: [360, 100, 100],\n    hwb: [360, 100, 100],\n    cmyk: [100, 100, 100, 100]\n  };\n\n  Color.prototype.getValues = function (space) {\n    var values = this.values;\n    var vals = {};\n\n    for (var i = 0; i < space.length; i++) {\n      vals[space.charAt(i)] = values[space][i];\n    }\n\n    if (values.alpha !== 1) {\n      vals.a = values.alpha;\n    } // {r: 255, g: 255, b: 255, a: 0.4}\n\n\n    return vals;\n  };\n\n  Color.prototype.setValues = function (space, vals) {\n    var values = this.values;\n    var spaces = this.spaces;\n    var maxes = this.maxes;\n    var alpha = 1;\n    var i;\n    this.valid = true;\n\n    if (space === 'alpha') {\n      alpha = vals;\n    } else if (vals.length) {\n      // [10, 10, 10]\n      values[space] = vals.slice(0, space.length);\n      alpha = vals[space.length];\n    } else if (vals[space.charAt(0)] !== undefined) {\n      // {r: 10, g: 10, b: 10}\n      for (i = 0; i < space.length; i++) {\n        values[space][i] = vals[space.charAt(i)];\n      }\n\n      alpha = vals.a;\n    } else if (vals[spaces[space][0]] !== undefined) {\n      // {red: 10, green: 10, blue: 10}\n      var chans = spaces[space];\n\n      for (i = 0; i < space.length; i++) {\n        values[space][i] = vals[chans[i]];\n      }\n\n      alpha = vals.alpha;\n    }\n\n    values.alpha = Math.max(0, Math.min(1, alpha === undefined ? values.alpha : alpha));\n\n    if (space === 'alpha') {\n      return false;\n    }\n\n    var capped; // cap values of the space prior converting all values\n\n    for (i = 0; i < space.length; i++) {\n      capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n      values[space][i] = Math.round(capped);\n    } // convert to all the other color spaces\n\n\n    for (var sname in spaces) {\n      if (sname !== space) {\n        values[sname] = colorConvert[space][sname](values[space]);\n      }\n    }\n\n    return true;\n  };\n\n  Color.prototype.setSpace = function (space, args) {\n    var vals = args[0];\n\n    if (vals === undefined) {\n      // color.rgb()\n      return this.getValues(space);\n    } // color.rgb(10, 10, 10)\n\n\n    if (typeof vals === 'number') {\n      vals = Array.prototype.slice.call(args);\n    }\n\n    this.setValues(space, vals);\n    return this;\n  };\n\n  Color.prototype.setChannel = function (space, index, val) {\n    var svalues = this.values[space];\n\n    if (val === undefined) {\n      // color.red()\n      return svalues[index];\n    } else if (val === svalues[index]) {\n      // color.red(color.red())\n      return this;\n    } // color.red(100)\n\n\n    svalues[index] = val;\n    this.setValues(space, svalues);\n    return this;\n  };\n\n  if (typeof window !== 'undefined') {\n    window.Color = Color;\n  }\n\n  var chartjsColor = Color;\n\n  function isValidKey(key) {\n    return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n  }\n  /**\r\n   * @namespace Chart.helpers\r\n   */\n\n\n  var helpers = {\n    /**\r\n     * An empty function that can be used, for example, for optional callback.\r\n     */\n    noop: function noop() {},\n\n    /**\r\n     * Returns a unique id, sequentially generated from a global variable.\r\n     * @returns {number}\r\n     * @function\r\n     */\n    uid: function () {\n      var id = 0;\n      return function () {\n        return id++;\n      };\n    }(),\n\n    /**\r\n     * Returns true if `value` is neither null nor undefined, else returns false.\r\n     * @param {*} value - The value to test.\r\n     * @returns {boolean}\r\n     * @since 2.7.0\r\n     */\n    isNullOrUndef: function isNullOrUndef(value) {\n      return value === null || typeof value === 'undefined';\n    },\n\n    /**\r\n     * Returns true if `value` is an array (including typed arrays), else returns false.\r\n     * @param {*} value - The value to test.\r\n     * @returns {boolean}\r\n     * @function\r\n     */\n    isArray: function isArray(value) {\n      if (Array.isArray && Array.isArray(value)) {\n        return true;\n      }\n\n      var type = Object.prototype.toString.call(value);\n\n      if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n        return true;\n      }\n\n      return false;\n    },\n\n    /**\r\n     * Returns true if `value` is an object (excluding null), else returns false.\r\n     * @param {*} value - The value to test.\r\n     * @returns {boolean}\r\n     * @since 2.7.0\r\n     */\n    isObject: function isObject(value) {\n      return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n    },\n\n    /**\r\n     * Returns true if `value` is a finite number, else returns false\r\n     * @param {*} value  - The value to test.\r\n     * @returns {boolean}\r\n     */\n    isFinite: function (_isFinite) {\n      function isFinite(_x) {\n        return _isFinite.apply(this, arguments);\n      }\n\n      isFinite.toString = function () {\n        return _isFinite.toString();\n      };\n\n      return isFinite;\n    }(function (value) {\n      return (typeof value === 'number' || value instanceof Number) && isFinite(value);\n    }),\n\n    /**\r\n     * Returns `value` if defined, else returns `defaultValue`.\r\n     * @param {*} value - The value to return if defined.\r\n     * @param {*} defaultValue - The value to return if `value` is undefined.\r\n     * @returns {*}\r\n     */\n    valueOrDefault: function valueOrDefault(value, defaultValue) {\n      return typeof value === 'undefined' ? defaultValue : value;\n    },\n\n    /**\r\n     * Returns value at the given `index` in array if defined, else returns `defaultValue`.\r\n     * @param {Array} value - The array to lookup for value at `index`.\r\n     * @param {number} index - The index in `value` to lookup for value.\r\n     * @param {*} defaultValue - The value to return if `value[index]` is undefined.\r\n     * @returns {*}\r\n     */\n    valueAtIndexOrDefault: function valueAtIndexOrDefault(value, index, defaultValue) {\n      return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n    },\n\n    /**\r\n     * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\r\n     * value returned by `fn`. If `fn` is not a function, this method returns undefined.\r\n     * @param {function} fn - The function to call.\r\n     * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\r\n     * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\r\n     * @returns {*}\r\n     */\n    callback: function callback(fn, args, thisArg) {\n      if (fn && typeof fn.call === 'function') {\n        return fn.apply(thisArg, args);\n      }\n    },\n\n    /**\r\n     * Note(SB) for performance sake, this method should only be used when loopable type\r\n     * is unknown or in none intensive code (not called often and small loopable). Else\r\n     * it's preferable to use a regular for() loop and save extra function calls.\r\n     * @param {object|Array} loopable - The object or array to be iterated.\r\n     * @param {function} fn - The function to call for each item.\r\n     * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\r\n     * @param {boolean} [reverse] - If true, iterates backward on the loopable.\r\n     */\n    each: function each(loopable, fn, thisArg, reverse) {\n      var i, len, keys;\n\n      if (helpers.isArray(loopable)) {\n        len = loopable.length;\n\n        if (reverse) {\n          for (i = len - 1; i >= 0; i--) {\n            fn.call(thisArg, loopable[i], i);\n          }\n        } else {\n          for (i = 0; i < len; i++) {\n            fn.call(thisArg, loopable[i], i);\n          }\n        }\n      } else if (helpers.isObject(loopable)) {\n        keys = Object.keys(loopable);\n        len = keys.length;\n\n        for (i = 0; i < len; i++) {\n          fn.call(thisArg, loopable[keys[i]], keys[i]);\n        }\n      }\n    },\n\n    /**\r\n     * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\r\n     * @see https://stackoverflow.com/a/14853974\r\n     * @param {Array} a0 - The array to compare\r\n     * @param {Array} a1 - The array to compare\r\n     * @returns {boolean}\r\n     */\n    arrayEquals: function arrayEquals(a0, a1) {\n      var i, ilen, v0, v1;\n\n      if (!a0 || !a1 || a0.length !== a1.length) {\n        return false;\n      }\n\n      for (i = 0, ilen = a0.length; i < ilen; ++i) {\n        v0 = a0[i];\n        v1 = a1[i];\n\n        if (v0 instanceof Array && v1 instanceof Array) {\n          if (!helpers.arrayEquals(v0, v1)) {\n            return false;\n          }\n        } else if (v0 !== v1) {\n          // NOTE: two different object instances will never be equal: {x:20} != {x:20}\n          return false;\n        }\n      }\n\n      return true;\n    },\n\n    /**\r\n     * Returns a deep copy of `source` without keeping references on objects and arrays.\r\n     * @param {*} source - The value to clone.\r\n     * @returns {*}\r\n     */\n    clone: function clone(source) {\n      if (helpers.isArray(source)) {\n        return source.map(helpers.clone);\n      }\n\n      if (helpers.isObject(source)) {\n        var target = Object.create(source);\n        var keys = Object.keys(source);\n        var klen = keys.length;\n        var k = 0;\n\n        for (; k < klen; ++k) {\n          target[keys[k]] = helpers.clone(source[keys[k]]);\n        }\n\n        return target;\n      }\n\n      return source;\n    },\n\n    /**\r\n     * The default merger when Chart.helpers.merge is called without merger option.\r\n     * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\r\n     * @private\r\n     */\n    _merger: function _merger(key, target, source, options) {\n      if (!isValidKey(key)) {\n        // We want to ensure we do not copy prototypes over\n        // as this can pollute global namespaces\n        return;\n      }\n\n      var tval = target[key];\n      var sval = source[key];\n\n      if (helpers.isObject(tval) && helpers.isObject(sval)) {\n        helpers.merge(tval, sval, options);\n      } else {\n        target[key] = helpers.clone(sval);\n      }\n    },\n\n    /**\r\n     * Merges source[key] in target[key] only if target[key] is undefined.\r\n     * @private\r\n     */\n    _mergerIf: function _mergerIf(key, target, source) {\n      if (!isValidKey(key)) {\n        // We want to ensure we do not copy prototypes over\n        // as this can pollute global namespaces\n        return;\n      }\n\n      var tval = target[key];\n      var sval = source[key];\n\n      if (helpers.isObject(tval) && helpers.isObject(sval)) {\n        helpers.mergeIf(tval, sval);\n      } else if (!target.hasOwnProperty(key)) {\n        target[key] = helpers.clone(sval);\n      }\n    },\n\n    /**\r\n     * Recursively deep copies `source` properties into `target` with the given `options`.\r\n     * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\r\n     * @param {object} target - The target object in which all sources are merged into.\r\n     * @param {object|object[]} source - Object(s) to merge into `target`.\r\n     * @param {object} [options] - Merging options:\r\n     * @param {function} [options.merger] - The merge method (key, target, source, options)\r\n     * @returns {object} The `target` object.\r\n     */\n    merge: function merge(target, source, options) {\n      var sources = helpers.isArray(source) ? source : [source];\n      var ilen = sources.length;\n      var merge, i, keys, klen, k;\n\n      if (!helpers.isObject(target)) {\n        return target;\n      }\n\n      options = options || {};\n      merge = options.merger || helpers._merger;\n\n      for (i = 0; i < ilen; ++i) {\n        source = sources[i];\n\n        if (!helpers.isObject(source)) {\n          continue;\n        }\n\n        keys = Object.keys(source);\n\n        for (k = 0, klen = keys.length; k < klen; ++k) {\n          merge(keys[k], target, source, options);\n        }\n      }\n\n      return target;\n    },\n\n    /**\r\n     * Recursively deep copies `source` properties into `target` *only* if not defined in target.\r\n     * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\r\n     * @param {object} target - The target object in which all sources are merged into.\r\n     * @param {object|object[]} source - Object(s) to merge into `target`.\r\n     * @returns {object} The `target` object.\r\n     */\n    mergeIf: function mergeIf(target, source) {\n      return helpers.merge(target, source, {\n        merger: helpers._mergerIf\n      });\n    },\n\n    /**\r\n     * Applies the contents of two or more objects together into the first object.\r\n     * @param {object} target - The target object in which all objects are merged into.\r\n     * @param {object} arg1 - Object containing additional properties to merge in target.\r\n     * @param {object} argN - Additional objects containing properties to merge in target.\r\n     * @returns {object} The `target` object.\r\n     */\n    extend: Object.assign || function (target) {\n      return helpers.merge(target, [].slice.call(arguments, 1), {\n        merger: function merger(key, dst, src) {\n          dst[key] = src[key];\n        }\n      });\n    },\n\n    /**\r\n     * Basic javascript inheritance based on the model created in Backbone.js\r\n     */\n    inherits: function inherits(extensions) {\n      var me = this;\n      var ChartElement = extensions && extensions.hasOwnProperty('constructor') ? extensions.constructor : function () {\n        return me.apply(this, arguments);\n      };\n\n      var Surrogate = function Surrogate() {\n        this.constructor = ChartElement;\n      };\n\n      Surrogate.prototype = me.prototype;\n      ChartElement.prototype = new Surrogate();\n      ChartElement.extend = helpers.inherits;\n\n      if (extensions) {\n        helpers.extend(ChartElement.prototype, extensions);\n      }\n\n      ChartElement.__super__ = me.prototype;\n      return ChartElement;\n    },\n    _deprecated: function _deprecated(scope, value, previous, current) {\n      if (value !== undefined) {\n        console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n      }\n    }\n  };\n  var helpers_core = helpers; // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.callback instead.\r\n   * @function Chart.helpers.callCallback\r\n   * @deprecated since version 2.6.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers.callCallback = helpers.callback;\n  /**\r\n   * Provided for backward compatibility, use Array.prototype.indexOf instead.\r\n   * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\r\n   * @function Chart.helpers.indexOf\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers.indexOf = function (array, item, fromIndex) {\n    return Array.prototype.indexOf.call(array, item, fromIndex);\n  };\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\r\n   * @function Chart.helpers.getValueOrDefault\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n\n  helpers.getValueOrDefault = helpers.valueOrDefault;\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\r\n   * @function Chart.helpers.getValueAtIndexOrDefault\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n  /**\r\n   * Easing functions adapted from Robert Penner's easing equations.\r\n   * @namespace Chart.helpers.easingEffects\r\n   * @see http://www.robertpenner.com/easing/\r\n   */\n\n  var effects = {\n    linear: function linear(t) {\n      return t;\n    },\n    easeInQuad: function easeInQuad(t) {\n      return t * t;\n    },\n    easeOutQuad: function easeOutQuad(t) {\n      return -t * (t - 2);\n    },\n    easeInOutQuad: function easeInOutQuad(t) {\n      if ((t /= 0.5) < 1) {\n        return 0.5 * t * t;\n      }\n\n      return -0.5 * (--t * (t - 2) - 1);\n    },\n    easeInCubic: function easeInCubic(t) {\n      return t * t * t;\n    },\n    easeOutCubic: function easeOutCubic(t) {\n      return (t = t - 1) * t * t + 1;\n    },\n    easeInOutCubic: function easeInOutCubic(t) {\n      if ((t /= 0.5) < 1) {\n        return 0.5 * t * t * t;\n      }\n\n      return 0.5 * ((t -= 2) * t * t + 2);\n    },\n    easeInQuart: function easeInQuart(t) {\n      return t * t * t * t;\n    },\n    easeOutQuart: function easeOutQuart(t) {\n      return -((t = t - 1) * t * t * t - 1);\n    },\n    easeInOutQuart: function easeInOutQuart(t) {\n      if ((t /= 0.5) < 1) {\n        return 0.5 * t * t * t * t;\n      }\n\n      return -0.5 * ((t -= 2) * t * t * t - 2);\n    },\n    easeInQuint: function easeInQuint(t) {\n      return t * t * t * t * t;\n    },\n    easeOutQuint: function easeOutQuint(t) {\n      return (t = t - 1) * t * t * t * t + 1;\n    },\n    easeInOutQuint: function easeInOutQuint(t) {\n      if ((t /= 0.5) < 1) {\n        return 0.5 * t * t * t * t * t;\n      }\n\n      return 0.5 * ((t -= 2) * t * t * t * t + 2);\n    },\n    easeInSine: function easeInSine(t) {\n      return -Math.cos(t * (Math.PI / 2)) + 1;\n    },\n    easeOutSine: function easeOutSine(t) {\n      return Math.sin(t * (Math.PI / 2));\n    },\n    easeInOutSine: function easeInOutSine(t) {\n      return -0.5 * (Math.cos(Math.PI * t) - 1);\n    },\n    easeInExpo: function easeInExpo(t) {\n      return t === 0 ? 0 : Math.pow(2, 10 * (t - 1));\n    },\n    easeOutExpo: function easeOutExpo(t) {\n      return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1;\n    },\n    easeInOutExpo: function easeInOutExpo(t) {\n      if (t === 0) {\n        return 0;\n      }\n\n      if (t === 1) {\n        return 1;\n      }\n\n      if ((t /= 0.5) < 1) {\n        return 0.5 * Math.pow(2, 10 * (t - 1));\n      }\n\n      return 0.5 * (-Math.pow(2, -10 * --t) + 2);\n    },\n    easeInCirc: function easeInCirc(t) {\n      if (t >= 1) {\n        return t;\n      }\n\n      return -(Math.sqrt(1 - t * t) - 1);\n    },\n    easeOutCirc: function easeOutCirc(t) {\n      return Math.sqrt(1 - (t = t - 1) * t);\n    },\n    easeInOutCirc: function easeInOutCirc(t) {\n      if ((t /= 0.5) < 1) {\n        return -0.5 * (Math.sqrt(1 - t * t) - 1);\n      }\n\n      return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n    },\n    easeInElastic: function easeInElastic(t) {\n      var s = 1.70158;\n      var p = 0;\n      var a = 1;\n\n      if (t === 0) {\n        return 0;\n      }\n\n      if (t === 1) {\n        return 1;\n      }\n\n      if (!p) {\n        p = 0.3;\n      }\n\n      if (a < 1) {\n        a = 1;\n        s = p / 4;\n      } else {\n        s = p / (2 * Math.PI) * Math.asin(1 / a);\n      }\n\n      return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n    },\n    easeOutElastic: function easeOutElastic(t) {\n      var s = 1.70158;\n      var p = 0;\n      var a = 1;\n\n      if (t === 0) {\n        return 0;\n      }\n\n      if (t === 1) {\n        return 1;\n      }\n\n      if (!p) {\n        p = 0.3;\n      }\n\n      if (a < 1) {\n        a = 1;\n        s = p / 4;\n      } else {\n        s = p / (2 * Math.PI) * Math.asin(1 / a);\n      }\n\n      return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n    },\n    easeInOutElastic: function easeInOutElastic(t) {\n      var s = 1.70158;\n      var p = 0;\n      var a = 1;\n\n      if (t === 0) {\n        return 0;\n      }\n\n      if ((t /= 0.5) === 2) {\n        return 1;\n      }\n\n      if (!p) {\n        p = 0.45;\n      }\n\n      if (a < 1) {\n        a = 1;\n        s = p / 4;\n      } else {\n        s = p / (2 * Math.PI) * Math.asin(1 / a);\n      }\n\n      if (t < 1) {\n        return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n      }\n\n      return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n    },\n    easeInBack: function easeInBack(t) {\n      var s = 1.70158;\n      return t * t * ((s + 1) * t - s);\n    },\n    easeOutBack: function easeOutBack(t) {\n      var s = 1.70158;\n      return (t = t - 1) * t * ((s + 1) * t + s) + 1;\n    },\n    easeInOutBack: function easeInOutBack(t) {\n      var s = 1.70158;\n\n      if ((t /= 0.5) < 1) {\n        return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n      }\n\n      return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n    },\n    easeInBounce: function easeInBounce(t) {\n      return 1 - effects.easeOutBounce(1 - t);\n    },\n    easeOutBounce: function easeOutBounce(t) {\n      if (t < 1 / 2.75) {\n        return 7.5625 * t * t;\n      }\n\n      if (t < 2 / 2.75) {\n        return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n      }\n\n      if (t < 2.5 / 2.75) {\n        return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n      }\n\n      return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n    },\n    easeInOutBounce: function easeInOutBounce(t) {\n      if (t < 0.5) {\n        return effects.easeInBounce(t * 2) * 0.5;\n      }\n\n      return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n    }\n  };\n  var helpers_easing = {\n    effects: effects\n  }; // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\r\n   * @function Chart.helpers.easingEffects\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers_core.easingEffects = effects;\n  var PI = Math.PI;\n  var RAD_PER_DEG = PI / 180;\n  var DOUBLE_PI = PI * 2;\n  var HALF_PI = PI / 2;\n  var QUARTER_PI = PI / 4;\n  var TWO_THIRDS_PI = PI * 2 / 3;\n  /**\r\n   * @namespace Chart.helpers.canvas\r\n   */\n\n  var exports$1 = {\n    /**\r\n     * Clears the entire canvas associated to the given `chart`.\r\n     * @param {Chart} chart - The chart for which to clear the canvas.\r\n     */\n    clear: function clear(chart) {\n      chart.ctx.clearRect(0, 0, chart.width, chart.height);\n    },\n\n    /**\r\n     * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\r\n     * given size (width, height) and the same `radius` for all corners.\r\n     * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\r\n     * @param {number} x - The x axis of the coordinate for the rectangle starting point.\r\n     * @param {number} y - The y axis of the coordinate for the rectangle starting point.\r\n     * @param {number} width - The rectangle's width.\r\n     * @param {number} height - The rectangle's height.\r\n     * @param {number} radius - The rounded amount (in pixels) for the four corners.\r\n     * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\r\n     */\n    roundedRect: function roundedRect(ctx, x, y, width, height, radius) {\n      if (radius) {\n        var r = Math.min(radius, height / 2, width / 2);\n        var left = x + r;\n        var top = y + r;\n        var right = x + width - r;\n        var bottom = y + height - r;\n        ctx.moveTo(x, top);\n\n        if (left < right && top < bottom) {\n          ctx.arc(left, top, r, -PI, -HALF_PI);\n          ctx.arc(right, top, r, -HALF_PI, 0);\n          ctx.arc(right, bottom, r, 0, HALF_PI);\n          ctx.arc(left, bottom, r, HALF_PI, PI);\n        } else if (left < right) {\n          ctx.moveTo(left, y);\n          ctx.arc(right, top, r, -HALF_PI, HALF_PI);\n          ctx.arc(left, top, r, HALF_PI, PI + HALF_PI);\n        } else if (top < bottom) {\n          ctx.arc(left, top, r, -PI, 0);\n          ctx.arc(left, bottom, r, 0, PI);\n        } else {\n          ctx.arc(left, top, r, -PI, PI);\n        }\n\n        ctx.closePath();\n        ctx.moveTo(x, y);\n      } else {\n        ctx.rect(x, y, width, height);\n      }\n    },\n    drawPoint: function drawPoint(ctx, style, radius, x, y, rotation) {\n      var type, xOffset, yOffset, size, cornerRadius;\n      var rad = (rotation || 0) * RAD_PER_DEG;\n\n      if (style && _typeof(style) === 'object') {\n        type = style.toString();\n\n        if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n          ctx.save();\n          ctx.translate(x, y);\n          ctx.rotate(rad);\n          ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n          ctx.restore();\n          return;\n        }\n      }\n\n      if (isNaN(radius) || radius <= 0) {\n        return;\n      }\n\n      ctx.beginPath();\n\n      switch (style) {\n        // Default includes circle\n        default:\n          ctx.arc(x, y, radius, 0, DOUBLE_PI);\n          ctx.closePath();\n          break;\n\n        case 'triangle':\n          ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n          rad += TWO_THIRDS_PI;\n          ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n          rad += TWO_THIRDS_PI;\n          ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n          ctx.closePath();\n          break;\n\n        case 'rectRounded':\n          // NOTE: the rounded rect implementation changed to use `arc` instead of\n          // `quadraticCurveTo` since it generates better results when rect is\n          // almost a circle. 0.516 (instead of 0.5) produces results with visually\n          // closer proportion to the previous impl and it is inscribed in the\n          // circle with `radius`. For more details, see the following PRs:\n          // https://github.com/chartjs/Chart.js/issues/5597\n          // https://github.com/chartjs/Chart.js/issues/5858\n          cornerRadius = radius * 0.516;\n          size = radius - cornerRadius;\n          xOffset = Math.cos(rad + QUARTER_PI) * size;\n          yOffset = Math.sin(rad + QUARTER_PI) * size;\n          ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n          ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n          ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n          ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n          ctx.closePath();\n          break;\n\n        case 'rect':\n          if (!rotation) {\n            size = Math.SQRT1_2 * radius;\n            ctx.rect(x - size, y - size, 2 * size, 2 * size);\n            break;\n          }\n\n          rad += QUARTER_PI;\n\n        /* falls through */\n\n        case 'rectRot':\n          xOffset = Math.cos(rad) * radius;\n          yOffset = Math.sin(rad) * radius;\n          ctx.moveTo(x - xOffset, y - yOffset);\n          ctx.lineTo(x + yOffset, y - xOffset);\n          ctx.lineTo(x + xOffset, y + yOffset);\n          ctx.lineTo(x - yOffset, y + xOffset);\n          ctx.closePath();\n          break;\n\n        case 'crossRot':\n          rad += QUARTER_PI;\n\n        /* falls through */\n\n        case 'cross':\n          xOffset = Math.cos(rad) * radius;\n          yOffset = Math.sin(rad) * radius;\n          ctx.moveTo(x - xOffset, y - yOffset);\n          ctx.lineTo(x + xOffset, y + yOffset);\n          ctx.moveTo(x + yOffset, y - xOffset);\n          ctx.lineTo(x - yOffset, y + xOffset);\n          break;\n\n        case 'star':\n          xOffset = Math.cos(rad) * radius;\n          yOffset = Math.sin(rad) * radius;\n          ctx.moveTo(x - xOffset, y - yOffset);\n          ctx.lineTo(x + xOffset, y + yOffset);\n          ctx.moveTo(x + yOffset, y - xOffset);\n          ctx.lineTo(x - yOffset, y + xOffset);\n          rad += QUARTER_PI;\n          xOffset = Math.cos(rad) * radius;\n          yOffset = Math.sin(rad) * radius;\n          ctx.moveTo(x - xOffset, y - yOffset);\n          ctx.lineTo(x + xOffset, y + yOffset);\n          ctx.moveTo(x + yOffset, y - xOffset);\n          ctx.lineTo(x - yOffset, y + xOffset);\n          break;\n\n        case 'line':\n          xOffset = Math.cos(rad) * radius;\n          yOffset = Math.sin(rad) * radius;\n          ctx.moveTo(x - xOffset, y - yOffset);\n          ctx.lineTo(x + xOffset, y + yOffset);\n          break;\n\n        case 'dash':\n          ctx.moveTo(x, y);\n          ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n          break;\n      }\n\n      ctx.fill();\n      ctx.stroke();\n    },\n\n    /**\r\n     * Returns true if the point is inside the rectangle\r\n     * @param {object} point - The point to test\r\n     * @param {object} area - The rectangle\r\n     * @returns {boolean}\r\n     * @private\r\n     */\n    _isPointInArea: function _isPointInArea(point, area) {\n      var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n\n      return point.x > area.left - epsilon && point.x < area.right + epsilon && point.y > area.top - epsilon && point.y < area.bottom + epsilon;\n    },\n    clipArea: function clipArea(ctx, area) {\n      ctx.save();\n      ctx.beginPath();\n      ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n      ctx.clip();\n    },\n    unclipArea: function unclipArea(ctx) {\n      ctx.restore();\n    },\n    lineTo: function lineTo(ctx, previous, target, flip) {\n      var stepped = target.steppedLine;\n\n      if (stepped) {\n        if (stepped === 'middle') {\n          var midpoint = (previous.x + target.x) / 2.0;\n          ctx.lineTo(midpoint, flip ? target.y : previous.y);\n          ctx.lineTo(midpoint, flip ? previous.y : target.y);\n        } else if (stepped === 'after' && !flip || stepped !== 'after' && flip) {\n          ctx.lineTo(previous.x, target.y);\n        } else {\n          ctx.lineTo(target.x, previous.y);\n        }\n\n        ctx.lineTo(target.x, target.y);\n        return;\n      }\n\n      if (!target.tension) {\n        ctx.lineTo(target.x, target.y);\n        return;\n      }\n\n      ctx.bezierCurveTo(flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y);\n    }\n  };\n  var helpers_canvas = exports$1; // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\r\n   * @namespace Chart.helpers.clear\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers_core.clear = exports$1.clear;\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\r\n   * @namespace Chart.helpers.drawRoundedRectangle\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers_core.drawRoundedRectangle = function (ctx) {\n    ctx.beginPath();\n    exports$1.roundedRect.apply(exports$1, arguments);\n  };\n\n  var defaults = {\n    /**\r\n     * @private\r\n     */\n    _set: function _set(scope, values) {\n      return helpers_core.merge(this[scope] || (this[scope] = {}), values);\n    }\n  }; // TODO(v3): remove 'global' from namespace.  all default are global and\n  // there's inconsistency around which options are under 'global'\n\n  defaults._set('global', {\n    defaultColor: 'rgba(0,0,0,0.1)',\n    defaultFontColor: '#666',\n    defaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n    defaultFontSize: 12,\n    defaultFontStyle: 'normal',\n    defaultLineHeight: 1.2,\n    showLines: true\n  });\n\n  var core_defaults = defaults;\n  var valueOrDefault = helpers_core.valueOrDefault;\n  /**\r\n   * Converts the given font object into a CSS font string.\r\n   * @param {object} font - A font object.\r\n   * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\r\n   * @private\r\n   */\n\n  function toFontString(font) {\n    if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {\n      return null;\n    }\n\n    return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n  }\n  /**\r\n   * @alias Chart.helpers.options\r\n   * @namespace\r\n   */\n\n\n  var helpers_options = {\n    /**\r\n     * Converts the given line height `value` in pixels for a specific font `size`.\r\n     * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\r\n     * @param {number} size - The font size (in pixels) used to resolve relative `value`.\r\n     * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).\r\n     * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\r\n     * @since 2.7.0\r\n     */\n    toLineHeight: function toLineHeight(value, size) {\n      var matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n\n      if (!matches || matches[1] === 'normal') {\n        return size * 1.2;\n      }\n\n      value = +matches[2];\n\n      switch (matches[3]) {\n        case 'px':\n          return value;\n\n        case '%':\n          value /= 100;\n          break;\n      }\n\n      return size * value;\n    },\n\n    /**\r\n     * Converts the given value into a padding object with pre-computed width/height.\r\n     * @param {number|object} value - If a number, set the value to all TRBL component,\r\n     *  else, if and object, use defined properties and sets undefined ones to 0.\r\n     * @returns {object} The padding values (top, right, bottom, left, width, height)\r\n     * @since 2.7.0\r\n     */\n    toPadding: function toPadding(value) {\n      var t, r, b, l;\n\n      if (helpers_core.isObject(value)) {\n        t = +value.top || 0;\n        r = +value.right || 0;\n        b = +value.bottom || 0;\n        l = +value.left || 0;\n      } else {\n        t = r = b = l = +value || 0;\n      }\n\n      return {\n        top: t,\n        right: r,\n        bottom: b,\n        left: l,\n        height: t + b,\n        width: l + r\n      };\n    },\n\n    /**\r\n     * Parses font options and returns the font object.\r\n     * @param {object} options - A object that contains font options to be parsed.\r\n     * @return {object} The font object.\r\n     * @todo Support font.* options and renamed to toFont().\r\n     * @private\r\n     */\n    _parseFont: function _parseFont(options) {\n      var globalDefaults = core_defaults.global;\n      var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n      var font = {\n        family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),\n        lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),\n        size: size,\n        style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),\n        weight: null,\n        string: ''\n      };\n      font.string = toFontString(font);\n      return font;\n    },\n\n    /**\r\n     * Evaluates the given `inputs` sequentially and returns the first defined value.\r\n     * @param {Array} inputs - An array of values, falling back to the last value.\r\n     * @param {object} [context] - If defined and the current value is a function, the value\r\n     * is called with `context` as first argument and the result becomes the new input.\r\n     * @param {number} [index] - If defined and the current value is an array, the value\r\n     * at `index` become the new input.\r\n     * @param {object} [info] - object to return information about resolution in\r\n     * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable.\r\n     * @since 2.7.0\r\n     */\n    resolve: function resolve(inputs, context, index, info) {\n      var cacheable = true;\n      var i, ilen, value;\n\n      for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n        value = inputs[i];\n\n        if (value === undefined) {\n          continue;\n        }\n\n        if (context !== undefined && typeof value === 'function') {\n          value = value(context);\n          cacheable = false;\n        }\n\n        if (index !== undefined && helpers_core.isArray(value)) {\n          value = value[index];\n          cacheable = false;\n        }\n\n        if (value !== undefined) {\n          if (info && !cacheable) {\n            info.cacheable = false;\n          }\n\n          return value;\n        }\n      }\n    }\n  };\n  /**\r\n   * @alias Chart.helpers.math\r\n   * @namespace\r\n   */\n\n  var exports$2 = {\n    /**\r\n     * Returns an array of factors sorted from 1 to sqrt(value)\r\n     * @private\r\n     */\n    _factorize: function _factorize(value) {\n      var result = [];\n      var sqrt = Math.sqrt(value);\n      var i;\n\n      for (i = 1; i < sqrt; i++) {\n        if (value % i === 0) {\n          result.push(i);\n          result.push(value / i);\n        }\n      }\n\n      if (sqrt === (sqrt | 0)) {\n        // if value is a square number\n        result.push(sqrt);\n      }\n\n      result.sort(function (a, b) {\n        return a - b;\n      }).pop();\n      return result;\n    },\n    log10: Math.log10 || function (x) {\n      var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\n      // Check for whole powers of 10,\n      // which due to floating point rounding error should be corrected.\n\n      var powerOf10 = Math.round(exponent);\n      var isPowerOf10 = x === Math.pow(10, powerOf10);\n      return isPowerOf10 ? powerOf10 : exponent;\n    }\n  };\n  var helpers_math = exports$2; // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.math.log10 instead.\r\n   * @namespace Chart.helpers.log10\r\n   * @deprecated since version 2.9.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers_core.log10 = exports$2.log10;\n\n  var getRtlAdapter = function getRtlAdapter(rectX, width) {\n    return {\n      x: function x(_x2) {\n        return rectX + rectX + width - _x2;\n      },\n      setWidth: function setWidth(w) {\n        width = w;\n      },\n      textAlign: function textAlign(align) {\n        if (align === 'center') {\n          return align;\n        }\n\n        return align === 'right' ? 'left' : 'right';\n      },\n      xPlus: function xPlus(x, value) {\n        return x - value;\n      },\n      leftForLtr: function leftForLtr(x, itemWidth) {\n        return x - itemWidth;\n      }\n    };\n  };\n\n  var getLtrAdapter = function getLtrAdapter() {\n    return {\n      x: function x(_x3) {\n        return _x3;\n      },\n      setWidth: function setWidth(w) {// eslint-disable-line no-unused-vars\n      },\n      textAlign: function textAlign(align) {\n        return align;\n      },\n      xPlus: function xPlus(x, value) {\n        return x + value;\n      },\n      leftForLtr: function leftForLtr(x, _itemWidth) {\n        // eslint-disable-line no-unused-vars\n        return x;\n      }\n    };\n  };\n\n  var getAdapter = function getAdapter(rtl, rectX, width) {\n    return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter();\n  };\n\n  var overrideTextDirection = function overrideTextDirection(ctx, direction) {\n    var style, original;\n\n    if (direction === 'ltr' || direction === 'rtl') {\n      style = ctx.canvas.style;\n      original = [style.getPropertyValue('direction'), style.getPropertyPriority('direction')];\n      style.setProperty('direction', direction, 'important');\n      ctx.prevTextDirection = original;\n    }\n  };\n\n  var restoreTextDirection = function restoreTextDirection(ctx) {\n    var original = ctx.prevTextDirection;\n\n    if (original !== undefined) {\n      delete ctx.prevTextDirection;\n      ctx.canvas.style.setProperty('direction', original[0], original[1]);\n    }\n  };\n\n  var helpers_rtl = {\n    getRtlAdapter: getAdapter,\n    overrideTextDirection: overrideTextDirection,\n    restoreTextDirection: restoreTextDirection\n  };\n  var helpers$1 = helpers_core;\n  var easing = helpers_easing;\n  var canvas = helpers_canvas;\n  var options = helpers_options;\n  var math = helpers_math;\n  var rtl = helpers_rtl;\n  helpers$1.easing = easing;\n  helpers$1.canvas = canvas;\n  helpers$1.options = options;\n  helpers$1.math = math;\n  helpers$1.rtl = rtl;\n\n  function interpolate(start, view, model, ease) {\n    var keys = Object.keys(model);\n    var i, ilen, key, actual, origin, target, type, c0, c1;\n\n    for (i = 0, ilen = keys.length; i < ilen; ++i) {\n      key = keys[i];\n      target = model[key]; // if a value is added to the model after pivot() has been called, the view\n      // doesn't contain it, so let's initialize the view to the target value.\n\n      if (!view.hasOwnProperty(key)) {\n        view[key] = target;\n      }\n\n      actual = view[key];\n\n      if (actual === target || key[0] === '_') {\n        continue;\n      }\n\n      if (!start.hasOwnProperty(key)) {\n        start[key] = actual;\n      }\n\n      origin = start[key];\n      type = _typeof(target);\n\n      if (type === _typeof(origin)) {\n        if (type === 'string') {\n          c0 = chartjsColor(origin);\n\n          if (c0.valid) {\n            c1 = chartjsColor(target);\n\n            if (c1.valid) {\n              view[key] = c1.mix(c0, ease).rgbString();\n              continue;\n            }\n          }\n        } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {\n          view[key] = origin + (target - origin) * ease;\n          continue;\n        }\n      }\n\n      view[key] = target;\n    }\n  }\n\n  var Element = function Element(configuration) {\n    helpers$1.extend(this, configuration);\n    this.initialize.apply(this, arguments);\n  };\n\n  helpers$1.extend(Element.prototype, {\n    _type: undefined,\n    initialize: function initialize() {\n      this.hidden = false;\n    },\n    pivot: function pivot() {\n      var me = this;\n\n      if (!me._view) {\n        me._view = helpers$1.extend({}, me._model);\n      }\n\n      me._start = {};\n      return me;\n    },\n    transition: function transition(ease) {\n      var me = this;\n      var model = me._model;\n      var start = me._start;\n      var view = me._view; // No animation -> No Transition\n\n      if (!model || ease === 1) {\n        me._view = helpers$1.extend({}, model);\n        me._start = null;\n        return me;\n      }\n\n      if (!view) {\n        view = me._view = {};\n      }\n\n      if (!start) {\n        start = me._start = {};\n      }\n\n      interpolate(start, view, model, ease);\n      return me;\n    },\n    tooltipPosition: function tooltipPosition() {\n      return {\n        x: this._model.x,\n        y: this._model.y\n      };\n    },\n    hasValue: function hasValue() {\n      return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);\n    }\n  });\n  Element.extend = helpers$1.inherits;\n  var core_element = Element;\n  var exports$3 = core_element.extend({\n    chart: null,\n    // the animation associated chart instance\n    currentStep: 0,\n    // the current animation step\n    numSteps: 60,\n    // default number of steps\n    easing: '',\n    // the easing to use for this animation\n    render: null,\n    // render function used by the animation service\n    onAnimationProgress: null,\n    // user specified callback to fire on each step of the animation\n    onAnimationComplete: null // user specified callback to fire when the animation finishes\n\n  });\n  var core_animation = exports$3; // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, use Chart.Animation instead\r\n   * @prop Chart.Animation#animationObject\r\n   * @deprecated since version 2.6.0\r\n   * @todo remove at version 3\r\n   */\n\n  Object.defineProperty(exports$3.prototype, 'animationObject', {\n    get: function get() {\n      return this;\n    }\n  });\n  /**\r\n   * Provided for backward compatibility, use Chart.Animation#chart instead\r\n   * @prop Chart.Animation#chartInstance\r\n   * @deprecated since version 2.6.0\r\n   * @todo remove at version 3\r\n   */\n\n  Object.defineProperty(exports$3.prototype, 'chartInstance', {\n    get: function get() {\n      return this.chart;\n    },\n    set: function set(value) {\n      this.chart = value;\n    }\n  });\n\n  core_defaults._set('global', {\n    animation: {\n      duration: 1000,\n      easing: 'easeOutQuart',\n      onProgress: helpers$1.noop,\n      onComplete: helpers$1.noop\n    }\n  });\n\n  var core_animations = {\n    animations: [],\n    request: null,\n\n    /**\r\n     * @param {Chart} chart - The chart to animate.\r\n     * @param {Chart.Animation} animation - The animation that we will animate.\r\n     * @param {number} duration - The animation duration in ms.\r\n     * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\r\n     */\n    addAnimation: function addAnimation(chart, animation, duration, lazy) {\n      var animations = this.animations;\n      var i, ilen;\n      animation.chart = chart;\n      animation.startTime = Date.now();\n      animation.duration = duration;\n\n      if (!lazy) {\n        chart.animating = true;\n      }\n\n      for (i = 0, ilen = animations.length; i < ilen; ++i) {\n        if (animations[i].chart === chart) {\n          animations[i] = animation;\n          return;\n        }\n      }\n\n      animations.push(animation); // If there are no animations queued, manually kickstart a digest, for lack of a better word\n\n      if (animations.length === 1) {\n        this.requestAnimationFrame();\n      }\n    },\n    cancelAnimation: function cancelAnimation(chart) {\n      var index = helpers$1.findIndex(this.animations, function (animation) {\n        return animation.chart === chart;\n      });\n\n      if (index !== -1) {\n        this.animations.splice(index, 1);\n        chart.animating = false;\n      }\n    },\n    requestAnimationFrame: function requestAnimationFrame() {\n      var me = this;\n\n      if (me.request === null) {\n        // Skip animation frame requests until the active one is executed.\n        // This can happen when processing mouse events, e.g. 'mousemove'\n        // and 'mouseout' events will trigger multiple renders.\n        me.request = helpers$1.requestAnimFrame.call(window, function () {\n          me.request = null;\n          me.startDigest();\n        });\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    startDigest: function startDigest() {\n      var me = this;\n      me.advance(); // Do we have more stuff to animate?\n\n      if (me.animations.length > 0) {\n        me.requestAnimationFrame();\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    advance: function advance() {\n      var animations = this.animations;\n      var animation, chart, numSteps, nextStep;\n      var i = 0; // 1 animation per chart, so we are looping charts here\n\n      while (i < animations.length) {\n        animation = animations[i];\n        chart = animation.chart;\n        numSteps = animation.numSteps; // Make sure that currentStep starts at 1\n        // https://github.com/chartjs/Chart.js/issues/6104\n\n        nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;\n        animation.currentStep = Math.min(nextStep, numSteps);\n        helpers$1.callback(animation.render, [chart, animation], chart);\n        helpers$1.callback(animation.onAnimationProgress, [animation], chart);\n\n        if (animation.currentStep >= numSteps) {\n          helpers$1.callback(animation.onAnimationComplete, [animation], chart);\n          chart.animating = false;\n          animations.splice(i, 1);\n        } else {\n          ++i;\n        }\n      }\n    }\n  };\n  var resolve = helpers$1.options.resolve;\n  var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n  /**\r\n   * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\r\n   * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\r\n   * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\r\n   */\n\n  function listenArrayEvents(array, listener) {\n    if (array._chartjs) {\n      array._chartjs.listeners.push(listener);\n\n      return;\n    }\n\n    Object.defineProperty(array, '_chartjs', {\n      configurable: true,\n      enumerable: false,\n      value: {\n        listeners: [listener]\n      }\n    });\n    arrayEvents.forEach(function (key) {\n      var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n      var base = array[key];\n      Object.defineProperty(array, key, {\n        configurable: true,\n        enumerable: false,\n        value: function value() {\n          var args = Array.prototype.slice.call(arguments);\n          var res = base.apply(this, args);\n          helpers$1.each(array._chartjs.listeners, function (object) {\n            if (typeof object[method] === 'function') {\n              object[method].apply(object, args);\n            }\n          });\n          return res;\n        }\n      });\n    });\n  }\n  /**\r\n   * Removes the given array event listener and cleanup extra attached properties (such as\r\n   * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\r\n   */\n\n\n  function unlistenArrayEvents(array, listener) {\n    var stub = array._chartjs;\n\n    if (!stub) {\n      return;\n    }\n\n    var listeners = stub.listeners;\n    var index = listeners.indexOf(listener);\n\n    if (index !== -1) {\n      listeners.splice(index, 1);\n    }\n\n    if (listeners.length > 0) {\n      return;\n    }\n\n    arrayEvents.forEach(function (key) {\n      delete array[key];\n    });\n    delete array._chartjs;\n  } // Base class for all dataset controllers (line, bar, etc)\n\n\n  var DatasetController = function DatasetController(chart, datasetIndex) {\n    this.initialize(chart, datasetIndex);\n  };\n\n  helpers$1.extend(DatasetController.prototype, {\n    /**\r\n     * Element type used to generate a meta dataset (e.g. Chart.element.Line).\r\n     * @type {Chart.core.element}\r\n     */\n    datasetElementType: null,\n\n    /**\r\n     * Element type used to generate a meta data (e.g. Chart.element.Point).\r\n     * @type {Chart.core.element}\r\n     */\n    dataElementType: null,\n\n    /**\r\n     * Dataset element option keys to be resolved in _resolveDatasetElementOptions.\r\n     * A derived controller may override this to resolve controller-specific options.\r\n     * The keys defined here are for backward compatibility for legend styles.\r\n     * @private\r\n     */\n    _datasetElementOptions: ['backgroundColor', 'borderCapStyle', 'borderColor', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'borderWidth'],\n\n    /**\r\n     * Data element option keys to be resolved in _resolveDataElementOptions.\r\n     * A derived controller may override this to resolve controller-specific options.\r\n     * The keys defined here are for backward compatibility for legend styles.\r\n     * @private\r\n     */\n    _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'pointStyle'],\n    initialize: function initialize(chart, datasetIndex) {\n      var me = this;\n      me.chart = chart;\n      me.index = datasetIndex;\n      me.linkScales();\n      me.addElements();\n      me._type = me.getMeta().type;\n    },\n    updateIndex: function updateIndex(datasetIndex) {\n      this.index = datasetIndex;\n    },\n    linkScales: function linkScales() {\n      var me = this;\n      var meta = me.getMeta();\n      var chart = me.chart;\n      var scales = chart.scales;\n      var dataset = me.getDataset();\n      var scalesOpts = chart.options.scales;\n\n      if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) {\n        meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id;\n      }\n\n      if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) {\n        meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id;\n      }\n    },\n    getDataset: function getDataset() {\n      return this.chart.data.datasets[this.index];\n    },\n    getMeta: function getMeta() {\n      return this.chart.getDatasetMeta(this.index);\n    },\n    getScaleForId: function getScaleForId(scaleID) {\n      return this.chart.scales[scaleID];\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getValueScaleId: function _getValueScaleId() {\n      return this.getMeta().yAxisID;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getIndexScaleId: function _getIndexScaleId() {\n      return this.getMeta().xAxisID;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getValueScale: function _getValueScale() {\n      return this.getScaleForId(this._getValueScaleId());\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getIndexScale: function _getIndexScale() {\n      return this.getScaleForId(this._getIndexScaleId());\n    },\n    reset: function reset() {\n      this._update(true);\n    },\n\n    /**\r\n     * @private\r\n     */\n    destroy: function destroy() {\n      if (this._data) {\n        unlistenArrayEvents(this._data, this);\n      }\n    },\n    createMetaDataset: function createMetaDataset() {\n      var me = this;\n      var type = me.datasetElementType;\n      return type && new type({\n        _chart: me.chart,\n        _datasetIndex: me.index\n      });\n    },\n    createMetaData: function createMetaData(index) {\n      var me = this;\n      var type = me.dataElementType;\n      return type && new type({\n        _chart: me.chart,\n        _datasetIndex: me.index,\n        _index: index\n      });\n    },\n    addElements: function addElements() {\n      var me = this;\n      var meta = me.getMeta();\n      var data = me.getDataset().data || [];\n      var metaData = meta.data;\n      var i, ilen;\n\n      for (i = 0, ilen = data.length; i < ilen; ++i) {\n        metaData[i] = metaData[i] || me.createMetaData(i);\n      }\n\n      meta.dataset = meta.dataset || me.createMetaDataset();\n    },\n    addElementAndReset: function addElementAndReset(index) {\n      var element = this.createMetaData(index);\n      this.getMeta().data.splice(index, 0, element);\n      this.updateElement(element, index, true);\n    },\n    buildOrUpdateElements: function buildOrUpdateElements() {\n      var me = this;\n      var dataset = me.getDataset();\n      var data = dataset.data || (dataset.data = []); // In order to correctly handle data addition/deletion animation (an thus simulate\n      // real-time charts), we need to monitor these data modifications and synchronize\n      // the internal meta data accordingly.\n\n      if (me._data !== data) {\n        if (me._data) {\n          // This case happens when the user replaced the data array instance.\n          unlistenArrayEvents(me._data, me);\n        }\n\n        if (data && Object.isExtensible(data)) {\n          listenArrayEvents(data, me);\n        }\n\n        me._data = data;\n      } // Re-sync meta data in case the user replaced the data array or if we missed\n      // any updates and so make sure that we handle number of datapoints changing.\n\n\n      me.resyncElements();\n    },\n\n    /**\r\n     * Returns the merged user-supplied and default dataset-level options\r\n     * @private\r\n     */\n    _configure: function _configure() {\n      var me = this;\n      me._config = helpers$1.merge(Object.create(null), [me.chart.options.datasets[me._type], me.getDataset()], {\n        merger: function merger(key, target, source) {\n          if (key !== '_meta' && key !== 'data') {\n            helpers$1._merger(key, target, source);\n          }\n        }\n      });\n    },\n    _update: function _update(reset) {\n      var me = this;\n\n      me._configure();\n\n      me._cachedDataOpts = null;\n      me.update(reset);\n    },\n    update: helpers$1.noop,\n    transition: function transition(easingValue) {\n      var meta = this.getMeta();\n      var elements = meta.data || [];\n      var ilen = elements.length;\n      var i = 0;\n\n      for (; i < ilen; ++i) {\n        elements[i].transition(easingValue);\n      }\n\n      if (meta.dataset) {\n        meta.dataset.transition(easingValue);\n      }\n    },\n    draw: function draw() {\n      var meta = this.getMeta();\n      var elements = meta.data || [];\n      var ilen = elements.length;\n      var i = 0;\n\n      if (meta.dataset) {\n        meta.dataset.draw();\n      }\n\n      for (; i < ilen; ++i) {\n        elements[i].draw();\n      }\n    },\n\n    /**\r\n     * Returns a set of predefined style properties that should be used to represent the dataset\r\n     * or the data if the index is specified\r\n     * @param {number} index - data index\r\n     * @return {IStyleInterface} style object\r\n     */\n    getStyle: function getStyle(index) {\n      var me = this;\n      var meta = me.getMeta();\n      var dataset = meta.dataset;\n      var style;\n\n      me._configure();\n\n      if (dataset && index === undefined) {\n        style = me._resolveDatasetElementOptions(dataset || {});\n      } else {\n        index = index || 0;\n        style = me._resolveDataElementOptions(meta.data[index] || {}, index);\n      }\n\n      if (style.fill === false || style.fill === null) {\n        style.backgroundColor = style.borderColor;\n      }\n\n      return style;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _resolveDatasetElementOptions: function _resolveDatasetElementOptions(element, hover) {\n      var me = this;\n      var chart = me.chart;\n      var datasetOpts = me._config;\n      var custom = element.custom || {};\n      var options = chart.options.elements[me.datasetElementType.prototype._type] || {};\n      var elementOptions = me._datasetElementOptions;\n      var values = {};\n      var i, ilen, key, readKey; // Scriptable options\n\n      var context = {\n        chart: chart,\n        dataset: me.getDataset(),\n        datasetIndex: me.index,\n        hover: hover\n      };\n\n      for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {\n        key = elementOptions[i];\n        readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;\n        values[key] = resolve([custom[readKey], datasetOpts[readKey], options[readKey]], context);\n      }\n\n      return values;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _resolveDataElementOptions: function _resolveDataElementOptions(element, index) {\n      var me = this;\n      var custom = element && element.custom;\n      var cached = me._cachedDataOpts;\n\n      if (cached && !custom) {\n        return cached;\n      }\n\n      var chart = me.chart;\n      var datasetOpts = me._config;\n      var options = chart.options.elements[me.dataElementType.prototype._type] || {};\n      var elementOptions = me._dataElementOptions;\n      var values = {}; // Scriptable options\n\n      var context = {\n        chart: chart,\n        dataIndex: index,\n        dataset: me.getDataset(),\n        datasetIndex: me.index\n      }; // `resolve` sets cacheable to `false` if any option is indexed or scripted\n\n      var info = {\n        cacheable: !custom\n      };\n      var keys, i, ilen, key;\n      custom = custom || {};\n\n      if (helpers$1.isArray(elementOptions)) {\n        for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {\n          key = elementOptions[i];\n          values[key] = resolve([custom[key], datasetOpts[key], options[key]], context, index, info);\n        }\n      } else {\n        keys = Object.keys(elementOptions);\n\n        for (i = 0, ilen = keys.length; i < ilen; ++i) {\n          key = keys[i];\n          values[key] = resolve([custom[key], datasetOpts[elementOptions[key]], datasetOpts[key], options[key]], context, index, info);\n        }\n      }\n\n      if (info.cacheable) {\n        me._cachedDataOpts = Object.freeze(values);\n      }\n\n      return values;\n    },\n    removeHoverStyle: function removeHoverStyle(element) {\n      helpers$1.merge(element._model, element.$previousStyle || {});\n      delete element.$previousStyle;\n    },\n    setHoverStyle: function setHoverStyle(element) {\n      var dataset = this.chart.data.datasets[element._datasetIndex];\n      var index = element._index;\n      var custom = element.custom || {};\n      var model = element._model;\n      var getHoverColor = helpers$1.getHoverColor;\n      element.$previousStyle = {\n        backgroundColor: model.backgroundColor,\n        borderColor: model.borderColor,\n        borderWidth: model.borderWidth\n      };\n      model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);\n      model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);\n      model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _removeDatasetHoverStyle: function _removeDatasetHoverStyle() {\n      var element = this.getMeta().dataset;\n\n      if (element) {\n        this.removeHoverStyle(element);\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    _setDatasetHoverStyle: function _setDatasetHoverStyle() {\n      var element = this.getMeta().dataset;\n      var prev = {};\n      var i, ilen, key, keys, hoverOptions, model;\n\n      if (!element) {\n        return;\n      }\n\n      model = element._model;\n      hoverOptions = this._resolveDatasetElementOptions(element, true);\n      keys = Object.keys(hoverOptions);\n\n      for (i = 0, ilen = keys.length; i < ilen; ++i) {\n        key = keys[i];\n        prev[key] = model[key];\n        model[key] = hoverOptions[key];\n      }\n\n      element.$previousStyle = prev;\n    },\n\n    /**\r\n     * @private\r\n     */\n    resyncElements: function resyncElements() {\n      var me = this;\n      var meta = me.getMeta();\n      var data = me.getDataset().data;\n      var numMeta = meta.data.length;\n      var numData = data.length;\n\n      if (numData < numMeta) {\n        meta.data.splice(numData, numMeta - numData);\n      } else if (numData > numMeta) {\n        me.insertElements(numMeta, numData - numMeta);\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    insertElements: function insertElements(start, count) {\n      for (var i = 0; i < count; ++i) {\n        this.addElementAndReset(start + i);\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    onDataPush: function onDataPush() {\n      var count = arguments.length;\n      this.insertElements(this.getDataset().data.length - count, count);\n    },\n\n    /**\r\n     * @private\r\n     */\n    onDataPop: function onDataPop() {\n      this.getMeta().data.pop();\n    },\n\n    /**\r\n     * @private\r\n     */\n    onDataShift: function onDataShift() {\n      this.getMeta().data.shift();\n    },\n\n    /**\r\n     * @private\r\n     */\n    onDataSplice: function onDataSplice(start, count) {\n      this.getMeta().data.splice(start, count);\n      this.insertElements(start, arguments.length - 2);\n    },\n\n    /**\r\n     * @private\r\n     */\n    onDataUnshift: function onDataUnshift() {\n      this.insertElements(0, arguments.length);\n    }\n  });\n  DatasetController.extend = helpers$1.inherits;\n  var core_datasetController = DatasetController;\n  var TAU = Math.PI * 2;\n\n  core_defaults._set('global', {\n    elements: {\n      arc: {\n        backgroundColor: core_defaults.global.defaultColor,\n        borderColor: '#fff',\n        borderWidth: 2,\n        borderAlign: 'center'\n      }\n    }\n  });\n\n  function clipArc(ctx, arc) {\n    var startAngle = arc.startAngle;\n    var endAngle = arc.endAngle;\n    var pixelMargin = arc.pixelMargin;\n    var angleMargin = pixelMargin / arc.outerRadius;\n    var x = arc.x;\n    var y = arc.y; // Draw an inner border by cliping the arc and drawing a double-width border\n    // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n\n    ctx.beginPath();\n    ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n\n    if (arc.innerRadius > pixelMargin) {\n      angleMargin = pixelMargin / arc.innerRadius;\n      ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true);\n    } else {\n      ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2);\n    }\n\n    ctx.closePath();\n    ctx.clip();\n  }\n\n  function drawFullCircleBorders(ctx, vm, arc, inner) {\n    var endAngle = arc.endAngle;\n    var i;\n\n    if (inner) {\n      arc.endAngle = arc.startAngle + TAU;\n      clipArc(ctx, arc);\n      arc.endAngle = endAngle;\n\n      if (arc.endAngle === arc.startAngle && arc.fullCircles) {\n        arc.endAngle += TAU;\n        arc.fullCircles--;\n      }\n    }\n\n    ctx.beginPath();\n    ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true);\n\n    for (i = 0; i < arc.fullCircles; ++i) {\n      ctx.stroke();\n    }\n\n    ctx.beginPath();\n    ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU);\n\n    for (i = 0; i < arc.fullCircles; ++i) {\n      ctx.stroke();\n    }\n  }\n\n  function drawBorder(ctx, vm, arc) {\n    var inner = vm.borderAlign === 'inner';\n\n    if (inner) {\n      ctx.lineWidth = vm.borderWidth * 2;\n      ctx.lineJoin = 'round';\n    } else {\n      ctx.lineWidth = vm.borderWidth;\n      ctx.lineJoin = 'bevel';\n    }\n\n    if (arc.fullCircles) {\n      drawFullCircleBorders(ctx, vm, arc, inner);\n    }\n\n    if (inner) {\n      clipArc(ctx, arc);\n    }\n\n    ctx.beginPath();\n    ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle);\n    ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\n    ctx.closePath();\n    ctx.stroke();\n  }\n\n  var element_arc = core_element.extend({\n    _type: 'arc',\n    inLabelRange: function inLabelRange(mouseX) {\n      var vm = this._view;\n\n      if (vm) {\n        return Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2);\n      }\n\n      return false;\n    },\n    inRange: function inRange(chartX, chartY) {\n      var vm = this._view;\n\n      if (vm) {\n        var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {\n          x: chartX,\n          y: chartY\n        });\n        var angle = pointRelativePosition.angle;\n        var distance = pointRelativePosition.distance; // Sanitise angle range\n\n        var startAngle = vm.startAngle;\n        var endAngle = vm.endAngle;\n\n        while (endAngle < startAngle) {\n          endAngle += TAU;\n        }\n\n        while (angle > endAngle) {\n          angle -= TAU;\n        }\n\n        while (angle < startAngle) {\n          angle += TAU;\n        } // Check if within the range of the open/close angle\n\n\n        var betweenAngles = angle >= startAngle && angle <= endAngle;\n        var withinRadius = distance >= vm.innerRadius && distance <= vm.outerRadius;\n        return betweenAngles && withinRadius;\n      }\n\n      return false;\n    },\n    getCenterPoint: function getCenterPoint() {\n      var vm = this._view;\n      var halfAngle = (vm.startAngle + vm.endAngle) / 2;\n      var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n      return {\n        x: vm.x + Math.cos(halfAngle) * halfRadius,\n        y: vm.y + Math.sin(halfAngle) * halfRadius\n      };\n    },\n    getArea: function getArea() {\n      var vm = this._view;\n      return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n    },\n    tooltipPosition: function tooltipPosition() {\n      var vm = this._view;\n      var centreAngle = vm.startAngle + (vm.endAngle - vm.startAngle) / 2;\n      var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n      return {\n        x: vm.x + Math.cos(centreAngle) * rangeFromCentre,\n        y: vm.y + Math.sin(centreAngle) * rangeFromCentre\n      };\n    },\n    draw: function draw() {\n      var ctx = this._chart.ctx;\n      var vm = this._view;\n      var pixelMargin = vm.borderAlign === 'inner' ? 0.33 : 0;\n      var arc = {\n        x: vm.x,\n        y: vm.y,\n        innerRadius: vm.innerRadius,\n        outerRadius: Math.max(vm.outerRadius - pixelMargin, 0),\n        pixelMargin: pixelMargin,\n        startAngle: vm.startAngle,\n        endAngle: vm.endAngle,\n        fullCircles: Math.floor(vm.circumference / TAU)\n      };\n      var i;\n      ctx.save();\n      ctx.fillStyle = vm.backgroundColor;\n      ctx.strokeStyle = vm.borderColor;\n\n      if (arc.fullCircles) {\n        arc.endAngle = arc.startAngle + TAU;\n        ctx.beginPath();\n        ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);\n        ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\n        ctx.closePath();\n\n        for (i = 0; i < arc.fullCircles; ++i) {\n          ctx.fill();\n        }\n\n        arc.endAngle = arc.startAngle + vm.circumference % TAU;\n      }\n\n      ctx.beginPath();\n      ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);\n      ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\n      ctx.closePath();\n      ctx.fill();\n\n      if (vm.borderWidth) {\n        drawBorder(ctx, vm, arc);\n      }\n\n      ctx.restore();\n    }\n  });\n  var valueOrDefault$1 = helpers$1.valueOrDefault;\n  var defaultColor = core_defaults.global.defaultColor;\n\n  core_defaults._set('global', {\n    elements: {\n      line: {\n        tension: 0.4,\n        backgroundColor: defaultColor,\n        borderWidth: 3,\n        borderColor: defaultColor,\n        borderCapStyle: 'butt',\n        borderDash: [],\n        borderDashOffset: 0.0,\n        borderJoinStyle: 'miter',\n        capBezierPoints: true,\n        fill: true // do we fill in the area between the line and its base axis\n\n      }\n    }\n  });\n\n  var element_line = core_element.extend({\n    _type: 'line',\n    draw: function draw() {\n      var me = this;\n      var vm = me._view;\n      var ctx = me._chart.ctx;\n      var spanGaps = vm.spanGaps;\n\n      var points = me._children.slice(); // clone array\n\n\n      var globalDefaults = core_defaults.global;\n      var globalOptionLineElements = globalDefaults.elements.line;\n      var lastDrawnIndex = -1;\n      var closePath = me._loop;\n      var index, previous, currentVM;\n\n      if (!points.length) {\n        return;\n      }\n\n      if (me._loop) {\n        for (index = 0; index < points.length; ++index) {\n          previous = helpers$1.previousItem(points, index); // If the line has an open path, shift the point array\n\n          if (!points[index]._view.skip && previous._view.skip) {\n            points = points.slice(index).concat(points.slice(0, index));\n            closePath = spanGaps;\n            break;\n          }\n        } // If the line has a close path, add the first point again\n\n\n        if (closePath) {\n          points.push(points[0]);\n        }\n      }\n\n      ctx.save(); // Stroke Line Options\n\n      ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; // IE 9 and 10 do not support line dash\n\n      if (ctx.setLineDash) {\n        ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n      }\n\n      ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);\n      ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n      ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);\n      ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; // Stroke Line\n\n      ctx.beginPath(); // First point moves to it's starting position no matter what\n\n      currentVM = points[0]._view;\n\n      if (!currentVM.skip) {\n        ctx.moveTo(currentVM.x, currentVM.y);\n        lastDrawnIndex = 0;\n      }\n\n      for (index = 1; index < points.length; ++index) {\n        currentVM = points[index]._view;\n        previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex];\n\n        if (!currentVM.skip) {\n          if (lastDrawnIndex !== index - 1 && !spanGaps || lastDrawnIndex === -1) {\n            // There was a gap and this is the first point after the gap\n            ctx.moveTo(currentVM.x, currentVM.y);\n          } else {\n            // Line to next point\n            helpers$1.canvas.lineTo(ctx, previous._view, currentVM);\n          }\n\n          lastDrawnIndex = index;\n        }\n      }\n\n      if (closePath) {\n        ctx.closePath();\n      }\n\n      ctx.stroke();\n      ctx.restore();\n    }\n  });\n  var valueOrDefault$2 = helpers$1.valueOrDefault;\n  var defaultColor$1 = core_defaults.global.defaultColor;\n\n  core_defaults._set('global', {\n    elements: {\n      point: {\n        radius: 3,\n        pointStyle: 'circle',\n        backgroundColor: defaultColor$1,\n        borderColor: defaultColor$1,\n        borderWidth: 1,\n        // Hover\n        hitRadius: 1,\n        hoverRadius: 4,\n        hoverBorderWidth: 1\n      }\n    }\n  });\n\n  function xRange(mouseX) {\n    var vm = this._view;\n    return vm ? Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius : false;\n  }\n\n  function yRange(mouseY) {\n    var vm = this._view;\n    return vm ? Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius : false;\n  }\n\n  var element_point = core_element.extend({\n    _type: 'point',\n    inRange: function inRange(mouseX, mouseY) {\n      var vm = this._view;\n      return vm ? Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2) < Math.pow(vm.hitRadius + vm.radius, 2) : false;\n    },\n    inLabelRange: xRange,\n    inXRange: xRange,\n    inYRange: yRange,\n    getCenterPoint: function getCenterPoint() {\n      var vm = this._view;\n      return {\n        x: vm.x,\n        y: vm.y\n      };\n    },\n    getArea: function getArea() {\n      return Math.PI * Math.pow(this._view.radius, 2);\n    },\n    tooltipPosition: function tooltipPosition() {\n      var vm = this._view;\n      return {\n        x: vm.x,\n        y: vm.y,\n        padding: vm.radius + vm.borderWidth\n      };\n    },\n    draw: function draw(chartArea) {\n      var vm = this._view;\n      var ctx = this._chart.ctx;\n      var pointStyle = vm.pointStyle;\n      var rotation = vm.rotation;\n      var radius = vm.radius;\n      var x = vm.x;\n      var y = vm.y;\n      var globalDefaults = core_defaults.global;\n      var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow\n\n      if (vm.skip) {\n        return;\n      } // Clipping for Points.\n\n\n      if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {\n        ctx.strokeStyle = vm.borderColor || defaultColor;\n        ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);\n        ctx.fillStyle = vm.backgroundColor || defaultColor;\n        helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);\n      }\n    }\n  });\n  var defaultColor$2 = core_defaults.global.defaultColor;\n\n  core_defaults._set('global', {\n    elements: {\n      rectangle: {\n        backgroundColor: defaultColor$2,\n        borderColor: defaultColor$2,\n        borderSkipped: 'bottom',\n        borderWidth: 0\n      }\n    }\n  });\n\n  function isVertical(vm) {\n    return vm && vm.width !== undefined;\n  }\n  /**\r\n   * Helper function to get the bounds of the bar regardless of the orientation\r\n   * @param bar {Chart.Element.Rectangle} the bar\r\n   * @return {Bounds} bounds of the bar\r\n   * @private\r\n   */\n\n\n  function getBarBounds(vm) {\n    var x1, x2, y1, y2, half;\n\n    if (isVertical(vm)) {\n      half = vm.width / 2;\n      x1 = vm.x - half;\n      x2 = vm.x + half;\n      y1 = Math.min(vm.y, vm.base);\n      y2 = Math.max(vm.y, vm.base);\n    } else {\n      half = vm.height / 2;\n      x1 = Math.min(vm.x, vm.base);\n      x2 = Math.max(vm.x, vm.base);\n      y1 = vm.y - half;\n      y2 = vm.y + half;\n    }\n\n    return {\n      left: x1,\n      top: y1,\n      right: x2,\n      bottom: y2\n    };\n  }\n\n  function swap(orig, v1, v2) {\n    return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n  }\n\n  function parseBorderSkipped(vm) {\n    var edge = vm.borderSkipped;\n    var res = {};\n\n    if (!edge) {\n      return res;\n    }\n\n    if (vm.horizontal) {\n      if (vm.base > vm.x) {\n        edge = swap(edge, 'left', 'right');\n      }\n    } else if (vm.base < vm.y) {\n      edge = swap(edge, 'bottom', 'top');\n    }\n\n    res[edge] = true;\n    return res;\n  }\n\n  function parseBorderWidth(vm, maxW, maxH) {\n    var value = vm.borderWidth;\n    var skip = parseBorderSkipped(vm);\n    var t, r, b, l;\n\n    if (helpers$1.isObject(value)) {\n      t = +value.top || 0;\n      r = +value.right || 0;\n      b = +value.bottom || 0;\n      l = +value.left || 0;\n    } else {\n      t = r = b = l = +value || 0;\n    }\n\n    return {\n      t: skip.top || t < 0 ? 0 : t > maxH ? maxH : t,\n      r: skip.right || r < 0 ? 0 : r > maxW ? maxW : r,\n      b: skip.bottom || b < 0 ? 0 : b > maxH ? maxH : b,\n      l: skip.left || l < 0 ? 0 : l > maxW ? maxW : l\n    };\n  }\n\n  function boundingRects(vm) {\n    var bounds = getBarBounds(vm);\n    var width = bounds.right - bounds.left;\n    var height = bounds.bottom - bounds.top;\n    var border = parseBorderWidth(vm, width / 2, height / 2);\n    return {\n      outer: {\n        x: bounds.left,\n        y: bounds.top,\n        w: width,\n        h: height\n      },\n      inner: {\n        x: bounds.left + border.l,\n        y: bounds.top + border.t,\n        w: width - border.l - border.r,\n        h: height - border.t - border.b\n      }\n    };\n  }\n\n  function _inRange(vm, x, y) {\n    var skipX = x === null;\n    var skipY = y === null;\n    var bounds = !vm || skipX && skipY ? false : getBarBounds(vm);\n    return bounds && (skipX || x >= bounds.left && x <= bounds.right) && (skipY || y >= bounds.top && y <= bounds.bottom);\n  }\n\n  var element_rectangle = core_element.extend({\n    _type: 'rectangle',\n    draw: function draw() {\n      var ctx = this._chart.ctx;\n      var vm = this._view;\n      var rects = boundingRects(vm);\n      var outer = rects.outer;\n      var inner = rects.inner;\n      ctx.fillStyle = vm.backgroundColor;\n      ctx.fillRect(outer.x, outer.y, outer.w, outer.h);\n\n      if (outer.w === inner.w && outer.h === inner.h) {\n        return;\n      }\n\n      ctx.save();\n      ctx.beginPath();\n      ctx.rect(outer.x, outer.y, outer.w, outer.h);\n      ctx.clip();\n      ctx.fillStyle = vm.borderColor;\n      ctx.rect(inner.x, inner.y, inner.w, inner.h);\n      ctx.fill('evenodd');\n      ctx.restore();\n    },\n    height: function height() {\n      var vm = this._view;\n      return vm.base - vm.y;\n    },\n    inRange: function inRange(mouseX, mouseY) {\n      return _inRange(this._view, mouseX, mouseY);\n    },\n    inLabelRange: function inLabelRange(mouseX, mouseY) {\n      var vm = this._view;\n      return isVertical(vm) ? _inRange(vm, mouseX, null) : _inRange(vm, null, mouseY);\n    },\n    inXRange: function inXRange(mouseX) {\n      return _inRange(this._view, mouseX, null);\n    },\n    inYRange: function inYRange(mouseY) {\n      return _inRange(this._view, null, mouseY);\n    },\n    getCenterPoint: function getCenterPoint() {\n      var vm = this._view;\n      var x, y;\n\n      if (isVertical(vm)) {\n        x = vm.x;\n        y = (vm.y + vm.base) / 2;\n      } else {\n        x = (vm.x + vm.base) / 2;\n        y = vm.y;\n      }\n\n      return {\n        x: x,\n        y: y\n      };\n    },\n    getArea: function getArea() {\n      var vm = this._view;\n      return isVertical(vm) ? vm.width * Math.abs(vm.y - vm.base) : vm.height * Math.abs(vm.x - vm.base);\n    },\n    tooltipPosition: function tooltipPosition() {\n      var vm = this._view;\n      return {\n        x: vm.x,\n        y: vm.y\n      };\n    }\n  });\n  var elements = {};\n  var Arc = element_arc;\n  var Line = element_line;\n  var Point = element_point;\n  var Rectangle = element_rectangle;\n  elements.Arc = Arc;\n  elements.Line = Line;\n  elements.Point = Point;\n  elements.Rectangle = Rectangle;\n  var deprecated = helpers$1._deprecated;\n  var valueOrDefault$3 = helpers$1.valueOrDefault;\n\n  core_defaults._set('bar', {\n    hover: {\n      mode: 'label'\n    },\n    scales: {\n      xAxes: [{\n        type: 'category',\n        offset: true,\n        gridLines: {\n          offsetGridLines: true\n        }\n      }],\n      yAxes: [{\n        type: 'linear'\n      }]\n    }\n  });\n\n  core_defaults._set('global', {\n    datasets: {\n      bar: {\n        categoryPercentage: 0.8,\n        barPercentage: 0.9\n      }\n    }\n  });\n  /**\r\n   * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\r\n   * @private\r\n   */\n\n\n  function computeMinSampleSize(scale, pixels) {\n    var min = scale._length;\n    var prev, curr, i, ilen;\n\n    for (i = 1, ilen = pixels.length; i < ilen; ++i) {\n      min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));\n    }\n\n    for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) {\n      curr = scale.getPixelForTick(i);\n      min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min;\n      prev = curr;\n    }\n\n    return min;\n  }\n  /**\r\n   * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\r\n   * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\r\n   * mode currently always generates bars equally sized (until we introduce scriptable options?).\r\n   * @private\r\n   */\n\n\n  function computeFitCategoryTraits(index, ruler, options) {\n    var thickness = options.barThickness;\n    var count = ruler.stackCount;\n    var curr = ruler.pixels[index];\n    var min = helpers$1.isNullOrUndef(thickness) ? computeMinSampleSize(ruler.scale, ruler.pixels) : -1;\n    var size, ratio;\n\n    if (helpers$1.isNullOrUndef(thickness)) {\n      size = min * options.categoryPercentage;\n      ratio = options.barPercentage;\n    } else {\n      // When bar thickness is enforced, category and bar percentages are ignored.\n      // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n      // and deprecate barPercentage since this value is ignored when thickness is absolute.\n      size = thickness * count;\n      ratio = 1;\n    }\n\n    return {\n      chunk: size / count,\n      ratio: ratio,\n      start: curr - size / 2\n    };\n  }\n  /**\r\n   * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\r\n   * percentage options are 1), based on the previous and following categories. This mode\r\n   * generates bars with different widths when data are not evenly spaced.\r\n   * @private\r\n   */\n\n\n  function computeFlexCategoryTraits(index, ruler, options) {\n    var pixels = ruler.pixels;\n    var curr = pixels[index];\n    var prev = index > 0 ? pixels[index - 1] : null;\n    var next = index < pixels.length - 1 ? pixels[index + 1] : null;\n    var percent = options.categoryPercentage;\n    var start, size;\n\n    if (prev === null) {\n      // first data: its size is double based on the next point or,\n      // if it's also the last data, we use the scale size.\n      prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n    }\n\n    if (next === null) {\n      // last data: its size is also double based on the previous point.\n      next = curr + curr - prev;\n    }\n\n    start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n    size = Math.abs(next - prev) / 2 * percent;\n    return {\n      chunk: size / ruler.stackCount,\n      ratio: options.barPercentage,\n      start: start\n    };\n  }\n\n  var controller_bar = core_datasetController.extend({\n    dataElementType: elements.Rectangle,\n\n    /**\r\n     * @private\r\n     */\n    _dataElementOptions: ['backgroundColor', 'borderColor', 'borderSkipped', 'borderWidth', 'barPercentage', 'barThickness', 'categoryPercentage', 'maxBarThickness', 'minBarLength'],\n    initialize: function initialize() {\n      var me = this;\n      var meta, scaleOpts;\n      core_datasetController.prototype.initialize.apply(me, arguments);\n      meta = me.getMeta();\n      meta.stack = me.getDataset().stack;\n      meta.bar = true;\n      scaleOpts = me._getIndexScale().options;\n      deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage');\n      deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness');\n      deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage');\n      deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength');\n      deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness');\n    },\n    update: function update(reset) {\n      var me = this;\n      var rects = me.getMeta().data;\n      var i, ilen;\n      me._ruler = me.getRuler();\n\n      for (i = 0, ilen = rects.length; i < ilen; ++i) {\n        me.updateElement(rects[i], i, reset);\n      }\n    },\n    updateElement: function updateElement(rectangle, index, reset) {\n      var me = this;\n      var meta = me.getMeta();\n      var dataset = me.getDataset();\n\n      var options = me._resolveDataElementOptions(rectangle, index);\n\n      rectangle._xScale = me.getScaleForId(meta.xAxisID);\n      rectangle._yScale = me.getScaleForId(meta.yAxisID);\n      rectangle._datasetIndex = me.index;\n      rectangle._index = index;\n      rectangle._model = {\n        backgroundColor: options.backgroundColor,\n        borderColor: options.borderColor,\n        borderSkipped: options.borderSkipped,\n        borderWidth: options.borderWidth,\n        datasetLabel: dataset.label,\n        label: me.chart.data.labels[index]\n      };\n\n      if (helpers$1.isArray(dataset.data[index])) {\n        rectangle._model.borderSkipped = null;\n      }\n\n      me._updateElementGeometry(rectangle, index, reset, options);\n\n      rectangle.pivot();\n    },\n\n    /**\r\n     * @private\r\n     */\n    _updateElementGeometry: function _updateElementGeometry(rectangle, index, reset, options) {\n      var me = this;\n      var model = rectangle._model;\n\n      var vscale = me._getValueScale();\n\n      var base = vscale.getBasePixel();\n      var horizontal = vscale.isHorizontal();\n      var ruler = me._ruler || me.getRuler();\n      var vpixels = me.calculateBarValuePixels(me.index, index, options);\n      var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options);\n      model.horizontal = horizontal;\n      model.base = reset ? base : vpixels.base;\n      model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n      model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n      model.height = horizontal ? ipixels.size : undefined;\n      model.width = horizontal ? undefined : ipixels.size;\n    },\n\n    /**\r\n     * Returns the stacks based on groups and bar visibility.\r\n     * @param {number} [last] - The dataset index\r\n     * @returns {string[]} The list of stack IDs\r\n     * @private\r\n     */\n    _getStacks: function _getStacks(last) {\n      var me = this;\n\n      var scale = me._getIndexScale();\n\n      var metasets = scale._getMatchingVisibleMetas(me._type);\n\n      var stacked = scale.options.stacked;\n      var ilen = metasets.length;\n      var stacks = [];\n      var i, meta;\n\n      for (i = 0; i < ilen; ++i) {\n        meta = metasets[i]; // stacked   | meta.stack\n        //           | found | not found | undefined\n        // false     |   x   |     x     |     x\n        // true      |       |     x     |\n        // undefined |       |     x     |     x\n\n        if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n          stacks.push(meta.stack);\n        }\n\n        if (meta.index === last) {\n          break;\n        }\n      }\n\n      return stacks;\n    },\n\n    /**\r\n     * Returns the effective number of stacks based on groups and bar visibility.\r\n     * @private\r\n     */\n    getStackCount: function getStackCount() {\n      return this._getStacks().length;\n    },\n\n    /**\r\n     * Returns the stack index for the given dataset based on groups and bar visibility.\r\n     * @param {number} [datasetIndex] - The dataset index\r\n     * @param {string} [name] - The stack name to find\r\n     * @returns {number} The stack index\r\n     * @private\r\n     */\n    getStackIndex: function getStackIndex(datasetIndex, name) {\n      var stacks = this._getStacks(datasetIndex);\n\n      var index = name !== undefined ? stacks.indexOf(name) : -1; // indexOf returns -1 if element is not present\n\n      return index === -1 ? stacks.length - 1 : index;\n    },\n\n    /**\r\n     * @private\r\n     */\n    getRuler: function getRuler() {\n      var me = this;\n\n      var scale = me._getIndexScale();\n\n      var pixels = [];\n      var i, ilen;\n\n      for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n        pixels.push(scale.getPixelForValue(null, i, me.index));\n      }\n\n      return {\n        pixels: pixels,\n        start: scale._startPixel,\n        end: scale._endPixel,\n        stackCount: me.getStackCount(),\n        scale: scale\n      };\n    },\n\n    /**\r\n     * Note: pixel values are not clamped to the scale area.\r\n     * @private\r\n     */\n    calculateBarValuePixels: function calculateBarValuePixels(datasetIndex, index, options) {\n      var me = this;\n      var chart = me.chart;\n\n      var scale = me._getValueScale();\n\n      var isHorizontal = scale.isHorizontal();\n      var datasets = chart.data.datasets;\n\n      var metasets = scale._getMatchingVisibleMetas(me._type);\n\n      var value = scale._parseValue(datasets[datasetIndex].data[index]);\n\n      var minBarLength = options.minBarLength;\n      var stacked = scale.options.stacked;\n      var stack = me.getMeta().stack;\n      var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;\n      var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;\n      var ilen = metasets.length;\n      var i, imeta, ivalue, base, head, size, stackLength;\n\n      if (stacked || stacked === undefined && stack !== undefined) {\n        for (i = 0; i < ilen; ++i) {\n          imeta = metasets[i];\n\n          if (imeta.index === datasetIndex) {\n            break;\n          }\n\n          if (imeta.stack === stack) {\n            stackLength = scale._parseValue(datasets[imeta.index].data[index]);\n            ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;\n\n            if (value.min < 0 && ivalue < 0 || value.max >= 0 && ivalue > 0) {\n              start += ivalue;\n            }\n          }\n        }\n      }\n\n      base = scale.getPixelForValue(start);\n      head = scale.getPixelForValue(start + length);\n      size = head - base;\n\n      if (minBarLength !== undefined && Math.abs(size) < minBarLength) {\n        size = minBarLength;\n\n        if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {\n          head = base - minBarLength;\n        } else {\n          head = base + minBarLength;\n        }\n      }\n\n      return {\n        size: size,\n        base: base,\n        head: head,\n        center: head + size / 2\n      };\n    },\n\n    /**\r\n     * @private\r\n     */\n    calculateBarIndexPixels: function calculateBarIndexPixels(datasetIndex, index, ruler, options) {\n      var me = this;\n      var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options) : computeFitCategoryTraits(index, ruler, options);\n      var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n      var center = range.start + range.chunk * stackIndex + range.chunk / 2;\n      var size = Math.min(valueOrDefault$3(options.maxBarThickness, Infinity), range.chunk * range.ratio);\n      return {\n        base: center - size / 2,\n        head: center + size / 2,\n        center: center,\n        size: size\n      };\n    },\n    draw: function draw() {\n      var me = this;\n      var chart = me.chart;\n\n      var scale = me._getValueScale();\n\n      var rects = me.getMeta().data;\n      var dataset = me.getDataset();\n      var ilen = rects.length;\n      var i = 0;\n      helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);\n\n      for (; i < ilen; ++i) {\n        var val = scale._parseValue(dataset.data[i]);\n\n        if (!isNaN(val.min) && !isNaN(val.max)) {\n          rects[i].draw();\n        }\n      }\n\n      helpers$1.canvas.unclipArea(chart.ctx);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _resolveDataElementOptions: function _resolveDataElementOptions() {\n      var me = this;\n      var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments));\n\n      var indexOpts = me._getIndexScale().options;\n\n      var valueOpts = me._getValueScale().options;\n\n      values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage);\n      values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness);\n      values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage);\n      values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness);\n      values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength);\n      return values;\n    }\n  });\n  var valueOrDefault$4 = helpers$1.valueOrDefault;\n  var resolve$1 = helpers$1.options.resolve;\n\n  core_defaults._set('bubble', {\n    hover: {\n      mode: 'single'\n    },\n    scales: {\n      xAxes: [{\n        type: 'linear',\n        // bubble should probably use a linear scale by default\n        position: 'bottom',\n        id: 'x-axis-0' // need an ID so datasets can reference the scale\n\n      }],\n      yAxes: [{\n        type: 'linear',\n        position: 'left',\n        id: 'y-axis-0'\n      }]\n    },\n    tooltips: {\n      callbacks: {\n        title: function title() {\n          // Title doesn't make sense for scatter since we format the data as a point\n          return '';\n        },\n        label: function label(item, data) {\n          var datasetLabel = data.datasets[item.datasetIndex].label || '';\n          var dataPoint = data.datasets[item.datasetIndex].data[item.index];\n          return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n        }\n      }\n    }\n  });\n\n  var controller_bubble = core_datasetController.extend({\n    /**\r\n     * @protected\r\n     */\n    dataElementType: elements.Point,\n\n    /**\r\n     * @private\r\n     */\n    _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle', 'rotation'],\n\n    /**\r\n     * @protected\r\n     */\n    update: function update(reset) {\n      var me = this;\n      var meta = me.getMeta();\n      var points = meta.data; // Update Points\n\n      helpers$1.each(points, function (point, index) {\n        me.updateElement(point, index, reset);\n      });\n    },\n\n    /**\r\n     * @protected\r\n     */\n    updateElement: function updateElement(point, index, reset) {\n      var me = this;\n      var meta = me.getMeta();\n      var custom = point.custom || {};\n      var xScale = me.getScaleForId(meta.xAxisID);\n      var yScale = me.getScaleForId(meta.yAxisID);\n\n      var options = me._resolveDataElementOptions(point, index);\n\n      var data = me.getDataset().data[index];\n      var dsIndex = me.index;\n      var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(_typeof(data) === 'object' ? data : NaN, index, dsIndex);\n      var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n      point._xScale = xScale;\n      point._yScale = yScale;\n      point._options = options;\n      point._datasetIndex = dsIndex;\n      point._index = index;\n      point._model = {\n        backgroundColor: options.backgroundColor,\n        borderColor: options.borderColor,\n        borderWidth: options.borderWidth,\n        hitRadius: options.hitRadius,\n        pointStyle: options.pointStyle,\n        rotation: options.rotation,\n        radius: reset ? 0 : options.radius,\n        skip: custom.skip || isNaN(x) || isNaN(y),\n        x: x,\n        y: y\n      };\n      point.pivot();\n    },\n\n    /**\r\n     * @protected\r\n     */\n    setHoverStyle: function setHoverStyle(point) {\n      var model = point._model;\n      var options = point._options;\n      var getHoverColor = helpers$1.getHoverColor;\n      point.$previousStyle = {\n        backgroundColor: model.backgroundColor,\n        borderColor: model.borderColor,\n        borderWidth: model.borderWidth,\n        radius: model.radius\n      };\n      model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n      model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));\n      model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);\n      model.radius = options.radius + options.hoverRadius;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _resolveDataElementOptions: function _resolveDataElementOptions(point, index) {\n      var me = this;\n      var chart = me.chart;\n      var dataset = me.getDataset();\n      var custom = point.custom || {};\n      var data = dataset.data[index] || {};\n\n      var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments); // Scriptable options\n\n\n      var context = {\n        chart: chart,\n        dataIndex: index,\n        dataset: dataset,\n        datasetIndex: me.index\n      }; // In case values were cached (and thus frozen), we need to clone the values\n\n      if (me._cachedDataOpts === values) {\n        values = helpers$1.extend({}, values);\n      } // Custom radius resolution\n\n\n      values.radius = resolve$1([custom.radius, data.r, me._config.radius, chart.options.elements.point.radius], context, index);\n      return values;\n    }\n  });\n  var valueOrDefault$5 = helpers$1.valueOrDefault;\n  var PI$1 = Math.PI;\n  var DOUBLE_PI$1 = PI$1 * 2;\n  var HALF_PI$1 = PI$1 / 2;\n\n  core_defaults._set('doughnut', {\n    animation: {\n      // Boolean - Whether we animate the rotation of the Doughnut\n      animateRotate: true,\n      // Boolean - Whether we animate scaling the Doughnut from the centre\n      animateScale: false\n    },\n    hover: {\n      mode: 'single'\n    },\n    legendCallback: function legendCallback(chart) {\n      var list = document.createElement('ul');\n      var data = chart.data;\n      var datasets = data.datasets;\n      var labels = data.labels;\n      var i, ilen, listItem, listItemSpan;\n      list.setAttribute('class', chart.id + '-legend');\n\n      if (datasets.length) {\n        for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {\n          listItem = list.appendChild(document.createElement('li'));\n          listItemSpan = listItem.appendChild(document.createElement('span'));\n          listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];\n\n          if (labels[i]) {\n            listItem.appendChild(document.createTextNode(labels[i]));\n          }\n        }\n      }\n\n      return list.outerHTML;\n    },\n    legend: {\n      labels: {\n        generateLabels: function generateLabels(chart) {\n          var data = chart.data;\n\n          if (data.labels.length && data.datasets.length) {\n            return data.labels.map(function (label, i) {\n              var meta = chart.getDatasetMeta(0);\n              var style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,\n                // Extra data used for toggling the correct item\n                index: i\n              };\n            });\n          }\n\n          return [];\n        }\n      },\n      onClick: function onClick(e, legendItem) {\n        var index = legendItem.index;\n        var chart = this.chart;\n        var i, ilen, meta;\n\n        for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n          meta = chart.getDatasetMeta(i); // toggle visibility of index if exists\n\n          if (meta.data[index]) {\n            meta.data[index].hidden = !meta.data[index].hidden;\n          }\n        }\n\n        chart.update();\n      }\n    },\n    // The percentage of the chart that we cut out of the middle.\n    cutoutPercentage: 50,\n    // The rotation of the chart, where the first data arc begins.\n    rotation: -HALF_PI$1,\n    // The total circumference of the chart.\n    circumference: DOUBLE_PI$1,\n    // Need to override these to give a nice default\n    tooltips: {\n      callbacks: {\n        title: function title() {\n          return '';\n        },\n        label: function label(tooltipItem, data) {\n          var dataLabel = data.labels[tooltipItem.index];\n          var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n          if (helpers$1.isArray(dataLabel)) {\n            // show value on first line of multiline label\n            // need to clone because we are changing the value\n            dataLabel = dataLabel.slice();\n            dataLabel[0] += value;\n          } else {\n            dataLabel += value;\n          }\n\n          return dataLabel;\n        }\n      }\n    }\n  });\n\n  var controller_doughnut = core_datasetController.extend({\n    dataElementType: elements.Arc,\n    linkScales: helpers$1.noop,\n\n    /**\r\n     * @private\r\n     */\n    _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'borderAlign', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth'],\n    // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n    getRingIndex: function getRingIndex(datasetIndex) {\n      var ringIndex = 0;\n\n      for (var j = 0; j < datasetIndex; ++j) {\n        if (this.chart.isDatasetVisible(j)) {\n          ++ringIndex;\n        }\n      }\n\n      return ringIndex;\n    },\n    update: function update(reset) {\n      var me = this;\n      var chart = me.chart;\n      var chartArea = chart.chartArea;\n      var opts = chart.options;\n      var ratioX = 1;\n      var ratioY = 1;\n      var offsetX = 0;\n      var offsetY = 0;\n      var meta = me.getMeta();\n      var arcs = meta.data;\n      var cutout = opts.cutoutPercentage / 100 || 0;\n      var circumference = opts.circumference;\n\n      var chartWeight = me._getRingWeight(me.index);\n\n      var maxWidth, maxHeight, i, ilen; // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n\n      if (circumference < DOUBLE_PI$1) {\n        var startAngle = opts.rotation % DOUBLE_PI$1;\n        startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0;\n        var endAngle = startAngle + circumference;\n        var startX = Math.cos(startAngle);\n        var startY = Math.sin(startAngle);\n        var endX = Math.cos(endAngle);\n        var endY = Math.sin(endAngle);\n        var contains0 = startAngle <= 0 && endAngle >= 0 || endAngle >= DOUBLE_PI$1;\n        var contains90 = startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1 || endAngle >= DOUBLE_PI$1 + HALF_PI$1;\n        var contains180 = startAngle === -PI$1 || endAngle >= PI$1;\n        var contains270 = startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1 || endAngle >= PI$1 + HALF_PI$1;\n        var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout);\n        var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout);\n        var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout);\n        var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout);\n        ratioX = (maxX - minX) / 2;\n        ratioY = (maxY - minY) / 2;\n        offsetX = -(maxX + minX) / 2;\n        offsetY = -(maxY + minY) / 2;\n      }\n\n      for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n        arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);\n      }\n\n      chart.borderWidth = me.getMaxBorderWidth();\n      maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX;\n      maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY;\n      chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n      chart.innerRadius = Math.max(chart.outerRadius * cutout, 0);\n      chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);\n      chart.offsetX = offsetX * chart.outerRadius;\n      chart.offsetY = offsetY * chart.outerRadius;\n      meta.total = me.calculateTotal();\n      me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);\n      me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);\n\n      for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n        me.updateElement(arcs[i], i, reset);\n      }\n    },\n    updateElement: function updateElement(arc, index, reset) {\n      var me = this;\n      var chart = me.chart;\n      var chartArea = chart.chartArea;\n      var opts = chart.options;\n      var animationOpts = opts.animation;\n      var centerX = (chartArea.left + chartArea.right) / 2;\n      var centerY = (chartArea.top + chartArea.bottom) / 2;\n      var startAngle = opts.rotation; // non reset case handled later\n\n      var endAngle = opts.rotation; // non reset case handled later\n\n      var dataset = me.getDataset();\n      var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1);\n      var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n      var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n      var options = arc._options || {};\n      helpers$1.extend(arc, {\n        // Utility\n        _datasetIndex: me.index,\n        _index: index,\n        // Desired view properties\n        _model: {\n          backgroundColor: options.backgroundColor,\n          borderColor: options.borderColor,\n          borderWidth: options.borderWidth,\n          borderAlign: options.borderAlign,\n          x: centerX + chart.offsetX,\n          y: centerY + chart.offsetY,\n          startAngle: startAngle,\n          endAngle: endAngle,\n          circumference: circumference,\n          outerRadius: outerRadius,\n          innerRadius: innerRadius,\n          label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n        }\n      });\n      var model = arc._model; // Set correct angles if not resetting\n\n      if (!reset || !animationOpts.animateRotate) {\n        if (index === 0) {\n          model.startAngle = opts.rotation;\n        } else {\n          model.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n        }\n\n        model.endAngle = model.startAngle + model.circumference;\n      }\n\n      arc.pivot();\n    },\n    calculateTotal: function calculateTotal() {\n      var dataset = this.getDataset();\n      var meta = this.getMeta();\n      var total = 0;\n      var value;\n      helpers$1.each(meta.data, function (element, index) {\n        value = dataset.data[index];\n\n        if (!isNaN(value) && !element.hidden) {\n          total += Math.abs(value);\n        }\n      });\n      /* if (total === 0) {\r\n      \ttotal = NaN;\r\n      }*/\n\n      return total;\n    },\n    calculateCircumference: function calculateCircumference(value) {\n      var total = this.getMeta().total;\n\n      if (total > 0 && !isNaN(value)) {\n        return DOUBLE_PI$1 * (Math.abs(value) / total);\n      }\n\n      return 0;\n    },\n    // gets the max border or hover width to properly scale pie charts\n    getMaxBorderWidth: function getMaxBorderWidth(arcs) {\n      var me = this;\n      var max = 0;\n      var chart = me.chart;\n      var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;\n\n      if (!arcs) {\n        // Find the outmost visible dataset\n        for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n          if (chart.isDatasetVisible(i)) {\n            meta = chart.getDatasetMeta(i);\n            arcs = meta.data;\n\n            if (i !== me.index) {\n              controller = meta.controller;\n            }\n\n            break;\n          }\n        }\n      }\n\n      if (!arcs) {\n        return 0;\n      }\n\n      for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n        arc = arcs[i];\n\n        if (controller) {\n          controller._configure();\n\n          options = controller._resolveDataElementOptions(arc, i);\n        } else {\n          options = arc._options;\n        }\n\n        if (options.borderAlign !== 'inner') {\n          borderWidth = options.borderWidth;\n          hoverWidth = options.hoverBorderWidth;\n          max = borderWidth > max ? borderWidth : max;\n          max = hoverWidth > max ? hoverWidth : max;\n        }\n      }\n\n      return max;\n    },\n\n    /**\r\n     * @protected\r\n     */\n    setHoverStyle: function setHoverStyle(arc) {\n      var model = arc._model;\n      var options = arc._options;\n      var getHoverColor = helpers$1.getHoverColor;\n      arc.$previousStyle = {\n        backgroundColor: model.backgroundColor,\n        borderColor: model.borderColor,\n        borderWidth: model.borderWidth\n      };\n      model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n      model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));\n      model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);\n    },\n\n    /**\r\n     * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\r\n     * @private\r\n     */\n    _getRingWeightOffset: function _getRingWeightOffset(datasetIndex) {\n      var ringWeightOffset = 0;\n\n      for (var i = 0; i < datasetIndex; ++i) {\n        if (this.chart.isDatasetVisible(i)) {\n          ringWeightOffset += this._getRingWeight(i);\n        }\n      }\n\n      return ringWeightOffset;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getRingWeight: function _getRingWeight(dataSetIndex) {\n      return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0);\n    },\n\n    /**\r\n     * Returns the sum of all visibile data set weights.  This value can be 0.\r\n     * @private\r\n     */\n    _getVisibleDatasetWeightTotal: function _getVisibleDatasetWeightTotal() {\n      return this._getRingWeightOffset(this.chart.data.datasets.length);\n    }\n  });\n\n  core_defaults._set('horizontalBar', {\n    hover: {\n      mode: 'index',\n      axis: 'y'\n    },\n    scales: {\n      xAxes: [{\n        type: 'linear',\n        position: 'bottom'\n      }],\n      yAxes: [{\n        type: 'category',\n        position: 'left',\n        offset: true,\n        gridLines: {\n          offsetGridLines: true\n        }\n      }]\n    },\n    elements: {\n      rectangle: {\n        borderSkipped: 'left'\n      }\n    },\n    tooltips: {\n      mode: 'index',\n      axis: 'y'\n    }\n  });\n\n  core_defaults._set('global', {\n    datasets: {\n      horizontalBar: {\n        categoryPercentage: 0.8,\n        barPercentage: 0.9\n      }\n    }\n  });\n\n  var controller_horizontalBar = controller_bar.extend({\n    /**\r\n     * @private\r\n     */\n    _getValueScaleId: function _getValueScaleId() {\n      return this.getMeta().xAxisID;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getIndexScaleId: function _getIndexScaleId() {\n      return this.getMeta().yAxisID;\n    }\n  });\n  var valueOrDefault$6 = helpers$1.valueOrDefault;\n  var resolve$2 = helpers$1.options.resolve;\n  var isPointInArea = helpers$1.canvas._isPointInArea;\n\n  core_defaults._set('line', {\n    showLines: true,\n    spanGaps: false,\n    hover: {\n      mode: 'label'\n    },\n    scales: {\n      xAxes: [{\n        type: 'category',\n        id: 'x-axis-0'\n      }],\n      yAxes: [{\n        type: 'linear',\n        id: 'y-axis-0'\n      }]\n    }\n  });\n\n  function scaleClip(scale, halfBorderWidth) {\n    var tickOpts = scale && scale.options.ticks || {};\n    var reverse = tickOpts.reverse;\n    var min = tickOpts.min === undefined ? halfBorderWidth : 0;\n    var max = tickOpts.max === undefined ? halfBorderWidth : 0;\n    return {\n      start: reverse ? max : min,\n      end: reverse ? min : max\n    };\n  }\n\n  function defaultClip(xScale, yScale, borderWidth) {\n    var halfBorderWidth = borderWidth / 2;\n    var x = scaleClip(xScale, halfBorderWidth);\n    var y = scaleClip(yScale, halfBorderWidth);\n    return {\n      top: y.end,\n      right: x.end,\n      bottom: y.start,\n      left: x.start\n    };\n  }\n\n  function toClip(value) {\n    var t, r, b, l;\n\n    if (helpers$1.isObject(value)) {\n      t = value.top;\n      r = value.right;\n      b = value.bottom;\n      l = value.left;\n    } else {\n      t = r = b = l = value;\n    }\n\n    return {\n      top: t,\n      right: r,\n      bottom: b,\n      left: l\n    };\n  }\n\n  var controller_line = core_datasetController.extend({\n    datasetElementType: elements.Line,\n    dataElementType: elements.Point,\n\n    /**\r\n     * @private\r\n     */\n    _datasetElementOptions: ['backgroundColor', 'borderCapStyle', 'borderColor', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'borderWidth', 'cubicInterpolationMode', 'fill'],\n\n    /**\r\n     * @private\r\n     */\n    _dataElementOptions: {\n      backgroundColor: 'pointBackgroundColor',\n      borderColor: 'pointBorderColor',\n      borderWidth: 'pointBorderWidth',\n      hitRadius: 'pointHitRadius',\n      hoverBackgroundColor: 'pointHoverBackgroundColor',\n      hoverBorderColor: 'pointHoverBorderColor',\n      hoverBorderWidth: 'pointHoverBorderWidth',\n      hoverRadius: 'pointHoverRadius',\n      pointStyle: 'pointStyle',\n      radius: 'pointRadius',\n      rotation: 'pointRotation'\n    },\n    update: function update(reset) {\n      var me = this;\n      var meta = me.getMeta();\n      var line = meta.dataset;\n      var points = meta.data || [];\n      var options = me.chart.options;\n      var config = me._config;\n      var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines);\n      var i, ilen;\n      me._xScale = me.getScaleForId(meta.xAxisID);\n      me._yScale = me.getScaleForId(meta.yAxisID); // Update Line\n\n      if (showLine) {\n        // Compatibility: If the properties are defined with only the old name, use those values\n        if (config.tension !== undefined && config.lineTension === undefined) {\n          config.lineTension = config.tension;\n        } // Utility\n\n\n        line._scale = me._yScale;\n        line._datasetIndex = me.index; // Data\n\n        line._children = points; // Model\n\n        line._model = me._resolveDatasetElementOptions(line);\n        line.pivot();\n      } // Update Points\n\n\n      for (i = 0, ilen = points.length; i < ilen; ++i) {\n        me.updateElement(points[i], i, reset);\n      }\n\n      if (showLine && line._model.tension !== 0) {\n        me.updateBezierControlPoints();\n      } // Now pivot the point for animation\n\n\n      for (i = 0, ilen = points.length; i < ilen; ++i) {\n        points[i].pivot();\n      }\n    },\n    updateElement: function updateElement(point, index, reset) {\n      var me = this;\n      var meta = me.getMeta();\n      var custom = point.custom || {};\n      var dataset = me.getDataset();\n      var datasetIndex = me.index;\n      var value = dataset.data[index];\n      var xScale = me._xScale;\n      var yScale = me._yScale;\n      var lineModel = meta.dataset._model;\n      var x, y;\n\n      var options = me._resolveDataElementOptions(point, index);\n\n      x = xScale.getPixelForValue(_typeof(value) === 'object' ? value : NaN, index, datasetIndex);\n      y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); // Utility\n\n      point._xScale = xScale;\n      point._yScale = yScale;\n      point._options = options;\n      point._datasetIndex = datasetIndex;\n      point._index = index; // Desired view properties\n\n      point._model = {\n        x: x,\n        y: y,\n        skip: custom.skip || isNaN(x) || isNaN(y),\n        // Appearance\n        radius: options.radius,\n        pointStyle: options.pointStyle,\n        rotation: options.rotation,\n        backgroundColor: options.backgroundColor,\n        borderColor: options.borderColor,\n        borderWidth: options.borderWidth,\n        tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),\n        steppedLine: lineModel ? lineModel.steppedLine : false,\n        // Tooltip\n        hitRadius: options.hitRadius\n      };\n    },\n\n    /**\r\n     * @private\r\n     */\n    _resolveDatasetElementOptions: function _resolveDatasetElementOptions(element) {\n      var me = this;\n      var config = me._config;\n      var custom = element.custom || {};\n      var options = me.chart.options;\n      var lineOptions = options.elements.line;\n\n      var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments); // The default behavior of lines is to break at null values, according\n      // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n      // This option gives lines the ability to span gaps\n\n\n      values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps);\n      values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension);\n      values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]);\n      values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth)));\n      return values;\n    },\n    calculatePointY: function calculatePointY(value, index, datasetIndex) {\n      var me = this;\n      var chart = me.chart;\n      var yScale = me._yScale;\n      var sumPos = 0;\n      var sumNeg = 0;\n      var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen;\n\n      if (yScale.options.stacked) {\n        rightValue = +yScale.getRightValue(value);\n        metasets = chart._getSortedVisibleDatasetMetas();\n        ilen = metasets.length;\n\n        for (i = 0; i < ilen; ++i) {\n          dsMeta = metasets[i];\n\n          if (dsMeta.index === datasetIndex) {\n            break;\n          }\n\n          ds = chart.data.datasets[dsMeta.index];\n\n          if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) {\n            stackedRightValue = +yScale.getRightValue(ds.data[index]);\n\n            if (stackedRightValue < 0) {\n              sumNeg += stackedRightValue || 0;\n            } else {\n              sumPos += stackedRightValue || 0;\n            }\n          }\n        }\n\n        if (rightValue < 0) {\n          return yScale.getPixelForValue(sumNeg + rightValue);\n        }\n\n        return yScale.getPixelForValue(sumPos + rightValue);\n      }\n\n      return yScale.getPixelForValue(value);\n    },\n    updateBezierControlPoints: function updateBezierControlPoints() {\n      var me = this;\n      var chart = me.chart;\n      var meta = me.getMeta();\n      var lineModel = meta.dataset._model;\n      var area = chart.chartArea;\n      var points = meta.data || [];\n      var i, ilen, model, controlPoints; // Only consider points that are drawn in case the spanGaps option is used\n\n      if (lineModel.spanGaps) {\n        points = points.filter(function (pt) {\n          return !pt._model.skip;\n        });\n      }\n\n      function capControlPoint(pt, min, max) {\n        return Math.max(Math.min(pt, max), min);\n      }\n\n      if (lineModel.cubicInterpolationMode === 'monotone') {\n        helpers$1.splineCurveMonotone(points);\n      } else {\n        for (i = 0, ilen = points.length; i < ilen; ++i) {\n          model = points[i]._model;\n          controlPoints = helpers$1.splineCurve(helpers$1.previousItem(points, i)._model, model, helpers$1.nextItem(points, i)._model, lineModel.tension);\n          model.controlPointPreviousX = controlPoints.previous.x;\n          model.controlPointPreviousY = controlPoints.previous.y;\n          model.controlPointNextX = controlPoints.next.x;\n          model.controlPointNextY = controlPoints.next.y;\n        }\n      }\n\n      if (chart.options.elements.line.capBezierPoints) {\n        for (i = 0, ilen = points.length; i < ilen; ++i) {\n          model = points[i]._model;\n\n          if (isPointInArea(model, area)) {\n            if (i > 0 && isPointInArea(points[i - 1]._model, area)) {\n              model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n              model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n            }\n\n            if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {\n              model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n              model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n            }\n          }\n        }\n      }\n    },\n    draw: function draw() {\n      var me = this;\n      var chart = me.chart;\n      var meta = me.getMeta();\n      var points = meta.data || [];\n      var area = chart.chartArea;\n      var canvas = chart.canvas;\n      var i = 0;\n      var ilen = points.length;\n      var clip;\n\n      if (me._showLine) {\n        clip = meta.dataset._model.clip;\n        helpers$1.canvas.clipArea(chart.ctx, {\n          left: clip.left === false ? 0 : area.left - clip.left,\n          right: clip.right === false ? canvas.width : area.right + clip.right,\n          top: clip.top === false ? 0 : area.top - clip.top,\n          bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom\n        });\n        meta.dataset.draw();\n        helpers$1.canvas.unclipArea(chart.ctx);\n      } // Draw the points\n\n\n      for (; i < ilen; ++i) {\n        points[i].draw(area);\n      }\n    },\n\n    /**\r\n     * @protected\r\n     */\n    setHoverStyle: function setHoverStyle(point) {\n      var model = point._model;\n      var options = point._options;\n      var getHoverColor = helpers$1.getHoverColor;\n      point.$previousStyle = {\n        backgroundColor: model.backgroundColor,\n        borderColor: model.borderColor,\n        borderWidth: model.borderWidth,\n        radius: model.radius\n      };\n      model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n      model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));\n      model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);\n      model.radius = valueOrDefault$6(options.hoverRadius, options.radius);\n    }\n  });\n  var resolve$3 = helpers$1.options.resolve;\n\n  core_defaults._set('polarArea', {\n    scale: {\n      type: 'radialLinear',\n      angleLines: {\n        display: false\n      },\n      gridLines: {\n        circular: true\n      },\n      pointLabels: {\n        display: false\n      },\n      ticks: {\n        beginAtZero: true\n      }\n    },\n    // Boolean - Whether to animate the rotation of the chart\n    animation: {\n      animateRotate: true,\n      animateScale: true\n    },\n    startAngle: -0.5 * Math.PI,\n    legendCallback: function legendCallback(chart) {\n      var list = document.createElement('ul');\n      var data = chart.data;\n      var datasets = data.datasets;\n      var labels = data.labels;\n      var i, ilen, listItem, listItemSpan;\n      list.setAttribute('class', chart.id + '-legend');\n\n      if (datasets.length) {\n        for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {\n          listItem = list.appendChild(document.createElement('li'));\n          listItemSpan = listItem.appendChild(document.createElement('span'));\n          listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];\n\n          if (labels[i]) {\n            listItem.appendChild(document.createTextNode(labels[i]));\n          }\n        }\n      }\n\n      return list.outerHTML;\n    },\n    legend: {\n      labels: {\n        generateLabels: function generateLabels(chart) {\n          var data = chart.data;\n\n          if (data.labels.length && data.datasets.length) {\n            return data.labels.map(function (label, i) {\n              var meta = chart.getDatasetMeta(0);\n              var style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,\n                // Extra data used for toggling the correct item\n                index: i\n              };\n            });\n          }\n\n          return [];\n        }\n      },\n      onClick: function onClick(e, legendItem) {\n        var index = legendItem.index;\n        var chart = this.chart;\n        var i, ilen, meta;\n\n        for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n          meta = chart.getDatasetMeta(i);\n          meta.data[index].hidden = !meta.data[index].hidden;\n        }\n\n        chart.update();\n      }\n    },\n    // Need to override these to give a nice default\n    tooltips: {\n      callbacks: {\n        title: function title() {\n          return '';\n        },\n        label: function label(item, data) {\n          return data.labels[item.index] + ': ' + item.yLabel;\n        }\n      }\n    }\n  });\n\n  var controller_polarArea = core_datasetController.extend({\n    dataElementType: elements.Arc,\n    linkScales: helpers$1.noop,\n\n    /**\r\n     * @private\r\n     */\n    _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'borderAlign', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth'],\n\n    /**\r\n     * @private\r\n     */\n    _getIndexScaleId: function _getIndexScaleId() {\n      return this.chart.scale.id;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getValueScaleId: function _getValueScaleId() {\n      return this.chart.scale.id;\n    },\n    update: function update(reset) {\n      var me = this;\n      var dataset = me.getDataset();\n      var meta = me.getMeta();\n      var start = me.chart.options.startAngle || 0;\n      var starts = me._starts = [];\n      var angles = me._angles = [];\n      var arcs = meta.data;\n      var i, ilen, angle;\n\n      me._updateRadius();\n\n      meta.count = me.countVisibleElements();\n\n      for (i = 0, ilen = dataset.data.length; i < ilen; i++) {\n        starts[i] = start;\n        angle = me._computeAngle(i);\n        angles[i] = angle;\n        start += angle;\n      }\n\n      for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n        arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);\n        me.updateElement(arcs[i], i, reset);\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    _updateRadius: function _updateRadius() {\n      var me = this;\n      var chart = me.chart;\n      var chartArea = chart.chartArea;\n      var opts = chart.options;\n      var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n      chart.outerRadius = Math.max(minSize / 2, 0);\n      chart.innerRadius = Math.max(opts.cutoutPercentage ? chart.outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n      chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n      me.outerRadius = chart.outerRadius - chart.radiusLength * me.index;\n      me.innerRadius = me.outerRadius - chart.radiusLength;\n    },\n    updateElement: function updateElement(arc, index, reset) {\n      var me = this;\n      var chart = me.chart;\n      var dataset = me.getDataset();\n      var opts = chart.options;\n      var animationOpts = opts.animation;\n      var scale = chart.scale;\n      var labels = chart.data.labels;\n      var centerX = scale.xCenter;\n      var centerY = scale.yCenter; // var negHalfPI = -0.5 * Math.PI;\n\n      var datasetStartAngle = opts.startAngle;\n      var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n      var startAngle = me._starts[index];\n      var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);\n      var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n      var options = arc._options || {};\n      helpers$1.extend(arc, {\n        // Utility\n        _datasetIndex: me.index,\n        _index: index,\n        _scale: scale,\n        // Desired view properties\n        _model: {\n          backgroundColor: options.backgroundColor,\n          borderColor: options.borderColor,\n          borderWidth: options.borderWidth,\n          borderAlign: options.borderAlign,\n          x: centerX,\n          y: centerY,\n          innerRadius: 0,\n          outerRadius: reset ? resetRadius : distance,\n          startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n          endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n          label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index])\n        }\n      });\n      arc.pivot();\n    },\n    countVisibleElements: function countVisibleElements() {\n      var dataset = this.getDataset();\n      var meta = this.getMeta();\n      var count = 0;\n      helpers$1.each(meta.data, function (element, index) {\n        if (!isNaN(dataset.data[index]) && !element.hidden) {\n          count++;\n        }\n      });\n      return count;\n    },\n\n    /**\r\n     * @protected\r\n     */\n    setHoverStyle: function setHoverStyle(arc) {\n      var model = arc._model;\n      var options = arc._options;\n      var getHoverColor = helpers$1.getHoverColor;\n      var valueOrDefault = helpers$1.valueOrDefault;\n      arc.$previousStyle = {\n        backgroundColor: model.backgroundColor,\n        borderColor: model.borderColor,\n        borderWidth: model.borderWidth\n      };\n      model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n      model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));\n      model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _computeAngle: function _computeAngle(index) {\n      var me = this;\n      var count = this.getMeta().count;\n      var dataset = me.getDataset();\n      var meta = me.getMeta();\n\n      if (isNaN(dataset.data[index]) || meta.data[index].hidden) {\n        return 0;\n      } // Scriptable options\n\n\n      var context = {\n        chart: me.chart,\n        dataIndex: index,\n        dataset: dataset,\n        datasetIndex: me.index\n      };\n      return resolve$3([me.chart.options.elements.arc.angle, 2 * Math.PI / count], context, index);\n    }\n  });\n\n  core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut));\n\n  core_defaults._set('pie', {\n    cutoutPercentage: 0\n  }); // Pie charts are Doughnut chart with different defaults\n\n\n  var controller_pie = controller_doughnut;\n  var valueOrDefault$7 = helpers$1.valueOrDefault;\n\n  core_defaults._set('radar', {\n    spanGaps: false,\n    scale: {\n      type: 'radialLinear'\n    },\n    elements: {\n      line: {\n        fill: 'start',\n        tension: 0 // no bezier in radar\n\n      }\n    }\n  });\n\n  var controller_radar = core_datasetController.extend({\n    datasetElementType: elements.Line,\n    dataElementType: elements.Point,\n    linkScales: helpers$1.noop,\n\n    /**\r\n     * @private\r\n     */\n    _datasetElementOptions: ['backgroundColor', 'borderWidth', 'borderColor', 'borderCapStyle', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'fill'],\n\n    /**\r\n     * @private\r\n     */\n    _dataElementOptions: {\n      backgroundColor: 'pointBackgroundColor',\n      borderColor: 'pointBorderColor',\n      borderWidth: 'pointBorderWidth',\n      hitRadius: 'pointHitRadius',\n      hoverBackgroundColor: 'pointHoverBackgroundColor',\n      hoverBorderColor: 'pointHoverBorderColor',\n      hoverBorderWidth: 'pointHoverBorderWidth',\n      hoverRadius: 'pointHoverRadius',\n      pointStyle: 'pointStyle',\n      radius: 'pointRadius',\n      rotation: 'pointRotation'\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getIndexScaleId: function _getIndexScaleId() {\n      return this.chart.scale.id;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getValueScaleId: function _getValueScaleId() {\n      return this.chart.scale.id;\n    },\n    update: function update(reset) {\n      var me = this;\n      var meta = me.getMeta();\n      var line = meta.dataset;\n      var points = meta.data || [];\n      var scale = me.chart.scale;\n      var config = me._config;\n      var i, ilen; // Compatibility: If the properties are defined with only the old name, use those values\n\n      if (config.tension !== undefined && config.lineTension === undefined) {\n        config.lineTension = config.tension;\n      } // Utility\n\n\n      line._scale = scale;\n      line._datasetIndex = me.index; // Data\n\n      line._children = points;\n      line._loop = true; // Model\n\n      line._model = me._resolveDatasetElementOptions(line);\n      line.pivot(); // Update Points\n\n      for (i = 0, ilen = points.length; i < ilen; ++i) {\n        me.updateElement(points[i], i, reset);\n      } // Update bezier control points\n\n\n      me.updateBezierControlPoints(); // Now pivot the point for animation\n\n      for (i = 0, ilen = points.length; i < ilen; ++i) {\n        points[i].pivot();\n      }\n    },\n    updateElement: function updateElement(point, index, reset) {\n      var me = this;\n      var custom = point.custom || {};\n      var dataset = me.getDataset();\n      var scale = me.chart.scale;\n      var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n      var options = me._resolveDataElementOptions(point, index);\n\n      var lineModel = me.getMeta().dataset._model;\n\n      var x = reset ? scale.xCenter : pointPosition.x;\n      var y = reset ? scale.yCenter : pointPosition.y; // Utility\n\n      point._scale = scale;\n      point._options = options;\n      point._datasetIndex = me.index;\n      point._index = index; // Desired view properties\n\n      point._model = {\n        x: x,\n        // value not used in dataset scale, but we want a consistent API between scales\n        y: y,\n        skip: custom.skip || isNaN(x) || isNaN(y),\n        // Appearance\n        radius: options.radius,\n        pointStyle: options.pointStyle,\n        rotation: options.rotation,\n        backgroundColor: options.backgroundColor,\n        borderColor: options.borderColor,\n        borderWidth: options.borderWidth,\n        tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0),\n        // Tooltip\n        hitRadius: options.hitRadius\n      };\n    },\n\n    /**\r\n     * @private\r\n     */\n    _resolveDatasetElementOptions: function _resolveDatasetElementOptions() {\n      var me = this;\n      var config = me._config;\n      var options = me.chart.options;\n\n      var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);\n\n      values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps);\n      values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension);\n      return values;\n    },\n    updateBezierControlPoints: function updateBezierControlPoints() {\n      var me = this;\n      var meta = me.getMeta();\n      var area = me.chart.chartArea;\n      var points = meta.data || [];\n      var i, ilen, model, controlPoints; // Only consider points that are drawn in case the spanGaps option is used\n\n      if (meta.dataset._model.spanGaps) {\n        points = points.filter(function (pt) {\n          return !pt._model.skip;\n        });\n      }\n\n      function capControlPoint(pt, min, max) {\n        return Math.max(Math.min(pt, max), min);\n      }\n\n      for (i = 0, ilen = points.length; i < ilen; ++i) {\n        model = points[i]._model;\n        controlPoints = helpers$1.splineCurve(helpers$1.previousItem(points, i, true)._model, model, helpers$1.nextItem(points, i, true)._model, model.tension); // Prevent the bezier going outside of the bounds of the graph\n\n        model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right);\n        model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom);\n        model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right);\n        model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom);\n      }\n    },\n    setHoverStyle: function setHoverStyle(point) {\n      var model = point._model;\n      var options = point._options;\n      var getHoverColor = helpers$1.getHoverColor;\n      point.$previousStyle = {\n        backgroundColor: model.backgroundColor,\n        borderColor: model.borderColor,\n        borderWidth: model.borderWidth,\n        radius: model.radius\n      };\n      model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n      model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor));\n      model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth);\n      model.radius = valueOrDefault$7(options.hoverRadius, options.radius);\n    }\n  });\n\n  core_defaults._set('scatter', {\n    hover: {\n      mode: 'single'\n    },\n    scales: {\n      xAxes: [{\n        id: 'x-axis-1',\n        // need an ID so datasets can reference the scale\n        type: 'linear',\n        // scatter should not use a category axis\n        position: 'bottom'\n      }],\n      yAxes: [{\n        id: 'y-axis-1',\n        type: 'linear',\n        position: 'left'\n      }]\n    },\n    tooltips: {\n      callbacks: {\n        title: function title() {\n          return ''; // doesn't make sense for scatter since data are formatted as a point\n        },\n        label: function label(item) {\n          return '(' + item.xLabel + ', ' + item.yLabel + ')';\n        }\n      }\n    }\n  });\n\n  core_defaults._set('global', {\n    datasets: {\n      scatter: {\n        showLine: false\n      }\n    }\n  }); // Scatter charts use line controllers\n\n\n  var controller_scatter = controller_line; // NOTE export a map in which the key represents the controller type, not\n  // the class, and so must be CamelCase in order to be correctly retrieved\n  // by the controller in core.controller.js (`controllers[meta.type]`).\n\n  var controllers = {\n    bar: controller_bar,\n    bubble: controller_bubble,\n    doughnut: controller_doughnut,\n    horizontalBar: controller_horizontalBar,\n    line: controller_line,\n    polarArea: controller_polarArea,\n    pie: controller_pie,\n    radar: controller_radar,\n    scatter: controller_scatter\n  };\n  /**\r\n   * Helper function to get relative position for an event\r\n   * @param {Event|IEvent} event - The event to get the position for\r\n   * @param {Chart} chart - The chart\r\n   * @returns {object} the event position\r\n   */\n\n  function getRelativePosition(e, chart) {\n    if (e[\"native\"]) {\n      return {\n        x: e.x,\n        y: e.y\n      };\n    }\n\n    return helpers$1.getRelativePosition(e, chart);\n  }\n  /**\r\n   * Helper function to traverse all of the visible elements in the chart\r\n   * @param {Chart} chart - the chart\r\n   * @param {function} handler - the callback to execute for each visible item\r\n   */\n\n\n  function parseVisibleItems(chart, handler) {\n    var metasets = chart._getSortedVisibleDatasetMetas();\n\n    var metadata, i, j, ilen, jlen, element;\n\n    for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n      metadata = metasets[i].data;\n\n      for (j = 0, jlen = metadata.length; j < jlen; ++j) {\n        element = metadata[j];\n\n        if (!element._view.skip) {\n          handler(element);\n        }\n      }\n    }\n  }\n  /**\r\n   * Helper function to get the items that intersect the event position\r\n   * @param {ChartElement[]} items - elements to filter\r\n   * @param {object} position - the point to be nearest to\r\n   * @return {ChartElement[]} the nearest items\r\n   */\n\n\n  function getIntersectItems(chart, position) {\n    var elements = [];\n    parseVisibleItems(chart, function (element) {\n      if (element.inRange(position.x, position.y)) {\n        elements.push(element);\n      }\n    });\n    return elements;\n  }\n  /**\r\n   * Helper function to get the items nearest to the event position considering all visible items in teh chart\r\n   * @param {Chart} chart - the chart to look at elements from\r\n   * @param {object} position - the point to be nearest to\r\n   * @param {boolean} intersect - if true, only consider items that intersect the position\r\n   * @param {function} distanceMetric - function to provide the distance between points\r\n   * @return {ChartElement[]} the nearest items\r\n   */\n\n\n  function getNearestItems(chart, position, intersect, distanceMetric) {\n    var minDistance = Number.POSITIVE_INFINITY;\n    var nearestItems = [];\n    parseVisibleItems(chart, function (element) {\n      if (intersect && !element.inRange(position.x, position.y)) {\n        return;\n      }\n\n      var center = element.getCenterPoint();\n      var distance = distanceMetric(position, center);\n\n      if (distance < minDistance) {\n        nearestItems = [element];\n        minDistance = distance;\n      } else if (distance === minDistance) {\n        // Can have multiple items at the same distance in which case we sort by size\n        nearestItems.push(element);\n      }\n    });\n    return nearestItems;\n  }\n  /**\r\n   * Get a distance metric function for two points based on the\r\n   * axis mode setting\r\n   * @param {string} axis - the axis mode. x|y|xy\r\n   */\n\n\n  function getDistanceMetricForAxis(axis) {\n    var useX = axis.indexOf('x') !== -1;\n    var useY = axis.indexOf('y') !== -1;\n    return function (pt1, pt2) {\n      var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n      var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n      return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n    };\n  }\n\n  function indexMode(chart, e, options) {\n    var position = getRelativePosition(e, chart); // Default axis for index mode is 'x' to match old behaviour\n\n    options.axis = options.axis || 'x';\n    var distanceMetric = getDistanceMetricForAxis(options.axis);\n    var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n    var elements = [];\n\n    if (!items.length) {\n      return [];\n    }\n\n    chart._getSortedVisibleDatasetMetas().forEach(function (meta) {\n      var element = meta.data[items[0]._index]; // don't count items that are skipped (null data)\n\n      if (element && !element._view.skip) {\n        elements.push(element);\n      }\n    });\n\n    return elements;\n  }\n  /**\r\n   * @interface IInteractionOptions\r\n   */\n\n  /**\r\n   * If true, only consider items that intersect the point\r\n   * @name IInterfaceOptions#boolean\r\n   * @type Boolean\r\n   */\n\n  /**\r\n   * Contains interaction related functions\r\n   * @namespace Chart.Interaction\r\n   */\n\n\n  var core_interaction = {\n    // Helper function for different modes\n    modes: {\n      single: function single(chart, e) {\n        var position = getRelativePosition(e, chart);\n        var elements = [];\n        parseVisibleItems(chart, function (element) {\n          if (element.inRange(position.x, position.y)) {\n            elements.push(element);\n            return elements;\n          }\n        });\n        return elements.slice(0, 1);\n      },\n\n      /**\r\n       * @function Chart.Interaction.modes.label\r\n       * @deprecated since version 2.4.0\r\n       * @todo remove at version 3\r\n       * @private\r\n       */\n      label: indexMode,\n\n      /**\r\n       * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\r\n       * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\r\n       * @function Chart.Interaction.modes.index\r\n       * @since v2.4.0\r\n       * @param {Chart} chart - the chart we are returning items from\r\n       * @param {Event} e - the event we are find things at\r\n       * @param {IInteractionOptions} options - options to use during interaction\r\n       * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n       */\n      index: indexMode,\n\n      /**\r\n       * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\r\n       * If the options.intersect is false, we find the nearest item and return the items in that dataset\r\n       * @function Chart.Interaction.modes.dataset\r\n       * @param {Chart} chart - the chart we are returning items from\r\n       * @param {Event} e - the event we are find things at\r\n       * @param {IInteractionOptions} options - options to use during interaction\r\n       * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n       */\n      dataset: function dataset(chart, e, options) {\n        var position = getRelativePosition(e, chart);\n        options.axis = options.axis || 'xy';\n        var distanceMetric = getDistanceMetricForAxis(options.axis);\n        var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n        if (items.length > 0) {\n          items = chart.getDatasetMeta(items[0]._datasetIndex).data;\n        }\n\n        return items;\n      },\n\n      /**\r\n       * @function Chart.Interaction.modes.x-axis\r\n       * @deprecated since version 2.4.0. Use index mode and intersect == true\r\n       * @todo remove at version 3\r\n       * @private\r\n       */\n      'x-axis': function xAxis(chart, e) {\n        return indexMode(chart, e, {\n          intersect: false\n        });\n      },\n\n      /**\r\n       * Point mode returns all elements that hit test based on the event position\r\n       * of the event\r\n       * @function Chart.Interaction.modes.intersect\r\n       * @param {Chart} chart - the chart we are returning items from\r\n       * @param {Event} e - the event we are find things at\r\n       * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n       */\n      point: function point(chart, e) {\n        var position = getRelativePosition(e, chart);\n        return getIntersectItems(chart, position);\n      },\n\n      /**\r\n       * nearest mode returns the element closest to the point\r\n       * @function Chart.Interaction.modes.intersect\r\n       * @param {Chart} chart - the chart we are returning items from\r\n       * @param {Event} e - the event we are find things at\r\n       * @param {IInteractionOptions} options - options to use\r\n       * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n       */\n      nearest: function nearest(chart, e, options) {\n        var position = getRelativePosition(e, chart);\n        options.axis = options.axis || 'xy';\n        var distanceMetric = getDistanceMetricForAxis(options.axis);\n        return getNearestItems(chart, position, options.intersect, distanceMetric);\n      },\n\n      /**\r\n       * x mode returns the elements that hit-test at the current x coordinate\r\n       * @function Chart.Interaction.modes.x\r\n       * @param {Chart} chart - the chart we are returning items from\r\n       * @param {Event} e - the event we are find things at\r\n       * @param {IInteractionOptions} options - options to use\r\n       * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n       */\n      x: function x(chart, e, options) {\n        var position = getRelativePosition(e, chart);\n        var items = [];\n        var intersectsItem = false;\n        parseVisibleItems(chart, function (element) {\n          if (element.inXRange(position.x)) {\n            items.push(element);\n          }\n\n          if (element.inRange(position.x, position.y)) {\n            intersectsItem = true;\n          }\n        }); // If we want to trigger on an intersect and we don't have any items\n        // that intersect the position, return nothing\n\n        if (options.intersect && !intersectsItem) {\n          items = [];\n        }\n\n        return items;\n      },\n\n      /**\r\n       * y mode returns the elements that hit-test at the current y coordinate\r\n       * @function Chart.Interaction.modes.y\r\n       * @param {Chart} chart - the chart we are returning items from\r\n       * @param {Event} e - the event we are find things at\r\n       * @param {IInteractionOptions} options - options to use\r\n       * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n       */\n      y: function y(chart, e, options) {\n        var position = getRelativePosition(e, chart);\n        var items = [];\n        var intersectsItem = false;\n        parseVisibleItems(chart, function (element) {\n          if (element.inYRange(position.y)) {\n            items.push(element);\n          }\n\n          if (element.inRange(position.x, position.y)) {\n            intersectsItem = true;\n          }\n        }); // If we want to trigger on an intersect and we don't have any items\n        // that intersect the position, return nothing\n\n        if (options.intersect && !intersectsItem) {\n          items = [];\n        }\n\n        return items;\n      }\n    }\n  };\n  var extend = helpers$1.extend;\n\n  function filterByPosition(array, position) {\n    return helpers$1.where(array, function (v) {\n      return v.pos === position;\n    });\n  }\n\n  function sortByWeight(array, reverse) {\n    return array.sort(function (a, b) {\n      var v0 = reverse ? b : a;\n      var v1 = reverse ? a : b;\n      return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n    });\n  }\n\n  function wrapBoxes(boxes) {\n    var layoutBoxes = [];\n    var i, ilen, box;\n\n    for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n      box = boxes[i];\n      layoutBoxes.push({\n        index: i,\n        box: box,\n        pos: box.position,\n        horizontal: box.isHorizontal(),\n        weight: box.weight\n      });\n    }\n\n    return layoutBoxes;\n  }\n\n  function setLayoutDims(layouts, params) {\n    var i, ilen, layout;\n\n    for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n      layout = layouts[i]; // store width used instead of chartArea.w in fitBoxes\n\n      layout.width = layout.horizontal ? layout.box.fullWidth && params.availableWidth : params.vBoxMaxWidth; // store height used instead of chartArea.h in fitBoxes\n\n      layout.height = layout.horizontal && params.hBoxMaxHeight;\n    }\n  }\n\n  function buildLayoutBoxes(boxes) {\n    var layoutBoxes = wrapBoxes(boxes);\n    var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n    var right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n    var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n    var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n    return {\n      leftAndTop: left.concat(top),\n      rightAndBottom: right.concat(bottom),\n      chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n      vertical: left.concat(right),\n      horizontal: top.concat(bottom)\n    };\n  }\n\n  function getCombinedMax(maxPadding, chartArea, a, b) {\n    return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n  }\n\n  function updateDims(chartArea, params, layout) {\n    var box = layout.box;\n    var maxPadding = chartArea.maxPadding;\n    var newWidth, newHeight;\n\n    if (layout.size) {\n      // this layout was already counted for, lets first reduce old size\n      chartArea[layout.pos] -= layout.size;\n    }\n\n    layout.size = layout.horizontal ? box.height : box.width;\n    chartArea[layout.pos] += layout.size;\n\n    if (box.getPadding) {\n      var boxPadding = box.getPadding();\n      maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n      maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n      maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n      maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n    }\n\n    newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right');\n    newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom');\n\n    if (newWidth !== chartArea.w || newHeight !== chartArea.h) {\n      chartArea.w = newWidth;\n      chartArea.h = newHeight; // return true if chart area changed in layout's direction\n\n      var sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h];\n      return sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1]));\n    }\n  }\n\n  function handleMaxPadding(chartArea) {\n    var maxPadding = chartArea.maxPadding;\n\n    function updatePos(pos) {\n      var change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n      chartArea[pos] += change;\n      return change;\n    }\n\n    chartArea.y += updatePos('top');\n    chartArea.x += updatePos('left');\n    updatePos('right');\n    updatePos('bottom');\n  }\n\n  function getMargins(horizontal, chartArea) {\n    var maxPadding = chartArea.maxPadding;\n\n    function marginForPositions(positions) {\n      var margin = {\n        left: 0,\n        top: 0,\n        right: 0,\n        bottom: 0\n      };\n      positions.forEach(function (pos) {\n        margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n      });\n      return margin;\n    }\n\n    return horizontal ? marginForPositions(['left', 'right']) : marginForPositions(['top', 'bottom']);\n  }\n\n  function fitBoxes(boxes, chartArea, params) {\n    var refitBoxes = [];\n    var i, ilen, layout, box, refit, changed;\n\n    for (i = 0, ilen = boxes.length; i < ilen; ++i) {\n      layout = boxes[i];\n      box = layout.box;\n      box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n\n      if (updateDims(chartArea, params, layout)) {\n        changed = true;\n\n        if (refitBoxes.length) {\n          // Dimensions changed and there were non full width boxes before this\n          // -> we have to refit those\n          refit = true;\n        }\n      }\n\n      if (!box.fullWidth) {\n        // fullWidth boxes don't need to be re-fitted in any case\n        refitBoxes.push(layout);\n      }\n    }\n\n    return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed;\n  }\n\n  function placeBoxes(boxes, chartArea, params) {\n    var userPadding = params.padding;\n    var x = chartArea.x;\n    var y = chartArea.y;\n    var i, ilen, layout, box;\n\n    for (i = 0, ilen = boxes.length; i < ilen; ++i) {\n      layout = boxes[i];\n      box = layout.box;\n\n      if (layout.horizontal) {\n        box.left = box.fullWidth ? userPadding.left : chartArea.left;\n        box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;\n        box.top = y;\n        box.bottom = y + box.height;\n        box.width = box.right - box.left;\n        y = box.bottom;\n      } else {\n        box.left = x;\n        box.right = x + box.width;\n        box.top = chartArea.top;\n        box.bottom = chartArea.top + chartArea.h;\n        box.height = box.bottom - box.top;\n        x = box.right;\n      }\n    }\n\n    chartArea.x = x;\n    chartArea.y = y;\n  }\n\n  core_defaults._set('global', {\n    layout: {\n      padding: {\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0\n      }\n    }\n  });\n  /**\r\n   * @interface ILayoutItem\r\n   * @prop {string} position - The position of the item in the chart layout. Possible values are\r\n   * 'left', 'top', 'right', 'bottom', and 'chartArea'\r\n   * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\r\n   * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\r\n   * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\r\n   * @prop {function} update - Takes two parameters: width and height. Returns size of item\r\n   * @prop {function} getPadding -  Returns an object with padding on the edges\r\n   * @prop {number} width - Width of item. Must be valid after update()\r\n   * @prop {number} height - Height of item. Must be valid after update()\r\n   * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\r\n   * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\r\n   * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\r\n   * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\r\n   */\n  // The layout service is very self explanatory.  It's responsible for the layout within a chart.\n  // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n  // It is this service's responsibility of carrying out that layout.\n\n\n  var core_layouts = {\n    defaults: {},\n\n    /**\r\n     * Register a box to a chart.\r\n     * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\r\n     * @param {Chart} chart - the chart to use\r\n     * @param {ILayoutItem} item - the item to add to be layed out\r\n     */\n    addBox: function addBox(chart, item) {\n      if (!chart.boxes) {\n        chart.boxes = [];\n      } // initialize item with default values\n\n\n      item.fullWidth = item.fullWidth || false;\n      item.position = item.position || 'top';\n      item.weight = item.weight || 0;\n\n      item._layers = item._layers || function () {\n        return [{\n          z: 0,\n          draw: function draw() {\n            item.draw.apply(item, arguments);\n          }\n        }];\n      };\n\n      chart.boxes.push(item);\n    },\n\n    /**\r\n     * Remove a layoutItem from a chart\r\n     * @param {Chart} chart - the chart to remove the box from\r\n     * @param {ILayoutItem} layoutItem - the item to remove from the layout\r\n     */\n    removeBox: function removeBox(chart, layoutItem) {\n      var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\n      if (index !== -1) {\n        chart.boxes.splice(index, 1);\n      }\n    },\n\n    /**\r\n     * Sets (or updates) options on the given `item`.\r\n     * @param {Chart} chart - the chart in which the item lives (or will be added to)\r\n     * @param {ILayoutItem} item - the item to configure with the given options\r\n     * @param {object} options - the new item options.\r\n     */\n    configure: function configure(chart, item, options) {\n      var props = ['fullWidth', 'position', 'weight'];\n      var ilen = props.length;\n      var i = 0;\n      var prop;\n\n      for (; i < ilen; ++i) {\n        prop = props[i];\n\n        if (options.hasOwnProperty(prop)) {\n          item[prop] = options[prop];\n        }\n      }\n    },\n\n    /**\r\n     * Fits boxes of the given chart into the given size by having each box measure itself\r\n     * then running a fitting algorithm\r\n     * @param {Chart} chart - the chart\r\n     * @param {number} width - the width to fit into\r\n     * @param {number} height - the height to fit into\r\n     */\n    update: function update(chart, width, height) {\n      if (!chart) {\n        return;\n      }\n\n      var layoutOptions = chart.options.layout || {};\n      var padding = helpers$1.options.toPadding(layoutOptions.padding);\n      var availableWidth = width - padding.width;\n      var availableHeight = height - padding.height;\n      var boxes = buildLayoutBoxes(chart.boxes);\n      var verticalBoxes = boxes.vertical;\n      var horizontalBoxes = boxes.horizontal; // Essentially we now have any number of boxes on each of the 4 sides.\n      // Our canvas looks like the following.\n      // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n      // B1 is the bottom axis\n      // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n      // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n      // an error will be thrown.\n      //\n      // |----------------------------------------------------|\n      // |                  T1 (Full Width)                   |\n      // |----------------------------------------------------|\n      // |    |    |                 T2                  |    |\n      // |    |----|-------------------------------------|----|\n      // |    |    | C1 |                           | C2 |    |\n      // |    |    |----|                           |----|    |\n      // |    |    |                                     |    |\n      // | L1 | L2 |           ChartArea (C0)            | R1 |\n      // |    |    |                                     |    |\n      // |    |    |----|                           |----|    |\n      // |    |    | C3 |                           | C4 |    |\n      // |    |----|-------------------------------------|----|\n      // |    |    |                 B1                  |    |\n      // |----------------------------------------------------|\n      // |                  B2 (Full Width)                   |\n      // |----------------------------------------------------|\n      //\n\n      var params = Object.freeze({\n        outerWidth: width,\n        outerHeight: height,\n        padding: padding,\n        availableWidth: availableWidth,\n        vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length,\n        hBoxMaxHeight: availableHeight / 2\n      });\n      var chartArea = extend({\n        maxPadding: extend({}, padding),\n        w: availableWidth,\n        h: availableHeight,\n        x: padding.left,\n        y: padding.top\n      }, padding);\n      setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); // First fit vertical boxes\n\n      fitBoxes(verticalBoxes, chartArea, params); // Then fit horizontal boxes\n\n      if (fitBoxes(horizontalBoxes, chartArea, params)) {\n        // if the area changed, re-fit vertical boxes\n        fitBoxes(verticalBoxes, chartArea, params);\n      }\n\n      handleMaxPadding(chartArea); // Finally place the boxes to correct coordinates\n\n      placeBoxes(boxes.leftAndTop, chartArea, params); // Move to opposite side of chart\n\n      chartArea.x += chartArea.w;\n      chartArea.y += chartArea.h;\n      placeBoxes(boxes.rightAndBottom, chartArea, params);\n      chart.chartArea = {\n        left: chartArea.left,\n        top: chartArea.top,\n        right: chartArea.left + chartArea.w,\n        bottom: chartArea.top + chartArea.h\n      }; // Finally update boxes in chartArea (radial scale for example)\n\n      helpers$1.each(boxes.chartArea, function (layout) {\n        var box = layout.box;\n        extend(box, chart.chartArea);\n        box.update(chartArea.w, chartArea.h);\n      });\n    }\n  };\n  /**\r\n   * Platform fallback implementation (minimal).\r\n   * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\r\n   */\n\n  var platform_basic = {\n    acquireContext: function acquireContext(item) {\n      if (item && item.canvas) {\n        // Support for any object associated to a canvas (including a context2d)\n        item = item.canvas;\n      }\n\n      return item && item.getContext('2d') || null;\n    }\n  };\n  var platform_dom = \"/*\\r\\n * DOM element rendering detection\\r\\n * https://davidwalsh.name/detect-node-insertion\\r\\n */\\r\\n@keyframes chartjs-render-animation {\\r\\n\\tfrom { opacity: 0.99; }\\r\\n\\tto { opacity: 1; }\\r\\n}\\r\\n\\r\\n.chartjs-render-monitor {\\r\\n\\tanimation: chartjs-render-animation 0.001s;\\r\\n}\\r\\n\\r\\n/*\\r\\n * DOM element resizing detection\\r\\n * https://github.com/marcj/css-element-queries\\r\\n */\\r\\n.chartjs-size-monitor,\\r\\n.chartjs-size-monitor-expand,\\r\\n.chartjs-size-monitor-shrink {\\r\\n\\tposition: absolute;\\r\\n\\tdirection: ltr;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n\\tright: 0;\\r\\n\\tbottom: 0;\\r\\n\\toverflow: hidden;\\r\\n\\tpointer-events: none;\\r\\n\\tvisibility: hidden;\\r\\n\\tz-index: -1;\\r\\n}\\r\\n\\r\\n.chartjs-size-monitor-expand > div {\\r\\n\\tposition: absolute;\\r\\n\\twidth: 1000000px;\\r\\n\\theight: 1000000px;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n}\\r\\n\\r\\n.chartjs-size-monitor-shrink > div {\\r\\n\\tposition: absolute;\\r\\n\\twidth: 200%;\\r\\n\\theight: 200%;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n}\\r\\n\";\n  var platform_dom$1 = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    'default': platform_dom\n  });\n  var stylesheet = getCjsExportFromNamespace(platform_dom$1);\n  var EXPANDO_KEY = '$chartjs';\n  var CSS_PREFIX = 'chartjs-';\n  var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor';\n  var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\n  var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\n  var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n  /**\r\n   * DOM event types -> Chart.js event types.\r\n   * Note: only events with different types are mapped.\r\n   * @see https://developer.mozilla.org/en-US/docs/Web/Events\r\n   */\n\n  var EVENT_TYPES = {\n    touchstart: 'mousedown',\n    touchmove: 'mousemove',\n    touchend: 'mouseup',\n    pointerenter: 'mouseenter',\n    pointerdown: 'mousedown',\n    pointermove: 'mousemove',\n    pointerup: 'mouseup',\n    pointerleave: 'mouseout',\n    pointerout: 'mouseout'\n  };\n  /**\r\n   * The \"used\" size is the final value of a dimension property after all calculations have\r\n   * been performed. This method uses the computed style of `element` but returns undefined\r\n   * if the computed style is not expressed in pixels. That can happen in some cases where\r\n   * `element` has a size relative to its parent and this last one is not yet displayed,\r\n   * for example because of `display: none` on a parent node.\r\n   * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\r\n   * @returns {number} Size in pixels or undefined if unknown.\r\n   */\n\n  function readUsedSize(element, property) {\n    var value = helpers$1.getStyle(element, property);\n    var matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n    return matches ? Number(matches[1]) : undefined;\n  }\n  /**\r\n   * Initializes the canvas style and render size without modifying the canvas display size,\r\n   * since responsiveness is handled by the controller.resize() method. The config is used\r\n   * to determine the aspect ratio to apply in case no explicit height has been specified.\r\n   */\n\n\n  function initCanvas(canvas, config) {\n    var style = canvas.style; // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n    // returns null or '' if no explicit value has been set to the canvas attribute.\n\n    var renderHeight = canvas.getAttribute('height');\n    var renderWidth = canvas.getAttribute('width'); // Chart.js modifies some canvas values that we want to restore on destroy\n\n    canvas[EXPANDO_KEY] = {\n      initial: {\n        height: renderHeight,\n        width: renderWidth,\n        style: {\n          display: style.display,\n          height: style.height,\n          width: style.width\n        }\n      }\n    }; // Force canvas to display as block to avoid extra space caused by inline\n    // elements, which would interfere with the responsive resize process.\n    // https://github.com/chartjs/Chart.js/issues/2538\n\n    style.display = style.display || 'block';\n\n    if (renderWidth === null || renderWidth === '') {\n      var displayWidth = readUsedSize(canvas, 'width');\n\n      if (displayWidth !== undefined) {\n        canvas.width = displayWidth;\n      }\n    }\n\n    if (renderHeight === null || renderHeight === '') {\n      if (canvas.style.height === '') {\n        // If no explicit render height and style height, let's apply the aspect ratio,\n        // which one can be specified by the user but also by charts as default option\n        // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n        canvas.height = canvas.width / (config.options.aspectRatio || 2);\n      } else {\n        var displayHeight = readUsedSize(canvas, 'height');\n\n        if (displayWidth !== undefined) {\n          canvas.height = displayHeight;\n        }\n      }\n    }\n\n    return canvas;\n  }\n  /**\r\n   * Detects support for options object argument in addEventListener.\r\n   * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\r\n   * @private\r\n   */\n\n\n  var supportsEventListenerOptions = function () {\n    var supports = false;\n\n    try {\n      var options = Object.defineProperty({}, 'passive', {\n        // eslint-disable-next-line getter-return\n        get: function get() {\n          supports = true;\n        }\n      });\n      window.addEventListener('e', null, options);\n    } catch (e) {// continue regardless of error\n    }\n\n    return supports;\n  }(); // Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n  // https://github.com/chartjs/Chart.js/issues/4287\n\n\n  var eventListenerOptions = supportsEventListenerOptions ? {\n    passive: true\n  } : false;\n\n  function addListener(node, type, listener) {\n    node.addEventListener(type, listener, eventListenerOptions);\n  }\n\n  function removeListener(node, type, listener) {\n    node.removeEventListener(type, listener, eventListenerOptions);\n  }\n\n  function createEvent(type, chart, x, y, nativeEvent) {\n    return {\n      type: type,\n      chart: chart,\n      \"native\": nativeEvent || null,\n      x: x !== undefined ? x : null,\n      y: y !== undefined ? y : null\n    };\n  }\n\n  function fromNativeEvent(event, chart) {\n    var type = EVENT_TYPES[event.type] || event.type;\n    var pos = helpers$1.getRelativePosition(event, chart);\n    return createEvent(type, chart, pos.x, pos.y, event);\n  }\n\n  function throttled(fn, thisArg) {\n    var ticking = false;\n    var args = [];\n    return function () {\n      args = Array.prototype.slice.call(arguments);\n      thisArg = thisArg || this;\n\n      if (!ticking) {\n        ticking = true;\n        helpers$1.requestAnimFrame.call(window, function () {\n          ticking = false;\n          fn.apply(thisArg, args);\n        });\n      }\n    };\n  }\n\n  function createDiv(cls) {\n    var el = document.createElement('div');\n    el.className = cls || '';\n    return el;\n  } // Implementation based on https://github.com/marcj/css-element-queries\n\n\n  function createResizer(handler) {\n    var maxSize = 1000000; // NOTE(SB) Don't use innerHTML because it could be considered unsafe.\n    // https://github.com/chartjs/Chart.js/issues/5902\n\n    var resizer = createDiv(CSS_SIZE_MONITOR);\n    var expand = createDiv(CSS_SIZE_MONITOR + '-expand');\n    var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink');\n    expand.appendChild(createDiv());\n    shrink.appendChild(createDiv());\n    resizer.appendChild(expand);\n    resizer.appendChild(shrink);\n\n    resizer._reset = function () {\n      expand.scrollLeft = maxSize;\n      expand.scrollTop = maxSize;\n      shrink.scrollLeft = maxSize;\n      shrink.scrollTop = maxSize;\n    };\n\n    var onScroll = function onScroll() {\n      resizer._reset();\n\n      handler();\n    };\n\n    addListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n    addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n    return resizer;\n  } // https://davidwalsh.name/detect-node-insertion\n\n\n  function watchForRender(node, handler) {\n    var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n    var proxy = expando.renderProxy = function (e) {\n      if (e.animationName === CSS_RENDER_ANIMATION) {\n        handler();\n      }\n    };\n\n    helpers$1.each(ANIMATION_START_EVENTS, function (type) {\n      addListener(node, type, proxy);\n    }); // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n    // is removed then added back immediately (same animation frame?). Accessing the\n    // `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n    // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n    // https://github.com/chartjs/Chart.js/issues/4737\n\n    expando.reflow = !!node.offsetParent;\n    node.classList.add(CSS_RENDER_MONITOR);\n  }\n\n  function unwatchForRender(node) {\n    var expando = node[EXPANDO_KEY] || {};\n    var proxy = expando.renderProxy;\n\n    if (proxy) {\n      helpers$1.each(ANIMATION_START_EVENTS, function (type) {\n        removeListener(node, type, proxy);\n      });\n      delete expando.renderProxy;\n    }\n\n    node.classList.remove(CSS_RENDER_MONITOR);\n  }\n\n  function addResizeListener(node, listener, chart) {\n    var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); // Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\n    var resizer = expando.resizer = createResizer(throttled(function () {\n      if (expando.resizer) {\n        var container = chart.options.maintainAspectRatio && node.parentNode;\n        var w = container ? container.clientWidth : 0;\n        listener(createEvent('resize', chart));\n\n        if (container && container.clientWidth < w && chart.canvas) {\n          // If the container size shrank during chart resize, let's assume\n          // scrollbar appeared. So we resize again with the scrollbar visible -\n          // effectively making chart smaller and the scrollbar hidden again.\n          // Because we are inside `throttled`, and currently `ticking`, scroll\n          // events are ignored during this whole 2 resize process.\n          // If we assumed wrong and something else happened, we are resizing\n          // twice in a frame (potential performance issue)\n          listener(createEvent('resize', chart));\n        }\n      }\n    })); // The resizer needs to be attached to the node parent, so we first need to be\n    // sure that `node` is attached to the DOM before injecting the resizer element.\n\n    watchForRender(node, function () {\n      if (expando.resizer) {\n        var container = node.parentNode;\n\n        if (container && container !== resizer.parentNode) {\n          container.insertBefore(resizer, container.firstChild);\n        } // The container size might have changed, let's reset the resizer state.\n\n\n        resizer._reset();\n      }\n    });\n  }\n\n  function removeResizeListener(node) {\n    var expando = node[EXPANDO_KEY] || {};\n    var resizer = expando.resizer;\n    delete expando.resizer;\n    unwatchForRender(node);\n\n    if (resizer && resizer.parentNode) {\n      resizer.parentNode.removeChild(resizer);\n    }\n  }\n  /**\r\n   * Injects CSS styles inline if the styles are not already present.\r\n   * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the <style>.\r\n   * @param {string} css - the CSS to be injected.\r\n   */\n\n\n  function injectCSS(rootNode, css) {\n    // https://stackoverflow.com/q/3922139\n    var expando = rootNode[EXPANDO_KEY] || (rootNode[EXPANDO_KEY] = {});\n\n    if (!expando.containsStyles) {\n      expando.containsStyles = true;\n      css = '/* Chart.js */\\n' + css;\n      var style = document.createElement('style');\n      style.setAttribute('type', 'text/css');\n      style.appendChild(document.createTextNode(css));\n      rootNode.appendChild(style);\n    }\n  }\n\n  var platform_dom$2 = {\n    /**\r\n     * When `true`, prevents the automatic injection of the stylesheet required to\r\n     * correctly detect when the chart is added to the DOM and then resized. This\r\n     * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`)\r\n     * to be manually imported to make this library compatible with any CSP.\r\n     * See https://github.com/chartjs/Chart.js/issues/5208\r\n     */\n    disableCSSInjection: false,\n\n    /**\r\n     * This property holds whether this platform is enabled for the current environment.\r\n     * Currently used by platform.js to select the proper implementation.\r\n     * @private\r\n     */\n    _enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n    /**\r\n     * Initializes resources that depend on platform options.\r\n     * @param {HTMLCanvasElement} canvas - The Canvas element.\r\n     * @private\r\n     */\n    _ensureLoaded: function _ensureLoaded(canvas) {\n      if (!this.disableCSSInjection) {\n        // If the canvas is in a shadow DOM, then the styles must also be inserted\n        // into the same shadow DOM.\n        // https://github.com/chartjs/Chart.js/issues/5763\n        var root = canvas.getRootNode ? canvas.getRootNode() : document;\n        var targetNode = root.host ? root : document.head;\n        injectCSS(targetNode, stylesheet);\n      }\n    },\n    acquireContext: function acquireContext(item, config) {\n      if (typeof item === 'string') {\n        item = document.getElementById(item);\n      } else if (item.length) {\n        // Support for array based queries (such as jQuery)\n        item = item[0];\n      }\n\n      if (item && item.canvas) {\n        // Support for any object associated to a canvas (including a context2d)\n        item = item.canvas;\n      } // To prevent canvas fingerprinting, some add-ons undefine the getContext\n      // method, for example: https://github.com/kkapsner/CanvasBlocker\n      // https://github.com/chartjs/Chart.js/issues/2807\n\n\n      var context = item && item.getContext && item.getContext('2d'); // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n      // inside an iframe or when running in a protected environment. We could guess the\n      // types from their toString() value but let's keep things flexible and assume it's\n      // a sufficient condition if the item has a context2D which has item as `canvas`.\n      // https://github.com/chartjs/Chart.js/issues/3887\n      // https://github.com/chartjs/Chart.js/issues/4102\n      // https://github.com/chartjs/Chart.js/issues/4152\n\n      if (context && context.canvas === item) {\n        // Load platform resources on first chart creation, to make it possible to\n        // import the library before setting platform options.\n        this._ensureLoaded(item);\n\n        initCanvas(item, config);\n        return context;\n      }\n\n      return null;\n    },\n    releaseContext: function releaseContext(context) {\n      var canvas = context.canvas;\n\n      if (!canvas[EXPANDO_KEY]) {\n        return;\n      }\n\n      var initial = canvas[EXPANDO_KEY].initial;\n      ['height', 'width'].forEach(function (prop) {\n        var value = initial[prop];\n\n        if (helpers$1.isNullOrUndef(value)) {\n          canvas.removeAttribute(prop);\n        } else {\n          canvas.setAttribute(prop, value);\n        }\n      });\n      helpers$1.each(initial.style || {}, function (value, key) {\n        canvas.style[key] = value;\n      }); // The canvas render size might have been changed (and thus the state stack discarded),\n      // we can't use save() and restore() to restore the initial state. So make sure that at\n      // least the canvas context is reset to the default state by setting the canvas width.\n      // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n      // eslint-disable-next-line no-self-assign\n\n      canvas.width = canvas.width;\n      delete canvas[EXPANDO_KEY];\n    },\n    addEventListener: function addEventListener(chart, type, listener) {\n      var canvas = chart.canvas;\n\n      if (type === 'resize') {\n        // Note: the resize event is not supported on all browsers.\n        addResizeListener(canvas, listener, chart);\n        return;\n      }\n\n      var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n      var proxies = expando.proxies || (expando.proxies = {});\n\n      var proxy = proxies[chart.id + '_' + type] = function (event) {\n        listener(fromNativeEvent(event, chart));\n      };\n\n      addListener(canvas, type, proxy);\n    },\n    removeEventListener: function removeEventListener(chart, type, listener) {\n      var canvas = chart.canvas;\n\n      if (type === 'resize') {\n        // Note: the resize event is not supported on all browsers.\n        removeResizeListener(canvas);\n        return;\n      }\n\n      var expando = listener[EXPANDO_KEY] || {};\n      var proxies = expando.proxies || {};\n      var proxy = proxies[chart.id + '_' + type];\n\n      if (!proxy) {\n        return;\n      }\n\n      removeListener(canvas, type, proxy);\n    }\n  }; // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, use EventTarget.addEventListener instead.\r\n   * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\r\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\r\n   * @function Chart.helpers.addEvent\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers$1.addEvent = addListener;\n  /**\r\n   * Provided for backward compatibility, use EventTarget.removeEventListener instead.\r\n   * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\r\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\r\n   * @function Chart.helpers.removeEvent\r\n   * @deprecated since version 2.7.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers$1.removeEvent = removeListener; // @TODO Make possible to select another platform at build time.\n\n  var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic;\n  /**\r\n   * @namespace Chart.platform\r\n   * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\r\n   * @since 2.4.0\r\n   */\n\n  var platform = helpers$1.extend({\n    /**\r\n     * @since 2.7.0\r\n     */\n    initialize: function initialize() {},\n\n    /**\r\n     * Called at chart construction time, returns a context2d instance implementing\r\n     * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\r\n     * @param {*} item - The native item from which to acquire context (platform specific)\r\n     * @param {object} options - The chart options\r\n     * @returns {CanvasRenderingContext2D} context2d instance\r\n     */\n    acquireContext: function acquireContext() {},\n\n    /**\r\n     * Called at chart destruction time, releases any resources associated to the context\r\n     * previously returned by the acquireContext() method.\r\n     * @param {CanvasRenderingContext2D} context - The context2d instance\r\n     * @returns {boolean} true if the method succeeded, else false\r\n     */\n    releaseContext: function releaseContext() {},\n\n    /**\r\n     * Registers the specified listener on the given chart.\r\n     * @param {Chart} chart - Chart from which to listen for event\r\n     * @param {string} type - The ({@link IEvent}) type to listen for\r\n     * @param {function} listener - Receives a notification (an object that implements\r\n     * the {@link IEvent} interface) when an event of the specified type occurs.\r\n     */\n    addEventListener: function addEventListener() {},\n\n    /**\r\n     * Removes the specified listener previously registered with addEventListener.\r\n     * @param {Chart} chart - Chart from which to remove the listener\r\n     * @param {string} type - The ({@link IEvent}) type to remove\r\n     * @param {function} listener - The listener function to remove from the event target.\r\n     */\n    removeEventListener: function removeEventListener() {}\n  }, implementation);\n\n  core_defaults._set('global', {\n    plugins: {}\n  });\n  /**\r\n   * The plugin service singleton\r\n   * @namespace Chart.plugins\r\n   * @since 2.1.0\r\n   */\n\n\n  var core_plugins = {\n    /**\r\n     * Globally registered plugins.\r\n     * @private\r\n     */\n    _plugins: [],\n\n    /**\r\n     * This identifier is used to invalidate the descriptors cache attached to each chart\r\n     * when a global plugin is registered or unregistered. In this case, the cache ID is\r\n     * incremented and descriptors are regenerated during following API calls.\r\n     * @private\r\n     */\n    _cacheId: 0,\n\n    /**\r\n     * Registers the given plugin(s) if not already registered.\r\n     * @param {IPlugin[]|IPlugin} plugins plugin instance(s).\r\n     */\n    register: function register(plugins) {\n      var p = this._plugins;\n      [].concat(plugins).forEach(function (plugin) {\n        if (p.indexOf(plugin) === -1) {\n          p.push(plugin);\n        }\n      });\n      this._cacheId++;\n    },\n\n    /**\r\n     * Unregisters the given plugin(s) only if registered.\r\n     * @param {IPlugin[]|IPlugin} plugins plugin instance(s).\r\n     */\n    unregister: function unregister(plugins) {\n      var p = this._plugins;\n      [].concat(plugins).forEach(function (plugin) {\n        var idx = p.indexOf(plugin);\n\n        if (idx !== -1) {\n          p.splice(idx, 1);\n        }\n      });\n      this._cacheId++;\n    },\n\n    /**\r\n     * Remove all registered plugins.\r\n     * @since 2.1.5\r\n     */\n    clear: function clear() {\n      this._plugins = [];\n      this._cacheId++;\n    },\n\n    /**\r\n     * Returns the number of registered plugins?\r\n     * @returns {number}\r\n     * @since 2.1.5\r\n     */\n    count: function count() {\n      return this._plugins.length;\n    },\n\n    /**\r\n     * Returns all registered plugin instances.\r\n     * @returns {IPlugin[]} array of plugin objects.\r\n     * @since 2.1.5\r\n     */\n    getAll: function getAll() {\n      return this._plugins;\n    },\n\n    /**\r\n     * Calls enabled plugins for `chart` on the specified hook and with the given args.\r\n     * This method immediately returns as soon as a plugin explicitly returns false. The\r\n     * returned value can be used, for instance, to interrupt the current action.\r\n     * @param {Chart} chart - The chart instance for which plugins should be called.\r\n     * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\r\n     * @param {Array} [args] - Extra arguments to apply to the hook call.\r\n     * @returns {boolean} false if any of the plugins return false, else returns true.\r\n     */\n    notify: function notify(chart, hook, args) {\n      var descriptors = this.descriptors(chart);\n      var ilen = descriptors.length;\n      var i, descriptor, plugin, params, method;\n\n      for (i = 0; i < ilen; ++i) {\n        descriptor = descriptors[i];\n        plugin = descriptor.plugin;\n        method = plugin[hook];\n\n        if (typeof method === 'function') {\n          params = [chart].concat(args || []);\n          params.push(descriptor.options);\n\n          if (method.apply(plugin, params) === false) {\n            return false;\n          }\n        }\n      }\n\n      return true;\n    },\n\n    /**\r\n     * Returns descriptors of enabled plugins for the given chart.\r\n     * @returns {object[]} [{ plugin, options }]\r\n     * @private\r\n     */\n    descriptors: function descriptors(chart) {\n      var cache = chart.$plugins || (chart.$plugins = {});\n\n      if (cache.id === this._cacheId) {\n        return cache.descriptors;\n      }\n\n      var plugins = [];\n      var descriptors = [];\n      var config = chart && chart.config || {};\n      var options = config.options && config.options.plugins || {};\n\n      this._plugins.concat(config.plugins || []).forEach(function (plugin) {\n        var idx = plugins.indexOf(plugin);\n\n        if (idx !== -1) {\n          return;\n        }\n\n        var id = plugin.id;\n        var opts = options[id];\n\n        if (opts === false) {\n          return;\n        }\n\n        if (opts === true) {\n          opts = helpers$1.clone(core_defaults.global.plugins[id]);\n        }\n\n        plugins.push(plugin);\n        descriptors.push({\n          plugin: plugin,\n          options: opts || {}\n        });\n      });\n\n      cache.descriptors = descriptors;\n      cache.id = this._cacheId;\n      return descriptors;\n    },\n\n    /**\r\n     * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\r\n     * but in some cases, this reference can be changed by the user when updating options.\r\n     * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\r\n     * @private\r\n     */\n    _invalidate: function _invalidate(chart) {\n      delete chart.$plugins;\n    }\n  };\n  var core_scaleService = {\n    // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n    // use the new chart options to grab the correct scale\n    constructors: {},\n    // Use a registration function so that we can move to an ES6 map when we no longer need to support\n    // old browsers\n    // Scale config defaults\n    defaults: {},\n    registerScaleType: function registerScaleType(type, scaleConstructor, scaleDefaults) {\n      this.constructors[type] = scaleConstructor;\n      this.defaults[type] = helpers$1.clone(scaleDefaults);\n    },\n    getScaleConstructor: function getScaleConstructor(type) {\n      return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n    },\n    getScaleDefaults: function getScaleDefaults(type) {\n      // Return the scale defaults merged with the global settings so that we always use the latest ones\n      return this.defaults.hasOwnProperty(type) ? helpers$1.merge(Object.create(null), [core_defaults.scale, this.defaults[type]]) : {};\n    },\n    updateScaleDefaults: function updateScaleDefaults(type, additions) {\n      var me = this;\n\n      if (me.defaults.hasOwnProperty(type)) {\n        me.defaults[type] = helpers$1.extend(me.defaults[type], additions);\n      }\n    },\n    addScalesToLayout: function addScalesToLayout(chart) {\n      // Adds each scale to the chart.boxes array to be sized accordingly\n      helpers$1.each(chart.scales, function (scale) {\n        // Set ILayoutItem parameters for backwards compatibility\n        scale.fullWidth = scale.options.fullWidth;\n        scale.position = scale.options.position;\n        scale.weight = scale.options.weight;\n        core_layouts.addBox(chart, scale);\n      });\n    }\n  };\n  var valueOrDefault$8 = helpers$1.valueOrDefault;\n  var getRtlHelper = helpers$1.rtl.getRtlAdapter;\n\n  core_defaults._set('global', {\n    tooltips: {\n      enabled: true,\n      custom: null,\n      mode: 'nearest',\n      position: 'average',\n      intersect: true,\n      backgroundColor: 'rgba(0,0,0,0.8)',\n      titleFontStyle: 'bold',\n      titleSpacing: 2,\n      titleMarginBottom: 6,\n      titleFontColor: '#fff',\n      titleAlign: 'left',\n      bodySpacing: 2,\n      bodyFontColor: '#fff',\n      bodyAlign: 'left',\n      footerFontStyle: 'bold',\n      footerSpacing: 2,\n      footerMarginTop: 6,\n      footerFontColor: '#fff',\n      footerAlign: 'left',\n      yPadding: 6,\n      xPadding: 6,\n      caretPadding: 2,\n      caretSize: 5,\n      cornerRadius: 6,\n      multiKeyBackground: '#fff',\n      displayColors: true,\n      borderColor: 'rgba(0,0,0,0)',\n      borderWidth: 0,\n      callbacks: {\n        // Args are: (tooltipItems, data)\n        beforeTitle: helpers$1.noop,\n        title: function title(tooltipItems, data) {\n          var title = '';\n          var labels = data.labels;\n          var labelCount = labels ? labels.length : 0;\n\n          if (tooltipItems.length > 0) {\n            var item = tooltipItems[0];\n\n            if (item.label) {\n              title = item.label;\n            } else if (item.xLabel) {\n              title = item.xLabel;\n            } else if (labelCount > 0 && item.index < labelCount) {\n              title = labels[item.index];\n            }\n          }\n\n          return title;\n        },\n        afterTitle: helpers$1.noop,\n        // Args are: (tooltipItems, data)\n        beforeBody: helpers$1.noop,\n        // Args are: (tooltipItem, data)\n        beforeLabel: helpers$1.noop,\n        label: function label(tooltipItem, data) {\n          var label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n          if (label) {\n            label += ': ';\n          }\n\n          if (!helpers$1.isNullOrUndef(tooltipItem.value)) {\n            label += tooltipItem.value;\n          } else {\n            label += tooltipItem.yLabel;\n          }\n\n          return label;\n        },\n        labelColor: function labelColor(tooltipItem, chart) {\n          var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n          var activeElement = meta.data[tooltipItem.index];\n          var view = activeElement._view;\n          return {\n            borderColor: view.borderColor,\n            backgroundColor: view.backgroundColor\n          };\n        },\n        labelTextColor: function labelTextColor() {\n          return this._options.bodyFontColor;\n        },\n        afterLabel: helpers$1.noop,\n        // Args are: (tooltipItems, data)\n        afterBody: helpers$1.noop,\n        // Args are: (tooltipItems, data)\n        beforeFooter: helpers$1.noop,\n        footer: helpers$1.noop,\n        afterFooter: helpers$1.noop\n      }\n    }\n  });\n\n  var positioners = {\n    /**\r\n     * Average mode places the tooltip at the average position of the elements shown\r\n     * @function Chart.Tooltip.positioners.average\r\n     * @param elements {ChartElement[]} the elements being displayed in the tooltip\r\n     * @returns {object} tooltip position\r\n     */\n    average: function average(elements) {\n      if (!elements.length) {\n        return false;\n      }\n\n      var i, len;\n      var x = 0;\n      var y = 0;\n      var count = 0;\n\n      for (i = 0, len = elements.length; i < len; ++i) {\n        var el = elements[i];\n\n        if (el && el.hasValue()) {\n          var pos = el.tooltipPosition();\n          x += pos.x;\n          y += pos.y;\n          ++count;\n        }\n      }\n\n      return {\n        x: x / count,\n        y: y / count\n      };\n    },\n\n    /**\r\n     * Gets the tooltip position nearest of the item nearest to the event position\r\n     * @function Chart.Tooltip.positioners.nearest\r\n     * @param elements {Chart.Element[]} the tooltip elements\r\n     * @param eventPosition {object} the position of the event in canvas coordinates\r\n     * @returns {object} the tooltip position\r\n     */\n    nearest: function nearest(elements, eventPosition) {\n      var x = eventPosition.x;\n      var y = eventPosition.y;\n      var minDistance = Number.POSITIVE_INFINITY;\n      var i, len, nearestElement;\n\n      for (i = 0, len = elements.length; i < len; ++i) {\n        var el = elements[i];\n\n        if (el && el.hasValue()) {\n          var center = el.getCenterPoint();\n          var d = helpers$1.distanceBetweenPoints(eventPosition, center);\n\n          if (d < minDistance) {\n            minDistance = d;\n            nearestElement = el;\n          }\n        }\n      }\n\n      if (nearestElement) {\n        var tp = nearestElement.tooltipPosition();\n        x = tp.x;\n        y = tp.y;\n      }\n\n      return {\n        x: x,\n        y: y\n      };\n    }\n  }; // Helper to push or concat based on if the 2nd parameter is an array or not\n\n  function pushOrConcat(base, toPush) {\n    if (toPush) {\n      if (helpers$1.isArray(toPush)) {\n        // base = base.concat(toPush);\n        Array.prototype.push.apply(base, toPush);\n      } else {\n        base.push(toPush);\n      }\n    }\n\n    return base;\n  }\n  /**\r\n   * Returns array of strings split by newline\r\n   * @param {string} value - The value to split by newline.\r\n   * @returns {string[]} value if newline present - Returned from String split() method\r\n   * @function\r\n   */\n\n\n  function splitNewlines(str) {\n    if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n      return str.split('\\n');\n    }\n\n    return str;\n  }\n  /**\r\n   * Private helper to create a tooltip item model\r\n   * @param element - the chart element (point, arc, bar) to create the tooltip item for\r\n   * @return new tooltip item\r\n   */\n\n\n  function createTooltipItem(element) {\n    var xScale = element._xScale;\n    var yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\n    var index = element._index;\n    var datasetIndex = element._datasetIndex;\n\n    var controller = element._chart.getDatasetMeta(datasetIndex).controller;\n\n    var indexScale = controller._getIndexScale();\n\n    var valueScale = controller._getValueScale();\n\n    return {\n      xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n      yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n      label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '',\n      value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '',\n      index: index,\n      datasetIndex: datasetIndex,\n      x: element._model.x,\n      y: element._model.y\n    };\n  }\n  /**\r\n   * Helper to get the reset model for the tooltip\r\n   * @param tooltipOpts {object} the tooltip options\r\n   */\n\n\n  function getBaseModel(tooltipOpts) {\n    var globalDefaults = core_defaults.global;\n    return {\n      // Positioning\n      xPadding: tooltipOpts.xPadding,\n      yPadding: tooltipOpts.yPadding,\n      xAlign: tooltipOpts.xAlign,\n      yAlign: tooltipOpts.yAlign,\n      // Drawing direction and text direction\n      rtl: tooltipOpts.rtl,\n      textDirection: tooltipOpts.textDirection,\n      // Body\n      bodyFontColor: tooltipOpts.bodyFontColor,\n      _bodyFontFamily: valueOrDefault$8(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n      _bodyFontStyle: valueOrDefault$8(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n      _bodyAlign: tooltipOpts.bodyAlign,\n      bodyFontSize: valueOrDefault$8(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n      bodySpacing: tooltipOpts.bodySpacing,\n      // Title\n      titleFontColor: tooltipOpts.titleFontColor,\n      _titleFontFamily: valueOrDefault$8(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n      _titleFontStyle: valueOrDefault$8(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n      titleFontSize: valueOrDefault$8(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n      _titleAlign: tooltipOpts.titleAlign,\n      titleSpacing: tooltipOpts.titleSpacing,\n      titleMarginBottom: tooltipOpts.titleMarginBottom,\n      // Footer\n      footerFontColor: tooltipOpts.footerFontColor,\n      _footerFontFamily: valueOrDefault$8(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n      _footerFontStyle: valueOrDefault$8(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n      footerFontSize: valueOrDefault$8(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n      _footerAlign: tooltipOpts.footerAlign,\n      footerSpacing: tooltipOpts.footerSpacing,\n      footerMarginTop: tooltipOpts.footerMarginTop,\n      // Appearance\n      caretSize: tooltipOpts.caretSize,\n      cornerRadius: tooltipOpts.cornerRadius,\n      backgroundColor: tooltipOpts.backgroundColor,\n      opacity: 0,\n      legendColorBackground: tooltipOpts.multiKeyBackground,\n      displayColors: tooltipOpts.displayColors,\n      borderColor: tooltipOpts.borderColor,\n      borderWidth: tooltipOpts.borderWidth\n    };\n  }\n  /**\r\n   * Get the size of the tooltip\r\n   */\n\n\n  function getTooltipSize(tooltip, model) {\n    var ctx = tooltip._chart.ctx;\n    var height = model.yPadding * 2; // Tooltip Padding\n\n    var width = 0; // Count of all lines in the body\n\n    var body = model.body;\n    var combinedBodyLength = body.reduce(function (count, bodyItem) {\n      return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n    }, 0);\n    combinedBodyLength += model.beforeBody.length + model.afterBody.length;\n    var titleLineCount = model.title.length;\n    var footerLineCount = model.footer.length;\n    var titleFontSize = model.titleFontSize;\n    var bodyFontSize = model.bodyFontSize;\n    var footerFontSize = model.footerFontSize;\n    height += titleLineCount * titleFontSize; // Title Lines\n\n    height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\n    height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\n    height += combinedBodyLength * bodyFontSize; // Body Lines\n\n    height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\n    height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\n    height += footerLineCount * footerFontSize; // Footer Lines\n\n    height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n    // Title width\n\n    var widthPadding = 0;\n\n    var maxLineWidth = function maxLineWidth(line) {\n      width = Math.max(width, ctx.measureText(line).width + widthPadding);\n    };\n\n    ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n    helpers$1.each(model.title, maxLineWidth); // Body width\n\n    ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n    helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); // Body lines may include some extra width due to the color box\n\n    widthPadding = model.displayColors ? bodyFontSize + 2 : 0;\n    helpers$1.each(body, function (bodyItem) {\n      helpers$1.each(bodyItem.before, maxLineWidth);\n      helpers$1.each(bodyItem.lines, maxLineWidth);\n      helpers$1.each(bodyItem.after, maxLineWidth);\n    }); // Reset back to 0\n\n    widthPadding = 0; // Footer width\n\n    ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n    helpers$1.each(model.footer, maxLineWidth); // Add padding\n\n    width += 2 * model.xPadding;\n    return {\n      width: width,\n      height: height\n    };\n  }\n  /**\r\n   * Helper to get the alignment of a tooltip given the size\r\n   */\n\n\n  function determineAlignment(tooltip, size) {\n    var model = tooltip._model;\n    var chart = tooltip._chart;\n    var chartArea = tooltip._chart.chartArea;\n    var xAlign = 'center';\n    var yAlign = 'center';\n\n    if (model.y < size.height) {\n      yAlign = 'top';\n    } else if (model.y > chart.height - size.height) {\n      yAlign = 'bottom';\n    }\n\n    var lf, rf; // functions to determine left, right alignment\n\n    var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\n    var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\n    var midX = (chartArea.left + chartArea.right) / 2;\n    var midY = (chartArea.top + chartArea.bottom) / 2;\n\n    if (yAlign === 'center') {\n      lf = function lf(x) {\n        return x <= midX;\n      };\n\n      rf = function rf(x) {\n        return x > midX;\n      };\n    } else {\n      lf = function lf(x) {\n        return x <= size.width / 2;\n      };\n\n      rf = function rf(x) {\n        return x >= chart.width - size.width / 2;\n      };\n    }\n\n    olf = function olf(x) {\n      return x + size.width + model.caretSize + model.caretPadding > chart.width;\n    };\n\n    orf = function orf(x) {\n      return x - size.width - model.caretSize - model.caretPadding < 0;\n    };\n\n    yf = function yf(y) {\n      return y <= midY ? 'top' : 'bottom';\n    };\n\n    if (lf(model.x)) {\n      xAlign = 'left'; // Is tooltip too wide and goes over the right side of the chart.?\n\n      if (olf(model.x)) {\n        xAlign = 'center';\n        yAlign = yf(model.y);\n      }\n    } else if (rf(model.x)) {\n      xAlign = 'right'; // Is tooltip too wide and goes outside left edge of canvas?\n\n      if (orf(model.x)) {\n        xAlign = 'center';\n        yAlign = yf(model.y);\n      }\n    }\n\n    var opts = tooltip._options;\n    return {\n      xAlign: opts.xAlign ? opts.xAlign : xAlign,\n      yAlign: opts.yAlign ? opts.yAlign : yAlign\n    };\n  }\n  /**\r\n   * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\r\n   */\n\n\n  function getBackgroundPoint(vm, size, alignment, chart) {\n    // Background Position\n    var x = vm.x;\n    var y = vm.y;\n    var caretSize = vm.caretSize;\n    var caretPadding = vm.caretPadding;\n    var cornerRadius = vm.cornerRadius;\n    var xAlign = alignment.xAlign;\n    var yAlign = alignment.yAlign;\n    var paddingAndSize = caretSize + caretPadding;\n    var radiusAndPadding = cornerRadius + caretPadding;\n\n    if (xAlign === 'right') {\n      x -= size.width;\n    } else if (xAlign === 'center') {\n      x -= size.width / 2;\n\n      if (x + size.width > chart.width) {\n        x = chart.width - size.width;\n      }\n\n      if (x < 0) {\n        x = 0;\n      }\n    }\n\n    if (yAlign === 'top') {\n      y += paddingAndSize;\n    } else if (yAlign === 'bottom') {\n      y -= size.height + paddingAndSize;\n    } else {\n      y -= size.height / 2;\n    }\n\n    if (yAlign === 'center') {\n      if (xAlign === 'left') {\n        x += paddingAndSize;\n      } else if (xAlign === 'right') {\n        x -= paddingAndSize;\n      }\n    } else if (xAlign === 'left') {\n      x -= radiusAndPadding;\n    } else if (xAlign === 'right') {\n      x += radiusAndPadding;\n    }\n\n    return {\n      x: x,\n      y: y\n    };\n  }\n\n  function getAlignedX(vm, align) {\n    return align === 'center' ? vm.x + vm.width / 2 : align === 'right' ? vm.x + vm.width - vm.xPadding : vm.x + vm.xPadding;\n  }\n  /**\r\n   * Helper to build before and after body lines\r\n   */\n\n\n  function getBeforeAfterBodyLines(callback) {\n    return pushOrConcat([], splitNewlines(callback));\n  }\n\n  var exports$4 = core_element.extend({\n    initialize: function initialize() {\n      this._model = getBaseModel(this._options);\n      this._lastActive = [];\n    },\n    // Get the title\n    // Args are: (tooltipItem, data)\n    getTitle: function getTitle() {\n      var me = this;\n      var opts = me._options;\n      var callbacks = opts.callbacks;\n      var beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n      var title = callbacks.title.apply(me, arguments);\n      var afterTitle = callbacks.afterTitle.apply(me, arguments);\n      var lines = [];\n      lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n      lines = pushOrConcat(lines, splitNewlines(title));\n      lines = pushOrConcat(lines, splitNewlines(afterTitle));\n      return lines;\n    },\n    // Args are: (tooltipItem, data)\n    getBeforeBody: function getBeforeBody() {\n      return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));\n    },\n    // Args are: (tooltipItem, data)\n    getBody: function getBody(tooltipItems, data) {\n      var me = this;\n      var callbacks = me._options.callbacks;\n      var bodyItems = [];\n      helpers$1.each(tooltipItems, function (tooltipItem) {\n        var bodyItem = {\n          before: [],\n          lines: [],\n          after: []\n        };\n        pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));\n        pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n        pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));\n        bodyItems.push(bodyItem);\n      });\n      return bodyItems;\n    },\n    // Args are: (tooltipItem, data)\n    getAfterBody: function getAfterBody() {\n      return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));\n    },\n    // Get the footer and beforeFooter and afterFooter lines\n    // Args are: (tooltipItem, data)\n    getFooter: function getFooter() {\n      var me = this;\n      var callbacks = me._options.callbacks;\n      var beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n      var footer = callbacks.footer.apply(me, arguments);\n      var afterFooter = callbacks.afterFooter.apply(me, arguments);\n      var lines = [];\n      lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n      lines = pushOrConcat(lines, splitNewlines(footer));\n      lines = pushOrConcat(lines, splitNewlines(afterFooter));\n      return lines;\n    },\n    update: function update(changed) {\n      var me = this;\n      var opts = me._options; // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n      // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n      // which breaks any animations.\n\n      var existingModel = me._model;\n      var model = me._model = getBaseModel(opts);\n      var active = me._active;\n      var data = me._data; // In the case where active.length === 0 we need to keep these at existing values for good animations\n\n      var alignment = {\n        xAlign: existingModel.xAlign,\n        yAlign: existingModel.yAlign\n      };\n      var backgroundPoint = {\n        x: existingModel.x,\n        y: existingModel.y\n      };\n      var tooltipSize = {\n        width: existingModel.width,\n        height: existingModel.height\n      };\n      var tooltipPosition = {\n        x: existingModel.caretX,\n        y: existingModel.caretY\n      };\n      var i, len;\n\n      if (active.length) {\n        model.opacity = 1;\n        var labelColors = [];\n        var labelTextColors = [];\n        tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);\n        var tooltipItems = [];\n\n        for (i = 0, len = active.length; i < len; ++i) {\n          tooltipItems.push(createTooltipItem(active[i]));\n        } // If the user provided a filter function, use it to modify the tooltip items\n\n\n        if (opts.filter) {\n          tooltipItems = tooltipItems.filter(function (a) {\n            return opts.filter(a, data);\n          });\n        } // If the user provided a sorting function, use it to modify the tooltip items\n\n\n        if (opts.itemSort) {\n          tooltipItems = tooltipItems.sort(function (a, b) {\n            return opts.itemSort(a, b, data);\n          });\n        } // Determine colors for boxes\n\n\n        helpers$1.each(tooltipItems, function (tooltipItem) {\n          labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n          labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n        }); // Build the Text Lines\n\n        model.title = me.getTitle(tooltipItems, data);\n        model.beforeBody = me.getBeforeBody(tooltipItems, data);\n        model.body = me.getBody(tooltipItems, data);\n        model.afterBody = me.getAfterBody(tooltipItems, data);\n        model.footer = me.getFooter(tooltipItems, data); // Initial positioning and colors\n\n        model.x = tooltipPosition.x;\n        model.y = tooltipPosition.y;\n        model.caretPadding = opts.caretPadding;\n        model.labelColors = labelColors;\n        model.labelTextColors = labelTextColors; // data points\n\n        model.dataPoints = tooltipItems; // We need to determine alignment of the tooltip\n\n        tooltipSize = getTooltipSize(this, model);\n        alignment = determineAlignment(this, tooltipSize); // Final Size and Position\n\n        backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\n      } else {\n        model.opacity = 0;\n      }\n\n      model.xAlign = alignment.xAlign;\n      model.yAlign = alignment.yAlign;\n      model.x = backgroundPoint.x;\n      model.y = backgroundPoint.y;\n      model.width = tooltipSize.width;\n      model.height = tooltipSize.height; // Point where the caret on the tooltip points to\n\n      model.caretX = tooltipPosition.x;\n      model.caretY = tooltipPosition.y;\n      me._model = model;\n\n      if (changed && opts.custom) {\n        opts.custom.call(me, model);\n      }\n\n      return me;\n    },\n    drawCaret: function drawCaret(tooltipPoint, size) {\n      var ctx = this._chart.ctx;\n      var vm = this._view;\n      var caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n      ctx.lineTo(caretPosition.x1, caretPosition.y1);\n      ctx.lineTo(caretPosition.x2, caretPosition.y2);\n      ctx.lineTo(caretPosition.x3, caretPosition.y3);\n    },\n    getCaretPosition: function getCaretPosition(tooltipPoint, size, vm) {\n      var x1, x2, x3, y1, y2, y3;\n      var caretSize = vm.caretSize;\n      var cornerRadius = vm.cornerRadius;\n      var xAlign = vm.xAlign;\n      var yAlign = vm.yAlign;\n      var ptX = tooltipPoint.x;\n      var ptY = tooltipPoint.y;\n      var width = size.width;\n      var height = size.height;\n\n      if (yAlign === 'center') {\n        y2 = ptY + height / 2;\n\n        if (xAlign === 'left') {\n          x1 = ptX;\n          x2 = x1 - caretSize;\n          x3 = x1;\n          y1 = y2 + caretSize;\n          y3 = y2 - caretSize;\n        } else {\n          x1 = ptX + width;\n          x2 = x1 + caretSize;\n          x3 = x1;\n          y1 = y2 - caretSize;\n          y3 = y2 + caretSize;\n        }\n      } else {\n        if (xAlign === 'left') {\n          x2 = ptX + cornerRadius + caretSize;\n          x1 = x2 - caretSize;\n          x3 = x2 + caretSize;\n        } else if (xAlign === 'right') {\n          x2 = ptX + width - cornerRadius - caretSize;\n          x1 = x2 - caretSize;\n          x3 = x2 + caretSize;\n        } else {\n          x2 = vm.caretX;\n          x1 = x2 - caretSize;\n          x3 = x2 + caretSize;\n        }\n\n        if (yAlign === 'top') {\n          y1 = ptY;\n          y2 = y1 - caretSize;\n          y3 = y1;\n        } else {\n          y1 = ptY + height;\n          y2 = y1 + caretSize;\n          y3 = y1; // invert drawing order\n\n          var tmp = x3;\n          x3 = x1;\n          x1 = tmp;\n        }\n      }\n\n      return {\n        x1: x1,\n        x2: x2,\n        x3: x3,\n        y1: y1,\n        y2: y2,\n        y3: y3\n      };\n    },\n    drawTitle: function drawTitle(pt, vm, ctx) {\n      var title = vm.title;\n      var length = title.length;\n      var titleFontSize, titleSpacing, i;\n\n      if (length) {\n        var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);\n        pt.x = getAlignedX(vm, vm._titleAlign);\n        ctx.textAlign = rtlHelper.textAlign(vm._titleAlign);\n        ctx.textBaseline = 'middle';\n        titleFontSize = vm.titleFontSize;\n        titleSpacing = vm.titleSpacing;\n        ctx.fillStyle = vm.titleFontColor;\n        ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n        for (i = 0; i < length; ++i) {\n          ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFontSize / 2);\n          pt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n          if (i + 1 === length) {\n            pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n          }\n        }\n      }\n    },\n    drawBody: function drawBody(pt, vm, ctx) {\n      var bodyFontSize = vm.bodyFontSize;\n      var bodySpacing = vm.bodySpacing;\n      var bodyAlign = vm._bodyAlign;\n      var body = vm.body;\n      var drawColorBoxes = vm.displayColors;\n      var xLinePadding = 0;\n      var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;\n      var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);\n\n      var fillLineOfText = function fillLineOfText(line) {\n        ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyFontSize / 2);\n        pt.y += bodyFontSize + bodySpacing;\n      };\n\n      var bodyItem, textColor, labelColors, lines, i, j, ilen, jlen;\n      var bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n      ctx.textAlign = bodyAlign;\n      ctx.textBaseline = 'middle';\n      ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n      pt.x = getAlignedX(vm, bodyAlignForCalculation); // Before body lines\n\n      ctx.fillStyle = vm.bodyFontColor;\n      helpers$1.each(vm.beforeBody, fillLineOfText);\n      xLinePadding = drawColorBoxes && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? bodyFontSize / 2 + 1 : bodyFontSize + 2 : 0; // Draw body lines now\n\n      for (i = 0, ilen = body.length; i < ilen; ++i) {\n        bodyItem = body[i];\n        textColor = vm.labelTextColors[i];\n        labelColors = vm.labelColors[i];\n        ctx.fillStyle = textColor;\n        helpers$1.each(bodyItem.before, fillLineOfText);\n        lines = bodyItem.lines;\n\n        for (j = 0, jlen = lines.length; j < jlen; ++j) {\n          // Draw Legend-like boxes if needed\n          if (drawColorBoxes) {\n            var rtlColorX = rtlHelper.x(colorX); // Fill a white rect so that colours merge nicely if the opacity is < 1\n\n            ctx.fillStyle = vm.legendColorBackground;\n            ctx.fillRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize); // Border\n\n            ctx.lineWidth = 1;\n            ctx.strokeStyle = labelColors.borderColor;\n            ctx.strokeRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize); // Inner square\n\n            ctx.fillStyle = labelColors.backgroundColor;\n            ctx.fillRect(rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), bodyFontSize - 2), pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n            ctx.fillStyle = textColor;\n          }\n\n          fillLineOfText(lines[j]);\n        }\n\n        helpers$1.each(bodyItem.after, fillLineOfText);\n      } // Reset back to 0 for after body\n\n\n      xLinePadding = 0; // After body lines\n\n      helpers$1.each(vm.afterBody, fillLineOfText);\n      pt.y -= bodySpacing; // Remove last body spacing\n    },\n    drawFooter: function drawFooter(pt, vm, ctx) {\n      var footer = vm.footer;\n      var length = footer.length;\n      var footerFontSize, i;\n\n      if (length) {\n        var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);\n        pt.x = getAlignedX(vm, vm._footerAlign);\n        pt.y += vm.footerMarginTop;\n        ctx.textAlign = rtlHelper.textAlign(vm._footerAlign);\n        ctx.textBaseline = 'middle';\n        footerFontSize = vm.footerFontSize;\n        ctx.fillStyle = vm.footerFontColor;\n        ctx.font = helpers$1.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n        for (i = 0; i < length; ++i) {\n          ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFontSize / 2);\n          pt.y += footerFontSize + vm.footerSpacing;\n        }\n      }\n    },\n    drawBackground: function drawBackground(pt, vm, ctx, tooltipSize) {\n      ctx.fillStyle = vm.backgroundColor;\n      ctx.strokeStyle = vm.borderColor;\n      ctx.lineWidth = vm.borderWidth;\n      var xAlign = vm.xAlign;\n      var yAlign = vm.yAlign;\n      var x = pt.x;\n      var y = pt.y;\n      var width = tooltipSize.width;\n      var height = tooltipSize.height;\n      var radius = vm.cornerRadius;\n      ctx.beginPath();\n      ctx.moveTo(x + radius, y);\n\n      if (yAlign === 'top') {\n        this.drawCaret(pt, tooltipSize);\n      }\n\n      ctx.lineTo(x + width - radius, y);\n      ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\n      if (yAlign === 'center' && xAlign === 'right') {\n        this.drawCaret(pt, tooltipSize);\n      }\n\n      ctx.lineTo(x + width, y + height - radius);\n      ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\n      if (yAlign === 'bottom') {\n        this.drawCaret(pt, tooltipSize);\n      }\n\n      ctx.lineTo(x + radius, y + height);\n      ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\n      if (yAlign === 'center' && xAlign === 'left') {\n        this.drawCaret(pt, tooltipSize);\n      }\n\n      ctx.lineTo(x, y + radius);\n      ctx.quadraticCurveTo(x, y, x + radius, y);\n      ctx.closePath();\n      ctx.fill();\n\n      if (vm.borderWidth > 0) {\n        ctx.stroke();\n      }\n    },\n    draw: function draw() {\n      var ctx = this._chart.ctx;\n      var vm = this._view;\n\n      if (vm.opacity === 0) {\n        return;\n      }\n\n      var tooltipSize = {\n        width: vm.width,\n        height: vm.height\n      };\n      var pt = {\n        x: vm.x,\n        y: vm.y\n      }; // IE11/Edge does not like very small opacities, so snap to 0\n\n      var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; // Truthy/falsey value for empty tooltip\n\n      var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n      if (this._options.enabled && hasTooltipContent) {\n        ctx.save();\n        ctx.globalAlpha = opacity; // Draw Background\n\n        this.drawBackground(pt, vm, ctx, tooltipSize); // Draw Title, Body, and Footer\n\n        pt.y += vm.yPadding;\n        helpers$1.rtl.overrideTextDirection(ctx, vm.textDirection); // Titles\n\n        this.drawTitle(pt, vm, ctx); // Body\n\n        this.drawBody(pt, vm, ctx); // Footer\n\n        this.drawFooter(pt, vm, ctx);\n        helpers$1.rtl.restoreTextDirection(ctx, vm.textDirection);\n        ctx.restore();\n      }\n    },\n\n    /**\r\n     * Handle an event\r\n     * @private\r\n     * @param {IEvent} event - The event to handle\r\n     * @returns {boolean} true if the tooltip changed\r\n     */\n    handleEvent: function handleEvent(e) {\n      var me = this;\n      var options = me._options;\n      var changed = false;\n      me._lastActive = me._lastActive || []; // Find Active Elements for tooltips\n\n      if (e.type === 'mouseout') {\n        me._active = [];\n      } else {\n        me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\n        if (options.reverse) {\n          me._active.reverse();\n        }\n      } // Remember Last Actives\n\n\n      changed = !helpers$1.arrayEquals(me._active, me._lastActive); // Only handle target event on tooltip change\n\n      if (changed) {\n        me._lastActive = me._active;\n\n        if (options.enabled || options.custom) {\n          me._eventPosition = {\n            x: e.x,\n            y: e.y\n          };\n          me.update(true);\n          me.pivot();\n        }\n      }\n\n      return changed;\n    }\n  });\n  /**\r\n   * @namespace Chart.Tooltip.positioners\r\n   */\n\n  var positioners_1 = positioners;\n  var core_tooltip = exports$4;\n  core_tooltip.positioners = positioners_1;\n  var valueOrDefault$9 = helpers$1.valueOrDefault;\n\n  core_defaults._set('global', {\n    elements: {},\n    events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n    hover: {\n      onHover: null,\n      mode: 'nearest',\n      intersect: true,\n      animationDuration: 400\n    },\n    onClick: null,\n    maintainAspectRatio: true,\n    responsive: true,\n    responsiveAnimationDuration: 0\n  });\n  /**\r\n   * Recursively merge the given config objects representing the `scales` option\r\n   * by incorporating scale defaults in `xAxes` and `yAxes` array items, then\r\n   * returns a deep copy of the result, thus doesn't alter inputs.\r\n   */\n\n\n  function\n    /* config objects ... */\n  mergeScaleConfig() {\n    return helpers$1.merge(Object.create(null), [].slice.call(arguments), {\n      merger: function merger(key, target, source, options) {\n        if (key === 'xAxes' || key === 'yAxes') {\n          var slen = source[key].length;\n          var i, type, scale;\n\n          if (!target[key]) {\n            target[key] = [];\n          }\n\n          for (i = 0; i < slen; ++i) {\n            scale = source[key][i];\n            type = valueOrDefault$9(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n            if (i >= target[key].length) {\n              target[key].push({});\n            }\n\n            if (!target[key][i].type || scale.type && scale.type !== target[key][i].type) {\n              // new/untyped scale or type changed: let's apply the new defaults\n              // then merge source scale to correctly overwrite the defaults.\n              helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]);\n            } else {\n              // scales type are the same\n              helpers$1.merge(target[key][i], scale);\n            }\n          }\n        } else {\n          helpers$1._merger(key, target, source, options);\n        }\n      }\n    });\n  }\n  /**\r\n   * Recursively merge the given config objects as the root options by handling\r\n   * default scale options for the `scales` and `scale` properties, then returns\r\n   * a deep copy of the result, thus doesn't alter inputs.\r\n   */\n\n\n  function\n    /* config objects ... */\n  mergeConfig() {\n    return helpers$1.merge(Object.create(null), [].slice.call(arguments), {\n      merger: function merger(key, target, source, options) {\n        var tval = target[key] || Object.create(null);\n        var sval = source[key];\n\n        if (key === 'scales') {\n          // scale config merging is complex. Add our own function here for that\n          target[key] = mergeScaleConfig(tval, sval);\n        } else if (key === 'scale') {\n          // used in polar area & radar charts since there is only one scale\n          target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]);\n        } else {\n          helpers$1._merger(key, target, source, options);\n        }\n      }\n    });\n  }\n\n  function initConfig(config) {\n    config = config || Object.create(null); // Do NOT use mergeConfig for the data object because this method merges arrays\n    // and so would change references to labels and datasets, preventing data updates.\n\n    var data = config.data = config.data || {};\n    data.datasets = data.datasets || [];\n    data.labels = data.labels || [];\n    config.options = mergeConfig(core_defaults.global, core_defaults[config.type], config.options || {});\n    return config;\n  }\n\n  function updateConfig(chart) {\n    var newOptions = chart.options;\n    helpers$1.each(chart.scales, function (scale) {\n      core_layouts.removeBox(chart, scale);\n    });\n    newOptions = mergeConfig(core_defaults.global, core_defaults[chart.config.type], newOptions);\n    chart.options = chart.config.options = newOptions;\n    chart.ensureScalesHaveIDs();\n    chart.buildOrUpdateScales(); // Tooltip\n\n    chart.tooltip._options = newOptions.tooltips;\n    chart.tooltip.initialize();\n  }\n\n  function nextAvailableScaleId(axesOpts, prefix, index) {\n    var id;\n\n    var hasId = function hasId(obj) {\n      return obj.id === id;\n    };\n\n    do {\n      id = prefix + index++;\n    } while (helpers$1.findIndex(axesOpts, hasId) >= 0);\n\n    return id;\n  }\n\n  function positionIsHorizontal(position) {\n    return position === 'top' || position === 'bottom';\n  }\n\n  function compare2Level(l1, l2) {\n    return function (a, b) {\n      return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n    };\n  }\n\n  var Chart = function Chart(item, config) {\n    this.construct(item, config);\n    return this;\n  };\n\n  helpers$1.extend(Chart.prototype,\n  /** @lends Chart */\n  {\n    /**\r\n     * @private\r\n     */\n    construct: function construct(item, config) {\n      var me = this;\n      config = initConfig(config);\n      var context = platform.acquireContext(item, config);\n      var canvas = context && context.canvas;\n      var height = canvas && canvas.height;\n      var width = canvas && canvas.width;\n      me.id = helpers$1.uid();\n      me.ctx = context;\n      me.canvas = canvas;\n      me.config = config;\n      me.width = width;\n      me.height = height;\n      me.aspectRatio = height ? width / height : null;\n      me.options = config.options;\n      me._bufferedRender = false;\n      me._layers = [];\n      /**\r\n       * Provided for backward compatibility, Chart and Chart.Controller have been merged,\r\n       * the \"instance\" still need to be defined since it might be called from plugins.\r\n       * @prop Chart#chart\r\n       * @deprecated since version 2.6.0\r\n       * @todo remove at version 3\r\n       * @private\r\n       */\n\n      me.chart = me;\n      me.controller = me; // chart.chart.controller #inception\n      // Add the chart instance to the global namespace\n\n      Chart.instances[me.id] = me; // Define alias to the config data: `chart.data === chart.config.data`\n\n      Object.defineProperty(me, 'data', {\n        get: function get() {\n          return me.config.data;\n        },\n        set: function set(value) {\n          me.config.data = value;\n        }\n      });\n\n      if (!context || !canvas) {\n        // The given item is not a compatible context2d element, let's return before finalizing\n        // the chart initialization but after setting basic chart / controller properties that\n        // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n        // https://github.com/chartjs/Chart.js/issues/2807\n        console.error(\"Failed to create chart: can't acquire context from the given item\");\n        return;\n      }\n\n      me.initialize();\n      me.update();\n    },\n\n    /**\r\n     * @private\r\n     */\n    initialize: function initialize() {\n      var me = this; // Before init plugin notification\n\n      core_plugins.notify(me, 'beforeInit');\n      helpers$1.retinaScale(me, me.options.devicePixelRatio);\n      me.bindEvents();\n\n      if (me.options.responsive) {\n        // Initial resize before chart draws (must be silent to preserve initial animations).\n        me.resize(true);\n      }\n\n      me.initToolTip(); // After init plugin notification\n\n      core_plugins.notify(me, 'afterInit');\n      return me;\n    },\n    clear: function clear() {\n      helpers$1.canvas.clear(this);\n      return this;\n    },\n    stop: function stop() {\n      // Stops any current animation loop occurring\n      core_animations.cancelAnimation(this);\n      return this;\n    },\n    resize: function resize(silent) {\n      var me = this;\n      var options = me.options;\n      var canvas = me.canvas;\n      var aspectRatio = options.maintainAspectRatio && me.aspectRatio || null; // the canvas render width and height will be casted to integers so make sure that\n      // the canvas display style uses the same integer values to avoid blurring effect.\n      // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed\n\n      var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas)));\n      var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas)));\n\n      if (me.width === newWidth && me.height === newHeight) {\n        return;\n      }\n\n      canvas.width = me.width = newWidth;\n      canvas.height = me.height = newHeight;\n      canvas.style.width = newWidth + 'px';\n      canvas.style.height = newHeight + 'px';\n      helpers$1.retinaScale(me, options.devicePixelRatio);\n\n      if (!silent) {\n        // Notify any plugins about the resize\n        var newSize = {\n          width: newWidth,\n          height: newHeight\n        };\n        core_plugins.notify(me, 'resize', [newSize]); // Notify of resize\n\n        if (options.onResize) {\n          options.onResize(me, newSize);\n        }\n\n        me.stop();\n        me.update({\n          duration: options.responsiveAnimationDuration\n        });\n      }\n    },\n    ensureScalesHaveIDs: function ensureScalesHaveIDs() {\n      var options = this.options;\n      var scalesOptions = options.scales || {};\n      var scaleOptions = options.scale;\n      helpers$1.each(scalesOptions.xAxes, function (xAxisOptions, index) {\n        if (!xAxisOptions.id) {\n          xAxisOptions.id = nextAvailableScaleId(scalesOptions.xAxes, 'x-axis-', index);\n        }\n      });\n      helpers$1.each(scalesOptions.yAxes, function (yAxisOptions, index) {\n        if (!yAxisOptions.id) {\n          yAxisOptions.id = nextAvailableScaleId(scalesOptions.yAxes, 'y-axis-', index);\n        }\n      });\n\n      if (scaleOptions) {\n        scaleOptions.id = scaleOptions.id || 'scale';\n      }\n    },\n\n    /**\r\n     * Builds a map of scale ID to scale object for future lookup.\r\n     */\n    buildOrUpdateScales: function buildOrUpdateScales() {\n      var me = this;\n      var options = me.options;\n      var scales = me.scales || {};\n      var items = [];\n      var updated = Object.keys(scales).reduce(function (obj, id) {\n        obj[id] = false;\n        return obj;\n      }, {});\n\n      if (options.scales) {\n        items = items.concat((options.scales.xAxes || []).map(function (xAxisOptions) {\n          return {\n            options: xAxisOptions,\n            dtype: 'category',\n            dposition: 'bottom'\n          };\n        }), (options.scales.yAxes || []).map(function (yAxisOptions) {\n          return {\n            options: yAxisOptions,\n            dtype: 'linear',\n            dposition: 'left'\n          };\n        }));\n      }\n\n      if (options.scale) {\n        items.push({\n          options: options.scale,\n          dtype: 'radialLinear',\n          isDefault: true,\n          dposition: 'chartArea'\n        });\n      }\n\n      helpers$1.each(items, function (item) {\n        var scaleOptions = item.options;\n        var id = scaleOptions.id;\n        var scaleType = valueOrDefault$9(scaleOptions.type, item.dtype);\n\n        if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n          scaleOptions.position = item.dposition;\n        }\n\n        updated[id] = true;\n        var scale = null;\n\n        if (id in scales && scales[id].type === scaleType) {\n          scale = scales[id];\n          scale.options = scaleOptions;\n          scale.ctx = me.ctx;\n          scale.chart = me;\n        } else {\n          var scaleClass = core_scaleService.getScaleConstructor(scaleType);\n\n          if (!scaleClass) {\n            return;\n          }\n\n          scale = new scaleClass({\n            id: id,\n            type: scaleType,\n            options: scaleOptions,\n            ctx: me.ctx,\n            chart: me\n          });\n          scales[scale.id] = scale;\n        }\n\n        scale.mergeTicksOptions(); // TODO(SB): I think we should be able to remove this custom case (options.scale)\n        // and consider it as a regular scale part of the \"scales\"\" map only! This would\n        // make the logic easier and remove some useless? custom code.\n\n        if (item.isDefault) {\n          me.scale = scale;\n        }\n      }); // clear up discarded scales\n\n      helpers$1.each(updated, function (hasUpdated, id) {\n        if (!hasUpdated) {\n          delete scales[id];\n        }\n      });\n      me.scales = scales;\n      core_scaleService.addScalesToLayout(this);\n    },\n    buildOrUpdateControllers: function buildOrUpdateControllers() {\n      var me = this;\n      var newControllers = [];\n      var datasets = me.data.datasets;\n      var i, ilen;\n\n      for (i = 0, ilen = datasets.length; i < ilen; i++) {\n        var dataset = datasets[i];\n        var meta = me.getDatasetMeta(i);\n        var type = dataset.type || me.config.type;\n\n        if (meta.type && meta.type !== type) {\n          me.destroyDatasetMeta(i);\n          meta = me.getDatasetMeta(i);\n        }\n\n        meta.type = type;\n        meta.order = dataset.order || 0;\n        meta.index = i;\n\n        if (meta.controller) {\n          meta.controller.updateIndex(i);\n          meta.controller.linkScales();\n        } else {\n          var ControllerClass = controllers[meta.type];\n\n          if (ControllerClass === undefined) {\n            throw new Error('\"' + meta.type + '\" is not a chart type.');\n          }\n\n          meta.controller = new ControllerClass(me, i);\n          newControllers.push(meta.controller);\n        }\n      }\n\n      return newControllers;\n    },\n\n    /**\r\n     * Reset the elements of all datasets\r\n     * @private\r\n     */\n    resetElements: function resetElements() {\n      var me = this;\n      helpers$1.each(me.data.datasets, function (dataset, datasetIndex) {\n        me.getDatasetMeta(datasetIndex).controller.reset();\n      }, me);\n    },\n\n    /**\r\n    * Resets the chart back to it's state before the initial animation\r\n    */\n    reset: function reset() {\n      this.resetElements();\n      this.tooltip.initialize();\n    },\n    update: function update(config) {\n      var me = this;\n      var i, ilen;\n\n      if (!config || _typeof(config) !== 'object') {\n        // backwards compatibility\n        config = {\n          duration: config,\n          lazy: arguments[1]\n        };\n      }\n\n      updateConfig(me); // plugins options references might have change, let's invalidate the cache\n      // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\n      core_plugins._invalidate(me);\n\n      if (core_plugins.notify(me, 'beforeUpdate') === false) {\n        return;\n      } // In case the entire data object changed\n\n\n      me.tooltip._data = me.data; // Make sure dataset controllers are updated and new controllers are reset\n\n      var newControllers = me.buildOrUpdateControllers(); // Make sure all dataset controllers have correct meta data counts\n\n      for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) {\n        me.getDatasetMeta(i).controller.buildOrUpdateElements();\n      }\n\n      me.updateLayout(); // Can only reset the new controllers after the scales have been updated\n\n      if (me.options.animation && me.options.animation.duration) {\n        helpers$1.each(newControllers, function (controller) {\n          controller.reset();\n        });\n      }\n\n      me.updateDatasets(); // Need to reset tooltip in case it is displayed with elements that are removed\n      // after update.\n\n      me.tooltip.initialize(); // Last active contains items that were previously in the tooltip.\n      // When we reset the tooltip, we need to clear it\n\n      me.lastActive = []; // Do this before render so that any plugins that need final scale updates can use it\n\n      core_plugins.notify(me, 'afterUpdate');\n\n      me._layers.sort(compare2Level('z', '_idx'));\n\n      if (me._bufferedRender) {\n        me._bufferedRequest = {\n          duration: config.duration,\n          easing: config.easing,\n          lazy: config.lazy\n        };\n      } else {\n        me.render(config);\n      }\n    },\n\n    /**\r\n     * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\r\n     * hook, in which case, plugins will not be called on `afterLayout`.\r\n     * @private\r\n     */\n    updateLayout: function updateLayout() {\n      var me = this;\n\n      if (core_plugins.notify(me, 'beforeLayout') === false) {\n        return;\n      }\n\n      core_layouts.update(this, this.width, this.height);\n      me._layers = [];\n      helpers$1.each(me.boxes, function (box) {\n        // _configure is called twice, once in core.scale.update and once here.\n        // Here the boxes are fully updated and at their final positions.\n        if (box._configure) {\n          box._configure();\n        }\n\n        me._layers.push.apply(me._layers, box._layers());\n      }, me);\n\n      me._layers.forEach(function (item, index) {\n        item._idx = index;\n      });\n      /**\r\n       * Provided for backward compatibility, use `afterLayout` instead.\r\n       * @method IPlugin#afterScaleUpdate\r\n       * @deprecated since version 2.5.0\r\n       * @todo remove at version 3\r\n       * @private\r\n       */\n\n\n      core_plugins.notify(me, 'afterScaleUpdate');\n      core_plugins.notify(me, 'afterLayout');\n    },\n\n    /**\r\n     * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\r\n     * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\r\n     * @private\r\n     */\n    updateDatasets: function updateDatasets() {\n      var me = this;\n\n      if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n        return;\n      }\n\n      for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n        me.updateDataset(i);\n      }\n\n      core_plugins.notify(me, 'afterDatasetsUpdate');\n    },\n\n    /**\r\n     * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\r\n     * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\r\n     * @private\r\n     */\n    updateDataset: function updateDataset(index) {\n      var me = this;\n      var meta = me.getDatasetMeta(index);\n      var args = {\n        meta: meta,\n        index: index\n      };\n\n      if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n        return;\n      }\n\n      meta.controller._update();\n\n      core_plugins.notify(me, 'afterDatasetUpdate', [args]);\n    },\n    render: function render(config) {\n      var me = this;\n\n      if (!config || _typeof(config) !== 'object') {\n        // backwards compatibility\n        config = {\n          duration: config,\n          lazy: arguments[1]\n        };\n      }\n\n      var animationOptions = me.options.animation;\n      var duration = valueOrDefault$9(config.duration, animationOptions && animationOptions.duration);\n      var lazy = config.lazy;\n\n      if (core_plugins.notify(me, 'beforeRender') === false) {\n        return;\n      }\n\n      var onComplete = function onComplete(animation) {\n        core_plugins.notify(me, 'afterRender');\n        helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me);\n      };\n\n      if (animationOptions && duration) {\n        var animation = new core_animation({\n          numSteps: duration / 16.66,\n          // 60 fps\n          easing: config.easing || animationOptions.easing,\n          render: function render(chart, animationObject) {\n            var easingFunction = helpers$1.easing.effects[animationObject.easing];\n            var currentStep = animationObject.currentStep;\n            var stepDecimal = currentStep / animationObject.numSteps;\n            chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n          },\n          onAnimationProgress: animationOptions.onProgress,\n          onAnimationComplete: onComplete\n        });\n        core_animations.addAnimation(me, animation, duration, lazy);\n      } else {\n        me.draw(); // See https://github.com/chartjs/Chart.js/issues/3781\n\n        onComplete(new core_animation({\n          numSteps: 0,\n          chart: me\n        }));\n      }\n\n      return me;\n    },\n    draw: function draw(easingValue) {\n      var me = this;\n      var i, layers;\n      me.clear();\n\n      if (helpers$1.isNullOrUndef(easingValue)) {\n        easingValue = 1;\n      }\n\n      me.transition(easingValue);\n\n      if (me.width <= 0 || me.height <= 0) {\n        return;\n      }\n\n      if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n        return;\n      } // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n      // currently be part of layers. Instead, we draw\n      // layers <= 0 before(default, backward compat), and the rest after\n\n\n      layers = me._layers;\n\n      for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n        layers[i].draw(me.chartArea);\n      }\n\n      me.drawDatasets(easingValue); // Rest of layers\n\n      for (; i < layers.length; ++i) {\n        layers[i].draw(me.chartArea);\n      }\n\n      me._drawTooltip(easingValue);\n\n      core_plugins.notify(me, 'afterDraw', [easingValue]);\n    },\n\n    /**\r\n     * @private\r\n     */\n    transition: function transition(easingValue) {\n      var me = this;\n\n      for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n        if (me.isDatasetVisible(i)) {\n          me.getDatasetMeta(i).controller.transition(easingValue);\n        }\n      }\n\n      me.tooltip.transition(easingValue);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getSortedDatasetMetas: function _getSortedDatasetMetas(filterVisible) {\n      var me = this;\n      var datasets = me.data.datasets || [];\n      var result = [];\n      var i, ilen;\n\n      for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n        if (!filterVisible || me.isDatasetVisible(i)) {\n          result.push(me.getDatasetMeta(i));\n        }\n      }\n\n      result.sort(compare2Level('order', 'index'));\n      return result;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getSortedVisibleDatasetMetas: function _getSortedVisibleDatasetMetas() {\n      return this._getSortedDatasetMetas(true);\n    },\n\n    /**\r\n     * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\r\n     * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\r\n     * @private\r\n     */\n    drawDatasets: function drawDatasets(easingValue) {\n      var me = this;\n      var metasets, i;\n\n      if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n        return;\n      }\n\n      metasets = me._getSortedVisibleDatasetMetas();\n\n      for (i = metasets.length - 1; i >= 0; --i) {\n        me.drawDataset(metasets[i], easingValue);\n      }\n\n      core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n    },\n\n    /**\r\n     * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\r\n     * hook, in which case, plugins will not be called on `afterDatasetDraw`.\r\n     * @private\r\n     */\n    drawDataset: function drawDataset(meta, easingValue) {\n      var me = this;\n      var args = {\n        meta: meta,\n        index: meta.index,\n        easingValue: easingValue\n      };\n\n      if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n        return;\n      }\n\n      meta.controller.draw(easingValue);\n      core_plugins.notify(me, 'afterDatasetDraw', [args]);\n    },\n\n    /**\r\n     * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\r\n     * hook, in which case, plugins will not be called on `afterTooltipDraw`.\r\n     * @private\r\n     */\n    _drawTooltip: function _drawTooltip(easingValue) {\n      var me = this;\n      var tooltip = me.tooltip;\n      var args = {\n        tooltip: tooltip,\n        easingValue: easingValue\n      };\n\n      if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n        return;\n      }\n\n      tooltip.draw();\n      core_plugins.notify(me, 'afterTooltipDraw', [args]);\n    },\n\n    /**\r\n     * Get the single element that was clicked on\r\n     * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\r\n     */\n    getElementAtEvent: function getElementAtEvent(e) {\n      return core_interaction.modes.single(this, e);\n    },\n    getElementsAtEvent: function getElementsAtEvent(e) {\n      return core_interaction.modes.label(this, e, {\n        intersect: true\n      });\n    },\n    getElementsAtXAxis: function getElementsAtXAxis(e) {\n      return core_interaction.modes['x-axis'](this, e, {\n        intersect: true\n      });\n    },\n    getElementsAtEventForMode: function getElementsAtEventForMode(e, mode, options) {\n      var method = core_interaction.modes[mode];\n\n      if (typeof method === 'function') {\n        return method(this, e, options);\n      }\n\n      return [];\n    },\n    getDatasetAtEvent: function getDatasetAtEvent(e) {\n      return core_interaction.modes.dataset(this, e, {\n        intersect: true\n      });\n    },\n    getDatasetMeta: function getDatasetMeta(datasetIndex) {\n      var me = this;\n      var dataset = me.data.datasets[datasetIndex];\n\n      if (!dataset._meta) {\n        dataset._meta = {};\n      }\n\n      var meta = dataset._meta[me.id];\n\n      if (!meta) {\n        meta = dataset._meta[me.id] = {\n          type: null,\n          data: [],\n          dataset: null,\n          controller: null,\n          hidden: null,\n          // See isDatasetVisible() comment\n          xAxisID: null,\n          yAxisID: null,\n          order: dataset.order || 0,\n          index: datasetIndex\n        };\n      }\n\n      return meta;\n    },\n    getVisibleDatasetCount: function getVisibleDatasetCount() {\n      var count = 0;\n\n      for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n        if (this.isDatasetVisible(i)) {\n          count++;\n        }\n      }\n\n      return count;\n    },\n    isDatasetVisible: function isDatasetVisible(datasetIndex) {\n      var meta = this.getDatasetMeta(datasetIndex); // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n      // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\n      return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n    },\n    generateLegend: function generateLegend() {\n      return this.options.legendCallback(this);\n    },\n\n    /**\r\n     * @private\r\n     */\n    destroyDatasetMeta: function destroyDatasetMeta(datasetIndex) {\n      var id = this.id;\n      var dataset = this.data.datasets[datasetIndex];\n      var meta = dataset._meta && dataset._meta[id];\n\n      if (meta) {\n        meta.controller.destroy();\n        delete dataset._meta[id];\n      }\n    },\n    destroy: function destroy() {\n      var me = this;\n      var canvas = me.canvas;\n      var i, ilen;\n      me.stop(); // dataset controllers need to cleanup associated data\n\n      for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n        me.destroyDatasetMeta(i);\n      }\n\n      if (canvas) {\n        me.unbindEvents();\n        helpers$1.canvas.clear(me);\n        platform.releaseContext(me.ctx);\n        me.canvas = null;\n        me.ctx = null;\n      }\n\n      core_plugins.notify(me, 'destroy');\n      delete Chart.instances[me.id];\n    },\n    toBase64Image: function toBase64Image() {\n      return this.canvas.toDataURL.apply(this.canvas, arguments);\n    },\n    initToolTip: function initToolTip() {\n      var me = this;\n      me.tooltip = new core_tooltip({\n        _chart: me,\n        _chartInstance: me,\n        // deprecated, backward compatibility\n        _data: me.data,\n        _options: me.options.tooltips\n      }, me);\n    },\n\n    /**\r\n     * @private\r\n     */\n    bindEvents: function bindEvents() {\n      var me = this;\n      var listeners = me._listeners = {};\n\n      var listener = function listener() {\n        me.eventHandler.apply(me, arguments);\n      };\n\n      helpers$1.each(me.options.events, function (type) {\n        platform.addEventListener(me, type, listener);\n        listeners[type] = listener;\n      }); // Elements used to detect size change should not be injected for non responsive charts.\n      // See https://github.com/chartjs/Chart.js/issues/2210\n\n      if (me.options.responsive) {\n        listener = function listener() {\n          me.resize();\n        };\n\n        platform.addEventListener(me, 'resize', listener);\n        listeners.resize = listener;\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    unbindEvents: function unbindEvents() {\n      var me = this;\n      var listeners = me._listeners;\n\n      if (!listeners) {\n        return;\n      }\n\n      delete me._listeners;\n      helpers$1.each(listeners, function (listener, type) {\n        platform.removeEventListener(me, type, listener);\n      });\n    },\n    updateHoverStyle: function updateHoverStyle(elements, mode, enabled) {\n      var prefix = enabled ? 'set' : 'remove';\n      var element, i, ilen;\n\n      for (i = 0, ilen = elements.length; i < ilen; ++i) {\n        element = elements[i];\n\n        if (element) {\n          this.getDatasetMeta(element._datasetIndex).controller[prefix + 'HoverStyle'](element);\n        }\n      }\n\n      if (mode === 'dataset') {\n        this.getDatasetMeta(elements[0]._datasetIndex).controller['_' + prefix + 'DatasetHoverStyle']();\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    eventHandler: function eventHandler(e) {\n      var me = this;\n      var tooltip = me.tooltip;\n\n      if (core_plugins.notify(me, 'beforeEvent', [e]) === false) {\n        return;\n      } // Buffer any update calls so that renders do not occur\n\n\n      me._bufferedRender = true;\n      me._bufferedRequest = null;\n      var changed = me.handleEvent(e); // for smooth tooltip animations issue #4989\n      // the tooltip should be the source of change\n      // Animation check workaround:\n      // tooltip._start will be null when tooltip isn't animating\n\n      if (tooltip) {\n        changed = tooltip._start ? tooltip.handleEvent(e) : changed | tooltip.handleEvent(e);\n      }\n\n      core_plugins.notify(me, 'afterEvent', [e]);\n      var bufferedRequest = me._bufferedRequest;\n\n      if (bufferedRequest) {\n        // If we have an update that was triggered, we need to do a normal render\n        me.render(bufferedRequest);\n      } else if (changed && !me.animating) {\n        // If entering, leaving, or changing elements, animate the change via pivot\n        me.stop(); // We only need to render at this point. Updating will cause scales to be\n        // recomputed generating flicker & using more memory than necessary.\n\n        me.render({\n          duration: me.options.hover.animationDuration,\n          lazy: true\n        });\n      }\n\n      me._bufferedRender = false;\n      me._bufferedRequest = null;\n      return me;\n    },\n\n    /**\r\n     * Handle an event\r\n     * @private\r\n     * @param {IEvent} event the event to handle\r\n     * @return {boolean} true if the chart needs to re-render\r\n     */\n    handleEvent: function handleEvent(e) {\n      var me = this;\n      var options = me.options || {};\n      var hoverOptions = options.hover;\n      var changed = false;\n      me.lastActive = me.lastActive || []; // Find Active Elements for hover and tooltips\n\n      if (e.type === 'mouseout') {\n        me.active = [];\n      } else {\n        me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n      } // Invoke onHover hook\n      // Need to call with native event here to not break backwards compatibility\n\n\n      helpers$1.callback(options.onHover || options.hover.onHover, [e[\"native\"], me.active], me);\n\n      if (e.type === 'mouseup' || e.type === 'click') {\n        if (options.onClick) {\n          // Use e.native here for backwards compatibility\n          options.onClick.call(me, e[\"native\"], me.active);\n        }\n      } // Remove styling for last active (even if it may still be active)\n\n\n      if (me.lastActive.length) {\n        me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n      } // Built in hover styling\n\n\n      if (me.active.length && hoverOptions.mode) {\n        me.updateHoverStyle(me.active, hoverOptions.mode, true);\n      }\n\n      changed = !helpers$1.arrayEquals(me.active, me.lastActive); // Remember Last Actives\n\n      me.lastActive = me.active;\n      return changed;\n    }\n  });\n  /**\r\n   * NOTE(SB) We actually don't use this container anymore but we need to keep it\r\n   * for backward compatibility. Though, it can still be useful for plugins that\r\n   * would need to work on multiple charts?!\r\n   */\n\n  Chart.instances = {};\n  var core_controller = Chart; // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, use Chart instead.\r\n   * @class Chart.Controller\r\n   * @deprecated since version 2.6\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  Chart.Controller = Chart;\n  /**\r\n   * Provided for backward compatibility, not available anymore.\r\n   * @namespace Chart\r\n   * @deprecated since version 2.8\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  Chart.types = {};\n  /**\r\n   * Provided for backward compatibility, not available anymore.\r\n   * @namespace Chart.helpers.configMerge\r\n   * @deprecated since version 2.8.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers$1.configMerge = mergeConfig;\n  /**\r\n   * Provided for backward compatibility, not available anymore.\r\n   * @namespace Chart.helpers.scaleMerge\r\n   * @deprecated since version 2.8.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  helpers$1.scaleMerge = mergeScaleConfig;\n\n  var core_helpers = function core_helpers() {\n    // -- Basic js utility methods\n    helpers$1.where = function (collection, filterCallback) {\n      if (helpers$1.isArray(collection) && Array.prototype.filter) {\n        return collection.filter(filterCallback);\n      }\n\n      var filtered = [];\n      helpers$1.each(collection, function (item) {\n        if (filterCallback(item)) {\n          filtered.push(item);\n        }\n      });\n      return filtered;\n    };\n\n    helpers$1.findIndex = Array.prototype.findIndex ? function (array, callback, scope) {\n      return array.findIndex(callback, scope);\n    } : function (array, callback, scope) {\n      scope = scope === undefined ? array : scope;\n\n      for (var i = 0, ilen = array.length; i < ilen; ++i) {\n        if (callback.call(scope, array[i], i, array)) {\n          return i;\n        }\n      }\n\n      return -1;\n    };\n\n    helpers$1.findNextWhere = function (arrayToSearch, filterCallback, startIndex) {\n      // Default to start of the array\n      if (helpers$1.isNullOrUndef(startIndex)) {\n        startIndex = -1;\n      }\n\n      for (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n        var currentItem = arrayToSearch[i];\n\n        if (filterCallback(currentItem)) {\n          return currentItem;\n        }\n      }\n    };\n\n    helpers$1.findPreviousWhere = function (arrayToSearch, filterCallback, startIndex) {\n      // Default to end of the array\n      if (helpers$1.isNullOrUndef(startIndex)) {\n        startIndex = arrayToSearch.length;\n      }\n\n      for (var i = startIndex - 1; i >= 0; i--) {\n        var currentItem = arrayToSearch[i];\n\n        if (filterCallback(currentItem)) {\n          return currentItem;\n        }\n      }\n    }; // -- Math methods\n\n\n    helpers$1.isNumber = function (n) {\n      return !isNaN(parseFloat(n)) && isFinite(n);\n    };\n\n    helpers$1.almostEquals = function (x, y, epsilon) {\n      return Math.abs(x - y) < epsilon;\n    };\n\n    helpers$1.almostWhole = function (x, epsilon) {\n      var rounded = Math.round(x);\n      return rounded - epsilon <= x && rounded + epsilon >= x;\n    };\n\n    helpers$1.max = function (array) {\n      return array.reduce(function (max, value) {\n        if (!isNaN(value)) {\n          return Math.max(max, value);\n        }\n\n        return max;\n      }, Number.NEGATIVE_INFINITY);\n    };\n\n    helpers$1.min = function (array) {\n      return array.reduce(function (min, value) {\n        if (!isNaN(value)) {\n          return Math.min(min, value);\n        }\n\n        return min;\n      }, Number.POSITIVE_INFINITY);\n    };\n\n    helpers$1.sign = Math.sign ? function (x) {\n      return Math.sign(x);\n    } : function (x) {\n      x = +x; // convert to a number\n\n      if (x === 0 || isNaN(x)) {\n        return x;\n      }\n\n      return x > 0 ? 1 : -1;\n    };\n\n    helpers$1.toRadians = function (degrees) {\n      return degrees * (Math.PI / 180);\n    };\n\n    helpers$1.toDegrees = function (radians) {\n      return radians * (180 / Math.PI);\n    };\n    /**\r\n     * Returns the number of decimal places\r\n     * i.e. the number of digits after the decimal point, of the value of this Number.\r\n     * @param {number} x - A number.\r\n     * @returns {number} The number of decimal places.\r\n     * @private\r\n     */\n\n\n    helpers$1._decimalPlaces = function (x) {\n      if (!helpers$1.isFinite(x)) {\n        return;\n      }\n\n      var e = 1;\n      var p = 0;\n\n      while (Math.round(x * e) / e !== x) {\n        e *= 10;\n        p++;\n      }\n\n      return p;\n    }; // Gets the angle from vertical upright to the point about a centre.\n\n\n    helpers$1.getAngleFromPoint = function (centrePoint, anglePoint) {\n      var distanceFromXCenter = anglePoint.x - centrePoint.x;\n      var distanceFromYCenter = anglePoint.y - centrePoint.y;\n      var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n      var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n      if (angle < -0.5 * Math.PI) {\n        angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n      }\n\n      return {\n        angle: angle,\n        distance: radialDistanceFromCenter\n      };\n    };\n\n    helpers$1.distanceBetweenPoints = function (pt1, pt2) {\n      return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n    };\n    /**\r\n     * Provided for backward compatibility, not available anymore\r\n     * @function Chart.helpers.aliasPixel\r\n     * @deprecated since version 2.8.0\r\n     * @todo remove at version 3\r\n     */\n\n\n    helpers$1.aliasPixel = function (pixelWidth) {\n      return pixelWidth % 2 === 0 ? 0 : 0.5;\n    };\n    /**\r\n     * Returns the aligned pixel value to avoid anti-aliasing blur\r\n     * @param {Chart} chart - The chart instance.\r\n     * @param {number} pixel - A pixel value.\r\n     * @param {number} width - The width of the element.\r\n     * @returns {number} The aligned pixel value.\r\n     * @private\r\n     */\n\n\n    helpers$1._alignPixel = function (chart, pixel, width) {\n      var devicePixelRatio = chart.currentDevicePixelRatio;\n      var halfWidth = width / 2;\n      return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n    };\n\n    helpers$1.splineCurve = function (firstPoint, middlePoint, afterPoint, t) {\n      // Props to Rob Spencer at scaled innovation for his post on splining between points\n      // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n      // This function must also respect \"skipped\" points\n      var previous = firstPoint.skip ? middlePoint : firstPoint;\n      var current = middlePoint;\n      var next = afterPoint.skip ? middlePoint : afterPoint;\n      var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n      var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n      var s01 = d01 / (d01 + d12);\n      var s12 = d12 / (d01 + d12); // If all points are the same, s01 & s02 will be inf\n\n      s01 = isNaN(s01) ? 0 : s01;\n      s12 = isNaN(s12) ? 0 : s12;\n      var fa = t * s01; // scaling factor for triangle Ta\n\n      var fb = t * s12;\n      return {\n        previous: {\n          x: current.x - fa * (next.x - previous.x),\n          y: current.y - fa * (next.y - previous.y)\n        },\n        next: {\n          x: current.x + fb * (next.x - previous.x),\n          y: current.y + fb * (next.y - previous.y)\n        }\n      };\n    };\n\n    helpers$1.EPSILON = Number.EPSILON || 1e-14;\n\n    helpers$1.splineCurveMonotone = function (points) {\n      // This function calculates Bézier control points in a similar way than |splineCurve|,\n      // but preserves monotonicity of the provided data and ensures no local extremums are added\n      // between the dataset discrete points due to the interpolation.\n      // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n      var pointsWithTangents = (points || []).map(function (point) {\n        return {\n          model: point._model,\n          deltaK: 0,\n          mK: 0\n        };\n      }); // Calculate slopes (deltaK) and initialize tangents (mK)\n\n      var pointsLen = pointsWithTangents.length;\n      var i, pointBefore, pointCurrent, pointAfter;\n\n      for (i = 0; i < pointsLen; ++i) {\n        pointCurrent = pointsWithTangents[i];\n\n        if (pointCurrent.model.skip) {\n          continue;\n        }\n\n        pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n        pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\n        if (pointAfter && !pointAfter.model.skip) {\n          var slopeDeltaX = pointAfter.model.x - pointCurrent.model.x; // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\n          pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n        }\n\n        if (!pointBefore || pointBefore.model.skip) {\n          pointCurrent.mK = pointCurrent.deltaK;\n        } else if (!pointAfter || pointAfter.model.skip) {\n          pointCurrent.mK = pointBefore.deltaK;\n        } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n          pointCurrent.mK = 0;\n        } else {\n          pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n        }\n      } // Adjust tangents to ensure monotonic properties\n\n\n      var alphaK, betaK, tauK, squaredMagnitude;\n\n      for (i = 0; i < pointsLen - 1; ++i) {\n        pointCurrent = pointsWithTangents[i];\n        pointAfter = pointsWithTangents[i + 1];\n\n        if (pointCurrent.model.skip || pointAfter.model.skip) {\n          continue;\n        }\n\n        if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n          pointCurrent.mK = pointAfter.mK = 0;\n          continue;\n        }\n\n        alphaK = pointCurrent.mK / pointCurrent.deltaK;\n        betaK = pointAfter.mK / pointCurrent.deltaK;\n        squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\n        if (squaredMagnitude <= 9) {\n          continue;\n        }\n\n        tauK = 3 / Math.sqrt(squaredMagnitude);\n        pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n        pointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n      } // Compute control points\n\n\n      var deltaX;\n\n      for (i = 0; i < pointsLen; ++i) {\n        pointCurrent = pointsWithTangents[i];\n\n        if (pointCurrent.model.skip) {\n          continue;\n        }\n\n        pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n        pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\n        if (pointBefore && !pointBefore.model.skip) {\n          deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n          pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n          pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n        }\n\n        if (pointAfter && !pointAfter.model.skip) {\n          deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n          pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n          pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n        }\n      }\n    };\n\n    helpers$1.nextItem = function (collection, index, loop) {\n      if (loop) {\n        return index >= collection.length - 1 ? collection[0] : collection[index + 1];\n      }\n\n      return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n    };\n\n    helpers$1.previousItem = function (collection, index, loop) {\n      if (loop) {\n        return index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n      }\n\n      return index <= 0 ? collection[0] : collection[index - 1];\n    }; // Implementation of the nice number algorithm used in determining where axis labels will go\n\n\n    helpers$1.niceNum = function (range, round) {\n      var exponent = Math.floor(helpers$1.log10(range));\n      var fraction = range / Math.pow(10, exponent);\n      var niceFraction;\n\n      if (round) {\n        if (fraction < 1.5) {\n          niceFraction = 1;\n        } else if (fraction < 3) {\n          niceFraction = 2;\n        } else if (fraction < 7) {\n          niceFraction = 5;\n        } else {\n          niceFraction = 10;\n        }\n      } else if (fraction <= 1.0) {\n        niceFraction = 1;\n      } else if (fraction <= 2) {\n        niceFraction = 2;\n      } else if (fraction <= 5) {\n        niceFraction = 5;\n      } else {\n        niceFraction = 10;\n      }\n\n      return niceFraction * Math.pow(10, exponent);\n    }; // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\n\n    helpers$1.requestAnimFrame = function () {\n      if (typeof window === 'undefined') {\n        return function (callback) {\n          callback();\n        };\n      }\n\n      return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n        return window.setTimeout(callback, 1000 / 60);\n      };\n    }(); // -- DOM methods\n\n\n    helpers$1.getRelativePosition = function (evt, chart) {\n      var mouseX, mouseY;\n      var e = evt.originalEvent || evt;\n      var canvas = evt.target || evt.srcElement;\n      var boundingRect = canvas.getBoundingClientRect();\n      var touches = e.touches;\n\n      if (touches && touches.length > 0) {\n        mouseX = touches[0].clientX;\n        mouseY = touches[0].clientY;\n      } else {\n        mouseX = e.clientX;\n        mouseY = e.clientY;\n      } // Scale mouse coordinates into canvas coordinates\n      // by following the pattern laid out by 'jerryj' in the comments of\n      // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\n\n      var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left'));\n      var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top'));\n      var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right'));\n      var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom'));\n      var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n      var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n      // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\n      mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / width * canvas.width / chart.currentDevicePixelRatio);\n      mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / height * canvas.height / chart.currentDevicePixelRatio);\n      return {\n        x: mouseX,\n        y: mouseY\n      };\n    }; // Private helper function to convert max-width/max-height values that may be percentages into a number\n\n\n    function parseMaxStyle(styleValue, node, parentProperty) {\n      var valueInPixels;\n\n      if (typeof styleValue === 'string') {\n        valueInPixels = parseInt(styleValue, 10);\n\n        if (styleValue.indexOf('%') !== -1) {\n          // percentage * size in dimension\n          valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n        }\n      } else {\n        valueInPixels = styleValue;\n      }\n\n      return valueInPixels;\n    }\n    /**\r\n     * Returns if the given value contains an effective constraint.\r\n     * @private\r\n     */\n\n\n    function isConstrainedValue(value) {\n      return value !== undefined && value !== null && value !== 'none';\n    }\n    /**\r\n     * Returns the max width or height of the given DOM node in a cross-browser compatible fashion\r\n     * @param {HTMLElement} domNode - the node to check the constraint on\r\n     * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height')\r\n     * @param {string} percentageProperty - property of parent to use when calculating width as a percentage\r\n     * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser}\r\n     */\n\n\n    function getConstraintDimension(domNode, maxStyle, percentageProperty) {\n      var view = document.defaultView;\n\n      var parentNode = helpers$1._getParentNode(domNode);\n\n      var constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n      var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n      var hasCNode = isConstrainedValue(constrainedNode);\n      var hasCContainer = isConstrainedValue(constrainedContainer);\n      var infinity = Number.POSITIVE_INFINITY;\n\n      if (hasCNode || hasCContainer) {\n        return Math.min(hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n      }\n\n      return 'none';\n    } // returns Number or undefined if no constraint\n\n\n    helpers$1.getConstraintWidth = function (domNode) {\n      return getConstraintDimension(domNode, 'max-width', 'clientWidth');\n    }; // returns Number or undefined if no constraint\n\n\n    helpers$1.getConstraintHeight = function (domNode) {\n      return getConstraintDimension(domNode, 'max-height', 'clientHeight');\n    };\n    /**\r\n     * @private\r\n    \t */\n\n\n    helpers$1._calculatePadding = function (container, padding, parentDimension) {\n      padding = helpers$1.getStyle(container, padding);\n      return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10);\n    };\n    /**\r\n     * @private\r\n     */\n\n\n    helpers$1._getParentNode = function (domNode) {\n      var parent = domNode.parentNode;\n\n      if (parent && parent.toString() === '[object ShadowRoot]') {\n        parent = parent.host;\n      }\n\n      return parent;\n    };\n\n    helpers$1.getMaximumWidth = function (domNode) {\n      var container = helpers$1._getParentNode(domNode);\n\n      if (!container) {\n        return domNode.clientWidth;\n      }\n\n      var clientWidth = container.clientWidth;\n\n      var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth);\n\n      var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth);\n\n      var w = clientWidth - paddingLeft - paddingRight;\n      var cw = helpers$1.getConstraintWidth(domNode);\n      return isNaN(cw) ? w : Math.min(w, cw);\n    };\n\n    helpers$1.getMaximumHeight = function (domNode) {\n      var container = helpers$1._getParentNode(domNode);\n\n      if (!container) {\n        return domNode.clientHeight;\n      }\n\n      var clientHeight = container.clientHeight;\n\n      var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight);\n\n      var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight);\n\n      var h = clientHeight - paddingTop - paddingBottom;\n      var ch = helpers$1.getConstraintHeight(domNode);\n      return isNaN(ch) ? h : Math.min(h, ch);\n    };\n\n    helpers$1.getStyle = function (el, property) {\n      return el.currentStyle ? el.currentStyle[property] : document.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n    };\n\n    helpers$1.retinaScale = function (chart, forceRatio) {\n      var pixelRatio = chart.currentDevicePixelRatio = forceRatio || typeof window !== 'undefined' && window.devicePixelRatio || 1;\n\n      if (pixelRatio === 1) {\n        return;\n      }\n\n      var canvas = chart.canvas;\n      var height = chart.height;\n      var width = chart.width;\n      canvas.height = height * pixelRatio;\n      canvas.width = width * pixelRatio;\n      chart.ctx.scale(pixelRatio, pixelRatio); // If no style has been set on the canvas, the render size is used as display size,\n      // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n      // See https://github.com/chartjs/Chart.js/issues/3575\n\n      if (!canvas.style.height && !canvas.style.width) {\n        canvas.style.height = height + 'px';\n        canvas.style.width = width + 'px';\n      }\n    }; // -- Canvas methods\n\n\n    helpers$1.fontString = function (pixelSize, fontStyle, fontFamily) {\n      return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n    };\n\n    helpers$1.longestText = function (ctx, font, arrayOfThings, cache) {\n      cache = cache || {};\n      var data = cache.data = cache.data || {};\n      var gc = cache.garbageCollect = cache.garbageCollect || [];\n\n      if (cache.font !== font) {\n        data = cache.data = {};\n        gc = cache.garbageCollect = [];\n        cache.font = font;\n      }\n\n      ctx.font = font;\n      var longest = 0;\n      var ilen = arrayOfThings.length;\n      var i, j, jlen, thing, nestedThing;\n\n      for (i = 0; i < ilen; i++) {\n        thing = arrayOfThings[i]; // Undefined strings and arrays should not be measured\n\n        if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) {\n          longest = helpers$1.measureText(ctx, data, gc, longest, thing);\n        } else if (helpers$1.isArray(thing)) {\n          // if it is an array lets measure each element\n          // to do maybe simplify this function a bit so we can do this more recursively?\n          for (j = 0, jlen = thing.length; j < jlen; j++) {\n            nestedThing = thing[j]; // Undefined strings and arrays should not be measured\n\n            if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) {\n              longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing);\n            }\n          }\n        }\n      }\n\n      var gcLen = gc.length / 2;\n\n      if (gcLen > arrayOfThings.length) {\n        for (i = 0; i < gcLen; i++) {\n          delete data[gc[i]];\n        }\n\n        gc.splice(0, gcLen);\n      }\n\n      return longest;\n    };\n\n    helpers$1.measureText = function (ctx, data, gc, longest, string) {\n      var textWidth = data[string];\n\n      if (!textWidth) {\n        textWidth = data[string] = ctx.measureText(string).width;\n        gc.push(string);\n      }\n\n      if (textWidth > longest) {\n        longest = textWidth;\n      }\n\n      return longest;\n    };\n    /**\r\n     * @deprecated\r\n     */\n\n\n    helpers$1.numberOfLabelLines = function (arrayOfThings) {\n      var numberOfLines = 1;\n      helpers$1.each(arrayOfThings, function (thing) {\n        if (helpers$1.isArray(thing)) {\n          if (thing.length > numberOfLines) {\n            numberOfLines = thing.length;\n          }\n        }\n      });\n      return numberOfLines;\n    };\n\n    helpers$1.color = !chartjsColor ? function (value) {\n      console.error('Color.js not found!');\n      return value;\n    } : function (value) {\n      /* global CanvasGradient */\n      if (value instanceof CanvasGradient) {\n        value = core_defaults.global.defaultColor;\n      }\n\n      return chartjsColor(value);\n    };\n\n    helpers$1.getHoverColor = function (colorValue) {\n      /* global CanvasPattern */\n      return colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient ? colorValue : helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n    };\n  };\n\n  function _abstract() {\n    throw new Error('This method is not implemented: either no adapter can ' + 'be found or an incomplete integration was provided.');\n  }\n  /**\r\n   * Date adapter (current used by the time scale)\r\n   * @namespace Chart._adapters._date\r\n   * @memberof Chart._adapters\r\n   * @private\r\n   */\n\n  /**\r\n   * Currently supported unit string values.\r\n   * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')}\r\n   * @memberof Chart._adapters._date\r\n   * @name Unit\r\n   */\n\n  /**\r\n   * @class\r\n   */\n\n\n  function DateAdapter(options) {\n    this.options = options || {};\n  }\n\n  helpers$1.extend(DateAdapter.prototype,\n  /** @lends DateAdapter */\n  {\n    /**\r\n     * Returns a map of time formats for the supported formatting units defined\r\n     * in Unit as well as 'datetime' representing a detailed date/time string.\r\n     * @returns {{string: string}}\r\n     */\n    formats: _abstract,\n\n    /**\r\n     * Parses the given `value` and return the associated timestamp.\r\n     * @param {any} value - the value to parse (usually comes from the data)\r\n     * @param {string} [format] - the expected data format\r\n     * @returns {(number|null)}\r\n     * @function\r\n     */\n    parse: _abstract,\n\n    /**\r\n     * Returns the formatted date in the specified `format` for a given `timestamp`.\r\n     * @param {number} timestamp - the timestamp to format\r\n     * @param {string} format - the date/time token\r\n     * @return {string}\r\n     * @function\r\n     */\n    format: _abstract,\n\n    /**\r\n     * Adds the specified `amount` of `unit` to the given `timestamp`.\r\n     * @param {number} timestamp - the input timestamp\r\n     * @param {number} amount - the amount to add\r\n     * @param {Unit} unit - the unit as string\r\n     * @return {number}\r\n     * @function\r\n     */\n    add: _abstract,\n\n    /**\r\n     * Returns the number of `unit` between the given timestamps.\r\n     * @param {number} max - the input timestamp (reference)\r\n     * @param {number} min - the timestamp to substract\r\n     * @param {Unit} unit - the unit as string\r\n     * @return {number}\r\n     * @function\r\n     */\n    diff: _abstract,\n\n    /**\r\n     * Returns start of `unit` for the given `timestamp`.\r\n     * @param {number} timestamp - the input timestamp\r\n     * @param {Unit} unit - the unit as string\r\n     * @param {number} [weekday] - the ISO day of the week with 1 being Monday\r\n     * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\r\n     * @function\r\n     */\n    startOf: _abstract,\n\n    /**\r\n     * Returns end of `unit` for the given `timestamp`.\r\n     * @param {number} timestamp - the input timestamp\r\n     * @param {Unit} unit - the unit as string\r\n     * @function\r\n     */\n    endOf: _abstract,\n    // DEPRECATIONS\n\n    /**\r\n     * Provided for backward compatibility for scale.getValueForPixel(),\r\n     * this method should be overridden only by the moment adapter.\r\n     * @deprecated since version 2.8.0\r\n     * @todo remove at version 3\r\n     * @private\r\n     */\n    _create: function _create(value) {\n      return value;\n    }\n  });\n\n  DateAdapter.override = function (members) {\n    helpers$1.extend(DateAdapter.prototype, members);\n  };\n\n  var _date = DateAdapter;\n  var core_adapters = {\n    _date: _date\n  };\n  /**\r\n   * Namespace to hold static tick generation functions\r\n   * @namespace Chart.Ticks\r\n   */\n\n  var core_ticks = {\n    /**\r\n     * Namespace to hold formatters for different types of ticks\r\n     * @namespace Chart.Ticks.formatters\r\n     */\n    formatters: {\n      /**\r\n       * Formatter for value labels\r\n       * @method Chart.Ticks.formatters.values\r\n       * @param value the value to display\r\n       * @return {string|string[]} the label to display\r\n       */\n      values: function values(value) {\n        return helpers$1.isArray(value) ? value : '' + value;\n      },\n\n      /**\r\n       * Formatter for linear numeric ticks\r\n       * @method Chart.Ticks.formatters.linear\r\n       * @param tickValue {number} the value to be formatted\r\n       * @param index {number} the position of the tickValue parameter in the ticks array\r\n       * @param ticks {number[]} the list of ticks being converted\r\n       * @return {string} string representation of the tickValue parameter\r\n       */\n      linear: function linear(tickValue, index, ticks) {\n        // If we have lots of ticks, don't use the ones\n        var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\n        if (Math.abs(delta) > 1) {\n          if (tickValue !== Math.floor(tickValue)) {\n            // not an integer\n            delta = tickValue - Math.floor(tickValue);\n          }\n        }\n\n        var logDelta = helpers$1.log10(Math.abs(delta));\n        var tickString = '';\n\n        if (tickValue !== 0) {\n          var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));\n\n          if (maxTick < 1e-4) {\n            // all ticks are small numbers; use scientific notation\n            var logTick = helpers$1.log10(Math.abs(tickValue));\n            var numExponential = Math.floor(logTick) - Math.floor(logDelta);\n            numExponential = Math.max(Math.min(numExponential, 20), 0);\n            tickString = tickValue.toExponential(numExponential);\n          } else {\n            var numDecimal = -1 * Math.floor(logDelta);\n            numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\n            tickString = tickValue.toFixed(numDecimal);\n          }\n        } else {\n          tickString = '0'; // never show decimal places for 0\n        }\n\n        return tickString;\n      },\n      logarithmic: function logarithmic(tickValue, index, ticks) {\n        var remain = tickValue / Math.pow(10, Math.floor(helpers$1.log10(tickValue)));\n\n        if (tickValue === 0) {\n          return '0';\n        } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n          return tickValue.toExponential();\n        }\n\n        return '';\n      }\n    }\n  };\n  var isArray = helpers$1.isArray;\n  var isNullOrUndef = helpers$1.isNullOrUndef;\n  var valueOrDefault$a = helpers$1.valueOrDefault;\n  var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;\n\n  core_defaults._set('scale', {\n    display: true,\n    position: 'left',\n    offset: false,\n    // grid line settings\n    gridLines: {\n      display: true,\n      color: 'rgba(0,0,0,0.1)',\n      lineWidth: 1,\n      drawBorder: true,\n      drawOnChartArea: true,\n      drawTicks: true,\n      tickMarkLength: 10,\n      zeroLineWidth: 1,\n      zeroLineColor: 'rgba(0,0,0,0.25)',\n      zeroLineBorderDash: [],\n      zeroLineBorderDashOffset: 0.0,\n      offsetGridLines: false,\n      borderDash: [],\n      borderDashOffset: 0.0\n    },\n    // scale label\n    scaleLabel: {\n      // display property\n      display: false,\n      // actual label\n      labelString: '',\n      // top/bottom padding\n      padding: {\n        top: 4,\n        bottom: 4\n      }\n    },\n    // label settings\n    ticks: {\n      beginAtZero: false,\n      minRotation: 0,\n      maxRotation: 50,\n      mirror: false,\n      padding: 0,\n      reverse: false,\n      display: true,\n      autoSkip: true,\n      autoSkipPadding: 0,\n      labelOffset: 0,\n      // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n      callback: core_ticks.formatters.values,\n      minor: {},\n      major: {}\n    }\n  });\n  /** Returns a new array containing numItems from arr */\n\n\n  function sample(arr, numItems) {\n    var result = [];\n    var increment = arr.length / numItems;\n    var i = 0;\n    var len = arr.length;\n\n    for (; i < len; i += increment) {\n      result.push(arr[Math.floor(i)]);\n    }\n\n    return result;\n  }\n\n  function getPixelForGridLine(scale, index, offsetGridLines) {\n    var length = scale.getTicks().length;\n    var validIndex = Math.min(index, length - 1);\n    var lineValue = scale.getPixelForTick(validIndex);\n    var start = scale._startPixel;\n    var end = scale._endPixel;\n    var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n\n    var offset;\n\n    if (offsetGridLines) {\n      if (length === 1) {\n        offset = Math.max(lineValue - start, end - lineValue);\n      } else if (index === 0) {\n        offset = (scale.getPixelForTick(1) - lineValue) / 2;\n      } else {\n        offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n      }\n\n      lineValue += validIndex < index ? offset : -offset; // Return undefined if the pixel is out of the range\n\n      if (lineValue < start - epsilon || lineValue > end + epsilon) {\n        return;\n      }\n    }\n\n    return lineValue;\n  }\n\n  function garbageCollect(caches, length) {\n    helpers$1.each(caches, function (cache) {\n      var gc = cache.gc;\n      var gcLen = gc.length / 2;\n      var i;\n\n      if (gcLen > length) {\n        for (i = 0; i < gcLen; ++i) {\n          delete cache.data[gc[i]];\n        }\n\n        gc.splice(0, gcLen);\n      }\n    });\n  }\n  /**\r\n   * Returns {width, height, offset} objects for the first, last, widest, highest tick\r\n   * labels where offset indicates the anchor point offset from the top in pixels.\r\n   */\n\n\n  function computeLabelSizes(ctx, tickFonts, ticks, caches) {\n    var length = ticks.length;\n    var widths = [];\n    var heights = [];\n    var offsets = [];\n    var widestLabelSize = 0;\n    var highestLabelSize = 0;\n    var i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel, widest, highest;\n\n    for (i = 0; i < length; ++i) {\n      label = ticks[i].label;\n      tickFont = ticks[i].major ? tickFonts.major : tickFonts.minor;\n      ctx.font = fontString = tickFont.string;\n      cache = caches[fontString] = caches[fontString] || {\n        data: {},\n        gc: []\n      };\n      lineHeight = tickFont.lineHeight;\n      width = height = 0; // Undefined labels and arrays should not be measured\n\n      if (!isNullOrUndef(label) && !isArray(label)) {\n        width = helpers$1.measureText(ctx, cache.data, cache.gc, width, label);\n        height = lineHeight;\n      } else if (isArray(label)) {\n        // if it is an array let's measure each element\n        for (j = 0, jlen = label.length; j < jlen; ++j) {\n          nestedLabel = label[j]; // Undefined labels and arrays should not be measured\n\n          if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n            width = helpers$1.measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n            height += lineHeight;\n          }\n        }\n      }\n\n      widths.push(width);\n      heights.push(height);\n      offsets.push(lineHeight / 2);\n      widestLabelSize = Math.max(width, widestLabelSize);\n      highestLabelSize = Math.max(height, highestLabelSize);\n    }\n\n    garbageCollect(caches, length);\n    widest = widths.indexOf(widestLabelSize);\n    highest = heights.indexOf(highestLabelSize);\n\n    function valueAt(idx) {\n      return {\n        width: widths[idx] || 0,\n        height: heights[idx] || 0,\n        offset: offsets[idx] || 0\n      };\n    }\n\n    return {\n      first: valueAt(0),\n      last: valueAt(length - 1),\n      widest: valueAt(widest),\n      highest: valueAt(highest)\n    };\n  }\n\n  function getTickMarkLength(options) {\n    return options.drawTicks ? options.tickMarkLength : 0;\n  }\n\n  function getScaleLabelHeight(options) {\n    var font, padding;\n\n    if (!options.display) {\n      return 0;\n    }\n\n    font = helpers$1.options._parseFont(options);\n    padding = helpers$1.options.toPadding(options.padding);\n    return font.lineHeight + padding.height;\n  }\n\n  function parseFontOptions(options, nestedOpts) {\n    return helpers$1.extend(helpers$1.options._parseFont({\n      fontFamily: valueOrDefault$a(nestedOpts.fontFamily, options.fontFamily),\n      fontSize: valueOrDefault$a(nestedOpts.fontSize, options.fontSize),\n      fontStyle: valueOrDefault$a(nestedOpts.fontStyle, options.fontStyle),\n      lineHeight: valueOrDefault$a(nestedOpts.lineHeight, options.lineHeight)\n    }), {\n      color: helpers$1.options.resolve([nestedOpts.fontColor, options.fontColor, core_defaults.global.defaultFontColor])\n    });\n  }\n\n  function parseTickFontOptions(options) {\n    var minor = parseFontOptions(options, options.minor);\n    var major = options.major.enabled ? parseFontOptions(options, options.major) : minor;\n    return {\n      minor: minor,\n      major: major\n    };\n  }\n\n  function nonSkipped(ticksToFilter) {\n    var filtered = [];\n    var item, index, len;\n\n    for (index = 0, len = ticksToFilter.length; index < len; ++index) {\n      item = ticksToFilter[index];\n\n      if (typeof item._index !== 'undefined') {\n        filtered.push(item);\n      }\n    }\n\n    return filtered;\n  }\n\n  function getEvenSpacing(arr) {\n    var len = arr.length;\n    var i, diff;\n\n    if (len < 2) {\n      return false;\n    }\n\n    for (diff = arr[0], i = 1; i < len; ++i) {\n      if (arr[i] - arr[i - 1] !== diff) {\n        return false;\n      }\n    }\n\n    return diff;\n  }\n\n  function calculateSpacing(majorIndices, ticks, axisLength, ticksLimit) {\n    var evenMajorSpacing = getEvenSpacing(majorIndices);\n    var spacing = (ticks.length - 1) / ticksLimit;\n    var factors, factor, i, ilen; // If the major ticks are evenly spaced apart, place the minor ticks\n    // so that they divide the major ticks into even chunks\n\n    if (!evenMajorSpacing) {\n      return Math.max(spacing, 1);\n    }\n\n    factors = helpers$1.math._factorize(evenMajorSpacing);\n\n    for (i = 0, ilen = factors.length - 1; i < ilen; i++) {\n      factor = factors[i];\n\n      if (factor > spacing) {\n        return factor;\n      }\n    }\n\n    return Math.max(spacing, 1);\n  }\n\n  function getMajorIndices(ticks) {\n    var result = [];\n    var i, ilen;\n\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      if (ticks[i].major) {\n        result.push(i);\n      }\n    }\n\n    return result;\n  }\n\n  function skipMajors(ticks, majorIndices, spacing) {\n    var count = 0;\n    var next = majorIndices[0];\n    var i, tick;\n    spacing = Math.ceil(spacing);\n\n    for (i = 0; i < ticks.length; i++) {\n      tick = ticks[i];\n\n      if (i === next) {\n        tick._index = i;\n        count++;\n        next = majorIndices[count * spacing];\n      } else {\n        delete tick.label;\n      }\n    }\n  }\n\n  function skip(ticks, spacing, majorStart, majorEnd) {\n    var start = valueOrDefault$a(majorStart, 0);\n    var end = Math.min(valueOrDefault$a(majorEnd, ticks.length), ticks.length);\n    var count = 0;\n    var length, i, tick, next;\n    spacing = Math.ceil(spacing);\n\n    if (majorEnd) {\n      length = majorEnd - majorStart;\n      spacing = length / Math.floor(length / spacing);\n    }\n\n    next = start;\n\n    while (next < 0) {\n      count++;\n      next = Math.round(start + count * spacing);\n    }\n\n    for (i = Math.max(start, 0); i < end; i++) {\n      tick = ticks[i];\n\n      if (i === next) {\n        tick._index = i;\n        count++;\n        next = Math.round(start + count * spacing);\n      } else {\n        delete tick.label;\n      }\n    }\n  }\n\n  var Scale = core_element.extend({\n    zeroLineIndex: 0,\n\n    /**\r\n     * Get the padding needed for the scale\r\n     * @method getPadding\r\n     * @private\r\n     * @returns {Padding} the necessary padding\r\n     */\n    getPadding: function getPadding() {\n      var me = this;\n      return {\n        left: me.paddingLeft || 0,\n        top: me.paddingTop || 0,\n        right: me.paddingRight || 0,\n        bottom: me.paddingBottom || 0\n      };\n    },\n\n    /**\r\n     * Returns the scale tick objects ({label, major})\r\n     * @since 2.7\r\n     */\n    getTicks: function getTicks() {\n      return this._ticks;\n    },\n\n    /**\r\n    * @private\r\n    */\n    _getLabels: function _getLabels() {\n      var data = this.chart.data;\n      return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n    },\n    // These methods are ordered by lifecyle. Utilities then follow.\n    // Any function defined here is inherited by all scale types.\n    // Any function can be extended by the scale type\n\n    /**\r\n     * Provided for backward compatibility, not available anymore\r\n     * @function Chart.Scale.mergeTicksOptions\r\n     * @deprecated since version 2.8.0\r\n     * @todo remove at version 3\r\n     */\n    mergeTicksOptions: function mergeTicksOptions() {// noop\n    },\n    beforeUpdate: function beforeUpdate() {\n      helpers$1.callback(this.options.beforeUpdate, [this]);\n    },\n\n    /**\r\n     * @param {number} maxWidth - the max width in pixels\r\n     * @param {number} maxHeight - the max height in pixels\r\n     * @param {object} margins - the space between the edge of the other scales and edge of the chart\r\n     *   This space comes from two sources:\r\n     *     - padding - space that's required to show the labels at the edges of the scale\r\n     *     - thickness of scales or legends in another orientation\r\n     */\n    update: function update(maxWidth, maxHeight, margins) {\n      var me = this;\n      var tickOpts = me.options.ticks;\n      var sampleSize = tickOpts.sampleSize;\n      var i, ilen, labels, ticks, samplingEnabled; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\n      me.beforeUpdate(); // Absorb the master measurements\n\n      me.maxWidth = maxWidth;\n      me.maxHeight = maxHeight;\n      me.margins = helpers$1.extend({\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0\n      }, margins);\n      me._ticks = null;\n      me.ticks = null;\n      me._labelSizes = null;\n      me._maxLabelLines = 0;\n      me.longestLabelWidth = 0;\n      me.longestTextCache = me.longestTextCache || {};\n      me._gridLineItems = null;\n      me._labelItems = null; // Dimensions\n\n      me.beforeSetDimensions();\n      me.setDimensions();\n      me.afterSetDimensions(); // Data min/max\n\n      me.beforeDataLimits();\n      me.determineDataLimits();\n      me.afterDataLimits(); // Ticks - `this.ticks` is now DEPRECATED!\n      // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n      // and must not be accessed directly from outside this class. `this.ticks` being\n      // around for long time and not marked as private, we can't change its structure\n      // without unexpected breaking changes. If you need to access the scale ticks,\n      // use scale.getTicks() instead.\n\n      me.beforeBuildTicks(); // New implementations should return an array of objects but for BACKWARD COMPAT,\n      // we still support no return (`this.ticks` internally set by calling this method).\n\n      ticks = me.buildTicks() || []; // Allow modification of ticks in callback.\n\n      ticks = me.afterBuildTicks(ticks) || ticks; // Ensure ticks contains ticks in new tick format\n\n      if ((!ticks || !ticks.length) && me.ticks) {\n        ticks = [];\n\n        for (i = 0, ilen = me.ticks.length; i < ilen; ++i) {\n          ticks.push({\n            value: me.ticks[i],\n            major: false\n          });\n        }\n      }\n\n      me._ticks = ticks; // Compute tick rotation and fit using a sampled subset of labels\n      // We generally don't need to compute the size of every single label for determining scale size\n\n      samplingEnabled = sampleSize < ticks.length;\n      labels = me._convertTicksToLabels(samplingEnabled ? sample(ticks, sampleSize) : ticks); // _configure is called twice, once here, once from core.controller.updateLayout.\n      // Here we haven't been positioned yet, but dimensions are correct.\n      // Variables set in _configure are needed for calculateTickRotation, and\n      // it's ok that coordinates are not correct there, only dimensions matter.\n\n      me._configure(); // Tick Rotation\n\n\n      me.beforeCalculateTickRotation();\n      me.calculateTickRotation();\n      me.afterCalculateTickRotation();\n      me.beforeFit();\n      me.fit();\n      me.afterFit(); // Auto-skip\n\n      me._ticksToDraw = tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto') ? me._autoSkip(ticks) : ticks;\n\n      if (samplingEnabled) {\n        // Generate labels using all non-skipped ticks\n        labels = me._convertTicksToLabels(me._ticksToDraw);\n      }\n\n      me.ticks = labels; // BACKWARD COMPATIBILITY\n      // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n      me.afterUpdate(); // TODO(v3): remove minSize as a public property and return value from all layout boxes. It is unused\n      // make maxWidth and maxHeight private\n\n      return me.minSize;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _configure: function _configure() {\n      var me = this;\n      var reversePixels = me.options.ticks.reverse;\n      var startPixel, endPixel;\n\n      if (me.isHorizontal()) {\n        startPixel = me.left;\n        endPixel = me.right;\n      } else {\n        startPixel = me.top;\n        endPixel = me.bottom; // by default vertical scales are from bottom to top, so pixels are reversed\n\n        reversePixels = !reversePixels;\n      }\n\n      me._startPixel = startPixel;\n      me._endPixel = endPixel;\n      me._reversePixels = reversePixels;\n      me._length = endPixel - startPixel;\n    },\n    afterUpdate: function afterUpdate() {\n      helpers$1.callback(this.options.afterUpdate, [this]);\n    },\n    //\n    beforeSetDimensions: function beforeSetDimensions() {\n      helpers$1.callback(this.options.beforeSetDimensions, [this]);\n    },\n    setDimensions: function setDimensions() {\n      var me = this; // Set the unconstrained dimension before label rotation\n\n      if (me.isHorizontal()) {\n        // Reset position before calculating rotation\n        me.width = me.maxWidth;\n        me.left = 0;\n        me.right = me.width;\n      } else {\n        me.height = me.maxHeight; // Reset position before calculating rotation\n\n        me.top = 0;\n        me.bottom = me.height;\n      } // Reset padding\n\n\n      me.paddingLeft = 0;\n      me.paddingTop = 0;\n      me.paddingRight = 0;\n      me.paddingBottom = 0;\n    },\n    afterSetDimensions: function afterSetDimensions() {\n      helpers$1.callback(this.options.afterSetDimensions, [this]);\n    },\n    // Data limits\n    beforeDataLimits: function beforeDataLimits() {\n      helpers$1.callback(this.options.beforeDataLimits, [this]);\n    },\n    determineDataLimits: helpers$1.noop,\n    afterDataLimits: function afterDataLimits() {\n      helpers$1.callback(this.options.afterDataLimits, [this]);\n    },\n    //\n    beforeBuildTicks: function beforeBuildTicks() {\n      helpers$1.callback(this.options.beforeBuildTicks, [this]);\n    },\n    buildTicks: helpers$1.noop,\n    afterBuildTicks: function afterBuildTicks(ticks) {\n      var me = this; // ticks is empty for old axis implementations here\n\n      if (isArray(ticks) && ticks.length) {\n        return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);\n      } // Support old implementations (that modified `this.ticks` directly in buildTicks)\n\n\n      me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks;\n      return ticks;\n    },\n    beforeTickToLabelConversion: function beforeTickToLabelConversion() {\n      helpers$1.callback(this.options.beforeTickToLabelConversion, [this]);\n    },\n    convertTicksToLabels: function convertTicksToLabels() {\n      var me = this; // Convert ticks to strings\n\n      var tickOpts = me.options.ticks;\n      me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n    },\n    afterTickToLabelConversion: function afterTickToLabelConversion() {\n      helpers$1.callback(this.options.afterTickToLabelConversion, [this]);\n    },\n    //\n    beforeCalculateTickRotation: function beforeCalculateTickRotation() {\n      helpers$1.callback(this.options.beforeCalculateTickRotation, [this]);\n    },\n    calculateTickRotation: function calculateTickRotation() {\n      var me = this;\n      var options = me.options;\n      var tickOpts = options.ticks;\n      var numTicks = me.getTicks().length;\n      var minRotation = tickOpts.minRotation || 0;\n      var maxRotation = tickOpts.maxRotation;\n      var labelRotation = minRotation;\n      var labelSizes, maxLabelWidth, maxLabelHeight, maxWidth, tickWidth, maxHeight, maxLabelDiagonal;\n\n      if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {\n        me.labelRotation = minRotation;\n        return;\n      }\n\n      labelSizes = me._getLabelSizes();\n      maxLabelWidth = labelSizes.widest.width;\n      maxLabelHeight = labelSizes.highest.height - labelSizes.highest.offset; // Estimate the width of each grid based on the canvas width, the maximum\n      // label width and the number of tick intervals\n\n      maxWidth = Math.min(me.maxWidth, me.chart.width - maxLabelWidth);\n      tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1); // Allow 3 pixels x2 padding either side for label readability\n\n      if (maxLabelWidth + 6 > tickWidth) {\n        tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n        maxHeight = me.maxHeight - getTickMarkLength(options.gridLines) - tickOpts.padding - getScaleLabelHeight(options.scaleLabel);\n        maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n        labelRotation = helpers$1.toDegrees(Math.min(Math.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)), Math.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal)));\n        labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n      }\n\n      me.labelRotation = labelRotation;\n    },\n    afterCalculateTickRotation: function afterCalculateTickRotation() {\n      helpers$1.callback(this.options.afterCalculateTickRotation, [this]);\n    },\n    //\n    beforeFit: function beforeFit() {\n      helpers$1.callback(this.options.beforeFit, [this]);\n    },\n    fit: function fit() {\n      var me = this; // Reset\n\n      var minSize = me.minSize = {\n        width: 0,\n        height: 0\n      };\n      var chart = me.chart;\n      var opts = me.options;\n      var tickOpts = opts.ticks;\n      var scaleLabelOpts = opts.scaleLabel;\n      var gridLineOpts = opts.gridLines;\n\n      var display = me._isVisible();\n\n      var isBottom = opts.position === 'bottom';\n      var isHorizontal = me.isHorizontal(); // Width\n\n      if (isHorizontal) {\n        minSize.width = me.maxWidth;\n      } else if (display) {\n        minSize.width = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);\n      } // height\n\n\n      if (!isHorizontal) {\n        minSize.height = me.maxHeight; // fill all the height\n      } else if (display) {\n        minSize.height = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);\n      } // Don't bother fitting the ticks if we are not showing the labels\n\n\n      if (tickOpts.display && display) {\n        var tickFonts = parseTickFontOptions(tickOpts);\n\n        var labelSizes = me._getLabelSizes();\n\n        var firstLabelSize = labelSizes.first;\n        var lastLabelSize = labelSizes.last;\n        var widestLabelSize = labelSizes.widest;\n        var highestLabelSize = labelSizes.highest;\n        var lineSpace = tickFonts.minor.lineHeight * 0.4;\n        var tickPadding = tickOpts.padding;\n\n        if (isHorizontal) {\n          // A horizontal axis is more constrained by the height.\n          var isRotated = me.labelRotation !== 0;\n          var angleRadians = helpers$1.toRadians(me.labelRotation);\n          var cosRotation = Math.cos(angleRadians);\n          var sinRotation = Math.sin(angleRadians);\n          var labelHeight = sinRotation * widestLabelSize.width + cosRotation * (highestLabelSize.height - (isRotated ? highestLabelSize.offset : 0)) + (isRotated ? 0 : lineSpace); // padding\n\n          minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n          var offsetLeft = me.getPixelForTick(0) - me.left;\n          var offsetRight = me.right - me.getPixelForTick(me.getTicks().length - 1);\n          var paddingLeft, paddingRight; // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n          // which means that the right padding is dominated by the font height\n\n          if (isRotated) {\n            paddingLeft = isBottom ? cosRotation * firstLabelSize.width + sinRotation * firstLabelSize.offset : sinRotation * (firstLabelSize.height - firstLabelSize.offset);\n            paddingRight = isBottom ? sinRotation * (lastLabelSize.height - lastLabelSize.offset) : cosRotation * lastLabelSize.width + sinRotation * lastLabelSize.offset;\n          } else {\n            paddingLeft = firstLabelSize.width / 2;\n            paddingRight = lastLabelSize.width / 2;\n          } // Adjust padding taking into account changes in offsets\n          // and add 3 px to move away from canvas edges\n\n\n          me.paddingLeft = Math.max((paddingLeft - offsetLeft) * me.width / (me.width - offsetLeft), 0) + 3;\n          me.paddingRight = Math.max((paddingRight - offsetRight) * me.width / (me.width - offsetRight), 0) + 3;\n        } else {\n          // A vertical axis is more constrained by the width. Labels are the\n          // dominant factor here, so get that length first and account for padding\n          var labelWidth = tickOpts.mirror ? 0 : // use lineSpace for consistency with horizontal axis\n          // tickPadding is not implemented for horizontal\n          widestLabelSize.width + tickPadding + lineSpace;\n          minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth);\n          me.paddingTop = firstLabelSize.height / 2;\n          me.paddingBottom = lastLabelSize.height / 2;\n        }\n      }\n\n      me.handleMargins();\n\n      if (isHorizontal) {\n        me.width = me._length = chart.width - me.margins.left - me.margins.right;\n        me.height = minSize.height;\n      } else {\n        me.width = minSize.width;\n        me.height = me._length = chart.height - me.margins.top - me.margins.bottom;\n      }\n    },\n\n    /**\r\n     * Handle margins and padding interactions\r\n     * @private\r\n     */\n    handleMargins: function handleMargins() {\n      var me = this;\n\n      if (me.margins) {\n        me.margins.left = Math.max(me.paddingLeft, me.margins.left);\n        me.margins.top = Math.max(me.paddingTop, me.margins.top);\n        me.margins.right = Math.max(me.paddingRight, me.margins.right);\n        me.margins.bottom = Math.max(me.paddingBottom, me.margins.bottom);\n      }\n    },\n    afterFit: function afterFit() {\n      helpers$1.callback(this.options.afterFit, [this]);\n    },\n    // Shared Methods\n    isHorizontal: function isHorizontal() {\n      var pos = this.options.position;\n      return pos === 'top' || pos === 'bottom';\n    },\n    isFullWidth: function isFullWidth() {\n      return this.options.fullWidth;\n    },\n    // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n    getRightValue: function getRightValue(rawValue) {\n      // Null and undefined values first\n      if (isNullOrUndef(rawValue)) {\n        return NaN;\n      } // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\n\n      if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {\n        return NaN;\n      } // If it is in fact an object, dive in one more level\n\n\n      if (rawValue) {\n        if (this.isHorizontal()) {\n          if (rawValue.x !== undefined) {\n            return this.getRightValue(rawValue.x);\n          }\n        } else if (rawValue.y !== undefined) {\n          return this.getRightValue(rawValue.y);\n        }\n      } // Value is good, return it\n\n\n      return rawValue;\n    },\n    _convertTicksToLabels: function _convertTicksToLabels(ticks) {\n      var me = this;\n      var labels, i, ilen;\n      me.ticks = ticks.map(function (tick) {\n        return tick.value;\n      });\n      me.beforeTickToLabelConversion(); // New implementations should return the formatted tick labels but for BACKWARD\n      // COMPAT, we still support no return (`this.ticks` internally changed by calling\n      // this method and supposed to contain only string values).\n\n      labels = me.convertTicksToLabels(ticks) || me.ticks;\n      me.afterTickToLabelConversion(); // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\n      for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n        ticks[i].label = labels[i];\n      }\n\n      return labels;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getLabelSizes: function _getLabelSizes() {\n      var me = this;\n      var labelSizes = me._labelSizes;\n\n      if (!labelSizes) {\n        me._labelSizes = labelSizes = computeLabelSizes(me.ctx, parseTickFontOptions(me.options.ticks), me.getTicks(), me.longestTextCache);\n        me.longestLabelWidth = labelSizes.widest.width;\n      }\n\n      return labelSizes;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _parseValue: function _parseValue(value) {\n      var start, end, min, max;\n\n      if (isArray(value)) {\n        start = +this.getRightValue(value[0]);\n        end = +this.getRightValue(value[1]);\n        min = Math.min(start, end);\n        max = Math.max(start, end);\n      } else {\n        value = +this.getRightValue(value);\n        start = undefined;\n        end = value;\n        min = value;\n        max = value;\n      }\n\n      return {\n        min: min,\n        max: max,\n        start: start,\n        end: end\n      };\n    },\n\n    /**\r\n    * @private\r\n    */\n    _getScaleLabel: function _getScaleLabel(rawValue) {\n      var v = this._parseValue(rawValue);\n\n      if (v.start !== undefined) {\n        return '[' + v.start + ', ' + v.end + ']';\n      }\n\n      return +this.getRightValue(rawValue);\n    },\n\n    /**\r\n     * Used to get the value to display in the tooltip for the data at the given index\r\n     * @param index\r\n     * @param datasetIndex\r\n     */\n    getLabelForIndex: helpers$1.noop,\n\n    /**\r\n     * Returns the location of the given data point. Value can either be an index or a numerical value\r\n     * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n     * @param value\r\n     * @param index\r\n     * @param datasetIndex\r\n     */\n    getPixelForValue: helpers$1.noop,\n\n    /**\r\n     * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\r\n     * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n     * @param pixel\r\n     */\n    getValueForPixel: helpers$1.noop,\n\n    /**\r\n     * Returns the location of the tick at the given index\r\n     * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n     */\n    getPixelForTick: function getPixelForTick(index) {\n      var me = this;\n      var offset = me.options.offset;\n      var numTicks = me._ticks.length;\n      var tickWidth = 1 / Math.max(numTicks - (offset ? 0 : 1), 1);\n      return index < 0 || index > numTicks - 1 ? null : me.getPixelForDecimal(index * tickWidth + (offset ? tickWidth / 2 : 0));\n    },\n\n    /**\r\n     * Utility for getting the pixel location of a percentage of scale\r\n     * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n     */\n    getPixelForDecimal: function getPixelForDecimal(decimal) {\n      var me = this;\n\n      if (me._reversePixels) {\n        decimal = 1 - decimal;\n      }\n\n      return me._startPixel + decimal * me._length;\n    },\n    getDecimalForPixel: function getDecimalForPixel(pixel) {\n      var decimal = (pixel - this._startPixel) / this._length;\n      return this._reversePixels ? 1 - decimal : decimal;\n    },\n\n    /**\r\n     * Returns the pixel for the minimum chart value\r\n     * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n     */\n    getBasePixel: function getBasePixel() {\n      return this.getPixelForValue(this.getBaseValue());\n    },\n    getBaseValue: function getBaseValue() {\n      var me = this;\n      var min = me.min;\n      var max = me.max;\n      return me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n    },\n\n    /**\r\n     * Returns a subset of ticks to be plotted to avoid overlapping labels.\r\n     * @private\r\n     */\n    _autoSkip: function _autoSkip(ticks) {\n      var me = this;\n      var tickOpts = me.options.ticks;\n      var axisLength = me._length;\n      var ticksLimit = tickOpts.maxTicksLimit || axisLength / me._tickSize() + 1;\n      var majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n      var numMajorIndices = majorIndices.length;\n      var first = majorIndices[0];\n      var last = majorIndices[numMajorIndices - 1];\n      var i, ilen, spacing, avgMajorSpacing; // If there are too many major ticks to display them all\n\n      if (numMajorIndices > ticksLimit) {\n        skipMajors(ticks, majorIndices, numMajorIndices / ticksLimit);\n        return nonSkipped(ticks);\n      }\n\n      spacing = calculateSpacing(majorIndices, ticks, axisLength, ticksLimit);\n\n      if (numMajorIndices > 0) {\n        for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n          skip(ticks, spacing, majorIndices[i], majorIndices[i + 1]);\n        }\n\n        avgMajorSpacing = numMajorIndices > 1 ? (last - first) / (numMajorIndices - 1) : null;\n        skip(ticks, spacing, helpers$1.isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n        skip(ticks, spacing, last, helpers$1.isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n        return nonSkipped(ticks);\n      }\n\n      skip(ticks, spacing);\n      return nonSkipped(ticks);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _tickSize: function _tickSize() {\n      var me = this;\n      var optionTicks = me.options.ticks; // Calculate space needed by label in axis direction.\n\n      var rot = helpers$1.toRadians(me.labelRotation);\n      var cos = Math.abs(Math.cos(rot));\n      var sin = Math.abs(Math.sin(rot));\n\n      var labelSizes = me._getLabelSizes();\n\n      var padding = optionTicks.autoSkipPadding || 0;\n      var w = labelSizes ? labelSizes.widest.width + padding : 0;\n      var h = labelSizes ? labelSizes.highest.height + padding : 0; // Calculate space needed for 1 tick in axis direction.\n\n      return me.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _isVisible: function _isVisible() {\n      var me = this;\n      var chart = me.chart;\n      var display = me.options.display;\n      var i, ilen, meta;\n\n      if (display !== 'auto') {\n        return !!display;\n      } // When 'auto', the scale is visible if at least one associated dataset is visible.\n\n\n      for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n        if (chart.isDatasetVisible(i)) {\n          meta = chart.getDatasetMeta(i);\n\n          if (meta.xAxisID === me.id || meta.yAxisID === me.id) {\n            return true;\n          }\n        }\n      }\n\n      return false;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _computeGridLineItems: function _computeGridLineItems(chartArea) {\n      var me = this;\n      var chart = me.chart;\n      var options = me.options;\n      var gridLines = options.gridLines;\n      var position = options.position;\n      var offsetGridLines = gridLines.offsetGridLines;\n      var isHorizontal = me.isHorizontal();\n      var ticks = me._ticksToDraw;\n      var ticksLength = ticks.length + (offsetGridLines ? 1 : 0);\n      var tl = getTickMarkLength(gridLines);\n      var items = [];\n      var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;\n      var axisHalfWidth = axisWidth / 2;\n      var alignPixel = helpers$1._alignPixel;\n\n      var alignBorderValue = function alignBorderValue(pixel) {\n        return alignPixel(chart, pixel, axisWidth);\n      };\n\n      var borderValue, i, tick, lineValue, alignedLineValue;\n      var tx1, ty1, tx2, ty2, x1, y1, x2, y2, lineWidth, lineColor, borderDash, borderDashOffset;\n\n      if (position === 'top') {\n        borderValue = alignBorderValue(me.bottom);\n        ty1 = me.bottom - tl;\n        ty2 = borderValue - axisHalfWidth;\n        y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n        y2 = chartArea.bottom;\n      } else if (position === 'bottom') {\n        borderValue = alignBorderValue(me.top);\n        y1 = chartArea.top;\n        y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n        ty1 = borderValue + axisHalfWidth;\n        ty2 = me.top + tl;\n      } else if (position === 'left') {\n        borderValue = alignBorderValue(me.right);\n        tx1 = me.right - tl;\n        tx2 = borderValue - axisHalfWidth;\n        x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n        x2 = chartArea.right;\n      } else {\n        borderValue = alignBorderValue(me.left);\n        x1 = chartArea.left;\n        x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n        tx1 = borderValue + axisHalfWidth;\n        tx2 = me.left + tl;\n      }\n\n      for (i = 0; i < ticksLength; ++i) {\n        tick = ticks[i] || {}; // autoskipper skipped this tick (#4635)\n\n        if (isNullOrUndef(tick.label) && i < ticks.length) {\n          continue;\n        }\n\n        if (i === me.zeroLineIndex && options.offset === offsetGridLines) {\n          // Draw the first index specially\n          lineWidth = gridLines.zeroLineWidth;\n          lineColor = gridLines.zeroLineColor;\n          borderDash = gridLines.zeroLineBorderDash || [];\n          borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;\n        } else {\n          lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, i, 1);\n          lineColor = valueAtIndexOrDefault(gridLines.color, i, 'rgba(0,0,0,0.1)');\n          borderDash = gridLines.borderDash || [];\n          borderDashOffset = gridLines.borderDashOffset || 0.0;\n        }\n\n        lineValue = getPixelForGridLine(me, tick._index || i, offsetGridLines); // Skip if the pixel is out of the range\n\n        if (lineValue === undefined) {\n          continue;\n        }\n\n        alignedLineValue = alignPixel(chart, lineValue, lineWidth);\n\n        if (isHorizontal) {\n          tx1 = tx2 = x1 = x2 = alignedLineValue;\n        } else {\n          ty1 = ty2 = y1 = y2 = alignedLineValue;\n        }\n\n        items.push({\n          tx1: tx1,\n          ty1: ty1,\n          tx2: tx2,\n          ty2: ty2,\n          x1: x1,\n          y1: y1,\n          x2: x2,\n          y2: y2,\n          width: lineWidth,\n          color: lineColor,\n          borderDash: borderDash,\n          borderDashOffset: borderDashOffset\n        });\n      }\n\n      items.ticksLength = ticksLength;\n      items.borderValue = borderValue;\n      return items;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _computeLabelItems: function _computeLabelItems() {\n      var me = this;\n      var options = me.options;\n      var optionTicks = options.ticks;\n      var position = options.position;\n      var isMirrored = optionTicks.mirror;\n      var isHorizontal = me.isHorizontal();\n      var ticks = me._ticksToDraw;\n      var fonts = parseTickFontOptions(optionTicks);\n      var tickPadding = optionTicks.padding;\n      var tl = getTickMarkLength(options.gridLines);\n      var rotation = -helpers$1.toRadians(me.labelRotation);\n      var items = [];\n      var i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n\n      if (position === 'top') {\n        y = me.bottom - tl - tickPadding;\n        textAlign = !rotation ? 'center' : 'left';\n      } else if (position === 'bottom') {\n        y = me.top + tl + tickPadding;\n        textAlign = !rotation ? 'center' : 'right';\n      } else if (position === 'left') {\n        x = me.right - (isMirrored ? 0 : tl) - tickPadding;\n        textAlign = isMirrored ? 'left' : 'right';\n      } else {\n        x = me.left + (isMirrored ? 0 : tl) + tickPadding;\n        textAlign = isMirrored ? 'right' : 'left';\n      }\n\n      for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n        tick = ticks[i];\n        label = tick.label; // autoskipper skipped this tick (#4635)\n\n        if (isNullOrUndef(label)) {\n          continue;\n        }\n\n        pixel = me.getPixelForTick(tick._index || i) + optionTicks.labelOffset;\n        font = tick.major ? fonts.major : fonts.minor;\n        lineHeight = font.lineHeight;\n        lineCount = isArray(label) ? label.length : 1;\n\n        if (isHorizontal) {\n          x = pixel;\n          textOffset = position === 'top' ? ((!rotation ? 0.5 : 1) - lineCount) * lineHeight : (!rotation ? 0.5 : 0) * lineHeight;\n        } else {\n          y = pixel;\n          textOffset = (1 - lineCount) * lineHeight / 2;\n        }\n\n        items.push({\n          x: x,\n          y: y,\n          rotation: rotation,\n          label: label,\n          font: font,\n          textOffset: textOffset,\n          textAlign: textAlign\n        });\n      }\n\n      return items;\n    },\n\n    /**\r\n     * @private\r\n     */\n    _drawGrid: function _drawGrid(chartArea) {\n      var me = this;\n      var gridLines = me.options.gridLines;\n\n      if (!gridLines.display) {\n        return;\n      }\n\n      var ctx = me.ctx;\n      var chart = me.chart;\n      var alignPixel = helpers$1._alignPixel;\n      var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;\n\n      var items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));\n\n      var width, color, i, ilen, item;\n\n      for (i = 0, ilen = items.length; i < ilen; ++i) {\n        item = items[i];\n        width = item.width;\n        color = item.color;\n\n        if (width && color) {\n          ctx.save();\n          ctx.lineWidth = width;\n          ctx.strokeStyle = color;\n\n          if (ctx.setLineDash) {\n            ctx.setLineDash(item.borderDash);\n            ctx.lineDashOffset = item.borderDashOffset;\n          }\n\n          ctx.beginPath();\n\n          if (gridLines.drawTicks) {\n            ctx.moveTo(item.tx1, item.ty1);\n            ctx.lineTo(item.tx2, item.ty2);\n          }\n\n          if (gridLines.drawOnChartArea) {\n            ctx.moveTo(item.x1, item.y1);\n            ctx.lineTo(item.x2, item.y2);\n          }\n\n          ctx.stroke();\n          ctx.restore();\n        }\n      }\n\n      if (axisWidth) {\n        // Draw the line at the edge of the axis\n        var firstLineWidth = axisWidth;\n        var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, items.ticksLength - 1, 1);\n        var borderValue = items.borderValue;\n        var x1, x2, y1, y2;\n\n        if (me.isHorizontal()) {\n          x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;\n          x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\n          y1 = y2 = borderValue;\n        } else {\n          y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2;\n          y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\n          x1 = x2 = borderValue;\n        }\n\n        ctx.lineWidth = axisWidth;\n        ctx.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    _drawLabels: function _drawLabels() {\n      var me = this;\n      var optionTicks = me.options.ticks;\n\n      if (!optionTicks.display) {\n        return;\n      }\n\n      var ctx = me.ctx;\n\n      var items = me._labelItems || (me._labelItems = me._computeLabelItems());\n\n      var i, j, ilen, jlen, item, tickFont, label, y;\n\n      for (i = 0, ilen = items.length; i < ilen; ++i) {\n        item = items[i];\n        tickFont = item.font; // Make sure we draw text in the correct color and font\n\n        ctx.save();\n        ctx.translate(item.x, item.y);\n        ctx.rotate(item.rotation);\n        ctx.font = tickFont.string;\n        ctx.fillStyle = tickFont.color;\n        ctx.textBaseline = 'middle';\n        ctx.textAlign = item.textAlign;\n        label = item.label;\n        y = item.textOffset;\n\n        if (isArray(label)) {\n          for (j = 0, jlen = label.length; j < jlen; ++j) {\n            // We just make sure the multiline element is a string here..\n            ctx.fillText('' + label[j], 0, y);\n            y += tickFont.lineHeight;\n          }\n        } else {\n          ctx.fillText(label, 0, y);\n        }\n\n        ctx.restore();\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    _drawTitle: function _drawTitle() {\n      var me = this;\n      var ctx = me.ctx;\n      var options = me.options;\n      var scaleLabel = options.scaleLabel;\n\n      if (!scaleLabel.display) {\n        return;\n      }\n\n      var scaleLabelFontColor = valueOrDefault$a(scaleLabel.fontColor, core_defaults.global.defaultFontColor);\n\n      var scaleLabelFont = helpers$1.options._parseFont(scaleLabel);\n\n      var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);\n      var halfLineHeight = scaleLabelFont.lineHeight / 2;\n      var position = options.position;\n      var rotation = 0;\n      var scaleLabelX, scaleLabelY;\n\n      if (me.isHorizontal()) {\n        scaleLabelX = me.left + me.width / 2; // midpoint of the width\n\n        scaleLabelY = position === 'bottom' ? me.bottom - halfLineHeight - scaleLabelPadding.bottom : me.top + halfLineHeight + scaleLabelPadding.top;\n      } else {\n        var isLeft = position === 'left';\n        scaleLabelX = isLeft ? me.left + halfLineHeight + scaleLabelPadding.top : me.right - halfLineHeight - scaleLabelPadding.top;\n        scaleLabelY = me.top + me.height / 2;\n        rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n      }\n\n      ctx.save();\n      ctx.translate(scaleLabelX, scaleLabelY);\n      ctx.rotate(rotation);\n      ctx.textAlign = 'center';\n      ctx.textBaseline = 'middle';\n      ctx.fillStyle = scaleLabelFontColor; // render in correct colour\n\n      ctx.font = scaleLabelFont.string;\n      ctx.fillText(scaleLabel.labelString, 0, 0);\n      ctx.restore();\n    },\n    draw: function draw(chartArea) {\n      var me = this;\n\n      if (!me._isVisible()) {\n        return;\n      }\n\n      me._drawGrid(chartArea);\n\n      me._drawTitle();\n\n      me._drawLabels();\n    },\n\n    /**\r\n     * @private\r\n     */\n    _layers: function _layers() {\n      var me = this;\n      var opts = me.options;\n      var tz = opts.ticks && opts.ticks.z || 0;\n      var gz = opts.gridLines && opts.gridLines.z || 0;\n\n      if (!me._isVisible() || tz === gz || me.draw !== me._draw) {\n        // backward compatibility: draw has been overridden by custom scale\n        return [{\n          z: tz,\n          draw: function draw() {\n            me.draw.apply(me, arguments);\n          }\n        }];\n      }\n\n      return [{\n        z: gz,\n        draw: function draw() {\n          me._drawGrid.apply(me, arguments);\n\n          me._drawTitle.apply(me, arguments);\n        }\n      }, {\n        z: tz,\n        draw: function draw() {\n          me._drawLabels.apply(me, arguments);\n        }\n      }];\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getMatchingVisibleMetas: function _getMatchingVisibleMetas(type) {\n      var me = this;\n      var isHorizontal = me.isHorizontal();\n      return me.chart._getSortedVisibleDatasetMetas().filter(function (meta) {\n        return (!type || meta.type === type) && (isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id);\n      });\n    }\n  });\n  Scale.prototype._draw = Scale.prototype.draw;\n  var core_scale = Scale;\n  var isNullOrUndef$1 = helpers$1.isNullOrUndef;\n  var defaultConfig = {\n    position: 'bottom'\n  };\n  var scale_category = core_scale.extend({\n    determineDataLimits: function determineDataLimits() {\n      var me = this;\n\n      var labels = me._getLabels();\n\n      var ticksOpts = me.options.ticks;\n      var min = ticksOpts.min;\n      var max = ticksOpts.max;\n      var minIndex = 0;\n      var maxIndex = labels.length - 1;\n      var findIndex;\n\n      if (min !== undefined) {\n        // user specified min value\n        findIndex = labels.indexOf(min);\n\n        if (findIndex >= 0) {\n          minIndex = findIndex;\n        }\n      }\n\n      if (max !== undefined) {\n        // user specified max value\n        findIndex = labels.indexOf(max);\n\n        if (findIndex >= 0) {\n          maxIndex = findIndex;\n        }\n      }\n\n      me.minIndex = minIndex;\n      me.maxIndex = maxIndex;\n      me.min = labels[minIndex];\n      me.max = labels[maxIndex];\n    },\n    buildTicks: function buildTicks() {\n      var me = this;\n\n      var labels = me._getLabels();\n\n      var minIndex = me.minIndex;\n      var maxIndex = me.maxIndex; // If we are viewing some subset of labels, slice the original array\n\n      me.ticks = minIndex === 0 && maxIndex === labels.length - 1 ? labels : labels.slice(minIndex, maxIndex + 1);\n    },\n    getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n      var me = this;\n      var chart = me.chart;\n\n      if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) {\n        return me.getRightValue(chart.data.datasets[datasetIndex].data[index]);\n      }\n\n      return me._getLabels()[index];\n    },\n    _configure: function _configure() {\n      var me = this;\n      var offset = me.options.offset;\n      var ticks = me.ticks;\n\n      core_scale.prototype._configure.call(me);\n\n      if (!me.isHorizontal()) {\n        // For backward compatibility, vertical category scale reverse is inverted.\n        me._reversePixels = !me._reversePixels;\n      }\n\n      if (!ticks) {\n        return;\n      }\n\n      me._startValue = me.minIndex - (offset ? 0.5 : 0);\n      me._valueRange = Math.max(ticks.length - (offset ? 0 : 1), 1);\n    },\n    // Used to get data value locations.  Value can either be an index or a numerical value\n    getPixelForValue: function getPixelForValue(value, index, datasetIndex) {\n      var me = this;\n      var valueCategory, labels, idx;\n\n      if (!isNullOrUndef$1(index) && !isNullOrUndef$1(datasetIndex)) {\n        value = me.chart.data.datasets[datasetIndex].data[index];\n      } // If value is a data object, then index is the index in the data array,\n      // not the index of the scale. We need to change that.\n\n\n      if (!isNullOrUndef$1(value)) {\n        valueCategory = me.isHorizontal() ? value.x : value.y;\n      }\n\n      if (valueCategory !== undefined || value !== undefined && isNaN(index)) {\n        labels = me._getLabels();\n        value = helpers$1.valueOrDefault(valueCategory, value);\n        idx = labels.indexOf(value);\n        index = idx !== -1 ? idx : index;\n\n        if (isNaN(index)) {\n          index = value;\n        }\n      }\n\n      return me.getPixelForDecimal((index - me._startValue) / me._valueRange);\n    },\n    getPixelForTick: function getPixelForTick(index) {\n      var ticks = this.ticks;\n      return index < 0 || index > ticks.length - 1 ? null : this.getPixelForValue(ticks[index], index + this.minIndex);\n    },\n    getValueForPixel: function getValueForPixel(pixel) {\n      var me = this;\n      var value = Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);\n      return Math.min(Math.max(value, 0), me.ticks.length - 1);\n    },\n    getBasePixel: function getBasePixel() {\n      return this.bottom;\n    }\n  }); // INTERNAL: static default options, registered in src/index.js\n\n  var _defaults = defaultConfig;\n  scale_category._defaults = _defaults;\n  var noop = helpers$1.noop;\n  var isNullOrUndef$2 = helpers$1.isNullOrUndef;\n  /**\r\n   * Generate a set of linear ticks\r\n   * @param generationOptions the options used to generate the ticks\r\n   * @param dataRange the range of the data\r\n   * @returns {number[]} array of tick values\r\n   */\n\n  function generateTicks(generationOptions, dataRange) {\n    var ticks = []; // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n    // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n    // for details.\n\n    var MIN_SPACING = 1e-14;\n    var stepSize = generationOptions.stepSize;\n    var unit = stepSize || 1;\n    var maxNumSpaces = generationOptions.maxTicks - 1;\n    var min = generationOptions.min;\n    var max = generationOptions.max;\n    var precision = generationOptions.precision;\n    var rmin = dataRange.min;\n    var rmax = dataRange.max;\n    var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit;\n    var factor, niceMin, niceMax, numSpaces; // Beyond MIN_SPACING floating point numbers being to lose precision\n    // such that we can't do the math necessary to generate ticks\n\n    if (spacing < MIN_SPACING && isNullOrUndef$2(min) && isNullOrUndef$2(max)) {\n      return [rmin, rmax];\n    }\n\n    numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n\n    if (numSpaces > maxNumSpaces) {\n      // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n      spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;\n    }\n\n    if (stepSize || isNullOrUndef$2(precision)) {\n      // If a precision is not specified, calculate factor based on spacing\n      factor = Math.pow(10, helpers$1._decimalPlaces(spacing));\n    } else {\n      // If the user specified a precision, round to that number of decimal places\n      factor = Math.pow(10, precision);\n      spacing = Math.ceil(spacing * factor) / factor;\n    }\n\n    niceMin = Math.floor(rmin / spacing) * spacing;\n    niceMax = Math.ceil(rmax / spacing) * spacing; // If min, max and stepSize is set and they make an evenly spaced scale use it.\n\n    if (stepSize) {\n      // If very close to our whole number, use it.\n      if (!isNullOrUndef$2(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {\n        niceMin = min;\n      }\n\n      if (!isNullOrUndef$2(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {\n        niceMax = max;\n      }\n    }\n\n    numSpaces = (niceMax - niceMin) / spacing; // If very close to our rounded value, use it.\n\n    if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n      numSpaces = Math.round(numSpaces);\n    } else {\n      numSpaces = Math.ceil(numSpaces);\n    }\n\n    niceMin = Math.round(niceMin * factor) / factor;\n    niceMax = Math.round(niceMax * factor) / factor;\n    ticks.push(isNullOrUndef$2(min) ? niceMin : min);\n\n    for (var j = 1; j < numSpaces; ++j) {\n      ticks.push(Math.round((niceMin + j * spacing) * factor) / factor);\n    }\n\n    ticks.push(isNullOrUndef$2(max) ? niceMax : max);\n    return ticks;\n  }\n\n  var scale_linearbase = core_scale.extend({\n    getRightValue: function getRightValue(value) {\n      if (typeof value === 'string') {\n        return +value;\n      }\n\n      return core_scale.prototype.getRightValue.call(this, value);\n    },\n    handleTickRangeOptions: function handleTickRangeOptions() {\n      var me = this;\n      var opts = me.options;\n      var tickOpts = opts.ticks; // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n      // do nothing since that would make the chart weird. If the user really wants a weird chart\n      // axis, they can manually override it\n\n      if (tickOpts.beginAtZero) {\n        var minSign = helpers$1.sign(me.min);\n        var maxSign = helpers$1.sign(me.max);\n\n        if (minSign < 0 && maxSign < 0) {\n          // move the top up to 0\n          me.max = 0;\n        } else if (minSign > 0 && maxSign > 0) {\n          // move the bottom down to 0\n          me.min = 0;\n        }\n      }\n\n      var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n      var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n      if (tickOpts.min !== undefined) {\n        me.min = tickOpts.min;\n      } else if (tickOpts.suggestedMin !== undefined) {\n        if (me.min === null) {\n          me.min = tickOpts.suggestedMin;\n        } else {\n          me.min = Math.min(me.min, tickOpts.suggestedMin);\n        }\n      }\n\n      if (tickOpts.max !== undefined) {\n        me.max = tickOpts.max;\n      } else if (tickOpts.suggestedMax !== undefined) {\n        if (me.max === null) {\n          me.max = tickOpts.suggestedMax;\n        } else {\n          me.max = Math.max(me.max, tickOpts.suggestedMax);\n        }\n      }\n\n      if (setMin !== setMax) {\n        // We set the min or the max but not both.\n        // So ensure that our range is good\n        // Inverted or 0 length range can happen when\n        // ticks.min is set, and no datasets are visible\n        if (me.min >= me.max) {\n          if (setMin) {\n            me.max = me.min + 1;\n          } else {\n            me.min = me.max - 1;\n          }\n        }\n      }\n\n      if (me.min === me.max) {\n        me.max++;\n\n        if (!tickOpts.beginAtZero) {\n          me.min--;\n        }\n      }\n    },\n    getTickLimit: function getTickLimit() {\n      var me = this;\n      var tickOpts = me.options.ticks;\n      var stepSize = tickOpts.stepSize;\n      var maxTicksLimit = tickOpts.maxTicksLimit;\n      var maxTicks;\n\n      if (stepSize) {\n        maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\n      } else {\n        maxTicks = me._computeTickLimit();\n        maxTicksLimit = maxTicksLimit || 11;\n      }\n\n      if (maxTicksLimit) {\n        maxTicks = Math.min(maxTicksLimit, maxTicks);\n      }\n\n      return maxTicks;\n    },\n    _computeTickLimit: function _computeTickLimit() {\n      return Number.POSITIVE_INFINITY;\n    },\n    handleDirectionalChanges: noop,\n    buildTicks: function buildTicks() {\n      var me = this;\n      var opts = me.options;\n      var tickOpts = opts.ticks; // Figure out what the max number of ticks we can support it is based on the size of\n      // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n      // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n      // the graph. Make sure we always have at least 2 ticks\n\n      var maxTicks = me.getTickLimit();\n      maxTicks = Math.max(2, maxTicks);\n      var numericGeneratorOptions = {\n        maxTicks: maxTicks,\n        min: tickOpts.min,\n        max: tickOpts.max,\n        precision: tickOpts.precision,\n        stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n      };\n      var ticks = me.ticks = generateTicks(numericGeneratorOptions, me);\n      me.handleDirectionalChanges(); // At this point, we need to update our max and min given the tick values since we have expanded the\n      // range of the scale\n\n      me.max = helpers$1.max(ticks);\n      me.min = helpers$1.min(ticks);\n\n      if (tickOpts.reverse) {\n        ticks.reverse();\n        me.start = me.max;\n        me.end = me.min;\n      } else {\n        me.start = me.min;\n        me.end = me.max;\n      }\n    },\n    convertTicksToLabels: function convertTicksToLabels() {\n      var me = this;\n      me.ticksAsNumbers = me.ticks.slice();\n      me.zeroLineIndex = me.ticks.indexOf(0);\n      core_scale.prototype.convertTicksToLabels.call(me);\n    },\n    _configure: function _configure() {\n      var me = this;\n      var ticks = me.getTicks();\n      var start = me.min;\n      var end = me.max;\n      var offset;\n\n      core_scale.prototype._configure.call(me);\n\n      if (me.options.offset && ticks.length) {\n        offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n        start -= offset;\n        end += offset;\n      }\n\n      me._startValue = start;\n      me._endValue = end;\n      me._valueRange = end - start;\n    }\n  });\n  var defaultConfig$1 = {\n    position: 'left',\n    ticks: {\n      callback: core_ticks.formatters.linear\n    }\n  };\n  var DEFAULT_MIN = 0;\n  var DEFAULT_MAX = 1;\n\n  function getOrCreateStack(stacks, stacked, meta) {\n    var key = [meta.type, // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n    stacked === undefined && meta.stack === undefined ? meta.index : '', meta.stack].join('.');\n\n    if (stacks[key] === undefined) {\n      stacks[key] = {\n        pos: [],\n        neg: []\n      };\n    }\n\n    return stacks[key];\n  }\n\n  function stackData(scale, stacks, meta, data) {\n    var opts = scale.options;\n    var stacked = opts.stacked;\n    var stack = getOrCreateStack(stacks, stacked, meta);\n    var pos = stack.pos;\n    var neg = stack.neg;\n    var ilen = data.length;\n    var i, value;\n\n    for (i = 0; i < ilen; ++i) {\n      value = scale._parseValue(data[i]);\n\n      if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {\n        continue;\n      }\n\n      pos[i] = pos[i] || 0;\n      neg[i] = neg[i] || 0;\n\n      if (opts.relativePoints) {\n        pos[i] = 100;\n      } else if (value.min < 0 || value.max < 0) {\n        neg[i] += value.min;\n      } else {\n        pos[i] += value.max;\n      }\n    }\n  }\n\n  function updateMinMax(scale, meta, data) {\n    var ilen = data.length;\n    var i, value;\n\n    for (i = 0; i < ilen; ++i) {\n      value = scale._parseValue(data[i]);\n\n      if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {\n        continue;\n      }\n\n      scale.min = Math.min(scale.min, value.min);\n      scale.max = Math.max(scale.max, value.max);\n    }\n  }\n\n  var scale_linear = scale_linearbase.extend({\n    determineDataLimits: function determineDataLimits() {\n      var me = this;\n      var opts = me.options;\n      var chart = me.chart;\n      var datasets = chart.data.datasets;\n\n      var metasets = me._getMatchingVisibleMetas();\n\n      var hasStacks = opts.stacked;\n      var stacks = {};\n      var ilen = metasets.length;\n      var i, meta, data, values;\n      me.min = Number.POSITIVE_INFINITY;\n      me.max = Number.NEGATIVE_INFINITY;\n\n      if (hasStacks === undefined) {\n        for (i = 0; !hasStacks && i < ilen; ++i) {\n          meta = metasets[i];\n          hasStacks = meta.stack !== undefined;\n        }\n      }\n\n      for (i = 0; i < ilen; ++i) {\n        meta = metasets[i];\n        data = datasets[meta.index].data;\n\n        if (hasStacks) {\n          stackData(me, stacks, meta, data);\n        } else {\n          updateMinMax(me, meta, data);\n        }\n      }\n\n      helpers$1.each(stacks, function (stackValues) {\n        values = stackValues.pos.concat(stackValues.neg);\n        me.min = Math.min(me.min, helpers$1.min(values));\n        me.max = Math.max(me.max, helpers$1.max(values));\n      });\n      me.min = helpers$1.isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n      me.max = helpers$1.isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\n      me.handleTickRangeOptions();\n    },\n    // Returns the maximum number of ticks based on the scale dimension\n    _computeTickLimit: function _computeTickLimit() {\n      var me = this;\n      var tickFont;\n\n      if (me.isHorizontal()) {\n        return Math.ceil(me.width / 40);\n      }\n\n      tickFont = helpers$1.options._parseFont(me.options.ticks);\n      return Math.ceil(me.height / tickFont.lineHeight);\n    },\n    // Called after the ticks are built. We need\n    handleDirectionalChanges: function handleDirectionalChanges() {\n      if (!this.isHorizontal()) {\n        // We are in a vertical orientation. The top value is the highest. So reverse the array\n        this.ticks.reverse();\n      }\n    },\n    getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n      return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);\n    },\n    // Utils\n    getPixelForValue: function getPixelForValue(value) {\n      var me = this;\n      return me.getPixelForDecimal((+me.getRightValue(value) - me._startValue) / me._valueRange);\n    },\n    getValueForPixel: function getValueForPixel(pixel) {\n      return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n    },\n    getPixelForTick: function getPixelForTick(index) {\n      var ticks = this.ticksAsNumbers;\n\n      if (index < 0 || index > ticks.length - 1) {\n        return null;\n      }\n\n      return this.getPixelForValue(ticks[index]);\n    }\n  }); // INTERNAL: static default options, registered in src/index.js\n\n  var _defaults$1 = defaultConfig$1;\n  scale_linear._defaults = _defaults$1;\n  var valueOrDefault$b = helpers$1.valueOrDefault;\n  var log10 = helpers$1.math.log10;\n  /**\r\n   * Generate a set of logarithmic ticks\r\n   * @param generationOptions the options used to generate the ticks\r\n   * @param dataRange the range of the data\r\n   * @returns {number[]} array of tick values\r\n   */\n\n  function generateTicks$1(generationOptions, dataRange) {\n    var ticks = [];\n    var tickVal = valueOrDefault$b(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n    var endExp = Math.floor(log10(dataRange.max));\n    var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n    var exp, significand;\n\n    if (tickVal === 0) {\n      exp = Math.floor(log10(dataRange.minNotZero));\n      significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n      ticks.push(tickVal);\n      tickVal = significand * Math.pow(10, exp);\n    } else {\n      exp = Math.floor(log10(tickVal));\n      significand = Math.floor(tickVal / Math.pow(10, exp));\n    }\n\n    var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n\n    do {\n      ticks.push(tickVal);\n      ++significand;\n\n      if (significand === 10) {\n        significand = 1;\n        ++exp;\n        precision = exp >= 0 ? 1 : precision;\n      }\n\n      tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n    } while (exp < endExp || exp === endExp && significand < endSignificand);\n\n    var lastTick = valueOrDefault$b(generationOptions.max, tickVal);\n    ticks.push(lastTick);\n    return ticks;\n  }\n\n  var defaultConfig$2 = {\n    position: 'left',\n    // label settings\n    ticks: {\n      callback: core_ticks.formatters.logarithmic\n    }\n  }; // TODO(v3): change this to positiveOrDefault\n\n  function nonNegativeOrDefault(value, defaultValue) {\n    return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue;\n  }\n\n  var scale_logarithmic = core_scale.extend({\n    determineDataLimits: function determineDataLimits() {\n      var me = this;\n      var opts = me.options;\n      var chart = me.chart;\n      var datasets = chart.data.datasets;\n      var isHorizontal = me.isHorizontal();\n\n      function IDMatches(meta) {\n        return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n      }\n\n      var datasetIndex, meta, value, data, i, ilen; // Calculate Range\n\n      me.min = Number.POSITIVE_INFINITY;\n      me.max = Number.NEGATIVE_INFINITY;\n      me.minNotZero = Number.POSITIVE_INFINITY;\n      var hasStacks = opts.stacked;\n\n      if (hasStacks === undefined) {\n        for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {\n          meta = chart.getDatasetMeta(datasetIndex);\n\n          if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) {\n            hasStacks = true;\n            break;\n          }\n        }\n      }\n\n      if (opts.stacked || hasStacks) {\n        var valuesPerStack = {};\n\n        for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {\n          meta = chart.getDatasetMeta(datasetIndex);\n          var key = [meta.type, // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n          opts.stacked === undefined && meta.stack === undefined ? datasetIndex : '', meta.stack].join('.');\n\n          if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n            if (valuesPerStack[key] === undefined) {\n              valuesPerStack[key] = [];\n            }\n\n            data = datasets[datasetIndex].data;\n\n            for (i = 0, ilen = data.length; i < ilen; i++) {\n              var values = valuesPerStack[key];\n              value = me._parseValue(data[i]); // invalid, hidden and negative values are ignored\n\n              if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {\n                continue;\n              }\n\n              values[i] = values[i] || 0;\n              values[i] += value.max;\n            }\n          }\n        }\n\n        helpers$1.each(valuesPerStack, function (valuesForType) {\n          if (valuesForType.length > 0) {\n            var minVal = helpers$1.min(valuesForType);\n            var maxVal = helpers$1.max(valuesForType);\n            me.min = Math.min(me.min, minVal);\n            me.max = Math.max(me.max, maxVal);\n          }\n        });\n      } else {\n        for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {\n          meta = chart.getDatasetMeta(datasetIndex);\n\n          if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n            data = datasets[datasetIndex].data;\n\n            for (i = 0, ilen = data.length; i < ilen; i++) {\n              value = me._parseValue(data[i]); // invalid, hidden and negative values are ignored\n\n              if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {\n                continue;\n              }\n\n              me.min = Math.min(value.min, me.min);\n              me.max = Math.max(value.max, me.max);\n\n              if (value.min !== 0) {\n                me.minNotZero = Math.min(value.min, me.minNotZero);\n              }\n            }\n          }\n        }\n      }\n\n      me.min = helpers$1.isFinite(me.min) ? me.min : null;\n      me.max = helpers$1.isFinite(me.max) ? me.max : null;\n      me.minNotZero = helpers$1.isFinite(me.minNotZero) ? me.minNotZero : null; // Common base implementation to handle ticks.min, ticks.max\n\n      this.handleTickRangeOptions();\n    },\n    handleTickRangeOptions: function handleTickRangeOptions() {\n      var me = this;\n      var tickOpts = me.options.ticks;\n      var DEFAULT_MIN = 1;\n      var DEFAULT_MAX = 10;\n      me.min = nonNegativeOrDefault(tickOpts.min, me.min);\n      me.max = nonNegativeOrDefault(tickOpts.max, me.max);\n\n      if (me.min === me.max) {\n        if (me.min !== 0 && me.min !== null) {\n          me.min = Math.pow(10, Math.floor(log10(me.min)) - 1);\n          me.max = Math.pow(10, Math.floor(log10(me.max)) + 1);\n        } else {\n          me.min = DEFAULT_MIN;\n          me.max = DEFAULT_MAX;\n        }\n      }\n\n      if (me.min === null) {\n        me.min = Math.pow(10, Math.floor(log10(me.max)) - 1);\n      }\n\n      if (me.max === null) {\n        me.max = me.min !== 0 ? Math.pow(10, Math.floor(log10(me.min)) + 1) : DEFAULT_MAX;\n      }\n\n      if (me.minNotZero === null) {\n        if (me.min > 0) {\n          me.minNotZero = me.min;\n        } else if (me.max < 1) {\n          me.minNotZero = Math.pow(10, Math.floor(log10(me.max)));\n        } else {\n          me.minNotZero = DEFAULT_MIN;\n        }\n      }\n    },\n    buildTicks: function buildTicks() {\n      var me = this;\n      var tickOpts = me.options.ticks;\n      var reverse = !me.isHorizontal();\n      var generationOptions = {\n        min: nonNegativeOrDefault(tickOpts.min),\n        max: nonNegativeOrDefault(tickOpts.max)\n      };\n      var ticks = me.ticks = generateTicks$1(generationOptions, me); // At this point, we need to update our max and min given the tick values since we have expanded the\n      // range of the scale\n\n      me.max = helpers$1.max(ticks);\n      me.min = helpers$1.min(ticks);\n\n      if (tickOpts.reverse) {\n        reverse = !reverse;\n        me.start = me.max;\n        me.end = me.min;\n      } else {\n        me.start = me.min;\n        me.end = me.max;\n      }\n\n      if (reverse) {\n        ticks.reverse();\n      }\n    },\n    convertTicksToLabels: function convertTicksToLabels() {\n      this.tickValues = this.ticks.slice();\n      core_scale.prototype.convertTicksToLabels.call(this);\n    },\n    // Get the correct tooltip label\n    getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n      return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);\n    },\n    getPixelForTick: function getPixelForTick(index) {\n      var ticks = this.tickValues;\n\n      if (index < 0 || index > ticks.length - 1) {\n        return null;\n      }\n\n      return this.getPixelForValue(ticks[index]);\n    },\n\n    /**\r\n     * Returns the value of the first tick.\r\n     * @param {number} value - The minimum not zero value.\r\n     * @return {number} The first tick value.\r\n     * @private\r\n     */\n    _getFirstTickValue: function _getFirstTickValue(value) {\n      var exp = Math.floor(log10(value));\n      var significand = Math.floor(value / Math.pow(10, exp));\n      return significand * Math.pow(10, exp);\n    },\n    _configure: function _configure() {\n      var me = this;\n      var start = me.min;\n      var offset = 0;\n\n      core_scale.prototype._configure.call(me);\n\n      if (start === 0) {\n        start = me._getFirstTickValue(me.minNotZero);\n        offset = valueOrDefault$b(me.options.ticks.fontSize, core_defaults.global.defaultFontSize) / me._length;\n      }\n\n      me._startValue = log10(start);\n      me._valueOffset = offset;\n      me._valueRange = (log10(me.max) - log10(start)) / (1 - offset);\n    },\n    getPixelForValue: function getPixelForValue(value) {\n      var me = this;\n      var decimal = 0;\n      value = +me.getRightValue(value);\n\n      if (value > me.min && value > 0) {\n        decimal = (log10(value) - me._startValue) / me._valueRange + me._valueOffset;\n      }\n\n      return me.getPixelForDecimal(decimal);\n    },\n    getValueForPixel: function getValueForPixel(pixel) {\n      var me = this;\n      var decimal = me.getDecimalForPixel(pixel);\n      return decimal === 0 && me.min === 0 ? 0 : Math.pow(10, me._startValue + (decimal - me._valueOffset) * me._valueRange);\n    }\n  }); // INTERNAL: static default options, registered in src/index.js\n\n  var _defaults$2 = defaultConfig$2;\n  scale_logarithmic._defaults = _defaults$2;\n  var valueOrDefault$c = helpers$1.valueOrDefault;\n  var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;\n  var resolve$4 = helpers$1.options.resolve;\n  var defaultConfig$3 = {\n    display: true,\n    // Boolean - Whether to animate scaling the chart from the centre\n    animate: true,\n    position: 'chartArea',\n    angleLines: {\n      display: true,\n      color: 'rgba(0,0,0,0.1)',\n      lineWidth: 1,\n      borderDash: [],\n      borderDashOffset: 0.0\n    },\n    gridLines: {\n      circular: false\n    },\n    // label settings\n    ticks: {\n      // Boolean - Show a backdrop to the scale label\n      showLabelBackdrop: true,\n      // String - The colour of the label backdrop\n      backdropColor: 'rgba(255,255,255,0.75)',\n      // Number - The backdrop padding above & below the label in pixels\n      backdropPaddingY: 2,\n      // Number - The backdrop padding to the side of the label in pixels\n      backdropPaddingX: 2,\n      callback: core_ticks.formatters.linear\n    },\n    pointLabels: {\n      // Boolean - if true, show point labels\n      display: true,\n      // Number - Point label font size in pixels\n      fontSize: 10,\n      // Function - Used to convert point labels\n      callback: function callback(label) {\n        return label;\n      }\n    }\n  };\n\n  function getTickBackdropHeight(opts) {\n    var tickOpts = opts.ticks;\n\n    if (tickOpts.display && opts.display) {\n      return valueOrDefault$c(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;\n    }\n\n    return 0;\n  }\n\n  function measureLabelSize(ctx, lineHeight, label) {\n    if (helpers$1.isArray(label)) {\n      return {\n        w: helpers$1.longestText(ctx, ctx.font, label),\n        h: label.length * lineHeight\n      };\n    }\n\n    return {\n      w: ctx.measureText(label).width,\n      h: lineHeight\n    };\n  }\n\n  function determineLimits(angle, pos, size, min, max) {\n    if (angle === min || angle === max) {\n      return {\n        start: pos - size / 2,\n        end: pos + size / 2\n      };\n    } else if (angle < min || angle > max) {\n      return {\n        start: pos - size,\n        end: pos\n      };\n    }\n\n    return {\n      start: pos,\n      end: pos + size\n    };\n  }\n  /**\r\n   * Helper function to fit a radial linear scale with point labels\r\n   */\n\n\n  function fitWithPointLabels(scale) {\n    // Right, this is really confusing and there is a lot of maths going on here\n    // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n    //\n    // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n    //\n    // Solution:\n    //\n    // We assume the radius of the polygon is half the size of the canvas at first\n    // at each index we check if the text overlaps.\n    //\n    // Where it does, we store that angle and that index.\n    //\n    // After finding the largest index and angle we calculate how much we need to remove\n    // from the shape radius to move the point inwards by that x.\n    //\n    // We average the left and right distances to get the maximum shape radius that can fit in the box\n    // along with labels.\n    //\n    // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n    // on each side, removing that from the size, halving it and adding the left x protrusion width.\n    //\n    // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n    // and position it in the most space efficient manner\n    //\n    // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n    var plFont = helpers$1.options._parseFont(scale.options.pointLabels); // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n    // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\n\n    var furthestLimits = {\n      l: 0,\n      r: scale.width,\n      t: 0,\n      b: scale.height - scale.paddingTop\n    };\n    var furthestAngles = {};\n    var i, textSize, pointPosition;\n    scale.ctx.font = plFont.string;\n    scale._pointLabelSizes = [];\n    var valueCount = scale.chart.data.labels.length;\n\n    for (i = 0; i < valueCount; i++) {\n      pointPosition = scale.getPointPosition(i, scale.drawingArea + 5);\n      textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i]);\n      scale._pointLabelSizes[i] = textSize; // Add quarter circle to make degree 0 mean top of circle\n\n      var angleRadians = scale.getIndexAngle(i);\n      var angle = helpers$1.toDegrees(angleRadians) % 360;\n      var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n      var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n      if (hLimits.start < furthestLimits.l) {\n        furthestLimits.l = hLimits.start;\n        furthestAngles.l = angleRadians;\n      }\n\n      if (hLimits.end > furthestLimits.r) {\n        furthestLimits.r = hLimits.end;\n        furthestAngles.r = angleRadians;\n      }\n\n      if (vLimits.start < furthestLimits.t) {\n        furthestLimits.t = vLimits.start;\n        furthestAngles.t = angleRadians;\n      }\n\n      if (vLimits.end > furthestLimits.b) {\n        furthestLimits.b = vLimits.end;\n        furthestAngles.b = angleRadians;\n      }\n    }\n\n    scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles);\n  }\n\n  function getTextAlignForAngle(angle) {\n    if (angle === 0 || angle === 180) {\n      return 'center';\n    } else if (angle < 180) {\n      return 'left';\n    }\n\n    return 'right';\n  }\n\n  function fillText(ctx, text, position, lineHeight) {\n    var y = position.y + lineHeight / 2;\n    var i, ilen;\n\n    if (helpers$1.isArray(text)) {\n      for (i = 0, ilen = text.length; i < ilen; ++i) {\n        ctx.fillText(text[i], position.x, y);\n        y += lineHeight;\n      }\n    } else {\n      ctx.fillText(text, position.x, y);\n    }\n  }\n\n  function adjustPointPositionForLabelHeight(angle, textSize, position) {\n    if (angle === 90 || angle === 270) {\n      position.y -= textSize.h / 2;\n    } else if (angle > 270 || angle < 90) {\n      position.y -= textSize.h;\n    }\n  }\n\n  function drawPointLabels(scale) {\n    var ctx = scale.ctx;\n    var opts = scale.options;\n    var pointLabelOpts = opts.pointLabels;\n    var tickBackdropHeight = getTickBackdropHeight(opts);\n    var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n    var plFont = helpers$1.options._parseFont(pointLabelOpts);\n\n    ctx.save();\n    ctx.font = plFont.string;\n    ctx.textBaseline = 'middle';\n\n    for (var i = scale.chart.data.labels.length - 1; i >= 0; i--) {\n      // Extra pixels out for some label spacing\n      var extra = i === 0 ? tickBackdropHeight / 2 : 0;\n      var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); // Keep this in loop since we may support array properties here\n\n      var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);\n      ctx.fillStyle = pointLabelFontColor;\n      var angleRadians = scale.getIndexAngle(i);\n      var angle = helpers$1.toDegrees(angleRadians);\n      ctx.textAlign = getTextAlignForAngle(angle);\n      adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n      fillText(ctx, scale.pointLabels[i], pointLabelPosition, plFont.lineHeight);\n    }\n\n    ctx.restore();\n  }\n\n  function drawRadiusLine(scale, gridLineOpts, radius, index) {\n    var ctx = scale.ctx;\n    var circular = gridLineOpts.circular;\n    var valueCount = scale.chart.data.labels.length;\n    var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);\n    var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);\n    var pointPosition;\n\n    if (!circular && !valueCount || !lineColor || !lineWidth) {\n      return;\n    }\n\n    ctx.save();\n    ctx.strokeStyle = lineColor;\n    ctx.lineWidth = lineWidth;\n\n    if (ctx.setLineDash) {\n      ctx.setLineDash(gridLineOpts.borderDash || []);\n      ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0;\n    }\n\n    ctx.beginPath();\n\n    if (circular) {\n      // Draw circular arcs between the points\n      ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n    } else {\n      // Draw straight lines connecting each index\n      pointPosition = scale.getPointPosition(0, radius);\n      ctx.moveTo(pointPosition.x, pointPosition.y);\n\n      for (var i = 1; i < valueCount; i++) {\n        pointPosition = scale.getPointPosition(i, radius);\n        ctx.lineTo(pointPosition.x, pointPosition.y);\n      }\n    }\n\n    ctx.closePath();\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  function numberOrZero(param) {\n    return helpers$1.isNumber(param) ? param : 0;\n  }\n\n  var scale_radialLinear = scale_linearbase.extend({\n    setDimensions: function setDimensions() {\n      var me = this; // Set the unconstrained dimension before label rotation\n\n      me.width = me.maxWidth;\n      me.height = me.maxHeight;\n      me.paddingTop = getTickBackdropHeight(me.options) / 2;\n      me.xCenter = Math.floor(me.width / 2);\n      me.yCenter = Math.floor((me.height - me.paddingTop) / 2);\n      me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\n    },\n    determineDataLimits: function determineDataLimits() {\n      var me = this;\n      var chart = me.chart;\n      var min = Number.POSITIVE_INFINITY;\n      var max = Number.NEGATIVE_INFINITY;\n      helpers$1.each(chart.data.datasets, function (dataset, datasetIndex) {\n        if (chart.isDatasetVisible(datasetIndex)) {\n          var meta = chart.getDatasetMeta(datasetIndex);\n          helpers$1.each(dataset.data, function (rawValue, index) {\n            var value = +me.getRightValue(rawValue);\n\n            if (isNaN(value) || meta.data[index].hidden) {\n              return;\n            }\n\n            min = Math.min(value, min);\n            max = Math.max(value, max);\n          });\n        }\n      });\n      me.min = min === Number.POSITIVE_INFINITY ? 0 : min;\n      me.max = max === Number.NEGATIVE_INFINITY ? 0 : max; // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\n      me.handleTickRangeOptions();\n    },\n    // Returns the maximum number of ticks based on the scale dimension\n    _computeTickLimit: function _computeTickLimit() {\n      return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n    },\n    convertTicksToLabels: function convertTicksToLabels() {\n      var me = this;\n      scale_linearbase.prototype.convertTicksToLabels.call(me); // Point labels\n\n      me.pointLabels = me.chart.data.labels.map(function () {\n        var label = helpers$1.callback(me.options.pointLabels.callback, arguments, me);\n        return label || label === 0 ? label : '';\n      });\n    },\n    getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n      return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n    },\n    fit: function fit() {\n      var me = this;\n      var opts = me.options;\n\n      if (opts.display && opts.pointLabels.display) {\n        fitWithPointLabels(me);\n      } else {\n        me.setCenterPoint(0, 0, 0, 0);\n      }\n    },\n\n    /**\r\n     * Set radius reductions and determine new radius and center point\r\n     * @private\r\n     */\n    setReductions: function setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n      var me = this;\n      var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n      var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n      var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n      var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\n      radiusReductionLeft = numberOrZero(radiusReductionLeft);\n      radiusReductionRight = numberOrZero(radiusReductionRight);\n      radiusReductionTop = numberOrZero(radiusReductionTop);\n      radiusReductionBottom = numberOrZero(radiusReductionBottom);\n      me.drawingArea = Math.min(Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n      me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n    },\n    setCenterPoint: function setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n      var me = this;\n      var maxRight = me.width - rightMovement - me.drawingArea;\n      var maxLeft = leftMovement + me.drawingArea;\n      var maxTop = topMovement + me.drawingArea;\n      var maxBottom = me.height - me.paddingTop - bottomMovement - me.drawingArea;\n      me.xCenter = Math.floor((maxLeft + maxRight) / 2 + me.left);\n      me.yCenter = Math.floor((maxTop + maxBottom) / 2 + me.top + me.paddingTop);\n    },\n    getIndexAngle: function getIndexAngle(index) {\n      var chart = this.chart;\n      var angleMultiplier = 360 / chart.data.labels.length;\n      var options = chart.options || {};\n      var startAngle = options.startAngle || 0; // Start from the top instead of right, so remove a quarter of the circle\n\n      var angle = (index * angleMultiplier + startAngle) % 360;\n      return (angle < 0 ? angle + 360 : angle) * Math.PI * 2 / 360;\n    },\n    getDistanceFromCenterForValue: function getDistanceFromCenterForValue(value) {\n      var me = this;\n\n      if (helpers$1.isNullOrUndef(value)) {\n        return NaN;\n      } // Take into account half font size + the yPadding of the top value\n\n\n      var scalingFactor = me.drawingArea / (me.max - me.min);\n\n      if (me.options.ticks.reverse) {\n        return (me.max - value) * scalingFactor;\n      }\n\n      return (value - me.min) * scalingFactor;\n    },\n    getPointPosition: function getPointPosition(index, distanceFromCenter) {\n      var me = this;\n      var thisAngle = me.getIndexAngle(index) - Math.PI / 2;\n      return {\n        x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter,\n        y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter\n      };\n    },\n    getPointPositionForValue: function getPointPositionForValue(index, value) {\n      return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n    },\n    getBasePosition: function getBasePosition(index) {\n      var me = this;\n      var min = me.min;\n      var max = me.max;\n      return me.getPointPositionForValue(index || 0, me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _drawGrid: function _drawGrid() {\n      var me = this;\n      var ctx = me.ctx;\n      var opts = me.options;\n      var gridLineOpts = opts.gridLines;\n      var angleLineOpts = opts.angleLines;\n      var lineWidth = valueOrDefault$c(angleLineOpts.lineWidth, gridLineOpts.lineWidth);\n      var lineColor = valueOrDefault$c(angleLineOpts.color, gridLineOpts.color);\n      var i, offset, position;\n\n      if (opts.pointLabels.display) {\n        drawPointLabels(me);\n      }\n\n      if (gridLineOpts.display) {\n        helpers$1.each(me.ticks, function (label, index) {\n          if (index !== 0) {\n            offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n            drawRadiusLine(me, gridLineOpts, offset, index);\n          }\n        });\n      }\n\n      if (angleLineOpts.display && lineWidth && lineColor) {\n        ctx.save();\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = lineColor;\n\n        if (ctx.setLineDash) {\n          ctx.setLineDash(resolve$4([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));\n          ctx.lineDashOffset = resolve$4([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);\n        }\n\n        for (i = me.chart.data.labels.length - 1; i >= 0; i--) {\n          offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);\n          position = me.getPointPosition(i, offset);\n          ctx.beginPath();\n          ctx.moveTo(me.xCenter, me.yCenter);\n          ctx.lineTo(position.x, position.y);\n          ctx.stroke();\n        }\n\n        ctx.restore();\n      }\n    },\n\n    /**\r\n     * @private\r\n     */\n    _drawLabels: function _drawLabels() {\n      var me = this;\n      var ctx = me.ctx;\n      var opts = me.options;\n      var tickOpts = opts.ticks;\n\n      if (!tickOpts.display) {\n        return;\n      }\n\n      var startAngle = me.getIndexAngle(0);\n\n      var tickFont = helpers$1.options._parseFont(tickOpts);\n\n      var tickFontColor = valueOrDefault$c(tickOpts.fontColor, core_defaults.global.defaultFontColor);\n      var offset, width;\n      ctx.save();\n      ctx.font = tickFont.string;\n      ctx.translate(me.xCenter, me.yCenter);\n      ctx.rotate(startAngle);\n      ctx.textAlign = 'center';\n      ctx.textBaseline = 'middle';\n      helpers$1.each(me.ticks, function (label, index) {\n        if (index === 0 && !tickOpts.reverse) {\n          return;\n        }\n\n        offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n        if (tickOpts.showLabelBackdrop) {\n          width = ctx.measureText(label).width;\n          ctx.fillStyle = tickOpts.backdropColor;\n          ctx.fillRect(-width / 2 - tickOpts.backdropPaddingX, -offset - tickFont.size / 2 - tickOpts.backdropPaddingY, width + tickOpts.backdropPaddingX * 2, tickFont.size + tickOpts.backdropPaddingY * 2);\n        }\n\n        ctx.fillStyle = tickFontColor;\n        ctx.fillText(label, 0, -offset);\n      });\n      ctx.restore();\n    },\n\n    /**\r\n     * @private\r\n     */\n    _drawTitle: helpers$1.noop\n  }); // INTERNAL: static default options, registered in src/index.js\n\n  var _defaults$3 = defaultConfig$3;\n  scale_radialLinear._defaults = _defaults$3;\n  var deprecated$1 = helpers$1._deprecated;\n  var resolve$5 = helpers$1.options.resolve;\n  var valueOrDefault$d = helpers$1.valueOrDefault; // Integer constants are from the ES6 spec.\n\n  var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n  var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n  var INTERVALS = {\n    millisecond: {\n      common: true,\n      size: 1,\n      steps: 1000\n    },\n    second: {\n      common: true,\n      size: 1000,\n      steps: 60\n    },\n    minute: {\n      common: true,\n      size: 60000,\n      steps: 60\n    },\n    hour: {\n      common: true,\n      size: 3600000,\n      steps: 24\n    },\n    day: {\n      common: true,\n      size: 86400000,\n      steps: 30\n    },\n    week: {\n      common: false,\n      size: 604800000,\n      steps: 4\n    },\n    month: {\n      common: true,\n      size: 2.628e9,\n      steps: 12\n    },\n    quarter: {\n      common: false,\n      size: 7.884e9,\n      steps: 4\n    },\n    year: {\n      common: true,\n      size: 3.154e10\n    }\n  };\n  var UNITS = Object.keys(INTERVALS);\n\n  function sorter(a, b) {\n    return a - b;\n  }\n\n  function arrayUnique(items) {\n    var hash = {};\n    var out = [];\n    var i, ilen, item;\n\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      item = items[i];\n\n      if (!hash[item]) {\n        hash[item] = true;\n        out.push(item);\n      }\n    }\n\n    return out;\n  }\n\n  function getMin(options) {\n    return helpers$1.valueOrDefault(options.time.min, options.ticks.min);\n  }\n\n  function getMax(options) {\n    return helpers$1.valueOrDefault(options.time.max, options.ticks.max);\n  }\n  /**\r\n   * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\r\n   * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\r\n   * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\r\n   * extremity (left + width or top + height). Note that it would be more optimized to directly\r\n   * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\r\n   * to create the lookup table. The table ALWAYS contains at least two items: min and max.\r\n   *\r\n   * @param {number[]} timestamps - timestamps sorted from lowest to highest.\r\n   * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min\r\n   * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\r\n   * If 'series', timestamps will be positioned at the same distance from each other. In this\r\n   * case, only timestamps that break the time linearity are registered, meaning that in the\r\n   * best case, all timestamps are linear, the table contains only min and max.\r\n   */\n\n\n  function buildLookupTable(timestamps, min, max, distribution) {\n    if (distribution === 'linear' || !timestamps.length) {\n      return [{\n        time: min,\n        pos: 0\n      }, {\n        time: max,\n        pos: 1\n      }];\n    }\n\n    var table = [];\n    var items = [min];\n    var i, ilen, prev, curr, next;\n\n    for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n      curr = timestamps[i];\n\n      if (curr > min && curr < max) {\n        items.push(curr);\n      }\n    }\n\n    items.push(max);\n\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      next = items[i + 1];\n      prev = items[i - 1];\n      curr = items[i]; // only add points that breaks the scale linearity\n\n      if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n        table.push({\n          time: curr,\n          pos: i / (ilen - 1)\n        });\n      }\n    }\n\n    return table;\n  } // @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\n\n\n  function lookup(table, key, value) {\n    var lo = 0;\n    var hi = table.length - 1;\n    var mid, i0, i1;\n\n    while (lo >= 0 && lo <= hi) {\n      mid = lo + hi >> 1;\n      i0 = table[mid - 1] || null;\n      i1 = table[mid];\n\n      if (!i0) {\n        // given value is outside table (before first item)\n        return {\n          lo: null,\n          hi: i1\n        };\n      } else if (i1[key] < value) {\n        lo = mid + 1;\n      } else if (i0[key] > value) {\n        hi = mid - 1;\n      } else {\n        return {\n          lo: i0,\n          hi: i1\n        };\n      }\n    } // given value is outside table (after last item)\n\n\n    return {\n      lo: i1,\n      hi: null\n    };\n  }\n  /**\r\n   * Linearly interpolates the given source `value` using the table items `skey` values and\r\n   * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\r\n   * returns the position for a timestamp equal to 42. If value is out of bounds, values at\r\n   * index [0, 1] or [n - 1, n] are used for the interpolation.\r\n   */\n\n\n  function interpolate$1(table, skey, sval, tkey) {\n    var range = lookup(table, skey, sval); // Note: the lookup table ALWAYS contains at least 2 items (min and max)\n\n    var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n    var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n    var span = next[skey] - prev[skey];\n    var ratio = span ? (sval - prev[skey]) / span : 0;\n    var offset = (next[tkey] - prev[tkey]) * ratio;\n    return prev[tkey] + offset;\n  }\n\n  function toTimestamp(scale, input) {\n    var adapter = scale._adapter;\n    var options = scale.options.time;\n    var parser = options.parser;\n    var format = parser || options.format;\n    var value = input;\n\n    if (typeof parser === 'function') {\n      value = parser(value);\n    } // Only parse if its not a timestamp already\n\n\n    if (!helpers$1.isFinite(value)) {\n      value = typeof format === 'string' ? adapter.parse(value, format) : adapter.parse(value);\n    }\n\n    if (value !== null) {\n      return +value;\n    } // Labels are in an incompatible format and no `parser` has been provided.\n    // The user might still use the deprecated `format` option for parsing.\n\n\n    if (!parser && typeof format === 'function') {\n      value = format(input); // `format` could return something else than a timestamp, if so, parse it\n\n      if (!helpers$1.isFinite(value)) {\n        value = adapter.parse(value);\n      }\n    }\n\n    return value;\n  }\n\n  function parse(scale, input) {\n    if (helpers$1.isNullOrUndef(input)) {\n      return null;\n    }\n\n    var options = scale.options.time;\n    var value = toTimestamp(scale, scale.getRightValue(input));\n\n    if (value === null) {\n      return value;\n    }\n\n    if (options.round) {\n      value = +scale._adapter.startOf(value, options.round);\n    }\n\n    return value;\n  }\n  /**\r\n   * Figures out what unit results in an appropriate number of auto-generated ticks\r\n   */\n\n\n  function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n    var ilen = UNITS.length;\n    var i, interval, factor;\n\n    for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n      interval = INTERVALS[UNITS[i]];\n      factor = interval.steps ? interval.steps : MAX_INTEGER;\n\n      if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n        return UNITS[i];\n      }\n    }\n\n    return UNITS[ilen - 1];\n  }\n  /**\r\n   * Figures out what unit to format a set of ticks with\r\n   */\n\n\n  function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n    var i, unit;\n\n    for (i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n      unit = UNITS[i];\n\n      if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n        return unit;\n      }\n    }\n\n    return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n  }\n\n  function determineMajorUnit(unit) {\n    for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n      if (INTERVALS[UNITS[i]].common) {\n        return UNITS[i];\n      }\n    }\n  }\n  /**\r\n   * Generates a maximum of `capacity` timestamps between min and max, rounded to the\r\n   * `minor` unit using the given scale time `options`.\r\n   * Important: this method can return ticks outside the min and max range, it's the\r\n   * responsibility of the calling code to clamp values if needed.\r\n   */\n\n\n  function generate(scale, min, max, capacity) {\n    var adapter = scale._adapter;\n    var options = scale.options;\n    var timeOpts = options.time;\n    var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n    var stepSize = resolve$5([timeOpts.stepSize, timeOpts.unitStepSize, 1]);\n    var weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n    var first = min;\n    var ticks = [];\n    var time; // For 'week' unit, handle the first day of week option\n\n    if (weekday) {\n      first = +adapter.startOf(first, 'isoWeek', weekday);\n    } // Align first ticks on unit\n\n\n    first = +adapter.startOf(first, weekday ? 'day' : minor); // Prevent browser from freezing in case user options request millions of milliseconds\n\n    if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n      throw min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor;\n    }\n\n    for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) {\n      ticks.push(time);\n    }\n\n    if (time === max || options.bounds === 'ticks') {\n      ticks.push(time);\n    }\n\n    return ticks;\n  }\n  /**\r\n   * Returns the start and end offsets from edges in the form of {start, end}\r\n   * where each value is a relative width to the scale and ranges between 0 and 1.\r\n   * They add extra margins on the both sides by scaling down the original scale.\r\n   * Offsets are added when the `offset` option is true.\r\n   */\n\n\n  function computeOffsets(table, ticks, min, max, options) {\n    var start = 0;\n    var end = 0;\n    var first, last;\n\n    if (options.offset && ticks.length) {\n      first = interpolate$1(table, 'time', ticks[0], 'pos');\n\n      if (ticks.length === 1) {\n        start = 1 - first;\n      } else {\n        start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;\n      }\n\n      last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');\n\n      if (ticks.length === 1) {\n        end = last;\n      } else {\n        end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;\n      }\n    }\n\n    return {\n      start: start,\n      end: end,\n      factor: 1 / (start + 1 + end)\n    };\n  }\n\n  function setMajorTicks(scale, ticks, map, majorUnit) {\n    var adapter = scale._adapter;\n    var first = +adapter.startOf(ticks[0].value, majorUnit);\n    var last = ticks[ticks.length - 1].value;\n    var major, index;\n\n    for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n      index = map[major];\n\n      if (index >= 0) {\n        ticks[index].major = true;\n      }\n    }\n\n    return ticks;\n  }\n\n  function ticksFromTimestamps(scale, values, majorUnit) {\n    var ticks = [];\n    var map = {};\n    var ilen = values.length;\n    var i, value;\n\n    for (i = 0; i < ilen; ++i) {\n      value = values[i];\n      map[value] = i;\n      ticks.push({\n        value: value,\n        major: false\n      });\n    } // We set the major ticks separately from the above loop because calling startOf for every tick\n    // is expensive when there is a large number of ticks\n\n\n    return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n  }\n\n  var defaultConfig$4 = {\n    position: 'bottom',\n\n    /**\r\n     * Data distribution along the scale:\r\n     * - 'linear': data are spread according to their time (distances can vary),\r\n     * - 'series': data are spread at the same distance from each other.\r\n     * @see https://github.com/chartjs/Chart.js/pull/4507\r\n     * @since 2.7.0\r\n     */\n    distribution: 'linear',\n\n    /**\r\n     * Scale boundary strategy (bypassed by min/max time options)\r\n     * - `data`: make sure data are fully visible, ticks outside are removed\r\n     * - `ticks`: make sure ticks are fully visible, data outside are truncated\r\n     * @see https://github.com/chartjs/Chart.js/pull/4556\r\n     * @since 2.7.0\r\n     */\n    bounds: 'data',\n    adapters: {},\n    time: {\n      parser: false,\n      // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n      unit: false,\n      // false == automatic or override with week, month, year, etc.\n      round: false,\n      // none, or override with week, month, year, etc.\n      displayFormat: false,\n      // DEPRECATED\n      isoWeekday: false,\n      // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/\n      minUnit: 'millisecond',\n      displayFormats: {}\n    },\n    ticks: {\n      autoSkip: false,\n\n      /**\r\n       * Ticks generation input values:\r\n       * - 'auto': generates \"optimal\" ticks based on scale size and time options.\r\n       * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\r\n       * - 'labels': generates ticks from user given `data.labels` values ONLY.\r\n       * @see https://github.com/chartjs/Chart.js/pull/4507\r\n       * @since 2.7.0\r\n       */\n      source: 'auto',\n      major: {\n        enabled: false\n      }\n    }\n  };\n  var scale_time = core_scale.extend({\n    initialize: function initialize() {\n      this.mergeTicksOptions();\n      core_scale.prototype.initialize.call(this);\n    },\n    update: function update() {\n      var me = this;\n      var options = me.options;\n      var time = options.time || (options.time = {});\n      var adapter = me._adapter = new core_adapters._date(options.adapters.date); // DEPRECATIONS: output a message only one time per update\n\n      deprecated$1('time scale', time.format, 'time.format', 'time.parser');\n      deprecated$1('time scale', time.min, 'time.min', 'ticks.min');\n      deprecated$1('time scale', time.max, 'time.max', 'ticks.max'); // Backward compatibility: before introducing adapter, `displayFormats` was\n      // supposed to contain *all* unit/string pairs but this can't be resolved\n      // when loading the scale (adapters are loaded afterward), so let's populate\n      // missing formats on update\n\n      helpers$1.mergeIf(time.displayFormats, adapter.formats());\n      return core_scale.prototype.update.apply(me, arguments);\n    },\n\n    /**\r\n     * Allows data to be referenced via 't' attribute\r\n     */\n    getRightValue: function getRightValue(rawValue) {\n      if (rawValue && rawValue.t !== undefined) {\n        rawValue = rawValue.t;\n      }\n\n      return core_scale.prototype.getRightValue.call(this, rawValue);\n    },\n    determineDataLimits: function determineDataLimits() {\n      var me = this;\n      var chart = me.chart;\n      var adapter = me._adapter;\n      var options = me.options;\n      var unit = options.time.unit || 'day';\n      var min = MAX_INTEGER;\n      var max = MIN_INTEGER;\n      var timestamps = [];\n      var datasets = [];\n      var labels = [];\n      var i, j, ilen, jlen, data, timestamp, labelsAdded;\n\n      var dataLabels = me._getLabels();\n\n      for (i = 0, ilen = dataLabels.length; i < ilen; ++i) {\n        labels.push(parse(me, dataLabels[i]));\n      }\n\n      for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n        if (chart.isDatasetVisible(i)) {\n          data = chart.data.datasets[i].data; // Let's consider that all data have the same format.\n\n          if (helpers$1.isObject(data[0])) {\n            datasets[i] = [];\n\n            for (j = 0, jlen = data.length; j < jlen; ++j) {\n              timestamp = parse(me, data[j]);\n              timestamps.push(timestamp);\n              datasets[i][j] = timestamp;\n            }\n          } else {\n            datasets[i] = labels.slice(0);\n\n            if (!labelsAdded) {\n              timestamps = timestamps.concat(labels);\n              labelsAdded = true;\n            }\n          }\n        } else {\n          datasets[i] = [];\n        }\n      }\n\n      if (labels.length) {\n        min = Math.min(min, labels[0]);\n        max = Math.max(max, labels[labels.length - 1]);\n      }\n\n      if (timestamps.length) {\n        timestamps = ilen > 1 ? arrayUnique(timestamps).sort(sorter) : timestamps.sort(sorter);\n        min = Math.min(min, timestamps[0]);\n        max = Math.max(max, timestamps[timestamps.length - 1]);\n      }\n\n      min = parse(me, getMin(options)) || min;\n      max = parse(me, getMax(options)) || max; // In case there is no valid min/max, set limits based on unit time option\n\n      min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;\n      max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; // Make sure that max is strictly higher than min (required by the lookup table)\n\n      me.min = Math.min(min, max);\n      me.max = Math.max(min + 1, max); // PRIVATE\n\n      me._table = [];\n      me._timestamps = {\n        data: timestamps,\n        datasets: datasets,\n        labels: labels\n      };\n    },\n    buildTicks: function buildTicks() {\n      var me = this;\n      var min = me.min;\n      var max = me.max;\n      var options = me.options;\n      var tickOpts = options.ticks;\n      var timeOpts = options.time;\n      var timestamps = me._timestamps;\n      var ticks = [];\n      var capacity = me.getLabelCapacity(min);\n      var source = tickOpts.source;\n      var distribution = options.distribution;\n      var i, ilen, timestamp;\n\n      if (source === 'data' || source === 'auto' && distribution === 'series') {\n        timestamps = timestamps.data;\n      } else if (source === 'labels') {\n        timestamps = timestamps.labels;\n      } else {\n        timestamps = generate(me, min, max, capacity);\n      }\n\n      if (options.bounds === 'ticks' && timestamps.length) {\n        min = timestamps[0];\n        max = timestamps[timestamps.length - 1];\n      } // Enforce limits with user min/max options\n\n\n      min = parse(me, getMin(options)) || min;\n      max = parse(me, getMax(options)) || max; // Remove ticks outside the min/max range\n\n      for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n        timestamp = timestamps[i];\n\n        if (timestamp >= min && timestamp <= max) {\n          ticks.push(timestamp);\n        }\n      }\n\n      me.min = min;\n      me.max = max; // PRIVATE\n      // determineUnitForFormatting relies on the number of ticks so we don't use it when\n      // autoSkip is enabled because we don't yet know what the final number of ticks will be\n\n      me._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, capacity) : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));\n      me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined : determineMajorUnit(me._unit);\n      me._table = buildLookupTable(me._timestamps.data, min, max, distribution);\n      me._offsets = computeOffsets(me._table, ticks, min, max, options);\n\n      if (tickOpts.reverse) {\n        ticks.reverse();\n      }\n\n      return ticksFromTimestamps(me, ticks, me._majorUnit);\n    },\n    getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n      var me = this;\n      var adapter = me._adapter;\n      var data = me.chart.data;\n      var timeOpts = me.options.time;\n      var label = data.labels && index < data.labels.length ? data.labels[index] : '';\n      var value = data.datasets[datasetIndex].data[index];\n\n      if (helpers$1.isObject(value)) {\n        label = me.getRightValue(value);\n      }\n\n      if (timeOpts.tooltipFormat) {\n        return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat);\n      }\n\n      if (typeof label === 'string') {\n        return label;\n      }\n\n      return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime);\n    },\n\n    /**\r\n     * Function to format an individual tick mark\r\n     * @private\r\n     */\n    tickFormatFunction: function tickFormatFunction(time, index, ticks, format) {\n      var me = this;\n      var adapter = me._adapter;\n      var options = me.options;\n      var formats = options.time.displayFormats;\n      var minorFormat = formats[me._unit];\n      var majorUnit = me._majorUnit;\n      var majorFormat = formats[majorUnit];\n      var tick = ticks[index];\n      var tickOpts = options.ticks;\n      var major = majorUnit && majorFormat && tick && tick.major;\n      var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);\n      var nestedTickOpts = major ? tickOpts.major : tickOpts.minor;\n      var formatter = resolve$5([nestedTickOpts.callback, nestedTickOpts.userCallback, tickOpts.callback, tickOpts.userCallback]);\n      return formatter ? formatter(label, index, ticks) : label;\n    },\n    convertTicksToLabels: function convertTicksToLabels(ticks) {\n      var labels = [];\n      var i, ilen;\n\n      for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n        labels.push(this.tickFormatFunction(ticks[i].value, i, ticks));\n      }\n\n      return labels;\n    },\n\n    /**\r\n     * @private\r\n     */\n    getPixelForOffset: function getPixelForOffset(time) {\n      var me = this;\n      var offsets = me._offsets;\n      var pos = interpolate$1(me._table, 'time', time, 'pos');\n      return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n    },\n    getPixelForValue: function getPixelForValue(value, index, datasetIndex) {\n      var me = this;\n      var time = null;\n\n      if (index !== undefined && datasetIndex !== undefined) {\n        time = me._timestamps.datasets[datasetIndex][index];\n      }\n\n      if (time === null) {\n        time = parse(me, value);\n      }\n\n      if (time !== null) {\n        return me.getPixelForOffset(time);\n      }\n    },\n    getPixelForTick: function getPixelForTick(index) {\n      var ticks = this.getTicks();\n      return index >= 0 && index < ticks.length ? this.getPixelForOffset(ticks[index].value) : null;\n    },\n    getValueForPixel: function getValueForPixel(pixel) {\n      var me = this;\n      var offsets = me._offsets;\n      var pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n      var time = interpolate$1(me._table, 'pos', pos, 'time'); // DEPRECATION, we should return time directly\n\n      return me._adapter._create(time);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getLabelSize: function _getLabelSize(label) {\n      var me = this;\n      var ticksOpts = me.options.ticks;\n      var tickLabelWidth = me.ctx.measureText(label).width;\n      var angle = helpers$1.toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n      var cosRotation = Math.cos(angle);\n      var sinRotation = Math.sin(angle);\n      var tickFontSize = valueOrDefault$d(ticksOpts.fontSize, core_defaults.global.defaultFontSize);\n      return {\n        w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n        h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n      };\n    },\n\n    /**\r\n     * Crude approximation of what the label width might be\r\n     * @private\r\n     */\n    getLabelWidth: function getLabelWidth(label) {\n      return this._getLabelSize(label).w;\n    },\n\n    /**\r\n     * @private\r\n     */\n    getLabelCapacity: function getLabelCapacity(exampleTime) {\n      var me = this;\n      var timeOpts = me.options.time;\n      var displayFormats = timeOpts.displayFormats; // pick the longest format (milliseconds) for guestimation\n\n      var format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n      var exampleLabel = me.tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);\n\n      var size = me._getLabelSize(exampleLabel);\n\n      var capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h);\n\n      if (me.options.offset) {\n        capacity--;\n      }\n\n      return capacity > 0 ? capacity : 1;\n    }\n  }); // INTERNAL: static default options, registered in src/index.js\n\n  var _defaults$4 = defaultConfig$4;\n  scale_time._defaults = _defaults$4;\n  var scales = {\n    category: scale_category,\n    linear: scale_linear,\n    logarithmic: scale_logarithmic,\n    radialLinear: scale_radialLinear,\n    time: scale_time\n  };\n  var FORMATS = {\n    datetime: 'MMM D, YYYY, h:mm:ss a',\n    millisecond: 'h:mm:ss.SSS a',\n    second: 'h:mm:ss a',\n    minute: 'h:mm a',\n    hour: 'hA',\n    day: 'MMM D',\n    week: 'll',\n    month: 'MMM YYYY',\n    quarter: '[Q]Q - YYYY',\n    year: 'YYYY'\n  };\n\n  core_adapters._date.override(typeof moment === 'function' ? {\n    _id: 'moment',\n    // DEBUG ONLY\n    formats: function formats() {\n      return FORMATS;\n    },\n    parse: function parse(value, format) {\n      if (typeof value === 'string' && typeof format === 'string') {\n        value = moment(value, format);\n      } else if (!(value instanceof moment)) {\n        value = moment(value);\n      }\n\n      return value.isValid() ? value.valueOf() : null;\n    },\n    format: function format(time, _format) {\n      return moment(time).format(_format);\n    },\n    add: function add(time, amount, unit) {\n      return moment(time).add(amount, unit).valueOf();\n    },\n    diff: function diff(max, min, unit) {\n      return moment(max).diff(moment(min), unit);\n    },\n    startOf: function startOf(time, unit, weekday) {\n      time = moment(time);\n\n      if (unit === 'isoWeek') {\n        return time.isoWeekday(weekday).valueOf();\n      }\n\n      return time.startOf(unit).valueOf();\n    },\n    endOf: function endOf(time, unit) {\n      return moment(time).endOf(unit).valueOf();\n    },\n    // DEPRECATIONS\n\n    /**\r\n     * Provided for backward compatibility with scale.getValueForPixel().\r\n     * @deprecated since version 2.8.0\r\n     * @todo remove at version 3\r\n     * @private\r\n     */\n    _create: function _create(time) {\n      return moment(time);\n    }\n  } : {});\n\n  core_defaults._set('global', {\n    plugins: {\n      filler: {\n        propagate: true\n      }\n    }\n  });\n\n  var mappers = {\n    dataset: function dataset(source) {\n      var index = source.fill;\n      var chart = source.chart;\n      var meta = chart.getDatasetMeta(index);\n      var visible = meta && chart.isDatasetVisible(index);\n      var points = visible && meta.dataset._children || [];\n      var length = points.length || 0;\n      return !length ? null : function (point, i) {\n        return i < length && points[i]._view || null;\n      };\n    },\n    boundary: function boundary(source) {\n      var boundary = source.boundary;\n      var x = boundary ? boundary.x : null;\n      var y = boundary ? boundary.y : null;\n\n      if (helpers$1.isArray(boundary)) {\n        return function (point, i) {\n          return boundary[i];\n        };\n      }\n\n      return function (point) {\n        return {\n          x: x === null ? point.x : x,\n          y: y === null ? point.y : y\n        };\n      };\n    }\n  }; // @todo if (fill[0] === '#')\n\n  function decodeFill(el, index, count) {\n    var model = el._model || {};\n    var fill = model.fill;\n    var target;\n\n    if (fill === undefined) {\n      fill = !!model.backgroundColor;\n    }\n\n    if (fill === false || fill === null) {\n      return false;\n    }\n\n    if (fill === true) {\n      return 'origin';\n    }\n\n    target = parseFloat(fill, 10);\n\n    if (isFinite(target) && Math.floor(target) === target) {\n      if (fill[0] === '-' || fill[0] === '+') {\n        target = index + target;\n      }\n\n      if (target === index || target < 0 || target >= count) {\n        return false;\n      }\n\n      return target;\n    }\n\n    switch (fill) {\n      // compatibility\n      case 'bottom':\n        return 'start';\n\n      case 'top':\n        return 'end';\n\n      case 'zero':\n        return 'origin';\n      // supported boundaries\n\n      case 'origin':\n      case 'start':\n      case 'end':\n        return fill;\n      // invalid fill values\n\n      default:\n        return false;\n    }\n  }\n\n  function computeLinearBoundary(source) {\n    var model = source.el._model || {};\n    var scale = source.el._scale || {};\n    var fill = source.fill;\n    var target = null;\n    var horizontal;\n\n    if (isFinite(fill)) {\n      return null;\n    } // Backward compatibility: until v3, we still need to support boundary values set on\n    // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n    // controllers might still use it (e.g. the Smith chart).\n\n\n    if (fill === 'start') {\n      target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n    } else if (fill === 'end') {\n      target = model.scaleTop === undefined ? scale.top : model.scaleTop;\n    } else if (model.scaleZero !== undefined) {\n      target = model.scaleZero;\n    } else if (scale.getBasePixel) {\n      target = scale.getBasePixel();\n    }\n\n    if (target !== undefined && target !== null) {\n      if (target.x !== undefined && target.y !== undefined) {\n        return target;\n      }\n\n      if (helpers$1.isFinite(target)) {\n        horizontal = scale.isHorizontal();\n        return {\n          x: horizontal ? target : null,\n          y: horizontal ? null : target\n        };\n      }\n    }\n\n    return null;\n  }\n\n  function computeCircularBoundary(source) {\n    var scale = source.el._scale;\n    var options = scale.options;\n    var length = scale.chart.data.labels.length;\n    var fill = source.fill;\n    var target = [];\n    var start, end, center, i, point;\n\n    if (!length) {\n      return null;\n    }\n\n    start = options.ticks.reverse ? scale.max : scale.min;\n    end = options.ticks.reverse ? scale.min : scale.max;\n    center = scale.getPointPositionForValue(0, start);\n\n    for (i = 0; i < length; ++i) {\n      point = fill === 'start' || fill === 'end' ? scale.getPointPositionForValue(i, fill === 'start' ? start : end) : scale.getBasePosition(i);\n\n      if (options.gridLines.circular) {\n        point.cx = center.x;\n        point.cy = center.y;\n        point.angle = scale.getIndexAngle(i) - Math.PI / 2;\n      }\n\n      target.push(point);\n    }\n\n    return target;\n  }\n\n  function computeBoundary(source) {\n    var scale = source.el._scale || {};\n\n    if (scale.getPointPositionForValue) {\n      return computeCircularBoundary(source);\n    }\n\n    return computeLinearBoundary(source);\n  }\n\n  function resolveTarget(sources, index, propagate) {\n    var source = sources[index];\n    var fill = source.fill;\n    var visited = [index];\n    var target;\n\n    if (!propagate) {\n      return fill;\n    }\n\n    while (fill !== false && visited.indexOf(fill) === -1) {\n      if (!isFinite(fill)) {\n        return fill;\n      }\n\n      target = sources[fill];\n\n      if (!target) {\n        return false;\n      }\n\n      if (target.visible) {\n        return fill;\n      }\n\n      visited.push(fill);\n      fill = target.fill;\n    }\n\n    return false;\n  }\n\n  function createMapper(source) {\n    var fill = source.fill;\n    var type = 'dataset';\n\n    if (fill === false) {\n      return null;\n    }\n\n    if (!isFinite(fill)) {\n      type = 'boundary';\n    }\n\n    return mappers[type](source);\n  }\n\n  function isDrawable(point) {\n    return point && !point.skip;\n  }\n\n  function drawArea(ctx, curve0, curve1, len0, len1) {\n    var i, cx, cy, r;\n\n    if (!len0 || !len1) {\n      return;\n    } // building first area curve (normal)\n\n\n    ctx.moveTo(curve0[0].x, curve0[0].y);\n\n    for (i = 1; i < len0; ++i) {\n      helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n    }\n\n    if (curve1[0].angle !== undefined) {\n      cx = curve1[0].cx;\n      cy = curve1[0].cy;\n      r = Math.sqrt(Math.pow(curve1[0].x - cx, 2) + Math.pow(curve1[0].y - cy, 2));\n\n      for (i = len1 - 1; i > 0; --i) {\n        ctx.arc(cx, cy, r, curve1[i].angle, curve1[i - 1].angle, true);\n      }\n\n      return;\n    } // joining the two area curves\n\n\n    ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); // building opposite area curve (reverse)\n\n    for (i = len1 - 1; i > 0; --i) {\n      helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n    }\n  }\n\n  function doFill(ctx, points, mapper, view, color, loop) {\n    var count = points.length;\n    var span = view.spanGaps;\n    var curve0 = [];\n    var curve1 = [];\n    var len0 = 0;\n    var len1 = 0;\n    var i, ilen, index, p0, p1, d0, d1, loopOffset;\n    ctx.beginPath();\n\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i % count;\n      p0 = points[index]._view;\n      p1 = mapper(p0, index, view);\n      d0 = isDrawable(p0);\n      d1 = isDrawable(p1);\n\n      if (loop && loopOffset === undefined && d0) {\n        loopOffset = i + 1;\n        ilen = count + loopOffset;\n      }\n\n      if (d0 && d1) {\n        len0 = curve0.push(p0);\n        len1 = curve1.push(p1);\n      } else if (len0 && len1) {\n        if (!span) {\n          drawArea(ctx, curve0, curve1, len0, len1);\n          len0 = len1 = 0;\n          curve0 = [];\n          curve1 = [];\n        } else {\n          if (d0) {\n            curve0.push(p0);\n          }\n\n          if (d1) {\n            curve1.push(p1);\n          }\n        }\n      }\n    }\n\n    drawArea(ctx, curve0, curve1, len0, len1);\n    ctx.closePath();\n    ctx.fillStyle = color;\n    ctx.fill();\n  }\n\n  var plugin_filler = {\n    id: 'filler',\n    afterDatasetsUpdate: function afterDatasetsUpdate(chart, options) {\n      var count = (chart.data.datasets || []).length;\n      var propagate = options.propagate;\n      var sources = [];\n      var meta, i, el, source;\n\n      for (i = 0; i < count; ++i) {\n        meta = chart.getDatasetMeta(i);\n        el = meta.dataset;\n        source = null;\n\n        if (el && el._model && el instanceof elements.Line) {\n          source = {\n            visible: chart.isDatasetVisible(i),\n            fill: decodeFill(el, i, count),\n            chart: chart,\n            el: el\n          };\n        }\n\n        meta.$filler = source;\n        sources.push(source);\n      }\n\n      for (i = 0; i < count; ++i) {\n        source = sources[i];\n\n        if (!source) {\n          continue;\n        }\n\n        source.fill = resolveTarget(sources, i, propagate);\n        source.boundary = computeBoundary(source);\n        source.mapper = createMapper(source);\n      }\n    },\n    beforeDatasetsDraw: function beforeDatasetsDraw(chart) {\n      var metasets = chart._getSortedVisibleDatasetMetas();\n\n      var ctx = chart.ctx;\n      var meta, i, el, view, points, mapper, color;\n\n      for (i = metasets.length - 1; i >= 0; --i) {\n        meta = metasets[i].$filler;\n\n        if (!meta || !meta.visible) {\n          continue;\n        }\n\n        el = meta.el;\n        view = el._view;\n        points = el._children || [];\n        mapper = meta.mapper;\n        color = view.backgroundColor || core_defaults.global.defaultColor;\n\n        if (mapper && color && points.length) {\n          helpers$1.canvas.clipArea(ctx, chart.chartArea);\n          doFill(ctx, points, mapper, view, color, el._loop);\n          helpers$1.canvas.unclipArea(ctx);\n        }\n      }\n    }\n  };\n  var getRtlHelper$1 = helpers$1.rtl.getRtlAdapter;\n  var noop$1 = helpers$1.noop;\n  var valueOrDefault$e = helpers$1.valueOrDefault;\n\n  core_defaults._set('global', {\n    legend: {\n      display: true,\n      position: 'top',\n      align: 'center',\n      fullWidth: true,\n      reverse: false,\n      weight: 1000,\n      // a callback that will handle\n      onClick: function onClick(e, legendItem) {\n        var index = legendItem.datasetIndex;\n        var ci = this.chart;\n        var meta = ci.getDatasetMeta(index); // See controller.isDatasetVisible comment\n\n        meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; // We hid a dataset ... rerender the chart\n\n        ci.update();\n      },\n      onHover: null,\n      onLeave: null,\n      labels: {\n        boxWidth: 40,\n        padding: 10,\n        // Generates labels shown in the legend\n        // Valid properties to return:\n        // text : text to display\n        // fillStyle : fill of coloured box\n        // strokeStyle: stroke of coloured box\n        // hidden : if this legend item refers to a hidden item\n        // lineCap : cap style for line\n        // lineDash\n        // lineDashOffset :\n        // lineJoin :\n        // lineWidth :\n        generateLabels: function generateLabels(chart) {\n          var datasets = chart.data.datasets;\n          var options = chart.options.legend || {};\n          var usePointStyle = options.labels && options.labels.usePointStyle;\n          return chart._getSortedDatasetMetas().map(function (meta) {\n            var style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n            return {\n              text: datasets[meta.index].label,\n              fillStyle: style.backgroundColor,\n              hidden: !chart.isDatasetVisible(meta.index),\n              lineCap: style.borderCapStyle,\n              lineDash: style.borderDash,\n              lineDashOffset: style.borderDashOffset,\n              lineJoin: style.borderJoinStyle,\n              lineWidth: style.borderWidth,\n              strokeStyle: style.borderColor,\n              pointStyle: style.pointStyle,\n              rotation: style.rotation,\n              // Below is extra data used for toggling the datasets\n              datasetIndex: meta.index\n            };\n          }, this);\n        }\n      }\n    },\n    legendCallback: function legendCallback(chart) {\n      var list = document.createElement('ul');\n      var datasets = chart.data.datasets;\n      var i, ilen, listItem, listItemSpan;\n      list.setAttribute('class', chart.id + '-legend');\n\n      for (i = 0, ilen = datasets.length; i < ilen; i++) {\n        listItem = list.appendChild(document.createElement('li'));\n        listItemSpan = listItem.appendChild(document.createElement('span'));\n        listItemSpan.style.backgroundColor = datasets[i].backgroundColor;\n\n        if (datasets[i].label) {\n          listItem.appendChild(document.createTextNode(datasets[i].label));\n        }\n      }\n\n      return list.outerHTML;\n    }\n  });\n  /**\r\n   * Helper function to get the box width based on the usePointStyle option\r\n   * @param {object} labelopts - the label options on the legend\r\n   * @param {number} fontSize - the label font size\r\n   * @return {number} width of the color box area\r\n   */\n\n\n  function getBoxWidth(labelOpts, fontSize) {\n    return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? fontSize : labelOpts.boxWidth;\n  }\n  /**\r\n   * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\r\n   */\n\n\n  var Legend = core_element.extend({\n    initialize: function initialize(config) {\n      var me = this;\n      helpers$1.extend(me, config); // Contains hit boxes for each dataset (in dataset order)\n\n      me.legendHitBoxes = [];\n      /**\r\n      \t * @private\r\n      \t */\n\n      me._hoveredItem = null; // Are we in doughnut mode which has a different data type\n\n      me.doughnutMode = false;\n    },\n    // These methods are ordered by lifecycle. Utilities then follow.\n    // Any function defined here is inherited by all legend types.\n    // Any function can be extended by the legend type\n    beforeUpdate: noop$1,\n    update: function update(maxWidth, maxHeight, margins) {\n      var me = this; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\n      me.beforeUpdate(); // Absorb the master measurements\n\n      me.maxWidth = maxWidth;\n      me.maxHeight = maxHeight;\n      me.margins = margins; // Dimensions\n\n      me.beforeSetDimensions();\n      me.setDimensions();\n      me.afterSetDimensions(); // Labels\n\n      me.beforeBuildLabels();\n      me.buildLabels();\n      me.afterBuildLabels(); // Fit\n\n      me.beforeFit();\n      me.fit();\n      me.afterFit(); //\n\n      me.afterUpdate();\n      return me.minSize;\n    },\n    afterUpdate: noop$1,\n    //\n    beforeSetDimensions: noop$1,\n    setDimensions: function setDimensions() {\n      var me = this; // Set the unconstrained dimension before label rotation\n\n      if (me.isHorizontal()) {\n        // Reset position before calculating rotation\n        me.width = me.maxWidth;\n        me.left = 0;\n        me.right = me.width;\n      } else {\n        me.height = me.maxHeight; // Reset position before calculating rotation\n\n        me.top = 0;\n        me.bottom = me.height;\n      } // Reset padding\n\n\n      me.paddingLeft = 0;\n      me.paddingTop = 0;\n      me.paddingRight = 0;\n      me.paddingBottom = 0; // Reset minSize\n\n      me.minSize = {\n        width: 0,\n        height: 0\n      };\n    },\n    afterSetDimensions: noop$1,\n    //\n    beforeBuildLabels: noop$1,\n    buildLabels: function buildLabels() {\n      var me = this;\n      var labelOpts = me.options.labels || {};\n      var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n      if (labelOpts.filter) {\n        legendItems = legendItems.filter(function (item) {\n          return labelOpts.filter(item, me.chart.data);\n        });\n      }\n\n      if (me.options.reverse) {\n        legendItems.reverse();\n      }\n\n      me.legendItems = legendItems;\n    },\n    afterBuildLabels: noop$1,\n    //\n    beforeFit: noop$1,\n    fit: function fit() {\n      var me = this;\n      var opts = me.options;\n      var labelOpts = opts.labels;\n      var display = opts.display;\n      var ctx = me.ctx;\n\n      var labelFont = helpers$1.options._parseFont(labelOpts);\n\n      var fontSize = labelFont.size; // Reset hit boxes\n\n      var hitboxes = me.legendHitBoxes = [];\n      var minSize = me.minSize;\n      var isHorizontal = me.isHorizontal();\n\n      if (isHorizontal) {\n        minSize.width = me.maxWidth; // fill all the width\n\n        minSize.height = display ? 10 : 0;\n      } else {\n        minSize.width = display ? 10 : 0;\n        minSize.height = me.maxHeight; // fill all the height\n      } // Increase sizes here\n\n\n      if (!display) {\n        me.width = minSize.width = me.height = minSize.height = 0;\n        return;\n      }\n\n      ctx.font = labelFont.string;\n\n      if (isHorizontal) {\n        // Labels\n        // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n        var lineWidths = me.lineWidths = [0];\n        var totalHeight = 0;\n        ctx.textAlign = 'left';\n        ctx.textBaseline = 'middle';\n        helpers$1.each(me.legendItems, function (legendItem, i) {\n          var boxWidth = getBoxWidth(labelOpts, fontSize);\n          var width = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n\n          if (i === 0 || lineWidths[lineWidths.length - 1] + width + 2 * labelOpts.padding > minSize.width) {\n            totalHeight += fontSize + labelOpts.padding;\n            lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n          } // Store the hitbox width and height here. Final position will be updated in `draw`\n\n\n          hitboxes[i] = {\n            left: 0,\n            top: 0,\n            width: width,\n            height: fontSize\n          };\n          lineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n        });\n        minSize.height += totalHeight;\n      } else {\n        var vPadding = labelOpts.padding;\n        var columnWidths = me.columnWidths = [];\n        var columnHeights = me.columnHeights = [];\n        var totalWidth = labelOpts.padding;\n        var currentColWidth = 0;\n        var currentColHeight = 0;\n        helpers$1.each(me.legendItems, function (legendItem, i) {\n          var boxWidth = getBoxWidth(labelOpts, fontSize);\n          var itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width; // If too tall, go to new column\n\n          if (i > 0 && currentColHeight + fontSize + 2 * vPadding > minSize.height) {\n            totalWidth += currentColWidth + labelOpts.padding;\n            columnWidths.push(currentColWidth); // previous column width\n\n            columnHeights.push(currentColHeight);\n            currentColWidth = 0;\n            currentColHeight = 0;\n          } // Get max width\n\n\n          currentColWidth = Math.max(currentColWidth, itemWidth);\n          currentColHeight += fontSize + vPadding; // Store the hitbox width and height here. Final position will be updated in `draw`\n\n          hitboxes[i] = {\n            left: 0,\n            top: 0,\n            width: itemWidth,\n            height: fontSize\n          };\n        });\n        totalWidth += currentColWidth;\n        columnWidths.push(currentColWidth);\n        columnHeights.push(currentColHeight);\n        minSize.width += totalWidth;\n      }\n\n      me.width = minSize.width;\n      me.height = minSize.height;\n    },\n    afterFit: noop$1,\n    // Shared Methods\n    isHorizontal: function isHorizontal() {\n      return this.options.position === 'top' || this.options.position === 'bottom';\n    },\n    // Actually draw the legend on the canvas\n    draw: function draw() {\n      var me = this;\n      var opts = me.options;\n      var labelOpts = opts.labels;\n      var globalDefaults = core_defaults.global;\n      var defaultColor = globalDefaults.defaultColor;\n      var lineDefault = globalDefaults.elements.line;\n      var legendHeight = me.height;\n      var columnHeights = me.columnHeights;\n      var legendWidth = me.width;\n      var lineWidths = me.lineWidths;\n\n      if (!opts.display) {\n        return;\n      }\n\n      var rtlHelper = getRtlHelper$1(opts.rtl, me.left, me.minSize.width);\n      var ctx = me.ctx;\n      var fontColor = valueOrDefault$e(labelOpts.fontColor, globalDefaults.defaultFontColor);\n\n      var labelFont = helpers$1.options._parseFont(labelOpts);\n\n      var fontSize = labelFont.size;\n      var cursor; // Canvas setup\n\n      ctx.textAlign = rtlHelper.textAlign('left');\n      ctx.textBaseline = 'middle';\n      ctx.lineWidth = 0.5;\n      ctx.strokeStyle = fontColor; // for strikethrough effect\n\n      ctx.fillStyle = fontColor; // render in correct colour\n\n      ctx.font = labelFont.string;\n      var boxWidth = getBoxWidth(labelOpts, fontSize);\n      var hitboxes = me.legendHitBoxes; // current position\n\n      var drawLegendBox = function drawLegendBox(x, y, legendItem) {\n        if (isNaN(boxWidth) || boxWidth <= 0) {\n          return;\n        } // Set the ctx for the box\n\n\n        ctx.save();\n        var lineWidth = valueOrDefault$e(legendItem.lineWidth, lineDefault.borderWidth);\n        ctx.fillStyle = valueOrDefault$e(legendItem.fillStyle, defaultColor);\n        ctx.lineCap = valueOrDefault$e(legendItem.lineCap, lineDefault.borderCapStyle);\n        ctx.lineDashOffset = valueOrDefault$e(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n        ctx.lineJoin = valueOrDefault$e(legendItem.lineJoin, lineDefault.borderJoinStyle);\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = valueOrDefault$e(legendItem.strokeStyle, defaultColor);\n\n        if (ctx.setLineDash) {\n          // IE 9 and 10 do not support line dash\n          ctx.setLineDash(valueOrDefault$e(legendItem.lineDash, lineDefault.borderDash));\n        }\n\n        if (labelOpts && labelOpts.usePointStyle) {\n          // Recalculate x and y for drawPoint() because its expecting\n          // x and y to be center of figure (instead of top left)\n          var radius = boxWidth * Math.SQRT2 / 2;\n          var centerX = rtlHelper.xPlus(x, boxWidth / 2);\n          var centerY = y + fontSize / 2; // Draw pointStyle as legend symbol\n\n          helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY, legendItem.rotation);\n        } else {\n          // Draw box as legend symbol\n          ctx.fillRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);\n\n          if (lineWidth !== 0) {\n            ctx.strokeRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);\n          }\n        }\n\n        ctx.restore();\n      };\n\n      var fillText = function fillText(x, y, legendItem, textWidth) {\n        var halfFontSize = fontSize / 2;\n        var xLeft = rtlHelper.xPlus(x, boxWidth + halfFontSize);\n        var yMiddle = y + halfFontSize;\n        ctx.fillText(legendItem.text, xLeft, yMiddle);\n\n        if (legendItem.hidden) {\n          // Strikethrough the text if hidden\n          ctx.beginPath();\n          ctx.lineWidth = 2;\n          ctx.moveTo(xLeft, yMiddle);\n          ctx.lineTo(rtlHelper.xPlus(xLeft, textWidth), yMiddle);\n          ctx.stroke();\n        }\n      };\n\n      var alignmentOffset = function alignmentOffset(dimension, blockSize) {\n        switch (opts.align) {\n          case 'start':\n            return labelOpts.padding;\n\n          case 'end':\n            return dimension - blockSize;\n\n          default:\n            // center\n            return (dimension - blockSize + labelOpts.padding) / 2;\n        }\n      }; // Horizontal\n\n\n      var isHorizontal = me.isHorizontal();\n\n      if (isHorizontal) {\n        cursor = {\n          x: me.left + alignmentOffset(legendWidth, lineWidths[0]),\n          y: me.top + labelOpts.padding,\n          line: 0\n        };\n      } else {\n        cursor = {\n          x: me.left + labelOpts.padding,\n          y: me.top + alignmentOffset(legendHeight, columnHeights[0]),\n          line: 0\n        };\n      }\n\n      helpers$1.rtl.overrideTextDirection(me.ctx, opts.textDirection);\n      var itemHeight = fontSize + labelOpts.padding;\n      helpers$1.each(me.legendItems, function (legendItem, i) {\n        var textWidth = ctx.measureText(legendItem.text).width;\n        var width = boxWidth + fontSize / 2 + textWidth;\n        var x = cursor.x;\n        var y = cursor.y;\n        rtlHelper.setWidth(me.minSize.width); // Use (me.left + me.minSize.width) and (me.top + me.minSize.height)\n        // instead of me.right and me.bottom because me.width and me.height\n        // may have been changed since me.minSize was calculated\n\n        if (isHorizontal) {\n          if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {\n            y = cursor.y += itemHeight;\n            cursor.line++;\n            x = cursor.x = me.left + alignmentOffset(legendWidth, lineWidths[cursor.line]);\n          }\n        } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {\n          x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n          cursor.line++;\n          y = cursor.y = me.top + alignmentOffset(legendHeight, columnHeights[cursor.line]);\n        }\n\n        var realX = rtlHelper.x(x);\n        drawLegendBox(realX, y, legendItem);\n        hitboxes[i].left = rtlHelper.leftForLtr(realX, hitboxes[i].width);\n        hitboxes[i].top = y; // Fill the actual label\n\n        fillText(realX, y, legendItem, textWidth);\n\n        if (isHorizontal) {\n          cursor.x += width + labelOpts.padding;\n        } else {\n          cursor.y += itemHeight;\n        }\n      });\n      helpers$1.rtl.restoreTextDirection(me.ctx, opts.textDirection);\n    },\n\n    /**\r\n     * @private\r\n     */\n    _getLegendItemAt: function _getLegendItemAt(x, y) {\n      var me = this;\n      var i, hitBox, lh;\n\n      if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n        // See if we are touching one of the dataset boxes\n        lh = me.legendHitBoxes;\n\n        for (i = 0; i < lh.length; ++i) {\n          hitBox = lh[i];\n\n          if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n            // Touching an element\n            return me.legendItems[i];\n          }\n        }\n      }\n\n      return null;\n    },\n\n    /**\r\n     * Handle an event\r\n     * @private\r\n     * @param {IEvent} event - The event to handle\r\n     */\n    handleEvent: function handleEvent(e) {\n      var me = this;\n      var opts = me.options;\n      var type = e.type === 'mouseup' ? 'click' : e.type;\n      var hoveredItem;\n\n      if (type === 'mousemove') {\n        if (!opts.onHover && !opts.onLeave) {\n          return;\n        }\n      } else if (type === 'click') {\n        if (!opts.onClick) {\n          return;\n        }\n      } else {\n        return;\n      } // Chart event already has relative position in it\n\n\n      hoveredItem = me._getLegendItemAt(e.x, e.y);\n\n      if (type === 'click') {\n        if (hoveredItem && opts.onClick) {\n          // use e.native for backwards compatibility\n          opts.onClick.call(me, e[\"native\"], hoveredItem);\n        }\n      } else {\n        if (opts.onLeave && hoveredItem !== me._hoveredItem) {\n          if (me._hoveredItem) {\n            opts.onLeave.call(me, e[\"native\"], me._hoveredItem);\n          }\n\n          me._hoveredItem = hoveredItem;\n        }\n\n        if (opts.onHover && hoveredItem) {\n          // use e.native for backwards compatibility\n          opts.onHover.call(me, e[\"native\"], hoveredItem);\n        }\n      }\n    }\n  });\n\n  function createNewLegendAndAttach(chart, legendOpts) {\n    var legend = new Legend({\n      ctx: chart.ctx,\n      options: legendOpts,\n      chart: chart\n    });\n    core_layouts.configure(chart, legend, legendOpts);\n    core_layouts.addBox(chart, legend);\n    chart.legend = legend;\n  }\n\n  var plugin_legend = {\n    id: 'legend',\n\n    /**\r\n     * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\r\n     * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\r\n     * the plugin, which one will be re-exposed in the chart.js file.\r\n     * https://github.com/chartjs/Chart.js/pull/2640\r\n     * @private\r\n     */\n    _element: Legend,\n    beforeInit: function beforeInit(chart) {\n      var legendOpts = chart.options.legend;\n\n      if (legendOpts) {\n        createNewLegendAndAttach(chart, legendOpts);\n      }\n    },\n    beforeUpdate: function beforeUpdate(chart) {\n      var legendOpts = chart.options.legend;\n      var legend = chart.legend;\n\n      if (legendOpts) {\n        helpers$1.mergeIf(legendOpts, core_defaults.global.legend);\n\n        if (legend) {\n          core_layouts.configure(chart, legend, legendOpts);\n          legend.options = legendOpts;\n        } else {\n          createNewLegendAndAttach(chart, legendOpts);\n        }\n      } else if (legend) {\n        core_layouts.removeBox(chart, legend);\n        delete chart.legend;\n      }\n    },\n    afterEvent: function afterEvent(chart, e) {\n      var legend = chart.legend;\n\n      if (legend) {\n        legend.handleEvent(e);\n      }\n    }\n  };\n  var noop$2 = helpers$1.noop;\n\n  core_defaults._set('global', {\n    title: {\n      display: false,\n      fontStyle: 'bold',\n      fullWidth: true,\n      padding: 10,\n      position: 'top',\n      text: '',\n      weight: 2000 // by default greater than legend (1000) to be above\n\n    }\n  });\n  /**\r\n   * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\r\n   */\n\n\n  var Title = core_element.extend({\n    initialize: function initialize(config) {\n      var me = this;\n      helpers$1.extend(me, config); // Contains hit boxes for each dataset (in dataset order)\n\n      me.legendHitBoxes = [];\n    },\n    // These methods are ordered by lifecycle. Utilities then follow.\n    beforeUpdate: noop$2,\n    update: function update(maxWidth, maxHeight, margins) {\n      var me = this; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\n      me.beforeUpdate(); // Absorb the master measurements\n\n      me.maxWidth = maxWidth;\n      me.maxHeight = maxHeight;\n      me.margins = margins; // Dimensions\n\n      me.beforeSetDimensions();\n      me.setDimensions();\n      me.afterSetDimensions(); // Labels\n\n      me.beforeBuildLabels();\n      me.buildLabels();\n      me.afterBuildLabels(); // Fit\n\n      me.beforeFit();\n      me.fit();\n      me.afterFit(); //\n\n      me.afterUpdate();\n      return me.minSize;\n    },\n    afterUpdate: noop$2,\n    //\n    beforeSetDimensions: noop$2,\n    setDimensions: function setDimensions() {\n      var me = this; // Set the unconstrained dimension before label rotation\n\n      if (me.isHorizontal()) {\n        // Reset position before calculating rotation\n        me.width = me.maxWidth;\n        me.left = 0;\n        me.right = me.width;\n      } else {\n        me.height = me.maxHeight; // Reset position before calculating rotation\n\n        me.top = 0;\n        me.bottom = me.height;\n      } // Reset padding\n\n\n      me.paddingLeft = 0;\n      me.paddingTop = 0;\n      me.paddingRight = 0;\n      me.paddingBottom = 0; // Reset minSize\n\n      me.minSize = {\n        width: 0,\n        height: 0\n      };\n    },\n    afterSetDimensions: noop$2,\n    //\n    beforeBuildLabels: noop$2,\n    buildLabels: noop$2,\n    afterBuildLabels: noop$2,\n    //\n    beforeFit: noop$2,\n    fit: function fit() {\n      var me = this;\n      var opts = me.options;\n      var minSize = me.minSize = {};\n      var isHorizontal = me.isHorizontal();\n      var lineCount, textSize;\n\n      if (!opts.display) {\n        me.width = minSize.width = me.height = minSize.height = 0;\n        return;\n      }\n\n      lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;\n      textSize = lineCount * helpers$1.options._parseFont(opts).lineHeight + opts.padding * 2;\n      me.width = minSize.width = isHorizontal ? me.maxWidth : textSize;\n      me.height = minSize.height = isHorizontal ? textSize : me.maxHeight;\n    },\n    afterFit: noop$2,\n    // Shared Methods\n    isHorizontal: function isHorizontal() {\n      var pos = this.options.position;\n      return pos === 'top' || pos === 'bottom';\n    },\n    // Actually draw the title block on the canvas\n    draw: function draw() {\n      var me = this;\n      var ctx = me.ctx;\n      var opts = me.options;\n\n      if (!opts.display) {\n        return;\n      }\n\n      var fontOpts = helpers$1.options._parseFont(opts);\n\n      var lineHeight = fontOpts.lineHeight;\n      var offset = lineHeight / 2 + opts.padding;\n      var rotation = 0;\n      var top = me.top;\n      var left = me.left;\n      var bottom = me.bottom;\n      var right = me.right;\n      var maxWidth, titleX, titleY;\n      ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour\n\n      ctx.font = fontOpts.string; // Horizontal\n\n      if (me.isHorizontal()) {\n        titleX = left + (right - left) / 2; // midpoint of the width\n\n        titleY = top + offset;\n        maxWidth = right - left;\n      } else {\n        titleX = opts.position === 'left' ? left + offset : right - offset;\n        titleY = top + (bottom - top) / 2;\n        maxWidth = bottom - top;\n        rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n      }\n\n      ctx.save();\n      ctx.translate(titleX, titleY);\n      ctx.rotate(rotation);\n      ctx.textAlign = 'center';\n      ctx.textBaseline = 'middle';\n      var text = opts.text;\n\n      if (helpers$1.isArray(text)) {\n        var y = 0;\n\n        for (var i = 0; i < text.length; ++i) {\n          ctx.fillText(text[i], 0, y, maxWidth);\n          y += lineHeight;\n        }\n      } else {\n        ctx.fillText(text, 0, 0, maxWidth);\n      }\n\n      ctx.restore();\n    }\n  });\n\n  function createNewTitleBlockAndAttach(chart, titleOpts) {\n    var title = new Title({\n      ctx: chart.ctx,\n      options: titleOpts,\n      chart: chart\n    });\n    core_layouts.configure(chart, title, titleOpts);\n    core_layouts.addBox(chart, title);\n    chart.titleBlock = title;\n  }\n\n  var plugin_title = {\n    id: 'title',\n\n    /**\r\n     * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\r\n     * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\r\n     * the plugin, which one will be re-exposed in the chart.js file.\r\n     * https://github.com/chartjs/Chart.js/pull/2640\r\n     * @private\r\n     */\n    _element: Title,\n    beforeInit: function beforeInit(chart) {\n      var titleOpts = chart.options.title;\n\n      if (titleOpts) {\n        createNewTitleBlockAndAttach(chart, titleOpts);\n      }\n    },\n    beforeUpdate: function beforeUpdate(chart) {\n      var titleOpts = chart.options.title;\n      var titleBlock = chart.titleBlock;\n\n      if (titleOpts) {\n        helpers$1.mergeIf(titleOpts, core_defaults.global.title);\n\n        if (titleBlock) {\n          core_layouts.configure(chart, titleBlock, titleOpts);\n          titleBlock.options = titleOpts;\n        } else {\n          createNewTitleBlockAndAttach(chart, titleOpts);\n        }\n      } else if (titleBlock) {\n        core_layouts.removeBox(chart, titleBlock);\n        delete chart.titleBlock;\n      }\n    }\n  };\n  var plugins = {};\n  var filler = plugin_filler;\n  var legend = plugin_legend;\n  var title = plugin_title;\n  plugins.filler = filler;\n  plugins.legend = legend;\n  plugins.title = title;\n  /**\r\n   * @namespace Chart\r\n   */\n\n  core_controller.helpers = helpers$1; // @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\n\n  core_helpers();\n  core_controller._adapters = core_adapters;\n  core_controller.Animation = core_animation;\n  core_controller.animationService = core_animations;\n  core_controller.controllers = controllers;\n  core_controller.DatasetController = core_datasetController;\n  core_controller.defaults = core_defaults;\n  core_controller.Element = core_element;\n  core_controller.elements = elements;\n  core_controller.Interaction = core_interaction;\n  core_controller.layouts = core_layouts;\n  core_controller.platform = platform;\n  core_controller.plugins = core_plugins;\n  core_controller.Scale = core_scale;\n  core_controller.scaleService = core_scaleService;\n  core_controller.Ticks = core_ticks;\n  core_controller.Tooltip = core_tooltip; // Register built-in scales\n\n  core_controller.helpers.each(scales, function (scale, type) {\n    core_controller.scaleService.registerScaleType(type, scale, scale._defaults);\n  }); // Load to register built-in adapters (as side effects)\n  // Loading built-in plugins\n\n  for (var k in plugins) {\n    if (plugins.hasOwnProperty(k)) {\n      core_controller.plugins.register(plugins[k]);\n    }\n  }\n\n  core_controller.platform.initialize();\n  var src = core_controller;\n\n  if (typeof window !== 'undefined') {\n    window.Chart = core_controller;\n  } // DEPRECATIONS\n\n  /**\r\n   * Provided for backward compatibility, not available anymore\r\n   * @namespace Chart.Chart\r\n   * @deprecated since version 2.8.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n\n  core_controller.Chart = core_controller;\n  /**\r\n   * Provided for backward compatibility, not available anymore\r\n   * @namespace Chart.Legend\r\n   * @deprecated since version 2.1.5\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  core_controller.Legend = plugins.legend._element;\n  /**\r\n   * Provided for backward compatibility, not available anymore\r\n   * @namespace Chart.Title\r\n   * @deprecated since version 2.1.5\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  core_controller.Title = plugins.title._element;\n  /**\r\n   * Provided for backward compatibility, use Chart.plugins instead\r\n   * @namespace Chart.pluginService\r\n   * @deprecated since version 2.1.5\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  core_controller.pluginService = core_controller.plugins;\n  /**\r\n   * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\r\n   * effect, instead simply create/register plugins via plain JavaScript objects.\r\n   * @interface Chart.PluginBase\r\n   * @deprecated since version 2.5.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  core_controller.PluginBase = core_controller.Element.extend({});\n  /**\r\n   * Provided for backward compatibility, use Chart.helpers.canvas instead.\r\n   * @namespace Chart.canvasHelpers\r\n   * @deprecated since version 2.6.0\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  core_controller.canvasHelpers = core_controller.helpers.canvas;\n  /**\r\n   * Provided for backward compatibility, use Chart.layouts instead.\r\n   * @namespace Chart.layoutService\r\n   * @deprecated since version 2.7.3\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  core_controller.layoutService = core_controller.layouts;\n  /**\r\n   * Provided for backward compatibility, not available anymore.\r\n   * @namespace Chart.LinearScaleBase\r\n   * @deprecated since version 2.8\r\n   * @todo remove at version 3\r\n   * @private\r\n   */\n\n  core_controller.LinearScaleBase = scale_linearbase;\n  /**\r\n   * Provided for backward compatibility, instead we should create a new Chart\r\n   * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`).\r\n   * @deprecated since version 2.8.0\r\n   * @todo remove at version 3\r\n   */\n\n  core_controller.helpers.each(['Bar', 'Bubble', 'Doughnut', 'Line', 'PolarArea', 'Radar', 'Scatter'], function (klass) {\n    core_controller[klass] = function (ctx, cfg) {\n      return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, {\n        type: klass.charAt(0).toLowerCase() + klass.slice(1)\n      }));\n    };\n  });\n  return src;\n});\n\n//# sourceURL=webpack://rup/./node_modules/chart.js/dist/Chart.js?");

/***/ }),

/***/ "./node_modules/core-js/es6/index.js":
/*!*******************************************!*\
  !*** ./node_modules/core-js/es6/index.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../modules/es6.symbol */ \"./node_modules/core-js/modules/es6.symbol.js\");\n\n__webpack_require__(/*! ../modules/es6.object.create */ \"./node_modules/core-js/modules/es6.object.create.js\");\n\n__webpack_require__(/*! ../modules/es6.object.define-property */ \"./node_modules/core-js/modules/es6.object.define-property.js\");\n\n__webpack_require__(/*! ../modules/es6.object.define-properties */ \"./node_modules/core-js/modules/es6.object.define-properties.js\");\n\n__webpack_require__(/*! ../modules/es6.object.get-own-property-descriptor */ \"./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js\");\n\n__webpack_require__(/*! ../modules/es6.object.get-prototype-of */ \"./node_modules/core-js/modules/es6.object.get-prototype-of.js\");\n\n__webpack_require__(/*! ../modules/es6.object.keys */ \"./node_modules/core-js/modules/es6.object.keys.js\");\n\n__webpack_require__(/*! ../modules/es6.object.get-own-property-names */ \"./node_modules/core-js/modules/es6.object.get-own-property-names.js\");\n\n__webpack_require__(/*! ../modules/es6.object.freeze */ \"./node_modules/core-js/modules/es6.object.freeze.js\");\n\n__webpack_require__(/*! ../modules/es6.object.seal */ \"./node_modules/core-js/modules/es6.object.seal.js\");\n\n__webpack_require__(/*! ../modules/es6.object.prevent-extensions */ \"./node_modules/core-js/modules/es6.object.prevent-extensions.js\");\n\n__webpack_require__(/*! ../modules/es6.object.is-frozen */ \"./node_modules/core-js/modules/es6.object.is-frozen.js\");\n\n__webpack_require__(/*! ../modules/es6.object.is-sealed */ \"./node_modules/core-js/modules/es6.object.is-sealed.js\");\n\n__webpack_require__(/*! ../modules/es6.object.is-extensible */ \"./node_modules/core-js/modules/es6.object.is-extensible.js\");\n\n__webpack_require__(/*! ../modules/es6.object.assign */ \"./node_modules/core-js/modules/es6.object.assign.js\");\n\n__webpack_require__(/*! ../modules/es6.object.is */ \"./node_modules/core-js/modules/es6.object.is.js\");\n\n__webpack_require__(/*! ../modules/es6.object.set-prototype-of */ \"./node_modules/core-js/modules/es6.object.set-prototype-of.js\");\n\n__webpack_require__(/*! ../modules/es6.object.to-string */ \"./node_modules/core-js/modules/es6.object.to-string.js\");\n\n__webpack_require__(/*! ../modules/es6.function.bind */ \"./node_modules/core-js/modules/es6.function.bind.js\");\n\n__webpack_require__(/*! ../modules/es6.function.name */ \"./node_modules/core-js/modules/es6.function.name.js\");\n\n__webpack_require__(/*! ../modules/es6.function.has-instance */ \"./node_modules/core-js/modules/es6.function.has-instance.js\");\n\n__webpack_require__(/*! ../modules/es6.parse-int */ \"./node_modules/core-js/modules/es6.parse-int.js\");\n\n__webpack_require__(/*! ../modules/es6.parse-float */ \"./node_modules/core-js/modules/es6.parse-float.js\");\n\n__webpack_require__(/*! ../modules/es6.number.constructor */ \"./node_modules/core-js/modules/es6.number.constructor.js\");\n\n__webpack_require__(/*! ../modules/es6.number.to-fixed */ \"./node_modules/core-js/modules/es6.number.to-fixed.js\");\n\n__webpack_require__(/*! ../modules/es6.number.to-precision */ \"./node_modules/core-js/modules/es6.number.to-precision.js\");\n\n__webpack_require__(/*! ../modules/es6.number.epsilon */ \"./node_modules/core-js/modules/es6.number.epsilon.js\");\n\n__webpack_require__(/*! ../modules/es6.number.is-finite */ \"./node_modules/core-js/modules/es6.number.is-finite.js\");\n\n__webpack_require__(/*! ../modules/es6.number.is-integer */ \"./node_modules/core-js/modules/es6.number.is-integer.js\");\n\n__webpack_require__(/*! ../modules/es6.number.is-nan */ \"./node_modules/core-js/modules/es6.number.is-nan.js\");\n\n__webpack_require__(/*! ../modules/es6.number.is-safe-integer */ \"./node_modules/core-js/modules/es6.number.is-safe-integer.js\");\n\n__webpack_require__(/*! ../modules/es6.number.max-safe-integer */ \"./node_modules/core-js/modules/es6.number.max-safe-integer.js\");\n\n__webpack_require__(/*! ../modules/es6.number.min-safe-integer */ \"./node_modules/core-js/modules/es6.number.min-safe-integer.js\");\n\n__webpack_require__(/*! ../modules/es6.number.parse-float */ \"./node_modules/core-js/modules/es6.number.parse-float.js\");\n\n__webpack_require__(/*! ../modules/es6.number.parse-int */ \"./node_modules/core-js/modules/es6.number.parse-int.js\");\n\n__webpack_require__(/*! ../modules/es6.math.acosh */ \"./node_modules/core-js/modules/es6.math.acosh.js\");\n\n__webpack_require__(/*! ../modules/es6.math.asinh */ \"./node_modules/core-js/modules/es6.math.asinh.js\");\n\n__webpack_require__(/*! ../modules/es6.math.atanh */ \"./node_modules/core-js/modules/es6.math.atanh.js\");\n\n__webpack_require__(/*! ../modules/es6.math.cbrt */ \"./node_modules/core-js/modules/es6.math.cbrt.js\");\n\n__webpack_require__(/*! ../modules/es6.math.clz32 */ \"./node_modules/core-js/modules/es6.math.clz32.js\");\n\n__webpack_require__(/*! ../modules/es6.math.cosh */ \"./node_modules/core-js/modules/es6.math.cosh.js\");\n\n__webpack_require__(/*! ../modules/es6.math.expm1 */ \"./node_modules/core-js/modules/es6.math.expm1.js\");\n\n__webpack_require__(/*! ../modules/es6.math.fround */ \"./node_modules/core-js/modules/es6.math.fround.js\");\n\n__webpack_require__(/*! ../modules/es6.math.hypot */ \"./node_modules/core-js/modules/es6.math.hypot.js\");\n\n__webpack_require__(/*! ../modules/es6.math.imul */ \"./node_modules/core-js/modules/es6.math.imul.js\");\n\n__webpack_require__(/*! ../modules/es6.math.log10 */ \"./node_modules/core-js/modules/es6.math.log10.js\");\n\n__webpack_require__(/*! ../modules/es6.math.log1p */ \"./node_modules/core-js/modules/es6.math.log1p.js\");\n\n__webpack_require__(/*! ../modules/es6.math.log2 */ \"./node_modules/core-js/modules/es6.math.log2.js\");\n\n__webpack_require__(/*! ../modules/es6.math.sign */ \"./node_modules/core-js/modules/es6.math.sign.js\");\n\n__webpack_require__(/*! ../modules/es6.math.sinh */ \"./node_modules/core-js/modules/es6.math.sinh.js\");\n\n__webpack_require__(/*! ../modules/es6.math.tanh */ \"./node_modules/core-js/modules/es6.math.tanh.js\");\n\n__webpack_require__(/*! ../modules/es6.math.trunc */ \"./node_modules/core-js/modules/es6.math.trunc.js\");\n\n__webpack_require__(/*! ../modules/es6.string.from-code-point */ \"./node_modules/core-js/modules/es6.string.from-code-point.js\");\n\n__webpack_require__(/*! ../modules/es6.string.raw */ \"./node_modules/core-js/modules/es6.string.raw.js\");\n\n__webpack_require__(/*! ../modules/es6.string.trim */ \"./node_modules/core-js/modules/es6.string.trim.js\");\n\n__webpack_require__(/*! ../modules/es6.string.iterator */ \"./node_modules/core-js/modules/es6.string.iterator.js\");\n\n__webpack_require__(/*! ../modules/es6.string.code-point-at */ \"./node_modules/core-js/modules/es6.string.code-point-at.js\");\n\n__webpack_require__(/*! ../modules/es6.string.ends-with */ \"./node_modules/core-js/modules/es6.string.ends-with.js\");\n\n__webpack_require__(/*! ../modules/es6.string.includes */ \"./node_modules/core-js/modules/es6.string.includes.js\");\n\n__webpack_require__(/*! ../modules/es6.string.repeat */ \"./node_modules/core-js/modules/es6.string.repeat.js\");\n\n__webpack_require__(/*! ../modules/es6.string.starts-with */ \"./node_modules/core-js/modules/es6.string.starts-with.js\");\n\n__webpack_require__(/*! ../modules/es6.string.anchor */ \"./node_modules/core-js/modules/es6.string.anchor.js\");\n\n__webpack_require__(/*! ../modules/es6.string.big */ \"./node_modules/core-js/modules/es6.string.big.js\");\n\n__webpack_require__(/*! ../modules/es6.string.blink */ \"./node_modules/core-js/modules/es6.string.blink.js\");\n\n__webpack_require__(/*! ../modules/es6.string.bold */ \"./node_modules/core-js/modules/es6.string.bold.js\");\n\n__webpack_require__(/*! ../modules/es6.string.fixed */ \"./node_modules/core-js/modules/es6.string.fixed.js\");\n\n__webpack_require__(/*! ../modules/es6.string.fontcolor */ \"./node_modules/core-js/modules/es6.string.fontcolor.js\");\n\n__webpack_require__(/*! ../modules/es6.string.fontsize */ \"./node_modules/core-js/modules/es6.string.fontsize.js\");\n\n__webpack_require__(/*! ../modules/es6.string.italics */ \"./node_modules/core-js/modules/es6.string.italics.js\");\n\n__webpack_require__(/*! ../modules/es6.string.link */ \"./node_modules/core-js/modules/es6.string.link.js\");\n\n__webpack_require__(/*! ../modules/es6.string.small */ \"./node_modules/core-js/modules/es6.string.small.js\");\n\n__webpack_require__(/*! ../modules/es6.string.strike */ \"./node_modules/core-js/modules/es6.string.strike.js\");\n\n__webpack_require__(/*! ../modules/es6.string.sub */ \"./node_modules/core-js/modules/es6.string.sub.js\");\n\n__webpack_require__(/*! ../modules/es6.string.sup */ \"./node_modules/core-js/modules/es6.string.sup.js\");\n\n__webpack_require__(/*! ../modules/es6.date.now */ \"./node_modules/core-js/modules/es6.date.now.js\");\n\n__webpack_require__(/*! ../modules/es6.date.to-json */ \"./node_modules/core-js/modules/es6.date.to-json.js\");\n\n__webpack_require__(/*! ../modules/es6.date.to-iso-string */ \"./node_modules/core-js/modules/es6.date.to-iso-string.js\");\n\n__webpack_require__(/*! ../modules/es6.date.to-string */ \"./node_modules/core-js/modules/es6.date.to-string.js\");\n\n__webpack_require__(/*! ../modules/es6.date.to-primitive */ \"./node_modules/core-js/modules/es6.date.to-primitive.js\");\n\n__webpack_require__(/*! ../modules/es6.array.is-array */ \"./node_modules/core-js/modules/es6.array.is-array.js\");\n\n__webpack_require__(/*! ../modules/es6.array.from */ \"./node_modules/core-js/modules/es6.array.from.js\");\n\n__webpack_require__(/*! ../modules/es6.array.of */ \"./node_modules/core-js/modules/es6.array.of.js\");\n\n__webpack_require__(/*! ../modules/es6.array.join */ \"./node_modules/core-js/modules/es6.array.join.js\");\n\n__webpack_require__(/*! ../modules/es6.array.slice */ \"./node_modules/core-js/modules/es6.array.slice.js\");\n\n__webpack_require__(/*! ../modules/es6.array.sort */ \"./node_modules/core-js/modules/es6.array.sort.js\");\n\n__webpack_require__(/*! ../modules/es6.array.for-each */ \"./node_modules/core-js/modules/es6.array.for-each.js\");\n\n__webpack_require__(/*! ../modules/es6.array.map */ \"./node_modules/core-js/modules/es6.array.map.js\");\n\n__webpack_require__(/*! ../modules/es6.array.filter */ \"./node_modules/core-js/modules/es6.array.filter.js\");\n\n__webpack_require__(/*! ../modules/es6.array.some */ \"./node_modules/core-js/modules/es6.array.some.js\");\n\n__webpack_require__(/*! ../modules/es6.array.every */ \"./node_modules/core-js/modules/es6.array.every.js\");\n\n__webpack_require__(/*! ../modules/es6.array.reduce */ \"./node_modules/core-js/modules/es6.array.reduce.js\");\n\n__webpack_require__(/*! ../modules/es6.array.reduce-right */ \"./node_modules/core-js/modules/es6.array.reduce-right.js\");\n\n__webpack_require__(/*! ../modules/es6.array.index-of */ \"./node_modules/core-js/modules/es6.array.index-of.js\");\n\n__webpack_require__(/*! ../modules/es6.array.last-index-of */ \"./node_modules/core-js/modules/es6.array.last-index-of.js\");\n\n__webpack_require__(/*! ../modules/es6.array.copy-within */ \"./node_modules/core-js/modules/es6.array.copy-within.js\");\n\n__webpack_require__(/*! ../modules/es6.array.fill */ \"./node_modules/core-js/modules/es6.array.fill.js\");\n\n__webpack_require__(/*! ../modules/es6.array.find */ \"./node_modules/core-js/modules/es6.array.find.js\");\n\n__webpack_require__(/*! ../modules/es6.array.find-index */ \"./node_modules/core-js/modules/es6.array.find-index.js\");\n\n__webpack_require__(/*! ../modules/es6.array.species */ \"./node_modules/core-js/modules/es6.array.species.js\");\n\n__webpack_require__(/*! ../modules/es6.array.iterator */ \"./node_modules/core-js/modules/es6.array.iterator.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.constructor */ \"./node_modules/core-js/modules/es6.regexp.constructor.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.exec */ \"./node_modules/core-js/modules/es6.regexp.exec.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.to-string */ \"./node_modules/core-js/modules/es6.regexp.to-string.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.flags */ \"./node_modules/core-js/modules/es6.regexp.flags.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.match */ \"./node_modules/core-js/modules/es6.regexp.match.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.replace */ \"./node_modules/core-js/modules/es6.regexp.replace.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.search */ \"./node_modules/core-js/modules/es6.regexp.search.js\");\n\n__webpack_require__(/*! ../modules/es6.regexp.split */ \"./node_modules/core-js/modules/es6.regexp.split.js\");\n\n__webpack_require__(/*! ../modules/es6.promise */ \"./node_modules/core-js/modules/es6.promise.js\");\n\n__webpack_require__(/*! ../modules/es6.map */ \"./node_modules/core-js/modules/es6.map.js\");\n\n__webpack_require__(/*! ../modules/es6.set */ \"./node_modules/core-js/modules/es6.set.js\");\n\n__webpack_require__(/*! ../modules/es6.weak-map */ \"./node_modules/core-js/modules/es6.weak-map.js\");\n\n__webpack_require__(/*! ../modules/es6.weak-set */ \"./node_modules/core-js/modules/es6.weak-set.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.array-buffer */ \"./node_modules/core-js/modules/es6.typed.array-buffer.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.data-view */ \"./node_modules/core-js/modules/es6.typed.data-view.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.int8-array */ \"./node_modules/core-js/modules/es6.typed.int8-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.uint8-array */ \"./node_modules/core-js/modules/es6.typed.uint8-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.uint8-clamped-array */ \"./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.int16-array */ \"./node_modules/core-js/modules/es6.typed.int16-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.uint16-array */ \"./node_modules/core-js/modules/es6.typed.uint16-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.int32-array */ \"./node_modules/core-js/modules/es6.typed.int32-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.uint32-array */ \"./node_modules/core-js/modules/es6.typed.uint32-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.float32-array */ \"./node_modules/core-js/modules/es6.typed.float32-array.js\");\n\n__webpack_require__(/*! ../modules/es6.typed.float64-array */ \"./node_modules/core-js/modules/es6.typed.float64-array.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.apply */ \"./node_modules/core-js/modules/es6.reflect.apply.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.construct */ \"./node_modules/core-js/modules/es6.reflect.construct.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.define-property */ \"./node_modules/core-js/modules/es6.reflect.define-property.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.delete-property */ \"./node_modules/core-js/modules/es6.reflect.delete-property.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.enumerate */ \"./node_modules/core-js/modules/es6.reflect.enumerate.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.get */ \"./node_modules/core-js/modules/es6.reflect.get.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.get-own-property-descriptor */ \"./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.get-prototype-of */ \"./node_modules/core-js/modules/es6.reflect.get-prototype-of.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.has */ \"./node_modules/core-js/modules/es6.reflect.has.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.is-extensible */ \"./node_modules/core-js/modules/es6.reflect.is-extensible.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.own-keys */ \"./node_modules/core-js/modules/es6.reflect.own-keys.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.prevent-extensions */ \"./node_modules/core-js/modules/es6.reflect.prevent-extensions.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.set */ \"./node_modules/core-js/modules/es6.reflect.set.js\");\n\n__webpack_require__(/*! ../modules/es6.reflect.set-prototype-of */ \"./node_modules/core-js/modules/es6.reflect.set-prototype-of.js\");\n\nmodule.exports = __webpack_require__(/*! ../modules/_core */ \"./node_modules/core-js/modules/_core.js\");\n\n//# sourceURL=webpack://rup/./node_modules/core-js/es6/index.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/array/flat-map.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/fn/array/flat-map.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.array.flat-map */ \"./node_modules/core-js/modules/es7.array.flat-map.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").Array.flatMap;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/array/flat-map.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/array/includes.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/fn/array/includes.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.array.includes */ \"./node_modules/core-js/modules/es7.array.includes.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").Array.includes;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/array/includes.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/object/entries.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/fn/object/entries.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.object.entries */ \"./node_modules/core-js/modules/es7.object.entries.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").Object.entries;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/object/entries.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/object/get-own-property-descriptors.js":
/*!************************************************************************!*\
  !*** ./node_modules/core-js/fn/object/get-own-property-descriptors.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.object.get-own-property-descriptors */ \"./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").Object.getOwnPropertyDescriptors;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/object/get-own-property-descriptors.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/object/values.js":
/*!**************************************************!*\
  !*** ./node_modules/core-js/fn/object/values.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.object.values */ \"./node_modules/core-js/modules/es7.object.values.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").Object.values;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/object/values.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/promise/finally.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/fn/promise/finally.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n__webpack_require__(/*! ../../modules/es6.promise */ \"./node_modules/core-js/modules/es6.promise.js\");\n\n__webpack_require__(/*! ../../modules/es7.promise.finally */ \"./node_modules/core-js/modules/es7.promise.finally.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").Promise['finally'];\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/promise/finally.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/string/pad-end.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/fn/string/pad-end.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.string.pad-end */ \"./node_modules/core-js/modules/es7.string.pad-end.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").String.padEnd;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/string/pad-end.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/string/pad-start.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/fn/string/pad-start.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.string.pad-start */ \"./node_modules/core-js/modules/es7.string.pad-start.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").String.padStart;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/string/pad-start.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/string/trim-end.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/fn/string/trim-end.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.string.trim-right */ \"./node_modules/core-js/modules/es7.string.trim-right.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").String.trimRight;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/string/trim-end.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/string/trim-start.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/fn/string/trim-start.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.string.trim-left */ \"./node_modules/core-js/modules/es7.string.trim-left.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_core */ \"./node_modules/core-js/modules/_core.js\").String.trimLeft;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/string/trim-start.js?");

/***/ }),

/***/ "./node_modules/core-js/fn/symbol/async-iterator.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/fn/symbol/async-iterator.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../../modules/es7.symbol.async-iterator */ \"./node_modules/core-js/modules/es7.symbol.async-iterator.js\");\n\nmodule.exports = __webpack_require__(/*! ../../modules/_wks-ext */ \"./node_modules/core-js/modules/_wks-ext.js\").f('asyncIterator');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/fn/symbol/async-iterator.js?");

/***/ }),

/***/ "./node_modules/core-js/library/fn/global.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/library/fn/global.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../modules/es7.global */ \"./node_modules/core-js/library/modules/es7.global.js\");\n\nmodule.exports = __webpack_require__(/*! ../modules/_core */ \"./node_modules/core-js/library/modules/_core.js\").global;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/fn/global.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_a-function.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_a-function.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_a-function.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_an-object.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_an-object.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/library/modules/_is-object.js\");\n\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_an-object.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_core.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/library/modules/_core.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var core = module.exports = {\n  version: '2.6.12'\n};\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_core.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_ctx.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/library/modules/_ctx.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// optional / simple context binding\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/library/modules/_a-function.js\");\n\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n\n  switch (length) {\n    case 1:\n      return function (a) {\n        return fn.call(that, a);\n      };\n\n    case 2:\n      return function (a, b) {\n        return fn.call(that, a, b);\n      };\n\n    case 3:\n      return function (a, b, c) {\n        return fn.call(that, a, b, c);\n      };\n  }\n\n  return function\n    /* ...args */\n  () {\n    return fn.apply(that, arguments);\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_ctx.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_descriptors.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_descriptors.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/library/modules/_fails.js\")(function () {\n  return Object.defineProperty({}, 'a', {\n    get: function get() {\n      return 7;\n    }\n  }).a != 7;\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_descriptors.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_dom-create.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_dom-create.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/library/modules/_is-object.js\");\n\nvar document = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/library/modules/_global.js\").document; // typeof document.createElement is 'object' in old IE\n\n\nvar is = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_dom-create.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_export.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/library/modules/_export.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/library/modules/_global.js\");\n\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/library/modules/_core.js\");\n\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/library/modules/_ctx.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/library/modules/_hide.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/library/modules/_has.js\");\n\nvar PROTOTYPE = 'prototype';\n\nvar $export = function $export(type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var IS_WRAP = type & $export.W;\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE];\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n  var key, own, out;\n  if (IS_GLOBAL) source = name;\n\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    if (own && has(exports, key)) continue; // export native or passed\n\n    out = own ? target[key] : source[key]; // prevent global pollution for namespaces\n\n    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] // bind timers to global for call from export context\n    : IS_BIND && own ? ctx(out, global) // wrap global constructors for prevent change them in library\n    : IS_WRAP && target[key] == out ? function (C) {\n      var F = function F(a, b, c) {\n        if (this instanceof C) {\n          switch (arguments.length) {\n            case 0:\n              return new C();\n\n            case 1:\n              return new C(a);\n\n            case 2:\n              return new C(a, b);\n          }\n\n          return new C(a, b, c);\n        }\n\n        return C.apply(this, arguments);\n      };\n\n      F[PROTOTYPE] = C[PROTOTYPE];\n      return F; // make static versions for prototype methods\n    }(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n\n    if (IS_PROTO) {\n      (exports.virtual || (exports.virtual = {}))[key] = out; // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n\n      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n    }\n  }\n}; // type bitmap\n\n\n$export.F = 1; // forced\n\n$export.G = 2; // global\n\n$export.S = 4; // static\n\n$export.P = 8; // proto\n\n$export.B = 16; // bind\n\n$export.W = 32; // wrap\n\n$export.U = 64; // safe\n\n$export.R = 128; // real proto method for `library`\n\nmodule.exports = $export;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_export.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_fails.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/library/modules/_fails.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_fails.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_global.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/library/modules/_global.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func\n: Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_global.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_has.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/library/modules/_has.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_has.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_hide.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/library/modules/_hide.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/library/modules/_object-dp.js\");\n\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/library/modules/_property-desc.js\");\n\nmodule.exports = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/library/modules/_descriptors.js\") ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_hide.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_ie8-dom-define.js":
/*!*****************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_ie8-dom-define.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = !__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/library/modules/_descriptors.js\") && !__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/library/modules/_fails.js\")(function () {\n  return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ \"./node_modules/core-js/library/modules/_dom-create.js\")('div'), 'a', {\n    get: function get() {\n      return 7;\n    }\n  }).a != 7;\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_ie8-dom-define.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_is-object.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_is-object.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nmodule.exports = function (it) {\n  return _typeof(it) === 'object' ? it !== null : typeof it === 'function';\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_is-object.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_object-dp.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_object-dp.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/library/modules/_an-object.js\");\n\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ \"./node_modules/core-js/library/modules/_ie8-dom-define.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/library/modules/_to-primitive.js\");\n\nvar dP = Object.defineProperty;\nexports.f = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/library/modules/_descriptors.js\") ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) {\n    /* empty */\n  }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_object-dp.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_property-desc.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_property-desc.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_property-desc.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/_to-primitive.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/library/modules/_to-primitive.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/library/modules/_is-object.js\"); // instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\n\n\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/_to-primitive.js?");

/***/ }),

/***/ "./node_modules/core-js/library/modules/es7.global.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/library/modules/es7.global.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// https://github.com/tc39/proposal-global\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/library/modules/_export.js\");\n\n$export($export.G, {\n  global: __webpack_require__(/*! ./_global */ \"./node_modules/core-js/library/modules/_global.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/library/modules/es7.global.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_a-function.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_a-function.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_a-function.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_a-number-value.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/_a-number-value.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\");\n\nmodule.exports = function (it, msg) {\n  if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n  return +it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_a-number-value.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_add-to-unscopables.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/_add-to-unscopables.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('unscopables');\n\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\")(ArrayProto, UNSCOPABLES, {});\n\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_add-to-unscopables.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_advance-string-index.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/_advance-string-index.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar at = __webpack_require__(/*! ./_string-at */ \"./node_modules/core-js/modules/_string-at.js\")(true); // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\n\n\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? at(S, index).length : 1);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_advance-string-index.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_an-instance.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_an-instance.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {\n    throw TypeError(name + ': incorrect invocation!');\n  }\n\n  return it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_an-instance.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_an-object.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_an-object.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_an-object.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_array-copy-within.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/_array-copy-within.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/core-js/modules/_to-absolute-index.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nmodule.exports = [].copyWithin || function copyWithin(target\n/* = 0 */\n, start\n/* = 0, end = @length */\n) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];else delete O[to];\n    to += inc;\n    from += inc;\n  }\n\n  return O;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_array-copy-within.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_array-fill.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_array-fill.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/core-js/modules/_to-absolute-index.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nmodule.exports = function fill(value\n/* , start = 0, end = @length */\n) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n\n  while (endPos > index) {\n    O[index++] = value;\n  }\n\n  return O;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_array-fill.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_array-includes.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/_array-includes.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/core-js/modules/_to-absolute-index.js\");\n\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value; // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++]; // eslint-disable-next-line no-self-compare\n\n      if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not\n    } else for (; length > index; index++) {\n      if (IS_INCLUDES || index in O) {\n        if (O[index] === el) return IS_INCLUDES || index || 0;\n      }\n    }\n    return !IS_INCLUDES && -1;\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_array-includes.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_array-methods.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_array-methods.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/core-js/modules/_iobject.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar asc = __webpack_require__(/*! ./_array-species-create */ \"./node_modules/core-js/modules/_array-species-create.js\");\n\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n\n    for (; length > index; index++) {\n      if (NO_HOLES || index in self) {\n        val = self[index];\n        res = f(val, index, O);\n\n        if (TYPE) {\n          if (IS_MAP) result[index] = res; // map\n          else if (res) switch (TYPE) {\n            case 3:\n              return true;\n            // some\n\n            case 5:\n              return val;\n            // find\n\n            case 6:\n              return index;\n            // findIndex\n\n            case 2:\n              result.push(val);\n            // filter\n          } else if (IS_EVERY) return false; // every\n        }\n      }\n    }\n\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_array-methods.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_array-reduce.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/_array-reduce.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/core-js/modules/_iobject.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nmodule.exports = function (that, callbackfn, aLen, memo, isRight) {\n  aFunction(callbackfn);\n  var O = toObject(that);\n  var self = IObject(O);\n  var length = toLength(O.length);\n  var index = isRight ? length - 1 : 0;\n  var i = isRight ? -1 : 1;\n  if (aLen < 2) for (;;) {\n    if (index in self) {\n      memo = self[index];\n      index += i;\n      break;\n    }\n\n    index += i;\n\n    if (isRight ? index < 0 : length <= index) {\n      throw TypeError('Reduce of empty array with no initial value');\n    }\n  }\n\n  for (; isRight ? index >= 0 : length > index; index += i) {\n    if (index in self) {\n      memo = callbackfn(memo, self[index], index, O);\n    }\n  }\n\n  return memo;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_array-reduce.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_array-species-constructor.js":
/*!********************************************************************!*\
  !*** ./node_modules/core-js/modules/_array-species-constructor.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar isArray = __webpack_require__(/*! ./_is-array */ \"./node_modules/core-js/modules/_is-array.js\");\n\nvar SPECIES = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('species');\n\nmodule.exports = function (original) {\n  var C;\n\n  if (isArray(original)) {\n    C = original.constructor; // cross-realm fallback\n\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  }\n\n  return C === undefined ? Array : C;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_array-species-constructor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_array-species-create.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/_array-species-create.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ \"./node_modules/core-js/modules/_array-species-constructor.js\");\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_array-species-create.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_bind.js":
/*!***********************************************!*\
  !*** ./node_modules/core-js/modules/_bind.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar invoke = __webpack_require__(/*! ./_invoke */ \"./node_modules/core-js/modules/_invoke.js\");\n\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function construct(F, len, args) {\n  if (!(len in factories)) {\n    for (var n = [], i = 0; i < len; i++) {\n      n[i] = 'a[' + i + ']';\n    } // eslint-disable-next-line no-new-func\n\n\n    factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n  }\n\n  return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that\n/* , ...args */\n) {\n  var fn = aFunction(this);\n  var partArgs = arraySlice.call(arguments, 1);\n\n  var bound = function\n    /* args... */\n  bound() {\n    var args = partArgs.concat(arraySlice.call(arguments));\n    return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n  };\n\n  if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n  return bound;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_bind.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_classof.js":
/*!**************************************************!*\
  !*** ./node_modules/core-js/modules/_classof.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\");\n\nvar TAG = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('toStringTag'); // ES3 wrong here\n\n\nvar ARG = cof(function () {\n  return arguments;\n}()) == 'Arguments'; // fallback for IE11 Script Access Denied error\n\nvar tryGet = function tryGet(it, key) {\n  try {\n    return it[key];\n  } catch (e) {\n    /* empty */\n  }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case\n  : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T // builtinTag case\n  : ARG ? cof(O) // ES3 arguments fallback\n  : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_classof.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_cof.js":
/*!**********************************************!*\
  !*** ./node_modules/core-js/modules/_cof.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_cof.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_collection-strong.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/_collection-strong.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nvar create = __webpack_require__(/*! ./_object-create */ \"./node_modules/core-js/modules/_object-create.js\");\n\nvar redefineAll = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/core-js/modules/_redefine-all.js\");\n\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/core-js/modules/_an-instance.js\");\n\nvar forOf = __webpack_require__(/*! ./_for-of */ \"./node_modules/core-js/modules/_for-of.js\");\n\nvar $iterDefine = __webpack_require__(/*! ./_iter-define */ \"./node_modules/core-js/modules/_iter-define.js\");\n\nvar step = __webpack_require__(/*! ./_iter-step */ \"./node_modules/core-js/modules/_iter-step.js\");\n\nvar setSpecies = __webpack_require__(/*! ./_set-species */ \"./node_modules/core-js/modules/_set-species.js\");\n\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\");\n\nvar fastKey = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\").fastKey;\n\nvar validate = __webpack_require__(/*! ./_validate-collection */ \"./node_modules/core-js/modules/_validate-collection.js\");\n\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function getEntry(that, key) {\n  // fast case\n  var index = fastKey(key);\n  var entry;\n  if (index !== 'F') return that._i[index]; // frozen object case\n\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME; // collection type\n\n      that._i = create(null); // index\n\n      that._f = undefined; // first entry\n\n      that._l = undefined; // last entry\n\n      that[SIZE] = 0; // size\n\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function _delete(key) {\n        var that = validate(this, NAME);\n        var entry = getEntry(that, key);\n\n        if (entry) {\n          var next = entry.n;\n          var prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        }\n\n        return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn\n      /* , that = undefined */\n      ) {\n        validate(this, NAME);\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this); // revert to the last existing entry\n\n          while (entry && entry.r) {\n            entry = entry.p;\n          }\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(validate(this, NAME), key);\n      }\n    });\n    if (DESCRIPTORS) dP(C.prototype, 'size', {\n      get: function get() {\n        return validate(this, NAME)[SIZE];\n      }\n    });\n    return C;\n  },\n  def: function def(that, key, value) {\n    var entry = getEntry(that, key);\n    var prev, index; // change existing entry\n\n    if (entry) {\n      entry.v = value; // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true),\n        // <- index\n        k: key,\n        // <- key\n        v: value,\n        // <- value\n        p: prev = that._l,\n        // <- previous entry\n        n: undefined,\n        // <- next entry\n        r: false // <- removed\n\n      };\n      if (!that._f) that._f = entry;\n      if (prev) prev.n = entry;\n      that[SIZE]++; // add to index\n\n      if (index !== 'F') that._i[index] = entry;\n    }\n\n    return that;\n  },\n  getEntry: getEntry,\n  setStrong: function setStrong(C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = validate(iterated, NAME); // target\n\n      this._k = kind; // kind\n\n      this._l = undefined; // previous\n    }, function () {\n      var that = this;\n      var kind = that._k;\n      var entry = that._l; // revert to the last existing entry\n\n      while (entry && entry.r) {\n        entry = entry.p;\n      } // get next entry\n\n\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      } // return step by kind\n\n\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2\n\n    setSpecies(NAME);\n  }\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_collection-strong.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_collection-weak.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/_collection-weak.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar redefineAll = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/core-js/modules/_redefine-all.js\");\n\nvar getWeak = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\").getWeak;\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/core-js/modules/_an-instance.js\");\n\nvar forOf = __webpack_require__(/*! ./_for-of */ \"./node_modules/core-js/modules/_for-of.js\");\n\nvar createArrayMethod = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\");\n\nvar $has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar validate = __webpack_require__(/*! ./_validate-collection */ \"./node_modules/core-js/modules/_validate-collection.js\");\n\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0; // fallback for uncaught frozen keys\n\nvar uncaughtFrozenStore = function uncaughtFrozenStore(that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function UncaughtFrozenStore() {\n  this.a = [];\n};\n\nvar findUncaughtFrozen = function findUncaughtFrozen(store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\n\nUncaughtFrozenStore.prototype = {\n  get: function get(key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function has(key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function set(key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;else this.a.push([key, value]);\n  },\n  'delete': function _delete(key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\nmodule.exports = {\n  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME; // collection type\n\n      that._i = id++; // collection id\n\n      that._l = undefined; // leak store for uncaught frozen objects\n\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function _delete(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function def(that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_collection-weak.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_collection.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_collection.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nvar redefineAll = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/core-js/modules/_redefine-all.js\");\n\nvar meta = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\");\n\nvar forOf = __webpack_require__(/*! ./_for-of */ \"./node_modules/core-js/modules/_for-of.js\");\n\nvar anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/core-js/modules/_an-instance.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar $iterDetect = __webpack_require__(/*! ./_iter-detect */ \"./node_modules/core-js/modules/_iter-detect.js\");\n\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/core-js/modules/_set-to-string-tag.js\");\n\nvar inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ \"./node_modules/core-js/modules/_inherit-if-required.js\");\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n\n  var fixMethod = function fixMethod(KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY, KEY == 'delete' ? function (a) {\n      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'has' ? function has(a) {\n      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'get' ? function get(a) {\n      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'add' ? function add(a) {\n      fn.call(this, a === 0 ? 0 : a);\n      return this;\n    } : function set(a, b) {\n      fn.call(this, a === 0 ? 0 : a, b);\n      return this;\n    });\n  };\n\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C(); // early implementations not supports chaining\n\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n\n    var THROWS_ON_PRIMITIVES = fails(function () {\n      instance.has(1);\n    }); // most early implementations doesn't supports iterables, most modern - not close it correctly\n\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) {\n      new C(iter);\n    }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n\n      while (index--) {\n        $instance[ADDER](index, index);\n      }\n\n      return !$instance.has(-0);\n    });\n\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method\n\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n  return C;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_collection.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_core.js":
/*!***********************************************!*\
  !*** ./node_modules/core-js/modules/_core.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var core = module.exports = {\n  version: '2.6.12'\n};\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_core.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_create-property.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/_create-property.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $defineProperty = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/modules/_property-desc.js\");\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_create-property.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_ctx.js":
/*!**********************************************!*\
  !*** ./node_modules/core-js/modules/_ctx.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// optional / simple context binding\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n\n  switch (length) {\n    case 1:\n      return function (a) {\n        return fn.call(that, a);\n      };\n\n    case 2:\n      return function (a, b) {\n        return fn.call(that, a, b);\n      };\n\n    case 3:\n      return function (a, b, c) {\n        return fn.call(that, a, b, c);\n      };\n  }\n\n  return function\n    /* ...args */\n  () {\n    return fn.apply(that, arguments);\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_ctx.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_date-to-iso-string.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/_date-to-iso-string.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar getTime = Date.prototype.getTime;\nvar $toISOString = Date.prototype.toISOString;\n\nvar lz = function lz(num) {\n  return num > 9 ? num : '0' + num;\n}; // PhantomJS / old WebKit has a broken implementations\n\n\nmodule.exports = fails(function () {\n  return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n  $toISOString.call(new Date(NaN));\n}) ? function toISOString() {\n  if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n  var d = this;\n  var y = d.getUTCFullYear();\n  var m = d.getUTCMilliseconds();\n  var s = y < 0 ? '-' : y > 9999 ? '+' : '';\n  return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n} : $toISOString;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_date-to-iso-string.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_date-to-primitive.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/_date-to-primitive.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\");\n\nvar NUMBER = 'number';\n\nmodule.exports = function (hint) {\n  if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');\n  return toPrimitive(anObject(this), hint != NUMBER);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_date-to-primitive.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_defined.js":
/*!**************************************************!*\
  !*** ./node_modules/core-js/modules/_defined.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_defined.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_descriptors.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_descriptors.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return Object.defineProperty({}, 'a', {\n    get: function get() {\n      return 7;\n    }\n  }).a != 7;\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_descriptors.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_dom-create.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_dom-create.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar document = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").document; // typeof document.createElement is 'object' in old IE\n\n\nvar is = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_dom-create.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_enum-bug-keys.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_enum-bug-keys.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// IE 8- don't enum bug keys\nmodule.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_enum-bug-keys.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_enum-keys.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_enum-keys.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/core-js/modules/_object-keys.js\");\n\nvar gOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/core-js/modules/_object-gops.js\");\n\nvar pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/core-js/modules/_object-pie.js\");\n\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n\n    while (symbols.length > i) {\n      if (isEnum.call(it, key = symbols[i++])) result.push(key);\n    }\n  }\n\n  return result;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_enum-keys.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_export.js":
/*!*************************************************!*\
  !*** ./node_modules/core-js/modules/_export.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar PROTOTYPE = 'prototype';\n\nvar $export = function $export(type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined; // export native or passed\n\n    out = (own ? target : source)[key]; // bind timers to global for call from export context\n\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // extend global\n\n    if (target) redefine(target, key, out, type & $export.U); // export\n\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\n\nglobal.core = core; // type bitmap\n\n$export.F = 1; // forced\n\n$export.G = 2; // global\n\n$export.S = 4; // static\n\n$export.P = 8; // proto\n\n$export.B = 16; // bind\n\n$export.W = 32; // wrap\n\n$export.U = 64; // safe\n\n$export.R = 128; // real proto method for `library`\n\nmodule.exports = $export;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_export.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_fails-is-regexp.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/_fails-is-regexp.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var MATCH = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('match');\n\nmodule.exports = function (KEY) {\n  var re = /./;\n\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) {\n      /* empty */\n    }\n  }\n\n  return true;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_fails-is-regexp.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_fails.js":
/*!************************************************!*\
  !*** ./node_modules/core-js/modules/_fails.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_fails.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_fix-re-wks.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_fix-re-wks.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n__webpack_require__(/*! ./es6.regexp.exec */ \"./node_modules/core-js/modules/es6.regexp.exec.js\");\n\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nvar wks = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\");\n\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/core-js/modules/_regexp-exec.js\");\n\nvar SPECIES = wks('species');\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  // #replace needs built-in support for named groups.\n  // #match works fine because it just return the exec results, even if it has\n  // a \"grops\" property.\n  var re = /./;\n\n  re.exec = function () {\n    var result = [];\n    result.groups = {\n      a: '7'\n    };\n    return result;\n  };\n\n  return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = function () {\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n  var re = /(?:)/;\n  var originalExec = re.exec;\n\n  re.exec = function () {\n    return originalExec.apply(this, arguments);\n  };\n\n  var result = 'ab'.split(re);\n  return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n}();\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n\n    O[SYMBOL] = function () {\n      return 7;\n    };\n\n    return ''[KEY](O) != 7;\n  });\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n\n    re.exec = function () {\n      execCalled = true;\n      return null;\n    };\n\n    if (KEY === 'split') {\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n\n      re.constructor[SPECIES] = function () {\n        return re;\n      };\n    }\n\n    re[SYMBOL]('');\n    return !execCalled;\n  }) : undefined;\n\n  if (!DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS || KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var fns = exec(defined, SYMBOL, ''[KEY], function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n      if (regexp.exec === regexpExec) {\n        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n          // The native String method already delegates to @@method (this\n          // polyfilled function), leasing to infinite recursion.\n          // We avoid it by directly calling the native @@method method.\n          return {\n            done: true,\n            value: nativeRegExpMethod.call(regexp, str, arg2)\n          };\n        }\n\n        return {\n          done: true,\n          value: nativeMethod.call(str, regexp, arg2)\n        };\n      }\n\n      return {\n        done: false\n      };\n    });\n    var strfn = fns[0];\n    var rxfn = fns[1];\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n    // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n    ? function (string, arg) {\n      return rxfn.call(string, this, arg);\n    } // 21.2.5.6 RegExp.prototype[@@match](string)\n    // 21.2.5.9 RegExp.prototype[@@search](string)\n    : function (string) {\n      return rxfn.call(string, this);\n    });\n  }\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_fix-re-wks.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_flags.js":
/*!************************************************!*\
  !*** ./node_modules/core-js/modules/_flags.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 21.2.5.3 get RegExp.prototype.flags\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_flags.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_flatten-into-array.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/_flatten-into-array.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\n\nvar isArray = __webpack_require__(/*! ./_is-array */ \"./node_modules/core-js/modules/_is-array.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar IS_CONCAT_SPREADABLE = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('isConcatSpreadable');\n\nfunction flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {\n  var targetIndex = start;\n  var sourceIndex = 0;\n  var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;\n  var element, spreadable;\n\n  while (sourceIndex < sourceLen) {\n    if (sourceIndex in source) {\n      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n      spreadable = false;\n\n      if (isObject(element)) {\n        spreadable = element[IS_CONCAT_SPREADABLE];\n        spreadable = spreadable !== undefined ? !!spreadable : isArray(element);\n      }\n\n      if (spreadable && depth > 0) {\n        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n      } else {\n        if (targetIndex >= 0x1fffffffffffff) throw TypeError();\n        target[targetIndex] = element;\n      }\n\n      targetIndex++;\n    }\n\n    sourceIndex++;\n  }\n\n  return targetIndex;\n}\n\nmodule.exports = flattenIntoArray;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_flatten-into-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_for-of.js":
/*!*************************************************!*\
  !*** ./node_modules/core-js/modules/_for-of.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar call = __webpack_require__(/*! ./_iter-call */ \"./node_modules/core-js/modules/_iter-call.js\");\n\nvar isArrayIter = __webpack_require__(/*! ./_is-array-iter */ \"./node_modules/core-js/modules/_is-array-iter.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ \"./node_modules/core-js/modules/core.get-iterator-method.js\");\n\nvar BREAK = {};\nvar RETURN = {};\n\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () {\n    return iterable;\n  } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator\n\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\n\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_for-of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_function-to-string.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/_function-to-string.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__(/*! ./_shared */ \"./node_modules/core-js/modules/_shared.js\")('native-function-to-string', Function.toString);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_function-to-string.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_global.js":
/*!*************************************************!*\
  !*** ./node_modules/core-js/modules/_global.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func\n: Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_global.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_has.js":
/*!**********************************************!*\
  !*** ./node_modules/core-js/modules/_has.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_has.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_hide.js":
/*!***********************************************!*\
  !*** ./node_modules/core-js/modules/_hide.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/modules/_property-desc.js\");\n\nmodule.exports = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_hide.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_html.js":
/*!***********************************************!*\
  !*** ./node_modules/core-js/modules/_html.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var document = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").document;\n\nmodule.exports = document && document.documentElement;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_html.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_ie8-dom-define.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/_ie8-dom-define.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = !__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") && !__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ \"./node_modules/core-js/modules/_dom-create.js\")('div'), 'a', {\n    get: function get() {\n      return 7;\n    }\n  }).a != 7;\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_ie8-dom-define.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_inherit-if-required.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/_inherit-if-required.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar setPrototypeOf = __webpack_require__(/*! ./_set-proto */ \"./node_modules/core-js/modules/_set-proto.js\").set;\n\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  }\n\n  return that;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_inherit-if-required.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_invoke.js":
/*!*************************************************!*\
  !*** ./node_modules/core-js/modules/_invoke.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n\n  switch (args.length) {\n    case 0:\n      return un ? fn() : fn.call(that);\n\n    case 1:\n      return un ? fn(args[0]) : fn.call(that, args[0]);\n\n    case 2:\n      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);\n\n    case 3:\n      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);\n\n    case 4:\n      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);\n  }\n\n  return fn.apply(that, args);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_invoke.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_iobject.js":
/*!**************************************************!*\
  !*** ./node_modules/core-js/modules/_iobject.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\"); // eslint-disable-next-line no-prototype-builtins\n\n\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_iobject.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_is-array-iter.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_is-array-iter.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// check on default Array iterator\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/core-js/modules/_iterators.js\");\n\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('iterator');\n\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_is-array-iter.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_is-array.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/modules/_is-array.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\");\n\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_is-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_is-integer.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_is-integer.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar floor = Math.floor;\n\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_is-integer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_is-object.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_is-object.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nmodule.exports = function (it) {\n  return _typeof(it) === 'object' ? it !== null : typeof it === 'function';\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_is-object.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_is-regexp.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_is-regexp.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\");\n\nvar MATCH = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('match');\n\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_is-regexp.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_iter-call.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_iter-call.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_iter-call.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_iter-create.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_iter-create.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar create = __webpack_require__(/*! ./_object-create */ \"./node_modules/core-js/modules/_object-create.js\");\n\nvar descriptor = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/modules/_property-desc.js\");\n\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/core-js/modules/_set-to-string-tag.js\");\n\nvar IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\n__webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\")(IteratorPrototype, __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('iterator'), function () {\n  return this;\n});\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, {\n    next: descriptor(1, next)\n  });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_iter-create.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_iter-define.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_iter-define.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/core-js/modules/_library.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/core-js/modules/_iterators.js\");\n\nvar $iterCreate = __webpack_require__(/*! ./_iter-create */ \"./node_modules/core-js/modules/_iter-create.js\");\n\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/core-js/modules/_set-to-string-tag.js\");\n\nvar getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/core-js/modules/_object-gpo.js\");\n\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('iterator');\n\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\n\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function returnThis() {\n  return this;\n};\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n\n  var getMethod = function getMethod(kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n\n    switch (kind) {\n      case KEYS:\n        return function keys() {\n          return new Constructor(this, kind);\n        };\n\n      case VALUES:\n        return function values() {\n          return new Constructor(this, kind);\n        };\n    }\n\n    return function entries() {\n      return new Constructor(this, kind);\n    };\n  };\n\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype; // Fix native\n\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines\n\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  } // fix Array#{values, @@iterator}.name in V8 / FF\n\n\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n\n    $default = function values() {\n      return $native.call(this);\n    };\n  } // Define iterator\n\n\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  } // Plug for library\n\n\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n\n  return methods;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_iter-define.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_iter-detect.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_iter-detect.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('iterator');\n\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n\n  riter['return'] = function () {\n    SAFE_CLOSING = true;\n  }; // eslint-disable-next-line no-throw-literal\n\n\n  Array.from(riter, function () {\n    throw 2;\n  });\n} catch (e) {\n  /* empty */\n}\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n\n    iter.next = function () {\n      return {\n        done: safe = true\n      };\n    };\n\n    arr[ITERATOR] = function () {\n      return iter;\n    };\n\n    exec(arr);\n  } catch (e) {\n    /* empty */\n  }\n\n  return safe;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_iter-detect.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_iter-step.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_iter-step.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (done, value) {\n  return {\n    value: value,\n    done: !!done\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_iter-step.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_iterators.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_iterators.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = {};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_iterators.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_library.js":
/*!**************************************************!*\
  !*** ./node_modules/core-js/modules/_library.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = false;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_library.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_math-expm1.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_math-expm1.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = !$expm1 // Old FF bug\n|| $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 // Tor Browser bug\n|| $expm1(-2e-17) != -2e-17 ? function expm1(x) {\n  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_math-expm1.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_math-fround.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_math-fround.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.16 Math.fround(x)\nvar sign = __webpack_require__(/*! ./_math-sign */ \"./node_modules/core-js/modules/_math-sign.js\");\n\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function roundTiesToEven(n) {\n  return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n  var $abs = Math.abs(x);\n  var $sign = sign(x);\n  var a, result;\n  if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n  a = (1 + EPSILON32 / EPSILON) * $abs;\n  result = a - (a - $abs); // eslint-disable-next-line no-self-compare\n\n  if (result > MAX32 || result != result) return $sign * Infinity;\n  return $sign * result;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_math-fround.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_math-log1p.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_math-log1p.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_math-log1p.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_math-sign.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_math-sign.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n  // eslint-disable-next-line no-self-compare\n  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_math-sign.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_meta.js":
/*!***********************************************!*\
  !*** ./node_modules/core-js/modules/_meta.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nvar META = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modules/_uid.js\")('meta');\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar setDesc = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\n\nvar FREEZE = !__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\n\nvar setMeta = function setMeta(it) {\n  setDesc(it, META, {\n    value: {\n      i: 'O' + ++id,\n      // object ID\n      w: {} // weak collections IDs\n\n    }\n  });\n};\n\nvar fastKey = function fastKey(it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return _typeof(it) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F'; // not necessary to add metadata\n\n    if (!create) return 'E'; // add missing metadata\n\n    setMeta(it); // return object ID\n  }\n\n  return it[META].i;\n};\n\nvar getWeak = function getWeak(it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true; // not necessary to add metadata\n\n    if (!create) return false; // add missing metadata\n\n    setMeta(it); // return hash weak collections IDs\n  }\n\n  return it[META].w;\n}; // add metadata on freeze-family methods calling\n\n\nvar onFreeze = function onFreeze(it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\n\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_meta.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_microtask.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_microtask.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar macrotask = __webpack_require__(/*! ./_task */ \"./node_modules/core-js/modules/_task.js\").set;\n\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\")(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function flush() {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();else last = undefined;\n        throw e;\n      }\n    }\n\n    last = undefined;\n    if (parent) parent.enter();\n  }; // Node.js\n\n\n  if (isNode) {\n    notify = function notify() {\n      process.nextTick(flush);\n    }; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, {\n      characterData: true\n    }); // eslint-disable-line no-new\n\n    notify = function notify() {\n      node.data = toggle = !toggle;\n    }; // environments with maybe non-completely correct, but existent Promise\n\n  } else if (Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    var promise = Promise.resolve(undefined);\n\n    notify = function notify() {\n      promise.then(flush);\n    }; // for other environments - macrotask based on:\n    // - setImmediate\n    // - MessageChannel\n    // - window.postMessag\n    // - onreadystatechange\n    // - setTimeout\n\n  } else {\n    notify = function notify() {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = {\n      fn: fn,\n      next: undefined\n    };\n    if (last) last.next = task;\n\n    if (!head) {\n      head = task;\n      notify();\n    }\n\n    last = task;\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_microtask.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_new-promise-capability.js":
/*!*****************************************************************!*\
  !*** ./node_modules/core-js/modules/_new-promise-capability.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 25.4.1.5 NewPromiseCapability(C)\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_new-promise-capability.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-assign.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_object-assign.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 19.1.2.1 Object.assign(target, source, ...)\n\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\");\n\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/core-js/modules/_object-keys.js\");\n\nvar gOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/core-js/modules/_object-gops.js\");\n\nvar pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/core-js/modules/_object-pie.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/core-js/modules/_iobject.js\");\n\nvar $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug)\n\nmodule.exports = !$assign || __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  var A = {};\n  var B = {}; // eslint-disable-next-line no-undef\n\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) {\n    B[k] = k;\n  });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) {\n  // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n    }\n  }\n\n  return T;\n} : $assign;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-assign.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-create.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_object-create.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar dPs = __webpack_require__(/*! ./_object-dps */ \"./node_modules/core-js/modules/_object-dps.js\");\n\nvar enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/core-js/modules/_enum-bug-keys.js\");\n\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/core-js/modules/_shared-key.js\")('IE_PROTO');\n\nvar Empty = function Empty() {\n  /* empty */\n};\n\nvar PROTOTYPE = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype\n\nvar _createDict = function createDict() {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(/*! ./_dom-create */ \"./node_modules/core-js/modules/_dom-create.js\")('iframe');\n\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n\n  __webpack_require__(/*! ./_html */ \"./node_modules/core-js/modules/_html.js\").appendChild(iframe);\n\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  _createDict = iframeDocument.F;\n\n  while (i--) {\n    delete _createDict[PROTOTYPE][enumBugKeys[i]];\n  }\n\n  return _createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null; // add \"__proto__\" for Object.getPrototypeOf polyfill\n\n    result[IE_PROTO] = O;\n  } else result = _createDict();\n\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-create.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-dp.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_object-dp.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ \"./node_modules/core-js/modules/_ie8-dom-define.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\");\n\nvar dP = Object.defineProperty;\nexports.f = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) {\n    /* empty */\n  }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-dp.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-dps.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_object-dps.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/core-js/modules/_object-keys.js\");\n\nmodule.exports = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n\n  while (length > i) {\n    dP.f(O, P = keys[i++], Properties[P]);\n  }\n\n  return O;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-dps.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-gopd.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_object-gopd.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/core-js/modules/_object-pie.js\");\n\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/modules/_property-desc.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ \"./node_modules/core-js/modules/_ie8-dom-define.js\");\n\nvar gOPD = Object.getOwnPropertyDescriptor;\nexports.f = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) {\n    /* empty */\n  }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-gopd.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-gopn-ext.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/_object-gopn-ext.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/core-js/modules/_object-gopn.js\").f;\n\nvar toString = {}.toString;\nvar windowNames = (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function getWindowNames(it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-gopn-ext.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-gopn.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_object-gopn.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ \"./node_modules/core-js/modules/_object-keys-internal.js\");\n\nvar hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/core-js/modules/_enum-bug-keys.js\").concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-gopn.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-gops.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_object-gops.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("exports.f = Object.getOwnPropertySymbols;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-gops.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-gpo.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_object-gpo.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/core-js/modules/_shared-key.js\")('IE_PROTO');\n\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  }\n\n  return O instanceof Object ? ObjectProto : null;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-gpo.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-keys-internal.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/_object-keys-internal.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar arrayIndexOf = __webpack_require__(/*! ./_array-includes */ \"./node_modules/core-js/modules/_array-includes.js\")(false);\n\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/core-js/modules/_shared-key.js\")('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n\n  for (key in O) {\n    if (key != IE_PROTO) has(O, key) && result.push(key);\n  } // Don't enum bug & hidden keys\n\n\n  while (names.length > i) {\n    if (has(O, key = names[i++])) {\n      ~arrayIndexOf(result, key) || result.push(key);\n    }\n  }\n\n  return result;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-keys-internal.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-keys.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_object-keys.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ \"./node_modules/core-js/modules/_object-keys-internal.js\");\n\nvar enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/core-js/modules/_enum-bug-keys.js\");\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-keys.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-pie.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_object-pie.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("exports.f = {}.propertyIsEnumerable;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-pie.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-sap.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_object-sap.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () {\n    fn(1);\n  }), 'Object', exp);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-sap.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_object-to-array.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/_object-to-array.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\");\n\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/core-js/modules/_object-keys.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar isEnum = __webpack_require__(/*! ./_object-pie */ \"./node_modules/core-js/modules/_object-pie.js\").f;\n\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n\n    while (length > i) {\n      key = keys[i++];\n\n      if (!DESCRIPTORS || isEnum.call(O, key)) {\n        result.push(isEntries ? [key, O[key]] : O[key]);\n      }\n    }\n\n    return result;\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_object-to-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_own-keys.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/modules/_own-keys.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/core-js/modules/_object-gopn.js\");\n\nvar gOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/core-js/modules/_object-gops.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar Reflect = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").Reflect;\n\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_own-keys.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_parse-float.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_parse-float.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $parseFloat = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").parseFloat;\n\nvar $trim = __webpack_require__(/*! ./_string-trim */ \"./node_modules/core-js/modules/_string-trim.js\").trim;\n\nmodule.exports = 1 / $parseFloat(__webpack_require__(/*! ./_string-ws */ \"./node_modules/core-js/modules/_string-ws.js\") + '-0') !== -Infinity ? function parseFloat(str) {\n  var string = $trim(String(str), 3);\n  var result = $parseFloat(string);\n  return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_parse-float.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_parse-int.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_parse-int.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $parseInt = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").parseInt;\n\nvar $trim = __webpack_require__(/*! ./_string-trim */ \"./node_modules/core-js/modules/_string-trim.js\").trim;\n\nvar ws = __webpack_require__(/*! ./_string-ws */ \"./node_modules/core-js/modules/_string-ws.js\");\n\nvar hex = /^[-+]?0[xX]/;\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n  var string = $trim(String(str), 3);\n  return $parseInt(string, radix >>> 0 || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_parse-int.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_perform.js":
/*!**************************************************!*\
  !*** ./node_modules/core-js/modules/_perform.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (exec) {\n  try {\n    return {\n      e: false,\n      v: exec()\n    };\n  } catch (e) {\n    return {\n      e: true,\n      v: e\n    };\n  }\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_perform.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_promise-resolve.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/_promise-resolve.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ \"./node_modules/core-js/modules/_new-promise-capability.js\");\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_promise-resolve.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_property-desc.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_property-desc.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_property-desc.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_redefine-all.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/_redefine-all.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nmodule.exports = function (target, src, safe) {\n  for (var key in src) {\n    redefine(target, key, src[key], safe);\n  }\n\n  return target;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_redefine-all.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_redefine.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/modules/_redefine.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar SRC = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modules/_uid.js\")('src');\n\nvar $toString = __webpack_require__(/*! ./_function-to-string */ \"./node_modules/core-js/modules/_function-to-string.js\");\n\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\").inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  } // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_redefine.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_regexp-exec-abstract.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/_regexp-exec-abstract.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/core-js/modules/_classof.js\");\n\nvar builtinExec = RegExp.prototype.exec; // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\n\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n\n  if (typeof exec === 'function') {\n    var result = exec.call(R, S);\n\n    if (_typeof(result) !== 'object') {\n      throw new TypeError('RegExp exec method returned something other than an Object or null');\n    }\n\n    return result;\n  }\n\n  if (classof(R) !== 'RegExp') {\n    throw new TypeError('RegExp#exec called on incompatible receiver');\n  }\n\n  return builtinExec.call(R, S);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_regexp-exec-abstract.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_regexp-exec.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_regexp-exec.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar regexpFlags = __webpack_require__(/*! ./_flags */ \"./node_modules/core-js/modules/_flags.js\");\n\nvar nativeExec = RegExp.prototype.exec; // This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\n\nvar nativeReplace = String.prototype.replace;\nvar patchedExec = nativeExec;\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = function () {\n  var re1 = /a/,\n      re2 = /b*/g;\n  nativeExec.call(re1, 'a');\n  nativeExec.call(re2, 'a');\n  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n}(); // nonparticipating capturing group, copied from es5-shim's String#split patch.\n\n\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n  patchedExec = function exec(str) {\n    var re = this;\n    var lastIndex, reCopy, match, i;\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n    }\n\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n    match = nativeExec.call(re, str);\n\n    if (UPDATES_LAST_INDEX_WRONG && match) {\n      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n    }\n\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      // eslint-disable-next-line no-loop-func\n      nativeReplace.call(match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_regexp-exec.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_same-value.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_same-value.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_same-value.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_set-proto.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_set-proto.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar check = function check(O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\n\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n  function (test, buggy, set) {\n    try {\n      set = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\")(Function.call, __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\").f(Object.prototype, '__proto__').set, 2);\n      set(test, []);\n      buggy = !(test instanceof Array);\n    } catch (e) {\n      buggy = true;\n    }\n\n    return function setPrototypeOf(O, proto) {\n      check(O, proto);\n      if (buggy) O.__proto__ = proto;else set(O, proto);\n      return O;\n    };\n  }({}, false) : undefined),\n  check: check\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_set-proto.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_set-species.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_set-species.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\");\n\nvar SPECIES = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function get() {\n      return this;\n    }\n  });\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_set-species.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_set-to-string-tag.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/_set-to-string-tag.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var def = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar TAG = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {\n    configurable: true,\n    value: tag\n  });\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_set-to-string-tag.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_shared-key.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_shared-key.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var shared = __webpack_require__(/*! ./_shared */ \"./node_modules/core-js/modules/_shared.js\")('keys');\n\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modules/_uid.js\");\n\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_shared-key.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_shared.js":
/*!*************************************************!*\
  !*** ./node_modules/core-js/modules/_shared.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var core = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\");\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: __webpack_require__(/*! ./_library */ \"./node_modules/core-js/modules/_library.js\") ? 'pure' : 'global',\n  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_shared.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_species-constructor.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/_species-constructor.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar SPECIES = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('species');\n\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_species-constructor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_strict-method.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_strict-method.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nmodule.exports = function (method, arg) {\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call\n    arg ? method.call(null, function () {\n      /* empty */\n    }, 1) : method.call(null);\n  });\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_strict-method.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_string-at.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_string-at.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\"); // true  -> String#at\n// false -> String#codePointAt\n\n\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_string-at.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_string-context.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/_string-context.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_modules/core-js/modules/_is-regexp.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_string-context.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_string-html.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_string-html.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nvar quot = /\"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value)\n\nvar createHTML = function createHTML(string, tag, attribute, value) {\n  var S = String(defined(string));\n  var p1 = '<' + tag;\n  if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '&quot;') + '\"';\n  return p1 + '>' + S + '</' + tag + '>';\n};\n\nmodule.exports = function (NAME, exec) {\n  var O = {};\n  O[NAME] = exec(createHTML);\n  $export($export.P + $export.F * fails(function () {\n    var test = ''[NAME]('\"');\n    return test !== test.toLowerCase() || test.split('\"').length > 3;\n  }), 'String', O);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_string-html.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_string-pad.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_string-pad.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar repeat = __webpack_require__(/*! ./_string-repeat */ \"./node_modules/core-js/modules/_string-repeat.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  var fillLen = intMaxLength - stringLength;\n  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_string-pad.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_string-repeat.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/_string-repeat.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this));\n  var res = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n\n  for (; n > 0; (n >>>= 1) && (str += str)) {\n    if (n & 1) res += str;\n  }\n\n  return res;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_string-repeat.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_string-trim.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_string-trim.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar spaces = __webpack_require__(/*! ./_string-ws */ \"./node_modules/core-js/modules/_string-ws.js\");\n\nvar space = '[' + spaces + ']';\nvar non = \"\\u200B\\x85\";\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function exporter(KEY, exec, ALIAS) {\n  var exp = {};\n  var FORCE = fails(function () {\n    return !!spaces[KEY]() || non[KEY]() != non;\n  });\n  var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n  if (ALIAS) exp[ALIAS] = fn;\n  $export($export.P + $export.F * FORCE, 'String', exp);\n}; // 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\n\n\nvar trim = exporter.trim = function (string, TYPE) {\n  string = String(defined(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_string-trim.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_string-ws.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_string-ws.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"\\t\\n\\x0B\\f\\r \\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" + \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF\";\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_string-ws.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_task.js":
/*!***********************************************!*\
  !*** ./node_modules/core-js/modules/_task.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar invoke = __webpack_require__(/*! ./_invoke */ \"./node_modules/core-js/modules/_invoke.js\");\n\nvar html = __webpack_require__(/*! ./_html */ \"./node_modules/core-js/modules/_html.js\");\n\nvar cel = __webpack_require__(/*! ./_dom-create */ \"./node_modules/core-js/modules/_dom-create.js\");\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function run() {\n  var id = +this; // eslint-disable-next-line no-prototype-builtins\n\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\n\nvar listener = function listener(event) {\n  run.call(event.data);\n}; // Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n\n\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n\n    while (arguments.length > i) {\n      args.push(arguments[i++]);\n    }\n\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n\n    defer(counter);\n    return counter;\n  };\n\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  }; // Node.js 0.8-\n\n\n  if (__webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\")(process) == 'process') {\n    defer = function defer(id) {\n      process.nextTick(ctx(run, id, 1));\n    }; // Sphere (JS game engine) Dispatch API\n\n  } else if (Dispatch && Dispatch.now) {\n    defer = function defer(id) {\n      Dispatch.now(ctx(run, id, 1));\n    }; // Browsers with MessageChannel, includes WebWorkers\n\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers\n    // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function defer(id) {\n      global.postMessage(id + '', '*');\n    };\n\n    global.addEventListener('message', listener, false); // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function defer(id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    }; // Rest old browsers\n\n  } else {\n    defer = function defer(id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\n\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_task.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_to-absolute-index.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/_to-absolute-index.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar max = Math.max;\nvar min = Math.min;\n\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_to-absolute-index.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_to-index.js":
/*!***************************************************!*\
  !*** ./node_modules/core-js/modules/_to-index.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nmodule.exports = function (it) {\n  if (it === undefined) return 0;\n  var number = toInteger(it);\n  var length = toLength(number);\n  if (number !== length) throw RangeError('Wrong length!');\n  return length;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_to-index.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_to-integer.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_to-integer.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_to-integer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_to-iobject.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_to-iobject.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/core-js/modules/_iobject.js\");\n\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_to-iobject.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_to-length.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_to-length.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar min = Math.min;\n\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_to-length.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_to-object.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/_to-object.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/core-js/modules/_defined.js\");\n\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_to-object.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_to-primitive.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/_to-primitive.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\"); // instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\n\n\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_to-primitive.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_typed-array.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/_typed-array.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nif (__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\")) {\n  var LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/core-js/modules/_library.js\");\n\n  var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\n  var fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\n  var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n  var $typed = __webpack_require__(/*! ./_typed */ \"./node_modules/core-js/modules/_typed.js\");\n\n  var $buffer = __webpack_require__(/*! ./_typed-buffer */ \"./node_modules/core-js/modules/_typed-buffer.js\");\n\n  var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\n  var anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/core-js/modules/_an-instance.js\");\n\n  var propertyDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/modules/_property-desc.js\");\n\n  var hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\n  var redefineAll = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/core-js/modules/_redefine-all.js\");\n\n  var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\n  var toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\n  var toIndex = __webpack_require__(/*! ./_to-index */ \"./node_modules/core-js/modules/_to-index.js\");\n\n  var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/core-js/modules/_to-absolute-index.js\");\n\n  var toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\");\n\n  var has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\n  var classof = __webpack_require__(/*! ./_classof */ \"./node_modules/core-js/modules/_classof.js\");\n\n  var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\n  var toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\n  var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ \"./node_modules/core-js/modules/_is-array-iter.js\");\n\n  var create = __webpack_require__(/*! ./_object-create */ \"./node_modules/core-js/modules/_object-create.js\");\n\n  var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/core-js/modules/_object-gpo.js\");\n\n  var gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/core-js/modules/_object-gopn.js\").f;\n\n  var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ \"./node_modules/core-js/modules/core.get-iterator-method.js\");\n\n  var uid = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modules/_uid.js\");\n\n  var wks = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\");\n\n  var createArrayMethod = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\");\n\n  var createArrayIncludes = __webpack_require__(/*! ./_array-includes */ \"./node_modules/core-js/modules/_array-includes.js\");\n\n  var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/core-js/modules/_species-constructor.js\");\n\n  var ArrayIterators = __webpack_require__(/*! ./es6.array.iterator */ \"./node_modules/core-js/modules/es6.array.iterator.js\");\n\n  var Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/core-js/modules/_iterators.js\");\n\n  var $iterDetect = __webpack_require__(/*! ./_iter-detect */ \"./node_modules/core-js/modules/_iter-detect.js\");\n\n  var setSpecies = __webpack_require__(/*! ./_set-species */ \"./node_modules/core-js/modules/_set-species.js\");\n\n  var arrayFill = __webpack_require__(/*! ./_array-fill */ \"./node_modules/core-js/modules/_array-fill.js\");\n\n  var arrayCopyWithin = __webpack_require__(/*! ./_array-copy-within */ \"./node_modules/core-js/modules/_array-copy-within.js\");\n\n  var $DP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\n  var $GOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\");\n\n  var dP = $DP.f;\n  var gOPD = $GOPD.f;\n  var RangeError = global.RangeError;\n  var TypeError = global.TypeError;\n  var Uint8Array = global.Uint8Array;\n  var ARRAY_BUFFER = 'ArrayBuffer';\n  var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n  var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n  var PROTOTYPE = 'prototype';\n  var ArrayProto = Array[PROTOTYPE];\n  var $ArrayBuffer = $buffer.ArrayBuffer;\n  var $DataView = $buffer.DataView;\n  var arrayForEach = createArrayMethod(0);\n  var arrayFilter = createArrayMethod(2);\n  var arraySome = createArrayMethod(3);\n  var arrayEvery = createArrayMethod(4);\n  var arrayFind = createArrayMethod(5);\n  var arrayFindIndex = createArrayMethod(6);\n  var arrayIncludes = createArrayIncludes(true);\n  var arrayIndexOf = createArrayIncludes(false);\n  var arrayValues = ArrayIterators.values;\n  var arrayKeys = ArrayIterators.keys;\n  var arrayEntries = ArrayIterators.entries;\n  var arrayLastIndexOf = ArrayProto.lastIndexOf;\n  var arrayReduce = ArrayProto.reduce;\n  var arrayReduceRight = ArrayProto.reduceRight;\n  var arrayJoin = ArrayProto.join;\n  var arraySort = ArrayProto.sort;\n  var arraySlice = ArrayProto.slice;\n  var arrayToString = ArrayProto.toString;\n  var arrayToLocaleString = ArrayProto.toLocaleString;\n  var ITERATOR = wks('iterator');\n  var TAG = wks('toStringTag');\n  var TYPED_CONSTRUCTOR = uid('typed_constructor');\n  var DEF_CONSTRUCTOR = uid('def_constructor');\n  var ALL_CONSTRUCTORS = $typed.CONSTR;\n  var TYPED_ARRAY = $typed.TYPED;\n  var VIEW = $typed.VIEW;\n  var WRONG_LENGTH = 'Wrong length!';\n  var $map = createArrayMethod(1, function (O, length) {\n    return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n  });\n  var LITTLE_ENDIAN = fails(function () {\n    // eslint-disable-next-line no-undef\n    return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n  });\n  var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n    new Uint8Array(1).set({});\n  });\n\n  var toOffset = function toOffset(it, BYTES) {\n    var offset = toInteger(it);\n    if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n    return offset;\n  };\n\n  var validate = function validate(it) {\n    if (isObject(it) && TYPED_ARRAY in it) return it;\n    throw TypeError(it + ' is not a typed array!');\n  };\n\n  var allocate = function allocate(C, length) {\n    if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n      throw TypeError('It is not a typed array constructor!');\n    }\n\n    return new C(length);\n  };\n\n  var speciesFromList = function speciesFromList(O, list) {\n    return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n  };\n\n  var fromList = function fromList(C, list) {\n    var index = 0;\n    var length = list.length;\n    var result = allocate(C, length);\n\n    while (length > index) {\n      result[index] = list[index++];\n    }\n\n    return result;\n  };\n\n  var addGetter = function addGetter(it, key, internal) {\n    dP(it, key, {\n      get: function get() {\n        return this._d[internal];\n      }\n    });\n  };\n\n  var $from = function from(source\n  /* , mapfn, thisArg */\n  ) {\n    var O = toObject(source);\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var iterFn = getIterFn(O);\n    var i, length, values, result, step, iterator;\n\n    if (iterFn != undefined && !isArrayIter(iterFn)) {\n      for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n        values.push(step.value);\n      }\n\n      O = values;\n    }\n\n    if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n\n    for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n      result[i] = mapping ? mapfn(O[i], i) : O[i];\n    }\n\n    return result;\n  };\n\n  var $of = function\n    /* ...items */\n  of() {\n    var index = 0;\n    var length = arguments.length;\n    var result = allocate(this, length);\n\n    while (length > index) {\n      result[index] = arguments[index++];\n    }\n\n    return result;\n  }; // iOS Safari 6.x fails here\n\n\n  var TO_LOCALE_BUG = !!Uint8Array && fails(function () {\n    arrayToLocaleString.call(new Uint8Array(1));\n  });\n\n  var $toLocaleString = function toLocaleString() {\n    return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n  };\n\n  var proto = {\n    copyWithin: function copyWithin(target, start\n    /* , end */\n    ) {\n      return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n    },\n    every: function every(callbackfn\n    /* , thisArg */\n    ) {\n      return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    fill: function fill(value\n    /* , start, end */\n    ) {\n      // eslint-disable-line no-unused-vars\n      return arrayFill.apply(validate(this), arguments);\n    },\n    filter: function filter(callbackfn\n    /* , thisArg */\n    ) {\n      return speciesFromList(this, arrayFilter(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined));\n    },\n    find: function find(predicate\n    /* , thisArg */\n    ) {\n      return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    findIndex: function findIndex(predicate\n    /* , thisArg */\n    ) {\n      return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    forEach: function forEach(callbackfn\n    /* , thisArg */\n    ) {\n      arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    indexOf: function indexOf(searchElement\n    /* , fromIndex */\n    ) {\n      return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    includes: function includes(searchElement\n    /* , fromIndex */\n    ) {\n      return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    join: function join(separator) {\n      // eslint-disable-line no-unused-vars\n      return arrayJoin.apply(validate(this), arguments);\n    },\n    lastIndexOf: function lastIndexOf(searchElement\n    /* , fromIndex */\n    ) {\n      // eslint-disable-line no-unused-vars\n      return arrayLastIndexOf.apply(validate(this), arguments);\n    },\n    map: function map(mapfn\n    /* , thisArg */\n    ) {\n      return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    reduce: function reduce(callbackfn\n    /* , initialValue */\n    ) {\n      // eslint-disable-line no-unused-vars\n      return arrayReduce.apply(validate(this), arguments);\n    },\n    reduceRight: function reduceRight(callbackfn\n    /* , initialValue */\n    ) {\n      // eslint-disable-line no-unused-vars\n      return arrayReduceRight.apply(validate(this), arguments);\n    },\n    reverse: function reverse() {\n      var that = this;\n      var length = validate(that).length;\n      var middle = Math.floor(length / 2);\n      var index = 0;\n      var value;\n\n      while (index < middle) {\n        value = that[index];\n        that[index++] = that[--length];\n        that[length] = value;\n      }\n\n      return that;\n    },\n    some: function some(callbackfn\n    /* , thisArg */\n    ) {\n      return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    sort: function sort(comparefn) {\n      return arraySort.call(validate(this), comparefn);\n    },\n    subarray: function subarray(begin, end) {\n      var O = validate(this);\n      var length = O.length;\n      var $begin = toAbsoluteIndex(begin, length);\n      return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(O.buffer, O.byteOffset + $begin * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin));\n    }\n  };\n\n  var $slice = function slice(start, end) {\n    return speciesFromList(this, arraySlice.call(validate(this), start, end));\n  };\n\n  var $set = function set(arrayLike\n  /* , offset */\n  ) {\n    validate(this);\n    var offset = toOffset(arguments[1], 1);\n    var length = this.length;\n    var src = toObject(arrayLike);\n    var len = toLength(src.length);\n    var index = 0;\n    if (len + offset > length) throw RangeError(WRONG_LENGTH);\n\n    while (index < len) {\n      this[offset + index] = src[index++];\n    }\n  };\n\n  var $iterators = {\n    entries: function entries() {\n      return arrayEntries.call(validate(this));\n    },\n    keys: function keys() {\n      return arrayKeys.call(validate(this));\n    },\n    values: function values() {\n      return arrayValues.call(validate(this));\n    }\n  };\n\n  var isTAIndex = function isTAIndex(target, key) {\n    return isObject(target) && target[TYPED_ARRAY] && _typeof(key) != 'symbol' && key in target && String(+key) == String(key);\n  };\n\n  var $getDesc = function getOwnPropertyDescriptor(target, key) {\n    return isTAIndex(target, key = toPrimitive(key, true)) ? propertyDesc(2, target[key]) : gOPD(target, key);\n  };\n\n  var $setDesc = function defineProperty(target, key, desc) {\n    if (isTAIndex(target, key = toPrimitive(key, true)) && isObject(desc) && has(desc, 'value') && !has(desc, 'get') && !has(desc, 'set') // TODO: add validation descriptor w/o calling accessors\n    && !desc.configurable && (!has(desc, 'writable') || desc.writable) && (!has(desc, 'enumerable') || desc.enumerable)) {\n      target[key] = desc.value;\n      return target;\n    }\n\n    return dP(target, key, desc);\n  };\n\n  if (!ALL_CONSTRUCTORS) {\n    $GOPD.f = $getDesc;\n    $DP.f = $setDesc;\n  }\n\n  $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n    getOwnPropertyDescriptor: $getDesc,\n    defineProperty: $setDesc\n  });\n\n  if (fails(function () {\n    arrayToString.call({});\n  })) {\n    arrayToString = arrayToLocaleString = function toString() {\n      return arrayJoin.call(this);\n    };\n  }\n\n  var $TypedArrayPrototype$ = redefineAll({}, proto);\n  redefineAll($TypedArrayPrototype$, $iterators);\n  hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n  redefineAll($TypedArrayPrototype$, {\n    slice: $slice,\n    set: $set,\n    constructor: function constructor() {\n      /* noop */\n    },\n    toString: arrayToString,\n    toLocaleString: $toLocaleString\n  });\n  addGetter($TypedArrayPrototype$, 'buffer', 'b');\n  addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n  addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n  addGetter($TypedArrayPrototype$, 'length', 'e');\n  dP($TypedArrayPrototype$, TAG, {\n    get: function get() {\n      return this[TYPED_ARRAY];\n    }\n  }); // eslint-disable-next-line max-statements\n\n  module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n    CLAMPED = !!CLAMPED;\n    var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n    var GETTER = 'get' + KEY;\n    var SETTER = 'set' + KEY;\n    var TypedArray = global[NAME];\n    var Base = TypedArray || {};\n    var TAC = TypedArray && getPrototypeOf(TypedArray);\n    var FORCED = !TypedArray || !$typed.ABV;\n    var O = {};\n    var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n\n    var getter = function getter(that, index) {\n      var data = that._d;\n      return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n    };\n\n    var setter = function setter(that, index, value) {\n      var data = that._d;\n      if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n      data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n    };\n\n    var addElement = function addElement(that, index) {\n      dP(that, index, {\n        get: function get() {\n          return getter(this, index);\n        },\n        set: function set(value) {\n          return setter(this, index, value);\n        },\n        enumerable: true\n      });\n    };\n\n    if (FORCED) {\n      TypedArray = wrapper(function (that, data, $offset, $length) {\n        anInstance(that, TypedArray, NAME, '_d');\n        var index = 0;\n        var offset = 0;\n        var buffer, byteLength, length, klass;\n\n        if (!isObject(data)) {\n          length = toIndex(data);\n          byteLength = length * BYTES;\n          buffer = new $ArrayBuffer(byteLength);\n        } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n          buffer = data;\n          offset = toOffset($offset, BYTES);\n          var $len = data.byteLength;\n\n          if ($length === undefined) {\n            if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n            byteLength = $len - offset;\n            if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n          } else {\n            byteLength = toLength($length) * BYTES;\n            if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n          }\n\n          length = byteLength / BYTES;\n        } else if (TYPED_ARRAY in data) {\n          return fromList(TypedArray, data);\n        } else {\n          return $from.call(TypedArray, data);\n        }\n\n        hide(that, '_d', {\n          b: buffer,\n          o: offset,\n          l: byteLength,\n          e: length,\n          v: new $DataView(buffer)\n        });\n\n        while (index < length) {\n          addElement(that, index++);\n        }\n      });\n      TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n      hide(TypedArrayPrototype, 'constructor', TypedArray);\n    } else if (!fails(function () {\n      TypedArray(1);\n    }) || !fails(function () {\n      new TypedArray(-1); // eslint-disable-line no-new\n    }) || !$iterDetect(function (iter) {\n      new TypedArray(); // eslint-disable-line no-new\n\n      new TypedArray(null); // eslint-disable-line no-new\n\n      new TypedArray(1.5); // eslint-disable-line no-new\n\n      new TypedArray(iter); // eslint-disable-line no-new\n    }, true)) {\n      TypedArray = wrapper(function (that, data, $offset, $length) {\n        anInstance(that, TypedArray, NAME);\n        var klass; // `ws` module bug, temporarily remove validation length for Uint8Array\n        // https://github.com/websockets/ws/pull/645\n\n        if (!isObject(data)) return new Base(toIndex(data));\n\n        if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n          return $length !== undefined ? new Base(data, toOffset($offset, BYTES), $length) : $offset !== undefined ? new Base(data, toOffset($offset, BYTES)) : new Base(data);\n        }\n\n        if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n        return $from.call(TypedArray, data);\n      });\n      arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n        if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n      });\n      TypedArray[PROTOTYPE] = TypedArrayPrototype;\n      if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n    }\n\n    var $nativeIterator = TypedArrayPrototype[ITERATOR];\n    var CORRECT_ITER_NAME = !!$nativeIterator && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n    var $iterator = $iterators.values;\n    hide(TypedArray, TYPED_CONSTRUCTOR, true);\n    hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n    hide(TypedArrayPrototype, VIEW, true);\n    hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n    if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n      dP(TypedArrayPrototype, TAG, {\n        get: function get() {\n          return NAME;\n        }\n      });\n    }\n\n    O[NAME] = TypedArray;\n    $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n    $export($export.S, NAME, {\n      BYTES_PER_ELEMENT: BYTES\n    });\n    $export($export.S + $export.F * fails(function () {\n      Base.of.call(TypedArray, 1);\n    }), NAME, {\n      from: $from,\n      of: $of\n    });\n    if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n    $export($export.P, NAME, proto);\n    setSpecies(NAME);\n    $export($export.P + $export.F * FORCED_SET, NAME, {\n      set: $set\n    });\n    $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n    if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n    $export($export.P + $export.F * fails(function () {\n      new TypedArray(1).slice();\n    }), NAME, {\n      slice: $slice\n    });\n    $export($export.P + $export.F * (fails(function () {\n      return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n    }) || !fails(function () {\n      TypedArrayPrototype.toLocaleString.call([1, 2]);\n    })), NAME, {\n      toLocaleString: $toLocaleString\n    });\n    Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n    if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n  };\n} else module.exports = function () {\n  /* empty */\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_typed-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_typed-buffer.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/_typed-buffer.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\");\n\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/core-js/modules/_library.js\");\n\nvar $typed = __webpack_require__(/*! ./_typed */ \"./node_modules/core-js/modules/_typed.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\nvar redefineAll = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/core-js/modules/_redefine-all.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/core-js/modules/_an-instance.js\");\n\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar toIndex = __webpack_require__(/*! ./_to-index */ \"./node_modules/core-js/modules/_to-index.js\");\n\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/core-js/modules/_object-gopn.js\").f;\n\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nvar arrayFill = __webpack_require__(/*! ./_array-fill */ \"./node_modules/core-js/modules/_array-fill.js\");\n\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/core-js/modules/_set-to-string-tag.js\");\n\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError; // eslint-disable-next-line no-shadow-restricted-names\n\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET; // IEEE754 conversions based on https://github.com/feross/ieee754\n\nfunction packIEEE754(value, mLen, nBytes) {\n  var buffer = new Array(nBytes);\n  var eLen = nBytes * 8 - mLen - 1;\n  var eMax = (1 << eLen) - 1;\n  var eBias = eMax >> 1;\n  var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n  var i = 0;\n  var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n  var e, m, c;\n  value = abs(value); // eslint-disable-next-line no-self-compare\n\n  if (value != value || value === Infinity) {\n    // eslint-disable-next-line no-self-compare\n    m = value != value ? 1 : 0;\n    e = eMax;\n  } else {\n    e = floor(log(value) / LN2);\n\n    if (value * (c = pow(2, -e)) < 1) {\n      e--;\n      c *= 2;\n    }\n\n    if (e + eBias >= 1) {\n      value += rt / c;\n    } else {\n      value += rt * pow(2, 1 - eBias);\n    }\n\n    if (value * c >= 2) {\n      e++;\n      c /= 2;\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0;\n      e = eMax;\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * pow(2, mLen);\n      e = e + eBias;\n    } else {\n      m = value * pow(2, eBias - 1) * pow(2, mLen);\n      e = 0;\n    }\n  }\n\n  for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8) {\n    ;\n  }\n\n  e = e << mLen | m;\n  eLen += mLen;\n\n  for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8) {\n    ;\n  }\n\n  buffer[--i] |= s * 128;\n  return buffer;\n}\n\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n  var eLen = nBytes * 8 - mLen - 1;\n  var eMax = (1 << eLen) - 1;\n  var eBias = eMax >> 1;\n  var nBits = eLen - 7;\n  var i = nBytes - 1;\n  var s = buffer[i--];\n  var e = s & 127;\n  var m;\n  s >>= 7;\n\n  for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8) {\n    ;\n  }\n\n  m = e & (1 << -nBits) - 1;\n  e >>= -nBits;\n  nBits += mLen;\n\n  for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8) {\n    ;\n  }\n\n  if (e === 0) {\n    e = 1 - eBias;\n  } else if (e === eMax) {\n    return m ? NaN : s ? -Infinity : Infinity;\n  } else {\n    m = m + pow(2, mLen);\n    e = e - eBias;\n  }\n\n  return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n  return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\n\nfunction packI8(it) {\n  return [it & 0xff];\n}\n\nfunction packI16(it) {\n  return [it & 0xff, it >> 8 & 0xff];\n}\n\nfunction packI32(it) {\n  return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\n\nfunction packF64(it) {\n  return packIEEE754(it, 52, 8);\n}\n\nfunction packF32(it) {\n  return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n  dP(C[PROTOTYPE], key, {\n    get: function get() {\n      return this[internal];\n    }\n  });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n  var numIndex = +index;\n  var intIndex = toIndex(numIndex);\n  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n  var store = view[$BUFFER]._b;\n  var start = intIndex + view[$OFFSET];\n  var pack = store.slice(start, start + bytes);\n  return isLittleEndian ? pack : pack.reverse();\n}\n\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n  var numIndex = +index;\n  var intIndex = toIndex(numIndex);\n  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n  var store = view[$BUFFER]._b;\n  var start = intIndex + view[$OFFSET];\n  var pack = conversion(+value);\n\n  for (var i = 0; i < bytes; i++) {\n    store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n  }\n}\n\nif (!$typed.ABV) {\n  $ArrayBuffer = function ArrayBuffer(length) {\n    anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n    var byteLength = toIndex(length);\n    this._b = arrayFill.call(new Array(byteLength), 0);\n    this[$LENGTH] = byteLength;\n  };\n\n  $DataView = function DataView(buffer, byteOffset, byteLength) {\n    anInstance(this, $DataView, DATA_VIEW);\n    anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n    var bufferLength = buffer[$LENGTH];\n    var offset = toInteger(byteOffset);\n    if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n    byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n    if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n    this[$BUFFER] = buffer;\n    this[$OFFSET] = offset;\n    this[$LENGTH] = byteLength;\n  };\n\n  if (DESCRIPTORS) {\n    addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n    addGetter($DataView, BUFFER, '_b');\n    addGetter($DataView, BYTE_LENGTH, '_l');\n    addGetter($DataView, BYTE_OFFSET, '_o');\n  }\n\n  redefineAll($DataView[PROTOTYPE], {\n    getInt8: function getInt8(byteOffset) {\n      return get(this, 1, byteOffset)[0] << 24 >> 24;\n    },\n    getUint8: function getUint8(byteOffset) {\n      return get(this, 1, byteOffset)[0];\n    },\n    getInt16: function getInt16(byteOffset\n    /* , littleEndian */\n    ) {\n      var bytes = get(this, 2, byteOffset, arguments[1]);\n      return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n    },\n    getUint16: function getUint16(byteOffset\n    /* , littleEndian */\n    ) {\n      var bytes = get(this, 2, byteOffset, arguments[1]);\n      return bytes[1] << 8 | bytes[0];\n    },\n    getInt32: function getInt32(byteOffset\n    /* , littleEndian */\n    ) {\n      return unpackI32(get(this, 4, byteOffset, arguments[1]));\n    },\n    getUint32: function getUint32(byteOffset\n    /* , littleEndian */\n    ) {\n      return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n    },\n    getFloat32: function getFloat32(byteOffset\n    /* , littleEndian */\n    ) {\n      return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n    },\n    getFloat64: function getFloat64(byteOffset\n    /* , littleEndian */\n    ) {\n      return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n    },\n    setInt8: function setInt8(byteOffset, value) {\n      set(this, 1, byteOffset, packI8, value);\n    },\n    setUint8: function setUint8(byteOffset, value) {\n      set(this, 1, byteOffset, packI8, value);\n    },\n    setInt16: function setInt16(byteOffset, value\n    /* , littleEndian */\n    ) {\n      set(this, 2, byteOffset, packI16, value, arguments[2]);\n    },\n    setUint16: function setUint16(byteOffset, value\n    /* , littleEndian */\n    ) {\n      set(this, 2, byteOffset, packI16, value, arguments[2]);\n    },\n    setInt32: function setInt32(byteOffset, value\n    /* , littleEndian */\n    ) {\n      set(this, 4, byteOffset, packI32, value, arguments[2]);\n    },\n    setUint32: function setUint32(byteOffset, value\n    /* , littleEndian */\n    ) {\n      set(this, 4, byteOffset, packI32, value, arguments[2]);\n    },\n    setFloat32: function setFloat32(byteOffset, value\n    /* , littleEndian */\n    ) {\n      set(this, 4, byteOffset, packF32, value, arguments[2]);\n    },\n    setFloat64: function setFloat64(byteOffset, value\n    /* , littleEndian */\n    ) {\n      set(this, 8, byteOffset, packF64, value, arguments[2]);\n    }\n  });\n} else {\n  if (!fails(function () {\n    $ArrayBuffer(1);\n  }) || !fails(function () {\n    new $ArrayBuffer(-1); // eslint-disable-line no-new\n  }) || fails(function () {\n    new $ArrayBuffer(); // eslint-disable-line no-new\n\n    new $ArrayBuffer(1.5); // eslint-disable-line no-new\n\n    new $ArrayBuffer(NaN); // eslint-disable-line no-new\n\n    return $ArrayBuffer.name != ARRAY_BUFFER;\n  })) {\n    $ArrayBuffer = function ArrayBuffer(length) {\n      anInstance(this, $ArrayBuffer);\n      return new BaseBuffer(toIndex(length));\n    };\n\n    var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n\n    for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n      if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n    }\n\n    if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n  } // iOS Safari 7.x bug\n\n\n  var view = new $DataView(new $ArrayBuffer(2));\n  var $setInt8 = $DataView[PROTOTYPE].setInt8;\n  view.setInt8(0, 2147483648);\n  view.setInt8(1, 2147483649);\n  if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n    setInt8: function setInt8(byteOffset, value) {\n      $setInt8.call(this, byteOffset, value << 24 >> 24);\n    },\n    setUint8: function setUint8(byteOffset, value) {\n      $setInt8.call(this, byteOffset, value << 24 >> 24);\n    }\n  }, true);\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_typed-buffer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_typed.js":
/*!************************************************!*\
  !*** ./node_modules/core-js/modules/_typed.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modules/_uid.js\");\n\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\nvar TypedArrayConstructors = 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'.split(',');\n\nwhile (i < l) {\n  if (Typed = global[TypedArrayConstructors[i++]]) {\n    hide(Typed.prototype, TYPED, true);\n    hide(Typed.prototype, VIEW, true);\n  } else CONSTR = false;\n}\n\nmodule.exports = {\n  ABV: ABV,\n  CONSTR: CONSTR,\n  TYPED: TYPED,\n  VIEW: VIEW\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_typed.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_uid.js":
/*!**********************************************!*\
  !*** ./node_modules/core-js/modules/_uid.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var id = 0;\nvar px = Math.random();\n\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_uid.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_user-agent.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_user-agent.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar navigator = global.navigator;\nmodule.exports = navigator && navigator.userAgent || '';\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_user-agent.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_validate-collection.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/_validate-collection.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_validate-collection.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_wks-define.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/_wks-define.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\");\n\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/core-js/modules/_library.js\");\n\nvar wksExt = __webpack_require__(/*! ./_wks-ext */ \"./node_modules/core-js/modules/_wks-ext.js\");\n\nvar defineProperty = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, {\n    value: wksExt.f(name)\n  });\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_wks-define.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_wks-ext.js":
/*!**************************************************!*\
  !*** ./node_modules/core-js/modules/_wks-ext.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("exports.f = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\");\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_wks-ext.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/_wks.js":
/*!**********************************************!*\
  !*** ./node_modules/core-js/modules/_wks.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var store = __webpack_require__(/*! ./_shared */ \"./node_modules/core-js/modules/_shared.js\")('wks');\n\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modules/_uid.js\");\n\nvar _Symbol = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").Symbol;\n\nvar USE_SYMBOL = typeof _Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/_wks.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/core.get-iterator-method.js":
/*!******************************************************************!*\
  !*** ./node_modules/core-js/modules/core.get-iterator-method.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var classof = __webpack_require__(/*! ./_classof */ \"./node_modules/core-js/modules/_classof.js\");\n\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('iterator');\n\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/core-js/modules/_iterators.js\");\n\nmodule.exports = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\").getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];\n};\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/core.get-iterator-method.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.copy-within.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.copy-within.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.P, 'Array', {\n  copyWithin: __webpack_require__(/*! ./_array-copy-within */ \"./node_modules/core-js/modules/_array-copy-within.js\")\n});\n\n__webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/core-js/modules/_add-to-unscopables.js\")('copyWithin');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.copy-within.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.every.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.every.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $every = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(4);\n\n$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")([].every, true), 'Array', {\n  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n  every: function every(callbackfn\n  /* , thisArg */\n  ) {\n    return $every(this, callbackfn, arguments[1]);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.every.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.fill.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.fill.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.P, 'Array', {\n  fill: __webpack_require__(/*! ./_array-fill */ \"./node_modules/core-js/modules/_array-fill.js\")\n});\n\n__webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/core-js/modules/_add-to-unscopables.js\")('fill');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.fill.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.filter.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.filter.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $filter = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(2);\n\n$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")([].filter, true), 'Array', {\n  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n  filter: function filter(callbackfn\n  /* , thisArg */\n  ) {\n    return $filter(this, callbackfn, arguments[1]);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.filter.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.find-index.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.find-index.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $find = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(6);\n\nvar KEY = 'findIndex';\nvar forced = true; // Shouldn't skip holes\n\nif (KEY in []) Array(1)[KEY](function () {\n  forced = false;\n});\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn\n  /* , that = undefined */\n  ) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/core-js/modules/_add-to-unscopables.js\")(KEY);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.find-index.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.find.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.find.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $find = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(5);\n\nvar KEY = 'find';\nvar forced = true; // Shouldn't skip holes\n\nif (KEY in []) Array(1)[KEY](function () {\n  forced = false;\n});\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn\n  /* , that = undefined */\n  ) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/core-js/modules/_add-to-unscopables.js\")(KEY);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.find.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.for-each.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.for-each.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $forEach = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(0);\n\nvar STRICT = __webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n  forEach: function forEach(callbackfn\n  /* , thisArg */\n  ) {\n    return $forEach(this, callbackfn, arguments[1]);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.for-each.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.from.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.from.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar call = __webpack_require__(/*! ./_iter-call */ \"./node_modules/core-js/modules/_iter-call.js\");\n\nvar isArrayIter = __webpack_require__(/*! ./_is-array-iter */ \"./node_modules/core-js/modules/_is-array-iter.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar createProperty = __webpack_require__(/*! ./_create-property */ \"./node_modules/core-js/modules/_create-property.js\");\n\nvar getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ \"./node_modules/core-js/modules/core.get-iterator-method.js\");\n\n$export($export.S + $export.F * !__webpack_require__(/*! ./_iter-detect */ \"./node_modules/core-js/modules/_iter-detect.js\")(function (iter) {\n  Array.from(iter);\n}), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike\n  /* , mapfn = undefined, thisArg = undefined */\n  ) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); // if object isn't iterable or it's array with default iterator - use simple case\n\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n\n    result.length = index;\n    return result;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.from.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.index-of.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.index-of.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $indexOf = __webpack_require__(/*! ./_array-includes */ \"./node_modules/core-js/modules/_array-includes.js\")(false);\n\nvar $native = [].indexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")($native)), 'Array', {\n  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n  indexOf: function indexOf(searchElement\n  /* , fromIndex = 0 */\n  ) {\n    return NEGATIVE_ZERO // convert -0 to +0\n    ? $native.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments[1]);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.index-of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.is-array.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.is-array.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Array', {\n  isArray: __webpack_require__(/*! ./_is-array */ \"./node_modules/core-js/modules/_is-array.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.is-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.iterator.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.iterator.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/core-js/modules/_add-to-unscopables.js\");\n\nvar step = __webpack_require__(/*! ./_iter-step */ \"./node_modules/core-js/modules/_iter-step.js\");\n\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/core-js/modules/_iterators.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\"); // 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\n\n\nmodule.exports = __webpack_require__(/*! ./_iter-define */ \"./node_modules/core-js/modules/_iter-define.js\")(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n\n  this._i = 0; // next index\n\n  this._k = kind; // kind\n  // 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\n\nIterators.Arguments = Iterators.Array;\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.iterator.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.join.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.join.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 22.1.3.13 Array.prototype.join(separator)\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar arrayJoin = [].join; // fallback for not array-like strings\n\n$export($export.P + $export.F * (__webpack_require__(/*! ./_iobject */ \"./node_modules/core-js/modules/_iobject.js\") != Object || !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")(arrayJoin)), 'Array', {\n  join: function join(separator) {\n    return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.join.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.last-index-of.js":
/*!*****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.last-index-of.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar $native = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")($native)), 'Array', {\n  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n  lastIndexOf: function lastIndexOf(searchElement\n  /* , fromIndex = @[*-1] */\n  ) {\n    // convert -0 to +0\n    if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;\n    var O = toIObject(this);\n    var length = toLength(O.length);\n    var index = length - 1;\n    if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n    if (index < 0) index = length + index;\n\n    for (; index >= 0; index--) {\n      if (index in O) if (O[index] === searchElement) return index || 0;\n    }\n\n    return -1;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.last-index-of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.map.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.map.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $map = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(1);\n\n$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")([].map, true), 'Array', {\n  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n  map: function map(callbackfn\n  /* , thisArg */\n  ) {\n    return $map(this, callbackfn, arguments[1]);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.map.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.of.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.of.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar createProperty = __webpack_require__(/*! ./_create-property */ \"./node_modules/core-js/modules/_create-property.js\"); // WebKit Array.of isn't generic\n\n\n$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  function F() {\n    /* empty */\n  }\n\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function\n    /* ...args */\n  of() {\n    var index = 0;\n    var aLen = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(aLen);\n\n    while (aLen > index) {\n      createProperty(result, index, arguments[index++]);\n    }\n\n    result.length = aLen;\n    return result;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.reduce-right.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.reduce-right.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $reduce = __webpack_require__(/*! ./_array-reduce */ \"./node_modules/core-js/modules/_array-reduce.js\");\n\n$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")([].reduceRight, true), 'Array', {\n  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n  reduceRight: function reduceRight(callbackfn\n  /* , initialValue */\n  ) {\n    return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.reduce-right.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.reduce.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.reduce.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $reduce = __webpack_require__(/*! ./_array-reduce */ \"./node_modules/core-js/modules/_array-reduce.js\");\n\n$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")([].reduce, true), 'Array', {\n  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n  reduce: function reduce(callbackfn\n  /* , initialValue */\n  ) {\n    return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.reduce.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.slice.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.slice.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar html = __webpack_require__(/*! ./_html */ \"./node_modules/core-js/modules/_html.js\");\n\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\");\n\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/core-js/modules/_to-absolute-index.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar arraySlice = [].slice; // fallback for not array-like ES3 strings and DOM objects\n\n$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  if (html) arraySlice.call(html);\n}), 'Array', {\n  slice: function slice(begin, end) {\n    var len = toLength(this.length);\n    var klass = cof(this);\n    end = end === undefined ? len : end;\n    if (klass == 'Array') return arraySlice.call(this, begin, end);\n    var start = toAbsoluteIndex(begin, len);\n    var upTo = toAbsoluteIndex(end, len);\n    var size = toLength(upTo - start);\n    var cloned = new Array(size);\n    var i = 0;\n\n    for (; i < size; i++) {\n      cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i];\n    }\n\n    return cloned;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.slice.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.some.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.some.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $some = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(3);\n\n$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")([].some, true), 'Array', {\n  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n  some: function some(callbackfn\n  /* , thisArg */\n  ) {\n    return $some(this, callbackfn, arguments[1]);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.some.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.sort.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.sort.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n$export($export.P + $export.F * (fails(function () {\n  // IE8-\n  test.sort(undefined);\n}) || !fails(function () {\n  // V8 bug\n  test.sort(null); // Old WebKit\n}) || !__webpack_require__(/*! ./_strict-method */ \"./node_modules/core-js/modules/_strict-method.js\")($sort)), 'Array', {\n  // 22.1.3.25 Array.prototype.sort(comparefn)\n  sort: function sort(comparefn) {\n    return comparefn === undefined ? $sort.call(toObject(this)) : $sort.call(toObject(this), aFunction(comparefn));\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.sort.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.array.species.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.array.species.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_set-species */ \"./node_modules/core-js/modules/_set-species.js\")('Array');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.array.species.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.date.now.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.date.now.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Date', {\n  now: function now() {\n    return new Date().getTime();\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.date.now.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.date.to-iso-string.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.date.to-iso-string.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toISOString = __webpack_require__(/*! ./_date-to-iso-string */ \"./node_modules/core-js/modules/_date-to-iso-string.js\"); // PhantomJS / old WebKit has a broken implementations\n\n\n$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {\n  toISOString: toISOString\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.date.to-iso-string.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.date.to-json.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.date.to-json.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\");\n\n$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({\n    toISOString: function toISOString() {\n      return 1;\n    }\n  }) !== 1;\n}), 'Date', {\n  // eslint-disable-next-line no-unused-vars\n  toJSON: function toJSON(key) {\n    var O = toObject(this);\n    var pv = toPrimitive(O);\n    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.date.to-json.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.date.to-primitive.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.date.to-primitive.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var TO_PRIMITIVE = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('toPrimitive');\n\nvar proto = Date.prototype;\nif (!(TO_PRIMITIVE in proto)) __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\")(proto, TO_PRIMITIVE, __webpack_require__(/*! ./_date-to-primitive */ \"./node_modules/core-js/modules/_date-to-primitive.js\"));\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.date.to-primitive.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.date.to-string.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.date.to-string.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\n\nif (new Date(NaN) + '' != INVALID_DATE) {\n  __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\")(DateProto, TO_STRING, function toString() {\n    var value = getTime.call(this); // eslint-disable-next-line no-self-compare\n\n    return value === value ? $toString.call(this) : INVALID_DATE;\n  });\n}\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.date.to-string.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.function.bind.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.function.bind.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.P, 'Function', {\n  bind: __webpack_require__(/*! ./_bind */ \"./node_modules/core-js/modules/_bind.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.function.bind.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.function.has-instance.js":
/*!*******************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.function.has-instance.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/core-js/modules/_object-gpo.js\");\n\nvar HAS_INSTANCE = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('hasInstance');\n\nvar FunctionProto = Function.prototype; // 19.2.3.6 Function.prototype[@@hasInstance](V)\n\nif (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f(FunctionProto, HAS_INSTANCE, {\n  value: function value(O) {\n    if (typeof this != 'function' || !isObject(O)) return false;\n    if (!isObject(this.prototype)) return O instanceof this; // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n\n    while (O = getPrototypeOf(O)) {\n      if (this.prototype === O) return true;\n    }\n\n    return false;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.function.has-instance.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.function.name.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.function.name.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name'; // 19.2.4.2 name\n\nNAME in FProto || __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") && dP(FProto, NAME, {\n  configurable: true,\n  get: function get() {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.function.name.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.map.js":
/*!*************************************************!*\
  !*** ./node_modules/core-js/modules/es6.map.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar strong = __webpack_require__(/*! ./_collection-strong */ \"./node_modules/core-js/modules/_collection-strong.js\");\n\nvar validate = __webpack_require__(/*! ./_validate-collection */ \"./node_modules/core-js/modules/_validate-collection.js\");\n\nvar MAP = 'Map'; // 23.1 Map Objects\n\nmodule.exports = __webpack_require__(/*! ./_collection */ \"./node_modules/core-js/modules/_collection.js\")(MAP, function (get) {\n  return function Map() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(validate(this, MAP), key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.map.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.acosh.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.acosh.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.3 Math.acosh(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar log1p = __webpack_require__(/*! ./_math-log1p */ \"./node_modules/core-js/modules/_math-log1p.js\");\n\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n$export($export.S + $export.F * !($acosh // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n&& Math.floor($acosh(Number.MAX_VALUE)) == 710 // Tor Browser bug: Math.acosh(Infinity) -> NaN\n&& $acosh(Infinity) == Infinity), 'Math', {\n  acosh: function acosh(x) {\n    return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.acosh.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.asinh.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.asinh.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.5 Math.asinh(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n} // Tor Browser bug: Math.asinh(0) -> -0\n\n\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', {\n  asinh: asinh\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.asinh.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.atanh.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.atanh.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.7 Math.atanh(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $atanh = Math.atanh; // Tor Browser bug: Math.atanh(-0) -> 0\n\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n  atanh: function atanh(x) {\n    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.atanh.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.cbrt.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.cbrt.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.9 Math.cbrt(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar sign = __webpack_require__(/*! ./_math-sign */ \"./node_modules/core-js/modules/_math-sign.js\");\n\n$export($export.S, 'Math', {\n  cbrt: function cbrt(x) {\n    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.cbrt.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.clz32.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.clz32.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.11 Math.clz32(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Math', {\n  clz32: function clz32(x) {\n    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.clz32.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.cosh.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.cosh.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.12 Math.cosh(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar exp = Math.exp;\n$export($export.S, 'Math', {\n  cosh: function cosh(x) {\n    return (exp(x = +x) + exp(-x)) / 2;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.cosh.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.expm1.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.expm1.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.14 Math.expm1(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $expm1 = __webpack_require__(/*! ./_math-expm1 */ \"./node_modules/core-js/modules/_math-expm1.js\");\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', {\n  expm1: $expm1\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.expm1.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.fround.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.fround.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.16 Math.fround(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Math', {\n  fround: __webpack_require__(/*! ./_math-fround */ \"./node_modules/core-js/modules/_math-fround.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.fround.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.hypot.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.hypot.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar abs = Math.abs;\n$export($export.S, 'Math', {\n  hypot: function hypot(value1, value2) {\n    // eslint-disable-line no-unused-vars\n    var sum = 0;\n    var i = 0;\n    var aLen = arguments.length;\n    var larg = 0;\n    var arg, div;\n\n    while (i < aLen) {\n      arg = abs(arguments[i++]);\n\n      if (larg < arg) {\n        div = larg / arg;\n        sum = sum * div * div + 1;\n        larg = arg;\n      } else if (arg > 0) {\n        div = arg / larg;\n        sum += div * div;\n      } else sum += arg;\n    }\n\n    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.hypot.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.imul.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.imul.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.18 Math.imul(x, y)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $imul = Math.imul; // some WebKit versions fails with big numbers, some has wrong arity\n\n$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n  imul: function imul(x, y) {\n    var UINT16 = 0xffff;\n    var xn = +x;\n    var yn = +y;\n    var xl = UINT16 & xn;\n    var yl = UINT16 & yn;\n    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.imul.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.log10.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.log10.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.21 Math.log10(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Math', {\n  log10: function log10(x) {\n    return Math.log(x) * Math.LOG10E;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.log10.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.log1p.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.log1p.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.20 Math.log1p(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Math', {\n  log1p: __webpack_require__(/*! ./_math-log1p */ \"./node_modules/core-js/modules/_math-log1p.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.log1p.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.log2.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.log2.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.22 Math.log2(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Math', {\n  log2: function log2(x) {\n    return Math.log(x) / Math.LN2;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.log2.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.sign.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.sign.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.28 Math.sign(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Math', {\n  sign: __webpack_require__(/*! ./_math-sign */ \"./node_modules/core-js/modules/_math-sign.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.sign.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.sinh.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.sinh.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.30 Math.sinh(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar expm1 = __webpack_require__(/*! ./_math-expm1 */ \"./node_modules/core-js/modules/_math-expm1.js\");\n\nvar exp = Math.exp; // V8 near Chromium 38 has a problem with very small numbers\n\n$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n  sinh: function sinh(x) {\n    return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.sinh.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.tanh.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.tanh.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.33 Math.tanh(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar expm1 = __webpack_require__(/*! ./_math-expm1 */ \"./node_modules/core-js/modules/_math-expm1.js\");\n\nvar exp = Math.exp;\n$export($export.S, 'Math', {\n  tanh: function tanh(x) {\n    var a = expm1(x = +x);\n    var b = expm1(-x);\n    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.tanh.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.math.trunc.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.math.trunc.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.2.2.34 Math.trunc(x)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Math', {\n  trunc: function trunc(it) {\n    return (it > 0 ? Math.floor : Math.ceil)(it);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.math.trunc.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.constructor.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.constructor.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modules/_cof.js\");\n\nvar inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ \"./node_modules/core-js/modules/_inherit-if-required.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/core-js/modules/_object-gopn.js\").f;\n\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\").f;\n\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nvar $trim = __webpack_require__(/*! ./_string-trim */ \"./node_modules/core-js/modules/_string-trim.js\").trim;\n\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype; // Opera ~12 has broken Object#toString\n\nvar BROKEN_COF = cof(__webpack_require__(/*! ./_object-create */ \"./node_modules/core-js/modules/_object-create.js\")(proto)) == NUMBER;\nvar TRIM = ('trim' in String.prototype); // 7.1.3 ToNumber(argument)\n\nvar toNumber = function toNumber(argument) {\n  var it = toPrimitive(argument, false);\n\n  if (typeof it == 'string' && it.length > 2) {\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0);\n    var third, radix, maxCode;\n\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n      switch (it.charCodeAt(1)) {\n        case 66:\n        case 98:\n          radix = 2;\n          maxCode = 49;\n          break;\n        // fast equal /^0b[01]+$/i\n\n        case 79:\n        case 111:\n          radix = 8;\n          maxCode = 55;\n          break;\n        // fast equal /^0o[0-7]+$/i\n\n        default:\n          return +it;\n      }\n\n      for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n        code = digits.charCodeAt(i); // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n\n        if (code < 48 || code > maxCode) return NaN;\n      }\n\n      return parseInt(digits, radix);\n    }\n  }\n\n  return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n  $Number = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value;\n    var that = this;\n    return that instanceof $Number // check on 1..constructor(foo) case\n    && (BROKEN_COF ? fails(function () {\n      proto.valueOf.call(that);\n    }) : cof(that) != NUMBER) ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n  };\n\n  for (var keys = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") ? gOPN(Base) : ( // ES3:\n  'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES6 (in case, if modules with ES6 Number statics required before):\n  'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j = 0, key; keys.length > j; j++) {\n    if (has(Base, key = keys[j]) && !has($Number, key)) {\n      dP($Number, key, gOPD(Base, key));\n    }\n  }\n\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n\n  __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\")(global, NUMBER, $Number);\n}\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.constructor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.epsilon.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.epsilon.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Number', {\n  EPSILON: Math.pow(2, -52)\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.epsilon.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.is-finite.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.is-finite.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar _isFinite = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.is-finite.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.is-integer.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.is-integer.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Number', {\n  isInteger: __webpack_require__(/*! ./_is-integer */ \"./node_modules/core-js/modules/_is-integer.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.is-integer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.is-nan.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.is-nan.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.is-nan.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.is-safe-integer.js":
/*!********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.is-safe-integer.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar isInteger = __webpack_require__(/*! ./_is-integer */ \"./node_modules/core-js/modules/_is-integer.js\");\n\nvar abs = Math.abs;\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.is-safe-integer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.max-safe-integer.js":
/*!*********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.max-safe-integer.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Number', {\n  MAX_SAFE_INTEGER: 0x1fffffffffffff\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.max-safe-integer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.min-safe-integer.js":
/*!*********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.min-safe-integer.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Number', {\n  MIN_SAFE_INTEGER: -0x1fffffffffffff\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.min-safe-integer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.parse-float.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.parse-float.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $parseFloat = __webpack_require__(/*! ./_parse-float */ \"./node_modules/core-js/modules/_parse-float.js\"); // 20.1.2.12 Number.parseFloat(string)\n\n\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', {\n  parseFloat: $parseFloat\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.parse-float.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.parse-int.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.parse-int.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $parseInt = __webpack_require__(/*! ./_parse-int */ \"./node_modules/core-js/modules/_parse-int.js\"); // 20.1.2.13 Number.parseInt(string, radix)\n\n\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', {\n  parseInt: $parseInt\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.parse-int.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.to-fixed.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.to-fixed.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar aNumberValue = __webpack_require__(/*! ./_a-number-value */ \"./node_modules/core-js/modules/_a-number-value.js\");\n\nvar repeat = __webpack_require__(/*! ./_string-repeat */ \"./node_modules/core-js/modules/_string-repeat.js\");\n\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function multiply(n, c) {\n  var i = -1;\n  var c2 = c;\n\n  while (++i < 6) {\n    c2 += n * data[i];\n    data[i] = c2 % 1e7;\n    c2 = floor(c2 / 1e7);\n  }\n};\n\nvar divide = function divide(n) {\n  var i = 6;\n  var c = 0;\n\n  while (--i >= 0) {\n    c += data[i];\n    data[i] = floor(c / n);\n    c = c % n * 1e7;\n  }\n};\n\nvar numToString = function numToString() {\n  var i = 6;\n  var s = '';\n\n  while (--i >= 0) {\n    if (s !== '' || i === 0 || data[i] !== 0) {\n      var t = String(data[i]);\n      s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n    }\n  }\n\n  return s;\n};\n\nvar pow = function pow(x, n, acc) {\n  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function log(x) {\n  var n = 0;\n  var x2 = x;\n\n  while (x2 >= 4096) {\n    n += 12;\n    x2 /= 4096;\n  }\n\n  while (x2 >= 2) {\n    n += 1;\n    x2 /= 2;\n  }\n\n  return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128.0.toFixed(0) !== '1000000000000000128') || !__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  // V8 ~ Android 4.3-\n  $toFixed.call({});\n})), 'Number', {\n  toFixed: function toFixed(fractionDigits) {\n    var x = aNumberValue(this, ERROR);\n    var f = toInteger(fractionDigits);\n    var s = '';\n    var m = ZERO;\n    var e, z, j, k;\n    if (f < 0 || f > 20) throw RangeError(ERROR); // eslint-disable-next-line no-self-compare\n\n    if (x != x) return 'NaN';\n    if (x <= -1e21 || x >= 1e21) return String(x);\n\n    if (x < 0) {\n      s = '-';\n      x = -x;\n    }\n\n    if (x > 1e-21) {\n      e = log(x * pow(2, 69, 1)) - 69;\n      z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n      z *= 0x10000000000000;\n      e = 52 - e;\n\n      if (e > 0) {\n        multiply(0, z);\n        j = f;\n\n        while (j >= 7) {\n          multiply(1e7, 0);\n          j -= 7;\n        }\n\n        multiply(pow(10, j, 1), 0);\n        j = e - 1;\n\n        while (j >= 23) {\n          divide(1 << 23);\n          j -= 23;\n        }\n\n        divide(1 << j);\n        multiply(1, 1);\n        divide(2);\n        m = numToString();\n      } else {\n        multiply(0, z);\n        multiply(1 << -e, 0);\n        m = numToString() + repeat.call(ZERO, f);\n      }\n    }\n\n    if (f > 0) {\n      k = m.length;\n      m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n    } else {\n      m = s + m;\n    }\n\n    return m;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.to-fixed.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.number.to-precision.js":
/*!*****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.number.to-precision.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar aNumberValue = __webpack_require__(/*! ./_a-number-value */ \"./node_modules/core-js/modules/_a-number-value.js\");\n\nvar $toPrecision = 1.0.toPrecision;\n$export($export.P + $export.F * ($fails(function () {\n  // IE7-\n  return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n  // V8 ~ Android 4.3-\n  $toPrecision.call({});\n})), 'Number', {\n  toPrecision: function toPrecision(precision) {\n    var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n    return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.number.to-precision.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.assign.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.assign.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S + $export.F, 'Object', {\n  assign: __webpack_require__(/*! ./_object-assign */ \"./node_modules/core-js/modules/_object-assign.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.assign.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.create.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.create.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\"); // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n\n\n$export($export.S, 'Object', {\n  create: __webpack_require__(/*! ./_object-create */ \"./node_modules/core-js/modules/_object-create.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.create.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.define-properties.js":
/*!**********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.define-properties.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\"); // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n\n\n$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\"), 'Object', {\n  defineProperties: __webpack_require__(/*! ./_object-dps */ \"./node_modules/core-js/modules/_object-dps.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.define-properties.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.define-property.js":
/*!********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.define-property.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\"); // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n\n\n$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\"), 'Object', {\n  defineProperty: __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.define-property.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.freeze.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.freeze.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar meta = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\").onFreeze;\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.freeze.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js":
/*!********************************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js ***!
  \********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar $getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\").f;\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.get-own-property-names.js":
/*!***************************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.get-own-property-names.js ***!
  \***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('getOwnPropertyNames', function () {\n  return __webpack_require__(/*! ./_object-gopn-ext */ \"./node_modules/core-js/modules/_object-gopn-ext.js\").f;\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.get-own-property-names.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.get-prototype-of.js":
/*!*********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.get-prototype-of.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar $getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/core-js/modules/_object-gpo.js\");\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.get-prototype-of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.is-extensible.js":
/*!******************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.is-extensible.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.is-extensible.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.is-frozen.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.is-frozen.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.is-frozen.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.is-sealed.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.is-sealed.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.is-sealed.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.is.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.is.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Object', {\n  is: __webpack_require__(/*! ./_same-value */ \"./node_modules/core-js/modules/_same-value.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.is.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.keys.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.keys.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar $keys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/core-js/modules/_object-keys.js\");\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.keys.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.prevent-extensions.js":
/*!***********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.prevent-extensions.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar meta = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\").onFreeze;\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.prevent-extensions.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.seal.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.seal.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar meta = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\").onFreeze;\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/core-js/modules/_object-sap.js\")('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(meta(it)) : it;\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.seal.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.set-prototype-of.js":
/*!*********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.set-prototype-of.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Object', {\n  setPrototypeOf: __webpack_require__(/*! ./_set-proto */ \"./node_modules/core-js/modules/_set-proto.js\").set\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.set-prototype-of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.object.to-string.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.object.to-string.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 19.1.3.6 Object.prototype.toString()\n\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/core-js/modules/_classof.js\");\n\nvar test = {};\ntest[__webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('toStringTag')] = 'z';\n\nif (test + '' != '[object z]') {\n  __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\")(Object.prototype, 'toString', function toString() {\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.object.to-string.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.parse-float.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.parse-float.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $parseFloat = __webpack_require__(/*! ./_parse-float */ \"./node_modules/core-js/modules/_parse-float.js\"); // 18.2.4 parseFloat(string)\n\n\n$export($export.G + $export.F * (parseFloat != $parseFloat), {\n  parseFloat: $parseFloat\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.parse-float.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.parse-int.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.parse-int.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $parseInt = __webpack_require__(/*! ./_parse-int */ \"./node_modules/core-js/modules/_parse-int.js\"); // 18.2.5 parseInt(string, radix)\n\n\n$export($export.G + $export.F * (parseInt != $parseInt), {\n  parseInt: $parseInt\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.parse-int.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.promise.js":
/*!*****************************************************!*\
  !*** ./node_modules/core-js/modules/es6.promise.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/core-js/modules/_library.js\");\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modules/_ctx.js\");\n\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/core-js/modules/_classof.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/core-js/modules/_an-instance.js\");\n\nvar forOf = __webpack_require__(/*! ./_for-of */ \"./node_modules/core-js/modules/_for-of.js\");\n\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/core-js/modules/_species-constructor.js\");\n\nvar task = __webpack_require__(/*! ./_task */ \"./node_modules/core-js/modules/_task.js\").set;\n\nvar microtask = __webpack_require__(/*! ./_microtask */ \"./node_modules/core-js/modules/_microtask.js\")();\n\nvar newPromiseCapabilityModule = __webpack_require__(/*! ./_new-promise-capability */ \"./node_modules/core-js/modules/_new-promise-capability.js\");\n\nvar perform = __webpack_require__(/*! ./_perform */ \"./node_modules/core-js/modules/_perform.js\");\n\nvar userAgent = __webpack_require__(/*! ./_user-agent */ \"./node_modules/core-js/modules/_user-agent.js\");\n\nvar promiseResolve = __webpack_require__(/*! ./_promise-resolve */ \"./node_modules/core-js/modules/_promise-resolve.js\");\n\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\n\nvar empty = function empty() {\n  /* empty */\n};\n\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n\n    var FakePromise = (promise.constructor = {})[__webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('species')] = function (exec) {\n      exec(empty, empty);\n    }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n\n\n    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n    // we can't detect it synchronously, so just check versions\n    && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1;\n  } catch (e) {\n    /* empty */\n  }\n}(); // helpers\n\nvar isThenable = function isThenable(it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function notify(promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n\n    var run = function run(reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n\n          if (handler === true) result = value;else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n\n    while (chain.length > i) {\n      run(chain[i++]);\n    } // variable length - can't use forEach\n\n\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\n\nvar onUnhandled = function onUnhandled(promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({\n            promise: promise,\n            reason: value\n          });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    }\n\n    promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\n\nvar isUnhandled = function isUnhandled(promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\n\nvar onHandleUnhandled = function onHandleUnhandled(promise) {\n  task.call(global, function () {\n    var handler;\n\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({\n        promise: promise,\n        reason: promise._v\n      });\n    }\n  });\n};\n\nvar $reject = function $reject(value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\n\nvar $resolve = function $resolve(value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = {\n          _w: promise,\n          _d: false\n        }; // wrap\n\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({\n      _w: promise,\n      _d: false\n    }, e); // wrap\n  }\n}; // constructor polyfill\n\n\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  }; // eslint-disable-next-line no-unused-vars\n\n\n  Internal = function Promise(executor) {\n    this._c = []; // <- awaiting reactions\n\n    this._a = undefined; // <- checked in isUnhandled reactions\n\n    this._s = 0; // <- state\n\n    this._d = false; // <- done\n\n    this._v = undefined; // <- value\n\n    this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n\n    this._n = false; // <- notify\n  };\n\n  Internal.prototype = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/core-js/modules/_redefine-all.js\")($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n\n      this._c.push(reaction);\n\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function _catch(onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n\n  OwnPromiseCapability = function OwnPromiseCapability() {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n\n  newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) {\n    return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, {\n  Promise: $Promise\n});\n\n__webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/core-js/modules/_set-to-string-tag.js\")($Promise, PROMISE);\n\n__webpack_require__(/*! ./_set-species */ \"./node_modules/core-js/modules/_set-species.js\")(PROMISE);\n\nWrapper = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\")[PROMISE]; // statics\n\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(/*! ./_iter-detect */ \"./node_modules/core-js/modules/_iter-detect.js\")(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.promise.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.apply.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.apply.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar rApply = (__webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").Reflect || {}).apply;\nvar fApply = Function.apply; // MS Edge argumentsList argument is optional\n\n$export($export.S + $export.F * !__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  rApply(function () {\n    /* empty */\n  });\n}), 'Reflect', {\n  apply: function apply(target, thisArgument, argumentsList) {\n    var T = aFunction(target);\n    var L = anObject(argumentsList);\n    return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.apply.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.construct.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.construct.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar create = __webpack_require__(/*! ./_object-create */ \"./node_modules/core-js/modules/_object-create.js\");\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar bind = __webpack_require__(/*! ./_bind */ \"./node_modules/core-js/modules/_bind.js\");\n\nvar rConstruct = (__webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").Reflect || {}).construct; // MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\n\nvar NEW_TARGET_BUG = fails(function () {\n  function F() {\n    /* empty */\n  }\n\n  return !(rConstruct(function () {\n    /* empty */\n  }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n  rConstruct(function () {\n    /* empty */\n  });\n});\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n  construct: function construct(Target, args\n  /* , newTarget */\n  ) {\n    aFunction(Target);\n    anObject(args);\n    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n    if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n\n    if (Target == newTarget) {\n      // w/o altered newTarget, optimization for 0-4 arguments\n      switch (args.length) {\n        case 0:\n          return new Target();\n\n        case 1:\n          return new Target(args[0]);\n\n        case 2:\n          return new Target(args[0], args[1]);\n\n        case 3:\n          return new Target(args[0], args[1], args[2]);\n\n        case 4:\n          return new Target(args[0], args[1], args[2], args[3]);\n      } // w/o altered newTarget, lot of arguments case\n\n\n      var $args = [null];\n      $args.push.apply($args, args);\n      return new (bind.apply(Target, $args))();\n    } // with altered newTarget, not support built-in constructors\n\n\n    var proto = newTarget.prototype;\n    var instance = create(isObject(proto) ? proto : Object.prototype);\n    var result = Function.apply.call(Target, instance, args);\n    return isObject(result) ? result : instance;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.construct.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.define-property.js":
/*!*********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.define-property.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\"); // MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n\n\n$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  // eslint-disable-next-line no-undef\n  Reflect.defineProperty(dP.f({}, 1, {\n    value: 1\n  }), 1, {\n    value: 2\n  });\n}), 'Reflect', {\n  defineProperty: function defineProperty(target, propertyKey, attributes) {\n    anObject(target);\n    propertyKey = toPrimitive(propertyKey, true);\n    anObject(attributes);\n\n    try {\n      dP.f(target, propertyKey, attributes);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.define-property.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.delete-property.js":
/*!*********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.delete-property.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\").f;\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\n$export($export.S, 'Reflect', {\n  deleteProperty: function deleteProperty(target, propertyKey) {\n    var desc = gOPD(anObject(target), propertyKey);\n    return desc && !desc.configurable ? false : delete target[propertyKey];\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.delete-property.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.enumerate.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.enumerate.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 26.1.5 Reflect.enumerate(target)\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar Enumerate = function Enumerate(iterated) {\n  this._t = anObject(iterated); // target\n\n  this._i = 0; // next index\n\n  var keys = this._k = []; // keys\n\n  var key;\n\n  for (key in iterated) {\n    keys.push(key);\n  }\n};\n\n__webpack_require__(/*! ./_iter-create */ \"./node_modules/core-js/modules/_iter-create.js\")(Enumerate, 'Object', function () {\n  var that = this;\n  var keys = that._k;\n  var key;\n\n  do {\n    if (that._i >= keys.length) return {\n      value: undefined,\n      done: true\n    };\n  } while (!((key = keys[that._i++]) in that._t));\n\n  return {\n    value: key,\n    done: false\n  };\n});\n\n$export($export.S, 'Reflect', {\n  enumerate: function enumerate(target) {\n    return new Enumerate(target);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.enumerate.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js ***!
  \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\n$export($export.S, 'Reflect', {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n    return gOPD.f(anObject(target), propertyKey);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.get-prototype-of.js":
/*!**********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.get-prototype-of.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar getProto = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/core-js/modules/_object-gpo.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\n$export($export.S, 'Reflect', {\n  getPrototypeOf: function getPrototypeOf(target) {\n    return getProto(anObject(target));\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.get-prototype-of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.get.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.get.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\");\n\nvar getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/core-js/modules/_object-gpo.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nfunction get(target, propertyKey\n/* , receiver */\n) {\n  var receiver = arguments.length < 3 ? target : arguments[2];\n  var desc, proto;\n  if (anObject(target) === receiver) return target[propertyKey];\n  if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined;\n  if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', {\n  get: get\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.get.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.has.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.has.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Reflect', {\n  has: function has(target, propertyKey) {\n    return propertyKey in target;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.has.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.is-extensible.js":
/*!*******************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.is-extensible.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.10 Reflect.isExtensible(target)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar $isExtensible = Object.isExtensible;\n$export($export.S, 'Reflect', {\n  isExtensible: function isExtensible(target) {\n    anObject(target);\n    return $isExtensible ? $isExtensible(target) : true;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.is-extensible.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.own-keys.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.own-keys.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.11 Reflect.ownKeys(target)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.S, 'Reflect', {\n  ownKeys: __webpack_require__(/*! ./_own-keys */ \"./node_modules/core-js/modules/_own-keys.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.own-keys.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.prevent-extensions.js":
/*!************************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.prevent-extensions.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.12 Reflect.preventExtensions(target)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar $preventExtensions = Object.preventExtensions;\n$export($export.S, 'Reflect', {\n  preventExtensions: function preventExtensions(target) {\n    anObject(target);\n\n    try {\n      if ($preventExtensions) $preventExtensions(target);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.prevent-extensions.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.set-prototype-of.js":
/*!**********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.set-prototype-of.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar setProto = __webpack_require__(/*! ./_set-proto */ \"./node_modules/core-js/modules/_set-proto.js\");\n\nif (setProto) $export($export.S, 'Reflect', {\n  setPrototypeOf: function setPrototypeOf(target, proto) {\n    setProto.check(target, proto);\n\n    try {\n      setProto.set(target, proto);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.set-prototype-of.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.reflect.set.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.reflect.set.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\");\n\nvar getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/core-js/modules/_object-gpo.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/modules/_property-desc.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nfunction set(target, propertyKey, V\n/* , receiver */\n) {\n  var receiver = arguments.length < 4 ? target : arguments[3];\n  var ownDesc = gOPD.f(anObject(target), propertyKey);\n  var existingDescriptor, proto;\n\n  if (!ownDesc) {\n    if (isObject(proto = getPrototypeOf(target))) {\n      return set(proto, propertyKey, V, receiver);\n    }\n\n    ownDesc = createDesc(0);\n  }\n\n  if (has(ownDesc, 'value')) {\n    if (ownDesc.writable === false || !isObject(receiver)) return false;\n\n    if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n      if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n      existingDescriptor.value = V;\n      dP.f(receiver, propertyKey, existingDescriptor);\n    } else dP.f(receiver, propertyKey, createDesc(0, V));\n\n    return true;\n  }\n\n  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', {\n  set: set\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.reflect.set.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.constructor.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.constructor.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ \"./node_modules/core-js/modules/_inherit-if-required.js\");\n\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f;\n\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/core-js/modules/_object-gopn.js\").f;\n\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_modules/core-js/modules/_is-regexp.js\");\n\nvar $flags = __webpack_require__(/*! ./_flags */ \"./node_modules/core-js/modules/_flags.js\");\n\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g; // \"new\" creates a new object, old webkit buggy here\n\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  re2[__webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\")('match')] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match\n\n  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n  $RegExp = function RegExp(p, f) {\n    var tiRE = this instanceof $RegExp;\n    var piRE = isRegExp(p);\n    var fiU = f === undefined;\n    return !tiRE && piRE && p.constructor === $RegExp && fiU ? p : inheritIfRequired(CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f), tiRE ? this : proto, $RegExp);\n  };\n\n  var proxy = function proxy(key) {\n    key in $RegExp || dP($RegExp, key, {\n      configurable: true,\n      get: function get() {\n        return Base[key];\n      },\n      set: function set(it) {\n        Base[key] = it;\n      }\n    });\n  };\n\n  for (var keys = gOPN(Base), i = 0; keys.length > i;) {\n    proxy(keys[i++]);\n  }\n\n  proto.constructor = $RegExp;\n  $RegExp.prototype = proto;\n\n  __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\")(global, 'RegExp', $RegExp);\n}\n\n__webpack_require__(/*! ./_set-species */ \"./node_modules/core-js/modules/_set-species.js\")('RegExp');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.constructor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.exec.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.exec.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/core-js/modules/_regexp-exec.js\");\n\n__webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\")({\n  target: 'RegExp',\n  proto: true,\n  forced: regexpExec !== /./.exec\n}, {\n  exec: regexpExec\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.exec.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.flags.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.flags.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\") && /./g.flags != 'g') __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\").f(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: __webpack_require__(/*! ./_flags */ \"./node_modules/core-js/modules/_flags.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.flags.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.match.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.match.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/core-js/modules/_advance-string-index.js\");\n\nvar regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/core-js/modules/_regexp-exec-abstract.js\"); // @@match logic\n\n\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/core-js/modules/_fix-re-wks.js\")('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n  return [// `String.prototype.match` method\n  // https://tc39.github.io/ecma262/#sec-string.prototype.match\n  function match(regexp) {\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  }, // `RegExp.prototype[@@match]` method\n  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n  function (regexp) {\n    var res = maybeCallNative($match, regexp, this);\n    if (res.done) return res.value;\n    var rx = anObject(regexp);\n    var S = String(this);\n    if (!rx.global) return regExpExec(rx, S);\n    var fullUnicode = rx.unicode;\n    rx.lastIndex = 0;\n    var A = [];\n    var n = 0;\n    var result;\n\n    while ((result = regExpExec(rx, S)) !== null) {\n      var matchStr = String(result[0]);\n      A[n] = matchStr;\n      if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      n++;\n    }\n\n    return n === 0 ? null : A;\n  }];\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.match.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.replace.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.replace.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/core-js/modules/_to-integer.js\");\n\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/core-js/modules/_advance-string-index.js\");\n\nvar regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/core-js/modules/_regexp-exec-abstract.js\");\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function maybeToString(it) {\n  return it === undefined ? it : String(it);\n}; // @@replace logic\n\n\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/core-js/modules/_fix-re-wks.js\")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n  return [// `String.prototype.replace` method\n  // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n  function replace(searchValue, replaceValue) {\n    var O = defined(this);\n    var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue);\n  }, // `RegExp.prototype[@@replace]` method\n  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n  function (regexp, replaceValue) {\n    var res = maybeCallNative($replace, regexp, this, replaceValue);\n    if (res.done) return res.value;\n    var rx = anObject(regexp);\n    var S = String(this);\n    var functionalReplace = typeof replaceValue === 'function';\n    if (!functionalReplace) replaceValue = String(replaceValue);\n    var global = rx.global;\n\n    if (global) {\n      var fullUnicode = rx.unicode;\n      rx.lastIndex = 0;\n    }\n\n    var results = [];\n\n    while (true) {\n      var result = regExpExec(rx, S);\n      if (result === null) break;\n      results.push(result);\n      if (!global) break;\n      var matchStr = String(result[0]);\n      if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n    }\n\n    var accumulatedResult = '';\n    var nextSourcePosition = 0;\n\n    for (var i = 0; i < results.length; i++) {\n      result = results[i];\n      var matched = String(result[0]);\n      var position = max(min(toInteger(result.index), S.length), 0);\n      var captures = []; // NOTE: This is equivalent to\n      //   captures = result.slice(1).map(maybeToString)\n      // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n      // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n      // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n\n      for (var j = 1; j < result.length; j++) {\n        captures.push(maybeToString(result[j]));\n      }\n\n      var namedCaptures = result.groups;\n\n      if (functionalReplace) {\n        var replacerArgs = [matched].concat(captures, position, S);\n        if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n        var replacement = String(replaceValue.apply(undefined, replacerArgs));\n      } else {\n        replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n      }\n\n      if (position >= nextSourcePosition) {\n        accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n        nextSourcePosition = position + matched.length;\n      }\n    }\n\n    return accumulatedResult + S.slice(nextSourcePosition);\n  }]; // https://tc39.github.io/ecma262/#sec-getsubstitution\n\n  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n    var tailPos = position + matched.length;\n    var m = captures.length;\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n\n    if (namedCaptures !== undefined) {\n      namedCaptures = toObject(namedCaptures);\n      symbols = SUBSTITUTION_SYMBOLS;\n    }\n\n    return $replace.call(replacement, symbols, function (match, ch) {\n      var capture;\n\n      switch (ch.charAt(0)) {\n        case '$':\n          return '$';\n\n        case '&':\n          return matched;\n\n        case '`':\n          return str.slice(0, position);\n\n        case \"'\":\n          return str.slice(tailPos);\n\n        case '<':\n          capture = namedCaptures[ch.slice(1, -1)];\n          break;\n\n        default:\n          // \\d\\d?\n          var n = +ch;\n          if (n === 0) return match;\n\n          if (n > m) {\n            var f = floor(n / 10);\n            if (f === 0) return match;\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n            return match;\n          }\n\n          capture = captures[n - 1];\n      }\n\n      return capture === undefined ? '' : capture;\n    });\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.replace.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.search.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.search.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar sameValue = __webpack_require__(/*! ./_same-value */ \"./node_modules/core-js/modules/_same-value.js\");\n\nvar regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/core-js/modules/_regexp-exec-abstract.js\"); // @@search logic\n\n\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/core-js/modules/_fix-re-wks.js\")('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n  return [// `String.prototype.search` method\n  // https://tc39.github.io/ecma262/#sec-string.prototype.search\n  function search(regexp) {\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  }, // `RegExp.prototype[@@search]` method\n  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n  function (regexp) {\n    var res = maybeCallNative($search, regexp, this);\n    if (res.done) return res.value;\n    var rx = anObject(regexp);\n    var S = String(this);\n    var previousLastIndex = rx.lastIndex;\n    if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n    var result = regExpExec(rx, S);\n    if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n    return result === null ? -1 : result.index;\n  }];\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.search.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.split.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.split.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_modules/core-js/modules/_is-regexp.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/core-js/modules/_species-constructor.js\");\n\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/core-js/modules/_advance-string-index.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/core-js/modules/_regexp-exec-abstract.js\");\n\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/core-js/modules/_regexp-exec.js\");\n\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff; // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n\nvar SUPPORTS_Y = !fails(function () {\n  RegExp(MAX_UINT32, 'y');\n}); // @@split logic\n\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/core-js/modules/_fix-re-wks.js\")('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n  var internalSplit;\n\n  if ('abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH]) {\n    // based on es5-shim implementation, need to rework it\n    internalSplit = function internalSplit(separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return []; // If `separator` is not a regex, use native split\n\n      if (!isRegExp(separator)) return $split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; // Make `global` and avoid `lastIndex` issues by working with a copy\n\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var match, lastIndex, lastLength;\n\n      while (match = regexpExec.call(separatorCopy, string)) {\n        lastIndex = separatorCopy[LAST_INDEX];\n\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    }; // Chakra, V8\n\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    internalSplit = function internalSplit(separator, limit) {\n      return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n    };\n  } else {\n    internalSplit = $split;\n  }\n\n  return [// `String.prototype.split` method\n  // https://tc39.github.io/ecma262/#sec-string.prototype.split\n  function split(separator, limit) {\n    var O = defined(this);\n    var splitter = separator == undefined ? undefined : separator[SPLIT];\n    return splitter !== undefined ? splitter.call(separator, O, limit) : internalSplit.call(String(O), separator, limit);\n  }, // `RegExp.prototype[@@split]` method\n  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n  //\n  // NOTE: This cannot be properly polyfilled in engines that don't support\n  // the 'y' flag.\n  function (regexp, limit) {\n    var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n    if (res.done) return res.value;\n    var rx = anObject(regexp);\n    var S = String(this);\n    var C = speciesConstructor(rx, RegExp);\n    var unicodeMatching = rx.unicode;\n    var flags = (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '') + (rx.unicode ? 'u' : '') + (SUPPORTS_Y ? 'y' : 'g'); // ^(? + rx + ) is needed, in combination with some S slicing, to\n    // simulate the 'y' flag.\n\n    var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n    var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n    if (lim === 0) return [];\n    if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n    var p = 0;\n    var q = 0;\n    var A = [];\n\n    while (q < S.length) {\n      splitter.lastIndex = SUPPORTS_Y ? q : 0;\n      var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n      var e;\n\n      if (z === null || (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p) {\n        q = advanceStringIndex(S, q, unicodeMatching);\n      } else {\n        A.push(S.slice(p, q));\n        if (A.length === lim) return A;\n\n        for (var i = 1; i <= z.length - 1; i++) {\n          A.push(z[i]);\n          if (A.length === lim) return A;\n        }\n\n        q = p = e;\n      }\n    }\n\n    A.push(S.slice(p));\n    return A;\n  }];\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.split.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.regexp.to-string.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.regexp.to-string.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n__webpack_require__(/*! ./es6.regexp.flags */ \"./node_modules/core-js/modules/es6.regexp.flags.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar $flags = __webpack_require__(/*! ./_flags */ \"./node_modules/core-js/modules/_flags.js\");\n\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\");\n\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function define(fn) {\n  __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\")(RegExp.prototype, TO_STRING, fn, true);\n}; // 21.2.5.14 RegExp.prototype.toString()\n\n\nif (__webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return $toString.call({\n    source: 'a',\n    flags: 'b'\n  }) != '/a/b';\n})) {\n  define(function toString() {\n    var R = anObject(this);\n    return '/'.concat(R.source, '/', 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n  }); // FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n  define(function toString() {\n    return $toString.call(this);\n  });\n}\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.regexp.to-string.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.set.js":
/*!*************************************************!*\
  !*** ./node_modules/core-js/modules/es6.set.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar strong = __webpack_require__(/*! ./_collection-strong */ \"./node_modules/core-js/modules/_collection-strong.js\");\n\nvar validate = __webpack_require__(/*! ./_validate-collection */ \"./node_modules/core-js/modules/_validate-collection.js\");\n\nvar SET = 'Set'; // 23.2 Set Objects\n\nmodule.exports = __webpack_require__(/*! ./_collection */ \"./node_modules/core-js/modules/_collection.js\")(SET, function (get) {\n  return function Set() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.set.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.anchor.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.anchor.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.2 String.prototype.anchor(name)\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('anchor', function (createHTML) {\n  return function anchor(name) {\n    return createHTML(this, 'a', 'name', name);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.anchor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.big.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.big.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.3 String.prototype.big()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('big', function (createHTML) {\n  return function big() {\n    return createHTML(this, 'big', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.big.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.blink.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.blink.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.4 String.prototype.blink()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('blink', function (createHTML) {\n  return function blink() {\n    return createHTML(this, 'blink', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.blink.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.bold.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.bold.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.5 String.prototype.bold()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('bold', function (createHTML) {\n  return function bold() {\n    return createHTML(this, 'b', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.bold.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.code-point-at.js":
/*!******************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.code-point-at.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $at = __webpack_require__(/*! ./_string-at */ \"./node_modules/core-js/modules/_string-at.js\")(false);\n\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.code-point-at.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.ends-with.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.ends-with.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar context = __webpack_require__(/*! ./_string-context */ \"./node_modules/core-js/modules/_string-context.js\");\n\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ \"./node_modules/core-js/modules/_fails-is-regexp.js\")(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString\n  /* , endPosition = @length */\n  ) {\n    var that = context(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n    var search = String(searchString);\n    return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.ends-with.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.fixed.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.fixed.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.6 String.prototype.fixed()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('fixed', function (createHTML) {\n  return function fixed() {\n    return createHTML(this, 'tt', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.fixed.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.fontcolor.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.fontcolor.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.7 String.prototype.fontcolor(color)\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('fontcolor', function (createHTML) {\n  return function fontcolor(color) {\n    return createHTML(this, 'font', 'color', color);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.fontcolor.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.fontsize.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.fontsize.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.8 String.prototype.fontsize(size)\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('fontsize', function (createHTML) {\n  return function fontsize(size) {\n    return createHTML(this, 'font', 'size', size);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.fontsize.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.from-code-point.js":
/*!********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.from-code-point.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/core-js/modules/_to-absolute-index.js\");\n\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint; // length should be 1, old FF problem\n\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) {\n    // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));\n    }\n\n    return res.join('');\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.from-code-point.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.includes.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.includes.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar context = __webpack_require__(/*! ./_string-context */ \"./node_modules/core-js/modules/_string-context.js\");\n\nvar INCLUDES = 'includes';\n$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ \"./node_modules/core-js/modules/_fails-is-regexp.js\")(INCLUDES), 'String', {\n  includes: function includes(searchString\n  /* , position = 0 */\n  ) {\n    return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.includes.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.italics.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.italics.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.9 String.prototype.italics()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('italics', function (createHTML) {\n  return function italics() {\n    return createHTML(this, 'i', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.italics.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.iterator.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.iterator.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $at = __webpack_require__(/*! ./_string-at */ \"./node_modules/core-js/modules/_string-at.js\")(true); // 21.1.3.27 String.prototype[@@iterator]()\n\n\n__webpack_require__(/*! ./_iter-define */ \"./node_modules/core-js/modules/_iter-define.js\")(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n\n  this._i = 0; // next index\n  // 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var index = this._i;\n  var point;\n  if (index >= O.length) return {\n    value: undefined,\n    done: true\n  };\n  point = $at(O, index);\n  this._i += point.length;\n  return {\n    value: point,\n    done: false\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.iterator.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.link.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.link.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.10 String.prototype.link(url)\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('link', function (createHTML) {\n  return function link(url) {\n    return createHTML(this, 'a', 'href', url);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.link.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.raw.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.raw.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw);\n    var len = toLength(tpl.length);\n    var aLen = arguments.length;\n    var res = [];\n    var i = 0;\n\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < aLen) res.push(String(arguments[i]));\n    }\n\n    return res.join('');\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.raw.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.repeat.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.repeat.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: __webpack_require__(/*! ./_string-repeat */ \"./node_modules/core-js/modules/_string-repeat.js\")\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.repeat.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.small.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.small.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.11 String.prototype.small()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('small', function (createHTML) {\n  return function small() {\n    return createHTML(this, 'small', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.small.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.starts-with.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.starts-with.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar context = __webpack_require__(/*! ./_string-context */ \"./node_modules/core-js/modules/_string-context.js\");\n\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ \"./node_modules/core-js/modules/_fails-is-regexp.js\")(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString\n  /* , position = 0 */\n  ) {\n    var that = context(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.starts-with.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.strike.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.strike.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.12 String.prototype.strike()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('strike', function (createHTML) {\n  return function strike() {\n    return createHTML(this, 'strike', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.strike.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.sub.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.sub.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.13 String.prototype.sub()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('sub', function (createHTML) {\n  return function sub() {\n    return createHTML(this, 'sub', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.sub.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.sup.js":
/*!********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.sup.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // B.2.3.14 String.prototype.sup()\n\n__webpack_require__(/*! ./_string-html */ \"./node_modules/core-js/modules/_string-html.js\")('sup', function (createHTML) {\n  return function sup() {\n    return createHTML(this, 'sup', '', '');\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.sup.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.string.trim.js":
/*!*********************************************************!*\
  !*** ./node_modules/core-js/modules/es6.string.trim.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // 21.1.3.25 String.prototype.trim()\n\n__webpack_require__(/*! ./_string-trim */ \"./node_modules/core-js/modules/_string-trim.js\")('trim', function ($trim) {\n  return function trim() {\n    return $trim(this, 3);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.string.trim.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.symbol.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/es6.symbol.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // ECMAScript 6 symbols shim\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modules/_has.js\");\n\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/modules/_descriptors.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nvar META = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\").KEY;\n\nvar $fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\");\n\nvar shared = __webpack_require__(/*! ./_shared */ \"./node_modules/core-js/modules/_shared.js\");\n\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/core-js/modules/_set-to-string-tag.js\");\n\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modules/_uid.js\");\n\nvar wks = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\");\n\nvar wksExt = __webpack_require__(/*! ./_wks-ext */ \"./node_modules/core-js/modules/_wks-ext.js\");\n\nvar wksDefine = __webpack_require__(/*! ./_wks-define */ \"./node_modules/core-js/modules/_wks-define.js\");\n\nvar enumKeys = __webpack_require__(/*! ./_enum-keys */ \"./node_modules/core-js/modules/_enum-keys.js\");\n\nvar isArray = __webpack_require__(/*! ./_is-array */ \"./node_modules/core-js/modules/_is-array.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/core-js/modules/_to-primitive.js\");\n\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/core-js/modules/_property-desc.js\");\n\nvar _create = __webpack_require__(/*! ./_object-create */ \"./node_modules/core-js/modules/_object-create.js\");\n\nvar gOPNExt = __webpack_require__(/*! ./_object-gopn-ext */ \"./node_modules/core-js/modules/_object-gopn-ext.js\");\n\nvar $GOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\");\n\nvar $GOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/core-js/modules/_object-gops.js\");\n\nvar $DP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/modules/_object-dp.js\");\n\nvar $keys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/core-js/modules/_object-keys.js\");\n\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\n\nvar _stringify = $JSON && $JSON.stringify;\n\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;\nvar QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function get() {\n      return dP(this, 'a', {\n        value: 7\n      }).a;\n    }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function wrap(tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) {\n  return _typeof(it) == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, {\n        enumerable: createDesc(0, false)\n      });\n    }\n\n    return setSymbolDesc(it, key, D);\n  }\n\n  return dP(it, key, D);\n};\n\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n\n  while (l > i) {\n    $defineProperty(it, key = keys[i++], P[key]);\n  }\n\n  return it;\n};\n\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  }\n\n  return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  }\n\n  return result;\n}; // 19.4.1.1 Symbol([description])\n\n\nif (!USE_NATIVE) {\n  $Symbol = function _Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n\n    var $set = function $set(value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, {\n      configurable: true,\n      set: $set\n    });\n    return wrap(tag);\n  };\n\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  __webpack_require__(/*! ./_object-gopn */ \"./node_modules/core-js/modules/_object-gopn.js\").f = gOPNExt.f = $getOwnPropertyNames;\n  __webpack_require__(/*! ./_object-pie */ \"./node_modules/core-js/modules/_object-pie.js\").f = $propertyIsEnumerable;\n  $GOPS.f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !__webpack_require__(/*! ./_library */ \"./node_modules/core-js/modules/_library.js\")) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, {\n  Symbol: $Symbol\n});\n\nfor (var es6Symbols = // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {\n  wks(es6Symbols[j++]);\n}\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) {\n  wksDefine(wellKnownSymbols[k++]);\n}\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function _for(key) {\n    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n\n    for (var key in SymbolRegistry) {\n      if (SymbolRegistry[key] === sym) return key;\n    }\n  },\n  useSetter: function useSetter() {\n    setter = true;\n  },\n  useSimple: function useSimple() {\n    setter = false;\n  }\n});\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n}); // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n\nvar FAILS_ON_PRIMITIVES = $fails(function () {\n  $GOPS.f(1);\n});\n$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {\n  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n    return $GOPS.f(toObject(it));\n  }\n}); // 24.3.2 JSON.stringify(value [, replacer [, space]])\n\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol(); // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n\n  return _stringify([S]) != '[null]' || _stringify({\n    a: S\n  }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n\n    while (arguments.length > i) {\n      args.push(arguments[i++]);\n    }\n\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n\n    if (!isArray(replacer)) replacer = function replacer(key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n}); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag]\n\nsetToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag]\n\nsetToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag]\n\nsetToStringTag(global.JSON, 'JSON', true);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.symbol.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.array-buffer.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.array-buffer.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $typed = __webpack_require__(/*! ./_typed */ \"./node_modules/core-js/modules/_typed.js\");\n\nvar buffer = __webpack_require__(/*! ./_typed-buffer */ \"./node_modules/core-js/modules/_typed-buffer.js\");\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/core-js/modules/_an-object.js\");\n\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/core-js/modules/_to-absolute-index.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar ArrayBuffer = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\").ArrayBuffer;\n\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/core-js/modules/_species-constructor.js\");\n\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), {\n  ArrayBuffer: $ArrayBuffer\n});\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n  // 24.1.3.1 ArrayBuffer.isView(arg)\n  isView: function isView(it) {\n    return $isView && $isView(it) || isObject(it) && VIEW in it;\n  }\n});\n$export($export.P + $export.U + $export.F * __webpack_require__(/*! ./_fails */ \"./node_modules/core-js/modules/_fails.js\")(function () {\n  return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n  // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n  slice: function slice(start, end) {\n    if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n\n    var len = anObject(this).byteLength;\n    var first = toAbsoluteIndex(start, len);\n    var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n    var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n    var viewS = new $DataView(this);\n    var viewT = new $DataView(result);\n    var index = 0;\n\n    while (first < fin) {\n      viewT.setUint8(index++, viewS.getUint8(first++));\n    }\n\n    return result;\n  }\n});\n\n__webpack_require__(/*! ./_set-species */ \"./node_modules/core-js/modules/_set-species.js\")(ARRAY_BUFFER);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.array-buffer.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.data-view.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.data-view.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\n$export($export.G + $export.W + $export.F * !__webpack_require__(/*! ./_typed */ \"./node_modules/core-js/modules/_typed.js\").ABV, {\n  DataView: __webpack_require__(/*! ./_typed-buffer */ \"./node_modules/core-js/modules/_typed-buffer.js\").DataView\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.data-view.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.float32-array.js":
/*!*****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.float32-array.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Float32', 4, function (init) {\n  return function Float32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.float32-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.float64-array.js":
/*!*****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.float64-array.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Float64', 8, function (init) {\n  return function Float64Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.float64-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.int16-array.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.int16-array.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Int16', 2, function (init) {\n  return function Int16Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.int16-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.int32-array.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.int32-array.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Int32', 4, function (init) {\n  return function Int32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.int32-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.int8-array.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.int8-array.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Int8', 1, function (init) {\n  return function Int8Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.int8-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.uint16-array.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.uint16-array.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Uint16', 2, function (init) {\n  return function Uint16Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.uint16-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.uint32-array.js":
/*!****************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.uint32-array.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Uint32', 4, function (init) {\n  return function Uint32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.uint32-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.uint8-array.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.uint8-array.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Uint8', 1, function (init) {\n  return function Uint8Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.uint8-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js":
/*!***********************************************************************!*\
  !*** ./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules/_typed-array.js\")('Uint8', 1, function (init) {\n  return function Uint8ClampedArray(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n}, true);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.weak-map.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.weak-map.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar each = __webpack_require__(/*! ./_array-methods */ \"./node_modules/core-js/modules/_array-methods.js\")(0);\n\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nvar meta = __webpack_require__(/*! ./_meta */ \"./node_modules/core-js/modules/_meta.js\");\n\nvar assign = __webpack_require__(/*! ./_object-assign */ \"./node_modules/core-js/modules/_object-assign.js\");\n\nvar weak = __webpack_require__(/*! ./_collection-weak */ \"./node_modules/core-js/modules/_collection-weak.js\");\n\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/core-js/modules/_is-object.js\");\n\nvar validate = __webpack_require__(/*! ./_validate-collection */ \"./node_modules/core-js/modules/_validate-collection.js\");\n\nvar NATIVE_WEAK_MAP = __webpack_require__(/*! ./_validate-collection */ \"./node_modules/core-js/modules/_validate-collection.js\");\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function wrapper(get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n}; // 23.3 WeakMap Objects\n\nvar $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ \"./node_modules/core-js/modules/_collection.js\")(WEAK_MAP, wrapper, methods, weak, true, true); // IE11 WeakMap frozen keys fix\n\n\nif (NATIVE_WEAK_MAP && IS_IE11) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n\n        var result = this._f[key](a, b);\n\n        return key == 'set' ? this : result; // store all the rest on native weakmap\n      }\n\n      return method.call(this, a, b);\n    });\n  });\n}\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.weak-map.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es6.weak-set.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/es6.weak-set.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar weak = __webpack_require__(/*! ./_collection-weak */ \"./node_modules/core-js/modules/_collection-weak.js\");\n\nvar validate = __webpack_require__(/*! ./_validate-collection */ \"./node_modules/core-js/modules/_validate-collection.js\");\n\nvar WEAK_SET = 'WeakSet'; // 23.4 WeakSet Objects\n\n__webpack_require__(/*! ./_collection */ \"./node_modules/core-js/modules/_collection.js\")(WEAK_SET, function (get) {\n  return function WeakSet() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(validate(this, WEAK_SET), value, true);\n  }\n}, weak, false, true);\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es6.weak-set.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.array.flat-map.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.array.flat-map.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar flattenIntoArray = __webpack_require__(/*! ./_flatten-into-array */ \"./node_modules/core-js/modules/_flatten-into-array.js\");\n\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/core-js/modules/_to-object.js\");\n\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/core-js/modules/_to-length.js\");\n\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/core-js/modules/_a-function.js\");\n\nvar arraySpeciesCreate = __webpack_require__(/*! ./_array-species-create */ \"./node_modules/core-js/modules/_array-species-create.js\");\n\n$export($export.P, 'Array', {\n  flatMap: function flatMap(callbackfn\n  /* , thisArg */\n  ) {\n    var O = toObject(this);\n    var sourceLen, A;\n    aFunction(callbackfn);\n    sourceLen = toLength(O.length);\n    A = arraySpeciesCreate(O, 0);\n    flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);\n    return A;\n  }\n});\n\n__webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/core-js/modules/_add-to-unscopables.js\")('flatMap');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.array.flat-map.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.array.includes.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.array.includes.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // https://github.com/tc39/Array.prototype.includes\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $includes = __webpack_require__(/*! ./_array-includes */ \"./node_modules/core-js/modules/_array-includes.js\")(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el\n  /* , fromIndex = 0 */\n  ) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/core-js/modules/_add-to-unscopables.js\")('includes');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.array.includes.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.object.entries.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.object.entries.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $entries = __webpack_require__(/*! ./_object-to-array */ \"./node_modules/core-js/modules/_object-to-array.js\")(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.object.entries.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js ***!
  \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar ownKeys = __webpack_require__(/*! ./_own-keys */ \"./node_modules/core-js/modules/_own-keys.js\");\n\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/core-js/modules/_to-iobject.js\");\n\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/core-js/modules/_object-gopd.js\");\n\nvar createProperty = __webpack_require__(/*! ./_create-property */ \"./node_modules/core-js/modules/_create-property.js\");\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n\n    return result;\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.object.values.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es7.object.values.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $values = __webpack_require__(/*! ./_object-to-array */ \"./node_modules/core-js/modules/_object-to-array.js\")(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.object.values.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.promise.finally.js":
/*!*************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.promise.finally.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// https://github.com/tc39/proposal-promise-finally\n\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/modules/_core.js\");\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/core-js/modules/_species-constructor.js\");\n\nvar promiseResolve = __webpack_require__(/*! ./_promise-resolve */ \"./node_modules/core-js/modules/_promise-resolve.js\");\n\n$export($export.P + $export.R, 'Promise', {\n  'finally': function _finally(onFinally) {\n    var C = speciesConstructor(this, core.Promise || global.Promise);\n    var isFunction = typeof onFinally == 'function';\n    return this.then(isFunction ? function (x) {\n      return promiseResolve(C, onFinally()).then(function () {\n        return x;\n      });\n    } : onFinally, isFunction ? function (e) {\n      return promiseResolve(C, onFinally()).then(function () {\n        throw e;\n      });\n    } : onFinally);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.promise.finally.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.string.pad-end.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.string.pad-end.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // https://github.com/tc39/proposal-string-pad-start-end\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $pad = __webpack_require__(/*! ./_string-pad */ \"./node_modules/core-js/modules/_string-pad.js\");\n\nvar userAgent = __webpack_require__(/*! ./_user-agent */ \"./node_modules/core-js/modules/_user-agent.js\"); // https://github.com/zloirock/core-js/issues/280\n\n\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n  padEnd: function padEnd(maxLength\n  /* , fillString = ' ' */\n  ) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.string.pad-end.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.string.pad-start.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.string.pad-start.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // https://github.com/tc39/proposal-string-pad-start-end\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $pad = __webpack_require__(/*! ./_string-pad */ \"./node_modules/core-js/modules/_string-pad.js\");\n\nvar userAgent = __webpack_require__(/*! ./_user-agent */ \"./node_modules/core-js/modules/_user-agent.js\"); // https://github.com/zloirock/core-js/issues/280\n\n\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n  padStart: function padStart(maxLength\n  /* , fillString = ' ' */\n  ) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.string.pad-start.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.string.trim-left.js":
/*!**************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.string.trim-left.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\n__webpack_require__(/*! ./_string-trim */ \"./node_modules/core-js/modules/_string-trim.js\")('trimLeft', function ($trim) {\n  return function trimLeft() {\n    return $trim(this, 1);\n  };\n}, 'trimStart');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.string.trim-left.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.string.trim-right.js":
/*!***************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.string.trim-right.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval(" // https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\n__webpack_require__(/*! ./_string-trim */ \"./node_modules/core-js/modules/_string-trim.js\")('trimRight', function ($trim) {\n  return function trimRight() {\n    return $trim(this, 2);\n  };\n}, 'trimEnd');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.string.trim-right.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/es7.symbol.async-iterator.js":
/*!*******************************************************************!*\
  !*** ./node_modules/core-js/modules/es7.symbol.async-iterator.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ./_wks-define */ \"./node_modules/core-js/modules/_wks-define.js\")('asyncIterator');\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/es7.symbol.async-iterator.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/web.dom.iterable.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/web.dom.iterable.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $iterators = __webpack_require__(/*! ./es6.array.iterator */ \"./node_modules/core-js/modules/es6.array.iterator.js\");\n\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/core-js/modules/_object-keys.js\");\n\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/core-js/modules/_redefine.js\");\n\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/core-js/modules/_hide.js\");\n\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/core-js/modules/_iterators.js\");\n\nvar wks = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/modules/_wks.js\");\n\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\nvar DOMIterables = {\n  CSSRuleList: true,\n  // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true,\n  // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true,\n  // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) {\n      if (!proto[key]) redefine(proto, key, $iterators[key], true);\n    }\n  }\n}\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/web.dom.iterable.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/web.immediate.js":
/*!*******************************************************!*\
  !*** ./node_modules/core-js/modules/web.immediate.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar $task = __webpack_require__(/*! ./_task */ \"./node_modules/core-js/modules/_task.js\");\n\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/web.immediate.js?");

/***/ }),

/***/ "./node_modules/core-js/modules/web.timers.js":
/*!****************************************************!*\
  !*** ./node_modules/core-js/modules/web.timers.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// ie9- setTimeout & setInterval additional parameters fix\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js/modules/_global.js\");\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-js/modules/_export.js\");\n\nvar userAgent = __webpack_require__(/*! ./_user-agent */ \"./node_modules/core-js/modules/_user-agent.js\");\n\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\n\nvar wrap = function wrap(set) {\n  return function (fn, time\n  /* , ...args */\n  ) {\n    var boundArgs = arguments.length > 2;\n    var args = boundArgs ? slice.call(arguments, 2) : false;\n    return set(boundArgs ? function () {\n      // eslint-disable-next-line no-new-func\n      (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n    } : fn, time);\n  };\n};\n\n$export($export.G + $export.B + $export.F * MSIE, {\n  setTimeout: wrap(global.setTimeout),\n  setInterval: wrap(global.setInterval)\n});\n\n//# sourceURL=webpack://rup/./node_modules/core-js/modules/web.timers.js?");

/***/ }),

/***/ "./node_modules/core-js/web/index.js":
/*!*******************************************!*\
  !*** ./node_modules/core-js/web/index.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! ../modules/web.timers */ \"./node_modules/core-js/modules/web.timers.js\");\n\n__webpack_require__(/*! ../modules/web.immediate */ \"./node_modules/core-js/modules/web.immediate.js\");\n\n__webpack_require__(/*! ../modules/web.dom.iterable */ \"./node_modules/core-js/modules/web.dom.iterable.js\");\n\nmodule.exports = __webpack_require__(/*! ../modules/_core */ \"./node_modules/core-js/modules/_core.js\");\n\n//# sourceURL=webpack://rup/./node_modules/core-js/web/index.js?");

/***/ }),

/***/ "./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs":
/*!**********************************************************************!*\
  !*** ./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs ***!
  \**********************************************************************/
/*! exports provided: default */
/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n/* harmony import */ var datatables_net__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.js\");\n/*! DataTables Bootstrap 4 integration\n * ©2011-2017 SpryMedia Ltd - datatables.net/license\n */\n\n\n\n\n// Allow reassignment of the $ variable\nlet $ = jquery__WEBPACK_IMPORTED_MODULE_0__;\n\n\n/**\n * DataTables integration for Bootstrap 4. This requires Bootstrap 4 and\n * DataTables 1.10 or newer.\n *\n * This file sets the defaults and adds options to DataTables to style its\n * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap\n * for further information.\n */\n\n/* Set the defaults for DataTables initialisation */\n$.extend( true, datatables_net__WEBPACK_IMPORTED_MODULE_1__.defaults, {\n\tdom:\n\t\t\"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>\" +\n\t\t\"<'row'<'col-sm-12'tr>>\" +\n\t\t\"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>\",\n\trenderer: 'bootstrap'\n} );\n\n\n/* Default class modification */\n$.extend( datatables_net__WEBPACK_IMPORTED_MODULE_1__.ext.classes, {\n\tsWrapper:      \"dataTables_wrapper dt-bootstrap4\",\n\tsFilterInput:  \"form-control form-control-sm\",\n\tsLengthSelect: \"custom-select custom-select-sm form-control form-control-sm\",\n\tsProcessing:   \"dataTables_processing card\",\n\tsPageButton:   \"paginate_button page-item\"\n} );\n\n\n/* Bootstrap paging button renderer */\ndatatables_net__WEBPACK_IMPORTED_MODULE_1__.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {\n\tvar api     = new datatables_net__WEBPACK_IMPORTED_MODULE_1__.Api( settings );\n\tvar classes = settings.oClasses;\n\tvar lang    = settings.oLanguage.oPaginate;\n\tvar aria = settings.oLanguage.oAria.paginate || {};\n\tvar btnDisplay, btnClass;\n\n\tvar attach = function( container, buttons ) {\n\t\tvar i, ien, node, button;\n\t\tvar clickHandler = function ( e ) {\n\t\t\te.preventDefault();\n\t\t\tif ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {\n\t\t\t\tapi.page( e.data.action ).draw( 'page' );\n\t\t\t}\n\t\t};\n\n\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\tbutton = buttons[i];\n\n\t\t\tif ( Array.isArray( button ) ) {\n\t\t\t\tattach( container, button );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbtnDisplay = '';\n\t\t\t\tbtnClass = '';\n\n\t\t\t\tswitch ( button ) {\n\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\tbtnDisplay = '&#x2026;';\n\t\t\t\t\t\tbtnClass = 'disabled';\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'first':\n\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'next':\n\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'last':\n\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbtnDisplay = button + 1;\n\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t'active' : '';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( btnDisplay ) {\n\t\t\t\t\tvar disabled = btnClass.indexOf('disabled') !== -1;\n\n\t\t\t\t\tnode = $('<li>', {\n\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append( $('<a>', {\n\t\t\t\t\t\t\t\t'href': disabled ? null : '#',\n\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t'aria-disabled': disabled ? 'true' : null,\n\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t'role': 'link',\n\t\t\t\t\t\t\t\t'aria-current': btnClass === 'active' ? 'page' : null,\n\t\t\t\t\t\t\t\t'data-dt-idx': button,\n\t\t\t\t\t\t\t\t'tabindex': settings.iTabIndex,\n\t\t\t\t\t\t\t\t'class': 'page-link'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\tsettings.oApi._fnBindAction(\n\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t// inside an iframe or frame. \n\tvar activeEl;\n\n\ttry {\n\t\t// Because this approach is destroying and recreating the paging\n\t\t// elements, focus is lost on the select button which is bad for\n\t\t// accessibility. So we want to restore focus once the draw has\n\t\t// completed\n\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t}\n\tcatch (e) {}\n\n\tattach(\n\t\t$(host).empty().html('<ul class=\"pagination\"/>').children('ul'),\n\t\tbuttons\n\t);\n\n\tif ( activeEl !== undefined ) {\n\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t}\n};\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (datatables_net__WEBPACK_IMPORTED_MODULE_1__);\n\n\n//# sourceURL=webpack://rup/./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs?");

/***/ }),

/***/ "./node_modules/datatables.net-colreorder-bs4/js/colReorder.bootstrap4.js":
/*!********************************************************************************!*\
  !*** ./node_modules/datatables.net-colreorder-bs4/js/colReorder.bootstrap4.js ***!
  \********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*! Bootstrap 4 styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net-bs4 */ \"./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs\"), __webpack_require__(/*! datatables.net-colreorder */ \"./node_modules/datatables.net-colreorder/js/dataTables.colReorder.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  return $.fn.dataTable;\n});\n\n//# sourceURL=webpack://rup/./node_modules/datatables.net-colreorder-bs4/js/colReorder.bootstrap4.js?");

/***/ }),

/***/ "./node_modules/datatables.net-colreorder/js/dataTables.colReorder.js":
/*!****************************************************************************!*\
  !*** ./node_modules/datatables.net-colreorder/js/dataTables.colReorder.js ***!
  \****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*! ColReorder 1.5.6\n * ©2010-2022 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     ColReorder\n * @description Provide the ability to reorder columns in a DataTable\n * @version     1.5.6\n * @author      SpryMedia Ltd (www.sprymedia.co.uk)\n * @contact     www.sprymedia.co.uk\n * @copyright   SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license/mit\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable;\n  /**\n   * Switch the key value pairing of an index array to be value key (i.e. the old value is now the\n   * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ].\n   *  @method  fnInvertKeyValues\n   *  @param   array aIn Array to switch around\n   *  @returns array\n   */\n\n  function fnInvertKeyValues(aIn) {\n    var aRet = [];\n\n    for (var i = 0, iLen = aIn.length; i < iLen; i++) {\n      aRet[aIn[i]] = i;\n    }\n\n    return aRet;\n  }\n  /**\n   * Modify an array by switching the position of two elements\n   *  @method  fnArraySwitch\n   *  @param   array aArray Array to consider, will be modified by reference (i.e. no return)\n   *  @param   int iFrom From point\n   *  @param   int iTo Insert point\n   *  @returns void\n   */\n\n\n  function fnArraySwitch(aArray, iFrom, iTo) {\n    var mStore = aArray.splice(iFrom, 1)[0];\n    aArray.splice(iTo, 0, mStore);\n  }\n  /**\n   * Switch the positions of nodes in a parent node (note this is specifically designed for\n   * table rows). Note this function considers all element nodes under the parent!\n   *  @method  fnDomSwitch\n   *  @param   string sTag Tag to consider\n   *  @param   int iFrom Element to move\n   *  @param   int Point to element the element to (before this point), can be null for append\n   *  @returns void\n   */\n\n\n  function fnDomSwitch(nParent, iFrom, iTo) {\n    var anTags = [];\n\n    for (var i = 0, iLen = nParent.childNodes.length; i < iLen; i++) {\n      if (nParent.childNodes[i].nodeType == 1) {\n        anTags.push(nParent.childNodes[i]);\n      }\n    }\n\n    var nStore = anTags[iFrom];\n\n    if (iTo !== null) {\n      nParent.insertBefore(nStore, anTags[iTo]);\n    } else {\n      nParent.appendChild(nStore);\n    }\n  }\n  /**\n   * Plug-in for DataTables which will reorder the internal column structure by taking the column\n   * from one position (iFrom) and insert it into a given point (iTo).\n   *  @method  $.fn.dataTableExt.oApi.fnColReorder\n   *  @param   object oSettings DataTables settings object - automatically added by DataTables!\n   *  @param   int iFrom Take the column to be repositioned from this point\n   *  @param   int iTo and insert it into this point\n   *  @param   bool drop Indicate if the reorder is the final one (i.e. a drop)\n   *    not a live reorder\n   *  @param   bool invalidateRows speeds up processing if false passed\n   *  @returns void\n   */\n\n\n  $.fn.dataTableExt.oApi.fnColReorder = function (oSettings, iFrom, iTo, drop, invalidateRows) {\n    var i,\n        iLen,\n        j,\n        jLen,\n        jen,\n        iCols = oSettings.aoColumns.length,\n        nTrs,\n        oCol;\n\n    var attrMap = function attrMap(obj, prop, mapping) {\n      if (!obj[prop] || typeof obj[prop] === 'function') {\n        return;\n      }\n\n      var a = obj[prop].split('.');\n      var num = a.shift();\n\n      if (isNaN(num * 1)) {\n        return;\n      }\n\n      obj[prop] = mapping[num * 1] + '.' + a.join('.');\n    };\n    /* Sanity check in the input */\n\n\n    if (iFrom == iTo) {\n      /* Pointless reorder */\n      return;\n    }\n\n    if (iFrom < 0 || iFrom >= iCols) {\n      this.oApi._fnLog(oSettings, 1, \"ColReorder 'from' index is out of bounds: \" + iFrom);\n\n      return;\n    }\n\n    if (iTo < 0 || iTo >= iCols) {\n      this.oApi._fnLog(oSettings, 1, \"ColReorder 'to' index is out of bounds: \" + iTo);\n\n      return;\n    }\n    /*\n     * Calculate the new column array index, so we have a mapping between the old and new\n     */\n\n\n    var aiMapping = [];\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      aiMapping[i] = i;\n    }\n\n    fnArraySwitch(aiMapping, iFrom, iTo);\n    var aiInvertMapping = fnInvertKeyValues(aiMapping);\n    /*\n     * Convert all internal indexing to the new column order indexes\n     */\n\n    /* Sorting */\n\n    for (i = 0, iLen = oSettings.aaSorting.length; i < iLen; i++) {\n      oSettings.aaSorting[i][0] = aiInvertMapping[oSettings.aaSorting[i][0]];\n    }\n    /* Fixed sorting */\n\n\n    if (oSettings.aaSortingFixed !== null) {\n      for (i = 0, iLen = oSettings.aaSortingFixed.length; i < iLen; i++) {\n        oSettings.aaSortingFixed[i][0] = aiInvertMapping[oSettings.aaSortingFixed[i][0]];\n      }\n    }\n    /* Data column sorting (the column which the sort for a given column should take place on) */\n\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      oCol = oSettings.aoColumns[i];\n\n      for (j = 0, jLen = oCol.aDataSort.length; j < jLen; j++) {\n        oCol.aDataSort[j] = aiInvertMapping[oCol.aDataSort[j]];\n      } // Update the column indexes\n\n\n      oCol.idx = aiInvertMapping[oCol.idx];\n    } // Update 1.10 optimised sort class removal variable\n\n\n    $.each(oSettings.aLastSort, function (i, val) {\n      oSettings.aLastSort[i].src = aiInvertMapping[val.src];\n    });\n    /* Update the Get and Set functions for each column */\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      oCol = oSettings.aoColumns[i];\n\n      if (typeof oCol.mData == 'number') {\n        oCol.mData = aiInvertMapping[oCol.mData];\n      } else if ($.isPlainObject(oCol.mData)) {\n        // HTML5 data sourced\n        attrMap(oCol.mData, '_', aiInvertMapping);\n        attrMap(oCol.mData, 'filter', aiInvertMapping);\n        attrMap(oCol.mData, 'sort', aiInvertMapping);\n        attrMap(oCol.mData, 'type', aiInvertMapping);\n      }\n    }\n    /*\n     * Move the DOM elements\n     */\n\n\n    if (oSettings.aoColumns[iFrom].bVisible) {\n      /* Calculate the current visible index and the point to insert the node before. The insert\n       * before needs to take into account that there might not be an element to insert before,\n       * in which case it will be null, and an appendChild should be used\n       */\n      var iVisibleIndex = this.oApi._fnColumnIndexToVisible(oSettings, iFrom);\n\n      var iInsertBeforeIndex = null;\n      i = iTo < iFrom ? iTo : iTo + 1;\n\n      while (iInsertBeforeIndex === null && i < iCols) {\n        iInsertBeforeIndex = this.oApi._fnColumnIndexToVisible(oSettings, i);\n        i++;\n      }\n      /* Header */\n\n\n      nTrs = oSettings.nTHead.getElementsByTagName('tr');\n\n      for (i = 0, iLen = nTrs.length; i < iLen; i++) {\n        fnDomSwitch(nTrs[i], iVisibleIndex, iInsertBeforeIndex);\n      }\n      /* Footer */\n\n\n      if (oSettings.nTFoot !== null) {\n        nTrs = oSettings.nTFoot.getElementsByTagName('tr');\n\n        for (i = 0, iLen = nTrs.length; i < iLen; i++) {\n          fnDomSwitch(nTrs[i], iVisibleIndex, iInsertBeforeIndex);\n        }\n      }\n      /* Body */\n\n\n      for (i = 0, iLen = oSettings.aoData.length; i < iLen; i++) {\n        if (oSettings.aoData[i].nTr !== null) {\n          fnDomSwitch(oSettings.aoData[i].nTr, iVisibleIndex, iInsertBeforeIndex);\n        }\n      }\n    }\n    /*\n     * Move the internal array elements\n     */\n\n    /* Columns */\n\n\n    fnArraySwitch(oSettings.aoColumns, iFrom, iTo); // regenerate the get / set functions\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      oSettings.oApi._fnColumnOptions(oSettings, i, {});\n    }\n    /* Search columns */\n\n\n    fnArraySwitch(oSettings.aoPreSearchCols, iFrom, iTo);\n    /* Array array - internal data anodes cache */\n\n    for (i = 0, iLen = oSettings.aoData.length; i < iLen; i++) {\n      var data = oSettings.aoData[i];\n      var cells = data.anCells;\n\n      if (cells) {\n        fnArraySwitch(cells, iFrom, iTo); // Longer term, should this be moved into the DataTables' invalidate\n        // methods?\n\n        for (j = 0, jen = cells.length; j < jen; j++) {\n          if (cells[j] && cells[j]._DT_CellIndex) {\n            cells[j]._DT_CellIndex.column = j;\n          }\n        }\n      } // Swap around array sourced data (object based is left as is)\n\n\n      if (Array.isArray(data._aData)) {\n        fnArraySwitch(data._aData, iFrom, iTo);\n      }\n    }\n    /* Reposition the header elements in the header layout array */\n\n\n    for (i = 0, iLen = oSettings.aoHeader.length; i < iLen; i++) {\n      fnArraySwitch(oSettings.aoHeader[i], iFrom, iTo);\n    }\n\n    if (oSettings.aoFooter !== null) {\n      for (i = 0, iLen = oSettings.aoFooter.length; i < iLen; i++) {\n        fnArraySwitch(oSettings.aoFooter[i], iFrom, iTo);\n      }\n    }\n\n    if (invalidateRows || invalidateRows === undefined) {\n      // Always read from the data object rather than reading back from the DOM\n      // since it could have been changed by a renderer\n      $.fn.dataTable.Api(oSettings).rows().invalidate('data');\n    }\n    /*\n     * Update DataTables' event handlers\n     */\n\n    /* Sort listener */\n\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      $(oSettings.aoColumns[i].nTh).off('.DT');\n\n      this.oApi._fnSortAttachListener(oSettings, oSettings.aoColumns[i].nTh, i);\n    }\n    /* Fire an event so other plug-ins can update */\n\n\n    $(oSettings.oInstance).trigger('column-reorder.dt', [oSettings, {\n      from: iFrom,\n      to: iTo,\n      mapping: aiInvertMapping,\n      drop: drop,\n      // Old style parameters for compatibility\n      iFrom: iFrom,\n      iTo: iTo,\n      aiInvertMapping: aiInvertMapping\n    }]);\n  };\n  /**\n   * ColReorder provides column visibility control for DataTables\n   * @class ColReorder\n   * @constructor\n   * @param {object} dt DataTables settings object\n   * @param {object} opts ColReorder options\n   */\n\n\n  var ColReorder = function ColReorder(dt, opts) {\n    var settings = new $.fn.dataTable.Api(dt).settings()[0]; // Ensure that we can't initialise on the same table twice\n\n    if (settings._colReorder) {\n      return settings._colReorder;\n    } // Allow the options to be a boolean for defaults\n\n\n    if (opts === true) {\n      opts = {};\n    } // Convert from camelCase to Hungarian, just as DataTables does\n\n\n    var camelToHungarian = $.fn.dataTable.camelToHungarian;\n\n    if (camelToHungarian) {\n      camelToHungarian(ColReorder.defaults, ColReorder.defaults, true);\n      camelToHungarian(ColReorder.defaults, opts || {});\n    }\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n     * Public class variables\n     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n    /**\n     * @namespace Settings object which contains customisable information for ColReorder instance\n     */\n\n\n    this.s = {\n      /**\n       * DataTables settings object\n       *  @property dt\n       *  @type     Object\n       *  @default  null\n       */\n      \"dt\": null,\n\n      /**\n       * Enable flag\n       *  @property dt\n       *  @type     Object\n       *  @default  null\n       */\n      \"enable\": null,\n\n      /**\n       * Initialisation object used for this instance\n       *  @property init\n       *  @type     object\n       *  @default  {}\n       */\n      \"init\": $.extend(true, {}, ColReorder.defaults, opts),\n\n      /**\n       * Number of columns to fix (not allow to be reordered)\n       *  @property fixed\n       *  @type     int\n       *  @default  0\n       */\n      \"fixed\": 0,\n\n      /**\n       * Number of columns to fix counting from right (not allow to be reordered)\n       *  @property fixedRight\n       *  @type     int\n       *  @default  0\n       */\n      \"fixedRight\": 0,\n\n      /**\n       * Callback function for once the reorder has been done\n       *  @property reorderCallback\n       *  @type     function\n       *  @default  null\n       */\n      \"reorderCallback\": null,\n\n      /**\n       * @namespace Information used for the mouse drag\n       */\n      \"mouse\": {\n        \"startX\": -1,\n        \"startY\": -1,\n        \"offsetX\": -1,\n        \"offsetY\": -1,\n        \"target\": -1,\n        \"targetIndex\": -1,\n        \"fromIndex\": -1\n      },\n\n      /**\n       * Information which is used for positioning the insert cusor and knowing where to do the\n       * insert. Array of objects with the properties:\n       *   x: x-axis position\n       *   to: insert point\n       *  @property aoTargets\n       *  @type     array\n       *  @default  []\n       */\n      \"aoTargets\": []\n    };\n    /**\n     * @namespace Common and useful DOM elements for the class instance\n     */\n\n    this.dom = {\n      /**\n       * Dragging element (the one the mouse is moving)\n       *  @property drag\n       *  @type     element\n       *  @default  null\n       */\n      \"drag\": null,\n\n      /**\n       * The insert cursor\n       *  @property pointer\n       *  @type     element\n       *  @default  null\n       */\n      \"pointer\": null\n    };\n    /* Constructor logic */\n\n    this.s.enable = this.s.init.bEnable;\n    this.s.dt = settings;\n    this.s.dt._colReorder = this;\n\n    this._fnConstruct();\n\n    return this;\n  };\n\n  $.extend(ColReorder.prototype, {\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n     * Public methods\n     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n    /**\n     * Enable / disable end user interaction\n     */\n    fnEnable: function fnEnable(flag) {\n      if (flag === false) {\n        return fnDisable();\n      }\n\n      this.s.enable = true;\n    },\n\n    /**\n     * Disable end user interaction\n     */\n    fnDisable: function fnDisable() {\n      this.s.enable = false;\n    },\n\n    /**\n     * Reset the column ordering to the original ordering that was detected on\n     * start up.\n     *  @return {this} Returns `this` for chaining.\n     *\n     *  @example\n     *    // DataTables initialisation with ColReorder\n     *    var table = $('#example').dataTable( {\n     *        \"sDom\": 'Rlfrtip'\n     *    } );\n     *\n     *    // Add click event to a button to reset the ordering\n     *    $('#resetOrdering').click( function (e) {\n     *        e.preventDefault();\n     *        $.fn.dataTable.ColReorder( table ).fnReset();\n     *    } );\n     */\n    \"fnReset\": function fnReset() {\n      this._fnOrderColumns(this.fnOrder());\n\n      return this;\n    },\n\n    /**\n     * `Deprecated` - Get the current order of the columns, as an array.\n     *  @return {array} Array of column identifiers\n     *  @deprecated `fnOrder` should be used in preference to this method.\n     *      `fnOrder` acts as a getter/setter.\n     */\n    \"fnGetCurrentOrder\": function fnGetCurrentOrder() {\n      return this.fnOrder();\n    },\n\n    /**\n     * Get the current order of the columns, as an array. Note that the values\n     * given in the array are unique identifiers for each column. Currently\n     * these are the original ordering of the columns that was detected on\n     * start up, but this could potentially change in future.\n     *  @return {array} Array of column identifiers\n     *\n     *  @example\n     *    // Get column ordering for the table\n     *    var order = $.fn.dataTable.ColReorder( dataTable ).fnOrder();\n     */\n\n    /**\n    * Set the order of the columns, from the positions identified in the\n    * ordering array given. Note that ColReorder takes a brute force approach\n    * to reordering, so it is possible multiple reordering events will occur\n    * before the final order is settled upon.\n    *  @param {array} [set] Array of column identifiers in the new order. Note\n    *    that every column must be included, uniquely, in this array.\n    *  @return {this} Returns `this` for chaining.\n    *\n    *  @example\n    *    // Swap the first and second columns\n    *    $.fn.dataTable.ColReorder( dataTable ).fnOrder( [1, 0, 2, 3, 4] );\n    *\n    *  @example\n    *    // Move the first column to the end for the table `#example`\n    *    var curr = $.fn.dataTable.ColReorder( '#example' ).fnOrder();\n    *    var first = curr.shift();\n    *    curr.push( first );\n    *    $.fn.dataTable.ColReorder( '#example' ).fnOrder( curr );\n    *\n    *  @example\n    *    // Reverse the table's order\n    *    $.fn.dataTable.ColReorder( '#example' ).fnOrder(\n    *      $.fn.dataTable.ColReorder( '#example' ).fnOrder().reverse()\n    *    );\n    */\n    \"fnOrder\": function fnOrder(set, original) {\n      var a = [],\n          i,\n          ien,\n          j,\n          jen;\n      var columns = this.s.dt.aoColumns;\n\n      if (set === undefined) {\n        for (i = 0, ien = columns.length; i < ien; i++) {\n          a.push(columns[i]._ColReorder_iOrigCol);\n        }\n\n        return a;\n      } // The order given is based on the original indexes, rather than the\n      // existing ones, so we need to translate from the original to current\n      // before then doing the order\n\n\n      if (original) {\n        var order = this.fnOrder();\n\n        for (i = 0, ien = set.length; i < ien; i++) {\n          a.push($.inArray(set[i], order));\n        }\n\n        set = a;\n      }\n\n      this._fnOrderColumns(fnInvertKeyValues(set));\n\n      return this;\n    },\n\n    /**\n     * Convert from the original column index, to the original\n     *\n     * @param  {int|array} idx Index(es) to convert\n     * @param  {string} dir Transpose direction - `fromOriginal` / `toCurrent`\n     *   or `'toOriginal` / `fromCurrent`\n     * @return {int|array}     Converted values\n     */\n    fnTranspose: function fnTranspose(idx, dir) {\n      if (!dir) {\n        dir = 'toCurrent';\n      }\n\n      var order = this.fnOrder();\n      var columns = this.s.dt.aoColumns;\n\n      if (dir === 'toCurrent') {\n        // Given an original index, want the current\n        return !Array.isArray(idx) ? $.inArray(idx, order) : $.map(idx, function (index) {\n          return $.inArray(index, order);\n        });\n      } else {\n        // Given a current index, want the original\n        return !Array.isArray(idx) ? columns[idx]._ColReorder_iOrigCol : $.map(idx, function (index) {\n          return columns[index]._ColReorder_iOrigCol;\n        });\n      }\n    },\n\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n     * Private methods (they are of course public in JS, but recommended as private)\n     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n    /**\n     * Constructor logic\n     *  @method  _fnConstruct\n     *  @returns void\n     *  @private\n     */\n    \"_fnConstruct\": function _fnConstruct() {\n      var that = this;\n      var iLen = this.s.dt.aoColumns.length;\n      var table = this.s.dt.nTable;\n      var i;\n      /* Columns discounted from reordering - counting left to right */\n\n      if (this.s.init.iFixedColumns) {\n        this.s.fixed = this.s.init.iFixedColumns;\n      }\n\n      if (this.s.init.iFixedColumnsLeft) {\n        this.s.fixed = this.s.init.iFixedColumnsLeft;\n      }\n      /* Columns discounted from reordering - counting right to left */\n\n\n      this.s.fixedRight = this.s.init.iFixedColumnsRight ? this.s.init.iFixedColumnsRight : 0;\n      /* Drop callback initialisation option */\n\n      if (this.s.init.fnReorderCallback) {\n        this.s.reorderCallback = this.s.init.fnReorderCallback;\n      }\n      /* Add event handlers for the drag and drop, and also mark the original column order */\n\n\n      for (i = 0; i < iLen; i++) {\n        if (i > this.s.fixed - 1 && i < iLen - this.s.fixedRight) {\n          this._fnMouseListener(i, this.s.dt.aoColumns[i].nTh);\n        }\n        /* Mark the original column order for later reference */\n\n\n        this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i;\n      }\n      /* State saving */\n\n\n      this.s.dt.oApi._fnCallbackReg(this.s.dt, 'aoStateSaveParams', function (oS, oData) {\n        that._fnStateSave.call(that, oData);\n      }, \"ColReorder_State\");\n\n      this.s.dt.oApi._fnCallbackReg(this.s.dt, 'aoStateLoadParams', function (oS, oData) {\n        that.s.dt._colReorder.fnOrder(oData.ColReorder, true);\n      });\n      /* An initial column order has been specified */\n\n\n      var aiOrder = null;\n\n      if (this.s.init.aiOrder) {\n        aiOrder = this.s.init.aiOrder.slice();\n      }\n      /* State loading, overrides the column order given */\n\n\n      if (this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' && this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length) {\n        aiOrder = this.s.dt.oLoadedState.ColReorder;\n      }\n      /* If we have an order to apply - do so */\n\n\n      if (aiOrder) {\n        /* We might be called during or after the DataTables initialisation. If before, then we need\n         * to wait until the draw is done, if after, then do what we need to do right away\n         */\n        if (!that.s.dt._bInitComplete) {\n          var bDone = false;\n          $(table).on('draw.dt.colReorder', function () {\n            if (!that.s.dt._bInitComplete && !bDone) {\n              bDone = true;\n              var resort = fnInvertKeyValues(aiOrder);\n\n              that._fnOrderColumns.call(that, resort);\n            }\n          });\n        } else {\n          var resort = fnInvertKeyValues(aiOrder);\n\n          that._fnOrderColumns.call(that, resort);\n        }\n      } else {\n        this._fnSetColumnIndexes();\n      } // Destroy clean up\n\n\n      $(table).on('destroy.dt.colReorder', function () {\n        $(table).off('destroy.dt.colReorder draw.dt.colReorder');\n        $.each(that.s.dt.aoColumns, function (i, column) {\n          $(column.nTh).off('.ColReorder');\n          $(column.nTh).removeAttr('data-column-index');\n        });\n        that.s.dt._colReorder = null;\n        that.s = null;\n      });\n    },\n\n    /**\n     * Set the column order from an array\n     *  @method  _fnOrderColumns\n     *  @param   array a An array of integers which dictate the column order that should be applied\n     *  @returns void\n     *  @private\n     */\n    \"_fnOrderColumns\": function _fnOrderColumns(a) {\n      var changed = false;\n\n      if (a.length != this.s.dt.aoColumns.length) {\n        this.s.dt.oInstance.oApi._fnLog(this.s.dt, 1, \"ColReorder - array reorder does not \" + \"match known number of columns. Skipping.\");\n\n        return;\n      }\n\n      for (var i = 0, iLen = a.length; i < iLen; i++) {\n        var currIndex = $.inArray(i, a);\n\n        if (i != currIndex) {\n          /* Reorder our switching array */\n          fnArraySwitch(a, currIndex, i);\n          /* Do the column reorder in the table */\n\n          this.s.dt.oInstance.fnColReorder(currIndex, i, true, false);\n          changed = true;\n        }\n      }\n\n      this._fnSetColumnIndexes(); // Has anything actually changed? If not, then nothing else to do\n\n\n      if (!changed) {\n        return;\n      }\n\n      $.fn.dataTable.Api(this.s.dt).rows().invalidate('data');\n      /* When scrolling we need to recalculate the column sizes to allow for the shift */\n\n      if (this.s.dt.oScroll.sX !== \"\" || this.s.dt.oScroll.sY !== \"\") {\n        this.s.dt.oInstance.fnAdjustColumnSizing(false);\n      }\n      /* Save the state */\n\n\n      this.s.dt.oInstance.oApi._fnSaveState(this.s.dt);\n\n      if (this.s.reorderCallback !== null) {\n        this.s.reorderCallback.call(this);\n      }\n    },\n\n    /**\n     * Because we change the indexes of columns in the table, relative to their starting point\n     * we need to reorder the state columns to what they are at the starting point so we can\n     * then rearrange them again on state load!\n     *  @method  _fnStateSave\n     *  @param   object oState DataTables state\n     *  @returns string JSON encoded cookie string for DataTables\n     *  @private\n     */\n    \"_fnStateSave\": function _fnStateSave(oState) {\n      if (this.s === null) {\n        return;\n      }\n\n      var i, iLen, aCopy, iOrigColumn;\n      var oSettings = this.s.dt;\n      var columns = oSettings.aoColumns;\n      oState.ColReorder = [];\n      /* Sorting */\n\n      if (oState.aaSorting) {\n        // 1.10.0-\n        for (i = 0; i < oState.aaSorting.length; i++) {\n          oState.aaSorting[i][0] = columns[oState.aaSorting[i][0]]._ColReorder_iOrigCol;\n        }\n\n        var aSearchCopy = $.extend(true, [], oState.aoSearchCols);\n\n        for (i = 0, iLen = columns.length; i < iLen; i++) {\n          iOrigColumn = columns[i]._ColReorder_iOrigCol;\n          /* Column filter */\n\n          oState.aoSearchCols[iOrigColumn] = aSearchCopy[i];\n          /* Visibility */\n\n          oState.abVisCols[iOrigColumn] = columns[i].bVisible;\n          /* Column reordering */\n\n          oState.ColReorder.push(iOrigColumn);\n        }\n      } else if (oState.order) {\n        // 1.10.1+\n        for (i = 0; i < oState.order.length; i++) {\n          oState.order[i][0] = columns[oState.order[i][0]]._ColReorder_iOrigCol;\n        }\n\n        var stateColumnsCopy = $.extend(true, [], oState.columns);\n\n        for (i = 0, iLen = columns.length; i < iLen; i++) {\n          iOrigColumn = columns[i]._ColReorder_iOrigCol;\n          /* Columns */\n\n          oState.columns[iOrigColumn] = stateColumnsCopy[i];\n          /* Column reordering */\n\n          oState.ColReorder.push(iOrigColumn);\n        }\n      }\n    },\n\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n     * Mouse drop and drag\n     */\n\n    /**\n     * Add a mouse down listener to a particluar TH element\n     *  @method  _fnMouseListener\n     *  @param   int i Column index\n     *  @param   element nTh TH element clicked on\n     *  @returns void\n     *  @private\n     */\n    \"_fnMouseListener\": function _fnMouseListener(i, nTh) {\n      var that = this;\n      $(nTh).on('mousedown.ColReorder', function (e) {\n        if (that.s.enable && e.which === 1) {\n          that._fnMouseDown.call(that, e, nTh);\n        }\n      }).on('touchstart.ColReorder', function (e) {\n        if (that.s.enable) {\n          that._fnMouseDown.call(that, e, nTh);\n        }\n      });\n    },\n\n    /**\n     * Mouse down on a TH element in the table header\n     *  @method  _fnMouseDown\n     *  @param   event e Mouse event\n     *  @param   element nTh TH element to be dragged\n     *  @returns void\n     *  @private\n     */\n    \"_fnMouseDown\": function _fnMouseDown(e, nTh) {\n      var that = this;\n      /* Store information about the mouse position */\n\n      var target = $(e.target).closest('th, td');\n      var offset = target.offset();\n      var idx = parseInt($(nTh).attr('data-column-index'), 10);\n\n      if (idx === undefined) {\n        return;\n      }\n\n      this.s.mouse.startX = this._fnCursorPosition(e, 'pageX');\n      this.s.mouse.startY = this._fnCursorPosition(e, 'pageY');\n      this.s.mouse.offsetX = this._fnCursorPosition(e, 'pageX') - offset.left;\n      this.s.mouse.offsetY = this._fnCursorPosition(e, 'pageY') - offset.top;\n      this.s.mouse.target = this.s.dt.aoColumns[idx].nTh; //target[0];\n\n      this.s.mouse.targetIndex = idx;\n      this.s.mouse.fromIndex = idx;\n\n      this._fnRegions();\n      /* Add event handlers to the document */\n\n\n      $(document).on('mousemove.ColReorder touchmove.ColReorder', function (e) {\n        that._fnMouseMove.call(that, e);\n      }).on('mouseup.ColReorder touchend.ColReorder', function (e) {\n        that._fnMouseUp.call(that, e);\n      });\n    },\n\n    /**\n     * Deal with a mouse move event while dragging a node\n     *  @method  _fnMouseMove\n     *  @param   event e Mouse event\n     *  @returns void\n     *  @private\n     */\n    \"_fnMouseMove\": function _fnMouseMove(e) {\n      var that = this;\n\n      if (this.dom.drag === null) {\n        /* Only create the drag element if the mouse has moved a specific distance from the start\n         * point - this allows the user to make small mouse movements when sorting and not have a\n         * possibly confusing drag element showing up\n         */\n        if (Math.pow(Math.pow(this._fnCursorPosition(e, 'pageX') - this.s.mouse.startX, 2) + Math.pow(this._fnCursorPosition(e, 'pageY') - this.s.mouse.startY, 2), 0.5) < 5) {\n          return;\n        }\n\n        this._fnCreateDragNode();\n      }\n      /* Position the element - we respect where in the element the click occured */\n\n\n      this.dom.drag.css({\n        left: this._fnCursorPosition(e, 'pageX') - this.s.mouse.offsetX,\n        top: this._fnCursorPosition(e, 'pageY') - this.s.mouse.offsetY\n      });\n      /* Based on the current mouse position, calculate where the insert should go */\n\n      var target;\n      var lastToIndex = this.s.mouse.toIndex;\n\n      var cursorXPosiotion = this._fnCursorPosition(e, 'pageX');\n\n      var targetsPrev = function targetsPrev(i) {\n        while (i >= 0) {\n          i--;\n\n          if (i <= 0) {\n            return null;\n          }\n\n          if (that.s.aoTargets[i + 1].x !== that.s.aoTargets[i].x) {\n            return that.s.aoTargets[i];\n          }\n        }\n      };\n\n      var firstNotHidden = function firstNotHidden() {\n        for (var i = 0; i < that.s.aoTargets.length - 1; i++) {\n          if (that.s.aoTargets[i].x !== that.s.aoTargets[i + 1].x) {\n            return that.s.aoTargets[i];\n          }\n        }\n      };\n\n      var lastNotHidden = function lastNotHidden() {\n        for (var i = that.s.aoTargets.length - 1; i > 0; i--) {\n          if (that.s.aoTargets[i].x !== that.s.aoTargets[i - 1].x) {\n            return that.s.aoTargets[i];\n          }\n        }\n      };\n\n      for (var i = 1; i < this.s.aoTargets.length; i++) {\n        var prevTarget = targetsPrev(i);\n\n        if (!prevTarget) {\n          prevTarget = firstNotHidden();\n        }\n\n        var prevTargetMiddle = prevTarget.x + (this.s.aoTargets[i].x - prevTarget.x) / 2;\n\n        if (this._fnIsLtr()) {\n          if (cursorXPosiotion < prevTargetMiddle) {\n            target = prevTarget;\n            break;\n          }\n        } else {\n          if (cursorXPosiotion > prevTargetMiddle) {\n            target = prevTarget;\n            break;\n          }\n        }\n      }\n\n      if (target) {\n        this.dom.pointer.css('left', target.x);\n        this.s.mouse.toIndex = target.to;\n      } else {\n        // The insert element wasn't positioned in the array (less than\n        // operator), so we put it at the end\n        this.dom.pointer.css('left', lastNotHidden().x);\n        this.s.mouse.toIndex = lastNotHidden().to;\n      } // Perform reordering if realtime updating is on and the column has moved\n\n\n      if (this.s.init.bRealtime && lastToIndex !== this.s.mouse.toIndex) {\n        this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex, this.s.mouse.toIndex);\n        this.s.mouse.fromIndex = this.s.mouse.toIndex; // Not great for performance, but required to keep everything in alignment\n\n        if (this.s.dt.oScroll.sX !== \"\" || this.s.dt.oScroll.sY !== \"\") {\n          this.s.dt.oInstance.fnAdjustColumnSizing(false);\n        }\n\n        this._fnRegions();\n      }\n    },\n\n    /**\n     * Finish off the mouse drag and insert the column where needed\n     *  @method  _fnMouseUp\n     *  @param   event e Mouse event\n     *  @returns void\n     *  @private\n     */\n    \"_fnMouseUp\": function _fnMouseUp(e) {\n      var that = this;\n      $(document).off('.ColReorder');\n\n      if (this.dom.drag !== null) {\n        /* Remove the guide elements */\n        this.dom.drag.remove();\n        this.dom.pointer.remove();\n        this.dom.drag = null;\n        this.dom.pointer = null;\n        /* Actually do the reorder */\n\n        this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex, this.s.mouse.toIndex, true);\n\n        this._fnSetColumnIndexes();\n        /* When scrolling we need to recalculate the column sizes to allow for the shift */\n\n\n        if (this.s.dt.oScroll.sX !== \"\" || this.s.dt.oScroll.sY !== \"\") {\n          this.s.dt.oInstance.fnAdjustColumnSizing(false);\n        }\n        /* Save the state */\n\n\n        this.s.dt.oInstance.oApi._fnSaveState(this.s.dt);\n\n        if (this.s.reorderCallback !== null) {\n          this.s.reorderCallback.call(this);\n        }\n      }\n    },\n\n    /**\n     * Calculate a cached array with the points of the column inserts, and the\n     * 'to' points\n     *  @method  _fnRegions\n     *  @returns void\n     *  @private\n     */\n    \"_fnRegions\": function _fnRegions() {\n      var aoColumns = this.s.dt.aoColumns;\n\n      var isLTR = this._fnIsLtr();\n\n      this.s.aoTargets.splice(0, this.s.aoTargets.length);\n      var lastBound = $(this.s.dt.nTable).offset().left;\n      var aoColumnBounds = [];\n      $.each(aoColumns, function (i, column) {\n        if (column.bVisible && column.nTh.style.display !== 'none') {\n          var nth = $(column.nTh);\n          var bound = nth.offset().left;\n\n          if (isLTR) {\n            bound += nth.outerWidth();\n          }\n\n          aoColumnBounds.push({\n            index: i,\n            bound: bound\n          });\n          lastBound = bound;\n        } else {\n          aoColumnBounds.push({\n            index: i,\n            bound: lastBound\n          });\n        }\n      });\n      var firstColumn = aoColumnBounds[0];\n      var firstColumnWidth = $(aoColumns[firstColumn.index].nTh).outerWidth();\n      this.s.aoTargets.push({\n        to: 0,\n        x: firstColumn.bound - firstColumnWidth\n      });\n\n      for (var i = 0; i < aoColumnBounds.length; i++) {\n        var columnBound = aoColumnBounds[i];\n        var iToPoint = columnBound.index;\n        /* For the column / header in question, we want it's position to remain the same if the\n        * position is just to it's immediate left or right, so we only increment the counter for\n        * other columns\n        */\n\n        if (columnBound.index < this.s.mouse.fromIndex) {\n          iToPoint++;\n        }\n\n        this.s.aoTargets.push({\n          to: iToPoint,\n          x: columnBound.bound\n        });\n      }\n      /* Disallow columns for being reordered by drag and drop, counting right to left */\n\n\n      if (this.s.fixedRight !== 0) {\n        this.s.aoTargets.splice(this.s.aoTargets.length - this.s.fixedRight);\n      }\n      /* Disallow columns for being reordered by drag and drop, counting left to right */\n\n\n      if (this.s.fixed !== 0) {\n        this.s.aoTargets.splice(0, this.s.fixed);\n      }\n    },\n\n    /**\n     * Copy the TH element that is being drags so the user has the idea that they are actually\n     * moving it around the page.\n     *  @method  _fnCreateDragNode\n     *  @returns void\n     *  @private\n     */\n    \"_fnCreateDragNode\": function _fnCreateDragNode() {\n      var scrolling = this.s.dt.oScroll.sX !== \"\" || this.s.dt.oScroll.sY !== \"\";\n      var origCell = this.s.dt.aoColumns[this.s.mouse.targetIndex].nTh;\n      var origTr = origCell.parentNode;\n      var origThead = origTr.parentNode;\n      var origTable = origThead.parentNode;\n      var cloneCell = $(origCell).clone(); // This is a slightly odd combination of jQuery and DOM, but it is the\n      // fastest and least resource intensive way I could think of cloning\n      // the table with just a single header cell in it.\n\n      this.dom.drag = $(origTable.cloneNode(false)).addClass('DTCR_clonedTable').append($(origThead.cloneNode(false)).append($(origTr.cloneNode(false)).append(cloneCell[0]))).css({\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        width: $(origCell).outerWidth(),\n        height: $(origCell).outerHeight()\n      }).appendTo('body');\n      this.dom.pointer = $('<div></div>').addClass('DTCR_pointer').css({\n        position: 'absolute',\n        top: scrolling ? $($(this.s.dt.nScrollBody).parent()).offset().top : $(this.s.dt.nTable).offset().top,\n        height: scrolling ? $($(this.s.dt.nScrollBody).parent()).height() : $(this.s.dt.nTable).height()\n      }).appendTo('body');\n    },\n\n    /**\n     * Add a data attribute to the column headers, so we know the index of\n     * the row to be reordered. This allows fast detection of the index, and\n     * for this plug-in to work with FixedHeader which clones the nodes.\n     *  @private\n     */\n    \"_fnSetColumnIndexes\": function _fnSetColumnIndexes() {\n      $.each(this.s.dt.aoColumns, function (i, column) {\n        $(column.nTh).attr('data-column-index', i);\n      });\n    },\n\n    /**\n     * Get cursor position regardless of mouse or touch input\n     * @param  {Event}  e    jQuery Event\n     * @param  {string} prop Property to get\n     * @return {number}      Value\n     */\n    _fnCursorPosition: function _fnCursorPosition(e, prop) {\n      if (e.type.indexOf('touch') !== -1) {\n        return e.originalEvent.touches[0][prop];\n      }\n\n      return e[prop];\n    },\n    _fnIsLtr: function _fnIsLtr() {\n      return $(this.s.dt.nTable).css('direction') !== \"rtl\";\n    }\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * Static parameters\n   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n  /**\n   * ColReorder default settings for initialisation\n   *  @namespace\n   *  @static\n   */\n\n  ColReorder.defaults = {\n    /**\n     * Predefined ordering for the columns that will be applied automatically\n     * on initialisation. If not specified then the order that the columns are\n     * found to be in the HTML is the order used.\n     *  @type array\n     *  @default null\n     *  @static\n     */\n    aiOrder: null,\n\n    /**\n     * ColReorder enable on initialisation\n     *  @type boolean\n     *  @default true\n     *  @static\n     */\n    bEnable: true,\n\n    /**\n     * Redraw the table's column ordering as the end user draws the column\n     * (`true`) or wait until the mouse is released (`false` - default). Note\n     * that this will perform a redraw on each reordering, which involves an\n     * Ajax request each time if you are using server-side processing in\n     * DataTables.\n     *  @type boolean\n     *  @default false\n     *  @static\n     */\n    bRealtime: true,\n\n    /**\n     * Indicate how many columns should be fixed in position (counting from the\n     * left). This will typically be 1 if used, but can be as high as you like.\n     *  @type int\n     *  @default 0\n     *  @static\n     */\n    iFixedColumnsLeft: 0,\n\n    /**\n     * As `iFixedColumnsRight` but counting from the right.\n     *  @type int\n     *  @default 0\n     *  @static\n     */\n    iFixedColumnsRight: 0,\n\n    /**\n     * Callback function that is fired when columns are reordered. The `column-\n     * reorder` event is preferred over this callback\n     *  @type function():void\n     *  @default null\n     *  @static\n     */\n    fnReorderCallback: null\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * Constants\n   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n  /**\n   * ColReorder version\n   *  @constant  version\n   *  @type      String\n   *  @default   As code\n   */\n\n  ColReorder.version = \"1.5.6\";\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * DataTables interfaces\n   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n  // Expose\n\n  $.fn.dataTable.ColReorder = ColReorder;\n  $.fn.DataTable.ColReorder = ColReorder; // Register a new feature with DataTables\n\n  if (typeof $.fn.dataTable == \"function\" && typeof $.fn.dataTableExt.fnVersionCheck == \"function\" && $.fn.dataTableExt.fnVersionCheck('1.10.8')) {\n    $.fn.dataTableExt.aoFeatures.push({\n      \"fnInit\": function fnInit(settings) {\n        var table = settings.oInstance;\n\n        if (!settings._colReorder) {\n          var dtInit = settings.oInit;\n          var opts = dtInit.colReorder || dtInit.oColReorder || {};\n          new ColReorder(settings, opts);\n        } else {\n          table.oApi._fnLog(settings, 1, \"ColReorder attempted to initialise twice. Ignoring second\");\n        }\n\n        return null;\n        /* No node for DataTables to insert */\n      },\n      \"cFeature\": \"R\",\n      \"sFeature\": \"ColReorder\"\n    });\n  } else {\n    alert(\"Warning: ColReorder requires DataTables 1.10.8 or greater - www.datatables.net/download\");\n  } // Attach a listener to the document which listens for DataTables initialisation\n  // events so we can automatically initialise\n\n\n  $(document).on('preInit.dt.colReorder', function (e, settings) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    var init = settings.oInit.colReorder;\n    var defaults = DataTable.defaults.colReorder;\n\n    if (init || defaults) {\n      var opts = $.extend({}, init, defaults);\n\n      if (init !== false) {\n        new ColReorder(settings, opts);\n      }\n    }\n  }); // API augmentation\n\n  $.fn.dataTable.Api.register('colReorder.reset()', function () {\n    return this.iterator('table', function (ctx) {\n      ctx._colReorder.fnReset();\n    });\n  });\n  $.fn.dataTable.Api.register('colReorder.order()', function (set, original) {\n    if (set) {\n      return this.iterator('table', function (ctx) {\n        ctx._colReorder.fnOrder(set, original);\n      });\n    }\n\n    return this.context.length ? this.context[0]._colReorder.fnOrder() : null;\n  });\n  $.fn.dataTable.Api.register('colReorder.transpose()', function (idx, dir) {\n    return this.context.length && this.context[0]._colReorder ? this.context[0]._colReorder.fnTranspose(idx, dir) : idx;\n  });\n  $.fn.dataTable.Api.register('colReorder.move()', function (from, to, drop, invalidateRows) {\n    if (this.context.length) {\n      this.context[0]._colReorder.s.dt.oInstance.fnColReorder(from, to, drop, invalidateRows);\n\n      this.context[0]._colReorder._fnSetColumnIndexes();\n    }\n\n    return this;\n  });\n  $.fn.dataTable.Api.register('colReorder.enable()', function (flag) {\n    return this.iterator('table', function (ctx) {\n      if (ctx._colReorder) {\n        ctx._colReorder.fnEnable(flag);\n      }\n    });\n  });\n  $.fn.dataTable.Api.register('colReorder.disable()', function () {\n    return this.iterator('table', function (ctx) {\n      if (ctx._colReorder) {\n        ctx._colReorder.fnDisable();\n      }\n    });\n  });\n  return ColReorder;\n});\n\n//# sourceURL=webpack://rup/./node_modules/datatables.net-colreorder/js/dataTables.colReorder.js?");

/***/ }),

/***/ "./node_modules/datatables.net-responsive-bs4/js/responsive.bootstrap4.js":
/*!********************************************************************************!*\
  !*** ./node_modules/datatables.net-responsive-bs4/js/responsive.bootstrap4.js ***!
  \********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*! Bootstrap 4 integration for DataTables' Responsive\n * ©2016 SpryMedia Ltd - datatables.net/license\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net-bs4 */ \"./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs\"), __webpack_require__(/*! datatables.net-responsive */ \"./node_modules/datatables.net-responsive/js/dataTables.responsive.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable;\n  var _display = DataTable.Responsive.display;\n  var _original = _display.modal;\n\n  var _modal = $('<div class=\"modal fade dtr-bs-modal\" role=\"dialog\">' + '<div class=\"modal-dialog\" role=\"document\">' + '<div class=\"modal-content\">' + '<div class=\"modal-header\">' + '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>' + '</div>' + '<div class=\"modal-body\"/>' + '</div>' + '</div>' + '</div>');\n\n  _display.modal = function (options) {\n    return function (row, update, render) {\n      if (!$.fn.modal) {\n        _original(row, update, render);\n      } else {\n        if (!update) {\n          if (options && options.header) {\n            var header = _modal.find('div.modal-header');\n\n            var button = header.find('button').detach();\n            header.empty().append('<h4 class=\"modal-title\">' + options.header(row) + '</h4>').append(button);\n          }\n\n          _modal.find('div.modal-body').empty().append(render());\n\n          _modal.appendTo('body').modal();\n        }\n      }\n    };\n  };\n\n  return DataTable.Responsive;\n});\n\n//# sourceURL=webpack://rup/./node_modules/datatables.net-responsive-bs4/js/responsive.bootstrap4.js?");

/***/ }),

/***/ "./node_modules/datatables.net-responsive/js/dataTables.responsive.js":
/*!****************************************************************************!*\
  !*** ./node_modules/datatables.net-responsive/js/dataTables.responsive.js ***!
  \****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*! Responsive 2.2.9\n * 2014-2021 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     Responsive\n * @description Responsive tables plug-in for DataTables\n * @version     2.2.9\n * @file        dataTables.responsive.js\n * @author      SpryMedia Ltd (www.sprymedia.co.uk)\n * @contact     www.sprymedia.co.uk/contact\n * @copyright   Copyright 2014-2021 SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license/mit\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable;\n  /**\n   * Responsive is a plug-in for the DataTables library that makes use of\n   * DataTables' ability to change the visibility of columns, changing the\n   * visibility of columns so the displayed columns fit into the table container.\n   * The end result is that complex tables will be dynamically adjusted to fit\n   * into the viewport, be it on a desktop, tablet or mobile browser.\n   *\n   * Responsive for DataTables has two modes of operation, which can used\n   * individually or combined:\n   *\n   * * Class name based control - columns assigned class names that match the\n   *   breakpoint logic can be shown / hidden as required for each breakpoint.\n   * * Automatic control - columns are automatically hidden when there is no\n   *   room left to display them. Columns removed from the right.\n   *\n   * In additional to column visibility control, Responsive also has built into\n   * options to use DataTables' child row display to show / hide the information\n   * from the table that has been hidden. There are also two modes of operation\n   * for this child row display:\n   *\n   * * Inline - when the control element that the user can use to show / hide\n   *   child rows is displayed inside the first column of the table.\n   * * Column - where a whole column is dedicated to be the show / hide control.\n   *\n   * Initialisation of Responsive is performed by:\n   *\n   * * Adding the class `responsive` or `dt-responsive` to the table. In this case\n   *   Responsive will automatically be initialised with the default configuration\n   *   options when the DataTable is created.\n   * * Using the `responsive` option in the DataTables configuration options. This\n   *   can also be used to specify the configuration options, or simply set to\n   *   `true` to use the defaults.\n   *\n   *  @class\n   *  @param {object} settings DataTables settings object for the host table\n   *  @param {object} [opts] Configuration options\n   *  @requires jQuery 1.7+\n   *  @requires DataTables 1.10.3+\n   *\n   *  @example\n   *      $('#example').DataTable( {\n   *        responsive: true\n   *      } );\n   *    } );\n   */\n\n  var Responsive = function Responsive(settings, opts) {\n    // Sanity check that we are using DataTables 1.10 or newer\n    if (!DataTable.versionCheck || !DataTable.versionCheck('1.10.10')) {\n      throw 'DataTables Responsive requires DataTables 1.10.10 or newer';\n    }\n\n    this.s = {\n      dt: new DataTable.Api(settings),\n      columns: [],\n      current: []\n    }; // Check if responsive has already been initialised on this table\n\n    if (this.s.dt.settings()[0].responsive) {\n      return;\n    } // details is an object, but for simplicity the user can give it as a string\n    // or a boolean\n\n\n    if (opts && typeof opts.details === 'string') {\n      opts.details = {\n        type: opts.details\n      };\n    } else if (opts && opts.details === false) {\n      opts.details = {\n        type: false\n      };\n    } else if (opts && opts.details === true) {\n      opts.details = {\n        type: 'inline'\n      };\n    }\n\n    this.c = $.extend(true, {}, Responsive.defaults, DataTable.defaults.responsive, opts);\n    settings.responsive = this;\n\n    this._constructor();\n  };\n\n  $.extend(Responsive.prototype, {\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n     * Constructor\n     */\n\n    /**\n     * Initialise the Responsive instance\n     *\n     * @private\n     */\n    _constructor: function _constructor() {\n      var that = this;\n      var dt = this.s.dt;\n      var dtPrivateSettings = dt.settings()[0];\n      var oldWindowWidth = $(window).innerWidth();\n      dt.settings()[0]._responsive = this; // Use DataTables' throttle function to avoid processor thrashing on\n      // resize\n\n      $(window).on('resize.dtr orientationchange.dtr', DataTable.util.throttle(function () {\n        // iOS has a bug whereby resize can fire when only scrolling\n        // See: http://stackoverflow.com/questions/8898412\n        var width = $(window).innerWidth();\n\n        if (width !== oldWindowWidth) {\n          that._resize();\n\n          oldWindowWidth = width;\n        }\n      })); // DataTables doesn't currently trigger an event when a row is added, so\n      // we need to hook into its private API to enforce the hidden rows when\n      // new data is added\n\n      dtPrivateSettings.oApi._fnCallbackReg(dtPrivateSettings, 'aoRowCreatedCallback', function (tr, data, idx) {\n        if ($.inArray(false, that.s.current) !== -1) {\n          $('>td, >th', tr).each(function (i) {\n            var idx = dt.column.index('toData', i);\n\n            if (that.s.current[idx] === false) {\n              $(this).css('display', 'none');\n            }\n          });\n        }\n      }); // Destroy event handler\n\n\n      dt.on('destroy.dtr', function () {\n        dt.off('.dtr');\n        $(dt.table().body()).off('.dtr');\n        $(window).off('resize.dtr orientationchange.dtr');\n        dt.cells('.dtr-control').nodes().to$().removeClass('dtr-control'); // Restore the columns that we've hidden\n\n        $.each(that.s.current, function (i, val) {\n          if (val === false) {\n            that._setColumnVis(i, true);\n          }\n        });\n      }); // Reorder the breakpoints array here in case they have been added out\n      // of order\n\n      this.c.breakpoints.sort(function (a, b) {\n        return a.width < b.width ? 1 : a.width > b.width ? -1 : 0;\n      });\n\n      this._classLogic();\n\n      this._resizeAuto(); // Details handler\n\n\n      var details = this.c.details;\n\n      if (details.type !== false) {\n        that._detailsInit(); // DataTables will trigger this event on every column it shows and\n        // hides individually\n\n\n        dt.on('column-visibility.dtr', function () {\n          // Use a small debounce to allow multiple columns to be set together\n          if (that._timer) {\n            clearTimeout(that._timer);\n          }\n\n          that._timer = setTimeout(function () {\n            that._timer = null;\n\n            that._classLogic();\n\n            that._resizeAuto();\n\n            that._resize(true);\n\n            that._redrawChildren();\n          }, 100);\n        }); // Redraw the details box on each draw which will happen if the data\n        // has changed. This is used until DataTables implements a native\n        // `updated` event for rows\n\n        dt.on('draw.dtr', function () {\n          that._redrawChildren();\n        });\n        $(dt.table().node()).addClass('dtr-' + details.type);\n      }\n\n      dt.on('column-reorder.dtr', function (e, settings, details) {\n        that._classLogic();\n\n        that._resizeAuto();\n\n        that._resize(true);\n      }); // Change in column sizes means we need to calc\n\n      dt.on('column-sizing.dtr', function () {\n        that._resizeAuto();\n\n        that._resize();\n      }); // DT2 let's us tell it if we are hiding columns\n\n      dt.on('column-calc.dt', function (e, d) {\n        var curr = that.s.current;\n\n        for (var i = 0; i < curr.length; i++) {\n          var idx = d.visible.indexOf(i);\n\n          if (curr[i] === false && idx >= 0) {\n            d.visible.splice(idx, 1);\n          }\n        }\n      }); // On Ajax reload we want to reopen any child rows which are displayed\n      // by responsive\n\n      dt.on('preXhr.dtr', function () {\n        var rowIds = [];\n        dt.rows().every(function () {\n          if (this.child.isShown()) {\n            rowIds.push(this.id(true));\n          }\n        });\n        dt.one('draw.dtr', function () {\n          that._resizeAuto();\n\n          that._resize();\n\n          dt.rows(rowIds).every(function () {\n            that._detailsDisplay(this, false);\n          });\n        });\n      });\n      dt.on('draw.dtr', function () {\n        that._controlClass();\n      }).on('init.dtr', function (e, settings, details) {\n        if (e.namespace !== 'dt') {\n          return;\n        }\n\n        that._resizeAuto();\n\n        that._resize(); // If columns were hidden, then DataTables needs to adjust the\n        // column sizing\n\n\n        if ($.inArray(false, that.s.current)) {\n          dt.columns.adjust();\n        }\n      }); // First pass - draw the table for the current viewport size\n\n      this._resize();\n    },\n\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n     * Private methods\n     */\n\n    /**\n     * Calculate the visibility for the columns in a table for a given\n     * breakpoint. The result is pre-determined based on the class logic if\n     * class names are used to control all columns, but the width of the table\n     * is also used if there are columns which are to be automatically shown\n     * and hidden.\n     *\n     * @param  {string} breakpoint Breakpoint name to use for the calculation\n     * @return {array} Array of boolean values initiating the visibility of each\n     *   column.\n     *  @private\n     */\n    _columnsVisiblity: function _columnsVisiblity(breakpoint) {\n      var dt = this.s.dt;\n      var columns = this.s.columns;\n      var i, ien; // Create an array that defines the column ordering based first on the\n      // column's priority, and secondly the column index. This allows the\n      // columns to be removed from the right if the priority matches\n\n      var order = columns.map(function (col, idx) {\n        return {\n          columnIdx: idx,\n          priority: col.priority\n        };\n      }).sort(function (a, b) {\n        if (a.priority !== b.priority) {\n          return a.priority - b.priority;\n        }\n\n        return a.columnIdx - b.columnIdx;\n      }); // Class logic - determine which columns are in this breakpoint based\n      // on the classes. If no class control (i.e. `auto`) then `-` is used\n      // to indicate this to the rest of the function\n\n      var display = $.map(columns, function (col, i) {\n        if (dt.column(i).visible() === false) {\n          return 'not-visible';\n        }\n\n        return col.auto && col.minWidth === null ? false : col.auto === true ? '-' : $.inArray(breakpoint, col.includeIn) !== -1;\n      }); // Auto column control - first pass: how much width is taken by the\n      // ones that must be included from the non-auto columns\n\n      var requiredWidth = 0;\n\n      for (i = 0, ien = display.length; i < ien; i++) {\n        if (display[i] === true) {\n          requiredWidth += columns[i].minWidth;\n        }\n      } // Second pass, use up any remaining width for other columns. For\n      // scrolling tables we need to subtract the width of the scrollbar. It\n      // may not be requires which makes this sub-optimal, but it would\n      // require another full redraw to make complete use of those extra few\n      // pixels\n\n\n      var scrolling = dt.settings()[0].oScroll;\n      var bar = scrolling.sY || scrolling.sX ? scrolling.iBarWidth : 0;\n      var widthAvailable = dt.table().container().offsetWidth - bar;\n      var usedWidth = widthAvailable - requiredWidth; // Control column needs to always be included. This makes it sub-\n      // optimal in terms of using the available with, but to stop layout\n      // thrashing or overflow. Also we need to account for the control column\n      // width first so we know how much width is available for the other\n      // columns, since the control column might not be the first one shown\n\n      for (i = 0, ien = display.length; i < ien; i++) {\n        if (columns[i].control) {\n          usedWidth -= columns[i].minWidth;\n        }\n      } // Allow columns to be shown (counting by priority and then right to\n      // left) until we run out of room\n\n\n      var empty = false;\n\n      for (i = 0, ien = order.length; i < ien; i++) {\n        var colIdx = order[i].columnIdx;\n\n        if (display[colIdx] === '-' && !columns[colIdx].control && columns[colIdx].minWidth) {\n          // Once we've found a column that won't fit we don't let any\n          // others display either, or columns might disappear in the\n          // middle of the table\n          if (empty || usedWidth - columns[colIdx].minWidth < 0) {\n            empty = true;\n            display[colIdx] = false;\n          } else {\n            display[colIdx] = true;\n          }\n\n          usedWidth -= columns[colIdx].minWidth;\n        }\n      } // Determine if the 'control' column should be shown (if there is one).\n      // This is the case when there is a hidden column (that is not the\n      // control column). The two loops look inefficient here, but they are\n      // trivial and will fly through. We need to know the outcome from the\n      // first , before the action in the second can be taken\n\n\n      var showControl = false;\n\n      for (i = 0, ien = columns.length; i < ien; i++) {\n        if (!columns[i].control && !columns[i].never && display[i] === false) {\n          showControl = true;\n          break;\n        }\n      }\n\n      for (i = 0, ien = columns.length; i < ien; i++) {\n        if (columns[i].control) {\n          display[i] = showControl;\n        } // Replace not visible string with false from the control column detection above\n\n\n        if (display[i] === 'not-visible') {\n          display[i] = false;\n        }\n      } // Finally we need to make sure that there is at least one column that\n      // is visible\n\n\n      if ($.inArray(true, display) === -1) {\n        display[0] = true;\n      }\n\n      return display;\n    },\n\n    /**\n     * Create the internal `columns` array with information about the columns\n     * for the table. This includes determining which breakpoints the column\n     * will appear in, based upon class names in the column, which makes up the\n     * vast majority of this method.\n     *\n     * @private\n     */\n    _classLogic: function _classLogic() {\n      var that = this;\n      var calc = {};\n      var breakpoints = this.c.breakpoints;\n      var dt = this.s.dt;\n      var columns = dt.columns().eq(0).map(function (i) {\n        var column = this.column(i);\n        var className = column.header().className;\n        var priority = dt.settings()[0].aoColumns[i].responsivePriority;\n        var dataPriority = column.header().getAttribute('data-priority');\n\n        if (priority === undefined) {\n          priority = dataPriority === undefined || dataPriority === null ? 10000 : dataPriority * 1;\n        }\n\n        return {\n          className: className,\n          includeIn: [],\n          auto: false,\n          control: false,\n          never: className.match(/\\b(dtr\\-)?never\\b/) ? true : false,\n          priority: priority\n        };\n      }); // Simply add a breakpoint to `includeIn` array, ensuring that there are\n      // no duplicates\n\n      var add = function add(colIdx, name) {\n        var includeIn = columns[colIdx].includeIn;\n\n        if ($.inArray(name, includeIn) === -1) {\n          includeIn.push(name);\n        }\n      };\n\n      var column = function column(colIdx, name, operator, matched) {\n        var size, i, ien;\n\n        if (!operator) {\n          columns[colIdx].includeIn.push(name);\n        } else if (operator === 'max-') {\n          // Add this breakpoint and all smaller\n          size = that._find(name).width;\n\n          for (i = 0, ien = breakpoints.length; i < ien; i++) {\n            if (breakpoints[i].width <= size) {\n              add(colIdx, breakpoints[i].name);\n            }\n          }\n        } else if (operator === 'min-') {\n          // Add this breakpoint and all larger\n          size = that._find(name).width;\n\n          for (i = 0, ien = breakpoints.length; i < ien; i++) {\n            if (breakpoints[i].width >= size) {\n              add(colIdx, breakpoints[i].name);\n            }\n          }\n        } else if (operator === 'not-') {\n          // Add all but this breakpoint\n          for (i = 0, ien = breakpoints.length; i < ien; i++) {\n            if (breakpoints[i].name.indexOf(matched) === -1) {\n              add(colIdx, breakpoints[i].name);\n            }\n          }\n        }\n      }; // Loop over each column and determine if it has a responsive control\n      // class\n\n\n      columns.each(function (col, i) {\n        var classNames = col.className.split(' ');\n        var hasClass = false; // Split the class name up so multiple rules can be applied if needed\n\n        for (var k = 0, ken = classNames.length; k < ken; k++) {\n          var className = classNames[k].trim();\n\n          if (className === 'all' || className === 'dtr-all') {\n            // Include in all\n            hasClass = true;\n            col.includeIn = $.map(breakpoints, function (a) {\n              return a.name;\n            });\n            return;\n          } else if (className === 'none' || className === 'dtr-none' || col.never) {\n            // Include in none (default) and no auto\n            hasClass = true;\n            return;\n          } else if (className === 'control' || className === 'dtr-control') {\n            // Special column that is only visible, when one of the other\n            // columns is hidden. This is used for the details control\n            hasClass = true;\n            col.control = true;\n            return;\n          }\n\n          $.each(breakpoints, function (j, breakpoint) {\n            // Does this column have a class that matches this breakpoint?\n            var brokenPoint = breakpoint.name.split('-');\n            var re = new RegExp('(min\\\\-|max\\\\-|not\\\\-)?(' + brokenPoint[0] + ')(\\\\-[_a-zA-Z0-9])?');\n            var match = className.match(re);\n\n            if (match) {\n              hasClass = true;\n\n              if (match[2] === brokenPoint[0] && match[3] === '-' + brokenPoint[1]) {\n                // Class name matches breakpoint name fully\n                column(i, breakpoint.name, match[1], match[2] + match[3]);\n              } else if (match[2] === brokenPoint[0] && !match[3]) {\n                // Class name matched primary breakpoint name with no qualifier\n                column(i, breakpoint.name, match[1], match[2]);\n              }\n            }\n          });\n        } // If there was no control class, then automatic sizing is used\n\n\n        if (!hasClass) {\n          col.auto = true;\n        }\n      });\n      this.s.columns = columns;\n    },\n\n    /**\n     * Update the cells to show the correct control class / button\n     * @private\n     */\n    _controlClass: function _controlClass() {\n      if (this.c.details.type === 'inline') {\n        var dt = this.s.dt;\n        var columnsVis = this.s.current;\n        var firstVisible = $.inArray(true, columnsVis); // Remove from any cells which shouldn't have it\n\n        dt.cells(null, function (idx) {\n          return idx !== firstVisible;\n        }, {\n          page: 'current'\n        }).nodes().to$().filter('.dtr-control').removeClass('dtr-control');\n        dt.cells(null, firstVisible, {\n          page: 'current'\n        }).nodes().to$().addClass('dtr-control');\n      }\n    },\n\n    /**\n     * Show the details for the child row\n     *\n     * @param  {DataTables.Api} row    API instance for the row\n     * @param  {boolean}        update Update flag\n     * @private\n     */\n    _detailsDisplay: function _detailsDisplay(row, update) {\n      var that = this;\n      var dt = this.s.dt;\n      var details = this.c.details;\n\n      if (details && details.type !== false) {\n        var renderer = typeof details.renderer === 'string' ? Responsive.renderer[details.renderer]() : details.renderer;\n        var res = details.display(row, update, function () {\n          return renderer(dt, row[0], that._detailsObj(row[0]));\n        });\n\n        if (res === true || res === false) {\n          $(dt.table().node()).triggerHandler('responsive-display.dt', [dt, row, res, update]);\n        }\n      }\n    },\n\n    /**\n     * Initialisation for the details handler\n     *\n     * @private\n     */\n    _detailsInit: function _detailsInit() {\n      var that = this;\n      var dt = this.s.dt;\n      var details = this.c.details; // The inline type always uses the first child as the target\n\n      if (details.type === 'inline') {\n        details.target = 'td.dtr-control, th.dtr-control';\n      } // Keyboard accessibility\n\n\n      dt.on('draw.dtr', function () {\n        that._tabIndexes();\n      });\n\n      that._tabIndexes(); // Initial draw has already happened\n\n\n      $(dt.table().body()).on('keyup.dtr', 'td, th', function (e) {\n        if (e.keyCode === 13 && $(this).data('dtr-keyboard')) {\n          $(this).click();\n        }\n      }); // type.target can be a string jQuery selector or a column index\n\n      var target = details.target;\n      var selector = typeof target === 'string' ? target : 'td, th';\n\n      if (target !== undefined || target !== null) {\n        // Click handler to show / hide the details rows when they are available\n        $(dt.table().body()).on('click.dtr mousedown.dtr mouseup.dtr', selector, function (e) {\n          // If the table is not collapsed (i.e. there is no hidden columns)\n          // then take no action\n          if (!$(dt.table().node()).hasClass('collapsed')) {\n            return;\n          } // Check that the row is actually a DataTable's controlled node\n\n\n          if ($.inArray($(this).closest('tr').get(0), dt.rows().nodes().toArray()) === -1) {\n            return;\n          } // For column index, we determine if we should act or not in the\n          // handler - otherwise it is already okay\n\n\n          if (typeof target === 'number') {\n            var targetIdx = target < 0 ? dt.columns().eq(0).length + target : target;\n\n            if (dt.cell(this).index().column !== targetIdx) {\n              return;\n            }\n          } // $().closest() includes itself in its check\n\n\n          var row = dt.row($(this).closest('tr')); // Check event type to do an action\n\n          if (e.type === 'click') {\n            // The renderer is given as a function so the caller can execute it\n            // only when they need (i.e. if hiding there is no point is running\n            // the renderer)\n            that._detailsDisplay(row, false);\n          } else if (e.type === 'mousedown') {\n            // For mouse users, prevent the focus ring from showing\n            $(this).css('outline', 'none');\n          } else if (e.type === 'mouseup') {\n            // And then re-allow at the end of the click\n            $(this).trigger('blur').css('outline', '');\n          }\n        });\n      }\n    },\n\n    /**\n     * Get the details to pass to a renderer for a row\n     * @param  {int} rowIdx Row index\n     * @private\n     */\n    _detailsObj: function _detailsObj(rowIdx) {\n      var that = this;\n      var dt = this.s.dt;\n      return $.map(this.s.columns, function (col, i) {\n        // Never and control columns should not be passed to the renderer\n        if (col.never || col.control) {\n          return;\n        }\n\n        var dtCol = dt.settings()[0].aoColumns[i];\n        return {\n          className: dtCol.sClass,\n          columnIndex: i,\n          data: dt.cell(rowIdx, i).render(that.c.orthogonal),\n          hidden: dt.column(i).visible() && !that.s.current[i],\n          rowIndex: rowIdx,\n          title: dtCol.sTitle !== null ? dtCol.sTitle : $(dt.column(i).header()).text()\n        };\n      });\n    },\n\n    /**\n     * Find a breakpoint object from a name\n     *\n     * @param  {string} name Breakpoint name to find\n     * @return {object}      Breakpoint description object\n     * @private\n     */\n    _find: function _find(name) {\n      var breakpoints = this.c.breakpoints;\n\n      for (var i = 0, ien = breakpoints.length; i < ien; i++) {\n        if (breakpoints[i].name === name) {\n          return breakpoints[i];\n        }\n      }\n    },\n\n    /**\n     * Re-create the contents of the child rows as the display has changed in\n     * some way.\n     *\n     * @private\n     */\n    _redrawChildren: function _redrawChildren() {\n      var that = this;\n      var dt = this.s.dt;\n      dt.rows({\n        page: 'current'\n      }).iterator('row', function (settings, idx) {\n        var row = dt.row(idx);\n\n        that._detailsDisplay(dt.row(idx), true);\n      });\n    },\n\n    /**\n     * Alter the table display for a resized viewport. This involves first\n     * determining what breakpoint the window currently is in, getting the\n     * column visibilities to apply and then setting them.\n     *\n     * @param  {boolean} forceRedraw Force a redraw\n     * @private\n     */\n    _resize: function _resize(forceRedraw) {\n      var that = this;\n      var dt = this.s.dt;\n      var width = $(window).innerWidth();\n      var breakpoints = this.c.breakpoints;\n      var breakpoint = breakpoints[0].name;\n      var columns = this.s.columns;\n      var i, ien;\n      var oldVis = this.s.current.slice(); // Determine what breakpoint we are currently at\n\n      for (i = breakpoints.length - 1; i >= 0; i--) {\n        if (width <= breakpoints[i].width) {\n          breakpoint = breakpoints[i].name;\n          break;\n        }\n      } // Show the columns for that break point\n\n\n      var columnsVis = this._columnsVisiblity(breakpoint);\n\n      this.s.current = columnsVis; // Set the class before the column visibility is changed so event\n      // listeners know what the state is. Need to determine if there are\n      // any columns that are not visible but can be shown\n\n      var collapsedClass = false;\n\n      for (i = 0, ien = columns.length; i < ien; i++) {\n        if (columnsVis[i] === false && !columns[i].never && !columns[i].control && !dt.column(i).visible() === false) {\n          collapsedClass = true;\n          break;\n        }\n      }\n\n      $(dt.table().node()).toggleClass('collapsed', collapsedClass);\n      var changed = false;\n      var visible = 0;\n      dt.columns().eq(0).each(function (colIdx, i) {\n        if (columnsVis[i] === true) {\n          visible++;\n        }\n\n        if (forceRedraw || columnsVis[i] !== oldVis[i]) {\n          changed = true;\n\n          that._setColumnVis(colIdx, columnsVis[i]);\n        }\n      });\n\n      if (changed) {\n        this._redrawChildren(); // Inform listeners of the change\n\n\n        $(dt.table().node()).trigger('responsive-resize.dt', [dt, this.s.current]); // If no records, update the \"No records\" display element\n\n        if (dt.page.info().recordsDisplay === 0) {\n          $('td', dt.table().body()).eq(0).attr('colspan', visible);\n        }\n      }\n\n      that._controlClass();\n    },\n\n    /**\n     * Determine the width of each column in the table so the auto column hiding\n     * has that information to work with. This method is never going to be 100%\n     * perfect since column widths can change slightly per page, but without\n     * seriously compromising performance this is quite effective.\n     *\n     * @private\n     */\n    _resizeAuto: function _resizeAuto() {\n      var dt = this.s.dt;\n      var columns = this.s.columns; // Are we allowed to do auto sizing?\n\n      if (!this.c.auto) {\n        return;\n      } // Are there any columns that actually need auto-sizing, or do they all\n      // have classes defined\n\n\n      if ($.inArray(true, $.map(columns, function (c) {\n        return c.auto;\n      })) === -1) {\n        return;\n      } // Need to restore all children. They will be reinstated by a re-render\n\n\n      if (!$.isEmptyObject(_childNodeStore)) {\n        $.each(_childNodeStore, function (key) {\n          var idx = key.split('-');\n\n          _childNodesRestore(dt, idx[0] * 1, idx[1] * 1);\n        });\n      } // Clone the table with the current data in it\n\n\n      var tableWidth = dt.table().node().offsetWidth;\n      var columnWidths = dt.columns;\n      var clonedTable = dt.table().node().cloneNode(false);\n      var clonedHeader = $(dt.table().header().cloneNode(false)).appendTo(clonedTable);\n      var clonedBody = $(dt.table().body()).clone(false, false).empty().appendTo(clonedTable); // use jQuery because of IE8\n\n      clonedTable.style.width = 'auto'; // Header\n\n      var headerCells = dt.columns().header().filter(function (idx) {\n        return dt.column(idx).visible();\n      }).to$().clone(false).css('display', 'table-cell').css('width', 'auto').css('min-width', 0); // Body rows - we don't need to take account of DataTables' column\n      // visibility since we implement our own here (hence the `display` set)\n\n      $(clonedBody).append($(dt.rows({\n        page: 'current'\n      }).nodes()).clone(false)).find('th, td').css('display', ''); // Footer\n\n      var footer = dt.table().footer();\n\n      if (footer) {\n        var clonedFooter = $(footer.cloneNode(false)).appendTo(clonedTable);\n        var footerCells = dt.columns().footer().filter(function (idx) {\n          return dt.column(idx).visible();\n        }).to$().clone(false).css('display', 'table-cell');\n        $('<tr/>').append(footerCells).appendTo(clonedFooter);\n      }\n\n      $('<tr/>').append(headerCells).appendTo(clonedHeader); // In the inline case extra padding is applied to the first column to\n      // give space for the show / hide icon. We need to use this in the\n      // calculation\n\n      if (this.c.details.type === 'inline') {\n        $(clonedTable).addClass('dtr-inline collapsed');\n      } // It is unsafe to insert elements with the same name into the DOM\n      // multiple times. For example, cloning and inserting a checked radio\n      // clears the chcecked state of the original radio.\n\n\n      $(clonedTable).find('[name]').removeAttr('name'); // A position absolute table would take the table out of the flow of\n      // our container element, bypassing the height and width (Scroller)\n\n      $(clonedTable).css('position', 'relative');\n      var inserted = $('<div/>').css({\n        width: 1,\n        height: 1,\n        overflow: 'hidden',\n        clear: 'both'\n      }).append(clonedTable);\n      inserted.insertBefore(dt.table().node()); // The cloned header now contains the smallest that each column can be\n\n      headerCells.each(function (i) {\n        var idx = dt.column.index('fromVisible', i);\n        columns[idx].minWidth = this.offsetWidth || 0;\n      });\n      inserted.remove();\n    },\n\n    /**\n     * Get the state of the current hidden columns - controlled by Responsive only\n     */\n    _responsiveOnlyHidden: function _responsiveOnlyHidden() {\n      var dt = this.s.dt;\n      return $.map(this.s.current, function (v, i) {\n        // If the column is hidden by DataTables then it can't be hidden by\n        // Responsive!\n        if (dt.column(i).visible() === false) {\n          return true;\n        }\n\n        return v;\n      });\n    },\n\n    /**\n     * Set a column's visibility.\n     *\n     * We don't use DataTables' column visibility controls in order to ensure\n     * that column visibility can Responsive can no-exist. Since only IE8+ is\n     * supported (and all evergreen browsers of course) the control of the\n     * display attribute works well.\n     *\n     * @param {integer} col      Column index\n     * @param {boolean} showHide Show or hide (true or false)\n     * @private\n     */\n    _setColumnVis: function _setColumnVis(col, showHide) {\n      var dt = this.s.dt;\n      var display = showHide ? '' : 'none'; // empty string will remove the attr\n\n      $(dt.column(col).header()).css('display', display).toggleClass('dtr-hidden', !showHide);\n      $(dt.column(col).footer()).css('display', display).toggleClass('dtr-hidden', !showHide);\n      dt.column(col).nodes().to$().css('display', display).toggleClass('dtr-hidden', !showHide); // If the are child nodes stored, we might need to reinsert them\n\n      if (!$.isEmptyObject(_childNodeStore)) {\n        dt.cells(null, col).indexes().each(function (idx) {\n          _childNodesRestore(dt, idx.row, idx.column);\n        });\n      }\n    },\n\n    /**\n     * Update the cell tab indexes for keyboard accessibility. This is called on\n     * every table draw - that is potentially inefficient, but also the least\n     * complex option given that column visibility can change on the fly. Its a\n     * shame user-focus was removed from CSS 3 UI, as it would have solved this\n     * issue with a single CSS statement.\n     *\n     * @private\n     */\n    _tabIndexes: function _tabIndexes() {\n      var dt = this.s.dt;\n      var cells = dt.cells({\n        page: 'current'\n      }).nodes().to$();\n      var ctx = dt.settings()[0];\n      var target = this.c.details.target;\n      cells.filter('[data-dtr-keyboard]').removeData('[data-dtr-keyboard]');\n\n      if (typeof target === 'number') {\n        dt.cells(null, target, {\n          page: 'current'\n        }).nodes().to$().attr('tabIndex', ctx.iTabIndex).data('dtr-keyboard', 1);\n      } else {\n        // This is a bit of a hack - we need to limit the selected nodes to just\n        // those of this table\n        if (target === 'td:first-child, th:first-child') {\n          target = '>td:first-child, >th:first-child';\n        }\n\n        $(target, dt.rows({\n          page: 'current'\n        }).nodes()).attr('tabIndex', ctx.iTabIndex).data('dtr-keyboard', 1);\n      }\n    }\n  });\n  /**\n   * List of default breakpoints. Each item in the array is an object with two\n   * properties:\n   *\n   * * `name` - the breakpoint name.\n   * * `width` - the breakpoint width\n   *\n   * @name Responsive.breakpoints\n   * @static\n   */\n\n  Responsive.breakpoints = [{\n    name: 'desktop',\n    width: Infinity\n  }, {\n    name: 'tablet-l',\n    width: 1024\n  }, {\n    name: 'tablet-p',\n    width: 768\n  }, {\n    name: 'mobile-l',\n    width: 480\n  }, {\n    name: 'mobile-p',\n    width: 320\n  }];\n  /**\n   * Display methods - functions which define how the hidden data should be shown\n   * in the table.\n   *\n   * @namespace\n   * @name Responsive.defaults\n   * @static\n   */\n\n  Responsive.display = {\n    childRow: function childRow(row, update, render) {\n      if (update) {\n        if ($(row.node()).hasClass('parent')) {\n          row.child(render(), 'child').show();\n          return true;\n        }\n      } else {\n        if (!row.child.isShown()) {\n          row.child(render(), 'child').show();\n          $(row.node()).addClass('parent');\n          return true;\n        } else {\n          row.child(false);\n          $(row.node()).removeClass('parent');\n          return false;\n        }\n      }\n    },\n    childRowImmediate: function childRowImmediate(row, update, render) {\n      if (!update && row.child.isShown() || !row.responsive.hasHidden()) {\n        // User interaction and the row is show, or nothing to show\n        row.child(false);\n        $(row.node()).removeClass('parent');\n        return false;\n      } else {\n        // Display\n        row.child(render(), 'child').show();\n        $(row.node()).addClass('parent');\n        return true;\n      }\n    },\n    // This is a wrapper so the modal options for Bootstrap and jQuery UI can\n    // have options passed into them. This specific one doesn't need to be a\n    // function but it is for consistency in the `modal` name\n    modal: function modal(options) {\n      return function (row, update, render) {\n        if (!update) {\n          // Show a modal\n          var close = function close() {\n            modal.remove(); // will tidy events for us\n\n            $(document).off('keypress.dtr');\n          };\n\n          var modal = $('<div class=\"dtr-modal\"/>').append($('<div class=\"dtr-modal-display\"/>').append($('<div class=\"dtr-modal-content\"/>').append(render())).append($('<div class=\"dtr-modal-close\">&times;</div>').click(function () {\n            close();\n          }))).append($('<div class=\"dtr-modal-background\"/>').click(function () {\n            close();\n          })).appendTo('body');\n          $(document).on('keyup.dtr', function (e) {\n            if (e.keyCode === 27) {\n              e.stopPropagation();\n              close();\n            }\n          });\n        } else {\n          $('div.dtr-modal-content').empty().append(render());\n        }\n\n        if (options && options.header) {\n          $('div.dtr-modal-content').prepend('<h2>' + options.header(row) + '</h2>');\n        }\n      };\n    }\n  };\n  var _childNodeStore = {};\n\n  function _childNodes(dt, row, col) {\n    var name = row + '-' + col;\n\n    if (_childNodeStore[name]) {\n      return _childNodeStore[name];\n    } // https://jsperf.com/childnodes-array-slice-vs-loop\n\n\n    var nodes = [];\n    var children = dt.cell(row, col).node().childNodes;\n\n    for (var i = 0, ien = children.length; i < ien; i++) {\n      nodes.push(children[i]);\n    }\n\n    _childNodeStore[name] = nodes;\n    return nodes;\n  }\n\n  function _childNodesRestore(dt, row, col) {\n    var name = row + '-' + col;\n\n    if (!_childNodeStore[name]) {\n      return;\n    }\n\n    var node = dt.cell(row, col).node();\n    var store = _childNodeStore[name];\n    var parent = store[0].parentNode;\n    var parentChildren = parent.childNodes;\n    var a = [];\n\n    for (var i = 0, ien = parentChildren.length; i < ien; i++) {\n      a.push(parentChildren[i]);\n    }\n\n    for (var j = 0, jen = a.length; j < jen; j++) {\n      node.appendChild(a[j]);\n    }\n\n    _childNodeStore[name] = undefined;\n  }\n  /**\n   * Display methods - functions which define how the hidden data should be shown\n   * in the table.\n   *\n   * @namespace\n   * @name Responsive.defaults\n   * @static\n   */\n\n\n  Responsive.renderer = {\n    listHiddenNodes: function listHiddenNodes() {\n      return function (api, rowIdx, columns) {\n        var ul = $('<ul data-dtr-index=\"' + rowIdx + '\" class=\"dtr-details\"/>');\n        var found = false;\n        var data = $.each(columns, function (i, col) {\n          if (col.hidden) {\n            var klass = col.className ? 'class=\"' + col.className + '\"' : '';\n            $('<li ' + klass + ' data-dtr-index=\"' + col.columnIndex + '\" data-dt-row=\"' + col.rowIndex + '\" data-dt-column=\"' + col.columnIndex + '\">' + '<span class=\"dtr-title\">' + col.title + '</span> ' + '</li>').append($('<span class=\"dtr-data\"/>').append(_childNodes(api, col.rowIndex, col.columnIndex))) // api.cell( col.rowIndex, col.columnIndex ).node().childNodes ) )\n            .appendTo(ul);\n            found = true;\n          }\n        });\n        return found ? ul : false;\n      };\n    },\n    listHidden: function listHidden() {\n      return function (api, rowIdx, columns) {\n        var data = $.map(columns, function (col) {\n          var klass = col.className ? 'class=\"' + col.className + '\"' : '';\n          return col.hidden ? '<li ' + klass + ' data-dtr-index=\"' + col.columnIndex + '\" data-dt-row=\"' + col.rowIndex + '\" data-dt-column=\"' + col.columnIndex + '\">' + '<span class=\"dtr-title\">' + col.title + '</span> ' + '<span class=\"dtr-data\">' + col.data + '</span>' + '</li>' : '';\n        }).join('');\n        return data ? $('<ul data-dtr-index=\"' + rowIdx + '\" class=\"dtr-details\"/>').append(data) : false;\n      };\n    },\n    tableAll: function tableAll(options) {\n      options = $.extend({\n        tableClass: ''\n      }, options);\n      return function (api, rowIdx, columns) {\n        var data = $.map(columns, function (col) {\n          var klass = col.className ? 'class=\"' + col.className + '\"' : '';\n          return '<tr ' + klass + ' data-dt-row=\"' + col.rowIndex + '\" data-dt-column=\"' + col.columnIndex + '\">' + '<td>' + col.title + ':' + '</td> ' + '<td>' + col.data + '</td>' + '</tr>';\n        }).join('');\n        return $('<table class=\"' + options.tableClass + ' dtr-details\" width=\"100%\"/>').append(data);\n      };\n    }\n  };\n  /**\n   * Responsive default settings for initialisation\n   *\n   * @namespace\n   * @name Responsive.defaults\n   * @static\n   */\n\n  Responsive.defaults = {\n    /**\n     * List of breakpoints for the instance. Note that this means that each\n     * instance can have its own breakpoints. Additionally, the breakpoints\n     * cannot be changed once an instance has been creased.\n     *\n     * @type {Array}\n     * @default Takes the value of `Responsive.breakpoints`\n     */\n    breakpoints: Responsive.breakpoints,\n\n    /**\n     * Enable / disable auto hiding calculations. It can help to increase\n     * performance slightly if you disable this option, but all columns would\n     * need to have breakpoint classes assigned to them\n     *\n     * @type {Boolean}\n     * @default  `true`\n     */\n    auto: true,\n\n    /**\n     * Details control. If given as a string value, the `type` property of the\n     * default object is set to that value, and the defaults used for the rest\n     * of the object - this is for ease of implementation.\n     *\n     * The object consists of the following properties:\n     *\n     * * `display` - A function that is used to show and hide the hidden details\n     * * `renderer` - function that is called for display of the child row data.\n     *   The default function will show the data from the hidden columns\n     * * `target` - Used as the selector for what objects to attach the child\n     *   open / close to\n     * * `type` - `false` to disable the details display, `inline` or `column`\n     *   for the two control types\n     *\n     * @type {Object|string}\n     */\n    details: {\n      display: Responsive.display.childRow,\n      renderer: Responsive.renderer.listHidden(),\n      target: 0,\n      type: 'inline'\n    },\n\n    /**\n     * Orthogonal data request option. This is used to define the data type\n     * requested when Responsive gets the data to show in the child row.\n     *\n     * @type {String}\n     */\n    orthogonal: 'display'\n  };\n  /*\n   * API\n   */\n\n  var Api = $.fn.dataTable.Api; // Doesn't do anything - work around for a bug in DT... Not documented\n\n  Api.register('responsive()', function () {\n    return this;\n  });\n  Api.register('responsive.index()', function (li) {\n    li = $(li);\n    return {\n      column: li.data('dtr-index'),\n      row: li.parent().data('dtr-index')\n    };\n  });\n  Api.register('responsive.rebuild()', function () {\n    return this.iterator('table', function (ctx) {\n      if (ctx._responsive) {\n        ctx._responsive._classLogic();\n      }\n    });\n  });\n  Api.register('responsive.recalc()', function () {\n    return this.iterator('table', function (ctx) {\n      if (ctx._responsive) {\n        ctx._responsive._resizeAuto();\n\n        ctx._responsive._resize();\n      }\n    });\n  });\n  Api.register('responsive.hasHidden()', function () {\n    var ctx = this.context[0];\n    return ctx._responsive ? $.inArray(false, ctx._responsive._responsiveOnlyHidden()) !== -1 : false;\n  });\n  Api.registerPlural('columns().responsiveHidden()', 'column().responsiveHidden()', function () {\n    return this.iterator('column', function (settings, column) {\n      return settings._responsive ? settings._responsive._responsiveOnlyHidden()[column] : false;\n    }, 1);\n  });\n  /**\n   * Version information\n   *\n   * @name Responsive.version\n   * @static\n   */\n\n  Responsive.version = '2.2.9';\n  $.fn.dataTable.Responsive = Responsive;\n  $.fn.DataTable.Responsive = Responsive; // Attach a listener to the document which listens for DataTables initialisation\n  // events so we can automatically initialise\n\n  $(document).on('preInit.dt.dtr', function (e, settings, json) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if ($(settings.nTable).hasClass('responsive') || $(settings.nTable).hasClass('dt-responsive') || settings.oInit.responsive || DataTable.defaults.responsive) {\n      var init = settings.oInit.responsive;\n\n      if (init !== false) {\n        new Responsive(settings, $.isPlainObject(init) ? init : {});\n      }\n    }\n  });\n  return Responsive;\n});\n\n//# sourceURL=webpack://rup/./node_modules/datatables.net-responsive/js/dataTables.responsive.js?");

/***/ }),

/***/ "./node_modules/datatables.net/js/jquery.dataTables.js":
/*!*************************************************************!*\
  !*** ./node_modules/datatables.net/js/jquery.dataTables.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*! DataTables 1.13.5\n * ©2008-2023 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     DataTables\n * @description Paginate, search and order HTML tables\n * @version     1.13.4\n * @author      SpryMedia Ltd\n * @contact     www.datatables.net\n * @copyright   SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n\n/*jslint evil: true, undef: true, browser: true */\n\n/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/\n(function (factory) {\n  \"use strict\";\n\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else { var jq; }\n})(function ($, window, document, undefined) {\n  \"use strict\";\n\n  var DataTable = function DataTable(selector, options) {\n    // Check if called with a window or jQuery object for DOM less applications\n    // This is for backwards compatibility\n    if (DataTable.factory(selector, options)) {\n      return DataTable;\n    } // When creating with `new`, create a new DataTable, returning the API instance\n\n\n    if (this instanceof DataTable) {\n      return $(selector).DataTable(options);\n    } else {\n      // Argument switching\n      options = selector;\n    }\n    /**\n     * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n     * return the resulting jQuery object.\n     *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n     *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n     *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n     *    criterion (\"applied\") or all TR elements (i.e. no filter).\n     *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n     *    Can be either 'current', whereby the current sorting of the table is used, or\n     *    'original' whereby the original order the data was read into the table is used.\n     *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n     *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n     *    'current' and filter is 'applied', regardless of what they might be given as.\n     *  @returns {object} jQuery object, filtered by the given selector.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Highlight every second row\n     *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n     *    } );\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Filter to rows with 'Webkit' in them, add a background colour and then\n     *      // remove the filter, thus highlighting the 'Webkit' rows only.\n     *      oTable.fnFilter('Webkit');\n     *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n     *      oTable.fnFilter('');\n     *    } );\n     */\n\n\n    this.$ = function (sSelector, oOpts) {\n      return this.api(true).$(sSelector, oOpts);\n    };\n    /**\n     * Almost identical to $ in operation, but in this case returns the data for the matched\n     * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n     * rather than any descendants, so the data can be obtained for the row/cell. If matching\n     * rows are found, the data returned is the original data array/object that was used to\n     * create the row (or a generated array if from a DOM source).\n     *\n     * This method is often useful in-combination with $ where both functions are given the\n     * same parameters and the array indexes will match identically.\n     *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n     *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n     *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n     *    criterion (\"applied\") or all elements (i.e. no filter).\n     *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n     *    Can be either 'current', whereby the current sorting of the table is used, or\n     *    'original' whereby the original order the data was read into the table is used.\n     *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n     *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n     *    'current' and filter is 'applied', regardless of what they might be given as.\n     *  @returns {array} Data for the matched elements. If any elements, as a result of the\n     *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n     *    entry in the array.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Get the data from the first row in the table\n     *      var data = oTable._('tr:first');\n     *\n     *      // Do something useful with the data\n     *      alert( \"First cell is: \"+data[0] );\n     *    } );\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Filter to 'Webkit' and get all data for\n     *      oTable.fnFilter('Webkit');\n     *      var data = oTable._('tr', {\"search\": \"applied\"});\n     *\n     *      // Do something with the data\n     *      alert( data.length+\" rows matched the search\" );\n     *    } );\n     */\n\n\n    this._ = function (sSelector, oOpts) {\n      return this.api(true).rows(sSelector, oOpts).data();\n    };\n    /**\n     * Create a DataTables Api instance, with the currently selected tables for\n     * the Api's context.\n     * @param {boolean} [traditional=false] Set the API instance's context to be\n     *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n     *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n     *   or if all tables captured in the jQuery object should be used.\n     * @return {DataTables.Api}\n     */\n\n\n    this.api = function (traditional) {\n      return traditional ? new _Api2(_fnSettingsFromNode(this[_ext.iApiIndex])) : new _Api2(this);\n    };\n    /**\n     * Add a single new row or multiple rows of data to the table. Please note\n     * that this is suitable for client-side processing only - if you are using\n     * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n     * must add it to the data source, i.e. the server-side, through an Ajax call.\n     *  @param {array|object} data The data to be added to the table. This can be:\n     *    <ul>\n     *      <li>1D array of data - add a single row with the data provided</li>\n     *      <li>2D array of arrays - add multiple rows in a single call</li>\n     *      <li>object - data object when using <i>mData</i></li>\n     *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n     *    </ul>\n     *  @param {bool} [redraw=true] redraw the table or not\n     *  @returns {array} An array of integers, representing the list of indexes in\n     *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n     *    the table.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    // Global var for counter\n     *    var giCount = 2;\n     *\n     *    $(document).ready(function() {\n     *      $('#example').dataTable();\n     *    } );\n     *\n     *    function fnClickAddRow() {\n     *      $('#example').dataTable().fnAddData( [\n     *        giCount+\".1\",\n     *        giCount+\".2\",\n     *        giCount+\".3\",\n     *        giCount+\".4\" ]\n     *      );\n     *\n     *      giCount++;\n     *    }\n     */\n\n\n    this.fnAddData = function (data, redraw) {\n      var api = this.api(true);\n      /* Check if we want to add multiple rows or not */\n\n      var rows = Array.isArray(data) && (Array.isArray(data[0]) || $.isPlainObject(data[0])) ? api.rows.add(data) : api.row.add(data);\n\n      if (redraw === undefined || redraw) {\n        api.draw();\n      }\n\n      return rows.flatten().toArray();\n    };\n    /**\n     * This function will make DataTables recalculate the column sizes, based on the data\n     * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n     * through the sWidth parameter). This can be useful when the width of the table's\n     * parent element changes (for example a window resize).\n     *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable( {\n     *        \"sScrollY\": \"200px\",\n     *        \"bPaginate\": false\n     *      } );\n     *\n     *      $(window).on('resize', function () {\n     *        oTable.fnAdjustColumnSizing();\n     *      } );\n     *    } );\n     */\n\n\n    this.fnAdjustColumnSizing = function (bRedraw) {\n      var api = this.api(true).columns.adjust();\n      var settings = api.settings()[0];\n      var scroll = settings.oScroll;\n\n      if (bRedraw === undefined || bRedraw) {\n        api.draw(false);\n      } else if (scroll.sX !== \"\" || scroll.sY !== \"\") {\n        /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n        _fnScrollDraw(settings);\n      }\n    };\n    /**\n     * Quickly and simply clear a table\n     *  @param {bool} [bRedraw=true] redraw the table or not\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n     *      oTable.fnClearTable();\n     *    } );\n     */\n\n\n    this.fnClearTable = function (bRedraw) {\n      var api = this.api(true).clear();\n\n      if (bRedraw === undefined || bRedraw) {\n        api.draw();\n      }\n    };\n    /**\n     * The exact opposite of 'opening' a row, this function will close any rows which\n     * are currently 'open'.\n     *  @param {node} nTr the table row to 'close'\n     *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable;\n     *\n     *      // 'open' an information row when a row is clicked on\n     *      $('#example tbody tr').click( function () {\n     *        if ( oTable.fnIsOpen(this) ) {\n     *          oTable.fnClose( this );\n     *        } else {\n     *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n     *        }\n     *      } );\n     *\n     *      oTable = $('#example').dataTable();\n     *    } );\n     */\n\n\n    this.fnClose = function (nTr) {\n      this.api(true).row(nTr).child.hide();\n    };\n    /**\n     * Remove a row for the table\n     *  @param {mixed} target The index of the row from aoData to be deleted, or\n     *    the TR element you want to delete\n     *  @param {function|null} [callBack] Callback function\n     *  @param {bool} [redraw=true] Redraw the table or not\n     *  @returns {array} The row that was deleted\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Immediately remove the first row\n     *      oTable.fnDeleteRow( 0 );\n     *    } );\n     */\n\n\n    this.fnDeleteRow = function (target, callback, redraw) {\n      var api = this.api(true);\n      var rows = api.rows(target);\n      var settings = rows.settings()[0];\n      var data = settings.aoData[rows[0][0]];\n      rows.remove();\n\n      if (callback) {\n        callback.call(this, settings, data);\n      }\n\n      if (redraw === undefined || redraw) {\n        api.draw();\n      }\n\n      return data;\n    };\n    /**\n     * Restore the table to it's original state in the DOM by removing all of DataTables\n     * enhancements, alterations to the DOM structure of the table and event listeners.\n     *  @param {boolean} [remove=false] Completely remove the table from the DOM\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n     *      var oTable = $('#example').dataTable();\n     *      oTable.fnDestroy();\n     *    } );\n     */\n\n\n    this.fnDestroy = function (remove) {\n      this.api(true).destroy(remove);\n    };\n    /**\n     * Redraw the table\n     *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n     *      oTable.fnDraw();\n     *    } );\n     */\n\n\n    this.fnDraw = function (complete) {\n      // Note that this isn't an exact match to the old call to _fnDraw - it takes\n      // into account the new data, but can hold position.\n      this.api(true).draw(complete);\n    };\n    /**\n     * Filter the input based on data\n     *  @param {string} sInput String to filter the table on\n     *  @param {int|null} [iColumn] Column to limit filtering to\n     *  @param {bool} [bRegex=false] Treat as regular expression or not\n     *  @param {bool} [bSmart=true] Perform smart filtering or not\n     *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n     *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Sometime later - filter...\n     *      oTable.fnFilter( 'test string' );\n     *    } );\n     */\n\n\n    this.fnFilter = function (sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive) {\n      var api = this.api(true);\n\n      if (iColumn === null || iColumn === undefined) {\n        api.search(sInput, bRegex, bSmart, bCaseInsensitive);\n      } else {\n        api.column(iColumn).search(sInput, bRegex, bSmart, bCaseInsensitive);\n      }\n\n      api.draw();\n    };\n    /**\n     * Get the data for the whole table, an individual row or an individual cell based on the\n     * provided parameters.\n     *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n     *    a TR node then the data source for the whole row will be returned. If given as a\n     *    TD/TH cell node then iCol will be automatically calculated and the data for the\n     *    cell returned. If given as an integer, then this is treated as the aoData internal\n     *    data index for the row (see fnGetPosition) and the data for that row used.\n     *  @param {int} [col] Optional column index that you want the data of.\n     *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n     *    returned. If mRow is defined, just data for that row, and is iCol is\n     *    defined, only data for the designated cell is returned.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    // Row data\n     *    $(document).ready(function() {\n     *      oTable = $('#example').dataTable();\n     *\n     *      oTable.$('tr').click( function () {\n     *        var data = oTable.fnGetData( this );\n     *        // ... do something with the array / object of data for the row\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Individual cell data\n     *    $(document).ready(function() {\n     *      oTable = $('#example').dataTable();\n     *\n     *      oTable.$('td').click( function () {\n     *        var sData = oTable.fnGetData( this );\n     *        alert( 'The cell clicked on had the value of '+sData );\n     *      } );\n     *    } );\n     */\n\n\n    this.fnGetData = function (src, col) {\n      var api = this.api(true);\n\n      if (src !== undefined) {\n        var type = src.nodeName ? src.nodeName.toLowerCase() : '';\n        return col !== undefined || type == 'td' || type == 'th' ? api.cell(src, col).data() : api.row(src).data() || null;\n      }\n\n      return api.data().toArray();\n    };\n    /**\n     * Get an array of the TR nodes that are used in the table's body. Note that you will\n     * typically want to use the '$' API method in preference to this as it is more\n     * flexible.\n     *  @param {int} [iRow] Optional row index for the TR element you want\n     *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n     *    in the table's body, or iRow is defined, just the TR element requested.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Get the nodes from the table\n     *      var nNodes = oTable.fnGetNodes( );\n     *    } );\n     */\n\n\n    this.fnGetNodes = function (iRow) {\n      var api = this.api(true);\n      return iRow !== undefined ? api.row(iRow).node() : api.rows().nodes().flatten().toArray();\n    };\n    /**\n     * Get the array indexes of a particular cell from it's DOM element\n     * and column index including hidden columns\n     *  @param {node} node this can either be a TR, TD or TH in the table's body\n     *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n     *    if given as a cell, an array of [row index, column index (visible),\n     *    column index (all)] is given.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      $('#example tbody td').click( function () {\n     *        // Get the position of the current data from the node\n     *        var aPos = oTable.fnGetPosition( this );\n     *\n     *        // Get the data array for this row\n     *        var aData = oTable.fnGetData( aPos[0] );\n     *\n     *        // Update the data array and return the value\n     *        aData[ aPos[1] ] = 'clicked';\n     *        this.innerHTML = 'clicked';\n     *      } );\n     *\n     *      // Init DataTables\n     *      oTable = $('#example').dataTable();\n     *    } );\n     */\n\n\n    this.fnGetPosition = function (node) {\n      var api = this.api(true);\n      var nodeName = node.nodeName.toUpperCase();\n\n      if (nodeName == 'TR') {\n        return api.row(node).index();\n      } else if (nodeName == 'TD' || nodeName == 'TH') {\n        var cell = api.cell(node).index();\n        return [cell.row, cell.columnVisible, cell.column];\n      }\n\n      return null;\n    };\n    /**\n     * Check to see if a row is 'open' or not.\n     *  @param {node} nTr the table row to check\n     *  @returns {boolean} true if the row is currently open, false otherwise\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable;\n     *\n     *      // 'open' an information row when a row is clicked on\n     *      $('#example tbody tr').click( function () {\n     *        if ( oTable.fnIsOpen(this) ) {\n     *          oTable.fnClose( this );\n     *        } else {\n     *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n     *        }\n     *      } );\n     *\n     *      oTable = $('#example').dataTable();\n     *    } );\n     */\n\n\n    this.fnIsOpen = function (nTr) {\n      return this.api(true).row(nTr).child.isShown();\n    };\n    /**\n     * This function will place a new row directly after a row which is currently\n     * on display on the page, with the HTML contents that is passed into the\n     * function. This can be used, for example, to ask for confirmation that a\n     * particular record should be deleted.\n     *  @param {node} nTr The table row to 'open'\n     *  @param {string|node|jQuery} mHtml The HTML to put into the row\n     *  @param {string} sClass Class to give the new TD cell\n     *  @returns {node} The row opened. Note that if the table row passed in as the\n     *    first parameter, is not found in the table, this method will silently\n     *    return.\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable;\n     *\n     *      // 'open' an information row when a row is clicked on\n     *      $('#example tbody tr').click( function () {\n     *        if ( oTable.fnIsOpen(this) ) {\n     *          oTable.fnClose( this );\n     *        } else {\n     *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n     *        }\n     *      } );\n     *\n     *      oTable = $('#example').dataTable();\n     *    } );\n     */\n\n\n    this.fnOpen = function (nTr, mHtml, sClass) {\n      return this.api(true).row(nTr).child(mHtml, sClass).show().child()[0];\n    };\n    /**\n     * Change the pagination - provides the internal logic for pagination in a simple API\n     * function. With this function you can have a DataTables table go to the next,\n     * previous, first or last pages.\n     *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n     *    or page number to jump to (integer), note that page 0 is the first page.\n     *  @param {bool} [bRedraw=true] Redraw the table or not\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *      oTable.fnPageChange( 'next' );\n     *    } );\n     */\n\n\n    this.fnPageChange = function (mAction, bRedraw) {\n      var api = this.api(true).page(mAction);\n\n      if (bRedraw === undefined || bRedraw) {\n        api.draw(false);\n      }\n    };\n    /**\n     * Show a particular column\n     *  @param {int} iCol The column whose display should be changed\n     *  @param {bool} bShow Show (true) or hide (false) the column\n     *  @param {bool} [bRedraw=true] Redraw the table or not\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Hide the second column after initialisation\n     *      oTable.fnSetColumnVis( 1, false );\n     *    } );\n     */\n\n\n    this.fnSetColumnVis = function (iCol, bShow, bRedraw) {\n      var api = this.api(true).column(iCol).visible(bShow);\n\n      if (bRedraw === undefined || bRedraw) {\n        api.columns.adjust().draw();\n      }\n    };\n    /**\n     * Get the settings for a particular table for external manipulation\n     *  @returns {object} DataTables settings object. See\n     *    {@link DataTable.models.oSettings}\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *      var oSettings = oTable.fnSettings();\n     *\n     *      // Show an example parameter from the settings\n     *      alert( oSettings._iDisplayStart );\n     *    } );\n     */\n\n\n    this.fnSettings = function () {\n      return _fnSettingsFromNode(this[_ext.iApiIndex]);\n    };\n    /**\n     * Sort the table by a particular column\n     *  @param {int} iCol the data index to sort on. Note that this will not match the\n     *    'display index' if you have hidden data entries\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Sort immediately with columns 0 and 1\n     *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n     *    } );\n     */\n\n\n    this.fnSort = function (aaSort) {\n      this.api(true).order(aaSort).draw();\n    };\n    /**\n     * Attach a sort listener to an element for a given column\n     *  @param {node} nNode the element to attach the sort listener to\n     *  @param {int} iColumn the column that a click on this node will sort on\n     *  @param {function} [fnCallback] callback function when sort is run\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *\n     *      // Sort on column 1, when 'sorter' is clicked on\n     *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n     *    } );\n     */\n\n\n    this.fnSortListener = function (nNode, iColumn, fnCallback) {\n      this.api(true).order.listener(nNode, iColumn, fnCallback);\n    };\n    /**\n     * Update a table cell or row - this method will accept either a single value to\n     * update the cell with, an array of values with one element for each column or\n     * an object in the same format as the original data source. The function is\n     * self-referencing in order to make the multi column updates easier.\n     *  @param {object|array|string} mData Data to update the cell/row with\n     *  @param {node|int} mRow TR element you want to update or the aoData index\n     *  @param {int} [iColumn] The column to update, give as null or undefined to\n     *    update a whole row.\n     *  @param {bool} [bRedraw=true] Redraw the table or not\n     *  @param {bool} [bAction=true] Perform pre-draw actions or not\n     *  @returns {int} 0 on success, 1 on error\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n     *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n     *    } );\n     */\n\n\n    this.fnUpdate = function (mData, mRow, iColumn, bRedraw, bAction) {\n      var api = this.api(true);\n\n      if (iColumn === undefined || iColumn === null) {\n        api.row(mRow).data(mData);\n      } else {\n        api.cell(mRow, iColumn).data(mData);\n      }\n\n      if (bAction === undefined || bAction) {\n        api.columns.adjust();\n      }\n\n      if (bRedraw === undefined || bRedraw) {\n        api.draw();\n      }\n\n      return 0;\n    };\n    /**\n     * Provide a common method for plug-ins to check the version of DataTables being used, in order\n     * to ensure compatibility.\n     *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n     *    formats \"X\" and \"X.Y\" are also acceptable.\n     *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n     *    version, or false if this version of DataTales is not suitable\n     *  @method\n     *  @dtopt API\n     *  @deprecated Since v1.10\n     *\n     *  @example\n     *    $(document).ready(function() {\n     *      var oTable = $('#example').dataTable();\n     *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n     *    } );\n     */\n\n\n    this.fnVersionCheck = _ext.fnVersionCheck;\n\n    var _that = this;\n\n    var emptyInit = options === undefined;\n    var len = this.length;\n\n    if (emptyInit) {\n      options = {};\n    }\n\n    this.oApi = this.internal = _ext.internal; // Extend with old style plug-in API methods\n\n    for (var fn in DataTable.ext.internal) {\n      if (fn) {\n        this[fn] = _fnExternApiFunc(fn);\n      }\n    }\n\n    this.each(function () {\n      // For each initialisation we want to give it a clean initialisation\n      // object that can be bashed around\n      var o = {};\n      var oInit = len > 1 ? // optimisation for single table case\n      _fnExtend(o, options, true) : options;\n      /*global oInit,_that,emptyInit*/\n\n      var i = 0,\n          iLen,\n          j,\n          jLen,\n          k,\n          kLen;\n      var sId = this.getAttribute('id');\n      var bInitHandedOff = false;\n      var defaults = DataTable.defaults;\n      var $this = $(this);\n      /* Sanity check */\n\n      if (this.nodeName.toLowerCase() != 'table') {\n        _fnLog(null, 0, 'Non-table node initialisation (' + this.nodeName + ')', 2);\n\n        return;\n      }\n      /* Backwards compatibility for the defaults */\n\n\n      _fnCompatOpts(defaults);\n\n      _fnCompatCols(defaults.column);\n      /* Convert the camel-case defaults to Hungarian */\n\n\n      _fnCamelToHungarian(defaults, defaults, true);\n\n      _fnCamelToHungarian(defaults.column, defaults.column, true);\n      /* Setting up the initialisation object */\n\n\n      _fnCamelToHungarian(defaults, $.extend(oInit, $this.data()), true);\n      /* Check to see if we are re-initialising a table */\n\n\n      var allSettings = DataTable.settings;\n\n      for (i = 0, iLen = allSettings.length; i < iLen; i++) {\n        var s = allSettings[i];\n        /* Base check on table node */\n\n        if (s.nTable == this || s.nTHead && s.nTHead.parentNode == this || s.nTFoot && s.nTFoot.parentNode == this) {\n          var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n          var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\n          if (emptyInit || bRetrieve) {\n            return s.oInstance;\n          } else if (bDestroy) {\n            s.oInstance.fnDestroy();\n            break;\n          } else {\n            _fnLog(s, 0, 'Cannot reinitialise DataTable', 3);\n\n            return;\n          }\n        }\n        /* If the element we are initialising has the same ID as a table which was previously\n         * initialised, but the table nodes don't match (from before) then we destroy the old\n         * instance by simply deleting it. This is under the assumption that the table has been\n         * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n         */\n\n\n        if (s.sTableId == this.id) {\n          allSettings.splice(i, 1);\n          break;\n        }\n      }\n      /* Ensure the table has an ID - required for accessibility */\n\n\n      if (sId === null || sId === \"\") {\n        sId = \"DataTables_Table_\" + DataTable.ext._unique++;\n        this.id = sId;\n      }\n      /* Create the settings object for this table and set some of the default parameters */\n\n\n      var oSettings = $.extend(true, {}, DataTable.models.oSettings, {\n        \"sDestroyWidth\": $this[0].style.width,\n        \"sInstance\": sId,\n        \"sTableId\": sId\n      });\n      oSettings.nTable = this;\n      oSettings.oApi = _that.internal;\n      oSettings.oInit = oInit;\n      allSettings.push(oSettings); // Need to add the instance after the instance after the settings object has been added\n      // to the settings array, so we can self reference the table instance if more than one\n\n      oSettings.oInstance = _that.length === 1 ? _that : $this.dataTable(); // Backwards compatibility, before we apply all the defaults\n\n      _fnCompatOpts(oInit);\n\n      _fnLanguageCompat(oInit.oLanguage); // If the length menu is given, but the init display length is not, use the length menu\n\n\n      if (oInit.aLengthMenu && !oInit.iDisplayLength) {\n        oInit.iDisplayLength = Array.isArray(oInit.aLengthMenu[0]) ? oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n      } // Apply the defaults and init options to make a single init object will all\n      // options defined from defaults and instance options.\n\n\n      oInit = _fnExtend($.extend(true, {}, defaults), oInit); // Map the initialisation options onto the settings object\n\n      _fnMap(oSettings.oFeatures, oInit, [\"bPaginate\", \"bLengthChange\", \"bFilter\", \"bSort\", \"bSortMulti\", \"bInfo\", \"bProcessing\", \"bAutoWidth\", \"bSortClasses\", \"bServerSide\", \"bDeferRender\"]);\n\n      _fnMap(oSettings, oInit, [\"asStripeClasses\", \"ajax\", \"fnServerData\", \"fnFormatNumber\", \"sServerMethod\", \"aaSorting\", \"aaSortingFixed\", \"aLengthMenu\", \"sPaginationType\", \"sAjaxSource\", \"sAjaxDataProp\", \"iStateDuration\", \"sDom\", \"bSortCellsTop\", \"iTabIndex\", \"fnStateLoadCallback\", \"fnStateSaveCallback\", \"renderer\", \"searchDelay\", \"rowId\", [\"iCookieDuration\", \"iStateDuration\"], // backwards compat\n      [\"oSearch\", \"oPreviousSearch\"], [\"aoSearchCols\", \"aoPreSearchCols\"], [\"iDisplayLength\", \"_iDisplayLength\"]]);\n\n      _fnMap(oSettings.oScroll, oInit, [[\"sScrollX\", \"sX\"], [\"sScrollXInner\", \"sXInner\"], [\"sScrollY\", \"sY\"], [\"bScrollCollapse\", \"bCollapse\"]]);\n\n      _fnMap(oSettings.oLanguage, oInit, \"fnInfoCallback\");\n      /* Callback functions which are array driven */\n\n\n      _fnCallbackReg(oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user');\n\n      _fnCallbackReg(oSettings, 'aoServerParams', oInit.fnServerParams, 'user');\n\n      _fnCallbackReg(oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user');\n\n      _fnCallbackReg(oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user');\n\n      _fnCallbackReg(oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user');\n\n      _fnCallbackReg(oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user');\n\n      _fnCallbackReg(oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user');\n\n      _fnCallbackReg(oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user');\n\n      _fnCallbackReg(oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user');\n\n      _fnCallbackReg(oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user');\n\n      _fnCallbackReg(oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user');\n\n      oSettings.rowIdFn = _fnGetObjectDataFn(oInit.rowId);\n      /* Browser support detection */\n\n      _fnBrowserDetect(oSettings);\n\n      var oClasses = oSettings.oClasses;\n      $.extend(oClasses, DataTable.ext.classes, oInit.oClasses);\n      $this.addClass(oClasses.sTable);\n\n      if (oSettings.iInitDisplayStart === undefined) {\n        /* Display start point, taking into account the save saving */\n        oSettings.iInitDisplayStart = oInit.iDisplayStart;\n        oSettings._iDisplayStart = oInit.iDisplayStart;\n      }\n\n      if (oInit.iDeferLoading !== null) {\n        oSettings.bDeferLoading = true;\n        var tmp = Array.isArray(oInit.iDeferLoading);\n        oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n        oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n      }\n      /* Language definitions */\n\n\n      var oLanguage = oSettings.oLanguage;\n      $.extend(true, oLanguage, oInit.oLanguage);\n\n      if (oLanguage.sUrl) {\n        /* Get the language definitions from a file - because this Ajax call makes the language\n         * get async to the remainder of this function we use bInitHandedOff to indicate that\n         * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n         */\n        $.ajax({\n          dataType: 'json',\n          url: oLanguage.sUrl,\n          success: function success(json) {\n            _fnCamelToHungarian(defaults.oLanguage, json);\n\n            _fnLanguageCompat(json);\n\n            $.extend(true, oLanguage, json, oSettings.oInit.oLanguage);\n\n            _fnCallbackFire(oSettings, null, 'i18n', [oSettings]);\n\n            _fnInitialise(oSettings);\n          },\n          error: function error() {\n            // Error occurred loading language file, continue on as best we can\n            _fnInitialise(oSettings);\n          }\n        });\n        bInitHandedOff = true;\n      } else {\n        _fnCallbackFire(oSettings, null, 'i18n', [oSettings]);\n      }\n      /*\n       * Stripes\n       */\n\n\n      if (oInit.asStripeClasses === null) {\n        oSettings.asStripeClasses = [oClasses.sStripeOdd, oClasses.sStripeEven];\n      }\n      /* Remove row stripe classes if they are already on the table row */\n\n\n      var stripeClasses = oSettings.asStripeClasses;\n      var rowOne = $this.children('tbody').find('tr').eq(0);\n\n      if ($.inArray(true, $.map(stripeClasses, function (el, i) {\n        return rowOne.hasClass(el);\n      })) !== -1) {\n        $('tbody tr', this).removeClass(stripeClasses.join(' '));\n        oSettings.asDestroyStripes = stripeClasses.slice();\n      }\n      /*\n       * Columns\n       * See if we should load columns automatically or use defined ones\n       */\n\n\n      var anThs = [];\n      var aoColumnsInit;\n      var nThead = this.getElementsByTagName('thead');\n\n      if (nThead.length !== 0) {\n        _fnDetectHeader(oSettings.aoHeader, nThead[0]);\n\n        anThs = _fnGetUniqueThs(oSettings);\n      }\n      /* If not given a column array, generate one with nulls */\n\n\n      if (oInit.aoColumns === null) {\n        aoColumnsInit = [];\n\n        for (i = 0, iLen = anThs.length; i < iLen; i++) {\n          aoColumnsInit.push(null);\n        }\n      } else {\n        aoColumnsInit = oInit.aoColumns;\n      }\n      /* Add the columns */\n\n\n      for (i = 0, iLen = aoColumnsInit.length; i < iLen; i++) {\n        _fnAddColumn(oSettings, anThs ? anThs[i] : null);\n      }\n      /* Apply the column definitions */\n\n\n      _fnApplyColumnDefs(oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n        _fnColumnOptions(oSettings, iCol, oDef);\n      });\n      /* HTML5 attribute detection - build an mData object automatically if the\n       * attributes are found\n       */\n\n\n      if (rowOne.length) {\n        var a = function a(cell, name) {\n          return cell.getAttribute('data-' + name) !== null ? name : null;\n        };\n\n        $(rowOne[0]).children('th, td').each(function (i, cell) {\n          var col = oSettings.aoColumns[i];\n\n          if (!col) {\n            _fnLog(oSettings, 0, 'Incorrect column count', 18);\n          }\n\n          if (col.mData === i) {\n            var sort = a(cell, 'sort') || a(cell, 'order');\n            var filter = a(cell, 'filter') || a(cell, 'search');\n\n            if (sort !== null || filter !== null) {\n              col.mData = {\n                _: i + '.display',\n                sort: sort !== null ? i + '.@data-' + sort : undefined,\n                type: sort !== null ? i + '.@data-' + sort : undefined,\n                filter: filter !== null ? i + '.@data-' + filter : undefined\n              };\n              col._isArrayHost = true;\n\n              _fnColumnOptions(oSettings, i);\n            }\n          }\n        });\n      }\n\n      var features = oSettings.oFeatures;\n\n      var loadedInit = function loadedInit() {\n        /*\n         * Sorting\n         * @todo For modularisation (1.11) this needs to do into a sort start up handler\n         */\n        // If aaSorting is not defined, then we use the first indicator in asSorting\n        // in case that has been altered, so the default sort reflects that option\n        if (oInit.aaSorting === undefined) {\n          var sorting = oSettings.aaSorting;\n\n          for (i = 0, iLen = sorting.length; i < iLen; i++) {\n            sorting[i][1] = oSettings.aoColumns[i].asSorting[0];\n          }\n        }\n        /* Do a first pass on the sorting classes (allows any size changes to be taken into\n         * account, and also will apply sorting disabled classes if disabled\n         */\n\n\n        _fnSortingClasses(oSettings);\n\n        if (features.bSort) {\n          _fnCallbackReg(oSettings, 'aoDrawCallback', function () {\n            if (oSettings.bSorted) {\n              var aSort = _fnSortFlatten(oSettings);\n\n              var sortedColumns = {};\n              $.each(aSort, function (i, val) {\n                sortedColumns[val.src] = val.dir;\n              });\n\n              _fnCallbackFire(oSettings, null, 'order', [oSettings, aSort, sortedColumns]);\n\n              _fnSortAria(oSettings);\n            }\n          });\n        }\n\n        _fnCallbackReg(oSettings, 'aoDrawCallback', function () {\n          if (oSettings.bSorted || _fnDataSource(oSettings) === 'ssp' || features.bDeferRender) {\n            _fnSortingClasses(oSettings);\n          }\n        }, 'sc');\n        /*\n         * Final init\n         * Cache the header, body and footer as required, creating them if needed\n         */\n        // Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\n\n        var captions = $this.children('caption').each(function () {\n          this._captionSide = $(this).css('caption-side');\n        });\n        var thead = $this.children('thead');\n\n        if (thead.length === 0) {\n          thead = $('<thead/>').appendTo($this);\n        }\n\n        oSettings.nTHead = thead[0];\n        var tbody = $this.children('tbody');\n\n        if (tbody.length === 0) {\n          tbody = $('<tbody/>').insertAfter(thead);\n        }\n\n        oSettings.nTBody = tbody[0];\n        var tfoot = $this.children('tfoot');\n\n        if (tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\")) {\n          // If we are a scrolling table, and no footer has been given, then we need to create\n          // a tfoot element for the caption element to be appended to\n          tfoot = $('<tfoot/>').appendTo($this);\n        }\n\n        if (tfoot.length === 0 || tfoot.children().length === 0) {\n          $this.addClass(oClasses.sNoFooter);\n        } else if (tfoot.length > 0) {\n          oSettings.nTFoot = tfoot[0];\n\n          _fnDetectHeader(oSettings.aoFooter, oSettings.nTFoot);\n        }\n        /* Check if there is data passing into the constructor */\n\n\n        if (oInit.aaData) {\n          for (i = 0; i < oInit.aaData.length; i++) {\n            _fnAddData(oSettings, oInit.aaData[i]);\n          }\n        } else if (oSettings.bDeferLoading || _fnDataSource(oSettings) == 'dom') {\n          /* Grab the data from the page - only do this when deferred loading or no Ajax\n           * source since there is no point in reading the DOM data if we are then going\n           * to replace it with Ajax data\n           */\n          _fnAddTr(oSettings, $(oSettings.nTBody).children('tr'));\n        }\n        /* Copy the data index array */\n\n\n        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n        /* Initialisation complete - table can be drawn */\n\n        oSettings.bInitialised = true;\n        /* Check if we need to initialise the table (it might not have been handed off to the\n         * language processor)\n         */\n\n        if (bInitHandedOff === false) {\n          _fnInitialise(oSettings);\n        }\n      };\n      /* Must be done after everything which can be overridden by the state saving! */\n\n\n      _fnCallbackReg(oSettings, 'aoDrawCallback', _fnSaveState, 'state_save');\n\n      if (oInit.bStateSave) {\n        features.bStateSave = true;\n\n        _fnLoadState(oSettings, oInit, loadedInit);\n      } else {\n        loadedInit();\n      }\n    });\n    _that = null;\n    return this;\n  };\n  /*\n   * It is useful to have variables which are scoped locally so only the\n   * DataTables functions can access them and they don't leak into global space.\n   * At the same time these functions are often useful over multiple files in the\n   * core and API, so we list, or at least document, all variables which are used\n   * by DataTables as private variables here. This also ensures that there is no\n   * clashing of variable names and that they can easily referenced for reuse.\n   */\n  // Defined else where\n  //  _selector_run\n  //  _selector_opts\n  //  _selector_first\n  //  _selector_row_indexes\n\n\n  var _ext; // DataTable.ext\n\n\n  var _Api2; // DataTable.Api\n\n\n  var _api_register; // DataTable.Api.register\n\n\n  var _api_registerPlural; // DataTable.Api.registerPlural\n\n\n  var _re_dic = {};\n  var _re_new_lines = /[\\r\\n\\u2028]/g;\n  var _re_html = /<.*?>/g; // This is not strict ISO8601 - Date.parse() is quite lax, although\n  // implementations differ between browsers.\n\n  var _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/; // Escape regular expression special characters\n\n  var _re_escape_regex = new RegExp('(\\\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-'].join('|\\\\') + ')', 'g'); // http://en.wikipedia.org/wiki/Foreign_exchange_market\n  // - \\u20BD - Russian ruble.\n  // - \\u20a9 - South Korean Won\n  // - \\u20BA - Turkish Lira\n  // - \\u20B9 - Indian Rupee\n  // - R - Brazil (R$) and South Africa\n  // - fr - Swiss Franc\n  // - kr - Swedish krona, Norwegian krone and Danish krone\n  // - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n  // - Ƀ - Bitcoin\n  // - Ξ - Ethereum\n  //   standards as thousands separators.\n\n\n  var _re_formatted_numeric = /['\\u00A0,$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfkɃΞ]/gi;\n\n  var _empty = function _empty(d) {\n    return !d || d === true || d === '-' ? true : false;\n  };\n\n  var _intVal = function _intVal(s) {\n    var integer = parseInt(s, 10);\n    return !isNaN(integer) && isFinite(s) ? integer : null;\n  }; // Convert from a formatted number with characters other than `.` as the\n  // decimal place, to a Javascript number\n\n\n  var _numToDecimal = function _numToDecimal(num, decimalPoint) {\n    // Cache created regular expressions for speed as this function is called often\n    if (!_re_dic[decimalPoint]) {\n      _re_dic[decimalPoint] = new RegExp(_fnEscapeRegex(decimalPoint), 'g');\n    }\n\n    return typeof num === 'string' && decimalPoint !== '.' ? num.replace(/\\./g, '').replace(_re_dic[decimalPoint], '.') : num;\n  };\n\n  var _isNumber = function _isNumber(d, decimalPoint, formatted) {\n    var type = _typeof(d);\n\n    var strType = type === 'string';\n\n    if (type === 'number' || type === 'bigint') {\n      return true;\n    } // If empty return immediately so there must be a number if it is a\n    // formatted string (this stops the string \"k\", or \"kr\", etc being detected\n    // as a formatted number for currency\n\n\n    if (_empty(d)) {\n      return true;\n    }\n\n    if (decimalPoint && strType) {\n      d = _numToDecimal(d, decimalPoint);\n    }\n\n    if (formatted && strType) {\n      d = d.replace(_re_formatted_numeric, '');\n    }\n\n    return !isNaN(parseFloat(d)) && isFinite(d);\n  }; // A string without HTML in it can be considered to be HTML still\n\n\n  var _isHtml = function _isHtml(d) {\n    return _empty(d) || typeof d === 'string';\n  };\n\n  var _htmlNumeric = function _htmlNumeric(d, decimalPoint, formatted) {\n    if (_empty(d)) {\n      return true;\n    }\n\n    var html = _isHtml(d);\n\n    return !html ? null : _isNumber(_stripHtml(d), decimalPoint, formatted) ? true : null;\n  };\n\n  var _pluck = function _pluck(a, prop, prop2) {\n    var out = [];\n    var i = 0,\n        ien = a.length; // Could have the test in the loop for slightly smaller code, but speed\n    // is essential here\n\n    if (prop2 !== undefined) {\n      for (; i < ien; i++) {\n        if (a[i] && a[i][prop]) {\n          out.push(a[i][prop][prop2]);\n        }\n      }\n    } else {\n      for (; i < ien; i++) {\n        if (a[i]) {\n          out.push(a[i][prop]);\n        }\n      }\n    }\n\n    return out;\n  }; // Basically the same as _pluck, but rather than looping over `a` we use `order`\n  // as the indexes to pick from `a`\n\n\n  var _pluck_order = function _pluck_order(a, order, prop, prop2) {\n    var out = [];\n    var i = 0,\n        ien = order.length; // Could have the test in the loop for slightly smaller code, but speed\n    // is essential here\n\n    if (prop2 !== undefined) {\n      for (; i < ien; i++) {\n        if (a[order[i]][prop]) {\n          out.push(a[order[i]][prop][prop2]);\n        }\n      }\n    } else {\n      for (; i < ien; i++) {\n        out.push(a[order[i]][prop]);\n      }\n    }\n\n    return out;\n  };\n\n  var _range = function _range(len, start) {\n    var out = [];\n    var end;\n\n    if (start === undefined) {\n      start = 0;\n      end = len;\n    } else {\n      end = start;\n      start = len;\n    }\n\n    for (var i = start; i < end; i++) {\n      out.push(i);\n    }\n\n    return out;\n  };\n\n  var _removeEmpty = function _removeEmpty(a) {\n    var out = [];\n\n    for (var i = 0, ien = a.length; i < ien; i++) {\n      if (a[i]) {\n        // careful - will remove all falsy values!\n        out.push(a[i]);\n      }\n    }\n\n    return out;\n  };\n\n  var _stripHtml = function _stripHtml(d) {\n    return d.replace(_re_html, '') // Complete tags\n    .replace(/<script/i, ''); // Safety for incomplete script tag\n  };\n  /**\n   * Determine if all values in the array are unique. This means we can short\n   * cut the _unique method at the cost of a single loop. A sorted array is used\n   * to easily check the values.\n   *\n   * @param  {array} src Source array\n   * @return {boolean} true if all unique, false otherwise\n   * @ignore\n   */\n\n\n  var _areAllUnique = function _areAllUnique(src) {\n    if (src.length < 2) {\n      return true;\n    }\n\n    var sorted = src.slice().sort();\n    var last = sorted[0];\n\n    for (var i = 1, ien = sorted.length; i < ien; i++) {\n      if (sorted[i] === last) {\n        return false;\n      }\n\n      last = sorted[i];\n    }\n\n    return true;\n  };\n  /**\n   * Find the unique elements in a source array.\n   *\n   * @param  {array} src Source array\n   * @return {array} Array of unique items\n   * @ignore\n   */\n\n\n  var _unique = function _unique(src) {\n    if (_areAllUnique(src)) {\n      return src.slice();\n    } // A faster unique method is to use object keys to identify used values,\n    // but this doesn't work with arrays or objects, which we must also\n    // consider. See jsperf.com/compare-array-unique-versions/4 for more\n    // information.\n\n\n    var out = [],\n        val,\n        i,\n        ien = src.length,\n        j,\n        k = 0;\n\n    again: for (i = 0; i < ien; i++) {\n      val = src[i];\n\n      for (j = 0; j < k; j++) {\n        if (out[j] === val) {\n          continue again;\n        }\n      }\n\n      out.push(val);\n      k++;\n    }\n\n    return out;\n  }; // Surprisingly this is faster than [].concat.apply\n  // https://jsperf.com/flatten-an-array-loop-vs-reduce/2\n\n\n  var _flatten = function _flatten(out, val) {\n    if (Array.isArray(val)) {\n      for (var i = 0; i < val.length; i++) {\n        _flatten(out, val[i]);\n      }\n    } else {\n      out.push(val);\n    }\n\n    return out;\n  };\n\n  var _includes = function _includes(search, start) {\n    if (start === undefined) {\n      start = 0;\n    }\n\n    return this.indexOf(search, start) !== -1;\n  }; // Array.isArray polyfill.\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\n\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    };\n  }\n\n  if (!Array.prototype.includes) {\n    Array.prototype.includes = _includes;\n  } // .trim() polyfill\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\n\n\n  if (!String.prototype.trim) {\n    String.prototype.trim = function () {\n      return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n    };\n  }\n\n  if (!String.prototype.includes) {\n    String.prototype.includes = _includes;\n  }\n  /**\n   * DataTables utility methods\n   * \n   * This namespace provides helper methods that DataTables uses internally to\n   * create a DataTable, but which are not exclusively used only for DataTables.\n   * These methods can be used by extension authors to save the duplication of\n   * code.\n   *\n   *  @namespace\n   */\n\n\n  DataTable.util = {\n    /**\n     * Throttle the calls to a function. Arguments and context are maintained\n     * for the throttled function.\n     *\n     * @param {function} fn Function to be called\n     * @param {integer} freq Call frequency in mS\n     * @return {function} Wrapped function\n     */\n    throttle: function throttle(fn, freq) {\n      var frequency = freq !== undefined ? freq : 200,\n          last,\n          timer;\n      return function () {\n        var that = this,\n            now = +new Date(),\n            args = arguments;\n\n        if (last && now < last + frequency) {\n          clearTimeout(timer);\n          timer = setTimeout(function () {\n            last = undefined;\n            fn.apply(that, args);\n          }, frequency);\n        } else {\n          last = now;\n          fn.apply(that, args);\n        }\n      };\n    },\n\n    /**\n     * Escape a string such that it can be used in a regular expression\n     *\n     *  @param {string} val string to escape\n     *  @returns {string} escaped string\n     */\n    escapeRegex: function escapeRegex(val) {\n      return val.replace(_re_escape_regex, '\\\\$1');\n    },\n\n    /**\n     * Create a function that will write to a nested object or array\n     * @param {*} source JSON notation string\n     * @returns Write function\n     */\n    set: function set(source) {\n      if ($.isPlainObject(source)) {\n        /* Unlike get, only the underscore (global) option is used for for\n         * setting data since we don't know the type here. This is why an object\n         * option is not documented for `mData` (which is read/write), but it is\n         * for `mRender` which is read only.\n         */\n        return DataTable.util.set(source._);\n      } else if (source === null) {\n        // Nothing to do when the data source is null\n        return function () {};\n      } else if (typeof source === 'function') {\n        return function (data, val, meta) {\n          source(data, 'set', val, meta);\n        };\n      } else if (typeof source === 'string' && (source.indexOf('.') !== -1 || source.indexOf('[') !== -1 || source.indexOf('(') !== -1)) {\n        // Like the get, we need to get data from a nested object\n        var setData = function setData(data, val, src) {\n          var a = _fnSplitObjNotation(src),\n              b;\n\n          var aLast = a[a.length - 1];\n          var arrayNotation, funcNotation, o, innerSrc;\n\n          for (var i = 0, iLen = a.length - 1; i < iLen; i++) {\n            // Protect against prototype pollution\n            if (a[i] === '__proto__' || a[i] === 'constructor') {\n              throw new Error('Cannot set prototype values');\n            } // Check if we are dealing with an array notation request\n\n\n            arrayNotation = a[i].match(__reArray);\n            funcNotation = a[i].match(__reFn);\n\n            if (arrayNotation) {\n              a[i] = a[i].replace(__reArray, '');\n              data[a[i]] = []; // Get the remainder of the nested object to set so we can recurse\n\n              b = a.slice();\n              b.splice(0, i + 1);\n              innerSrc = b.join('.'); // Traverse each entry in the array setting the properties requested\n\n              if (Array.isArray(val)) {\n                for (var j = 0, jLen = val.length; j < jLen; j++) {\n                  o = {};\n                  setData(o, val[j], innerSrc);\n                  data[a[i]].push(o);\n                }\n              } else {\n                // We've been asked to save data to an array, but it\n                // isn't array data to be saved. Best that can be done\n                // is to just save the value.\n                data[a[i]] = val;\n              } // The inner call to setData has already traversed through the remainder\n              // of the source and has set the data, thus we can exit here\n\n\n              return;\n            } else if (funcNotation) {\n              // Function call\n              a[i] = a[i].replace(__reFn, '');\n              data = data[a[i]](val);\n            } // If the nested object doesn't currently exist - since we are\n            // trying to set the value - create it\n\n\n            if (data[a[i]] === null || data[a[i]] === undefined) {\n              data[a[i]] = {};\n            }\n\n            data = data[a[i]];\n          } // Last item in the input - i.e, the actual set\n\n\n          if (aLast.match(__reFn)) {\n            // Function call\n            data = data[aLast.replace(__reFn, '')](val);\n          } else {\n            // If array notation is used, we just want to strip it and use the property name\n            // and assign the value. If it isn't used, then we get the result we want anyway\n            data[aLast.replace(__reArray, '')] = val;\n          }\n        };\n\n        return function (data, val) {\n          // meta is also passed in, but not used\n          return setData(data, val, source);\n        };\n      } else {\n        // Array or flat object mapping\n        return function (data, val) {\n          // meta is also passed in, but not used\n          data[source] = val;\n        };\n      }\n    },\n\n    /**\n     * Create a function that will read nested objects from arrays, based on JSON notation\n     * @param {*} source JSON notation string\n     * @returns Value read\n     */\n    get: function get(source) {\n      if ($.isPlainObject(source)) {\n        // Build an object of get functions, and wrap them in a single call\n        var o = {};\n        $.each(source, function (key, val) {\n          if (val) {\n            o[key] = DataTable.util.get(val);\n          }\n        });\n        return function (data, type, row, meta) {\n          var t = o[type] || o._;\n          return t !== undefined ? t(data, type, row, meta) : data;\n        };\n      } else if (source === null) {\n        // Give an empty string for rendering / sorting etc\n        return function (data) {\n          // type, row and meta also passed, but not used\n          return data;\n        };\n      } else if (typeof source === 'function') {\n        return function (data, type, row, meta) {\n          return source(data, type, row, meta);\n        };\n      } else if (typeof source === 'string' && (source.indexOf('.') !== -1 || source.indexOf('[') !== -1 || source.indexOf('(') !== -1)) {\n        /* If there is a . in the source string then the data source is in a\n         * nested object so we loop over the data for each level to get the next\n         * level down. On each loop we test for undefined, and if found immediately\n         * return. This allows entire objects to be missing and sDefaultContent to\n         * be used if defined, rather than throwing an error\n         */\n        var fetchData = function fetchData(data, type, src) {\n          var arrayNotation, funcNotation, out, innerSrc;\n\n          if (src !== \"\") {\n            var a = _fnSplitObjNotation(src);\n\n            for (var i = 0, iLen = a.length; i < iLen; i++) {\n              // Check if we are dealing with special notation\n              arrayNotation = a[i].match(__reArray);\n              funcNotation = a[i].match(__reFn);\n\n              if (arrayNotation) {\n                // Array notation\n                a[i] = a[i].replace(__reArray, ''); // Condition allows simply [] to be passed in\n\n                if (a[i] !== \"\") {\n                  data = data[a[i]];\n                }\n\n                out = []; // Get the remainder of the nested object to get\n\n                a.splice(0, i + 1);\n                innerSrc = a.join('.'); // Traverse each entry in the array getting the properties requested\n\n                if (Array.isArray(data)) {\n                  for (var j = 0, jLen = data.length; j < jLen; j++) {\n                    out.push(fetchData(data[j], type, innerSrc));\n                  }\n                } // If a string is given in between the array notation indicators, that\n                // is used to join the strings together, otherwise an array is returned\n\n\n                var join = arrayNotation[0].substring(1, arrayNotation[0].length - 1);\n                data = join === \"\" ? out : out.join(join); // The inner call to fetchData has already traversed through the remainder\n                // of the source requested, so we exit from the loop\n\n                break;\n              } else if (funcNotation) {\n                // Function call\n                a[i] = a[i].replace(__reFn, '');\n                data = data[a[i]]();\n                continue;\n              }\n\n              if (data === null || data[a[i]] === null) {\n                return null;\n              } else if (data === undefined || data[a[i]] === undefined) {\n                return undefined;\n              }\n\n              data = data[a[i]];\n            }\n          }\n\n          return data;\n        };\n\n        return function (data, type) {\n          // row and meta also passed, but not used\n          return fetchData(data, type, source);\n        };\n      } else {\n        // Array or flat object mapping\n        return function (data, type) {\n          // row and meta also passed, but not used\n          return data[source];\n        };\n      }\n    }\n  };\n  /**\n   * Create a mapping object that allows camel case parameters to be looked up\n   * for their Hungarian counterparts. The mapping is stored in a private\n   * parameter called `_hungarianMap` which can be accessed on the source object.\n   *  @param {object} o\n   *  @memberof DataTable#oApi\n   */\n\n  function _fnHungarianMap(o) {\n    var hungarian = 'a aa ai ao as b fn i m o s ',\n        match,\n        newKey,\n        map = {};\n    $.each(o, function (key, val) {\n      match = key.match(/^([^A-Z]+?)([A-Z])/);\n\n      if (match && hungarian.indexOf(match[1] + ' ') !== -1) {\n        newKey = key.replace(match[0], match[2].toLowerCase());\n        map[newKey] = key;\n\n        if (match[1] === 'o') {\n          _fnHungarianMap(o[key]);\n        }\n      }\n    });\n    o._hungarianMap = map;\n  }\n  /**\n   * Convert from camel case parameters to Hungarian, based on a Hungarian map\n   * created by _fnHungarianMap.\n   *  @param {object} src The model object which holds all parameters that can be\n   *    mapped.\n   *  @param {object} user The object to convert from camel case to Hungarian.\n   *  @param {boolean} force When set to `true`, properties which already have a\n   *    Hungarian value in the `user` object will be overwritten. Otherwise they\n   *    won't be.\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnCamelToHungarian(src, user, force) {\n    if (!src._hungarianMap) {\n      _fnHungarianMap(src);\n    }\n\n    var hungarianKey;\n    $.each(user, function (key, val) {\n      hungarianKey = src._hungarianMap[key];\n\n      if (hungarianKey !== undefined && (force || user[hungarianKey] === undefined)) {\n        // For objects, we need to buzz down into the object to copy parameters\n        if (hungarianKey.charAt(0) === 'o') {\n          // Copy the camelCase options over to the hungarian\n          if (!user[hungarianKey]) {\n            user[hungarianKey] = {};\n          }\n\n          $.extend(true, user[hungarianKey], user[key]);\n\n          _fnCamelToHungarian(src[hungarianKey], user[hungarianKey], force);\n        } else {\n          user[hungarianKey] = user[key];\n        }\n      }\n    });\n  }\n  /**\n   * Language compatibility - when certain options are given, and others aren't, we\n   * need to duplicate the values over, in order to provide backwards compatibility\n   * with older language files.\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnLanguageCompat(lang) {\n    // Note the use of the Hungarian notation for the parameters in this method as\n    // this is called after the mapping of camelCase to Hungarian\n    var defaults = DataTable.defaults.oLanguage; // Default mapping\n\n    var defaultDecimal = defaults.sDecimal;\n\n    if (defaultDecimal) {\n      _addNumericSort(defaultDecimal);\n    }\n\n    if (lang) {\n      var zeroRecords = lang.sZeroRecords; // Backwards compatibility - if there is no sEmptyTable given, then use the same as\n      // sZeroRecords - assuming that is given.\n\n      if (!lang.sEmptyTable && zeroRecords && defaults.sEmptyTable === \"No data available in table\") {\n        _fnMap(lang, lang, 'sZeroRecords', 'sEmptyTable');\n      } // Likewise with loading records\n\n\n      if (!lang.sLoadingRecords && zeroRecords && defaults.sLoadingRecords === \"Loading...\") {\n        _fnMap(lang, lang, 'sZeroRecords', 'sLoadingRecords');\n      } // Old parameter name of the thousands separator mapped onto the new\n\n\n      if (lang.sInfoThousands) {\n        lang.sThousands = lang.sInfoThousands;\n      }\n\n      var decimal = lang.sDecimal;\n\n      if (decimal && defaultDecimal !== decimal) {\n        _addNumericSort(decimal);\n      }\n    }\n  }\n  /**\n   * Map one parameter onto another\n   *  @param {object} o Object to map\n   *  @param {*} knew The new parameter name\n   *  @param {*} old The old parameter name\n   */\n\n\n  var _fnCompatMap = function _fnCompatMap(o, knew, old) {\n    if (o[knew] !== undefined) {\n      o[old] = o[knew];\n    }\n  };\n  /**\n   * Provide backwards compatibility for the main DT options. Note that the new\n   * options are mapped onto the old parameters, so this is an external interface\n   * change only.\n   *  @param {object} init Object to map\n   */\n\n\n  function _fnCompatOpts(init) {\n    _fnCompatMap(init, 'ordering', 'bSort');\n\n    _fnCompatMap(init, 'orderMulti', 'bSortMulti');\n\n    _fnCompatMap(init, 'orderClasses', 'bSortClasses');\n\n    _fnCompatMap(init, 'orderCellsTop', 'bSortCellsTop');\n\n    _fnCompatMap(init, 'order', 'aaSorting');\n\n    _fnCompatMap(init, 'orderFixed', 'aaSortingFixed');\n\n    _fnCompatMap(init, 'paging', 'bPaginate');\n\n    _fnCompatMap(init, 'pagingType', 'sPaginationType');\n\n    _fnCompatMap(init, 'pageLength', 'iDisplayLength');\n\n    _fnCompatMap(init, 'searching', 'bFilter'); // Boolean initialisation of x-scrolling\n\n\n    if (typeof init.sScrollX === 'boolean') {\n      init.sScrollX = init.sScrollX ? '100%' : '';\n    }\n\n    if (typeof init.scrollX === 'boolean') {\n      init.scrollX = init.scrollX ? '100%' : '';\n    } // Column search objects are in an array, so it needs to be converted\n    // element by element\n\n\n    var searchCols = init.aoSearchCols;\n\n    if (searchCols) {\n      for (var i = 0, ien = searchCols.length; i < ien; i++) {\n        if (searchCols[i]) {\n          _fnCamelToHungarian(DataTable.models.oSearch, searchCols[i]);\n        }\n      }\n    }\n  }\n  /**\n   * Provide backwards compatibility for column options. Note that the new options\n   * are mapped onto the old parameters, so this is an external interface change\n   * only.\n   *  @param {object} init Object to map\n   */\n\n\n  function _fnCompatCols(init) {\n    _fnCompatMap(init, 'orderable', 'bSortable');\n\n    _fnCompatMap(init, 'orderData', 'aDataSort');\n\n    _fnCompatMap(init, 'orderSequence', 'asSorting');\n\n    _fnCompatMap(init, 'orderDataType', 'sortDataType'); // orderData can be given as an integer\n\n\n    var dataSort = init.aDataSort;\n\n    if (typeof dataSort === 'number' && !Array.isArray(dataSort)) {\n      init.aDataSort = [dataSort];\n    }\n  }\n  /**\n   * Browser feature detection for capabilities, quirks\n   *  @param {object} settings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnBrowserDetect(settings) {\n    // We don't need to do this every time DataTables is constructed, the values\n    // calculated are specific to the browser and OS configuration which we\n    // don't expect to change between initialisations\n    if (!DataTable.__browser) {\n      var browser = {};\n      DataTable.__browser = browser; // Scrolling feature / quirks detection\n\n      var n = $('<div/>').css({\n        position: 'fixed',\n        top: 0,\n        left: $(window).scrollLeft() * -1,\n        // allow for scrolling\n        height: 1,\n        width: 1,\n        overflow: 'hidden'\n      }).append($('<div/>').css({\n        position: 'absolute',\n        top: 1,\n        left: 1,\n        width: 100,\n        overflow: 'scroll'\n      }).append($('<div/>').css({\n        width: '100%',\n        height: 10\n      }))).appendTo('body');\n      var outer = n.children();\n      var inner = outer.children(); // Numbers below, in order, are:\n      // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n      //\n      // IE6 XP:                           100 100 100  83\n      // IE7 Vista:                        100 100 100  83\n      // IE 8+ Windows:                     83  83 100  83\n      // Evergreen Windows:                 83  83 100  83\n      // Evergreen Mac with scrollbars:     85  85 100  85\n      // Evergreen Mac without scrollbars: 100 100 100 100\n      // Get scrollbar width\n\n      browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth; // IE6/7 will oversize a width 100% element inside a scrolling element, to\n      // include the width of the scrollbar, while other browsers ensure the inner\n      // element is contained without forcing scrolling\n\n      browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100; // In rtl text layout, some browsers (most, but not all) will place the\n      // scrollbar on the left, rather than the right.\n\n      browser.bScrollbarLeft = Math.round(inner.offset().left) !== 1; // IE8- don't provide height and width for getBoundingClientRect\n\n      browser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n      n.remove();\n    }\n\n    $.extend(settings.oBrowser, DataTable.__browser);\n    settings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n  }\n  /**\n   * Array.prototype reduce[Right] method, used for browsers which don't support\n   * JS 1.6. Done this way to reduce code size, since we iterate either way\n   *  @param {object} settings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnReduce(that, fn, init, start, end, inc) {\n    var i = start,\n        value,\n        isSet = false;\n\n    if (init !== undefined) {\n      value = init;\n      isSet = true;\n    }\n\n    while (i !== end) {\n      if (!that.hasOwnProperty(i)) {\n        continue;\n      }\n\n      value = isSet ? fn(value, that[i], i, that) : that[i];\n      isSet = true;\n      i += inc;\n    }\n\n    return value;\n  }\n  /**\n   * Add a column to the list used for the table with default values\n   *  @param {object} oSettings dataTables settings object\n   *  @param {node} nTh The th element for this column\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAddColumn(oSettings, nTh) {\n    // Add column to aoColumns array\n    var oDefaults = DataTable.defaults.column;\n    var iCol = oSettings.aoColumns.length;\n    var oCol = $.extend({}, DataTable.models.oColumn, oDefaults, {\n      \"nTh\": nTh ? nTh : document.createElement('th'),\n      \"sTitle\": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',\n      \"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n      \"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n      idx: iCol\n    });\n    oSettings.aoColumns.push(oCol); // Add search object for column specific search. Note that the `searchCols[ iCol ]`\n    // passed into extend can be undefined. This allows the user to give a default\n    // with only some of the parameters defined, and also not give a default\n\n    var searchCols = oSettings.aoPreSearchCols;\n    searchCols[iCol] = $.extend({}, DataTable.models.oSearch, searchCols[iCol]); // Use the default column options function to initialise classes etc\n\n    _fnColumnOptions(oSettings, iCol, $(nTh).data());\n  }\n  /**\n   * Apply options for a column\n   *  @param {object} oSettings dataTables settings object\n   *  @param {int} iCol column index to consider\n   *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnColumnOptions(oSettings, iCol, oOptions) {\n    var oCol = oSettings.aoColumns[iCol];\n    var oClasses = oSettings.oClasses;\n    var th = $(oCol.nTh); // Try to get width information from the DOM. We can't get it from CSS\n    // as we'd need to parse the CSS stylesheet. `width` option can override\n\n    if (!oCol.sWidthOrig) {\n      // Width attribute\n      oCol.sWidthOrig = th.attr('width') || null; // Style attribute\n\n      var t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\n      if (t) {\n        oCol.sWidthOrig = t[1];\n      }\n    }\n    /* User specified column options */\n\n\n    if (oOptions !== undefined && oOptions !== null) {\n      // Backwards compatibility\n      _fnCompatCols(oOptions); // Map camel case parameters to their Hungarian counterparts\n\n\n      _fnCamelToHungarian(DataTable.defaults.column, oOptions, true);\n      /* Backwards compatibility for mDataProp */\n\n\n      if (oOptions.mDataProp !== undefined && !oOptions.mData) {\n        oOptions.mData = oOptions.mDataProp;\n      }\n\n      if (oOptions.sType) {\n        oCol._sManualType = oOptions.sType;\n      } // `class` is a reserved word in Javascript, so we need to provide\n      // the ability to use a valid name for the camel case input\n\n\n      if (oOptions.className && !oOptions.sClass) {\n        oOptions.sClass = oOptions.className;\n      }\n\n      if (oOptions.sClass) {\n        th.addClass(oOptions.sClass);\n      }\n\n      var origClass = oCol.sClass;\n      $.extend(oCol, oOptions);\n\n      _fnMap(oCol, oOptions, \"sWidth\", \"sWidthOrig\"); // Merge class from previously defined classes with this one, rather than just\n      // overwriting it in the extend above\n\n\n      if (origClass !== oCol.sClass) {\n        oCol.sClass = origClass + ' ' + oCol.sClass;\n      }\n      /* iDataSort to be applied (backwards compatibility), but aDataSort will take\n       * priority if defined\n       */\n\n\n      if (oOptions.iDataSort !== undefined) {\n        oCol.aDataSort = [oOptions.iDataSort];\n      }\n\n      _fnMap(oCol, oOptions, \"aDataSort\");\n    }\n    /* Cache the data get and set functions for speed */\n\n\n    var mDataSrc = oCol.mData;\n\n    var mData = _fnGetObjectDataFn(mDataSrc);\n\n    var mRender = oCol.mRender ? _fnGetObjectDataFn(oCol.mRender) : null;\n\n    var attrTest = function attrTest(src) {\n      return typeof src === 'string' && src.indexOf('@') !== -1;\n    };\n\n    oCol._bAttrSrc = $.isPlainObject(mDataSrc) && (attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter));\n    oCol._setter = null;\n\n    oCol.fnGetData = function (rowData, type, meta) {\n      var innerData = mData(rowData, type, undefined, meta);\n      return mRender && type ? mRender(innerData, type, rowData, meta) : innerData;\n    };\n\n    oCol.fnSetData = function (rowData, val, meta) {\n      return _fnSetObjectDataFn(mDataSrc)(rowData, val, meta);\n    }; // Indicate if DataTables should read DOM data as an object or array\n    // Used in _fnGetRowElements\n\n\n    if (typeof mDataSrc !== 'number' && !oCol._isArrayHost) {\n      oSettings._rowReadObject = true;\n    }\n    /* Feature sorting overrides column specific when off */\n\n\n    if (!oSettings.oFeatures.bSort) {\n      oCol.bSortable = false;\n      th.addClass(oClasses.sSortableNone); // Have to add class here as order event isn't called\n    }\n    /* Check that the class assignment is correct for sorting */\n\n\n    var bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n    var bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\n    if (!oCol.bSortable || !bAsc && !bDesc) {\n      oCol.sSortingClass = oClasses.sSortableNone;\n      oCol.sSortingClassJUI = \"\";\n    } else if (bAsc && !bDesc) {\n      oCol.sSortingClass = oClasses.sSortableAsc;\n      oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n    } else if (!bAsc && bDesc) {\n      oCol.sSortingClass = oClasses.sSortableDesc;\n      oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n    } else {\n      oCol.sSortingClass = oClasses.sSortable;\n      oCol.sSortingClassJUI = oClasses.sSortJUI;\n    }\n  }\n  /**\n   * Adjust the table column widths for new data. Note: you would probably want to\n   * do a redraw after calling this function!\n   *  @param {object} settings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAdjustColumnSizing(settings) {\n    /* Not interested in doing column width calculation if auto-width is disabled */\n    if (settings.oFeatures.bAutoWidth !== false) {\n      var columns = settings.aoColumns;\n\n      _fnCalculateColumnWidths(settings);\n\n      for (var i = 0, iLen = columns.length; i < iLen; i++) {\n        columns[i].nTh.style.width = columns[i].sWidth;\n      }\n    }\n\n    var scroll = settings.oScroll;\n\n    if (scroll.sY !== '' || scroll.sX !== '') {\n      _fnScrollDraw(settings);\n    }\n\n    _fnCallbackFire(settings, null, 'column-sizing', [settings]);\n  }\n  /**\n   * Convert the index of a visible column to the index in the data array (take account\n   * of hidden columns)\n   *  @param {object} oSettings dataTables settings object\n   *  @param {int} iMatch Visible column index to lookup\n   *  @returns {int} i the data index\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnVisibleToColumnIndex(oSettings, iMatch) {\n    var aiVis = _fnGetColumns(oSettings, 'bVisible');\n\n    return typeof aiVis[iMatch] === 'number' ? aiVis[iMatch] : null;\n  }\n  /**\n   * Convert the index of an index in the data array and convert it to the visible\n   *   column index (take account of hidden columns)\n   *  @param {int} iMatch Column index to lookup\n   *  @param {object} oSettings dataTables settings object\n   *  @returns {int} i the data index\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnColumnIndexToVisible(oSettings, iMatch) {\n    var aiVis = _fnGetColumns(oSettings, 'bVisible');\n\n    var iPos = $.inArray(iMatch, aiVis);\n    return iPos !== -1 ? iPos : null;\n  }\n  /**\n   * Get the number of visible columns\n   *  @param {object} oSettings dataTables settings object\n   *  @returns {int} i the number of visible columns\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnVisbleColumns(oSettings) {\n    var vis = 0; // No reduce in IE8, use a loop for now\n\n    $.each(oSettings.aoColumns, function (i, col) {\n      if (col.bVisible && $(col.nTh).css('display') !== 'none') {\n        vis++;\n      }\n    });\n    return vis;\n  }\n  /**\n   * Get an array of column indexes that match a given property\n   *  @param {object} oSettings dataTables settings object\n   *  @param {string} sParam Parameter in aoColumns to look for - typically\n   *    bVisible or bSearchable\n   *  @returns {array} Array of indexes with matched properties\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnGetColumns(oSettings, sParam) {\n    var a = [];\n    $.map(oSettings.aoColumns, function (val, i) {\n      if (val[sParam]) {\n        a.push(i);\n      }\n    });\n    return a;\n  }\n  /**\n   * Calculate the 'type' of a column\n   *  @param {object} settings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnColumnTypes(settings) {\n    var columns = settings.aoColumns;\n    var data = settings.aoData;\n    var types = DataTable.ext.type.detect;\n    var i, ien, j, jen, k, ken;\n    var col, cell, detectedType, cache; // For each column, spin over the \n\n    for (i = 0, ien = columns.length; i < ien; i++) {\n      col = columns[i];\n      cache = [];\n\n      if (!col.sType && col._sManualType) {\n        col.sType = col._sManualType;\n      } else if (!col.sType) {\n        for (j = 0, jen = types.length; j < jen; j++) {\n          for (k = 0, ken = data.length; k < ken; k++) {\n            // Use a cache array so we only need to get the type data\n            // from the formatter once (when using multiple detectors)\n            if (cache[k] === undefined) {\n              cache[k] = _fnGetCellData(settings, k, i, 'type');\n            }\n\n            detectedType = types[j](cache[k], settings); // If null, then this type can't apply to this column, so\n            // rather than testing all cells, break out. There is an\n            // exception for the last type which is `html`. We need to\n            // scan all rows since it is possible to mix string and HTML\n            // types\n\n            if (!detectedType && j !== types.length - 1) {\n              break;\n            } // Only a single match is needed for html type since it is\n            // bottom of the pile and very similar to string - but it\n            // must not be empty\n\n\n            if (detectedType === 'html' && !_empty(cache[k])) {\n              break;\n            }\n          } // Type is valid for all data points in the column - use this\n          // type\n\n\n          if (detectedType) {\n            col.sType = detectedType;\n            break;\n          }\n        } // Fall back - if no type was detected, always use string\n\n\n        if (!col.sType) {\n          col.sType = 'string';\n        }\n      }\n    }\n  }\n  /**\n   * Take the column definitions and static columns arrays and calculate how\n   * they relate to column indexes. The callback function will then apply the\n   * definition found for a column to a suitable configuration object.\n   *  @param {object} oSettings dataTables settings object\n   *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n   *  @param {array} aoCols The aoColumns array that defines columns individually\n   *  @param {function} fn Callback function - takes two parameters, the calculated\n   *    column index and the definition for that column.\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnApplyColumnDefs(oSettings, aoColDefs, aoCols, fn) {\n    var i, iLen, j, jLen, k, kLen, def;\n    var columns = oSettings.aoColumns; // Column definitions with aTargets\n\n    if (aoColDefs) {\n      /* Loop over the definitions array - loop in reverse so first instance has priority */\n      for (i = aoColDefs.length - 1; i >= 0; i--) {\n        def = aoColDefs[i];\n        /* Each definition can target multiple columns, as it is an array */\n\n        var aTargets = def.target !== undefined ? def.target : def.targets !== undefined ? def.targets : def.aTargets;\n\n        if (!Array.isArray(aTargets)) {\n          aTargets = [aTargets];\n        }\n\n        for (j = 0, jLen = aTargets.length; j < jLen; j++) {\n          if (typeof aTargets[j] === 'number' && aTargets[j] >= 0) {\n            /* Add columns that we don't yet know about */\n            while (columns.length <= aTargets[j]) {\n              _fnAddColumn(oSettings);\n            }\n            /* Integer, basic index */\n\n\n            fn(aTargets[j], def);\n          } else if (typeof aTargets[j] === 'number' && aTargets[j] < 0) {\n            /* Negative integer, right to left column counting */\n            fn(columns.length + aTargets[j], def);\n          } else if (typeof aTargets[j] === 'string') {\n            /* Class name matching on TH element */\n            for (k = 0, kLen = columns.length; k < kLen; k++) {\n              if (aTargets[j] == \"_all\" || $(columns[k].nTh).hasClass(aTargets[j])) {\n                fn(k, def);\n              }\n            }\n          }\n        }\n      }\n    } // Statically defined columns array\n\n\n    if (aoCols) {\n      for (i = 0, iLen = aoCols.length; i < iLen; i++) {\n        fn(i, aoCols[i]);\n      }\n    }\n  }\n  /**\n   * Add a data array to the table, creating DOM node etc. This is the parallel to\n   * _fnGatherData, but for adding rows from a Javascript source, rather than a\n   * DOM source.\n   *  @param {object} oSettings dataTables settings object\n   *  @param {array} aData data array to be added\n   *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n   *    DataTables will create a row automatically\n   *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n   *    if nTr is.\n   *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAddData(oSettings, aDataIn, nTr, anTds) {\n    /* Create the object for storing information about this new row */\n    var iRow = oSettings.aoData.length;\n    var oData = $.extend(true, {}, DataTable.models.oRow, {\n      src: nTr ? 'dom' : 'data',\n      idx: iRow\n    });\n    oData._aData = aDataIn;\n    oSettings.aoData.push(oData);\n    /* Create the cells */\n\n    var nTd, sThisType;\n    var columns = oSettings.aoColumns; // Invalidate the column types as the new data needs to be revalidated\n\n    for (var i = 0, iLen = columns.length; i < iLen; i++) {\n      columns[i].sType = null;\n    }\n    /* Add to the display array */\n\n\n    oSettings.aiDisplayMaster.push(iRow);\n    var id = oSettings.rowIdFn(aDataIn);\n\n    if (id !== undefined) {\n      oSettings.aIds[id] = oData;\n    }\n    /* Create the DOM information, or register it if already present */\n\n\n    if (nTr || !oSettings.oFeatures.bDeferRender) {\n      _fnCreateTr(oSettings, iRow, nTr, anTds);\n    }\n\n    return iRow;\n  }\n  /**\n   * Add one or more TR elements to the table. Generally we'd expect to\n   * use this for reading data from a DOM sourced table, but it could be\n   * used for an TR element. Note that if a TR is given, it is used (i.e.\n   * it is not cloned).\n   *  @param {object} settings dataTables settings object\n   *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n   *  @returns {array} Array of indexes for the added rows\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAddTr(settings, trs) {\n    var row; // Allow an individual node to be passed in\n\n    if (!(trs instanceof $)) {\n      trs = $(trs);\n    }\n\n    return trs.map(function (i, el) {\n      row = _fnGetRowElements(settings, el);\n      return _fnAddData(settings, row.data, el, row.cells);\n    });\n  }\n  /**\n   * Take a TR element and convert it to an index in aoData\n   *  @param {object} oSettings dataTables settings object\n   *  @param {node} n the TR element to find\n   *  @returns {int} index if the node is found, null if not\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnNodeToDataIndex(oSettings, n) {\n    return n._DT_RowIndex !== undefined ? n._DT_RowIndex : null;\n  }\n  /**\n   * Take a TD element and convert it into a column data index (not the visible index)\n   *  @param {object} oSettings dataTables settings object\n   *  @param {int} iRow The row number the TD/TH can be found in\n   *  @param {node} n The TD/TH element to find\n   *  @returns {int} index if the node is found, -1 if not\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnNodeToColumnIndex(oSettings, iRow, n) {\n    return $.inArray(n, oSettings.aoData[iRow].anCells);\n  }\n  /**\n   * Get the data for a given cell from the internal cache, taking into account data mapping\n   *  @param {object} settings dataTables settings object\n   *  @param {int} rowIdx aoData row id\n   *  @param {int} colIdx Column index\n   *  @param {string} type data get type ('display', 'type' 'filter|search' 'sort|order')\n   *  @returns {*} Cell data\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnGetCellData(settings, rowIdx, colIdx, type) {\n    if (type === 'search') {\n      type = 'filter';\n    } else if (type === 'order') {\n      type = 'sort';\n    }\n\n    var draw = settings.iDraw;\n    var col = settings.aoColumns[colIdx];\n    var rowData = settings.aoData[rowIdx]._aData;\n    var defaultContent = col.sDefaultContent;\n    var cellData = col.fnGetData(rowData, type, {\n      settings: settings,\n      row: rowIdx,\n      col: colIdx\n    });\n\n    if (cellData === undefined) {\n      if (settings.iDrawError != draw && defaultContent === null) {\n        _fnLog(settings, 0, \"Requested unknown parameter \" + (typeof col.mData == 'function' ? '{function}' : \"'\" + col.mData + \"'\") + \" for row \" + rowIdx + \", column \" + colIdx, 4);\n\n        settings.iDrawError = draw;\n      }\n\n      return defaultContent;\n    } // When the data source is null and a specific data type is requested (i.e.\n    // not the original data), we can use default column data\n\n\n    if ((cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined) {\n      cellData = defaultContent;\n    } else if (typeof cellData === 'function') {\n      // If the data source is a function, then we run it and use the return,\n      // executing in the scope of the data object (for instances)\n      return cellData.call(rowData);\n    }\n\n    if (cellData === null && type === 'display') {\n      return '';\n    }\n\n    if (type === 'filter') {\n      var fomatters = DataTable.ext.type.search;\n\n      if (fomatters[col.sType]) {\n        cellData = fomatters[col.sType](cellData);\n      }\n    }\n\n    return cellData;\n  }\n  /**\n   * Set the value for a specific cell, into the internal data cache\n   *  @param {object} settings dataTables settings object\n   *  @param {int} rowIdx aoData row id\n   *  @param {int} colIdx Column index\n   *  @param {*} val Value to set\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnSetCellData(settings, rowIdx, colIdx, val) {\n    var col = settings.aoColumns[colIdx];\n    var rowData = settings.aoData[rowIdx]._aData;\n    col.fnSetData(rowData, val, {\n      settings: settings,\n      row: rowIdx,\n      col: colIdx\n    });\n  } // Private variable that is used to match action syntax in the data property object\n\n\n  var __reArray = /\\[.*?\\]$/;\n  var __reFn = /\\(\\)$/;\n  /**\n   * Split string on periods, taking into account escaped periods\n   * @param  {string} str String to split\n   * @return {array} Split string\n   */\n\n  function _fnSplitObjNotation(str) {\n    return $.map(str.match(/(\\\\.|[^\\.])+/g) || [''], function (s) {\n      return s.replace(/\\\\\\./g, '.');\n    });\n  }\n  /**\n   * Return a function that can be used to get data from a source object, taking\n   * into account the ability to use nested objects as a source\n   *  @param {string|int|function} mSource The data source for the object\n   *  @returns {function} Data get function\n   *  @memberof DataTable#oApi\n   */\n\n\n  var _fnGetObjectDataFn = DataTable.util.get;\n  /**\n   * Return a function that can be used to set data from a source object, taking\n   * into account the ability to use nested objects as a source\n   *  @param {string|int|function} mSource The data source for the object\n   *  @returns {function} Data set function\n   *  @memberof DataTable#oApi\n   */\n\n  var _fnSetObjectDataFn = DataTable.util.set;\n  /**\n   * Return an array with the full table data\n   *  @param {object} oSettings dataTables settings object\n   *  @returns array {array} aData Master data array\n   *  @memberof DataTable#oApi\n   */\n\n  function _fnGetDataMaster(settings) {\n    return _pluck(settings.aoData, '_aData');\n  }\n  /**\n   * Nuke the table\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnClearTable(settings) {\n    settings.aoData.length = 0;\n    settings.aiDisplayMaster.length = 0;\n    settings.aiDisplay.length = 0;\n    settings.aIds = {};\n  }\n  /**\n  * Take an array of integers (index array) and remove a target integer (value - not\n  * the key!)\n  *  @param {array} a Index array to target\n  *  @param {int} iTarget value to find\n  *  @memberof DataTable#oApi\n  */\n\n\n  function _fnDeleteIndex(a, iTarget, splice) {\n    var iTargetIndex = -1;\n\n    for (var i = 0, iLen = a.length; i < iLen; i++) {\n      if (a[i] == iTarget) {\n        iTargetIndex = i;\n      } else if (a[i] > iTarget) {\n        a[i]--;\n      }\n    }\n\n    if (iTargetIndex != -1 && splice === undefined) {\n      a.splice(iTargetIndex, 1);\n    }\n  }\n  /**\n   * Mark cached data as invalid such that a re-read of the data will occur when\n   * the cached data is next requested. Also update from the data source object.\n   *\n   * @param {object} settings DataTables settings object\n   * @param {int}    rowIdx   Row index to invalidate\n   * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n   *     or 'data'\n   * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n   *     row will be invalidated\n   * @memberof DataTable#oApi\n   *\n   * @todo For the modularisation of v1.11 this will need to become a callback, so\n   *   the sort and filter methods can subscribe to it. That will required\n   *   initialisation options for sorting, which is why it is not already baked in\n   */\n\n\n  function _fnInvalidate(settings, rowIdx, src, colIdx) {\n    var row = settings.aoData[rowIdx];\n    var i, ien;\n\n    var cellWrite = function cellWrite(cell, col) {\n      // This is very frustrating, but in IE if you just write directly\n      // to innerHTML, and elements that are overwritten are GC'ed,\n      // even if there is a reference to them elsewhere\n      while (cell.childNodes.length) {\n        cell.removeChild(cell.firstChild);\n      }\n\n      cell.innerHTML = _fnGetCellData(settings, rowIdx, col, 'display');\n    }; // Are we reading last data from DOM or the data object?\n\n\n    if (src === 'dom' || (!src || src === 'auto') && row.src === 'dom') {\n      // Read the data from the DOM\n      row._aData = _fnGetRowElements(settings, row, colIdx, colIdx === undefined ? undefined : row._aData).data;\n    } else {\n      // Reading from data object, update the DOM\n      var cells = row.anCells;\n\n      if (cells) {\n        if (colIdx !== undefined) {\n          cellWrite(cells[colIdx], colIdx);\n        } else {\n          for (i = 0, ien = cells.length; i < ien; i++) {\n            cellWrite(cells[i], i);\n          }\n        }\n      }\n    } // For both row and cell invalidation, the cached data for sorting and\n    // filtering is nulled out\n\n\n    row._aSortData = null;\n    row._aFilterData = null; // Invalidate the type for a specific column (if given) or all columns since\n    // the data might have changed\n\n    var cols = settings.aoColumns;\n\n    if (colIdx !== undefined) {\n      cols[colIdx].sType = null;\n    } else {\n      for (i = 0, ien = cols.length; i < ien; i++) {\n        cols[i].sType = null;\n      } // Update DataTables special `DT_*` attributes for the row\n\n\n      _fnRowAttributes(settings, row);\n    }\n  }\n  /**\n   * Build a data source object from an HTML row, reading the contents of the\n   * cells that are in the row.\n   *\n   * @param {object} settings DataTables settings object\n   * @param {node|object} TR element from which to read data or existing row\n   *   object from which to re-read the data from the cells\n   * @param {int} [colIdx] Optional column index\n   * @param {array|object} [d] Data source object. If `colIdx` is given then this\n   *   parameter should also be given and will be used to write the data into.\n   *   Only the column in question will be written\n   * @returns {object} Object with two parameters: `data` the data read, in\n   *   document order, and `cells` and array of nodes (they can be useful to the\n   *   caller, so rather than needing a second traversal to get them, just return\n   *   them from here).\n   * @memberof DataTable#oApi\n   */\n\n\n  function _fnGetRowElements(settings, row, colIdx, d) {\n    var tds = [],\n        td = row.firstChild,\n        name,\n        col,\n        o,\n        i = 0,\n        contents,\n        columns = settings.aoColumns,\n        objectRead = settings._rowReadObject; // Allow the data object to be passed in, or construct\n\n    d = d !== undefined ? d : objectRead ? {} : [];\n\n    var attr = function attr(str, td) {\n      if (typeof str === 'string') {\n        var idx = str.indexOf('@');\n\n        if (idx !== -1) {\n          var attr = str.substring(idx + 1);\n\n          var setter = _fnSetObjectDataFn(str);\n\n          setter(d, td.getAttribute(attr));\n        }\n      }\n    }; // Read data from a cell and store into the data object\n\n\n    var cellProcess = function cellProcess(cell) {\n      if (colIdx === undefined || colIdx === i) {\n        col = columns[i];\n        contents = cell.innerHTML.trim();\n\n        if (col && col._bAttrSrc) {\n          var setter = _fnSetObjectDataFn(col.mData._);\n\n          setter(d, contents);\n          attr(col.mData.sort, cell);\n          attr(col.mData.type, cell);\n          attr(col.mData.filter, cell);\n        } else {\n          // Depending on the `data` option for the columns the data can\n          // be read to either an object or an array.\n          if (objectRead) {\n            if (!col._setter) {\n              // Cache the setter function\n              col._setter = _fnSetObjectDataFn(col.mData);\n            }\n\n            col._setter(d, contents);\n          } else {\n            d[i] = contents;\n          }\n        }\n      }\n\n      i++;\n    };\n\n    if (td) {\n      // `tr` element was passed in\n      while (td) {\n        name = td.nodeName.toUpperCase();\n\n        if (name == \"TD\" || name == \"TH\") {\n          cellProcess(td);\n          tds.push(td);\n        }\n\n        td = td.nextSibling;\n      }\n    } else {\n      // Existing row object passed in\n      tds = row.anCells;\n\n      for (var j = 0, jen = tds.length; j < jen; j++) {\n        cellProcess(tds[j]);\n      }\n    } // Read the ID from the DOM if present\n\n\n    var rowNode = row.firstChild ? row : row.nTr;\n\n    if (rowNode) {\n      var id = rowNode.getAttribute('id');\n\n      if (id) {\n        _fnSetObjectDataFn(settings.rowId)(d, id);\n      }\n    }\n\n    return {\n      data: d,\n      cells: tds\n    };\n  }\n  /**\n   * Create a new TR element (and it's TD children) for a row\n   *  @param {object} oSettings dataTables settings object\n   *  @param {int} iRow Row to consider\n   *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n   *    DataTables will create a row automatically\n   *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n   *    if nTr is.\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnCreateTr(oSettings, iRow, nTrIn, anTds) {\n    var row = oSettings.aoData[iRow],\n        rowData = row._aData,\n        cells = [],\n        nTr,\n        nTd,\n        oCol,\n        i,\n        iLen,\n        create;\n\n    if (row.nTr === null) {\n      nTr = nTrIn || document.createElement('tr');\n      row.nTr = nTr;\n      row.anCells = cells;\n      /* Use a private property on the node to allow reserve mapping from the node\n       * to the aoData array for fast look up\n       */\n\n      nTr._DT_RowIndex = iRow;\n      /* Special parameters can be given by the data source to be used on the row */\n\n      _fnRowAttributes(oSettings, row);\n      /* Process each column */\n\n\n      for (i = 0, iLen = oSettings.aoColumns.length; i < iLen; i++) {\n        oCol = oSettings.aoColumns[i];\n        create = nTrIn ? false : true;\n        nTd = create ? document.createElement(oCol.sCellType) : anTds[i];\n\n        if (!nTd) {\n          _fnLog(oSettings, 0, 'Incorrect column count', 18);\n        }\n\n        nTd._DT_CellIndex = {\n          row: iRow,\n          column: i\n        };\n        cells.push(nTd); // Need to create the HTML if new, or if a rendering function is defined\n\n        if (create || (oCol.mRender || oCol.mData !== i) && (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i + '.display')) {\n          nTd.innerHTML = _fnGetCellData(oSettings, iRow, i, 'display');\n        }\n        /* Add user defined class */\n\n\n        if (oCol.sClass) {\n          nTd.className += ' ' + oCol.sClass;\n        } // Visibility - add or remove as required\n\n\n        if (oCol.bVisible && !nTrIn) {\n          nTr.appendChild(nTd);\n        } else if (!oCol.bVisible && nTrIn) {\n          nTd.parentNode.removeChild(nTd);\n        }\n\n        if (oCol.fnCreatedCell) {\n          oCol.fnCreatedCell.call(oSettings.oInstance, nTd, _fnGetCellData(oSettings, iRow, i), rowData, iRow, i);\n        }\n      }\n\n      _fnCallbackFire(oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells]);\n    }\n  }\n  /**\n   * Add attributes to a row based on the special `DT_*` parameters in a data\n   * source object.\n   *  @param {object} settings DataTables settings object\n   *  @param {object} DataTables row object for the row to be modified\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnRowAttributes(settings, row) {\n    var tr = row.nTr;\n    var data = row._aData;\n\n    if (tr) {\n      var id = settings.rowIdFn(data);\n\n      if (id) {\n        tr.id = id;\n      }\n\n      if (data.DT_RowClass) {\n        // Remove any classes added by DT_RowClass before\n        var a = data.DT_RowClass.split(' ');\n        row.__rowc = row.__rowc ? _unique(row.__rowc.concat(a)) : a;\n        $(tr).removeClass(row.__rowc.join(' ')).addClass(data.DT_RowClass);\n      }\n\n      if (data.DT_RowAttr) {\n        $(tr).attr(data.DT_RowAttr);\n      }\n\n      if (data.DT_RowData) {\n        $(tr).data(data.DT_RowData);\n      }\n    }\n  }\n  /**\n   * Create the HTML header for the table\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnBuildHead(oSettings) {\n    var i, ien, cell, row, column;\n    var thead = oSettings.nTHead;\n    var tfoot = oSettings.nTFoot;\n    var createHeader = $('th, td', thead).length === 0;\n    var classes = oSettings.oClasses;\n    var columns = oSettings.aoColumns;\n\n    if (createHeader) {\n      row = $('<tr/>').appendTo(thead);\n    }\n\n    for (i = 0, ien = columns.length; i < ien; i++) {\n      column = columns[i];\n      cell = $(column.nTh).addClass(column.sClass);\n\n      if (createHeader) {\n        cell.appendTo(row);\n      } // 1.11 move into sorting\n\n\n      if (oSettings.oFeatures.bSort) {\n        cell.addClass(column.sSortingClass);\n\n        if (column.bSortable !== false) {\n          cell.attr('tabindex', oSettings.iTabIndex).attr('aria-controls', oSettings.sTableId);\n\n          _fnSortAttachListener(oSettings, column.nTh, i);\n        }\n      }\n\n      if (column.sTitle != cell[0].innerHTML) {\n        cell.html(column.sTitle);\n      }\n\n      _fnRenderer(oSettings, 'header')(oSettings, cell, column, classes);\n    }\n\n    if (createHeader) {\n      _fnDetectHeader(oSettings.aoHeader, thead);\n    }\n    /* Deal with the footer - add classes if required */\n\n\n    $(thead).children('tr').children('th, td').addClass(classes.sHeaderTH);\n    $(tfoot).children('tr').children('th, td').addClass(classes.sFooterTH); // Cache the footer cells. Note that we only take the cells from the first\n    // row in the footer. If there is more than one row the user wants to\n    // interact with, they need to use the table().foot() method. Note also this\n    // allows cells to be used for multiple columns using colspan\n\n    if (tfoot !== null) {\n      var cells = oSettings.aoFooter[0];\n\n      for (i = 0, ien = cells.length; i < ien; i++) {\n        column = columns[i];\n\n        if (column) {\n          column.nTf = cells[i].cell;\n\n          if (column.sClass) {\n            $(column.nTf).addClass(column.sClass);\n          }\n        } else {\n          _fnLog(oSettings, 0, 'Incorrect column count', 18);\n        }\n      }\n    }\n  }\n  /**\n   * Draw the header (or footer) element based on the column visibility states. The\n   * methodology here is to use the layout array from _fnDetectHeader, modified for\n   * the instantaneous column visibility, to construct the new layout. The grid is\n   * traversed over cell at a time in a rows x columns grid fashion, although each\n   * cell insert can cover multiple elements in the grid - which is tracks using the\n   * aApplied array. Cell inserts in the grid will only occur where there isn't\n   * already a cell in that position.\n   *  @param {object} oSettings dataTables settings object\n   *  @param array {objects} aoSource Layout array from _fnDetectHeader\n   *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnDrawHead(oSettings, aoSource, bIncludeHidden) {\n    var i, iLen, j, jLen, k, kLen, n, nLocalTr;\n    var aoLocal = [];\n    var aApplied = [];\n    var iColumns = oSettings.aoColumns.length;\n    var iRowspan, iColspan;\n\n    if (!aoSource) {\n      return;\n    }\n\n    if (bIncludeHidden === undefined) {\n      bIncludeHidden = false;\n    }\n    /* Make a copy of the master layout array, but without the visible columns in it */\n\n\n    for (i = 0, iLen = aoSource.length; i < iLen; i++) {\n      aoLocal[i] = aoSource[i].slice();\n      aoLocal[i].nTr = aoSource[i].nTr;\n      /* Remove any columns which are currently hidden */\n\n      for (j = iColumns - 1; j >= 0; j--) {\n        if (!oSettings.aoColumns[j].bVisible && !bIncludeHidden) {\n          aoLocal[i].splice(j, 1);\n        }\n      }\n      /* Prep the applied array - it needs an element for each row */\n\n\n      aApplied.push([]);\n    }\n\n    for (i = 0, iLen = aoLocal.length; i < iLen; i++) {\n      nLocalTr = aoLocal[i].nTr;\n      /* All cells are going to be replaced, so empty out the row */\n\n      if (nLocalTr) {\n        while (n = nLocalTr.firstChild) {\n          nLocalTr.removeChild(n);\n        }\n      }\n\n      for (j = 0, jLen = aoLocal[i].length; j < jLen; j++) {\n        iRowspan = 1;\n        iColspan = 1;\n        /* Check to see if there is already a cell (row/colspan) covering our target\n         * insert point. If there is, then there is nothing to do.\n         */\n\n        if (aApplied[i][j] === undefined) {\n          nLocalTr.appendChild(aoLocal[i][j].cell);\n          aApplied[i][j] = 1;\n          /* Expand the cell to cover as many rows as needed */\n\n          while (aoLocal[i + iRowspan] !== undefined && aoLocal[i][j].cell == aoLocal[i + iRowspan][j].cell) {\n            aApplied[i + iRowspan][j] = 1;\n            iRowspan++;\n          }\n          /* Expand the cell to cover as many columns as needed */\n\n\n          while (aoLocal[i][j + iColspan] !== undefined && aoLocal[i][j].cell == aoLocal[i][j + iColspan].cell) {\n            /* Must update the applied array over the rows for the columns */\n            for (k = 0; k < iRowspan; k++) {\n              aApplied[i + k][j + iColspan] = 1;\n            }\n\n            iColspan++;\n          }\n          /* Do the actual expansion in the DOM */\n\n\n          $(aoLocal[i][j].cell).attr('rowspan', iRowspan).attr('colspan', iColspan);\n        }\n      }\n    }\n  }\n  /**\n   * Insert the required TR nodes into the table for display\n   *  @param {object} oSettings dataTables settings object\n   *  @param ajaxComplete true after ajax call to complete rendering\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnDraw(oSettings, ajaxComplete) {\n    // Allow for state saving and a custom start position\n    _fnStart(oSettings);\n    /* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\n\n    var aPreDraw = _fnCallbackFire(oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings]);\n\n    if ($.inArray(false, aPreDraw) !== -1) {\n      _fnProcessingDisplay(oSettings, false);\n\n      return;\n    }\n\n    var anRows = [];\n    var iRowCount = 0;\n    var asStripeClasses = oSettings.asStripeClasses;\n    var iStripes = asStripeClasses.length;\n    var oLang = oSettings.oLanguage;\n    var bServerSide = _fnDataSource(oSettings) == 'ssp';\n    var aiDisplay = oSettings.aiDisplay;\n    var iDisplayStart = oSettings._iDisplayStart;\n    var iDisplayEnd = oSettings.fnDisplayEnd();\n    oSettings.bDrawing = true;\n    /* Server-side processing draw intercept */\n\n    if (oSettings.bDeferLoading) {\n      oSettings.bDeferLoading = false;\n      oSettings.iDraw++;\n\n      _fnProcessingDisplay(oSettings, false);\n    } else if (!bServerSide) {\n      oSettings.iDraw++;\n    } else if (!oSettings.bDestroying && !ajaxComplete) {\n      _fnAjaxUpdate(oSettings);\n\n      return;\n    }\n\n    if (aiDisplay.length !== 0) {\n      var iStart = bServerSide ? 0 : iDisplayStart;\n      var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\n      for (var j = iStart; j < iEnd; j++) {\n        var iDataIndex = aiDisplay[j];\n        var aoData = oSettings.aoData[iDataIndex];\n\n        if (aoData.nTr === null) {\n          _fnCreateTr(oSettings, iDataIndex);\n        }\n\n        var nRow = aoData.nTr;\n        /* Remove the old striping classes and then add the new one */\n\n        if (iStripes !== 0) {\n          var sStripe = asStripeClasses[iRowCount % iStripes];\n\n          if (aoData._sRowStripe != sStripe) {\n            $(nRow).removeClass(aoData._sRowStripe).addClass(sStripe);\n            aoData._sRowStripe = sStripe;\n          }\n        } // Row callback functions - might want to manipulate the row\n        // iRowCount and j are not currently documented. Are they at all\n        // useful?\n\n\n        _fnCallbackFire(oSettings, 'aoRowCallback', null, [nRow, aoData._aData, iRowCount, j, iDataIndex]);\n\n        anRows.push(nRow);\n        iRowCount++;\n      }\n    } else {\n      /* Table is empty - create a row with an empty message in it */\n      var sZero = oLang.sZeroRecords;\n\n      if (oSettings.iDraw == 1 && _fnDataSource(oSettings) == 'ajax') {\n        sZero = oLang.sLoadingRecords;\n      } else if (oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0) {\n        sZero = oLang.sEmptyTable;\n      }\n\n      anRows[0] = $('<tr/>', {\n        'class': iStripes ? asStripeClasses[0] : ''\n      }).append($('<td />', {\n        'valign': 'top',\n        'colSpan': _fnVisbleColumns(oSettings),\n        'class': oSettings.oClasses.sRowEmpty\n      }).html(sZero))[0];\n    }\n    /* Header and footer callbacks */\n\n\n    _fnCallbackFire(oSettings, 'aoHeaderCallback', 'header', [$(oSettings.nTHead).children('tr')[0], _fnGetDataMaster(oSettings), iDisplayStart, iDisplayEnd, aiDisplay]);\n\n    _fnCallbackFire(oSettings, 'aoFooterCallback', 'footer', [$(oSettings.nTFoot).children('tr')[0], _fnGetDataMaster(oSettings), iDisplayStart, iDisplayEnd, aiDisplay]);\n\n    var body = $(oSettings.nTBody);\n    body.children().detach();\n    body.append($(anRows));\n    /* Call all required callback functions for the end of a draw */\n\n    _fnCallbackFire(oSettings, 'aoDrawCallback', 'draw', [oSettings]);\n    /* Draw is complete, sorting and filtering must be as well */\n\n\n    oSettings.bSorted = false;\n    oSettings.bFiltered = false;\n    oSettings.bDrawing = false;\n  }\n  /**\n   * Redraw the table - taking account of the various features which are enabled\n   *  @param {object} oSettings dataTables settings object\n   *  @param {boolean} [holdPosition] Keep the current paging position. By default\n   *    the paging is reset to the first page\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnReDraw(settings, holdPosition) {\n    var features = settings.oFeatures,\n        sort = features.bSort,\n        filter = features.bFilter;\n\n    if (sort) {\n      _fnSort(settings);\n    }\n\n    if (filter) {\n      _fnFilterComplete(settings, settings.oPreviousSearch);\n    } else {\n      // No filtering, so we want to just use the display master\n      settings.aiDisplay = settings.aiDisplayMaster.slice();\n    }\n\n    if (holdPosition !== true) {\n      settings._iDisplayStart = 0;\n    } // Let any modules know about the draw hold position state (used by\n    // scrolling internally)\n\n\n    settings._drawHold = holdPosition;\n\n    _fnDraw(settings);\n\n    settings._drawHold = false;\n  }\n  /**\n   * Add the options to the page HTML for the table\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAddOptionsHtml(oSettings) {\n    var classes = oSettings.oClasses;\n    var table = $(oSettings.nTable);\n    var holding = $('<div/>').insertBefore(table); // Holding element for speed\n\n    var features = oSettings.oFeatures; // All DataTables are wrapped in a div\n\n    var insert = $('<div/>', {\n      id: oSettings.sTableId + '_wrapper',\n      'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' ' + classes.sNoFooter)\n    });\n    oSettings.nHolding = holding[0];\n    oSettings.nTableWrapper = insert[0];\n    oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n    /* Loop over the user set positioning and place the elements as needed */\n\n    var aDom = oSettings.sDom.split('');\n    var featureNode, cOption, nNewNode, cNext, sAttr, j;\n\n    for (var i = 0; i < aDom.length; i++) {\n      featureNode = null;\n      cOption = aDom[i];\n\n      if (cOption == '<') {\n        /* New container div */\n        nNewNode = $('<div/>')[0];\n        /* Check to see if we should append an id and/or a class name to the container */\n\n        cNext = aDom[i + 1];\n\n        if (cNext == \"'\" || cNext == '\"') {\n          sAttr = \"\";\n          j = 2;\n\n          while (aDom[i + j] != cNext) {\n            sAttr += aDom[i + j];\n            j++;\n          }\n          /* Replace jQuery UI constants @todo depreciated */\n\n\n          if (sAttr == \"H\") {\n            sAttr = classes.sJUIHeader;\n          } else if (sAttr == \"F\") {\n            sAttr = classes.sJUIFooter;\n          }\n          /* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n           * breaks the string into parts and applies them as needed\n           */\n\n\n          if (sAttr.indexOf('.') != -1) {\n            var aSplit = sAttr.split('.');\n            nNewNode.id = aSplit[0].substr(1, aSplit[0].length - 1);\n            nNewNode.className = aSplit[1];\n          } else if (sAttr.charAt(0) == \"#\") {\n            nNewNode.id = sAttr.substr(1, sAttr.length - 1);\n          } else {\n            nNewNode.className = sAttr;\n          }\n\n          i += j;\n          /* Move along the position array */\n        }\n\n        insert.append(nNewNode);\n        insert = $(nNewNode);\n      } else if (cOption == '>') {\n        /* End container div */\n        insert = insert.parent();\n      } // @todo Move options into their own plugins?\n      else if (cOption == 'l' && features.bPaginate && features.bLengthChange) {\n        /* Length */\n        featureNode = _fnFeatureHtmlLength(oSettings);\n      } else if (cOption == 'f' && features.bFilter) {\n        /* Filter */\n        featureNode = _fnFeatureHtmlFilter(oSettings);\n      } else if (cOption == 'r' && features.bProcessing) {\n        /* pRocessing */\n        featureNode = _fnFeatureHtmlProcessing(oSettings);\n      } else if (cOption == 't') {\n        /* Table */\n        featureNode = _fnFeatureHtmlTable(oSettings);\n      } else if (cOption == 'i' && features.bInfo) {\n        /* Info */\n        featureNode = _fnFeatureHtmlInfo(oSettings);\n      } else if (cOption == 'p' && features.bPaginate) {\n        /* Pagination */\n        featureNode = _fnFeatureHtmlPaginate(oSettings);\n      } else if (DataTable.ext.feature.length !== 0) {\n        /* Plug-in features */\n        var aoFeatures = DataTable.ext.feature;\n\n        for (var k = 0, kLen = aoFeatures.length; k < kLen; k++) {\n          if (cOption == aoFeatures[k].cFeature) {\n            featureNode = aoFeatures[k].fnInit(oSettings);\n            break;\n          }\n        }\n      }\n      /* Add to the 2D features array */\n\n\n      if (featureNode) {\n        var aanFeatures = oSettings.aanFeatures;\n\n        if (!aanFeatures[cOption]) {\n          aanFeatures[cOption] = [];\n        }\n\n        aanFeatures[cOption].push(featureNode);\n        insert.append(featureNode);\n      }\n    }\n    /* Built our DOM structure - replace the holding div with what we want */\n\n\n    holding.replaceWith(insert);\n    oSettings.nHolding = null;\n  }\n  /**\n   * Use the DOM source to create up an array of header cells. The idea here is to\n   * create a layout grid (array) of rows x columns, which contains a reference\n   * to the cell that that point in the grid (regardless of col/rowspan), such that\n   * any column / row could be removed and the new grid constructed\n   *  @param array {object} aLayout Array to store the calculated layout in\n   *  @param {node} nThead The header/footer element for the table\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnDetectHeader(aLayout, nThead) {\n    var nTrs = $(nThead).children('tr');\n    var nTr, nCell;\n    var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n    var bUnique;\n\n    var fnShiftCol = function fnShiftCol(a, i, j) {\n      var k = a[i];\n\n      while (k[j]) {\n        j++;\n      }\n\n      return j;\n    };\n\n    aLayout.splice(0, aLayout.length);\n    /* We know how many rows there are in the layout - so prep it */\n\n    for (i = 0, iLen = nTrs.length; i < iLen; i++) {\n      aLayout.push([]);\n    }\n    /* Calculate a layout array */\n\n\n    for (i = 0, iLen = nTrs.length; i < iLen; i++) {\n      nTr = nTrs[i];\n      iColumn = 0;\n      /* For every cell in the row... */\n\n      nCell = nTr.firstChild;\n\n      while (nCell) {\n        if (nCell.nodeName.toUpperCase() == \"TD\" || nCell.nodeName.toUpperCase() == \"TH\") {\n          /* Get the col and rowspan attributes from the DOM and sanitise them */\n          iColspan = nCell.getAttribute('colspan') * 1;\n          iRowspan = nCell.getAttribute('rowspan') * 1;\n          iColspan = !iColspan || iColspan === 0 || iColspan === 1 ? 1 : iColspan;\n          iRowspan = !iRowspan || iRowspan === 0 || iRowspan === 1 ? 1 : iRowspan;\n          /* There might be colspan cells already in this row, so shift our target\n           * accordingly\n           */\n\n          iColShifted = fnShiftCol(aLayout, i, iColumn);\n          /* Cache calculation for unique columns */\n\n          bUnique = iColspan === 1 ? true : false;\n          /* If there is col / rowspan, copy the information into the layout grid */\n\n          for (l = 0; l < iColspan; l++) {\n            for (k = 0; k < iRowspan; k++) {\n              aLayout[i + k][iColShifted + l] = {\n                \"cell\": nCell,\n                \"unique\": bUnique\n              };\n              aLayout[i + k].nTr = nTr;\n            }\n          }\n        }\n\n        nCell = nCell.nextSibling;\n      }\n    }\n  }\n  /**\n   * Get an array of unique th elements, one for each column\n   *  @param {object} oSettings dataTables settings object\n   *  @param {node} nHeader automatically detect the layout from this node - optional\n   *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n   *  @returns array {node} aReturn list of unique th's\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnGetUniqueThs(oSettings, nHeader, aLayout) {\n    var aReturn = [];\n\n    if (!aLayout) {\n      aLayout = oSettings.aoHeader;\n\n      if (nHeader) {\n        aLayout = [];\n\n        _fnDetectHeader(aLayout, nHeader);\n      }\n    }\n\n    for (var i = 0, iLen = aLayout.length; i < iLen; i++) {\n      for (var j = 0, jLen = aLayout[i].length; j < jLen; j++) {\n        if (aLayout[i][j].unique && (!aReturn[j] || !oSettings.bSortCellsTop)) {\n          aReturn[j] = aLayout[i][j].cell;\n        }\n      }\n    }\n\n    return aReturn;\n  }\n  /**\n   * Set the start position for draw\n   *  @param {object} oSettings dataTables settings object\n   */\n\n\n  function _fnStart(oSettings) {\n    var bServerSide = _fnDataSource(oSettings) == 'ssp';\n    var iInitDisplayStart = oSettings.iInitDisplayStart; // Check and see if we have an initial draw position from state saving\n\n    if (iInitDisplayStart !== undefined && iInitDisplayStart !== -1) {\n      oSettings._iDisplayStart = bServerSide ? iInitDisplayStart : iInitDisplayStart >= oSettings.fnRecordsDisplay() ? 0 : iInitDisplayStart;\n      oSettings.iInitDisplayStart = -1;\n    }\n  }\n  /**\n   * Create an Ajax call based on the table's settings, taking into account that\n   * parameters can have multiple forms, and backwards compatibility.\n   *\n   * @param {object} oSettings dataTables settings object\n   * @param {array} data Data to send to the server, required by\n   *     DataTables - may be augmented by developer callbacks\n   * @param {function} fn Callback function to run when data is obtained\n   */\n\n\n  function _fnBuildAjax(oSettings, data, fn) {\n    // Compatibility with 1.9-, allow fnServerData and event to manipulate\n    _fnCallbackFire(oSettings, 'aoServerParams', 'serverParams', [data]); // Convert to object based for 1.10+ if using the old array scheme which can\n    // come from server-side processing or serverParams\n\n\n    if (data && Array.isArray(data)) {\n      var tmp = {};\n      var rbracket = /(.*?)\\[\\]$/;\n      $.each(data, function (key, val) {\n        var match = val.name.match(rbracket);\n\n        if (match) {\n          // Support for arrays\n          var name = match[0];\n\n          if (!tmp[name]) {\n            tmp[name] = [];\n          }\n\n          tmp[name].push(val.value);\n        } else {\n          tmp[val.name] = val.value;\n        }\n      });\n      data = tmp;\n    }\n\n    var ajaxData;\n    var ajax = oSettings.ajax;\n    var instance = oSettings.oInstance;\n\n    var callback = function callback(json) {\n      var status = oSettings.jqXHR ? oSettings.jqXHR.status : null;\n\n      if (json === null || typeof status === 'number' && status == 204) {\n        json = {};\n\n        _fnAjaxDataSrc(oSettings, json, []);\n      }\n\n      var error = json.error || json.sError;\n\n      if (error) {\n        _fnLog(oSettings, 0, error);\n      }\n\n      oSettings.json = json;\n\n      _fnCallbackFire(oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR]);\n\n      fn(json);\n    };\n\n    if ($.isPlainObject(ajax) && ajax.data) {\n      ajaxData = ajax.data;\n      var newData = typeof ajaxData === 'function' ? ajaxData(data, oSettings) : // fn can manipulate data or return\n      ajaxData; // an object object or array to merge\n      // If the function returned something, use that alone\n\n      data = typeof ajaxData === 'function' && newData ? newData : $.extend(true, data, newData); // Remove the data property as we've resolved it already and don't want\n      // jQuery to do it again (it is restored at the end of the function)\n\n      delete ajax.data;\n    }\n\n    var baseAjax = {\n      \"data\": data,\n      \"success\": callback,\n      \"dataType\": \"json\",\n      \"cache\": false,\n      \"type\": oSettings.sServerMethod,\n      \"error\": function error(xhr, _error, thrown) {\n        var ret = _fnCallbackFire(oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR]);\n\n        if ($.inArray(true, ret) === -1) {\n          if (_error == \"parsererror\") {\n            _fnLog(oSettings, 0, 'Invalid JSON response', 1);\n          } else if (xhr.readyState === 4) {\n            _fnLog(oSettings, 0, 'Ajax error', 7);\n          }\n        }\n\n        _fnProcessingDisplay(oSettings, false);\n      }\n    }; // Store the data submitted for the API\n\n    oSettings.oAjaxData = data; // Allow plug-ins and external processes to modify the data\n\n    _fnCallbackFire(oSettings, null, 'preXhr', [oSettings, data]);\n\n    if (oSettings.fnServerData) {\n      // DataTables 1.9- compatibility\n      oSettings.fnServerData.call(instance, oSettings.sAjaxSource, $.map(data, function (val, key) {\n        // Need to convert back to 1.9 trad format\n        return {\n          name: key,\n          value: val\n        };\n      }), callback, oSettings);\n    } else if (oSettings.sAjaxSource || typeof ajax === 'string') {\n      // DataTables 1.9- compatibility\n      oSettings.jqXHR = $.ajax($.extend(baseAjax, {\n        url: ajax || oSettings.sAjaxSource\n      }));\n    } else if (typeof ajax === 'function') {\n      // Is a function - let the caller define what needs to be done\n      oSettings.jqXHR = ajax.call(instance, data, callback, oSettings);\n    } else {\n      // Object to extend the base settings\n      oSettings.jqXHR = $.ajax($.extend(baseAjax, ajax)); // Restore for next time around\n\n      ajax.data = ajaxData;\n    }\n  }\n  /**\n   * Update the table using an Ajax call\n   *  @param {object} settings dataTables settings object\n   *  @returns {boolean} Block the table drawing or not\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAjaxUpdate(settings) {\n    settings.iDraw++;\n\n    _fnProcessingDisplay(settings, true); // Keep track of drawHold state to handle scrolling after the Ajax call\n\n\n    var drawHold = settings._drawHold;\n\n    _fnBuildAjax(settings, _fnAjaxParameters(settings), function (json) {\n      settings._drawHold = drawHold;\n\n      _fnAjaxUpdateDraw(settings, json);\n\n      settings._drawHold = false;\n    });\n  }\n  /**\n   * Build up the parameters in an object needed for a server-side processing\n   * request. Note that this is basically done twice, is different ways - a modern\n   * method which is used by default in DataTables 1.10 which uses objects and\n   * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n   * the sAjaxSource option is used in the initialisation, or the legacyAjax\n   * option is set.\n   *  @param {object} oSettings dataTables settings object\n   *  @returns {bool} block the table drawing or not\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAjaxParameters(settings) {\n    var columns = settings.aoColumns,\n        columnCount = columns.length,\n        features = settings.oFeatures,\n        preSearch = settings.oPreviousSearch,\n        preColSearch = settings.aoPreSearchCols,\n        i,\n        data = [],\n        dataProp,\n        column,\n        columnSearch,\n        sort = _fnSortFlatten(settings),\n        displayStart = settings._iDisplayStart,\n        displayLength = features.bPaginate !== false ? settings._iDisplayLength : -1;\n\n    var param = function param(name, value) {\n      data.push({\n        'name': name,\n        'value': value\n      });\n    }; // DataTables 1.9- compatible method\n\n\n    param('sEcho', settings.iDraw);\n    param('iColumns', columnCount);\n    param('sColumns', _pluck(columns, 'sName').join(','));\n    param('iDisplayStart', displayStart);\n    param('iDisplayLength', displayLength); // DataTables 1.10+ method\n\n    var d = {\n      draw: settings.iDraw,\n      columns: [],\n      order: [],\n      start: displayStart,\n      length: displayLength,\n      search: {\n        value: preSearch.sSearch,\n        regex: preSearch.bRegex\n      }\n    };\n\n    for (i = 0; i < columnCount; i++) {\n      column = columns[i];\n      columnSearch = preColSearch[i];\n      dataProp = typeof column.mData == \"function\" ? 'function' : column.mData;\n      d.columns.push({\n        data: dataProp,\n        name: column.sName,\n        searchable: column.bSearchable,\n        orderable: column.bSortable,\n        search: {\n          value: columnSearch.sSearch,\n          regex: columnSearch.bRegex\n        }\n      });\n      param(\"mDataProp_\" + i, dataProp);\n\n      if (features.bFilter) {\n        param('sSearch_' + i, columnSearch.sSearch);\n        param('bRegex_' + i, columnSearch.bRegex);\n        param('bSearchable_' + i, column.bSearchable);\n      }\n\n      if (features.bSort) {\n        param('bSortable_' + i, column.bSortable);\n      }\n    }\n\n    if (features.bFilter) {\n      param('sSearch', preSearch.sSearch);\n      param('bRegex', preSearch.bRegex);\n    }\n\n    if (features.bSort) {\n      $.each(sort, function (i, val) {\n        d.order.push({\n          column: val.col,\n          dir: val.dir\n        });\n        param('iSortCol_' + i, val.col);\n        param('sSortDir_' + i, val.dir);\n      });\n      param('iSortingCols', sort.length);\n    } // If the legacy.ajax parameter is null, then we automatically decide which\n    // form to use, based on sAjaxSource\n\n\n    var legacy = DataTable.ext.legacy.ajax;\n\n    if (legacy === null) {\n      return settings.sAjaxSource ? data : d;\n    } // Otherwise, if legacy has been specified then we use that to decide on the\n    // form\n\n\n    return legacy ? data : d;\n  }\n  /**\n   * Data the data from the server (nuking the old) and redraw the table\n   *  @param {object} oSettings dataTables settings object\n   *  @param {object} json json data return from the server.\n   *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n   *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n   *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n   *  @param {array} json.aaData The data to display on this page\n   *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnAjaxUpdateDraw(settings, json) {\n    // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n    // Support both\n    var compat = function compat(old, modern) {\n      return json[old] !== undefined ? json[old] : json[modern];\n    };\n\n    var data = _fnAjaxDataSrc(settings, json);\n\n    var draw = compat('sEcho', 'draw');\n    var recordsTotal = compat('iTotalRecords', 'recordsTotal');\n    var recordsFiltered = compat('iTotalDisplayRecords', 'recordsFiltered');\n\n    if (draw !== undefined) {\n      // Protect against out of sequence returns\n      if (draw * 1 < settings.iDraw) {\n        return;\n      }\n\n      settings.iDraw = draw * 1;\n    } // No data in returned object, so rather than an array, we show an empty table\n\n\n    if (!data) {\n      data = [];\n    }\n\n    _fnClearTable(settings);\n\n    settings._iRecordsTotal = parseInt(recordsTotal, 10);\n    settings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\n    for (var i = 0, ien = data.length; i < ien; i++) {\n      _fnAddData(settings, data[i]);\n    }\n\n    settings.aiDisplay = settings.aiDisplayMaster.slice();\n\n    _fnDraw(settings, true);\n\n    if (!settings._bInitComplete) {\n      _fnInitComplete(settings, json);\n    }\n\n    _fnProcessingDisplay(settings, false);\n  }\n  /**\n   * Get the data from the JSON data source to use for drawing a table. Using\n   * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n   * source object, or from a processing function.\n   *  @param {object} oSettings dataTables settings object\n   *  @param  {object} json Data source object / array from the server\n   *  @return {array} Array of data to use\n   */\n\n\n  function _fnAjaxDataSrc(oSettings, json, write) {\n    var dataSrc = $.isPlainObject(oSettings.ajax) && oSettings.ajax.dataSrc !== undefined ? oSettings.ajax.dataSrc : oSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\n    if (!write) {\n      if (dataSrc === 'data') {\n        // If the default, then we still want to support the old style, and safely ignore\n        // it if possible\n        return json.aaData || json[dataSrc];\n      }\n\n      return dataSrc !== \"\" ? _fnGetObjectDataFn(dataSrc)(json) : json;\n    } // set\n\n\n    _fnSetObjectDataFn(dataSrc)(json, write);\n  }\n  /**\n   * Generate the node required for filtering text\n   *  @returns {node} Filter control element\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFeatureHtmlFilter(settings) {\n    var classes = settings.oClasses;\n    var tableId = settings.sTableId;\n    var language = settings.oLanguage;\n    var previousSearch = settings.oPreviousSearch;\n    var features = settings.aanFeatures;\n    var input = '<input type=\"search\" class=\"' + classes.sFilterInput + '\"/>';\n    var str = language.sSearch;\n    str = str.match(/_INPUT_/) ? str.replace('_INPUT_', input) : str + input;\n    var filter = $('<div/>', {\n      'id': !features.f ? tableId + '_filter' : null,\n      'class': classes.sFilter\n    }).append($('<label/>').append(str));\n\n    var searchFn = function searchFn(event) {\n      /* Update all other filter input elements for the new display */\n      var n = features.f;\n      var val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\n      if (previousSearch[\"return\"] && event.key !== \"Enter\") {\n        return;\n      }\n      /* Now do the filter */\n\n\n      if (val != previousSearch.sSearch) {\n        _fnFilterComplete(settings, {\n          \"sSearch\": val,\n          \"bRegex\": previousSearch.bRegex,\n          \"bSmart\": previousSearch.bSmart,\n          \"bCaseInsensitive\": previousSearch.bCaseInsensitive,\n          \"return\": previousSearch[\"return\"]\n        }); // Need to redraw, without resorting\n\n\n        settings._iDisplayStart = 0;\n\n        _fnDraw(settings);\n      }\n    };\n\n    var searchDelay = settings.searchDelay !== null ? settings.searchDelay : _fnDataSource(settings) === 'ssp' ? 400 : 0;\n    var jqFilter = $('input', filter).val(previousSearch.sSearch).attr('placeholder', language.sSearchPlaceholder).on('keyup.DT search.DT input.DT paste.DT cut.DT', searchDelay ? _fnThrottle(searchFn, searchDelay) : searchFn).on('mouseup.DT', function (e) {\n      // Edge fix! Edge 17 does not trigger anything other than mouse events when clicking\n      // on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`\n      // checks the value to see if it has changed. In other browsers it won't have.\n      setTimeout(function () {\n        searchFn.call(jqFilter[0], e);\n      }, 10);\n    }).on('keypress.DT', function (e) {\n      /* Prevent form submission */\n      if (e.keyCode == 13) {\n        return false;\n      }\n    }).attr('aria-controls', tableId); // Update the input elements whenever the table is filtered\n\n    $(settings.nTable).on('search.dt.DT', function (ev, s) {\n      if (settings === s) {\n        // IE9 throws an 'unknown error' if document.activeElement is used\n        // inside an iframe or frame...\n        try {\n          if (jqFilter[0] !== document.activeElement) {\n            jqFilter.val(previousSearch.sSearch);\n          }\n        } catch (e) {}\n      }\n    });\n    return filter[0];\n  }\n  /**\n   * Filter the table using both the global filter and column based filtering\n   *  @param {object} oSettings dataTables settings object\n   *  @param {object} oSearch search information\n   *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFilterComplete(oSettings, oInput, iForce) {\n    var oPrevSearch = oSettings.oPreviousSearch;\n    var aoPrevSearch = oSettings.aoPreSearchCols;\n\n    var fnSaveFilter = function fnSaveFilter(oFilter) {\n      /* Save the filtering values */\n      oPrevSearch.sSearch = oFilter.sSearch;\n      oPrevSearch.bRegex = oFilter.bRegex;\n      oPrevSearch.bSmart = oFilter.bSmart;\n      oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n      oPrevSearch[\"return\"] = oFilter[\"return\"];\n    };\n\n    var fnRegex = function fnRegex(o) {\n      // Backwards compatibility with the bEscapeRegex option\n      return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n    }; // Resolve any column types that are unknown due to addition or invalidation\n    // @todo As per sort - can this be moved into an event handler?\n\n\n    _fnColumnTypes(oSettings);\n    /* In server-side processing all filtering is done by the server, so no point hanging around here */\n\n\n    if (_fnDataSource(oSettings) != 'ssp') {\n      /* Global filter */\n      _fnFilter(oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive);\n\n      fnSaveFilter(oInput);\n      /* Now do the individual column filter */\n\n      for (var i = 0; i < aoPrevSearch.length; i++) {\n        _fnFilterColumn(oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]), aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive);\n      }\n      /* Custom filtering */\n\n\n      _fnFilterCustom(oSettings);\n    } else {\n      fnSaveFilter(oInput);\n    }\n    /* Tell the draw function we have been filtering */\n\n\n    oSettings.bFiltered = true;\n\n    _fnCallbackFire(oSettings, null, 'search', [oSettings]);\n  }\n  /**\n   * Apply custom filtering functions\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFilterCustom(settings) {\n    var filters = DataTable.ext.search;\n    var displayRows = settings.aiDisplay;\n    var row, rowIdx;\n\n    for (var i = 0, ien = filters.length; i < ien; i++) {\n      var rows = []; // Loop over each row and see if it should be included\n\n      for (var j = 0, jen = displayRows.length; j < jen; j++) {\n        rowIdx = displayRows[j];\n        row = settings.aoData[rowIdx];\n\n        if (filters[i](settings, row._aFilterData, rowIdx, row._aData, j)) {\n          rows.push(rowIdx);\n        }\n      } // So the array reference doesn't break set the results into the\n      // existing array\n\n\n      displayRows.length = 0;\n      $.merge(displayRows, rows);\n    }\n  }\n  /**\n   * Filter the table on a per-column basis\n   *  @param {object} oSettings dataTables settings object\n   *  @param {string} sInput string to filter on\n   *  @param {int} iColumn column to filter\n   *  @param {bool} bRegex treat search string as a regular expression or not\n   *  @param {bool} bSmart use smart filtering or not\n   *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFilterColumn(settings, searchStr, colIdx, regex, smart, caseInsensitive) {\n    if (searchStr === '') {\n      return;\n    }\n\n    var data;\n    var out = [];\n    var display = settings.aiDisplay;\n\n    var rpSearch = _fnFilterCreateSearch(searchStr, regex, smart, caseInsensitive);\n\n    for (var i = 0; i < display.length; i++) {\n      data = settings.aoData[display[i]]._aFilterData[colIdx];\n\n      if (rpSearch.test(data)) {\n        out.push(display[i]);\n      }\n    }\n\n    settings.aiDisplay = out;\n  }\n  /**\n   * Filter the data table based on user input and draw the table\n   *  @param {object} settings dataTables settings object\n   *  @param {string} input string to filter on\n   *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n   *  @param {bool} regex treat as a regular expression or not\n   *  @param {bool} smart perform smart filtering or not\n   *  @param {bool} caseInsensitive Do case insensitive matching or not\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFilter(settings, input, force, regex, smart, caseInsensitive) {\n    var rpSearch = _fnFilterCreateSearch(input, regex, smart, caseInsensitive);\n\n    var prevSearch = settings.oPreviousSearch.sSearch;\n    var displayMaster = settings.aiDisplayMaster;\n    var display, invalidated, i;\n    var filtered = []; // Need to take account of custom filtering functions - always filter\n\n    if (DataTable.ext.search.length !== 0) {\n      force = true;\n    } // Check if any of the rows were invalidated\n\n\n    invalidated = _fnFilterData(settings); // If the input is blank - we just want the full data set\n\n    if (input.length <= 0) {\n      settings.aiDisplay = displayMaster.slice();\n    } else {\n      // New search - start from the master array\n      if (invalidated || force || regex || prevSearch.length > input.length || input.indexOf(prevSearch) !== 0 || settings.bSorted // On resort, the display master needs to be\n      // re-filtered since indexes will have changed\n      ) {\n        settings.aiDisplay = displayMaster.slice();\n      } // Search the display array\n\n\n      display = settings.aiDisplay;\n\n      for (i = 0; i < display.length; i++) {\n        if (rpSearch.test(settings.aoData[display[i]]._sFilterRow)) {\n          filtered.push(display[i]);\n        }\n      }\n\n      settings.aiDisplay = filtered;\n    }\n  }\n  /**\n   * Build a regular expression object suitable for searching a table\n   *  @param {string} sSearch string to search for\n   *  @param {bool} bRegex treat as a regular expression or not\n   *  @param {bool} bSmart perform smart filtering or not\n   *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n   *  @returns {RegExp} constructed object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFilterCreateSearch(search, regex, smart, caseInsensitive) {\n    search = regex ? search : _fnEscapeRegex(search);\n\n    if (smart) {\n      /* For smart filtering we want to allow the search to work regardless of\n       * word order. We also want double quoted text to be preserved, so word\n       * order is important - a la google. So this is what we want to\n       * generate:\n       * \n       * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n       */\n      var a = $.map(search.match(/[\"\\u201C][^\"\\u201D]+[\"\\u201D]|[^ ]+/g) || [''], function (word) {\n        if (word.charAt(0) === '\"') {\n          var m = word.match(/^\"(.*)\"$/);\n          word = m ? m[1] : word;\n        } else if (word.charAt(0) === \"\\u201C\") {\n          var m = word.match(/^\\u201C(.*)\\u201D$/);\n          word = m ? m[1] : word;\n        }\n\n        return word.replace('\"', '');\n      });\n      search = '^(?=.*?' + a.join(')(?=.*?') + ').*$';\n    }\n\n    return new RegExp(search, caseInsensitive ? 'i' : '');\n  }\n  /**\n   * Escape a string such that it can be used in a regular expression\n   *  @param {string} sVal string to escape\n   *  @returns {string} escaped string\n   *  @memberof DataTable#oApi\n   */\n\n\n  var _fnEscapeRegex = DataTable.util.escapeRegex;\n  var __filter_div = $('<div>')[0];\n\n  var __filter_div_textContent = __filter_div.textContent !== undefined; // Update the filtering data for each row if needed (by invalidation or first run)\n\n\n  function _fnFilterData(settings) {\n    var columns = settings.aoColumns;\n    var column;\n    var i, j, ien, jen, filterData, cellData, row;\n    var wasInvalidated = false;\n\n    for (i = 0, ien = settings.aoData.length; i < ien; i++) {\n      row = settings.aoData[i];\n\n      if (!row._aFilterData) {\n        filterData = [];\n\n        for (j = 0, jen = columns.length; j < jen; j++) {\n          column = columns[j];\n\n          if (column.bSearchable) {\n            cellData = _fnGetCellData(settings, i, j, 'filter'); // Search in DataTables 1.10 is string based. In 1.11 this\n            // should be altered to also allow strict type checking.\n\n            if (cellData === null) {\n              cellData = '';\n            }\n\n            if (typeof cellData !== 'string' && cellData.toString) {\n              cellData = cellData.toString();\n            }\n          } else {\n            cellData = '';\n          } // If it looks like there is an HTML entity in the string,\n          // attempt to decode it so sorting works as expected. Note that\n          // we could use a single line of jQuery to do this, but the DOM\n          // method used here is much faster http://jsperf.com/html-decode\n\n\n          if (cellData.indexOf && cellData.indexOf('&') !== -1) {\n            __filter_div.innerHTML = cellData;\n            cellData = __filter_div_textContent ? __filter_div.textContent : __filter_div.innerText;\n          }\n\n          if (cellData.replace) {\n            cellData = cellData.replace(/[\\r\\n\\u2028]/g, '');\n          }\n\n          filterData.push(cellData);\n        }\n\n        row._aFilterData = filterData;\n        row._sFilterRow = filterData.join('  ');\n        wasInvalidated = true;\n      }\n    }\n\n    return wasInvalidated;\n  }\n  /**\n   * Convert from the internal Hungarian notation to camelCase for external\n   * interaction\n   *  @param {object} obj Object to convert\n   *  @returns {object} Inverted object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnSearchToCamel(obj) {\n    return {\n      search: obj.sSearch,\n      smart: obj.bSmart,\n      regex: obj.bRegex,\n      caseInsensitive: obj.bCaseInsensitive\n    };\n  }\n  /**\n   * Convert from camelCase notation to the internal Hungarian. We could use the\n   * Hungarian convert function here, but this is cleaner\n   *  @param {object} obj Object to convert\n   *  @returns {object} Inverted object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnSearchToHung(obj) {\n    return {\n      sSearch: obj.search,\n      bSmart: obj.smart,\n      bRegex: obj.regex,\n      bCaseInsensitive: obj.caseInsensitive\n    };\n  }\n  /**\n   * Generate the node required for the info display\n   *  @param {object} oSettings dataTables settings object\n   *  @returns {node} Information element\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFeatureHtmlInfo(settings) {\n    var tid = settings.sTableId,\n        nodes = settings.aanFeatures.i,\n        n = $('<div/>', {\n      'class': settings.oClasses.sInfo,\n      'id': !nodes ? tid + '_info' : null\n    });\n\n    if (!nodes) {\n      // Update display on each draw\n      settings.aoDrawCallback.push({\n        \"fn\": _fnUpdateInfo,\n        \"sName\": \"information\"\n      });\n      n.attr('role', 'status').attr('aria-live', 'polite'); // Table is described by our info div\n\n      $(settings.nTable).attr('aria-describedby', tid + '_info');\n    }\n\n    return n[0];\n  }\n  /**\n   * Update the information elements in the display\n   *  @param {object} settings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnUpdateInfo(settings) {\n    /* Show information about the table */\n    var nodes = settings.aanFeatures.i;\n\n    if (nodes.length === 0) {\n      return;\n    }\n\n    var lang = settings.oLanguage,\n        start = settings._iDisplayStart + 1,\n        end = settings.fnDisplayEnd(),\n        max = settings.fnRecordsTotal(),\n        total = settings.fnRecordsDisplay(),\n        out = total ? lang.sInfo : lang.sInfoEmpty;\n\n    if (total !== max) {\n      /* Record set after filtering */\n      out += ' ' + lang.sInfoFiltered;\n    } // Convert the macros\n\n\n    out += lang.sInfoPostFix;\n    out = _fnInfoMacros(settings, out);\n    var callback = lang.fnInfoCallback;\n\n    if (callback !== null) {\n      out = callback.call(settings.oInstance, settings, start, end, max, total, out);\n    }\n\n    $(nodes).html(out);\n  }\n\n  function _fnInfoMacros(settings, str) {\n    // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n    // internally\n    var formatter = settings.fnFormatNumber,\n        start = settings._iDisplayStart + 1,\n        len = settings._iDisplayLength,\n        vis = settings.fnRecordsDisplay(),\n        all = len === -1;\n    return str.replace(/_START_/g, formatter.call(settings, start)).replace(/_END_/g, formatter.call(settings, settings.fnDisplayEnd())).replace(/_MAX_/g, formatter.call(settings, settings.fnRecordsTotal())).replace(/_TOTAL_/g, formatter.call(settings, vis)).replace(/_PAGE_/g, formatter.call(settings, all ? 1 : Math.ceil(start / len))).replace(/_PAGES_/g, formatter.call(settings, all ? 1 : Math.ceil(vis / len)));\n  }\n  /**\n   * Draw the table for the first time, adding all required features\n   *  @param {object} settings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnInitialise(settings) {\n    var i,\n        iLen,\n        iAjaxStart = settings.iInitDisplayStart;\n    var columns = settings.aoColumns,\n        column;\n    var features = settings.oFeatures;\n    var deferLoading = settings.bDeferLoading; // value modified by the draw\n\n    /* Ensure that the table data is fully initialised */\n\n    if (!settings.bInitialised) {\n      setTimeout(function () {\n        _fnInitialise(settings);\n      }, 200);\n      return;\n    }\n    /* Show the display HTML options */\n\n\n    _fnAddOptionsHtml(settings);\n    /* Build and draw the header / footer for the table */\n\n\n    _fnBuildHead(settings);\n\n    _fnDrawHead(settings, settings.aoHeader);\n\n    _fnDrawHead(settings, settings.aoFooter);\n    /* Okay to show that something is going on now */\n\n\n    _fnProcessingDisplay(settings, true);\n    /* Calculate sizes for columns */\n\n\n    if (features.bAutoWidth) {\n      _fnCalculateColumnWidths(settings);\n    }\n\n    for (i = 0, iLen = columns.length; i < iLen; i++) {\n      column = columns[i];\n\n      if (column.sWidth) {\n        column.nTh.style.width = _fnStringToCss(column.sWidth);\n      }\n    }\n\n    _fnCallbackFire(settings, null, 'preInit', [settings]); // If there is default sorting required - let's do it. The sort function\n    // will do the drawing for us. Otherwise we draw the table regardless of the\n    // Ajax source - this allows the table to look initialised for Ajax sourcing\n    // data (show 'loading' message possibly)\n\n\n    _fnReDraw(settings); // Server-side processing init complete is done by _fnAjaxUpdateDraw\n\n\n    var dataSrc = _fnDataSource(settings);\n\n    if (dataSrc != 'ssp' || deferLoading) {\n      // if there is an ajax source load the data\n      if (dataSrc == 'ajax') {\n        _fnBuildAjax(settings, [], function (json) {\n          var aData = _fnAjaxDataSrc(settings, json); // Got the data - add it to the table\n\n\n          for (i = 0; i < aData.length; i++) {\n            _fnAddData(settings, aData[i]);\n          } // Reset the init display for cookie saving. We've already done\n          // a filter, and therefore cleared it before. So we need to make\n          // it appear 'fresh'\n\n\n          settings.iInitDisplayStart = iAjaxStart;\n\n          _fnReDraw(settings);\n\n          _fnProcessingDisplay(settings, false);\n\n          _fnInitComplete(settings, json);\n        }, settings);\n      } else {\n        _fnProcessingDisplay(settings, false);\n\n        _fnInitComplete(settings);\n      }\n    }\n  }\n  /**\n   * Draw the table for the first time, adding all required features\n   *  @param {object} oSettings dataTables settings object\n   *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n   *    with client-side processing (optional)\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnInitComplete(settings, json) {\n    settings._bInitComplete = true; // When data was added after the initialisation (data or Ajax) we need to\n    // calculate the column sizing\n\n    if (json || settings.oInit.aaData) {\n      _fnAdjustColumnSizing(settings);\n    }\n\n    _fnCallbackFire(settings, null, 'plugin-init', [settings, json]);\n\n    _fnCallbackFire(settings, 'aoInitComplete', 'init', [settings, json]);\n  }\n\n  function _fnLengthChange(settings, val) {\n    var len = parseInt(val, 10);\n    settings._iDisplayLength = len;\n\n    _fnLengthOverflow(settings); // Fire length change event\n\n\n    _fnCallbackFire(settings, null, 'length', [settings, len]);\n  }\n  /**\n   * Generate the node required for user display length changing\n   *  @param {object} settings dataTables settings object\n   *  @returns {node} Display length feature node\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFeatureHtmlLength(settings) {\n    var classes = settings.oClasses,\n        tableId = settings.sTableId,\n        menu = settings.aLengthMenu,\n        d2 = Array.isArray(menu[0]),\n        lengths = d2 ? menu[0] : menu,\n        language = d2 ? menu[1] : menu;\n    var select = $('<select/>', {\n      'name': tableId + '_length',\n      'aria-controls': tableId,\n      'class': classes.sLengthSelect\n    });\n\n    for (var i = 0, ien = lengths.length; i < ien; i++) {\n      select[0][i] = new Option(typeof language[i] === 'number' ? settings.fnFormatNumber(language[i]) : language[i], lengths[i]);\n    }\n\n    var div = $('<div><label/></div>').addClass(classes.sLength);\n\n    if (!settings.aanFeatures.l) {\n      div[0].id = tableId + '_length';\n    }\n\n    div.children().append(settings.oLanguage.sLengthMenu.replace('_MENU_', select[0].outerHTML)); // Can't use `select` variable as user might provide their own and the\n    // reference is broken by the use of outerHTML\n\n    $('select', div).val(settings._iDisplayLength).on('change.DT', function (e) {\n      _fnLengthChange(settings, $(this).val());\n\n      _fnDraw(settings);\n    }); // Update node value whenever anything changes the table's length\n\n    $(settings.nTable).on('length.dt.DT', function (e, s, len) {\n      if (settings === s) {\n        $('select', div).val(len);\n      }\n    });\n    return div[0];\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * Note that most of the paging logic is done in\n   * DataTable.ext.pager\n   */\n\n  /**\n   * Generate the node required for default pagination\n   *  @param {object} oSettings dataTables settings object\n   *  @returns {node} Pagination feature node\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFeatureHtmlPaginate(settings) {\n    var type = settings.sPaginationType,\n        plugin = DataTable.ext.pager[type],\n        modern = typeof plugin === 'function',\n        redraw = function redraw(settings) {\n      _fnDraw(settings);\n    },\n        node = $('<div/>').addClass(settings.oClasses.sPaging + type)[0],\n        features = settings.aanFeatures;\n\n    if (!modern) {\n      plugin.fnInit(settings, node, redraw);\n    }\n    /* Add a draw callback for the pagination on first instance, to update the paging display */\n\n\n    if (!features.p) {\n      node.id = settings.sTableId + '_paginate';\n      settings.aoDrawCallback.push({\n        \"fn\": function fn(settings) {\n          if (modern) {\n            var start = settings._iDisplayStart,\n                len = settings._iDisplayLength,\n                visRecords = settings.fnRecordsDisplay(),\n                all = len === -1,\n                page = all ? 0 : Math.ceil(start / len),\n                pages = all ? 1 : Math.ceil(visRecords / len),\n                buttons = plugin(page, pages),\n                i,\n                ien;\n\n            for (i = 0, ien = features.p.length; i < ien; i++) {\n              _fnRenderer(settings, 'pageButton')(settings, features.p[i], i, buttons, page, pages);\n            }\n          } else {\n            plugin.fnUpdate(settings, redraw);\n          }\n        },\n        \"sName\": \"pagination\"\n      });\n    }\n\n    return node;\n  }\n  /**\n   * Alter the display settings to change the page\n   *  @param {object} settings DataTables settings object\n   *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n   *    \"next\" or \"last\" or page number to jump to (integer)\n   *  @param [bool] redraw Automatically draw the update or not\n   *  @returns {bool} true page has changed, false - no change\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnPageChange(settings, action, redraw) {\n    var start = settings._iDisplayStart,\n        len = settings._iDisplayLength,\n        records = settings.fnRecordsDisplay();\n\n    if (records === 0 || len === -1) {\n      start = 0;\n    } else if (typeof action === \"number\") {\n      start = action * len;\n\n      if (start > records) {\n        start = 0;\n      }\n    } else if (action == \"first\") {\n      start = 0;\n    } else if (action == \"previous\") {\n      start = len >= 0 ? start - len : 0;\n\n      if (start < 0) {\n        start = 0;\n      }\n    } else if (action == \"next\") {\n      if (start + len < records) {\n        start += len;\n      }\n    } else if (action == \"last\") {\n      start = Math.floor((records - 1) / len) * len;\n    } else {\n      _fnLog(settings, 0, \"Unknown paging action: \" + action, 5);\n    }\n\n    var changed = settings._iDisplayStart !== start;\n    settings._iDisplayStart = start;\n\n    if (changed) {\n      _fnCallbackFire(settings, null, 'page', [settings]);\n\n      if (redraw) {\n        _fnDraw(settings);\n      }\n    } else {\n      // No change event - paging was called, but no change\n      _fnCallbackFire(settings, null, 'page-nc', [settings]);\n    }\n\n    return changed;\n  }\n  /**\n   * Generate the node required for the processing node\n   *  @param {object} settings dataTables settings object\n   *  @returns {node} Processing element\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFeatureHtmlProcessing(settings) {\n    return $('<div/>', {\n      'id': !settings.aanFeatures.r ? settings.sTableId + '_processing' : null,\n      'class': settings.oClasses.sProcessing,\n      'role': 'status'\n    }).html(settings.oLanguage.sProcessing).append('<div><div></div><div></div><div></div><div></div></div>').insertBefore(settings.nTable)[0];\n  }\n  /**\n   * Display or hide the processing indicator\n   *  @param {object} settings dataTables settings object\n   *  @param {bool} show Show the processing indicator (true) or not (false)\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnProcessingDisplay(settings, show) {\n    if (settings.oFeatures.bProcessing) {\n      $(settings.aanFeatures.r).css('display', show ? 'block' : 'none');\n    }\n\n    _fnCallbackFire(settings, null, 'processing', [settings, show]);\n  }\n  /**\n   * Add any control elements for the table - specifically scrolling\n   *  @param {object} settings dataTables settings object\n   *  @returns {node} Node to add to the DOM\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnFeatureHtmlTable(settings) {\n    var table = $(settings.nTable); // Scrolling from here on in\n\n    var scroll = settings.oScroll;\n\n    if (scroll.sX === '' && scroll.sY === '') {\n      return settings.nTable;\n    }\n\n    var scrollX = scroll.sX;\n    var scrollY = scroll.sY;\n    var classes = settings.oClasses;\n    var caption = table.children('caption');\n    var captionSide = caption.length ? caption[0]._captionSide : null;\n    var headerClone = $(table[0].cloneNode(false));\n    var footerClone = $(table[0].cloneNode(false));\n    var footer = table.children('tfoot');\n    var _div = '<div/>';\n\n    var size = function size(s) {\n      return !s ? null : _fnStringToCss(s);\n    };\n\n    if (!footer.length) {\n      footer = null;\n    }\n    /*\n     * The HTML structure that we want to generate in this function is:\n     *  div - scroller\n     *    div - scroll head\n     *      div - scroll head inner\n     *        table - scroll head table\n     *          thead - thead\n     *    div - scroll body\n     *      table - table (master table)\n     *        thead - thead clone for sizing\n     *        tbody - tbody\n     *    div - scroll foot\n     *      div - scroll foot inner\n     *        table - scroll foot table\n     *          tfoot - tfoot\n     */\n\n\n    var scroller = $(_div, {\n      'class': classes.sScrollWrapper\n    }).append($(_div, {\n      'class': classes.sScrollHead\n    }).css({\n      overflow: 'hidden',\n      position: 'relative',\n      border: 0,\n      width: scrollX ? size(scrollX) : '100%'\n    }).append($(_div, {\n      'class': classes.sScrollHeadInner\n    }).css({\n      'box-sizing': 'content-box',\n      width: scroll.sXInner || '100%'\n    }).append(headerClone.removeAttr('id').css('margin-left', 0).append(captionSide === 'top' ? caption : null).append(table.children('thead'))))).append($(_div, {\n      'class': classes.sScrollBody\n    }).css({\n      position: 'relative',\n      overflow: 'auto',\n      width: size(scrollX)\n    }).append(table));\n\n    if (footer) {\n      scroller.append($(_div, {\n        'class': classes.sScrollFoot\n      }).css({\n        overflow: 'hidden',\n        border: 0,\n        width: scrollX ? size(scrollX) : '100%'\n      }).append($(_div, {\n        'class': classes.sScrollFootInner\n      }).append(footerClone.removeAttr('id').css('margin-left', 0).append(captionSide === 'bottom' ? caption : null).append(table.children('tfoot')))));\n    }\n\n    var children = scroller.children();\n    var scrollHead = children[0];\n    var scrollBody = children[1];\n    var scrollFoot = footer ? children[2] : null; // When the body is scrolled, then we also want to scroll the headers\n\n    if (scrollX) {\n      $(scrollBody).on('scroll.DT', function (e) {\n        var scrollLeft = this.scrollLeft;\n        scrollHead.scrollLeft = scrollLeft;\n\n        if (footer) {\n          scrollFoot.scrollLeft = scrollLeft;\n        }\n      });\n    }\n\n    $(scrollBody).css('max-height', scrollY);\n\n    if (!scroll.bCollapse) {\n      $(scrollBody).css('height', scrollY);\n    }\n\n    settings.nScrollHead = scrollHead;\n    settings.nScrollBody = scrollBody;\n    settings.nScrollFoot = scrollFoot; // On redraw - align columns\n\n    settings.aoDrawCallback.push({\n      \"fn\": _fnScrollDraw,\n      \"sName\": \"scrolling\"\n    });\n    return scroller[0];\n  }\n  /**\n   * Update the header, footer and body tables for resizing - i.e. column\n   * alignment.\n   *\n   * Welcome to the most horrible function DataTables. The process that this\n   * function follows is basically:\n   *   1. Re-create the table inside the scrolling div\n   *   2. Take live measurements from the DOM\n   *   3. Apply the measurements to align the columns\n   *   4. Clean up\n   *\n   *  @param {object} settings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnScrollDraw(settings) {\n    // Given that this is such a monster function, a lot of variables are use\n    // to try and keep the minimised size as small as possible\n    var scroll = settings.oScroll,\n        scrollX = scroll.sX,\n        scrollXInner = scroll.sXInner,\n        scrollY = scroll.sY,\n        barWidth = scroll.iBarWidth,\n        divHeader = $(settings.nScrollHead),\n        divHeaderStyle = divHeader[0].style,\n        divHeaderInner = divHeader.children('div'),\n        divHeaderInnerStyle = divHeaderInner[0].style,\n        divHeaderTable = divHeaderInner.children('table'),\n        divBodyEl = settings.nScrollBody,\n        divBody = $(divBodyEl),\n        divBodyStyle = divBodyEl.style,\n        divFooter = $(settings.nScrollFoot),\n        divFooterInner = divFooter.children('div'),\n        divFooterTable = divFooterInner.children('table'),\n        header = $(settings.nTHead),\n        table = $(settings.nTable),\n        tableEl = table[0],\n        tableStyle = tableEl.style,\n        footer = settings.nTFoot ? $(settings.nTFoot) : null,\n        browser = settings.oBrowser,\n        ie67 = browser.bScrollOversize,\n        dtHeaderCells = _pluck(settings.aoColumns, 'nTh'),\n        headerTrgEls,\n        footerTrgEls,\n        headerSrcEls,\n        footerSrcEls,\n        headerCopy,\n        footerCopy,\n        headerWidths = [],\n        footerWidths = [],\n        headerContent = [],\n        footerContent = [],\n        idx,\n        correction,\n        sanityWidth,\n        zeroOut = function zeroOut(nSizer) {\n      var style = nSizer.style;\n      style.paddingTop = \"0\";\n      style.paddingBottom = \"0\";\n      style.borderTopWidth = \"0\";\n      style.borderBottomWidth = \"0\";\n      style.height = 0;\n    }; // If the scrollbar visibility has changed from the last draw, we need to\n    // adjust the column sizes as the table width will have changed to account\n    // for the scrollbar\n\n\n    var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\n    if (settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined) {\n      settings.scrollBarVis = scrollBarVis;\n\n      _fnAdjustColumnSizing(settings);\n\n      return; // adjust column sizing will call this function again\n    } else {\n      settings.scrollBarVis = scrollBarVis;\n    }\n    /*\n     * 1. Re-create the table inside the scrolling div\n     */\n    // Remove the old minimised thead and tfoot elements in the inner table\n\n\n    table.children('thead, tfoot').remove();\n\n    if (footer) {\n      footerCopy = footer.clone().prependTo(table);\n      footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\n      footerSrcEls = footerCopy.find('tr');\n      footerCopy.find('[id]').removeAttr('id');\n    } // Clone the current header and footer elements and then place it into the inner table\n\n\n    headerCopy = header.clone().prependTo(table);\n    headerTrgEls = header.find('tr'); // original header is in its own table\n\n    headerSrcEls = headerCopy.find('tr');\n    headerCopy.find('th, td').removeAttr('tabindex');\n    headerCopy.find('[id]').removeAttr('id');\n    /*\n     * 2. Take live measurements from the DOM - do not alter the DOM itself!\n     */\n    // Remove old sizing and apply the calculated column widths\n    // Get the unique column headers in the newly created (cloned) header. We want to apply the\n    // calculated sizes to this header\n\n    if (!scrollX) {\n      divBodyStyle.width = '100%';\n      divHeader[0].style.width = '100%';\n    }\n\n    $.each(_fnGetUniqueThs(settings, headerCopy), function (i, el) {\n      idx = _fnVisibleToColumnIndex(settings, i);\n      el.style.width = settings.aoColumns[idx].sWidth;\n    });\n\n    if (footer) {\n      _fnApplyToChildren(function (n) {\n        n.style.width = \"\";\n      }, footerSrcEls);\n    } // Size the table as a whole\n\n\n    sanityWidth = table.outerWidth();\n\n    if (scrollX === \"\") {\n      // No x scrolling\n      tableStyle.width = \"100%\"; // IE7 will make the width of the table when 100% include the scrollbar\n      // - which is shouldn't. When there is a scrollbar we need to take this\n      // into account.\n\n      if (ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")) {\n        tableStyle.width = _fnStringToCss(table.outerWidth() - barWidth);\n      } // Recalculate the sanity width\n\n\n      sanityWidth = table.outerWidth();\n    } else if (scrollXInner !== \"\") {\n      // legacy x scroll inner has been given - use it\n      tableStyle.width = _fnStringToCss(scrollXInner); // Recalculate the sanity width\n\n      sanityWidth = table.outerWidth();\n    } // Hidden header should have zero height, so remove padding and borders. Then\n    // set the width based on the real headers\n    // Apply all styles in one pass\n\n\n    _fnApplyToChildren(zeroOut, headerSrcEls); // Read all widths in next pass\n\n\n    _fnApplyToChildren(function (nSizer) {\n      var style = window.getComputedStyle ? window.getComputedStyle(nSizer).width : _fnStringToCss($(nSizer).width());\n      headerContent.push(nSizer.innerHTML);\n      headerWidths.push(style);\n    }, headerSrcEls); // Apply all widths in final pass\n\n\n    _fnApplyToChildren(function (nToSize, i) {\n      nToSize.style.width = headerWidths[i];\n    }, headerTrgEls);\n\n    $(headerSrcEls).css('height', 0);\n    /* Same again with the footer if we have one */\n\n    if (footer) {\n      _fnApplyToChildren(zeroOut, footerSrcEls);\n\n      _fnApplyToChildren(function (nSizer) {\n        footerContent.push(nSizer.innerHTML);\n        footerWidths.push(_fnStringToCss($(nSizer).css('width')));\n      }, footerSrcEls);\n\n      _fnApplyToChildren(function (nToSize, i) {\n        nToSize.style.width = footerWidths[i];\n      }, footerTrgEls);\n\n      $(footerSrcEls).height(0);\n    }\n    /*\n     * 3. Apply the measurements\n     */\n    // \"Hide\" the header and footer that we used for the sizing. We need to keep\n    // the content of the cell so that the width applied to the header and body\n    // both match, but we want to hide it completely. We want to also fix their\n    // width to what they currently are\n\n\n    _fnApplyToChildren(function (nSizer, i) {\n      nSizer.innerHTML = '<div class=\"dataTables_sizing\">' + headerContent[i] + '</div>';\n      nSizer.childNodes[0].style.height = \"0\";\n      nSizer.childNodes[0].style.overflow = \"hidden\";\n      nSizer.style.width = headerWidths[i];\n    }, headerSrcEls);\n\n    if (footer) {\n      _fnApplyToChildren(function (nSizer, i) {\n        nSizer.innerHTML = '<div class=\"dataTables_sizing\">' + footerContent[i] + '</div>';\n        nSizer.childNodes[0].style.height = \"0\";\n        nSizer.childNodes[0].style.overflow = \"hidden\";\n        nSizer.style.width = footerWidths[i];\n      }, footerSrcEls);\n    } // Sanity check that the table is of a sensible width. If not then we are going to get\n    // misalignment - try to prevent this by not allowing the table to shrink below its min width\n\n\n    if (Math.round(table.outerWidth()) < Math.round(sanityWidth)) {\n      // The min width depends upon if we have a vertical scrollbar visible or not */\n      correction = divBodyEl.scrollHeight > divBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\" ? sanityWidth + barWidth : sanityWidth; // IE6/7 are a law unto themselves...\n\n      if (ie67 && (divBodyEl.scrollHeight > divBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")) {\n        tableStyle.width = _fnStringToCss(correction - barWidth);\n      } // And give the user a warning that we've stopped the table getting too small\n\n\n      if (scrollX === \"\" || scrollXInner !== \"\") {\n        _fnLog(settings, 1, 'Possible column misalignment', 6);\n      }\n    } else {\n      correction = '100%';\n    } // Apply to the container elements\n\n\n    divBodyStyle.width = _fnStringToCss(correction);\n    divHeaderStyle.width = _fnStringToCss(correction);\n\n    if (footer) {\n      settings.nScrollFoot.style.width = _fnStringToCss(correction);\n    }\n    /*\n     * 4. Clean up\n     */\n\n\n    if (!scrollY) {\n      /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n       * the scrollbar height from the visible display, rather than adding it on. We need to\n       * set the height in order to sort this. Don't want to do it in any other browsers.\n       */\n      if (ie67) {\n        divBodyStyle.height = _fnStringToCss(tableEl.offsetHeight + barWidth);\n      }\n    }\n    /* Finally set the width's of the header and footer tables */\n\n\n    var iOuterWidth = table.outerWidth();\n    divHeaderTable[0].style.width = _fnStringToCss(iOuterWidth);\n    divHeaderInnerStyle.width = _fnStringToCss(iOuterWidth); // Figure out if there are scrollbar present - if so then we need a the header and footer to\n    // provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\n    var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n    var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right');\n    divHeaderInnerStyle[padding] = bScrolling ? barWidth + \"px\" : \"0px\";\n\n    if (footer) {\n      divFooterTable[0].style.width = _fnStringToCss(iOuterWidth);\n      divFooterInner[0].style.width = _fnStringToCss(iOuterWidth);\n      divFooterInner[0].style[padding] = bScrolling ? barWidth + \"px\" : \"0px\";\n    } // Correct DOM ordering for colgroup - comes before the thead\n\n\n    table.children('colgroup').insertBefore(table.children('thead'));\n    /* Adjust the position of the header in case we loose the y-scrollbar */\n\n    divBody.trigger('scroll'); // If sorting or filtering has occurred, jump the scrolling back to the top\n    // only if we aren't holding the position\n\n    if ((settings.bSorted || settings.bFiltered) && !settings._drawHold) {\n      divBodyEl.scrollTop = 0;\n    }\n  }\n  /**\n   * Apply a given function to the display child nodes of an element array (typically\n   * TD children of TR rows\n   *  @param {function} fn Method to apply to the objects\n   *  @param array {nodes} an1 List of elements to look through for display children\n   *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnApplyToChildren(fn, an1, an2) {\n    var index = 0,\n        i = 0,\n        iLen = an1.length;\n    var nNode1, nNode2;\n\n    while (i < iLen) {\n      nNode1 = an1[i].firstChild;\n      nNode2 = an2 ? an2[i].firstChild : null;\n\n      while (nNode1) {\n        if (nNode1.nodeType === 1) {\n          if (an2) {\n            fn(nNode1, nNode2, index);\n          } else {\n            fn(nNode1, index);\n          }\n\n          index++;\n        }\n\n        nNode1 = nNode1.nextSibling;\n        nNode2 = an2 ? nNode2.nextSibling : null;\n      }\n\n      i++;\n    }\n  }\n\n  var __re_html_remove = /<.*?>/g;\n  /**\n   * Calculate the width of columns for the table\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n  function _fnCalculateColumnWidths(oSettings) {\n    var table = oSettings.nTable,\n        columns = oSettings.aoColumns,\n        scroll = oSettings.oScroll,\n        scrollY = scroll.sY,\n        scrollX = scroll.sX,\n        scrollXInner = scroll.sXInner,\n        columnCount = columns.length,\n        visibleColumns = _fnGetColumns(oSettings, 'bVisible'),\n        headerCells = $('th', oSettings.nTHead),\n        tableWidthAttr = table.getAttribute('width'),\n        // from DOM element\n    tableContainer = table.parentNode,\n        userInputs = false,\n        i,\n        column,\n        columnIdx,\n        width,\n        outerWidth,\n        browser = oSettings.oBrowser,\n        ie67 = browser.bScrollOversize;\n\n    var styleWidth = table.style.width;\n\n    if (styleWidth && styleWidth.indexOf('%') !== -1) {\n      tableWidthAttr = styleWidth;\n    }\n    /* Convert any user input sizes into pixel sizes */\n\n\n    for (i = 0; i < visibleColumns.length; i++) {\n      column = columns[visibleColumns[i]];\n\n      if (column.sWidth !== null) {\n        column.sWidth = _fnConvertToWidth(column.sWidthOrig, tableContainer);\n        userInputs = true;\n      }\n    }\n    /* If the number of columns in the DOM equals the number that we have to\n     * process in DataTables, then we can use the offsets that are created by\n     * the web- browser. No custom sizes can be set in order for this to happen,\n     * nor scrolling used\n     */\n\n\n    if (ie67 || !userInputs && !scrollX && !scrollY && columnCount == _fnVisbleColumns(oSettings) && columnCount == headerCells.length) {\n      for (i = 0; i < columnCount; i++) {\n        var colIdx = _fnVisibleToColumnIndex(oSettings, i);\n\n        if (colIdx !== null) {\n          columns[colIdx].sWidth = _fnStringToCss(headerCells.eq(i).width());\n        }\n      }\n    } else {\n      // Otherwise construct a single row, worst case, table with the widest\n      // node in the data, assign any user defined widths, then insert it into\n      // the DOM and allow the browser to do all the hard work of calculating\n      // table widths\n      var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n      .css('visibility', 'hidden').removeAttr('id'); // Clean up the table body\n\n      tmpTable.find('tbody tr').remove();\n      var tr = $('<tr/>').appendTo(tmpTable.find('tbody')); // Clone the table header and footer - we can't use the header / footer\n      // from the cloned table, since if scrolling is active, the table's\n      // real header and footer are contained in different table tags\n\n      tmpTable.find('thead, tfoot').remove();\n      tmpTable.append($(oSettings.nTHead).clone()).append($(oSettings.nTFoot).clone()); // Remove any assigned widths from the footer (from scrolling)\n\n      tmpTable.find('tfoot th, tfoot td').css('width', ''); // Apply custom sizing to the cloned header\n\n      headerCells = _fnGetUniqueThs(oSettings, tmpTable.find('thead')[0]);\n\n      for (i = 0; i < visibleColumns.length; i++) {\n        column = columns[visibleColumns[i]];\n        headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ? _fnStringToCss(column.sWidthOrig) : ''; // For scrollX we need to force the column width otherwise the\n        // browser will collapse it. If this width is smaller than the\n        // width the column requires, then it will have no effect\n\n        if (column.sWidthOrig && scrollX) {\n          $(headerCells[i]).append($('<div/>').css({\n            width: column.sWidthOrig,\n            margin: 0,\n            padding: 0,\n            border: 0,\n            height: 1\n          }));\n        }\n      } // Find the widest cell for each column and put it into the table\n\n\n      if (oSettings.aoData.length) {\n        for (i = 0; i < visibleColumns.length; i++) {\n          columnIdx = visibleColumns[i];\n          column = columns[columnIdx];\n          $(_fnGetWidestNode(oSettings, columnIdx)).clone(false).append(column.sContentPadding).appendTo(tr);\n        }\n      } // Tidy the temporary table - remove name attributes so there aren't\n      // duplicated in the dom (radio elements for example)\n\n\n      $('[name]', tmpTable).removeAttr('name'); // Table has been built, attach to the document so we can work with it.\n      // A holding element is used, positioned at the top of the container\n      // with minimal height, so it has no effect on if the container scrolls\n      // or not. Otherwise it might trigger scrolling when it actually isn't\n      // needed\n\n      var holder = $('<div/>').css(scrollX || scrollY ? {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        height: 1,\n        right: 0,\n        overflow: 'hidden'\n      } : {}).append(tmpTable).appendTo(tableContainer); // When scrolling (X or Y) we want to set the width of the table as \n      // appropriate. However, when not scrolling leave the table width as it\n      // is. This results in slightly different, but I think correct behaviour\n\n      if (scrollX && scrollXInner) {\n        tmpTable.width(scrollXInner);\n      } else if (scrollX) {\n        tmpTable.css('width', 'auto');\n        tmpTable.removeAttr('width'); // If there is no width attribute or style, then allow the table to\n        // collapse\n\n        if (tmpTable.width() < tableContainer.clientWidth && tableWidthAttr) {\n          tmpTable.width(tableContainer.clientWidth);\n        }\n      } else if (scrollY) {\n        tmpTable.width(tableContainer.clientWidth);\n      } else if (tableWidthAttr) {\n        tmpTable.width(tableWidthAttr);\n      } // Get the width of each column in the constructed table - we need to\n      // know the inner width (so it can be assigned to the other table's\n      // cells) and the outer width so we can calculate the full width of the\n      // table. This is safe since DataTables requires a unique cell for each\n      // column, but if ever a header can span multiple columns, this will\n      // need to be modified.\n\n\n      var total = 0;\n\n      for (i = 0; i < visibleColumns.length; i++) {\n        var cell = $(headerCells[i]);\n        var border = cell.outerWidth() - cell.width(); // Use getBounding... where possible (not IE8-) because it can give\n        // sub-pixel accuracy, which we then want to round up!\n\n        var bounding = browser.bBounding ? Math.ceil(headerCells[i].getBoundingClientRect().width) : cell.outerWidth(); // Total is tracked to remove any sub-pixel errors as the outerWidth\n        // of the table might not equal the total given here (IE!).\n\n        total += bounding; // Width for each column to use\n\n        columns[visibleColumns[i]].sWidth = _fnStringToCss(bounding - border);\n      }\n\n      table.style.width = _fnStringToCss(total); // Finished with the table - ditch it\n\n      holder.remove();\n    } // If there is a width attr, we want to attach an event listener which\n    // allows the table sizing to automatically adjust when the window is\n    // resized. Use the width attr rather than CSS, since we can't know if the\n    // CSS is a relative value or absolute - DOM read is always px.\n\n\n    if (tableWidthAttr) {\n      table.style.width = _fnStringToCss(tableWidthAttr);\n    }\n\n    if ((tableWidthAttr || scrollX) && !oSettings._reszEvt) {\n      var bindResize = function bindResize() {\n        $(window).on('resize.DT-' + oSettings.sInstance, _fnThrottle(function () {\n          _fnAdjustColumnSizing(oSettings);\n        }));\n      }; // IE6/7 will crash if we bind a resize event handler on page load.\n      // To be removed in 1.11 which drops IE6/7 support\n\n\n      if (ie67) {\n        setTimeout(bindResize, 1000);\n      } else {\n        bindResize();\n      }\n\n      oSettings._reszEvt = true;\n    }\n  }\n  /**\n   * Throttle the calls to a function. Arguments and context are maintained for\n   * the throttled function\n   *  @param {function} fn Function to be called\n   *  @param {int} [freq=200] call frequency in mS\n   *  @returns {function} wrapped function\n   *  @memberof DataTable#oApi\n   */\n\n\n  var _fnThrottle = DataTable.util.throttle;\n  /**\n   * Convert a CSS unit width to pixels (e.g. 2em)\n   *  @param {string} width width to be converted\n   *  @param {node} parent parent to get the with for (required for relative widths) - optional\n   *  @returns {int} width in pixels\n   *  @memberof DataTable#oApi\n   */\n\n  function _fnConvertToWidth(width, parent) {\n    if (!width) {\n      return 0;\n    }\n\n    var n = $('<div/>').css('width', _fnStringToCss(width)).appendTo(parent || document.body);\n    var val = n[0].offsetWidth;\n    n.remove();\n    return val;\n  }\n  /**\n   * Get the widest node\n   *  @param {object} settings dataTables settings object\n   *  @param {int} colIdx column of interest\n   *  @returns {node} widest table node\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnGetWidestNode(settings, colIdx) {\n    var idx = _fnGetMaxLenString(settings, colIdx);\n\n    if (idx < 0) {\n      return null;\n    }\n\n    var data = settings.aoData[idx];\n    return !data.nTr ? // Might not have been created when deferred rendering\n    $('<td/>').html(_fnGetCellData(settings, idx, colIdx, 'display'))[0] : data.anCells[colIdx];\n  }\n  /**\n   * Get the maximum strlen for each data column\n   *  @param {object} settings dataTables settings object\n   *  @param {int} colIdx column of interest\n   *  @returns {string} max string length for each column\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnGetMaxLenString(settings, colIdx) {\n    var s,\n        max = -1,\n        maxIdx = -1;\n\n    for (var i = 0, ien = settings.aoData.length; i < ien; i++) {\n      s = _fnGetCellData(settings, i, colIdx, 'display') + '';\n      s = s.replace(__re_html_remove, '');\n      s = s.replace(/&nbsp;/g, ' ');\n\n      if (s.length > max) {\n        max = s.length;\n        maxIdx = i;\n      }\n    }\n\n    return maxIdx;\n  }\n  /**\n   * Append a CSS unit (only if required) to a string\n   *  @param {string} value to css-ify\n   *  @returns {string} value with css unit\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnStringToCss(s) {\n    if (s === null) {\n      return '0px';\n    }\n\n    if (typeof s == 'number') {\n      return s < 0 ? '0px' : s + 'px';\n    } // Check it has a unit character already\n\n\n    return s.match(/\\d$/) ? s + 'px' : s;\n  }\n\n  function _fnSortFlatten(settings) {\n    var i,\n        iLen,\n        k,\n        kLen,\n        aSort = [],\n        aiOrig = [],\n        aoColumns = settings.aoColumns,\n        aDataSort,\n        iCol,\n        sType,\n        srcCol,\n        fixed = settings.aaSortingFixed,\n        fixedObj = $.isPlainObject(fixed),\n        nestedSort = [],\n        add = function add(a) {\n      if (a.length && !Array.isArray(a[0])) {\n        // 1D array\n        nestedSort.push(a);\n      } else {\n        // 2D array\n        $.merge(nestedSort, a);\n      }\n    }; // Build the sort array, with pre-fix and post-fix options if they have been\n    // specified\n\n\n    if (Array.isArray(fixed)) {\n      add(fixed);\n    }\n\n    if (fixedObj && fixed.pre) {\n      add(fixed.pre);\n    }\n\n    add(settings.aaSorting);\n\n    if (fixedObj && fixed.post) {\n      add(fixed.post);\n    }\n\n    for (i = 0; i < nestedSort.length; i++) {\n      srcCol = nestedSort[i][0];\n      aDataSort = aoColumns[srcCol].aDataSort;\n\n      for (k = 0, kLen = aDataSort.length; k < kLen; k++) {\n        iCol = aDataSort[k];\n        sType = aoColumns[iCol].sType || 'string';\n\n        if (nestedSort[i]._idx === undefined) {\n          nestedSort[i]._idx = $.inArray(nestedSort[i][1], aoColumns[iCol].asSorting);\n        }\n\n        aSort.push({\n          src: srcCol,\n          col: iCol,\n          dir: nestedSort[i][1],\n          index: nestedSort[i]._idx,\n          type: sType,\n          formatter: DataTable.ext.type.order[sType + \"-pre\"]\n        });\n      }\n    }\n\n    return aSort;\n  }\n  /**\n   * Change the order of the table\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   *  @todo This really needs split up!\n   */\n\n\n  function _fnSort(oSettings) {\n    var i,\n        ien,\n        iLen,\n        j,\n        jLen,\n        k,\n        kLen,\n        sDataType,\n        nTh,\n        aiOrig = [],\n        oExtSort = DataTable.ext.type.order,\n        aoData = oSettings.aoData,\n        aoColumns = oSettings.aoColumns,\n        aDataSort,\n        data,\n        iCol,\n        sType,\n        oSort,\n        formatters = 0,\n        sortCol,\n        displayMaster = oSettings.aiDisplayMaster,\n        aSort; // Resolve any column types that are unknown due to addition or invalidation\n    // @todo Can this be moved into a 'data-ready' handler which is called when\n    //   data is going to be used in the table?\n\n    _fnColumnTypes(oSettings);\n\n    aSort = _fnSortFlatten(oSettings);\n\n    for (i = 0, ien = aSort.length; i < ien; i++) {\n      sortCol = aSort[i]; // Track if we can use the fast sort algorithm\n\n      if (sortCol.formatter) {\n        formatters++;\n      } // Load the data needed for the sort, for each cell\n\n\n      _fnSortData(oSettings, sortCol.col);\n    }\n    /* No sorting required if server-side or no sorting array */\n\n\n    if (_fnDataSource(oSettings) != 'ssp' && aSort.length !== 0) {\n      // Create a value - key array of the current row positions such that we can use their\n      // current position during the sort, if values match, in order to perform stable sorting\n      for (i = 0, iLen = displayMaster.length; i < iLen; i++) {\n        aiOrig[displayMaster[i]] = i;\n      }\n      /* Do the sort - here we want multi-column sorting based on a given data source (column)\n       * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n       * follow on it's own, but this is what we want (example two column sorting):\n       *  fnLocalSorting = function(a,b){\n       *    var iTest;\n       *    iTest = oSort['string-asc']('data11', 'data12');\n       *      if (iTest !== 0)\n       *        return iTest;\n       *    iTest = oSort['numeric-desc']('data21', 'data22');\n       *    if (iTest !== 0)\n       *      return iTest;\n       *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n       *  }\n       * Basically we have a test for each sorting column, if the data in that column is equal,\n       * test the next column. If all columns match, then we use a numeric sort on the row\n       * positions in the original data array to provide a stable sort.\n       *\n       * Note - I know it seems excessive to have two sorting methods, but the first is around\n       * 15% faster, so the second is only maintained for backwards compatibility with sorting\n       * methods which do not have a pre-sort formatting function.\n       */\n\n\n      if (formatters === aSort.length) {\n        // All sort types have formatting functions\n        displayMaster.sort(function (a, b) {\n          var x,\n              y,\n              k,\n              test,\n              sort,\n              len = aSort.length,\n              dataA = aoData[a]._aSortData,\n              dataB = aoData[b]._aSortData;\n\n          for (k = 0; k < len; k++) {\n            sort = aSort[k];\n            x = dataA[sort.col];\n            y = dataB[sort.col];\n            test = x < y ? -1 : x > y ? 1 : 0;\n\n            if (test !== 0) {\n              return sort.dir === 'asc' ? test : -test;\n            }\n          }\n\n          x = aiOrig[a];\n          y = aiOrig[b];\n          return x < y ? -1 : x > y ? 1 : 0;\n        });\n      } else {\n        // Depreciated - remove in 1.11 (providing a plug-in option)\n        // Not all sort types have formatting methods, so we have to call their sorting\n        // methods.\n        displayMaster.sort(function (a, b) {\n          var x,\n              y,\n              k,\n              l,\n              test,\n              sort,\n              fn,\n              len = aSort.length,\n              dataA = aoData[a]._aSortData,\n              dataB = aoData[b]._aSortData;\n\n          for (k = 0; k < len; k++) {\n            sort = aSort[k];\n            x = dataA[sort.col];\n            y = dataB[sort.col];\n            fn = oExtSort[sort.type + \"-\" + sort.dir] || oExtSort[\"string-\" + sort.dir];\n            test = fn(x, y);\n\n            if (test !== 0) {\n              return test;\n            }\n          }\n\n          x = aiOrig[a];\n          y = aiOrig[b];\n          return x < y ? -1 : x > y ? 1 : 0;\n        });\n      }\n    }\n    /* Tell the draw function that we have sorted the data */\n\n\n    oSettings.bSorted = true;\n  }\n\n  function _fnSortAria(settings) {\n    var label;\n    var nextSort;\n    var columns = settings.aoColumns;\n\n    var aSort = _fnSortFlatten(settings);\n\n    var oAria = settings.oLanguage.oAria; // ARIA attributes - need to loop all columns, to update all (removing old\n    // attributes as needed)\n\n    for (var i = 0, iLen = columns.length; i < iLen; i++) {\n      var col = columns[i];\n      var asSorting = col.asSorting;\n      var sTitle = col.ariaTitle || col.sTitle.replace(/<.*?>/g, \"\");\n      var th = col.nTh; // IE7 is throwing an error when setting these properties with jQuery's\n      // attr() and removeAttr() methods...\n\n      th.removeAttribute('aria-sort');\n      /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\n      if (col.bSortable) {\n        if (aSort.length > 0 && aSort[0].col == i) {\n          th.setAttribute('aria-sort', aSort[0].dir == \"asc\" ? \"ascending\" : \"descending\");\n          nextSort = asSorting[aSort[0].index + 1] || asSorting[0];\n        } else {\n          nextSort = asSorting[0];\n        }\n\n        label = sTitle + (nextSort === \"asc\" ? oAria.sSortAscending : oAria.sSortDescending);\n      } else {\n        label = sTitle;\n      }\n\n      th.setAttribute('aria-label', label);\n    }\n  }\n  /**\n   * Function to run on user sort request\n   *  @param {object} settings dataTables settings object\n   *  @param {node} attachTo node to attach the handler to\n   *  @param {int} colIdx column sorting index\n   *  @param {boolean} [append=false] Append the requested sort to the existing\n   *    sort if true (i.e. multi-column sort)\n   *  @param {function} [callback] callback function\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnSortListener(settings, colIdx, append, callback) {\n    var col = settings.aoColumns[colIdx];\n    var sorting = settings.aaSorting;\n    var asSorting = col.asSorting;\n    var nextSortIdx;\n\n    var next = function next(a, overflow) {\n      var idx = a._idx;\n\n      if (idx === undefined) {\n        idx = $.inArray(a[1], asSorting);\n      }\n\n      return idx + 1 < asSorting.length ? idx + 1 : overflow ? null : 0;\n    }; // Convert to 2D array if needed\n\n\n    if (typeof sorting[0] === 'number') {\n      sorting = settings.aaSorting = [sorting];\n    } // If appending the sort then we are multi-column sorting\n\n\n    if (append && settings.oFeatures.bSortMulti) {\n      // Are we already doing some kind of sort on this column?\n      var sortIdx = $.inArray(colIdx, _pluck(sorting, '0'));\n\n      if (sortIdx !== -1) {\n        // Yes, modify the sort\n        nextSortIdx = next(sorting[sortIdx], true);\n\n        if (nextSortIdx === null && sorting.length === 1) {\n          nextSortIdx = 0; // can't remove sorting completely\n        }\n\n        if (nextSortIdx === null) {\n          sorting.splice(sortIdx, 1);\n        } else {\n          sorting[sortIdx][1] = asSorting[nextSortIdx];\n          sorting[sortIdx]._idx = nextSortIdx;\n        }\n      } else {\n        // No sort on this column yet\n        sorting.push([colIdx, asSorting[0], 0]);\n        sorting[sorting.length - 1]._idx = 0;\n      }\n    } else if (sorting.length && sorting[0][0] == colIdx) {\n      // Single column - already sorting on this column, modify the sort\n      nextSortIdx = next(sorting[0]);\n      sorting.length = 1;\n      sorting[0][1] = asSorting[nextSortIdx];\n      sorting[0]._idx = nextSortIdx;\n    } else {\n      // Single column - sort only on this column\n      sorting.length = 0;\n      sorting.push([colIdx, asSorting[0]]);\n      sorting[0]._idx = 0;\n    } // Run the sort by calling a full redraw\n\n\n    _fnReDraw(settings); // callback used for async user interaction\n\n\n    if (typeof callback == 'function') {\n      callback(settings);\n    }\n  }\n  /**\n   * Attach a sort handler (click) to a node\n   *  @param {object} settings dataTables settings object\n   *  @param {node} attachTo node to attach the handler to\n   *  @param {int} colIdx column sorting index\n   *  @param {function} [callback] callback function\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnSortAttachListener(settings, attachTo, colIdx, callback) {\n    var col = settings.aoColumns[colIdx];\n\n    _fnBindAction(attachTo, {}, function (e) {\n      /* If the column is not sortable - don't to anything */\n      if (col.bSortable === false) {\n        return;\n      } // If processing is enabled use a timeout to allow the processing\n      // display to be shown - otherwise to it synchronously\n\n\n      if (settings.oFeatures.bProcessing) {\n        _fnProcessingDisplay(settings, true);\n\n        setTimeout(function () {\n          _fnSortListener(settings, colIdx, e.shiftKey, callback); // In server-side processing, the draw callback will remove the\n          // processing display\n\n\n          if (_fnDataSource(settings) !== 'ssp') {\n            _fnProcessingDisplay(settings, false);\n          }\n        }, 0);\n      } else {\n        _fnSortListener(settings, colIdx, e.shiftKey, callback);\n      }\n    });\n  }\n  /**\n   * Set the sorting classes on table's body, Note: it is safe to call this function\n   * when bSort and bSortClasses are false\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnSortingClasses(settings) {\n    var oldSort = settings.aLastSort;\n    var sortClass = settings.oClasses.sSortColumn;\n\n    var sort = _fnSortFlatten(settings);\n\n    var features = settings.oFeatures;\n    var i, ien, colIdx;\n\n    if (features.bSort && features.bSortClasses) {\n      // Remove old sorting classes\n      for (i = 0, ien = oldSort.length; i < ien; i++) {\n        colIdx = oldSort[i].src; // Remove column sorting\n\n        $(_pluck(settings.aoData, 'anCells', colIdx)).removeClass(sortClass + (i < 2 ? i + 1 : 3));\n      } // Add new column sorting\n\n\n      for (i = 0, ien = sort.length; i < ien; i++) {\n        colIdx = sort[i].src;\n        $(_pluck(settings.aoData, 'anCells', colIdx)).addClass(sortClass + (i < 2 ? i + 1 : 3));\n      }\n    }\n\n    settings.aLastSort = sort;\n  } // Get the data to sort a column, be it from cache, fresh (populating the\n  // cache), or from a sort formatter\n\n\n  function _fnSortData(settings, idx) {\n    // Custom sorting function - provided by the sort data type\n    var column = settings.aoColumns[idx];\n    var customSort = DataTable.ext.order[column.sSortDataType];\n    var customData;\n\n    if (customSort) {\n      customData = customSort.call(settings.oInstance, settings, idx, _fnColumnIndexToVisible(settings, idx));\n    } // Use / populate cache\n\n\n    var row, cellData;\n    var formatter = DataTable.ext.type.order[column.sType + \"-pre\"];\n\n    for (var i = 0, ien = settings.aoData.length; i < ien; i++) {\n      row = settings.aoData[i];\n\n      if (!row._aSortData) {\n        row._aSortData = [];\n      }\n\n      if (!row._aSortData[idx] || customSort) {\n        cellData = customSort ? customData[i] : // If there was a custom sort function, use data from there\n        _fnGetCellData(settings, i, idx, 'sort');\n        row._aSortData[idx] = formatter ? formatter(cellData) : cellData;\n      }\n    }\n  }\n  /**\n   * Save the state of a table\n   *  @param {object} oSettings dataTables settings object\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnSaveState(settings) {\n    if (settings._bLoadingState) {\n      return;\n    }\n    /* Store the interesting variables */\n\n\n    var state = {\n      time: +new Date(),\n      start: settings._iDisplayStart,\n      length: settings._iDisplayLength,\n      order: $.extend(true, [], settings.aaSorting),\n      search: _fnSearchToCamel(settings.oPreviousSearch),\n      columns: $.map(settings.aoColumns, function (col, i) {\n        return {\n          visible: col.bVisible,\n          search: _fnSearchToCamel(settings.aoPreSearchCols[i])\n        };\n      })\n    };\n    settings.oSavedState = state;\n\n    _fnCallbackFire(settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state]);\n\n    if (settings.oFeatures.bStateSave && !settings.bDestroying) {\n      settings.fnStateSaveCallback.call(settings.oInstance, settings, state);\n    }\n  }\n  /**\n   * Attempt to load a saved table state\n   *  @param {object} oSettings dataTables settings object\n   *  @param {object} oInit DataTables init object so we can override settings\n   *  @param {function} callback Callback to execute when the state has been loaded\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnLoadState(settings, oInit, callback) {\n    if (!settings.oFeatures.bStateSave) {\n      callback();\n      return;\n    }\n\n    var loaded = function loaded(state) {\n      _fnImplementState(settings, state, callback);\n    };\n\n    var state = settings.fnStateLoadCallback.call(settings.oInstance, settings, loaded);\n\n    if (state !== undefined) {\n      _fnImplementState(settings, state, callback);\n    } // otherwise, wait for the loaded callback to be executed\n\n\n    return true;\n  }\n\n  function _fnImplementState(settings, s, callback) {\n    var i, ien;\n    var columns = settings.aoColumns;\n    settings._bLoadingState = true; // When StateRestore was introduced the state could now be implemented at any time\n    // Not just initialisation. To do this an api instance is required in some places\n\n    var api = settings._bInitComplete ? new DataTable.Api(settings) : null;\n\n    if (!s || !s.time) {\n      settings._bLoadingState = false;\n      callback();\n      return;\n    } // Allow custom and plug-in manipulation functions to alter the saved data set and\n    // cancelling of loading by returning false\n\n\n    var abStateLoad = _fnCallbackFire(settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s]);\n\n    if ($.inArray(false, abStateLoad) !== -1) {\n      settings._bLoadingState = false;\n      callback();\n      return;\n    } // Reject old data\n\n\n    var duration = settings.iStateDuration;\n\n    if (duration > 0 && s.time < +new Date() - duration * 1000) {\n      settings._bLoadingState = false;\n      callback();\n      return;\n    } // Number of columns have changed - all bets are off, no restore of settings\n\n\n    if (s.columns && columns.length !== s.columns.length) {\n      settings._bLoadingState = false;\n      callback();\n      return;\n    } // Store the saved state so it might be accessed at any time\n\n\n    settings.oLoadedState = $.extend(true, {}, s); // Page Length\n\n    if (s.length !== undefined) {\n      // If already initialised just set the value directly so that the select element is also updated\n      if (api) {\n        api.page.len(s.length);\n      } else {\n        settings._iDisplayLength = s.length;\n      }\n    } // Restore key features - todo - for 1.11 this needs to be done by\n    // subscribed events\n\n\n    if (s.start !== undefined) {\n      if (api === null) {\n        settings._iDisplayStart = s.start;\n        settings.iInitDisplayStart = s.start;\n      } else {\n        _fnPageChange(settings, s.start / settings._iDisplayLength);\n      }\n    } // Order\n\n\n    if (s.order !== undefined) {\n      settings.aaSorting = [];\n      $.each(s.order, function (i, col) {\n        settings.aaSorting.push(col[0] >= columns.length ? [0, col[1]] : col);\n      });\n    } // Search\n\n\n    if (s.search !== undefined) {\n      $.extend(settings.oPreviousSearch, _fnSearchToHung(s.search));\n    } // Columns\n\n\n    if (s.columns) {\n      for (i = 0, ien = s.columns.length; i < ien; i++) {\n        var col = s.columns[i]; // Visibility\n\n        if (col.visible !== undefined) {\n          // If the api is defined, the table has been initialised so we need to use it rather than internal settings\n          if (api) {\n            // Don't redraw the columns on every iteration of this loop, we will do this at the end instead\n            api.column(i).visible(col.visible, false);\n          } else {\n            columns[i].bVisible = col.visible;\n          }\n        } // Search\n\n\n        if (col.search !== undefined) {\n          $.extend(settings.aoPreSearchCols[i], _fnSearchToHung(col.search));\n        }\n      } // If the api is defined then we need to adjust the columns once the visibility has been changed\n\n\n      if (api) {\n        api.columns.adjust();\n      }\n    }\n\n    settings._bLoadingState = false;\n\n    _fnCallbackFire(settings, 'aoStateLoaded', 'stateLoaded', [settings, s]);\n\n    callback();\n  }\n\n  ;\n  /**\n   * Return the settings object for a particular table\n   *  @param {node} table table we are using as a dataTable\n   *  @returns {object} Settings object - or null if not found\n   *  @memberof DataTable#oApi\n   */\n\n  function _fnSettingsFromNode(table) {\n    var settings = DataTable.settings;\n    var idx = $.inArray(table, _pluck(settings, 'nTable'));\n    return idx !== -1 ? settings[idx] : null;\n  }\n  /**\n   * Log an error message\n   *  @param {object} settings dataTables settings object\n   *  @param {int} level log error messages, or display them to the user\n   *  @param {string} msg error message\n   *  @param {int} tn Technical note id to get more information about the error.\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnLog(settings, level, msg, tn) {\n    msg = 'DataTables warning: ' + (settings ? 'table id=' + settings.sTableId + ' - ' : '') + msg;\n\n    if (tn) {\n      msg += '. For more information about this error, please see ' + 'http://datatables.net/tn/' + tn;\n    }\n\n    if (!level) {\n      // Backwards compatibility pre 1.10\n      var ext = DataTable.ext;\n      var type = ext.sErrMode || ext.errMode;\n\n      if (settings) {\n        _fnCallbackFire(settings, null, 'error', [settings, tn, msg]);\n      }\n\n      if (type == 'alert') {\n        alert(msg);\n      } else if (type == 'throw') {\n        throw new Error(msg);\n      } else if (typeof type == 'function') {\n        type(settings, tn, msg);\n      }\n    } else if (window.console && console.log) {\n      console.log(msg);\n    }\n  }\n  /**\n   * See if a property is defined on one object, if so assign it to the other object\n   *  @param {object} ret target object\n   *  @param {object} src source object\n   *  @param {string} name property\n   *  @param {string} [mappedName] name to map too - optional, name used if not given\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnMap(ret, src, name, mappedName) {\n    if (Array.isArray(name)) {\n      $.each(name, function (i, val) {\n        if (Array.isArray(val)) {\n          _fnMap(ret, src, val[0], val[1]);\n        } else {\n          _fnMap(ret, src, val);\n        }\n      });\n      return;\n    }\n\n    if (mappedName === undefined) {\n      mappedName = name;\n    }\n\n    if (src[name] !== undefined) {\n      ret[mappedName] = src[name];\n    }\n  }\n  /**\n   * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n   * shallow copy arrays. The reason we need to do this, is that we don't want to\n   * deep copy array init values (such as aaSorting) since the dev wouldn't be\n   * able to override them, but we do want to deep copy arrays.\n   *  @param {object} out Object to extend\n   *  @param {object} extender Object from which the properties will be applied to\n   *      out\n   *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n   *      independent copy with the exception of the `data` or `aaData` parameters\n   *      if they are present. This is so you can pass in a collection to\n   *      DataTables and have that used as your data source without breaking the\n   *      references\n   *  @returns {object} out Reference, just for convenience - out === the return.\n   *  @memberof DataTable#oApi\n   *  @todo This doesn't take account of arrays inside the deep copied objects.\n   */\n\n\n  function _fnExtend(out, extender, breakRefs) {\n    var val;\n\n    for (var prop in extender) {\n      if (extender.hasOwnProperty(prop)) {\n        val = extender[prop];\n\n        if ($.isPlainObject(val)) {\n          if (!$.isPlainObject(out[prop])) {\n            out[prop] = {};\n          }\n\n          $.extend(true, out[prop], val);\n        } else if (breakRefs && prop !== 'data' && prop !== 'aaData' && Array.isArray(val)) {\n          out[prop] = val.slice();\n        } else {\n          out[prop] = val;\n        }\n      }\n    }\n\n    return out;\n  }\n  /**\n   * Bind an event handers to allow a click or return key to activate the callback.\n   * This is good for accessibility since a return on the keyboard will have the\n   * same effect as a click, if the element has focus.\n   *  @param {element} n Element to bind the action to\n   *  @param {object} oData Data object to pass to the triggered function\n   *  @param {function} fn Callback function for when the event is triggered\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnBindAction(n, oData, fn) {\n    $(n).on('click.DT', oData, function (e) {\n      $(n).trigger('blur'); // Remove focus outline for mouse users\n\n      fn(e);\n    }).on('keypress.DT', oData, function (e) {\n      if (e.which === 13) {\n        e.preventDefault();\n        fn(e);\n      }\n    }).on('selectstart.DT', function () {\n      /* Take the brutal approach to cancelling text selection */\n      return false;\n    });\n  }\n  /**\n   * Register a callback function. Easily allows a callback function to be added to\n   * an array store of callback functions that can then all be called together.\n   *  @param {object} oSettings dataTables settings object\n   *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n   *  @param {function} fn Function to be called back\n   *  @param {string} sName Identifying name for the callback (i.e. a label)\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnCallbackReg(oSettings, sStore, fn, sName) {\n    if (fn) {\n      oSettings[sStore].push({\n        \"fn\": fn,\n        \"sName\": sName\n      });\n    }\n  }\n  /**\n   * Fire callback functions and trigger events. Note that the loop over the\n   * callback array store is done backwards! Further note that you do not want to\n   * fire off triggers in time sensitive applications (for example cell creation)\n   * as its slow.\n   *  @param {object} settings dataTables settings object\n   *  @param {string} callbackArr Name of the array storage for the callbacks in\n   *      oSettings\n   *  @param {string} eventName Name of the jQuery custom event to trigger. If\n   *      null no trigger is fired\n   *  @param {array} args Array of arguments to pass to the callback function /\n   *      trigger\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnCallbackFire(settings, callbackArr, eventName, args) {\n    var ret = [];\n\n    if (callbackArr) {\n      ret = $.map(settings[callbackArr].slice().reverse(), function (val, i) {\n        return val.fn.apply(settings.oInstance, args);\n      });\n    }\n\n    if (eventName !== null) {\n      var e = $.Event(eventName + '.dt');\n      var table = $(settings.nTable);\n      table.trigger(e, args); // If not yet attached to the document, trigger the event\n      // on the body directly to sort of simulate the bubble\n\n      if (table.parents('body').length === 0) {\n        $('body').trigger(e, args);\n      }\n\n      ret.push(e.result);\n    }\n\n    return ret;\n  }\n\n  function _fnLengthOverflow(settings) {\n    var start = settings._iDisplayStart,\n        end = settings.fnDisplayEnd(),\n        len = settings._iDisplayLength;\n    /* If we have space to show extra rows (backing up from the end point - then do so */\n\n    if (start >= end) {\n      start = end - len;\n    } // Keep the start record on the current page\n\n\n    start -= start % len;\n\n    if (len === -1 || start < 0) {\n      start = 0;\n    }\n\n    settings._iDisplayStart = start;\n  }\n\n  function _fnRenderer(settings, type) {\n    var renderer = settings.renderer;\n    var host = DataTable.ext.renderer[type];\n\n    if ($.isPlainObject(renderer) && renderer[type]) {\n      // Specific renderer for this type. If available use it, otherwise use\n      // the default.\n      return host[renderer[type]] || host._;\n    } else if (typeof renderer === 'string') {\n      // Common renderer - if there is one available for this type use it,\n      // otherwise use the default\n      return host[renderer] || host._;\n    } // Use the default\n\n\n    return host._;\n  }\n  /**\n   * Detect the data source being used for the table. Used to simplify the code\n   * a little (ajax) and to make it compress a little smaller.\n   *\n   *  @param {object} settings dataTables settings object\n   *  @returns {string} Data source\n   *  @memberof DataTable#oApi\n   */\n\n\n  function _fnDataSource(settings) {\n    if (settings.oFeatures.bServerSide) {\n      return 'ssp';\n    } else if (settings.ajax || settings.sAjaxSource) {\n      return 'ajax';\n    }\n\n    return 'dom';\n  }\n  /**\n   * Computed structure of the DataTables API, defined by the options passed to\n   * `DataTable.Api.register()` when building the API.\n   *\n   * The structure is built in order to speed creation and extension of the Api\n   * objects since the extensions are effectively pre-parsed.\n   *\n   * The array is an array of objects with the following structure, where this\n   * base array represents the Api prototype base:\n   *\n   *     [\n   *       {\n   *         name:      'data'                -- string   - Property name\n   *         val:       function () {},       -- function - Api method (or undefined if just an object\n   *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n   *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n   *       },\n   *       {\n   *         name:     'row'\n   *         val:       {},\n   *         methodExt: [ ... ],\n   *         propExt:   [\n   *           {\n   *             name:      'data'\n   *             val:       function () {},\n   *             methodExt: [ ... ],\n   *             propExt:   [ ... ]\n   *           },\n   *           ...\n   *         ]\n   *       }\n   *     ]\n   *\n   * @type {Array}\n   * @ignore\n   */\n\n\n  var __apiStruct = [];\n  /**\n   * `Array.prototype` reference.\n   *\n   * @type object\n   * @ignore\n   */\n\n  var __arrayProto = Array.prototype;\n  /**\n   * Abstraction for `context` parameter of the `Api` constructor to allow it to\n   * take several different forms for ease of use.\n   *\n   * Each of the input parameter types will be converted to a DataTables settings\n   * object where possible.\n   *\n   * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n   *   of:\n   *\n   *   * `string` - jQuery selector. Any DataTables' matching the given selector\n   *     with be found and used.\n   *   * `node` - `TABLE` node which has already been formed into a DataTable.\n   *   * `jQuery` - A jQuery object of `TABLE` nodes.\n   *   * `object` - DataTables settings object\n   *   * `DataTables.Api` - API instance\n   * @return {array|null} Matching DataTables settings objects. `null` or\n   *   `undefined` is returned if no matching DataTable is found.\n   * @ignore\n   */\n\n  var _toSettings = function _toSettings(mixed) {\n    var idx, jq;\n    var settings = DataTable.settings;\n    var tables = $.map(settings, function (el, i) {\n      return el.nTable;\n    });\n\n    if (!mixed) {\n      return [];\n    } else if (mixed.nTable && mixed.oApi) {\n      // DataTables settings object\n      return [mixed];\n    } else if (mixed.nodeName && mixed.nodeName.toLowerCase() === 'table') {\n      // Table node\n      idx = $.inArray(mixed, tables);\n      return idx !== -1 ? [settings[idx]] : null;\n    } else if (mixed && typeof mixed.settings === 'function') {\n      return mixed.settings().toArray();\n    } else if (typeof mixed === 'string') {\n      // jQuery selector\n      jq = $(mixed);\n    } else if (mixed instanceof $) {\n      // jQuery object (also DataTables instance)\n      jq = mixed;\n    }\n\n    if (jq) {\n      return jq.map(function (i) {\n        idx = $.inArray(this, tables);\n        return idx !== -1 ? settings[idx] : null;\n      }).toArray();\n    }\n  };\n  /**\n   * DataTables API class - used to control and interface with  one or more\n   * DataTables enhanced tables.\n   *\n   * The API class is heavily based on jQuery, presenting a chainable interface\n   * that you can use to interact with tables. Each instance of the API class has\n   * a \"context\" - i.e. the tables that it will operate on. This could be a single\n   * table, all tables on a page or a sub-set thereof.\n   *\n   * Additionally the API is designed to allow you to easily work with the data in\n   * the tables, retrieving and manipulating it as required. This is done by\n   * presenting the API class as an array like interface. The contents of the\n   * array depend upon the actions requested by each method (for example\n   * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n   * return an array of objects or arrays depending upon your table's\n   * configuration). The API object has a number of array like methods (`push`,\n   * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n   * `unique` etc) to assist your working with the data held in a table.\n   *\n   * Most methods (those which return an Api instance) are chainable, which means\n   * the return from a method call also has all of the methods available that the\n   * top level object had. For example, these two calls are equivalent:\n   *\n   *     // Not chained\n   *     api.row.add( {...} );\n   *     api.draw();\n   *\n   *     // Chained\n   *     api.row.add( {...} ).draw();\n   *\n   * @class DataTable.Api\n   * @param {array|object|string|jQuery} context DataTable identifier. This is\n   *   used to define which DataTables enhanced tables this API will operate on.\n   *   Can be one of:\n   *\n   *   * `string` - jQuery selector. Any DataTables' matching the given selector\n   *     with be found and used.\n   *   * `node` - `TABLE` node which has already been formed into a DataTable.\n   *   * `jQuery` - A jQuery object of `TABLE` nodes.\n   *   * `object` - DataTables settings object\n   * @param {array} [data] Data to initialise the Api instance with.\n   *\n   * @example\n   *   // Direct initialisation during DataTables construction\n   *   var api = $('#example').DataTable();\n   *\n   * @example\n   *   // Initialisation using a DataTables jQuery object\n   *   var api = $('#example').dataTable().api();\n   *\n   * @example\n   *   // Initialisation as a constructor\n   *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n   */\n\n\n  _Api2 = function _Api(context, data) {\n    if (!(this instanceof _Api2)) {\n      return new _Api2(context, data);\n    }\n\n    var settings = [];\n\n    var ctxSettings = function ctxSettings(o) {\n      var a = _toSettings(o);\n\n      if (a) {\n        settings.push.apply(settings, a);\n      }\n    };\n\n    if (Array.isArray(context)) {\n      for (var i = 0, ien = context.length; i < ien; i++) {\n        ctxSettings(context[i]);\n      }\n    } else {\n      ctxSettings(context);\n    } // Remove duplicates\n\n\n    this.context = _unique(settings); // Initial data\n\n    if (data) {\n      $.merge(this, data);\n    } // selector\n\n\n    this.selector = {\n      rows: null,\n      cols: null,\n      opts: null\n    };\n\n    _Api2.extend(this, this, __apiStruct);\n  };\n\n  DataTable.Api = _Api2; // Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n  // isPlainObject.\n\n  $.extend(_Api2.prototype, {\n    any: function any() {\n      return this.count() !== 0;\n    },\n    concat: __arrayProto.concat,\n    context: [],\n    // array of table settings objects\n    count: function count() {\n      return this.flatten().length;\n    },\n    each: function each(fn) {\n      for (var i = 0, ien = this.length; i < ien; i++) {\n        fn.call(this, this[i], i, this);\n      }\n\n      return this;\n    },\n    eq: function eq(idx) {\n      var ctx = this.context;\n      return ctx.length > idx ? new _Api2(ctx[idx], this[idx]) : null;\n    },\n    filter: function filter(fn) {\n      var a = [];\n\n      if (__arrayProto.filter) {\n        a = __arrayProto.filter.call(this, fn, this);\n      } else {\n        // Compatibility for browsers without EMCA-252-5 (JS 1.6)\n        for (var i = 0, ien = this.length; i < ien; i++) {\n          if (fn.call(this, this[i], i, this)) {\n            a.push(this[i]);\n          }\n        }\n      }\n\n      return new _Api2(this.context, a);\n    },\n    flatten: function flatten() {\n      var a = [];\n      return new _Api2(this.context, a.concat.apply(a, this.toArray()));\n    },\n    join: __arrayProto.join,\n    indexOf: __arrayProto.indexOf || function (obj, start) {\n      for (var i = start || 0, ien = this.length; i < ien; i++) {\n        if (this[i] === obj) {\n          return i;\n        }\n      }\n\n      return -1;\n    },\n    iterator: function iterator(flatten, type, fn, alwaysNew) {\n      var a = [],\n          ret,\n          i,\n          ien,\n          j,\n          jen,\n          context = this.context,\n          rows,\n          items,\n          item,\n          selector = this.selector; // Argument shifting\n\n      if (typeof flatten === 'string') {\n        alwaysNew = fn;\n        fn = type;\n        type = flatten;\n        flatten = false;\n      }\n\n      for (i = 0, ien = context.length; i < ien; i++) {\n        var apiInst = new _Api2(context[i]);\n\n        if (type === 'table') {\n          ret = fn.call(apiInst, context[i], i);\n\n          if (ret !== undefined) {\n            a.push(ret);\n          }\n        } else if (type === 'columns' || type === 'rows') {\n          // this has same length as context - one entry for each table\n          ret = fn.call(apiInst, context[i], this[i], i);\n\n          if (ret !== undefined) {\n            a.push(ret);\n          }\n        } else if (type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell') {\n          // columns and rows share the same structure.\n          // 'this' is an array of column indexes for each context\n          items = this[i];\n\n          if (type === 'column-rows') {\n            rows = _selector_row_indexes(context[i], selector.opts);\n          }\n\n          for (j = 0, jen = items.length; j < jen; j++) {\n            item = items[j];\n\n            if (type === 'cell') {\n              ret = fn.call(apiInst, context[i], item.row, item.column, i, j);\n            } else {\n              ret = fn.call(apiInst, context[i], item, i, j, rows);\n            }\n\n            if (ret !== undefined) {\n              a.push(ret);\n            }\n          }\n        }\n      }\n\n      if (a.length || alwaysNew) {\n        var api = new _Api2(context, flatten ? a.concat.apply([], a) : a);\n        var apiSelector = api.selector;\n        apiSelector.rows = selector.rows;\n        apiSelector.cols = selector.cols;\n        apiSelector.opts = selector.opts;\n        return api;\n      }\n\n      return this;\n    },\n    lastIndexOf: __arrayProto.lastIndexOf || function (obj, start) {\n      // Bit cheeky...\n      return this.indexOf.apply(this.toArray.reverse(), arguments);\n    },\n    length: 0,\n    map: function map(fn) {\n      var a = [];\n\n      if (__arrayProto.map) {\n        a = __arrayProto.map.call(this, fn, this);\n      } else {\n        // Compatibility for browsers without EMCA-252-5 (JS 1.6)\n        for (var i = 0, ien = this.length; i < ien; i++) {\n          a.push(fn.call(this, this[i], i));\n        }\n      }\n\n      return new _Api2(this.context, a);\n    },\n    pluck: function pluck(prop) {\n      var fn = DataTable.util.get(prop);\n      return this.map(function (el) {\n        return fn(el);\n      });\n    },\n    pop: __arrayProto.pop,\n    push: __arrayProto.push,\n    // Does not return an API instance\n    reduce: __arrayProto.reduce || function (fn, init) {\n      return _fnReduce(this, fn, init, 0, this.length, 1);\n    },\n    reduceRight: __arrayProto.reduceRight || function (fn, init) {\n      return _fnReduce(this, fn, init, this.length - 1, -1, -1);\n    },\n    reverse: __arrayProto.reverse,\n    // Object with rows, columns and opts\n    selector: null,\n    shift: __arrayProto.shift,\n    slice: function slice() {\n      return new _Api2(this.context, this);\n    },\n    sort: __arrayProto.sort,\n    // ? name - order?\n    splice: __arrayProto.splice,\n    toArray: function toArray() {\n      return __arrayProto.slice.call(this);\n    },\n    to$: function to$() {\n      return $(this);\n    },\n    toJQuery: function toJQuery() {\n      return $(this);\n    },\n    unique: function unique() {\n      return new _Api2(this.context, _unique(this));\n    },\n    unshift: __arrayProto.unshift\n  });\n\n  _Api2.extend = function (scope, obj, ext) {\n    // Only extend API instances and static properties of the API\n    if (!ext.length || !obj || !(obj instanceof _Api2) && !obj.__dt_wrapper) {\n      return;\n    }\n\n    var i,\n        ien,\n        struct,\n        methodScoping = function methodScoping(scope, fn, struc) {\n      return function () {\n        var ret = fn.apply(scope, arguments); // Method extension\n\n        _Api2.extend(ret, ret, struc.methodExt);\n\n        return ret;\n      };\n    };\n\n    for (i = 0, ien = ext.length; i < ien; i++) {\n      struct = ext[i]; // Value\n\n      obj[struct.name] = struct.type === 'function' ? methodScoping(scope, struct.val, struct) : struct.type === 'object' ? {} : struct.val;\n      obj[struct.name].__dt_wrapper = true; // Property extension\n\n      _Api2.extend(scope, obj[struct.name], struct.propExt);\n    }\n  }; // @todo - Is there need for an augment function?\n  // _Api.augment = function ( inst, name )\n  // {\n  // \t// Find src object in the structure from the name\n  // \tvar parts = name.split('.');\n  // \t_Api.extend( inst, obj );\n  // };\n  //     [\n  //       {\n  //         name:      'data'                -- string   - Property name\n  //         val:       function () {},       -- function - Api method (or undefined if just an object\n  //         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n  //         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n  //       },\n  //       {\n  //         name:     'row'\n  //         val:       {},\n  //         methodExt: [ ... ],\n  //         propExt:   [\n  //           {\n  //             name:      'data'\n  //             val:       function () {},\n  //             methodExt: [ ... ],\n  //             propExt:   [ ... ]\n  //           },\n  //           ...\n  //         ]\n  //       }\n  //     ]\n\n\n  _Api2.register = _api_register = function _api_register(name, val) {\n    if (Array.isArray(name)) {\n      for (var j = 0, jen = name.length; j < jen; j++) {\n        _Api2.register(name[j], val);\n      }\n\n      return;\n    }\n\n    var i,\n        ien,\n        heir = name.split('.'),\n        struct = __apiStruct,\n        key,\n        method;\n\n    var find = function find(src, name) {\n      for (var i = 0, ien = src.length; i < ien; i++) {\n        if (src[i].name === name) {\n          return src[i];\n        }\n      }\n\n      return null;\n    };\n\n    for (i = 0, ien = heir.length; i < ien; i++) {\n      method = heir[i].indexOf('()') !== -1;\n      key = method ? heir[i].replace('()', '') : heir[i];\n      var src = find(struct, key);\n\n      if (!src) {\n        src = {\n          name: key,\n          val: {},\n          methodExt: [],\n          propExt: [],\n          type: 'object'\n        };\n        struct.push(src);\n      }\n\n      if (i === ien - 1) {\n        src.val = val;\n        src.type = typeof val === 'function' ? 'function' : $.isPlainObject(val) ? 'object' : 'other';\n      } else {\n        struct = method ? src.methodExt : src.propExt;\n      }\n    }\n  };\n\n  _Api2.registerPlural = _api_registerPlural = function _api_registerPlural(pluralName, singularName, val) {\n    _Api2.register(pluralName, val);\n\n    _Api2.register(singularName, function () {\n      var ret = val.apply(this, arguments);\n\n      if (ret === this) {\n        // Returned item is the API instance that was passed in, return it\n        return this;\n      } else if (ret instanceof _Api2) {\n        // New API instance returned, want the value from the first item\n        // in the returned array for the singular result.\n        return ret.length ? Array.isArray(ret[0]) ? new _Api2(ret.context, ret[0]) : // Array results are 'enhanced'\n        ret[0] : undefined;\n      } // Non-API return - just fire it back\n\n\n      return ret;\n    });\n  };\n  /**\n   * Selector for HTML tables. Apply the given selector to the give array of\n   * DataTables settings objects.\n   *\n   * @param {string|integer} [selector] jQuery selector string or integer\n   * @param  {array} Array of DataTables settings objects to be filtered\n   * @return {array}\n   * @ignore\n   */\n\n\n  var __table_selector = function __table_selector(selector, a) {\n    if (Array.isArray(selector)) {\n      return $.map(selector, function (item) {\n        return __table_selector(item, a);\n      });\n    } // Integer is used to pick out a table by index\n\n\n    if (typeof selector === 'number') {\n      return [a[selector]];\n    } // Perform a jQuery selector on the table nodes\n\n\n    var nodes = $.map(a, function (el, i) {\n      return el.nTable;\n    });\n    return $(nodes).filter(selector).map(function (i) {\n      // Need to translate back from the table node to the settings\n      var idx = $.inArray(this, nodes);\n      return a[idx];\n    }).toArray();\n  };\n  /**\n   * Context selector for the API's context (i.e. the tables the API instance\n   * refers to.\n   *\n   * @name    DataTable.Api#tables\n   * @param {string|integer} [selector] Selector to pick which tables the iterator\n   *   should operate on. If not given, all tables in the current context are\n   *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n   *   select multiple tables or as an integer to select a single table.\n   * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n   */\n\n\n  _api_register('tables()', function (selector) {\n    // A new instance is created if there was a selector specified\n    return selector !== undefined && selector !== null ? new _Api2(__table_selector(selector, this.context)) : this;\n  });\n\n  _api_register('table()', function (selector) {\n    var tables = this.tables(selector);\n    var ctx = tables.context; // Truncate to the first matched table\n\n    return ctx.length ? new _Api2(ctx[0]) : tables;\n  });\n\n  _api_registerPlural('tables().nodes()', 'table().node()', function () {\n    return this.iterator('table', function (ctx) {\n      return ctx.nTable;\n    }, 1);\n  });\n\n  _api_registerPlural('tables().body()', 'table().body()', function () {\n    return this.iterator('table', function (ctx) {\n      return ctx.nTBody;\n    }, 1);\n  });\n\n  _api_registerPlural('tables().header()', 'table().header()', function () {\n    return this.iterator('table', function (ctx) {\n      return ctx.nTHead;\n    }, 1);\n  });\n\n  _api_registerPlural('tables().footer()', 'table().footer()', function () {\n    return this.iterator('table', function (ctx) {\n      return ctx.nTFoot;\n    }, 1);\n  });\n\n  _api_registerPlural('tables().containers()', 'table().container()', function () {\n    return this.iterator('table', function (ctx) {\n      return ctx.nTableWrapper;\n    }, 1);\n  });\n  /**\n   * Redraw the tables in the current context.\n   */\n\n\n  _api_register('draw()', function (paging) {\n    return this.iterator('table', function (settings) {\n      if (paging === 'page') {\n        _fnDraw(settings);\n      } else {\n        if (typeof paging === 'string') {\n          paging = paging === 'full-hold' ? false : true;\n        }\n\n        _fnReDraw(settings, paging === false);\n      }\n    });\n  });\n  /**\n   * Get the current page index.\n   *\n   * @return {integer} Current page index (zero based)\n   */\n\n  /**\n  * Set the current page.\n  *\n  * Note that if you attempt to show a page which does not exist, DataTables will\n  * not throw an error, but rather reset the paging.\n  *\n  * @param {integer|string} action The paging action to take. This can be one of:\n  *  * `integer` - The page index to jump to\n  *  * `string` - An action to take:\n  *    * `first` - Jump to first page.\n  *    * `next` - Jump to the next page\n  *    * `previous` - Jump to previous page\n  *    * `last` - Jump to the last page.\n  * @returns {DataTables.Api} this\n  */\n\n\n  _api_register('page()', function (action) {\n    if (action === undefined) {\n      return this.page.info().page; // not an expensive call\n    } // else, have an action to take on all tables\n\n\n    return this.iterator('table', function (settings) {\n      _fnPageChange(settings, action);\n    });\n  });\n  /**\n   * Paging information for the first table in the current context.\n   *\n   * If you require paging information for another table, use the `table()` method\n   * with a suitable selector.\n   *\n   * @return {object} Object with the following properties set:\n   *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n   *  * `pages` - Total number of pages\n   *  * `start` - Display index for the first record shown on the current page\n   *  * `end` - Display index for the last record shown on the current page\n   *  * `length` - Display length (number of records). Note that generally `start\n   *    + length = end`, but this is not always true, for example if there are\n   *    only 2 records to show on the final page, with a length of 10.\n   *  * `recordsTotal` - Full data set length\n   *  * `recordsDisplay` - Data set length once the current filtering criterion\n   *    are applied.\n   */\n\n\n  _api_register('page.info()', function (action) {\n    if (this.context.length === 0) {\n      return undefined;\n    }\n\n    var settings = this.context[0],\n        start = settings._iDisplayStart,\n        len = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n        visRecords = settings.fnRecordsDisplay(),\n        all = len === -1;\n    return {\n      \"page\": all ? 0 : Math.floor(start / len),\n      \"pages\": all ? 1 : Math.ceil(visRecords / len),\n      \"start\": start,\n      \"end\": settings.fnDisplayEnd(),\n      \"length\": len,\n      \"recordsTotal\": settings.fnRecordsTotal(),\n      \"recordsDisplay\": visRecords,\n      \"serverSide\": _fnDataSource(settings) === 'ssp'\n    };\n  });\n  /**\n   * Get the current page length.\n   *\n   * @return {integer} Current page length. Note `-1` indicates that all records\n   *   are to be shown.\n   */\n\n  /**\n  * Set the current page length.\n  *\n  * @param {integer} Page length to set. Use `-1` to show all records.\n  * @returns {DataTables.Api} this\n  */\n\n\n  _api_register('page.len()', function (len) {\n    // Note that we can't call this function 'length()' because `length`\n    // is a Javascript property of functions which defines how many arguments\n    // the function expects.\n    if (len === undefined) {\n      return this.context.length !== 0 ? this.context[0]._iDisplayLength : undefined;\n    } // else, set the page length\n\n\n    return this.iterator('table', function (settings) {\n      _fnLengthChange(settings, len);\n    });\n  });\n\n  var __reload = function __reload(settings, holdPosition, callback) {\n    // Use the draw event to trigger a callback\n    if (callback) {\n      var api = new _Api2(settings);\n      api.one('draw', function () {\n        callback(api.ajax.json());\n      });\n    }\n\n    if (_fnDataSource(settings) == 'ssp') {\n      _fnReDraw(settings, holdPosition);\n    } else {\n      _fnProcessingDisplay(settings, true); // Cancel an existing request\n\n\n      var xhr = settings.jqXHR;\n\n      if (xhr && xhr.readyState !== 4) {\n        xhr.abort();\n      } // Trigger xhr\n\n\n      _fnBuildAjax(settings, [], function (json) {\n        _fnClearTable(settings);\n\n        var data = _fnAjaxDataSrc(settings, json);\n\n        for (var i = 0, ien = data.length; i < ien; i++) {\n          _fnAddData(settings, data[i]);\n        }\n\n        _fnReDraw(settings, holdPosition);\n\n        _fnProcessingDisplay(settings, false);\n      });\n    }\n  };\n  /**\n   * Get the JSON response from the last Ajax request that DataTables made to the\n   * server. Note that this returns the JSON from the first table in the current\n   * context.\n   *\n   * @return {object} JSON received from the server.\n   */\n\n\n  _api_register('ajax.json()', function () {\n    var ctx = this.context;\n\n    if (ctx.length > 0) {\n      return ctx[0].json;\n    } // else return undefined;\n\n  });\n  /**\n   * Get the data submitted in the last Ajax request\n   */\n\n\n  _api_register('ajax.params()', function () {\n    var ctx = this.context;\n\n    if (ctx.length > 0) {\n      return ctx[0].oAjaxData;\n    } // else return undefined;\n\n  });\n  /**\n   * Reload tables from the Ajax data source. Note that this function will\n   * automatically re-draw the table when the remote data has been loaded.\n   *\n   * @param {boolean} [reset=true] Reset (default) or hold the current paging\n   *   position. A full re-sort and re-filter is performed when this method is\n   *   called, which is why the pagination reset is the default action.\n   * @returns {DataTables.Api} this\n   */\n\n\n  _api_register('ajax.reload()', function (callback, resetPaging) {\n    return this.iterator('table', function (settings) {\n      __reload(settings, resetPaging === false, callback);\n    });\n  });\n  /**\n   * Get the current Ajax URL. Note that this returns the URL from the first\n   * table in the current context.\n   *\n   * @return {string} Current Ajax source URL\n   */\n\n  /**\n  * Set the Ajax URL. Note that this will set the URL for all tables in the\n  * current context.\n  *\n  * @param {string} url URL to set.\n  * @returns {DataTables.Api} this\n  */\n\n\n  _api_register('ajax.url()', function (url) {\n    var ctx = this.context;\n\n    if (url === undefined) {\n      // get\n      if (ctx.length === 0) {\n        return undefined;\n      }\n\n      ctx = ctx[0];\n      return ctx.ajax ? $.isPlainObject(ctx.ajax) ? ctx.ajax.url : ctx.ajax : ctx.sAjaxSource;\n    } // set\n\n\n    return this.iterator('table', function (settings) {\n      if ($.isPlainObject(settings.ajax)) {\n        settings.ajax.url = url;\n      } else {\n        settings.ajax = url;\n      } // No need to consider sAjaxSource here since DataTables gives priority\n      // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n      // value of `sAjaxSource` redundant.\n\n    });\n  });\n  /**\n   * Load data from the newly set Ajax URL. Note that this method is only\n   * available when `ajax.url()` is used to set a URL. Additionally, this method\n   * has the same effect as calling `ajax.reload()` but is provided for\n   * convenience when setting a new URL. Like `ajax.reload()` it will\n   * automatically redraw the table once the remote data has been loaded.\n   *\n   * @returns {DataTables.Api} this\n   */\n\n\n  _api_register('ajax.url().load()', function (callback, resetPaging) {\n    // Same as a reload, but makes sense to present it for easy access after a\n    // url change\n    return this.iterator('table', function (ctx) {\n      __reload(ctx, resetPaging === false, callback);\n    });\n  });\n\n  var _selector_run = function _selector_run(type, selector, selectFn, settings, opts) {\n    var out = [],\n        res,\n        a,\n        i,\n        ien,\n        j,\n        jen,\n        selectorType = _typeof(selector); // Can't just check for isArray here, as an API or jQuery instance might be\n    // given with their array like look\n\n\n    if (!selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined) {\n      selector = [selector];\n    }\n\n    for (i = 0, ien = selector.length; i < ien; i++) {\n      // Only split on simple strings - complex expressions will be jQuery selectors\n      a = selector[i] && selector[i].split && !selector[i].match(/[\\[\\(:]/) ? selector[i].split(',') : [selector[i]];\n\n      for (j = 0, jen = a.length; j < jen; j++) {\n        res = selectFn(typeof a[j] === 'string' ? a[j].trim() : a[j]);\n\n        if (res && res.length) {\n          out = out.concat(res);\n        }\n      }\n    } // selector extensions\n\n\n    var ext = _ext.selector[type];\n\n    if (ext.length) {\n      for (i = 0, ien = ext.length; i < ien; i++) {\n        out = ext[i](settings, opts, out);\n      }\n    }\n\n    return _unique(out);\n  };\n\n  var _selector_opts = function _selector_opts(opts) {\n    if (!opts) {\n      opts = {};\n    } // Backwards compatibility for 1.9- which used the terminology filter rather\n    // than search\n\n\n    if (opts.filter && opts.search === undefined) {\n      opts.search = opts.filter;\n    }\n\n    return $.extend({\n      search: 'none',\n      order: 'current',\n      page: 'all'\n    }, opts);\n  };\n\n  var _selector_first = function _selector_first(inst) {\n    // Reduce the API instance to the first item found\n    for (var i = 0, ien = inst.length; i < ien; i++) {\n      if (inst[i].length > 0) {\n        // Assign the first element to the first item in the instance\n        // and truncate the instance and context\n        inst[0] = inst[i];\n        inst[0].length = 1;\n        inst.length = 1;\n        inst.context = [inst.context[i]];\n        return inst;\n      }\n    } // Not found - return an empty instance\n\n\n    inst.length = 0;\n    return inst;\n  };\n\n  var _selector_row_indexes = function _selector_row_indexes(settings, opts) {\n    var i,\n        ien,\n        tmp,\n        a = [],\n        displayFiltered = settings.aiDisplay,\n        displayMaster = settings.aiDisplayMaster;\n    var search = opts.search,\n        // none, applied, removed\n    order = opts.order,\n        // applied, current, index (original - compatibility with 1.9)\n    page = opts.page; // all, current\n\n    if (_fnDataSource(settings) == 'ssp') {\n      // In server-side processing mode, most options are irrelevant since\n      // rows not shown don't exist and the index order is the applied order\n      // Removed is a special case - for consistency just return an empty\n      // array\n      return search === 'removed' ? [] : _range(0, displayMaster.length);\n    } else if (page == 'current') {\n      // Current page implies that order=current and filter=applied, since it is\n      // fairly senseless otherwise, regardless of what order and search actually\n      // are\n      for (i = settings._iDisplayStart, ien = settings.fnDisplayEnd(); i < ien; i++) {\n        a.push(displayFiltered[i]);\n      }\n    } else if (order == 'current' || order == 'applied') {\n      if (search == 'none') {\n        a = displayMaster.slice();\n      } else if (search == 'applied') {\n        a = displayFiltered.slice();\n      } else if (search == 'removed') {\n        // O(n+m) solution by creating a hash map\n        var displayFilteredMap = {};\n\n        for (var i = 0, ien = displayFiltered.length; i < ien; i++) {\n          displayFilteredMap[displayFiltered[i]] = null;\n        }\n\n        a = $.map(displayMaster, function (el) {\n          return !displayFilteredMap.hasOwnProperty(el) ? el : null;\n        });\n      }\n    } else if (order == 'index' || order == 'original') {\n      for (i = 0, ien = settings.aoData.length; i < ien; i++) {\n        if (search == 'none') {\n          a.push(i);\n        } else {\n          // applied | removed\n          tmp = $.inArray(i, displayFiltered);\n\n          if (tmp === -1 && search == 'removed' || tmp >= 0 && search == 'applied') {\n            a.push(i);\n          }\n        }\n      }\n    }\n\n    return a;\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * Rows\n   *\n   * {}          - no selector - use all available rows\n   * {integer}   - row aoData index\n   * {node}      - TR node\n   * {string}    - jQuery selector to apply to the TR elements\n   * {array}     - jQuery array of nodes, or simply an array of TR nodes\n   *\n   */\n\n\n  var __row_selector = function __row_selector(settings, selector, opts) {\n    var rows;\n\n    var run = function run(sel) {\n      var selInt = _intVal(sel);\n\n      var i, ien;\n      var aoData = settings.aoData; // Short cut - selector is a number and no options provided (default is\n      // all records, so no need to check if the index is in there, since it\n      // must be - dev error if the index doesn't exist).\n\n      if (selInt !== null && !opts) {\n        return [selInt];\n      }\n\n      if (!rows) {\n        rows = _selector_row_indexes(settings, opts);\n      }\n\n      if (selInt !== null && $.inArray(selInt, rows) !== -1) {\n        // Selector - integer\n        return [selInt];\n      } else if (sel === null || sel === undefined || sel === '') {\n        // Selector - none\n        return rows;\n      } // Selector - function\n\n\n      if (typeof sel === 'function') {\n        return $.map(rows, function (idx) {\n          var row = aoData[idx];\n          return sel(idx, row._aData, row.nTr) ? idx : null;\n        });\n      } // Selector - node\n\n\n      if (sel.nodeName) {\n        var rowIdx = sel._DT_RowIndex; // Property added by DT for fast lookup\n\n        var cellIdx = sel._DT_CellIndex;\n\n        if (rowIdx !== undefined) {\n          // Make sure that the row is actually still present in the table\n          return aoData[rowIdx] && aoData[rowIdx].nTr === sel ? [rowIdx] : [];\n        } else if (cellIdx) {\n          return aoData[cellIdx.row] && aoData[cellIdx.row].nTr === sel.parentNode ? [cellIdx.row] : [];\n        } else {\n          var host = $(sel).closest('*[data-dt-row]');\n          return host.length ? [host.data('dt-row')] : [];\n        }\n      } // ID selector. Want to always be able to select rows by id, regardless\n      // of if the tr element has been created or not, so can't rely upon\n      // jQuery here - hence a custom implementation. This does not match\n      // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n      // but to select it using a CSS selector engine (like Sizzle or\n      // querySelect) it would need to need to be escaped for some characters.\n      // DataTables simplifies this for row selectors since you can select\n      // only a row. A # indicates an id any anything that follows is the id -\n      // unescaped.\n\n\n      if (typeof sel === 'string' && sel.charAt(0) === '#') {\n        // get row index from id\n        var rowObj = settings.aIds[sel.replace(/^#/, '')];\n\n        if (rowObj !== undefined) {\n          return [rowObj.idx];\n        } // need to fall through to jQuery in case there is DOM id that\n        // matches\n\n      } // Get nodes in the order from the `rows` array with null values removed\n\n\n      var nodes = _removeEmpty(_pluck_order(settings.aoData, rows, 'nTr')); // Selector - jQuery selector string, array of nodes or jQuery object/\n      // As jQuery's .filter() allows jQuery objects to be passed in filter,\n      // it also allows arrays, so this will cope with all three options\n\n\n      return $(nodes).filter(sel).map(function () {\n        return this._DT_RowIndex;\n      }).toArray();\n    };\n\n    return _selector_run('row', selector, run, settings, opts);\n  };\n\n  _api_register('rows()', function (selector, opts) {\n    // argument shifting\n    if (selector === undefined) {\n      selector = '';\n    } else if ($.isPlainObject(selector)) {\n      opts = selector;\n      selector = '';\n    }\n\n    opts = _selector_opts(opts);\n    var inst = this.iterator('table', function (settings) {\n      return __row_selector(settings, selector, opts);\n    }, 1); // Want argument shifting here and in __row_selector?\n\n    inst.selector.rows = selector;\n    inst.selector.opts = opts;\n    return inst;\n  });\n\n  _api_register('rows().nodes()', function () {\n    return this.iterator('row', function (settings, row) {\n      return settings.aoData[row].nTr || undefined;\n    }, 1);\n  });\n\n  _api_register('rows().data()', function () {\n    return this.iterator(true, 'rows', function (settings, rows) {\n      return _pluck_order(settings.aoData, rows, '_aData');\n    }, 1);\n  });\n\n  _api_registerPlural('rows().cache()', 'row().cache()', function (type) {\n    return this.iterator('row', function (settings, row) {\n      var r = settings.aoData[row];\n      return type === 'search' ? r._aFilterData : r._aSortData;\n    }, 1);\n  });\n\n  _api_registerPlural('rows().invalidate()', 'row().invalidate()', function (src) {\n    return this.iterator('row', function (settings, row) {\n      _fnInvalidate(settings, row, src);\n    });\n  });\n\n  _api_registerPlural('rows().indexes()', 'row().index()', function () {\n    return this.iterator('row', function (settings, row) {\n      return row;\n    }, 1);\n  });\n\n  _api_registerPlural('rows().ids()', 'row().id()', function (hash) {\n    var a = [];\n    var context = this.context; // `iterator` will drop undefined values, but in this case we want them\n\n    for (var i = 0, ien = context.length; i < ien; i++) {\n      for (var j = 0, jen = this[i].length; j < jen; j++) {\n        var id = context[i].rowIdFn(context[i].aoData[this[i][j]]._aData);\n        a.push((hash === true ? '#' : '') + id);\n      }\n    }\n\n    return new _Api2(context, a);\n  });\n\n  _api_registerPlural('rows().remove()', 'row().remove()', function () {\n    var that = this;\n    this.iterator('row', function (settings, row, thatIdx) {\n      var data = settings.aoData;\n      var rowData = data[row];\n      var i, ien, j, jen;\n      var loopRow, loopCells;\n      data.splice(row, 1); // Update the cached indexes\n\n      for (i = 0, ien = data.length; i < ien; i++) {\n        loopRow = data[i];\n        loopCells = loopRow.anCells; // Rows\n\n        if (loopRow.nTr !== null) {\n          loopRow.nTr._DT_RowIndex = i;\n        } // Cells\n\n\n        if (loopCells !== null) {\n          for (j = 0, jen = loopCells.length; j < jen; j++) {\n            loopCells[j]._DT_CellIndex.row = i;\n          }\n        }\n      } // Delete from the display arrays\n\n\n      _fnDeleteIndex(settings.aiDisplayMaster, row);\n\n      _fnDeleteIndex(settings.aiDisplay, row);\n\n      _fnDeleteIndex(that[thatIdx], row, false); // maintain local indexes\n      // For server-side processing tables - subtract the deleted row from the count\n\n\n      if (settings._iRecordsDisplay > 0) {\n        settings._iRecordsDisplay--;\n      } // Check for an 'overflow' they case for displaying the table\n\n\n      _fnLengthOverflow(settings); // Remove the row's ID reference if there is one\n\n\n      var id = settings.rowIdFn(rowData._aData);\n\n      if (id !== undefined) {\n        delete settings.aIds[id];\n      }\n    });\n    this.iterator('table', function (settings) {\n      for (var i = 0, ien = settings.aoData.length; i < ien; i++) {\n        settings.aoData[i].idx = i;\n      }\n    });\n    return this;\n  });\n\n  _api_register('rows.add()', function (rows) {\n    var newRows = this.iterator('table', function (settings) {\n      var row, i, ien;\n      var out = [];\n\n      for (i = 0, ien = rows.length; i < ien; i++) {\n        row = rows[i];\n\n        if (row.nodeName && row.nodeName.toUpperCase() === 'TR') {\n          out.push(_fnAddTr(settings, row)[0]);\n        } else {\n          out.push(_fnAddData(settings, row));\n        }\n      }\n\n      return out;\n    }, 1); // Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\n    var modRows = this.rows(-1);\n    modRows.pop();\n    $.merge(modRows, newRows);\n    return modRows;\n  });\n  /**\n   *\n   */\n\n\n  _api_register('row()', function (selector, opts) {\n    return _selector_first(this.rows(selector, opts));\n  });\n\n  _api_register('row().data()', function (data) {\n    var ctx = this.context;\n\n    if (data === undefined) {\n      // Get\n      return ctx.length && this.length ? ctx[0].aoData[this[0]]._aData : undefined;\n    } // Set\n\n\n    var row = ctx[0].aoData[this[0]];\n    row._aData = data; // If the DOM has an id, and the data source is an array\n\n    if (Array.isArray(data) && row.nTr && row.nTr.id) {\n      _fnSetObjectDataFn(ctx[0].rowId)(data, row.nTr.id);\n    } // Automatically invalidate\n\n\n    _fnInvalidate(ctx[0], this[0], 'data');\n\n    return this;\n  });\n\n  _api_register('row().node()', function () {\n    var ctx = this.context;\n    return ctx.length && this.length ? ctx[0].aoData[this[0]].nTr || null : null;\n  });\n\n  _api_register('row.add()', function (row) {\n    // Allow a jQuery object to be passed in - only a single row is added from\n    // it though - the first element in the set\n    if (row instanceof $ && row.length) {\n      row = row[0];\n    }\n\n    var rows = this.iterator('table', function (settings) {\n      if (row.nodeName && row.nodeName.toUpperCase() === 'TR') {\n        return _fnAddTr(settings, row)[0];\n      }\n\n      return _fnAddData(settings, row);\n    }); // Return an Api.rows() extended instance, with the newly added row selected\n\n    return this.row(rows[0]);\n  });\n\n  $(document).on('plugin-init.dt', function (e, context) {\n    var api = new _Api2(context);\n    var namespace = 'on-plugin-init';\n    var stateSaveParamsEvent = 'stateSaveParams.' + namespace;\n    var destroyEvent = 'destroy. ' + namespace;\n    api.on(stateSaveParamsEvent, function (e, settings, d) {\n      // This could be more compact with the API, but it is a lot faster as a simple\n      // internal loop\n      var idFn = settings.rowIdFn;\n      var data = settings.aoData;\n      var ids = [];\n\n      for (var i = 0; i < data.length; i++) {\n        if (data[i]._detailsShow) {\n          ids.push('#' + idFn(data[i]._aData));\n        }\n      }\n\n      d.childRows = ids;\n    });\n    api.on(destroyEvent, function () {\n      api.off(stateSaveParamsEvent + ' ' + destroyEvent);\n    });\n    var loaded = api.state.loaded();\n\n    if (loaded && loaded.childRows) {\n      api.rows($.map(loaded.childRows, function (id) {\n        return id.replace(/:/g, '\\\\:');\n      })).every(function () {\n        _fnCallbackFire(context, null, 'requestChild', [this]);\n      });\n    }\n  });\n\n  var __details_add = function __details_add(ctx, row, data, klass) {\n    // Convert to array of TR elements\n    var rows = [];\n\n    var addRow = function addRow(r, k) {\n      // Recursion to allow for arrays of jQuery objects\n      if (Array.isArray(r) || r instanceof $) {\n        for (var i = 0, ien = r.length; i < ien; i++) {\n          addRow(r[i], k);\n        }\n\n        return;\n      } // If we get a TR element, then just add it directly - up to the dev\n      // to add the correct number of columns etc\n\n\n      if (r.nodeName && r.nodeName.toLowerCase() === 'tr') {\n        rows.push(r);\n      } else {\n        // Otherwise create a row with a wrapper\n        var created = $('<tr><td></td></tr>').addClass(k);\n        $('td', created).addClass(k).html(r)[0].colSpan = _fnVisbleColumns(ctx);\n        rows.push(created[0]);\n      }\n    };\n\n    addRow(data, klass);\n\n    if (row._details) {\n      row._details.detach();\n    }\n\n    row._details = $(rows); // If the children were already shown, that state should be retained\n\n    if (row._detailsShow) {\n      row._details.insertAfter(row.nTr);\n    }\n  }; // Make state saving of child row details async to allow them to be batch processed\n\n\n  var __details_state = DataTable.util.throttle(function (ctx) {\n    _fnSaveState(ctx[0]);\n  }, 500);\n\n  var __details_remove = function __details_remove(api, idx) {\n    var ctx = api.context;\n\n    if (ctx.length) {\n      var row = ctx[0].aoData[idx !== undefined ? idx : api[0]];\n\n      if (row && row._details) {\n        row._details.remove();\n\n        row._detailsShow = undefined;\n        row._details = undefined;\n        $(row.nTr).removeClass('dt-hasChild');\n\n        __details_state(ctx);\n      }\n    }\n  };\n\n  var __details_display = function __details_display(api, show) {\n    var ctx = api.context;\n\n    if (ctx.length && api.length) {\n      var row = ctx[0].aoData[api[0]];\n\n      if (row._details) {\n        row._detailsShow = show;\n\n        if (show) {\n          row._details.insertAfter(row.nTr);\n\n          $(row.nTr).addClass('dt-hasChild');\n        } else {\n          row._details.detach();\n\n          $(row.nTr).removeClass('dt-hasChild');\n        }\n\n        _fnCallbackFire(ctx[0], null, 'childRow', [show, api.row(api[0])]);\n\n        __details_events(ctx[0]);\n\n        __details_state(ctx);\n      }\n    }\n  };\n\n  var __details_events = function __details_events(settings) {\n    var api = new _Api2(settings);\n    var namespace = '.dt.DT_details';\n    var drawEvent = 'draw' + namespace;\n    var colvisEvent = 'column-sizing' + namespace;\n    var destroyEvent = 'destroy' + namespace;\n    var data = settings.aoData;\n    api.off(drawEvent + ' ' + colvisEvent + ' ' + destroyEvent);\n\n    if (_pluck(data, '_details').length > 0) {\n      // On each draw, insert the required elements into the document\n      api.on(drawEvent, function (e, ctx) {\n        if (settings !== ctx) {\n          return;\n        }\n\n        api.rows({\n          page: 'current'\n        }).eq(0).each(function (idx) {\n          // Internal data grab\n          var row = data[idx];\n\n          if (row._detailsShow) {\n            row._details.insertAfter(row.nTr);\n          }\n        });\n      }); // Column visibility change - update the colspan\n\n      api.on(colvisEvent, function (e, ctx, idx, vis) {\n        if (settings !== ctx) {\n          return;\n        } // Update the colspan for the details rows (note, only if it already has\n        // a colspan)\n\n\n        var row,\n            visible = _fnVisbleColumns(ctx);\n\n        for (var i = 0, ien = data.length; i < ien; i++) {\n          row = data[i];\n\n          if (row._details) {\n            row._details.children('td[colspan]').attr('colspan', visible);\n          }\n        }\n      }); // Table destroyed - nuke any child rows\n\n      api.on(destroyEvent, function (e, ctx) {\n        if (settings !== ctx) {\n          return;\n        }\n\n        for (var i = 0, ien = data.length; i < ien; i++) {\n          if (data[i]._details) {\n            __details_remove(api, i);\n          }\n        }\n      });\n    }\n  }; // Strings for the method names to help minification\n\n\n  var _emp = '';\n\n  var _child_obj = _emp + 'row().child';\n\n  var _child_mth = _child_obj + '()'; // data can be:\n  //  tr\n  //  string\n  //  jQuery or array of any of the above\n\n\n  _api_register(_child_mth, function (data, klass) {\n    var ctx = this.context;\n\n    if (data === undefined) {\n      // get\n      return ctx.length && this.length ? ctx[0].aoData[this[0]]._details : undefined;\n    } else if (data === true) {\n      // show\n      this.child.show();\n    } else if (data === false) {\n      // remove\n      __details_remove(this);\n    } else if (ctx.length && this.length) {\n      // set\n      __details_add(ctx[0], ctx[0].aoData[this[0]], data, klass);\n    }\n\n    return this;\n  });\n\n  _api_register([_child_obj + '.show()', _child_mth + '.show()' // only when `child()` was called with parameters (without\n  ], function (show) {\n    // it returns an object and this method is not executed)\n    __details_display(this, true);\n\n    return this;\n  });\n\n  _api_register([_child_obj + '.hide()', _child_mth + '.hide()' // only when `child()` was called with parameters (without\n  ], function () {\n    // it returns an object and this method is not executed)\n    __details_display(this, false);\n\n    return this;\n  });\n\n  _api_register([_child_obj + '.remove()', _child_mth + '.remove()' // only when `child()` was called with parameters (without\n  ], function () {\n    // it returns an object and this method is not executed)\n    __details_remove(this);\n\n    return this;\n  });\n\n  _api_register(_child_obj + '.isShown()', function () {\n    var ctx = this.context;\n\n    if (ctx.length && this.length) {\n      // _detailsShown as false or undefined will fall through to return false\n      return ctx[0].aoData[this[0]]._detailsShow || false;\n    }\n\n    return false;\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * Columns\n   *\n   * {integer}           - column index (>=0 count from left, <0 count from right)\n   * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n   * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n   * \"{string}:name\"     - column name\n   * \"{string}\"          - jQuery selector on column header nodes\n   *\n   */\n  // can be an array of these items, comma separated list, or an array of comma\n  // separated lists\n\n\n  var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/; // r1 and r2 are redundant - but it means that the parameters match for the\n  // iterator callback in columns().data()\n\n  var __columnData = function __columnData(settings, column, r1, r2, rows) {\n    var a = [];\n\n    for (var row = 0, ien = rows.length; row < ien; row++) {\n      a.push(_fnGetCellData(settings, rows[row], column));\n    }\n\n    return a;\n  };\n\n  var __column_selector = function __column_selector(settings, selector, opts) {\n    var columns = settings.aoColumns,\n        names = _pluck(columns, 'sName'),\n        nodes = _pluck(columns, 'nTh');\n\n    var run = function run(s) {\n      var selInt = _intVal(s); // Selector - all\n\n\n      if (s === '') {\n        return _range(columns.length);\n      } // Selector - index\n\n\n      if (selInt !== null) {\n        return [selInt >= 0 ? selInt : // Count from left\n        columns.length + selInt // Count from right (+ because its a negative value)\n        ];\n      } // Selector = function\n\n\n      if (typeof s === 'function') {\n        var rows = _selector_row_indexes(settings, opts);\n\n        return $.map(columns, function (col, idx) {\n          return s(idx, __columnData(settings, idx, 0, 0, rows), nodes[idx]) ? idx : null;\n        });\n      } // jQuery or string selector\n\n\n      var match = typeof s === 'string' ? s.match(__re_column_selector) : '';\n\n      if (match) {\n        switch (match[2]) {\n          case 'visIdx':\n          case 'visible':\n            var idx = parseInt(match[1], 10); // Visible index given, convert to column index\n\n            if (idx < 0) {\n              // Counting from the right\n              var visColumns = $.map(columns, function (col, i) {\n                return col.bVisible ? i : null;\n              });\n              return [visColumns[visColumns.length + idx]];\n            } // Counting from the left\n\n\n            return [_fnVisibleToColumnIndex(settings, idx)];\n\n          case 'name':\n            // match by name. `names` is column index complete and in order\n            return $.map(names, function (name, i) {\n              return name === match[1] ? i : null;\n            });\n\n          default:\n            return [];\n        }\n      } // Cell in the table body\n\n\n      if (s.nodeName && s._DT_CellIndex) {\n        return [s._DT_CellIndex.column];\n      } // jQuery selector on the TH elements for the columns\n\n\n      var jqResult = $(nodes).filter(s).map(function () {\n        return $.inArray(this, nodes); // `nodes` is column index complete and in order\n      }).toArray();\n\n      if (jqResult.length || !s.nodeName) {\n        return jqResult;\n      } // Otherwise a node which might have a `dt-column` data attribute, or be\n      // a child or such an element\n\n\n      var host = $(s).closest('*[data-dt-column]');\n      return host.length ? [host.data('dt-column')] : [];\n    };\n\n    return _selector_run('column', selector, run, settings, opts);\n  };\n\n  var __setColumnVis = function __setColumnVis(settings, column, vis) {\n    var cols = settings.aoColumns,\n        col = cols[column],\n        data = settings.aoData,\n        row,\n        cells,\n        i,\n        ien,\n        tr; // Get\n\n    if (vis === undefined) {\n      return col.bVisible;\n    } // Set\n    // No change\n\n\n    if (col.bVisible === vis) {\n      return;\n    }\n\n    if (vis) {\n      // Insert column\n      // Need to decide if we should use appendChild or insertBefore\n      var insertBefore = $.inArray(true, _pluck(cols, 'bVisible'), column + 1);\n\n      for (i = 0, ien = data.length; i < ien; i++) {\n        tr = data[i].nTr;\n        cells = data[i].anCells;\n\n        if (tr) {\n          // insertBefore can act like appendChild if 2nd arg is null\n          tr.insertBefore(cells[column], cells[insertBefore] || null);\n        }\n      }\n    } else {\n      // Remove column\n      $(_pluck(settings.aoData, 'anCells', column)).detach();\n    } // Common actions\n\n\n    col.bVisible = vis;\n  };\n\n  _api_register('columns()', function (selector, opts) {\n    // argument shifting\n    if (selector === undefined) {\n      selector = '';\n    } else if ($.isPlainObject(selector)) {\n      opts = selector;\n      selector = '';\n    }\n\n    opts = _selector_opts(opts);\n    var inst = this.iterator('table', function (settings) {\n      return __column_selector(settings, selector, opts);\n    }, 1); // Want argument shifting here and in _row_selector?\n\n    inst.selector.cols = selector;\n    inst.selector.opts = opts;\n    return inst;\n  });\n\n  _api_registerPlural('columns().header()', 'column().header()', function (selector, opts) {\n    return this.iterator('column', function (settings, column) {\n      return settings.aoColumns[column].nTh;\n    }, 1);\n  });\n\n  _api_registerPlural('columns().footer()', 'column().footer()', function (selector, opts) {\n    return this.iterator('column', function (settings, column) {\n      return settings.aoColumns[column].nTf;\n    }, 1);\n  });\n\n  _api_registerPlural('columns().data()', 'column().data()', function () {\n    return this.iterator('column-rows', __columnData, 1);\n  });\n\n  _api_registerPlural('columns().dataSrc()', 'column().dataSrc()', function () {\n    return this.iterator('column', function (settings, column) {\n      return settings.aoColumns[column].mData;\n    }, 1);\n  });\n\n  _api_registerPlural('columns().cache()', 'column().cache()', function (type) {\n    return this.iterator('column-rows', function (settings, column, i, j, rows) {\n      return _pluck_order(settings.aoData, rows, type === 'search' ? '_aFilterData' : '_aSortData', column);\n    }, 1);\n  });\n\n  _api_registerPlural('columns().nodes()', 'column().nodes()', function () {\n    return this.iterator('column-rows', function (settings, column, i, j, rows) {\n      return _pluck_order(settings.aoData, rows, 'anCells', column);\n    }, 1);\n  });\n\n  _api_registerPlural('columns().visible()', 'column().visible()', function (vis, calc) {\n    var that = this;\n    var ret = this.iterator('column', function (settings, column) {\n      if (vis === undefined) {\n        return settings.aoColumns[column].bVisible;\n      } // else\n\n\n      __setColumnVis(settings, column, vis);\n    }); // Group the column visibility changes\n\n    if (vis !== undefined) {\n      this.iterator('table', function (settings) {\n        // Redraw the header after changes\n        _fnDrawHead(settings, settings.aoHeader);\n\n        _fnDrawHead(settings, settings.aoFooter); // Update colspan for no records display. Child rows and extensions will use their own\n        // listeners to do this - only need to update the empty table item here\n\n\n        if (!settings.aiDisplay.length) {\n          $(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));\n        }\n\n        _fnSaveState(settings); // Second loop once the first is done for events\n\n\n        that.iterator('column', function (settings, column) {\n          _fnCallbackFire(settings, null, 'column-visibility', [settings, column, vis, calc]);\n        });\n\n        if (calc === undefined || calc) {\n          that.columns.adjust();\n        }\n      });\n    }\n\n    return ret;\n  });\n\n  _api_registerPlural('columns().indexes()', 'column().index()', function (type) {\n    return this.iterator('column', function (settings, column) {\n      return type === 'visible' ? _fnColumnIndexToVisible(settings, column) : column;\n    }, 1);\n  });\n\n  _api_register('columns.adjust()', function () {\n    return this.iterator('table', function (settings) {\n      _fnAdjustColumnSizing(settings);\n    }, 1);\n  });\n\n  _api_register('column.index()', function (type, idx) {\n    if (this.context.length !== 0) {\n      var ctx = this.context[0];\n\n      if (type === 'fromVisible' || type === 'toData') {\n        return _fnVisibleToColumnIndex(ctx, idx);\n      } else if (type === 'fromData' || type === 'toVisible') {\n        return _fnColumnIndexToVisible(ctx, idx);\n      }\n    }\n  });\n\n  _api_register('column()', function (selector, opts) {\n    return _selector_first(this.columns(selector, opts));\n  });\n\n  var __cell_selector = function __cell_selector(settings, selector, opts) {\n    var data = settings.aoData;\n\n    var rows = _selector_row_indexes(settings, opts);\n\n    var cells = _removeEmpty(_pluck_order(data, rows, 'anCells'));\n\n    var allCells = $(_flatten([], cells));\n    var row;\n    var columns = settings.aoColumns.length;\n    var a, i, ien, j, o, host;\n\n    var run = function run(s) {\n      var fnSelector = typeof s === 'function';\n\n      if (s === null || s === undefined || fnSelector) {\n        // All cells and function selectors\n        a = [];\n\n        for (i = 0, ien = rows.length; i < ien; i++) {\n          row = rows[i];\n\n          for (j = 0; j < columns; j++) {\n            o = {\n              row: row,\n              column: j\n            };\n\n            if (fnSelector) {\n              // Selector - function\n              host = data[row];\n\n              if (s(o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null)) {\n                a.push(o);\n              }\n            } else {\n              // Selector - all\n              a.push(o);\n            }\n          }\n        }\n\n        return a;\n      } // Selector - index\n\n\n      if ($.isPlainObject(s)) {\n        // Valid cell index and its in the array of selectable rows\n        return s.column !== undefined && s.row !== undefined && $.inArray(s.row, rows) !== -1 ? [s] : [];\n      } // Selector - jQuery filtered cells\n\n\n      var jqResult = allCells.filter(s).map(function (i, el) {\n        return {\n          // use a new object, in case someone changes the values\n          row: el._DT_CellIndex.row,\n          column: el._DT_CellIndex.column\n        };\n      }).toArray();\n\n      if (jqResult.length || !s.nodeName) {\n        return jqResult;\n      } // Otherwise the selector is a node, and there is one last option - the\n      // element might be a child of an element which has dt-row and dt-column\n      // data attributes\n\n\n      host = $(s).closest('*[data-dt-row]');\n      return host.length ? [{\n        row: host.data('dt-row'),\n        column: host.data('dt-column')\n      }] : [];\n    };\n\n    return _selector_run('cell', selector, run, settings, opts);\n  };\n\n  _api_register('cells()', function (rowSelector, columnSelector, opts) {\n    // Argument shifting\n    if ($.isPlainObject(rowSelector)) {\n      // Indexes\n      if (rowSelector.row === undefined) {\n        // Selector options in first parameter\n        opts = rowSelector;\n        rowSelector = null;\n      } else {\n        // Cell index objects in first parameter\n        opts = columnSelector;\n        columnSelector = null;\n      }\n    }\n\n    if ($.isPlainObject(columnSelector)) {\n      opts = columnSelector;\n      columnSelector = null;\n    } // Cell selector\n\n\n    if (columnSelector === null || columnSelector === undefined) {\n      return this.iterator('table', function (settings) {\n        return __cell_selector(settings, rowSelector, _selector_opts(opts));\n      });\n    } // The default built in options need to apply to row and columns\n\n\n    var internalOpts = opts ? {\n      page: opts.page,\n      order: opts.order,\n      search: opts.search\n    } : {}; // Row + column selector\n\n    var columns = this.columns(columnSelector, internalOpts);\n    var rows = this.rows(rowSelector, internalOpts);\n    var i, ien, j, jen;\n    var cellsNoOpts = this.iterator('table', function (settings, idx) {\n      var a = [];\n\n      for (i = 0, ien = rows[idx].length; i < ien; i++) {\n        for (j = 0, jen = columns[idx].length; j < jen; j++) {\n          a.push({\n            row: rows[idx][i],\n            column: columns[idx][j]\n          });\n        }\n      }\n\n      return a;\n    }, 1); // There is currently only one extension which uses a cell selector extension\n    // It is a _major_ performance drag to run this if it isn't needed, so this is\n    // an extension specific check at the moment\n\n    var cells = opts && opts.selected ? this.cells(cellsNoOpts, opts) : cellsNoOpts;\n    $.extend(cells.selector, {\n      cols: columnSelector,\n      rows: rowSelector,\n      opts: opts\n    });\n    return cells;\n  });\n\n  _api_registerPlural('cells().nodes()', 'cell().node()', function () {\n    return this.iterator('cell', function (settings, row, column) {\n      var data = settings.aoData[row];\n      return data && data.anCells ? data.anCells[column] : undefined;\n    }, 1);\n  });\n\n  _api_register('cells().data()', function () {\n    return this.iterator('cell', function (settings, row, column) {\n      return _fnGetCellData(settings, row, column);\n    }, 1);\n  });\n\n  _api_registerPlural('cells().cache()', 'cell().cache()', function (type) {\n    type = type === 'search' ? '_aFilterData' : '_aSortData';\n    return this.iterator('cell', function (settings, row, column) {\n      return settings.aoData[row][type][column];\n    }, 1);\n  });\n\n  _api_registerPlural('cells().render()', 'cell().render()', function (type) {\n    return this.iterator('cell', function (settings, row, column) {\n      return _fnGetCellData(settings, row, column, type);\n    }, 1);\n  });\n\n  _api_registerPlural('cells().indexes()', 'cell().index()', function () {\n    return this.iterator('cell', function (settings, row, column) {\n      return {\n        row: row,\n        column: column,\n        columnVisible: _fnColumnIndexToVisible(settings, column)\n      };\n    }, 1);\n  });\n\n  _api_registerPlural('cells().invalidate()', 'cell().invalidate()', function (src) {\n    return this.iterator('cell', function (settings, row, column) {\n      _fnInvalidate(settings, row, src, column);\n    });\n  });\n\n  _api_register('cell()', function (rowSelector, columnSelector, opts) {\n    return _selector_first(this.cells(rowSelector, columnSelector, opts));\n  });\n\n  _api_register('cell().data()', function (data) {\n    var ctx = this.context;\n    var cell = this[0];\n\n    if (data === undefined) {\n      // Get\n      return ctx.length && cell.length ? _fnGetCellData(ctx[0], cell[0].row, cell[0].column) : undefined;\n    } // Set\n\n\n    _fnSetCellData(ctx[0], cell[0].row, cell[0].column, data);\n\n    _fnInvalidate(ctx[0], cell[0].row, 'data', cell[0].column);\n\n    return this;\n  });\n  /**\n   * Get current ordering (sorting) that has been applied to the table.\n   *\n   * @returns {array} 2D array containing the sorting information for the first\n   *   table in the current context. Each element in the parent array represents\n   *   a column being sorted upon (i.e. multi-sorting with two columns would have\n   *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n   *   the column index that the sorting condition applies to, the second is the\n   *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n   *   index of the sorting order from the `column.sorting` initialisation array.\n   */\n\n  /**\n  * Set the ordering for the table.\n  *\n  * @param {integer} order Column index to sort upon.\n  * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n  * @returns {DataTables.Api} this\n  */\n\n  /**\n  * Set the ordering for the table.\n  *\n  * @param {array} order 1D array of sorting information to be applied.\n  * @param {array} [...] Optional additional sorting conditions\n  * @returns {DataTables.Api} this\n  */\n\n  /**\n  * Set the ordering for the table.\n  *\n  * @param {array} order 2D array of sorting information to be applied.\n  * @returns {DataTables.Api} this\n  */\n\n\n  _api_register('order()', function (order, dir) {\n    var ctx = this.context;\n\n    if (order === undefined) {\n      // get\n      return ctx.length !== 0 ? ctx[0].aaSorting : undefined;\n    } // set\n\n\n    if (typeof order === 'number') {\n      // Simple column / direction passed in\n      order = [[order, dir]];\n    } else if (order.length && !Array.isArray(order[0])) {\n      // Arguments passed in (list of 1D arrays)\n      order = Array.prototype.slice.call(arguments);\n    } // otherwise a 2D array was passed in\n\n\n    return this.iterator('table', function (settings) {\n      settings.aaSorting = order.slice();\n    });\n  });\n  /**\n   * Attach a sort listener to an element for a given column\n   *\n   * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n   *   listener to. This can take the form of a single DOM node, a jQuery\n   *   collection of nodes or a jQuery selector which will identify the node(s).\n   * @param {integer} column the column that a click on this node will sort on\n   * @param {function} [callback] callback function when sort is run\n   * @returns {DataTables.Api} this\n   */\n\n\n  _api_register('order.listener()', function (node, column, callback) {\n    return this.iterator('table', function (settings) {\n      _fnSortAttachListener(settings, node, column, callback);\n    });\n  });\n\n  _api_register('order.fixed()', function (set) {\n    if (!set) {\n      var ctx = this.context;\n      var fixed = ctx.length ? ctx[0].aaSortingFixed : undefined;\n      return Array.isArray(fixed) ? {\n        pre: fixed\n      } : fixed;\n    }\n\n    return this.iterator('table', function (settings) {\n      settings.aaSortingFixed = $.extend(true, {}, set);\n    });\n  }); // Order by the selected column(s)\n\n\n  _api_register(['columns().order()', 'column().order()'], function (dir) {\n    var that = this;\n    return this.iterator('table', function (settings, i) {\n      var sort = [];\n      $.each(that[i], function (j, col) {\n        sort.push([col, dir]);\n      });\n      settings.aaSorting = sort;\n    });\n  });\n\n  _api_register('search()', function (input, regex, smart, caseInsen) {\n    var ctx = this.context;\n\n    if (input === undefined) {\n      // get\n      return ctx.length !== 0 ? ctx[0].oPreviousSearch.sSearch : undefined;\n    } // set\n\n\n    return this.iterator('table', function (settings) {\n      if (!settings.oFeatures.bFilter) {\n        return;\n      }\n\n      _fnFilterComplete(settings, $.extend({}, settings.oPreviousSearch, {\n        \"sSearch\": input + \"\",\n        \"bRegex\": regex === null ? false : regex,\n        \"bSmart\": smart === null ? true : smart,\n        \"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n      }), 1);\n    });\n  });\n\n  _api_registerPlural('columns().search()', 'column().search()', function (input, regex, smart, caseInsen) {\n    return this.iterator('column', function (settings, column) {\n      var preSearch = settings.aoPreSearchCols;\n\n      if (input === undefined) {\n        // get\n        return preSearch[column].sSearch;\n      } // set\n\n\n      if (!settings.oFeatures.bFilter) {\n        return;\n      }\n\n      $.extend(preSearch[column], {\n        \"sSearch\": input + \"\",\n        \"bRegex\": regex === null ? false : regex,\n        \"bSmart\": smart === null ? true : smart,\n        \"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n      });\n\n      _fnFilterComplete(settings, settings.oPreviousSearch, 1);\n    });\n  });\n  /*\n   * State API methods\n   */\n\n\n  _api_register('state()', function () {\n    return this.context.length ? this.context[0].oSavedState : null;\n  });\n\n  _api_register('state.clear()', function () {\n    return this.iterator('table', function (settings) {\n      // Save an empty object\n      settings.fnStateSaveCallback.call(settings.oInstance, settings, {});\n    });\n  });\n\n  _api_register('state.loaded()', function () {\n    return this.context.length ? this.context[0].oLoadedState : null;\n  });\n\n  _api_register('state.save()', function () {\n    return this.iterator('table', function (settings) {\n      _fnSaveState(settings);\n    });\n  });\n  /**\n   * Set the jQuery or window object to be used by DataTables\n   *\n   * @param {*} module Library / container object\n   * @param {string} [type] Library or container type `lib`, `win` or `datetime`.\n   *   If not provided, automatic detection is attempted.\n   */\n\n\n  DataTable.use = function (module, type) {\n    if (type === 'lib' || module.fn) {\n      $ = module;\n    } else if (type == 'win' || module.document) {\n      window = module;\n      document = module.document;\n    } else if (type === 'datetime' || module.type === 'DateTime') {\n      DataTable.DateTime = module;\n    }\n  };\n  /**\n   * CommonJS factory function pass through. This will check if the arguments\n   * given are a window object or a jQuery object. If so they are set\n   * accordingly.\n   * @param {*} root Window\n   * @param {*} jq jQUery\n   * @returns {boolean} Indicator\n   */\n\n\n  DataTable.factory = function (root, jq) {\n    var is = false; // Test if the first parameter is a window object\n\n    if (root && root.document) {\n      window = root;\n      document = root.document;\n    } // Test if the second parameter is a jQuery object\n\n\n    if (jq && jq.fn && jq.fn.jquery) {\n      $ = jq;\n      is = true;\n    }\n\n    return is;\n  };\n  /**\n   * Provide a common method for plug-ins to check the version of DataTables being\n   * used, in order to ensure compatibility.\n   *\n   *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n   *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n   *  @returns {boolean} true if this version of DataTables is greater or equal to\n   *    the required version, or false if this version of DataTales is not\n   *    suitable\n   *  @static\n   *  @dtopt API-Static\n   *\n   *  @example\n   *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n   */\n\n\n  DataTable.versionCheck = DataTable.fnVersionCheck = function (version) {\n    var aThis = DataTable.version.split('.');\n    var aThat = version.split('.');\n    var iThis, iThat;\n\n    for (var i = 0, iLen = aThat.length; i < iLen; i++) {\n      iThis = parseInt(aThis[i], 10) || 0;\n      iThat = parseInt(aThat[i], 10) || 0; // Parts are the same, keep comparing\n\n      if (iThis === iThat) {\n        continue;\n      } // Parts are different, return immediately\n\n\n      return iThis > iThat;\n    }\n\n    return true;\n  };\n  /**\n   * Check if a `<table>` node is a DataTable table already or not.\n   *\n   *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n   *      selector for the table to test. Note that if more than more than one\n   *      table is passed on, only the first will be checked\n   *  @returns {boolean} true the table given is a DataTable, or false otherwise\n   *  @static\n   *  @dtopt API-Static\n   *\n   *  @example\n   *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n   *      $('#example').dataTable();\n   *    }\n   */\n\n\n  DataTable.isDataTable = DataTable.fnIsDataTable = function (table) {\n    var t = $(table).get(0);\n    var is = false;\n\n    if (table instanceof DataTable.Api) {\n      return true;\n    }\n\n    $.each(DataTable.settings, function (i, o) {\n      var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n      var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\n      if (o.nTable === t || head === t || foot === t) {\n        is = true;\n      }\n    });\n    return is;\n  };\n  /**\n   * Get all DataTable tables that have been initialised - optionally you can\n   * select to get only currently visible tables.\n   *\n   *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n   *    or visible tables only.\n   *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n   *    DataTables\n   *  @static\n   *  @dtopt API-Static\n   *\n   *  @example\n   *    $.each( $.fn.dataTable.tables(true), function () {\n   *      $(table).DataTable().columns.adjust();\n   *    } );\n   */\n\n\n  DataTable.tables = DataTable.fnTables = function (visible) {\n    var api = false;\n\n    if ($.isPlainObject(visible)) {\n      api = visible.api;\n      visible = visible.visible;\n    }\n\n    var a = $.map(DataTable.settings, function (o) {\n      if (!visible || visible && $(o.nTable).is(':visible')) {\n        return o.nTable;\n      }\n    });\n    return api ? new _Api2(a) : a;\n  };\n  /**\n   * Convert from camel case parameters to Hungarian notation. This is made public\n   * for the extensions to provide the same ability as DataTables core to accept\n   * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n   * parameters.\n   *\n   *  @param {object} src The model object which holds all parameters that can be\n   *    mapped.\n   *  @param {object} user The object to convert from camel case to Hungarian.\n   *  @param {boolean} force When set to `true`, properties which already have a\n   *    Hungarian value in the `user` object will be overwritten. Otherwise they\n   *    won't be.\n   */\n\n\n  DataTable.camelToHungarian = _fnCamelToHungarian;\n  /**\n   *\n   */\n\n  _api_register('$()', function (selector, opts) {\n    var rows = this.rows(opts).nodes(),\n        // Get all rows\n    jqRows = $(rows);\n    return $([].concat(jqRows.filter(selector).toArray(), jqRows.find(selector).toArray()));\n  }); // jQuery functions to operate on the tables\n\n\n  $.each(['on', 'one', 'off'], function (i, key) {\n    _api_register(key + '()', function\n      /* event, handler */\n    () {\n      var args = Array.prototype.slice.call(arguments); // Add the `dt` namespace automatically if it isn't already present\n\n      args[0] = $.map(args[0].split(/\\s/), function (e) {\n        return !e.match(/\\.dt\\b/) ? e + '.dt' : e;\n      }).join(' ');\n      var inst = $(this.tables().nodes());\n      inst[key].apply(inst, args);\n      return this;\n    });\n  });\n\n  _api_register('clear()', function () {\n    return this.iterator('table', function (settings) {\n      _fnClearTable(settings);\n    });\n  });\n\n  _api_register('settings()', function () {\n    return new _Api2(this.context, this.context);\n  });\n\n  _api_register('init()', function () {\n    var ctx = this.context;\n    return ctx.length ? ctx[0].oInit : null;\n  });\n\n  _api_register('data()', function () {\n    return this.iterator('table', function (settings) {\n      return _pluck(settings.aoData, '_aData');\n    }).flatten();\n  });\n\n  _api_register('destroy()', function (remove) {\n    remove = remove || false;\n    return this.iterator('table', function (settings) {\n      var classes = settings.oClasses;\n      var table = settings.nTable;\n      var tbody = settings.nTBody;\n      var thead = settings.nTHead;\n      var tfoot = settings.nTFoot;\n      var jqTable = $(table);\n      var jqTbody = $(tbody);\n      var jqWrapper = $(settings.nTableWrapper);\n      var rows = $.map(settings.aoData, function (r) {\n        return r.nTr;\n      });\n      var i, ien; // Flag to note that the table is currently being destroyed - no action\n      // should be taken\n\n      settings.bDestroying = true; // Fire off the destroy callbacks for plug-ins etc\n\n      _fnCallbackFire(settings, \"aoDestroyCallback\", \"destroy\", [settings]); // If not being removed from the document, make all columns visible\n\n\n      if (!remove) {\n        new _Api2(settings).columns().visible(true);\n      } // Blitz all `DT` namespaced events (these are internal events, the\n      // lowercase, `dt` events are user subscribed and they are responsible\n      // for removing them\n\n\n      jqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n      $(window).off('.DT-' + settings.sInstance); // When scrolling we had to break the table up - restore it\n\n      if (table != thead.parentNode) {\n        jqTable.children('thead').detach();\n        jqTable.append(thead);\n      }\n\n      if (tfoot && table != tfoot.parentNode) {\n        jqTable.children('tfoot').detach();\n        jqTable.append(tfoot);\n      }\n\n      settings.aaSorting = [];\n      settings.aaSortingFixed = [];\n\n      _fnSortingClasses(settings);\n\n      $(rows).removeClass(settings.asStripeClasses.join(' '));\n      $('th, td', thead).removeClass(classes.sSortable + ' ' + classes.sSortableAsc + ' ' + classes.sSortableDesc + ' ' + classes.sSortableNone); // Add the TR elements back into the table in their original order\n\n      jqTbody.children().detach();\n      jqTbody.append(rows);\n      var orig = settings.nTableWrapper.parentNode; // Remove the DataTables generated nodes, events and classes\n\n      var removedMethod = remove ? 'remove' : 'detach';\n      jqTable[removedMethod]();\n      jqWrapper[removedMethod](); // If we need to reattach the table to the document\n\n      if (!remove && orig) {\n        // insertBefore acts like appendChild if !arg[1]\n        orig.insertBefore(table, settings.nTableReinsertBefore); // Restore the width of the original table - was read from the style property,\n        // so we can restore directly to that\n\n        jqTable.css('width', settings.sDestroyWidth).removeClass(classes.sTable); // If the were originally stripe classes - then we add them back here.\n        // Note this is not fool proof (for example if not all rows had stripe\n        // classes - but it's a good effort without getting carried away\n\n        ien = settings.asDestroyStripes.length;\n\n        if (ien) {\n          jqTbody.children().each(function (i) {\n            $(this).addClass(settings.asDestroyStripes[i % ien]);\n          });\n        }\n      }\n      /* Remove the settings object from the settings array */\n\n\n      var idx = $.inArray(settings, DataTable.settings);\n\n      if (idx !== -1) {\n        DataTable.settings.splice(idx, 1);\n      }\n    });\n  }); // Add the `every()` method for rows, columns and cells in a compact form\n\n\n  $.each(['column', 'row', 'cell'], function (i, type) {\n    _api_register(type + 's().every()', function (fn) {\n      var opts = this.selector.opts;\n      var api = this;\n      return this.iterator(type, function (settings, arg1, arg2, arg3, arg4) {\n        // Rows and columns:\n        //  arg1 - index\n        //  arg2 - table counter\n        //  arg3 - loop counter\n        //  arg4 - undefined\n        // Cells:\n        //  arg1 - row index\n        //  arg2 - column index\n        //  arg3 - table counter\n        //  arg4 - loop counter\n        fn.call(api[type](arg1, type === 'cell' ? arg2 : opts, type === 'cell' ? opts : undefined), arg1, arg2, arg3, arg4);\n      });\n    });\n  }); // i18n method for extensions to be able to use the language object from the\n  // DataTable\n\n  _api_register('i18n()', function (token, def, plural) {\n    var ctx = this.context[0];\n\n    var resolved = _fnGetObjectDataFn(token)(ctx.oLanguage);\n\n    if (resolved === undefined) {\n      resolved = def;\n    }\n\n    if (plural !== undefined && $.isPlainObject(resolved)) {\n      resolved = resolved[plural] !== undefined ? resolved[plural] : resolved._;\n    }\n\n    return typeof resolved === 'string' ? resolved.replace('%d', plural) // nb: plural might be undefined,\n    : resolved;\n  });\n  /**\n   * Version string for plug-ins to check compatibility. Allowed format is\n   * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n   * only for non-release builds. See http://semver.org/ for more information.\n   *  @member\n   *  @type string\n   *  @default Version number\n   */\n\n\n  DataTable.version = \"1.13.5\";\n  /**\n   * Private data store, containing all of the settings objects that are\n   * created for the tables on a given page.\n   *\n   * Note that the `DataTable.settings` object is aliased to\n   * `jQuery.fn.dataTableExt` through which it may be accessed and\n   * manipulated, or `jQuery.fn.dataTable.settings`.\n   *  @member\n   *  @type array\n   *  @default []\n   *  @private\n   */\n\n  DataTable.settings = [];\n  /**\n   * Object models container, for the various models that DataTables has\n   * available to it. These models define the objects that are used to hold\n   * the active state and configuration of the table.\n   *  @namespace\n   */\n\n  DataTable.models = {};\n  /**\n   * Template object for the way in which DataTables holds information about\n   * search information for the global filter and individual column filters.\n   *  @namespace\n   */\n\n  DataTable.models.oSearch = {\n    /**\n     * Flag to indicate if the filtering should be case insensitive or not\n     *  @type boolean\n     *  @default true\n     */\n    \"bCaseInsensitive\": true,\n\n    /**\n     * Applied search term\n     *  @type string\n     *  @default <i>Empty string</i>\n     */\n    \"sSearch\": \"\",\n\n    /**\n     * Flag to indicate if the search term should be interpreted as a\n     * regular expression (true) or not (false) and therefore and special\n     * regex characters escaped.\n     *  @type boolean\n     *  @default false\n     */\n    \"bRegex\": false,\n\n    /**\n     * Flag to indicate if DataTables is to use its smart filtering or not.\n     *  @type boolean\n     *  @default true\n     */\n    \"bSmart\": true,\n\n    /**\n     * Flag to indicate if DataTables should only trigger a search when\n     * the return key is pressed.\n     *  @type boolean\n     *  @default false\n     */\n    \"return\": false\n  };\n  /**\n   * Template object for the way in which DataTables holds information about\n   * each individual row. This is the object format used for the settings\n   * aoData array.\n   *  @namespace\n   */\n\n  DataTable.models.oRow = {\n    /**\n     * TR element for the row\n     *  @type node\n     *  @default null\n     */\n    \"nTr\": null,\n\n    /**\n     * Array of TD elements for each row. This is null until the row has been\n     * created.\n     *  @type array nodes\n     *  @default []\n     */\n    \"anCells\": null,\n\n    /**\n     * Data object from the original data source for the row. This is either\n     * an array if using the traditional form of DataTables, or an object if\n     * using mData options. The exact type will depend on the passed in\n     * data from the data source, or will be an array if using DOM a data\n     * source.\n     *  @type array|object\n     *  @default []\n     */\n    \"_aData\": [],\n\n    /**\n     * Sorting data cache - this array is ostensibly the same length as the\n     * number of columns (although each index is generated only as it is\n     * needed), and holds the data that is used for sorting each column in the\n     * row. We do this cache generation at the start of the sort in order that\n     * the formatting of the sort data need be done only once for each cell\n     * per sort. This array should not be read from or written to by anything\n     * other than the master sorting methods.\n     *  @type array\n     *  @default null\n     *  @private\n     */\n    \"_aSortData\": null,\n\n    /**\n     * Per cell filtering data cache. As per the sort data cache, used to\n     * increase the performance of the filtering in DataTables\n     *  @type array\n     *  @default null\n     *  @private\n     */\n    \"_aFilterData\": null,\n\n    /**\n     * Filtering data cache. This is the same as the cell filtering cache, but\n     * in this case a string rather than an array. This is easily computed with\n     * a join on `_aFilterData`, but is provided as a cache so the join isn't\n     * needed on every search (memory traded for performance)\n     *  @type array\n     *  @default null\n     *  @private\n     */\n    \"_sFilterRow\": null,\n\n    /**\n     * Cache of the class name that DataTables has applied to the row, so we\n     * can quickly look at this variable rather than needing to do a DOM check\n     * on className for the nTr property.\n     *  @type string\n     *  @default <i>Empty string</i>\n     *  @private\n     */\n    \"_sRowStripe\": \"\",\n\n    /**\n     * Denote if the original data source was from the DOM, or the data source\n     * object. This is used for invalidating data, so DataTables can\n     * automatically read data from the original source, unless uninstructed\n     * otherwise.\n     *  @type string\n     *  @default null\n     *  @private\n     */\n    \"src\": null,\n\n    /**\n     * Index in the aoData array. This saves an indexOf lookup when we have the\n     * object, but want to know the index\n     *  @type integer\n     *  @default -1\n     *  @private\n     */\n    \"idx\": -1\n  };\n  /**\n   * Template object for the column information object in DataTables. This object\n   * is held in the settings aoColumns array and contains all the information that\n   * DataTables needs about each individual column.\n   *\n   * Note that this object is related to {@link DataTable.defaults.column}\n   * but this one is the internal data store for DataTables's cache of columns.\n   * It should NOT be manipulated outside of DataTables. Any configuration should\n   * be done through the initialisation options.\n   *  @namespace\n   */\n\n  DataTable.models.oColumn = {\n    /**\n     * Column index. This could be worked out on-the-fly with $.inArray, but it\n     * is faster to just hold it as a variable\n     *  @type integer\n     *  @default null\n     */\n    \"idx\": null,\n\n    /**\n     * A list of the columns that sorting should occur on when this column\n     * is sorted. That this property is an array allows multi-column sorting\n     * to be defined for a column (for example first name / last name columns\n     * would benefit from this). The values are integers pointing to the\n     * columns to be sorted on (typically it will be a single integer pointing\n     * at itself, but that doesn't need to be the case).\n     *  @type array\n     */\n    \"aDataSort\": null,\n\n    /**\n     * Define the sorting directions that are applied to the column, in sequence\n     * as the column is repeatedly sorted upon - i.e. the first value is used\n     * as the sorting direction when the column if first sorted (clicked on).\n     * Sort it again (click again) and it will move on to the next index.\n     * Repeat until loop.\n     *  @type array\n     */\n    \"asSorting\": null,\n\n    /**\n     * Flag to indicate if the column is searchable, and thus should be included\n     * in the filtering or not.\n     *  @type boolean\n     */\n    \"bSearchable\": null,\n\n    /**\n     * Flag to indicate if the column is sortable or not.\n     *  @type boolean\n     */\n    \"bSortable\": null,\n\n    /**\n     * Flag to indicate if the column is currently visible in the table or not\n     *  @type boolean\n     */\n    \"bVisible\": null,\n\n    /**\n     * Store for manual type assignment using the `column.type` option. This\n     * is held in store so we can manipulate the column's `sType` property.\n     *  @type string\n     *  @default null\n     *  @private\n     */\n    \"_sManualType\": null,\n\n    /**\n     * Flag to indicate if HTML5 data attributes should be used as the data\n     * source for filtering or sorting. True is either are.\n     *  @type boolean\n     *  @default false\n     *  @private\n     */\n    \"_bAttrSrc\": false,\n\n    /**\n     * Developer definable function that is called whenever a cell is created (Ajax source,\n     * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n     * allowing you to modify the DOM element (add background colour for example) when the\n     * element is available.\n     *  @type function\n     *  @param {element} nTd The TD node that has been created\n     *  @param {*} sData The Data for the cell\n     *  @param {array|object} oData The data for the whole row\n     *  @param {int} iRow The row index for the aoData data store\n     *  @default null\n     */\n    \"fnCreatedCell\": null,\n\n    /**\n     * Function to get data from a cell in a column. You should <b>never</b>\n     * access data directly through _aData internally in DataTables - always use\n     * the method attached to this property. It allows mData to function as\n     * required. This function is automatically assigned by the column\n     * initialisation method\n     *  @type function\n     *  @param {array|object} oData The data array/object for the array\n     *    (i.e. aoData[]._aData)\n     *  @param {string} sSpecific The specific data type you want to get -\n     *    'display', 'type' 'filter' 'sort'\n     *  @returns {*} The data for the cell from the given row's data\n     *  @default null\n     */\n    \"fnGetData\": null,\n\n    /**\n     * Function to set data for a cell in the column. You should <b>never</b>\n     * set the data directly to _aData internally in DataTables - always use\n     * this method. It allows mData to function as required. This function\n     * is automatically assigned by the column initialisation method\n     *  @type function\n     *  @param {array|object} oData The data array/object for the array\n     *    (i.e. aoData[]._aData)\n     *  @param {*} sValue Value to set\n     *  @default null\n     */\n    \"fnSetData\": null,\n\n    /**\n     * Property to read the value for the cells in the column from the data\n     * source array / object. If null, then the default content is used, if a\n     * function is given then the return from the function is used.\n     *  @type function|int|string|null\n     *  @default null\n     */\n    \"mData\": null,\n\n    /**\n     * Partner property to mData which is used (only when defined) to get\n     * the data - i.e. it is basically the same as mData, but without the\n     * 'set' option, and also the data fed to it is the result from mData.\n     * This is the rendering method to match the data method of mData.\n     *  @type function|int|string|null\n     *  @default null\n     */\n    \"mRender\": null,\n\n    /**\n     * Unique header TH/TD element for this column - this is what the sorting\n     * listener is attached to (if sorting is enabled.)\n     *  @type node\n     *  @default null\n     */\n    \"nTh\": null,\n\n    /**\n     * Unique footer TH/TD element for this column (if there is one). Not used\n     * in DataTables as such, but can be used for plug-ins to reference the\n     * footer for each column.\n     *  @type node\n     *  @default null\n     */\n    \"nTf\": null,\n\n    /**\n     * The class to apply to all TD elements in the table's TBODY for the column\n     *  @type string\n     *  @default null\n     */\n    \"sClass\": null,\n\n    /**\n     * When DataTables calculates the column widths to assign to each column,\n     * it finds the longest string in each column and then constructs a\n     * temporary table and reads the widths from that. The problem with this\n     * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n     * string - thus the calculation can go wrong (doing it properly and putting\n     * it into an DOM object and measuring that is horribly(!) slow). Thus as\n     * a \"work around\" we provide this option. It will append its value to the\n     * text that is found to be the longest string for the column - i.e. padding.\n     *  @type string\n     */\n    \"sContentPadding\": null,\n\n    /**\n     * Allows a default value to be given for a column's data, and will be used\n     * whenever a null data source is encountered (this can be because mData\n     * is set to null, or because the data source itself is null).\n     *  @type string\n     *  @default null\n     */\n    \"sDefaultContent\": null,\n\n    /**\n     * Name for the column, allowing reference to the column by name as well as\n     * by index (needs a lookup to work by name).\n     *  @type string\n     */\n    \"sName\": null,\n\n    /**\n     * Custom sorting data type - defines which of the available plug-ins in\n     * afnSortData the custom sorting will use - if any is defined.\n     *  @type string\n     *  @default std\n     */\n    \"sSortDataType\": 'std',\n\n    /**\n     * Class to be applied to the header element when sorting on this column\n     *  @type string\n     *  @default null\n     */\n    \"sSortingClass\": null,\n\n    /**\n     * Class to be applied to the header element when sorting on this column -\n     * when jQuery UI theming is used.\n     *  @type string\n     *  @default null\n     */\n    \"sSortingClassJUI\": null,\n\n    /**\n     * Title of the column - what is seen in the TH element (nTh).\n     *  @type string\n     */\n    \"sTitle\": null,\n\n    /**\n     * Column sorting and filtering type\n     *  @type string\n     *  @default null\n     */\n    \"sType\": null,\n\n    /**\n     * Width of the column\n     *  @type string\n     *  @default null\n     */\n    \"sWidth\": null,\n\n    /**\n     * Width of the column when it was first \"encountered\"\n     *  @type string\n     *  @default null\n     */\n    \"sWidthOrig\": null\n  };\n  /*\n   * Developer note: The properties of the object below are given in Hungarian\n   * notation, that was used as the interface for DataTables prior to v1.10, however\n   * from v1.10 onwards the primary interface is camel case. In order to avoid\n   * breaking backwards compatibility utterly with this change, the Hungarian\n   * version is still, internally the primary interface, but is is not documented\n   * - hence the @name tags in each doc comment. This allows a Javascript function\n   * to create a map from Hungarian notation to camel case (going the other direction\n   * would require each property to be listed, which would add around 3K to the size\n   * of DataTables, while this method is about a 0.5K hit).\n   *\n   * Ultimately this does pave the way for Hungarian notation to be dropped\n   * completely, but that is a massive amount of work and will break current\n   * installs (therefore is on-hold until v2).\n   */\n\n  /**\n   * Initialisation options that can be given to DataTables at initialisation\n   * time.\n   *  @namespace\n   */\n\n  DataTable.defaults = {\n    /**\n     * An array of data to use for the table, passed in at initialisation which\n     * will be used in preference to any data which is already in the DOM. This is\n     * particularly useful for constructing tables purely in Javascript, for\n     * example with a custom Ajax call.\n     *  @type array\n     *  @default null\n     *\n     *  @dtopt Option\n     *  @name DataTable.defaults.data\n     *\n     *  @example\n     *    // Using a 2D array data source\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"data\": [\n     *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n     *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n     *        ],\n     *        \"columns\": [\n     *          { \"title\": \"Engine\" },\n     *          { \"title\": \"Browser\" },\n     *          { \"title\": \"Platform\" },\n     *          { \"title\": \"Version\" },\n     *          { \"title\": \"Grade\" }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using an array of objects as a data source (`data`)\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"data\": [\n     *          {\n     *            \"engine\":   \"Trident\",\n     *            \"browser\":  \"Internet Explorer 4.0\",\n     *            \"platform\": \"Win 95+\",\n     *            \"version\":  4,\n     *            \"grade\":    \"X\"\n     *          },\n     *          {\n     *            \"engine\":   \"Trident\",\n     *            \"browser\":  \"Internet Explorer 5.0\",\n     *            \"platform\": \"Win 95+\",\n     *            \"version\":  5,\n     *            \"grade\":    \"C\"\n     *          }\n     *        ],\n     *        \"columns\": [\n     *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n     *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n     *          { \"title\": \"Platform\", \"data\": \"platform\" },\n     *          { \"title\": \"Version\",  \"data\": \"version\" },\n     *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"aaData\": null,\n\n    /**\n     * If ordering is enabled, then DataTables will perform a first pass sort on\n     * initialisation. You can define which column(s) the sort is performed\n     * upon, and the sorting direction, with this variable. The `sorting` array\n     * should contain an array for each column to be sorted initially containing\n     * the column's index and a direction string ('asc' or 'desc').\n     *  @type array\n     *  @default [[0,'asc']]\n     *\n     *  @dtopt Option\n     *  @name DataTable.defaults.order\n     *\n     *  @example\n     *    // Sort by 3rd column first, and then 4th column\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"order\": [[2,'asc'], [3,'desc']]\n     *      } );\n     *    } );\n     *\n     *    // No initial sorting\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"order\": []\n     *      } );\n     *    } );\n     */\n    \"aaSorting\": [[0, 'asc']],\n\n    /**\n     * This parameter is basically identical to the `sorting` parameter, but\n     * cannot be overridden by user interaction with the table. What this means\n     * is that you could have a column (visible or hidden) which the sorting\n     * will always be forced on first - any sorting after that (from the user)\n     * will then be performed as required. This can be useful for grouping rows\n     * together.\n     *  @type array\n     *  @default null\n     *\n     *  @dtopt Option\n     *  @name DataTable.defaults.orderFixed\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"orderFixed\": [[0,'asc']]\n     *      } );\n     *    } )\n     */\n    \"aaSortingFixed\": [],\n\n    /**\n     * DataTables can be instructed to load data to display in the table from a\n     * Ajax source. This option defines how that Ajax call is made and where to.\n     *\n     * The `ajax` property has three different modes of operation, depending on\n     * how it is defined. These are:\n     *\n     * * `string` - Set the URL from where the data should be loaded from.\n     * * `object` - Define properties for `jQuery.ajax`.\n     * * `function` - Custom data get function\n     *\n     * `string`\n     * --------\n     *\n     * As a string, the `ajax` property simply defines the URL from which\n     * DataTables will load data.\n     *\n     * `object`\n     * --------\n     *\n     * As an object, the parameters in the object are passed to\n     * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n     * of the Ajax request. DataTables has a number of default parameters which\n     * you can override using this option. Please refer to the jQuery\n     * documentation for a full description of the options available, although\n     * the following parameters provide additional options in DataTables or\n     * require special consideration:\n     *\n     * * `data` - As with jQuery, `data` can be provided as an object, but it\n     *   can also be used as a function to manipulate the data DataTables sends\n     *   to the server. The function takes a single parameter, an object of\n     *   parameters with the values that DataTables has readied for sending. An\n     *   object may be returned which will be merged into the DataTables\n     *   defaults, or you can add the items to the object that was passed in and\n     *   not return anything from the function. This supersedes `fnServerParams`\n     *   from DataTables 1.9-.\n     *\n     * * `dataSrc` - By default DataTables will look for the property `data` (or\n     *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n     *   from an Ajax source or for server-side processing - this parameter\n     *   allows that property to be changed. You can use Javascript dotted\n     *   object notation to get a data source for multiple levels of nesting, or\n     *   it my be used as a function. As a function it takes a single parameter,\n     *   the JSON returned from the server, which can be manipulated as\n     *   required, with the returned value being that used by DataTables as the\n     *   data source for the table. This supersedes `sAjaxDataProp` from\n     *   DataTables 1.9-.\n     *\n     * * `success` - Should not be overridden it is used internally in\n     *   DataTables. To manipulate / transform the data returned by the server\n     *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n     *\n     * `function`\n     * ----------\n     *\n     * As a function, making the Ajax call is left up to yourself allowing\n     * complete control of the Ajax request. Indeed, if desired, a method other\n     * than Ajax could be used to obtain the required data, such as Web storage\n     * or an AIR database.\n     *\n     * The function is given four parameters and no return is required. The\n     * parameters are:\n     *\n     * 1. _object_ - Data to send to the server\n     * 2. _function_ - Callback function that must be executed when the required\n     *    data has been obtained. That data should be passed into the callback\n     *    as the only parameter\n     * 3. _object_ - DataTables settings object for the table\n     *\n     * Note that this supersedes `fnServerData` from DataTables 1.9-.\n     *\n     *  @type string|object|function\n     *  @default null\n     *\n     *  @dtopt Option\n     *  @name DataTable.defaults.ajax\n     *  @since 1.10.0\n     *\n     * @example\n     *   // Get JSON data from a file via Ajax.\n     *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n     *   $('#example').dataTable( {\n     *     \"ajax\": \"data.json\"\n     *   } );\n     *\n     * @example\n     *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n     *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n     *   $('#example').dataTable( {\n     *     \"ajax\": {\n     *       \"url\": \"data.json\",\n     *       \"dataSrc\": \"tableData\"\n     *     }\n     *   } );\n     *\n     * @example\n     *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n     *   // from a plain array rather than an array in an object\n     *   $('#example').dataTable( {\n     *     \"ajax\": {\n     *       \"url\": \"data.json\",\n     *       \"dataSrc\": \"\"\n     *     }\n     *   } );\n     *\n     * @example\n     *   // Manipulate the data returned from the server - add a link to data\n     *   // (note this can, should, be done using `render` for the column - this\n     *   // is just a simple example of how the data can be manipulated).\n     *   $('#example').dataTable( {\n     *     \"ajax\": {\n     *       \"url\": \"data.json\",\n     *       \"dataSrc\": function ( json ) {\n     *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n     *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n     *         }\n     *         return json;\n     *       }\n     *     }\n     *   } );\n     *\n     * @example\n     *   // Add data to the request\n     *   $('#example').dataTable( {\n     *     \"ajax\": {\n     *       \"url\": \"data.json\",\n     *       \"data\": function ( d ) {\n     *         return {\n     *           \"extra_search\": $('#extra').val()\n     *         };\n     *       }\n     *     }\n     *   } );\n     *\n     * @example\n     *   // Send request as POST\n     *   $('#example').dataTable( {\n     *     \"ajax\": {\n     *       \"url\": \"data.json\",\n     *       \"type\": \"POST\"\n     *     }\n     *   } );\n     *\n     * @example\n     *   // Get the data from localStorage (could interface with a form for\n     *   // adding, editing and removing rows).\n     *   $('#example').dataTable( {\n     *     \"ajax\": function (data, callback, settings) {\n     *       callback(\n     *         JSON.parse( localStorage.getItem('dataTablesData') )\n     *       );\n     *     }\n     *   } );\n     */\n    \"ajax\": null,\n\n    /**\n     * This parameter allows you to readily specify the entries in the length drop\n     * down menu that DataTables shows when pagination is enabled. It can be\n     * either a 1D array of options which will be used for both the displayed\n     * option and the value, or a 2D array which will use the array in the first\n     * position as the value, and the array in the second position as the\n     * displayed options (useful for language strings such as 'All').\n     *\n     * Note that the `pageLength` property will be automatically set to the\n     * first value given in this array, unless `pageLength` is also provided.\n     *  @type array\n     *  @default [ 10, 25, 50, 100 ]\n     *\n     *  @dtopt Option\n     *  @name DataTable.defaults.lengthMenu\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n     *      } );\n     *    } );\n     */\n    \"aLengthMenu\": [10, 25, 50, 100],\n\n    /**\n     * The `columns` option in the initialisation parameter allows you to define\n     * details about the way individual columns behave. For a full list of\n     * column options that can be set, please see\n     * {@link DataTable.defaults.column}. Note that if you use `columns` to\n     * define your columns, you must have an entry in the array for every single\n     * column that you have in your table (these can be null if you don't which\n     * to specify any options).\n     *  @member\n     *\n     *  @name DataTable.defaults.column\n     */\n    \"aoColumns\": null,\n\n    /**\n     * Very similar to `columns`, `columnDefs` allows you to target a specific\n     * column, multiple columns, or all columns, using the `targets` property of\n     * each object in the array. This allows great flexibility when creating\n     * tables, as the `columnDefs` arrays can be of any length, targeting the\n     * columns you specifically want. `columnDefs` may use any of the column\n     * options available: {@link DataTable.defaults.column}, but it _must_\n     * have `targets` defined in each object in the array. Values in the `targets`\n     * array may be:\n     *   <ul>\n     *     <li>a string - class name will be matched on the TH for the column</li>\n     *     <li>0 or a positive integer - column index counting from the left</li>\n     *     <li>a negative integer - column index counting from the right</li>\n     *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n     *   </ul>\n     *  @member\n     *\n     *  @name DataTable.defaults.columnDefs\n     */\n    \"aoColumnDefs\": null,\n\n    /**\n     * Basically the same as `search`, this parameter defines the individual column\n     * filtering state at initialisation time. The array must be of the same size\n     * as the number of columns, and each element be an object with the parameters\n     * `search` and `escapeRegex` (the latter is optional). 'null' is also\n     * accepted and the default will be used.\n     *  @type array\n     *  @default []\n     *\n     *  @dtopt Option\n     *  @name DataTable.defaults.searchCols\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"searchCols\": [\n     *          null,\n     *          { \"search\": \"My filter\" },\n     *          null,\n     *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n     *        ]\n     *      } );\n     *    } )\n     */\n    \"aoSearchCols\": [],\n\n    /**\n     * An array of CSS classes that should be applied to displayed rows. This\n     * array may be of any length, and DataTables will apply each class\n     * sequentially, looping when required.\n     *  @type array\n     *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n     *    options</i>\n     *\n     *  @dtopt Option\n     *  @name DataTable.defaults.stripeClasses\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n     *      } );\n     *    } )\n     */\n    \"asStripeClasses\": null,\n\n    /**\n     * Enable or disable automatic column width calculation. This can be disabled\n     * as an optimisation (it takes some time to calculate the widths) if the\n     * tables widths are passed in using `columns`.\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.autoWidth\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"autoWidth\": false\n     *      } );\n     *    } );\n     */\n    \"bAutoWidth\": true,\n\n    /**\n     * Deferred rendering can provide DataTables with a huge speed boost when you\n     * are using an Ajax or JS data source for the table. This option, when set to\n     * true, will cause DataTables to defer the creation of the table elements for\n     * each row until they are needed for a draw - saving a significant amount of\n     * time.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.deferRender\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"ajax\": \"sources/arrays.txt\",\n     *        \"deferRender\": true\n     *      } );\n     *    } );\n     */\n    \"bDeferRender\": false,\n\n    /**\n     * Replace a DataTable which matches the given selector and replace it with\n     * one which has the properties of the new initialisation object passed. If no\n     * table matches the selector, then the new DataTable will be constructed as\n     * per normal.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.destroy\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"srollY\": \"200px\",\n     *        \"paginate\": false\n     *      } );\n     *\n     *      // Some time later....\n     *      $('#example').dataTable( {\n     *        \"filter\": false,\n     *        \"destroy\": true\n     *      } );\n     *    } );\n     */\n    \"bDestroy\": false,\n\n    /**\n     * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n     * that it allows the end user to input multiple words (space separated) and\n     * will match a row containing those words, even if not in the order that was\n     * specified (this allow matching across multiple columns). Note that if you\n     * wish to use filtering in DataTables this must remain 'true' - to remove the\n     * default filtering input box and retain filtering abilities, please use\n     * {@link DataTable.defaults.dom}.\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.searching\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"searching\": false\n     *      } );\n     *    } );\n     */\n    \"bFilter\": true,\n\n    /**\n     * Enable or disable the table information display. This shows information\n     * about the data that is currently visible on the page, including information\n     * about filtered data if that action is being performed.\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.info\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"info\": false\n     *      } );\n     *    } );\n     */\n    \"bInfo\": true,\n\n    /**\n     * Allows the end user to select the size of a formatted page from a select\n     * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.lengthChange\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"lengthChange\": false\n     *      } );\n     *    } );\n     */\n    \"bLengthChange\": true,\n\n    /**\n     * Enable or disable pagination.\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.paging\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"paging\": false\n     *      } );\n     *    } );\n     */\n    \"bPaginate\": true,\n\n    /**\n     * Enable or disable the display of a 'processing' indicator when the table is\n     * being processed (e.g. a sort). This is particularly useful for tables with\n     * large amounts of data where it can take a noticeable amount of time to sort\n     * the entries.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.processing\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"processing\": true\n     *      } );\n     *    } );\n     */\n    \"bProcessing\": false,\n\n    /**\n     * Retrieve the DataTables object for the given selector. Note that if the\n     * table has already been initialised, this parameter will cause DataTables\n     * to simply return the object that has already been set up - it will not take\n     * account of any changes you might have made to the initialisation object\n     * passed to DataTables (setting this parameter to true is an acknowledgement\n     * that you understand this). `destroy` can be used to reinitialise a table if\n     * you need.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.retrieve\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      initTable();\n     *      tableActions();\n     *    } );\n     *\n     *    function initTable ()\n     *    {\n     *      return $('#example').dataTable( {\n     *        \"scrollY\": \"200px\",\n     *        \"paginate\": false,\n     *        \"retrieve\": true\n     *      } );\n     *    }\n     *\n     *    function tableActions ()\n     *    {\n     *      var table = initTable();\n     *      // perform API operations with oTable\n     *    }\n     */\n    \"bRetrieve\": false,\n\n    /**\n     * When vertical (y) scrolling is enabled, DataTables will force the height of\n     * the table's viewport to the given height at all times (useful for layout).\n     * However, this can look odd when filtering data down to a small data set,\n     * and the footer is left \"floating\" further down. This parameter (when\n     * enabled) will cause DataTables to collapse the table's viewport down when\n     * the result set will fit within the given Y height.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.scrollCollapse\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"scrollY\": \"200\",\n     *        \"scrollCollapse\": true\n     *      } );\n     *    } );\n     */\n    \"bScrollCollapse\": false,\n\n    /**\n     * Configure DataTables to use server-side processing. Note that the\n     * `ajax` parameter must also be given in order to give DataTables a\n     * source to obtain the required data for each draw.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Features\n     *  @dtopt Server-side\n     *  @name DataTable.defaults.serverSide\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"serverSide\": true,\n     *        \"ajax\": \"xhr.php\"\n     *      } );\n     *    } );\n     */\n    \"bServerSide\": false,\n\n    /**\n     * Enable or disable sorting of columns. Sorting of individual columns can be\n     * disabled by the `sortable` option for each column.\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.ordering\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"ordering\": false\n     *      } );\n     *    } );\n     */\n    \"bSort\": true,\n\n    /**\n     * Enable or display DataTables' ability to sort multiple columns at the\n     * same time (activated by shift-click by the user).\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.orderMulti\n     *\n     *  @example\n     *    // Disable multiple column sorting ability\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"orderMulti\": false\n     *      } );\n     *    } );\n     */\n    \"bSortMulti\": true,\n\n    /**\n     * Allows control over whether DataTables should use the top (true) unique\n     * cell that is found for a single column, or the bottom (false - default).\n     * This is useful when using complex headers.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.orderCellsTop\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"orderCellsTop\": true\n     *      } );\n     *    } );\n     */\n    \"bSortCellsTop\": false,\n\n    /**\n     * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n     * `sorting\\_3` to the columns which are currently being sorted on. This is\n     * presented as a feature switch as it can increase processing time (while\n     * classes are removed and added) so for large data sets you might want to\n     * turn this off.\n     *  @type boolean\n     *  @default true\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.orderClasses\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"orderClasses\": false\n     *      } );\n     *    } );\n     */\n    \"bSortClasses\": true,\n\n    /**\n     * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n     * used to save table display information such as pagination information,\n     * display length, filtering and sorting. As such when the end user reloads\n     * the page the display display will match what thy had previously set up.\n     *\n     * Due to the use of `localStorage` the default state saving is not supported\n     * in IE6 or 7. If state saving is required in those browsers, use\n     * `stateSaveCallback` to provide a storage solution such as cookies.\n     *  @type boolean\n     *  @default false\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.stateSave\n     *\n     *  @example\n     *    $(document).ready( function () {\n     *      $('#example').dataTable( {\n     *        \"stateSave\": true\n     *      } );\n     *    } );\n     */\n    \"bStateSave\": false,\n\n    /**\n     * This function is called when a TR element is created (and all TD child\n     * elements have been inserted), or registered if using a DOM source, allowing\n     * manipulation of the TR element (adding classes etc).\n     *  @type function\n     *  @param {node} row \"TR\" element for the current row\n     *  @param {array} data Raw data array for this row\n     *  @param {int} dataIndex The index of this row in the internal aoData array\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.createdRow\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"createdRow\": function( row, data, dataIndex ) {\n     *          // Bold the grade for all 'A' grade browsers\n     *          if ( data[4] == \"A\" )\n     *          {\n     *            $('td:eq(4)', row).html( '<b>A</b>' );\n     *          }\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnCreatedRow\": null,\n\n    /**\n     * This function is called on every 'draw' event, and allows you to\n     * dynamically modify any aspect you want about the created DOM.\n     *  @type function\n     *  @param {object} settings DataTables settings object\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.drawCallback\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"drawCallback\": function( settings ) {\n     *          alert( 'DataTables has redrawn the table' );\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnDrawCallback\": null,\n\n    /**\n     * Identical to fnHeaderCallback() but for the table footer this function\n     * allows you to modify the table footer on every 'draw' event.\n     *  @type function\n     *  @param {node} foot \"TR\" element for the footer\n     *  @param {array} data Full table data (as derived from the original HTML)\n     *  @param {int} start Index for the current display starting point in the\n     *    display array\n     *  @param {int} end Index for the current display ending point in the\n     *    display array\n     *  @param {array int} display Index array to translate the visual position\n     *    to the full data array\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.footerCallback\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n     *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n     *        }\n     *      } );\n     *    } )\n     */\n    \"fnFooterCallback\": null,\n\n    /**\n     * When rendering large numbers in the information element for the table\n     * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n     * to have a comma separator for the 'thousands' units (e.g. 1 million is\n     * rendered as \"1,000,000\") to help readability for the end user. This\n     * function will override the default method DataTables uses.\n     *  @type function\n     *  @member\n     *  @param {int} toFormat number to be formatted\n     *  @returns {string} formatted string for DataTables to show the number\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.formatNumber\n     *\n     *  @example\n     *    // Format a number using a single quote for the separator (note that\n     *    // this can also be done with the language.thousands option)\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"formatNumber\": function ( toFormat ) {\n     *          return toFormat.toString().replace(\n     *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n     *          );\n     *        };\n     *      } );\n     *    } );\n     */\n    \"fnFormatNumber\": function fnFormatNumber(toFormat) {\n      return toFormat.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.oLanguage.sThousands);\n    },\n\n    /**\n     * This function is called on every 'draw' event, and allows you to\n     * dynamically modify the header row. This can be used to calculate and\n     * display useful information about the table.\n     *  @type function\n     *  @param {node} head \"TR\" element for the header\n     *  @param {array} data Full table data (as derived from the original HTML)\n     *  @param {int} start Index for the current display starting point in the\n     *    display array\n     *  @param {int} end Index for the current display ending point in the\n     *    display array\n     *  @param {array int} display Index array to translate the visual position\n     *    to the full data array\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.headerCallback\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"fheaderCallback\": function( head, data, start, end, display ) {\n     *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n     *        }\n     *      } );\n     *    } )\n     */\n    \"fnHeaderCallback\": null,\n\n    /**\n     * The information element can be used to convey information about the current\n     * state of the table. Although the internationalisation options presented by\n     * DataTables are quite capable of dealing with most customisations, there may\n     * be times where you wish to customise the string further. This callback\n     * allows you to do exactly that.\n     *  @type function\n     *  @param {object} oSettings DataTables settings object\n     *  @param {int} start Starting position in data for the draw\n     *  @param {int} end End position in data for the draw\n     *  @param {int} max Total number of rows in the table (regardless of\n     *    filtering)\n     *  @param {int} total Total number of rows in the data set, after filtering\n     *  @param {string} pre The string that DataTables has formatted using it's\n     *    own rules\n     *  @returns {string} The string to be displayed in the information element.\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.infoCallback\n     *\n     *  @example\n     *    $('#example').dataTable( {\n     *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n     *        return start +\" to \"+ end;\n     *      }\n     *    } );\n     */\n    \"fnInfoCallback\": null,\n\n    /**\n     * Called when the table has been initialised. Normally DataTables will\n     * initialise sequentially and there will be no need for this function,\n     * however, this does not hold true when using external language information\n     * since that is obtained using an async XHR call.\n     *  @type function\n     *  @param {object} settings DataTables settings object\n     *  @param {object} json The JSON object request from the server - only\n     *    present if client-side Ajax sourced data is used\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.initComplete\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"initComplete\": function(settings, json) {\n     *          alert( 'DataTables has finished its initialisation.' );\n     *        }\n     *      } );\n     *    } )\n     */\n    \"fnInitComplete\": null,\n\n    /**\n     * Called at the very start of each table draw and can be used to cancel the\n     * draw by returning false, any other return (including undefined) results in\n     * the full draw occurring).\n     *  @type function\n     *  @param {object} settings DataTables settings object\n     *  @returns {boolean} False will cancel the draw, anything else (including no\n     *    return) will allow it to complete.\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.preDrawCallback\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"preDrawCallback\": function( settings ) {\n     *          if ( $('#test').val() == 1 ) {\n     *            return false;\n     *          }\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnPreDrawCallback\": null,\n\n    /**\n     * This function allows you to 'post process' each row after it have been\n     * generated for each table draw, but before it is rendered on screen. This\n     * function might be used for setting the row class name etc.\n     *  @type function\n     *  @param {node} row \"TR\" element for the current row\n     *  @param {array} data Raw data array for this row\n     *  @param {int} displayIndex The display index for the current table draw\n     *  @param {int} displayIndexFull The index of the data in the full list of\n     *    rows (after filtering)\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.rowCallback\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n     *          // Bold the grade for all 'A' grade browsers\n     *          if ( data[4] == \"A\" ) {\n     *            $('td:eq(4)', row).html( '<b>A</b>' );\n     *          }\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnRowCallback\": null,\n\n    /**\n     * __Deprecated__ The functionality provided by this parameter has now been\n     * superseded by that provided through `ajax`, which should be used instead.\n     *\n     * This parameter allows you to override the default function which obtains\n     * the data from the server so something more suitable for your application.\n     * For example you could use POST data, or pull information from a Gears or\n     * AIR database.\n     *  @type function\n     *  @member\n     *  @param {string} source HTTP source to obtain the data from (`ajax`)\n     *  @param {array} data A key/value pair object containing the data to send\n     *    to the server\n     *  @param {function} callback to be called on completion of the data get\n     *    process that will draw the data on the page.\n     *  @param {object} settings DataTables settings object\n     *\n     *  @dtopt Callbacks\n     *  @dtopt Server-side\n     *  @name DataTable.defaults.serverData\n     *\n     *  @deprecated 1.10. Please use `ajax` for this functionality now.\n     */\n    \"fnServerData\": null,\n\n    /**\n     * __Deprecated__ The functionality provided by this parameter has now been\n     * superseded by that provided through `ajax`, which should be used instead.\n     *\n     *  It is often useful to send extra data to the server when making an Ajax\n     * request - for example custom filtering information, and this callback\n     * function makes it trivial to send extra information to the server. The\n     * passed in parameter is the data set that has been constructed by\n     * DataTables, and you can add to this or modify it as you require.\n     *  @type function\n     *  @param {array} data Data array (array of objects which are name/value\n     *    pairs) that has been constructed by DataTables and will be sent to the\n     *    server. In the case of Ajax sourced data with server-side processing\n     *    this will be an empty array, for server-side processing there will be a\n     *    significant number of parameters!\n     *  @returns {undefined} Ensure that you modify the data array passed in,\n     *    as this is passed by reference.\n     *\n     *  @dtopt Callbacks\n     *  @dtopt Server-side\n     *  @name DataTable.defaults.serverParams\n     *\n     *  @deprecated 1.10. Please use `ajax` for this functionality now.\n     */\n    \"fnServerParams\": null,\n\n    /**\n     * Load the table state. With this function you can define from where, and how, the\n     * state of a table is loaded. By default DataTables will load from `localStorage`\n     * but you might wish to use a server-side database or cookies.\n     *  @type function\n     *  @member\n     *  @param {object} settings DataTables settings object\n     *  @param {object} callback Callback that can be executed when done. It\n     *    should be passed the loaded state object.\n     *  @return {object} The DataTables state object to be loaded\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.stateLoadCallback\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stateSave\": true,\n     *        \"stateLoadCallback\": function (settings, callback) {\n     *          $.ajax( {\n     *            \"url\": \"/state_load\",\n     *            \"dataType\": \"json\",\n     *            \"success\": function (json) {\n     *              callback( json );\n     *            }\n     *          } );\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnStateLoadCallback\": function fnStateLoadCallback(settings) {\n      try {\n        return JSON.parse((settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem('DataTables_' + settings.sInstance + '_' + location.pathname));\n      } catch (e) {\n        return {};\n      }\n    },\n\n    /**\n     * Callback which allows modification of the saved state prior to loading that state.\n     * This callback is called when the table is loading state from the stored data, but\n     * prior to the settings object being modified by the saved state. Note that for\n     * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n     * a plug-in.\n     *  @type function\n     *  @param {object} settings DataTables settings object\n     *  @param {object} data The state object that is to be loaded\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.stateLoadParams\n     *\n     *  @example\n     *    // Remove a saved filter, so filtering is never loaded\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stateSave\": true,\n     *        \"stateLoadParams\": function (settings, data) {\n     *          data.oSearch.sSearch = \"\";\n     *        }\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Disallow state loading by returning false\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stateSave\": true,\n     *        \"stateLoadParams\": function (settings, data) {\n     *          return false;\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnStateLoadParams\": null,\n\n    /**\n     * Callback that is called when the state has been loaded from the state saving method\n     * and the DataTables settings object has been modified as a result of the loaded state.\n     *  @type function\n     *  @param {object} settings DataTables settings object\n     *  @param {object} data The state object that was loaded\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.stateLoaded\n     *\n     *  @example\n     *    // Show an alert with the filtering value that was saved\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stateSave\": true,\n     *        \"stateLoaded\": function (settings, data) {\n     *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnStateLoaded\": null,\n\n    /**\n     * Save the table state. This function allows you to define where and how the state\n     * information for the table is stored By default DataTables will use `localStorage`\n     * but you might wish to use a server-side database or cookies.\n     *  @type function\n     *  @member\n     *  @param {object} settings DataTables settings object\n     *  @param {object} data The state object to be saved\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.stateSaveCallback\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stateSave\": true,\n     *        \"stateSaveCallback\": function (settings, data) {\n     *          // Send an Ajax request to the server with the state object\n     *          $.ajax( {\n     *            \"url\": \"/state_save\",\n     *            \"data\": data,\n     *            \"dataType\": \"json\",\n     *            \"method\": \"POST\"\n     *            \"success\": function () {}\n     *          } );\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnStateSaveCallback\": function fnStateSaveCallback(settings, data) {\n      try {\n        (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem('DataTables_' + settings.sInstance + '_' + location.pathname, JSON.stringify(data));\n      } catch (e) {}\n    },\n\n    /**\n     * Callback which allows modification of the state to be saved. Called when the table\n     * has changed state a new state save is required. This method allows modification of\n     * the state saving object prior to actually doing the save, including addition or\n     * other state properties or modification. Note that for plug-in authors, you should\n     * use the `stateSaveParams` event to save parameters for a plug-in.\n     *  @type function\n     *  @param {object} settings DataTables settings object\n     *  @param {object} data The state object to be saved\n     *\n     *  @dtopt Callbacks\n     *  @name DataTable.defaults.stateSaveParams\n     *\n     *  @example\n     *    // Remove a saved filter, so filtering is never saved\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stateSave\": true,\n     *        \"stateSaveParams\": function (settings, data) {\n     *          data.oSearch.sSearch = \"\";\n     *        }\n     *      } );\n     *    } );\n     */\n    \"fnStateSaveParams\": null,\n\n    /**\n     * Duration for which the saved state information is considered valid. After this period\n     * has elapsed the state will be returned to the default.\n     * Value is given in seconds.\n     *  @type int\n     *  @default 7200 <i>(2 hours)</i>\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.stateDuration\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"stateDuration\": 60*60*24; // 1 day\n     *      } );\n     *    } )\n     */\n    \"iStateDuration\": 7200,\n\n    /**\n     * When enabled DataTables will not make a request to the server for the first\n     * page draw - rather it will use the data already on the page (no sorting etc\n     * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n     * is used to indicate that deferred loading is required, but it is also used\n     * to tell DataTables how many records there are in the full table (allowing\n     * the information element and pagination to be displayed correctly). In the case\n     * where a filtering is applied to the table on initial load, this can be\n     * indicated by giving the parameter as an array, where the first element is\n     * the number of records available after filtering and the second element is the\n     * number of records without filtering (allowing the table information element\n     * to be shown correctly).\n     *  @type int | array\n     *  @default null\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.deferLoading\n     *\n     *  @example\n     *    // 57 records available in the table, no filtering applied\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"serverSide\": true,\n     *        \"ajax\": \"scripts/server_processing.php\",\n     *        \"deferLoading\": 57\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"serverSide\": true,\n     *        \"ajax\": \"scripts/server_processing.php\",\n     *        \"deferLoading\": [ 57, 100 ],\n     *        \"search\": {\n     *          \"search\": \"my_filter\"\n     *        }\n     *      } );\n     *    } );\n     */\n    \"iDeferLoading\": null,\n\n    /**\n     * Number of rows to display on a single page when using pagination. If\n     * feature enabled (`lengthChange`) then the end user will be able to override\n     * this to a custom setting using a pop-up menu.\n     *  @type int\n     *  @default 10\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.pageLength\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"pageLength\": 50\n     *      } );\n     *    } )\n     */\n    \"iDisplayLength\": 10,\n\n    /**\n     * Define the starting point for data display when using DataTables with\n     * pagination. Note that this parameter is the number of records, rather than\n     * the page number, so if you have 10 records per page and want to start on\n     * the third page, it should be \"20\".\n     *  @type int\n     *  @default 0\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.displayStart\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"displayStart\": 20\n     *      } );\n     *    } )\n     */\n    \"iDisplayStart\": 0,\n\n    /**\n     * By default DataTables allows keyboard navigation of the table (sorting, paging,\n     * and filtering) by adding a `tabindex` attribute to the required elements. This\n     * allows you to tab through the controls and press the enter key to activate them.\n     * The tabindex is default 0, meaning that the tab follows the flow of the document.\n     * You can overrule this using this parameter if you wish. Use a value of -1 to\n     * disable built-in keyboard navigation.\n     *  @type int\n     *  @default 0\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.tabIndex\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"tabIndex\": 1\n     *      } );\n     *    } );\n     */\n    \"iTabIndex\": 0,\n\n    /**\n     * Classes that DataTables assigns to the various components and features\n     * that it adds to the HTML table. This allows classes to be configured\n     * during initialisation in addition to through the static\n     * {@link DataTable.ext.oStdClasses} object).\n     *  @namespace\n     *  @name DataTable.defaults.classes\n     */\n    \"oClasses\": {},\n\n    /**\n     * All strings that DataTables uses in the user interface that it creates\n     * are defined in this object, allowing you to modified them individually or\n     * completely replace them all as required.\n     *  @namespace\n     *  @name DataTable.defaults.language\n     */\n    \"oLanguage\": {\n      /**\n       * Strings that are used for WAI-ARIA labels and controls only (these are not\n       * actually visible on the page, but will be read by screenreaders, and thus\n       * must be internationalised as well).\n       *  @namespace\n       *  @name DataTable.defaults.language.aria\n       */\n      \"oAria\": {\n        /**\n         * ARIA label that is added to the table headers when the column may be\n         * sorted ascending by activing the column (click or return when focused).\n         * Note that the column header is prefixed to this string.\n         *  @type string\n         *  @default : activate to sort column ascending\n         *\n         *  @dtopt Language\n         *  @name DataTable.defaults.language.aria.sortAscending\n         *\n         *  @example\n         *    $(document).ready( function() {\n         *      $('#example').dataTable( {\n         *        \"language\": {\n         *          \"aria\": {\n         *            \"sortAscending\": \" - click/return to sort ascending\"\n         *          }\n         *        }\n         *      } );\n         *    } );\n         */\n        \"sSortAscending\": \": activate to sort column ascending\",\n\n        /**\n         * ARIA label that is added to the table headers when the column may be\n         * sorted descending by activing the column (click or return when focused).\n         * Note that the column header is prefixed to this string.\n         *  @type string\n         *  @default : activate to sort column ascending\n         *\n         *  @dtopt Language\n         *  @name DataTable.defaults.language.aria.sortDescending\n         *\n         *  @example\n         *    $(document).ready( function() {\n         *      $('#example').dataTable( {\n         *        \"language\": {\n         *          \"aria\": {\n         *            \"sortDescending\": \" - click/return to sort descending\"\n         *          }\n         *        }\n         *      } );\n         *    } );\n         */\n        \"sSortDescending\": \": activate to sort column descending\"\n      },\n\n      /**\n       * Pagination string used by DataTables for the built-in pagination\n       * control types.\n       *  @namespace\n       *  @name DataTable.defaults.language.paginate\n       */\n      \"oPaginate\": {\n        /**\n         * Text to use when using the 'full_numbers' type of pagination for the\n         * button to take the user to the first page.\n         *  @type string\n         *  @default First\n         *\n         *  @dtopt Language\n         *  @name DataTable.defaults.language.paginate.first\n         *\n         *  @example\n         *    $(document).ready( function() {\n         *      $('#example').dataTable( {\n         *        \"language\": {\n         *          \"paginate\": {\n         *            \"first\": \"First page\"\n         *          }\n         *        }\n         *      } );\n         *    } );\n         */\n        \"sFirst\": \"First\",\n\n        /**\n         * Text to use when using the 'full_numbers' type of pagination for the\n         * button to take the user to the last page.\n         *  @type string\n         *  @default Last\n         *\n         *  @dtopt Language\n         *  @name DataTable.defaults.language.paginate.last\n         *\n         *  @example\n         *    $(document).ready( function() {\n         *      $('#example').dataTable( {\n         *        \"language\": {\n         *          \"paginate\": {\n         *            \"last\": \"Last page\"\n         *          }\n         *        }\n         *      } );\n         *    } );\n         */\n        \"sLast\": \"Last\",\n\n        /**\n         * Text to use for the 'next' pagination button (to take the user to the\n         * next page).\n         *  @type string\n         *  @default Next\n         *\n         *  @dtopt Language\n         *  @name DataTable.defaults.language.paginate.next\n         *\n         *  @example\n         *    $(document).ready( function() {\n         *      $('#example').dataTable( {\n         *        \"language\": {\n         *          \"paginate\": {\n         *            \"next\": \"Next page\"\n         *          }\n         *        }\n         *      } );\n         *    } );\n         */\n        \"sNext\": \"Next\",\n\n        /**\n         * Text to use for the 'previous' pagination button (to take the user to\n         * the previous page).\n         *  @type string\n         *  @default Previous\n         *\n         *  @dtopt Language\n         *  @name DataTable.defaults.language.paginate.previous\n         *\n         *  @example\n         *    $(document).ready( function() {\n         *      $('#example').dataTable( {\n         *        \"language\": {\n         *          \"paginate\": {\n         *            \"previous\": \"Previous page\"\n         *          }\n         *        }\n         *      } );\n         *    } );\n         */\n        \"sPrevious\": \"Previous\"\n      },\n\n      /**\n       * This string is shown in preference to `zeroRecords` when the table is\n       * empty of data (regardless of filtering). Note that this is an optional\n       * parameter - if it is not given, the value of `zeroRecords` will be used\n       * instead (either the default or given value).\n       *  @type string\n       *  @default No data available in table\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.emptyTable\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"emptyTable\": \"No data available in table\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sEmptyTable\": \"No data available in table\",\n\n      /**\n       * This string gives information to the end user about the information\n       * that is current on display on the page. The following tokens can be\n       * used in the string and will be dynamically replaced as the table\n       * display updates. This tokens can be placed anywhere in the string, or\n       * removed as needed by the language requires:\n       *\n       * * `\\_START\\_` - Display index of the first record on the current page\n       * * `\\_END\\_` - Display index of the last record on the current page\n       * * `\\_TOTAL\\_` - Number of records in the table after filtering\n       * * `\\_MAX\\_` - Number of records in the table without filtering\n       * * `\\_PAGE\\_` - Current page number\n       * * `\\_PAGES\\_` - Total number of pages of data in the table\n       *\n       *  @type string\n       *  @default Showing _START_ to _END_ of _TOTAL_ entries\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.info\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\n      /**\n       * Display information string for when the table is empty. Typically the\n       * format of this string should match `info`.\n       *  @type string\n       *  @default Showing 0 to 0 of 0 entries\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.infoEmpty\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"infoEmpty\": \"No entries to show\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\n      /**\n       * When a user filters the information in a table, this string is appended\n       * to the information (`info`) to give an idea of how strong the filtering\n       * is. The variable _MAX_ is dynamically updated.\n       *  @type string\n       *  @default (filtered from _MAX_ total entries)\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.infoFiltered\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\n      /**\n       * If can be useful to append extra information to the info string at times,\n       * and this variable does exactly that. This information will be appended to\n       * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n       * being used) at all times.\n       *  @type string\n       *  @default <i>Empty string</i>\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.infoPostFix\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"infoPostFix\": \"All records shown are derived from real information.\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sInfoPostFix\": \"\",\n\n      /**\n       * This decimal place operator is a little different from the other\n       * language options since DataTables doesn't output floating point\n       * numbers, so it won't ever use this for display of a number. Rather,\n       * what this parameter does is modify the sort methods of the table so\n       * that numbers which are in a format which has a character other than\n       * a period (`.`) as a decimal place will be sorted numerically.\n       *\n       * Note that numbers with different decimal places cannot be shown in\n       * the same table and still be sortable, the table must be consistent.\n       * However, multiple different tables on the page can use different\n       * decimal place characters.\n       *  @type string\n       *  @default \n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.decimal\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"decimal\": \",\"\n       *          \"thousands\": \".\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sDecimal\": \"\",\n\n      /**\n       * DataTables has a build in number formatter (`formatNumber`) which is\n       * used to format large numbers that are used in the table information.\n       * By default a comma is used, but this can be trivially changed to any\n       * character you wish with this parameter.\n       *  @type string\n       *  @default ,\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.thousands\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"thousands\": \"'\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sThousands\": \",\",\n\n      /**\n       * Detail the action that will be taken when the drop down menu for the\n       * pagination length option is changed. The '_MENU_' variable is replaced\n       * with a default select list of 10, 25, 50 and 100, and can be replaced\n       * with a custom select box if required.\n       *  @type string\n       *  @default Show _MENU_ entries\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.lengthMenu\n       *\n       *  @example\n       *    // Language change only\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"lengthMenu\": \"Display _MENU_ records\"\n       *        }\n       *      } );\n       *    } );\n       *\n       *  @example\n       *    // Language and options change\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"lengthMenu\": 'Display <select>'+\n       *            '<option value=\"10\">10</option>'+\n       *            '<option value=\"20\">20</option>'+\n       *            '<option value=\"30\">30</option>'+\n       *            '<option value=\"40\">40</option>'+\n       *            '<option value=\"50\">50</option>'+\n       *            '<option value=\"-1\">All</option>'+\n       *            '</select> records'\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sLengthMenu\": \"Show _MENU_ entries\",\n\n      /**\n       * When using Ajax sourced data and during the first draw when DataTables is\n       * gathering the data, this message is shown in an empty row in the table to\n       * indicate to the end user the the data is being loaded. Note that this\n       * parameter is not used when loading data by server-side processing, just\n       * Ajax sourced data with client-side processing.\n       *  @type string\n       *  @default Loading...\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.loadingRecords\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"loadingRecords\": \"Please wait - loading...\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sLoadingRecords\": \"Loading...\",\n\n      /**\n       * Text which is displayed when the table is processing a user action\n       * (usually a sort command or similar).\n       *  @type string\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.processing\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"processing\": \"DataTables is currently busy\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sProcessing\": \"\",\n\n      /**\n       * Details the actions that will be taken when the user types into the\n       * filtering input text box. The variable \"_INPUT_\", if used in the string,\n       * is replaced with the HTML text box for the filtering input allowing\n       * control over where it appears in the string. If \"_INPUT_\" is not given\n       * then the input box is appended to the string automatically.\n       *  @type string\n       *  @default Search:\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.search\n       *\n       *  @example\n       *    // Input text box will be appended at the end automatically\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"search\": \"Filter records:\"\n       *        }\n       *      } );\n       *    } );\n       *\n       *  @example\n       *    // Specify where the filter should appear\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"search\": \"Apply filter _INPUT_ to table\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sSearch\": \"Search:\",\n\n      /**\n       * Assign a `placeholder` attribute to the search `input` element\n       *  @type string\n       *  @default \n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.searchPlaceholder\n       */\n      \"sSearchPlaceholder\": \"\",\n\n      /**\n       * All of the language information can be stored in a file on the\n       * server-side, which DataTables will look up if this parameter is passed.\n       * It must store the URL of the language file, which is in a JSON format,\n       * and the object has the same properties as the oLanguage object in the\n       * initialiser object (i.e. the above parameters). Please refer to one of\n       * the example language files to see how this works in action.\n       *  @type string\n       *  @default <i>Empty string - i.e. disabled</i>\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.url\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sUrl\": \"\",\n\n      /**\n       * Text shown inside the table records when the is no information to be\n       * displayed after filtering. `emptyTable` is shown when there is simply no\n       * information in the table at all (regardless of filtering).\n       *  @type string\n       *  @default No matching records found\n       *\n       *  @dtopt Language\n       *  @name DataTable.defaults.language.zeroRecords\n       *\n       *  @example\n       *    $(document).ready( function() {\n       *      $('#example').dataTable( {\n       *        \"language\": {\n       *          \"zeroRecords\": \"No records to display\"\n       *        }\n       *      } );\n       *    } );\n       */\n      \"sZeroRecords\": \"No matching records found\"\n    },\n\n    /**\n     * This parameter allows you to have define the global filtering state at\n     * initialisation time. As an object the `search` parameter must be\n     * defined, but all other parameters are optional. When `regex` is true,\n     * the search string will be treated as a regular expression, when false\n     * (default) it will be treated as a straight string. When `smart`\n     * DataTables will use it's smart filtering methods (to word match at\n     * any point in the data), when false this will not be done.\n     *  @namespace\n     *  @extends DataTable.models.oSearch\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.search\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"search\": {\"search\": \"Initial search\"}\n     *      } );\n     *    } )\n     */\n    \"oSearch\": $.extend({}, DataTable.models.oSearch),\n\n    /**\n     * __Deprecated__ The functionality provided by this parameter has now been\n     * superseded by that provided through `ajax`, which should be used instead.\n     *\n     * By default DataTables will look for the property `data` (or `aaData` for\n     * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n     * source or for server-side processing - this parameter allows that\n     * property to be changed. You can use Javascript dotted object notation to\n     * get a data source for multiple levels of nesting.\n     *  @type string\n     *  @default data\n     *\n     *  @dtopt Options\n     *  @dtopt Server-side\n     *  @name DataTable.defaults.ajaxDataProp\n     *\n     *  @deprecated 1.10. Please use `ajax` for this functionality now.\n     */\n    \"sAjaxDataProp\": \"data\",\n\n    /**\n     * __Deprecated__ The functionality provided by this parameter has now been\n     * superseded by that provided through `ajax`, which should be used instead.\n     *\n     * You can instruct DataTables to load data from an external\n     * source using this parameter (use aData if you want to pass data in you\n     * already have). Simply provide a url a JSON object can be obtained from.\n     *  @type string\n     *  @default null\n     *\n     *  @dtopt Options\n     *  @dtopt Server-side\n     *  @name DataTable.defaults.ajaxSource\n     *\n     *  @deprecated 1.10. Please use `ajax` for this functionality now.\n     */\n    \"sAjaxSource\": null,\n\n    /**\n     * This initialisation variable allows you to specify exactly where in the\n     * DOM you want DataTables to inject the various controls it adds to the page\n     * (for example you might want the pagination controls at the top of the\n     * table). DIV elements (with or without a custom class) can also be added to\n     * aid styling. The follow syntax is used:\n     *   <ul>\n     *     <li>The following options are allowed:\n     *       <ul>\n     *         <li>'l' - Length changing</li>\n     *         <li>'f' - Filtering input</li>\n     *         <li>'t' - The table!</li>\n     *         <li>'i' - Information</li>\n     *         <li>'p' - Pagination</li>\n     *         <li>'r' - pRocessing</li>\n     *       </ul>\n     *     </li>\n     *     <li>The following constants are allowed:\n     *       <ul>\n     *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n     *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n     *       </ul>\n     *     </li>\n     *     <li>The following syntax is expected:\n     *       <ul>\n     *         <li>'&lt;' and '&gt;' - div elements</li>\n     *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n     *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n     *       </ul>\n     *     </li>\n     *     <li>Examples:\n     *       <ul>\n     *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n     *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n     *       </ul>\n     *     </li>\n     *   </ul>\n     *  @type string\n     *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n     *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.dom\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n     *      } );\n     *    } );\n     */\n    \"sDom\": \"lfrtip\",\n\n    /**\n     * Search delay option. This will throttle full table searches that use the\n     * DataTables provided search input element (it does not effect calls to\n     * `dt-api search()`, providing a delay before the search is made.\n     *  @type integer\n     *  @default 0\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.searchDelay\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"searchDelay\": 200\n     *      } );\n     *    } )\n     */\n    \"searchDelay\": null,\n\n    /**\n     * DataTables features six different built-in options for the buttons to\n     * display for pagination control:\n     *\n     * * `numbers` - Page number buttons only\n     * * `simple` - 'Previous' and 'Next' buttons only\n     * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n     * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n     * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n     * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n     *  \n     * Further methods can be added using {@link DataTable.ext.oPagination}.\n     *  @type string\n     *  @default simple_numbers\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.pagingType\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"pagingType\": \"full_numbers\"\n     *      } );\n     *    } )\n     */\n    \"sPaginationType\": \"simple_numbers\",\n\n    /**\n     * Enable horizontal scrolling. When a table is too wide to fit into a\n     * certain layout, or you have a large number of columns in the table, you\n     * can enable x-scrolling to show the table in a viewport, which can be\n     * scrolled. This property can be `true` which will allow the table to\n     * scroll horizontally when needed, or any CSS unit, or a number (in which\n     * case it will be treated as a pixel measurement). Setting as simply `true`\n     * is recommended.\n     *  @type boolean|string\n     *  @default <i>blank string - i.e. disabled</i>\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.scrollX\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"scrollX\": true,\n     *        \"scrollCollapse\": true\n     *      } );\n     *    } );\n     */\n    \"sScrollX\": \"\",\n\n    /**\n     * This property can be used to force a DataTable to use more width than it\n     * might otherwise do when x-scrolling is enabled. For example if you have a\n     * table which requires to be well spaced, this parameter is useful for\n     * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n     * any CSS unit, or a number (in which case it will be treated as a pixel\n     * measurement).\n     *  @type string\n     *  @default <i>blank string - i.e. disabled</i>\n     *\n     *  @dtopt Options\n     *  @name DataTable.defaults.scrollXInner\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"scrollX\": \"100%\",\n     *        \"scrollXInner\": \"110%\"\n     *      } );\n     *    } );\n     */\n    \"sScrollXInner\": \"\",\n\n    /**\n     * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n     * to the given height, and enable scrolling for any data which overflows the\n     * current viewport. This can be used as an alternative to paging to display\n     * a lot of data in a small area (although paging and scrolling can both be\n     * enabled at the same time). This property can be any CSS unit, or a number\n     * (in which case it will be treated as a pixel measurement).\n     *  @type string\n     *  @default <i>blank string - i.e. disabled</i>\n     *\n     *  @dtopt Features\n     *  @name DataTable.defaults.scrollY\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"scrollY\": \"200px\",\n     *        \"paginate\": false\n     *      } );\n     *    } );\n     */\n    \"sScrollY\": \"\",\n\n    /**\n     * __Deprecated__ The functionality provided by this parameter has now been\n     * superseded by that provided through `ajax`, which should be used instead.\n     *\n     * Set the HTTP method that is used to make the Ajax call for server-side\n     * processing or Ajax sourced data.\n     *  @type string\n     *  @default GET\n     *\n     *  @dtopt Options\n     *  @dtopt Server-side\n     *  @name DataTable.defaults.serverMethod\n     *\n     *  @deprecated 1.10. Please use `ajax` for this functionality now.\n     */\n    \"sServerMethod\": \"GET\",\n\n    /**\n     * DataTables makes use of renderers when displaying HTML elements for\n     * a table. These renderers can be added or modified by plug-ins to\n     * generate suitable mark-up for a site. For example the Bootstrap\n     * integration plug-in for DataTables uses a paging button renderer to\n     * display pagination buttons in the mark-up required by Bootstrap.\n     *\n     * For further information about the renderers available see\n     * DataTable.ext.renderer\n     *  @type string|object\n     *  @default null\n     *\n     *  @name DataTable.defaults.renderer\n     *\n     */\n    \"renderer\": null,\n\n    /**\n     * Set the data property name that DataTables should use to get a row's id\n     * to set as the `id` property in the node.\n     *  @type string\n     *  @default DT_RowId\n     *\n     *  @name DataTable.defaults.rowId\n     */\n    \"rowId\": \"DT_RowId\"\n  };\n\n  _fnHungarianMap(DataTable.defaults);\n  /*\n   * Developer note - See note in model.defaults.js about the use of Hungarian\n   * notation and camel case.\n   */\n\n  /**\n   * Column options that can be given to DataTables at initialisation time.\n   *  @namespace\n   */\n\n\n  DataTable.defaults.column = {\n    /**\n     * Define which column(s) an order will occur on for this column. This\n     * allows a column's ordering to take multiple columns into account when\n     * doing a sort or use the data from a different column. For example first\n     * name / last name columns make sense to do a multi-column sort over the\n     * two columns.\n     *  @type array|int\n     *  @default null <i>Takes the value of the column index automatically</i>\n     *\n     *  @name DataTable.defaults.column.orderData\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n     *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n     *          { \"orderData\": 2, \"targets\": [ 2 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"orderData\": [ 0, 1 ] },\n     *          { \"orderData\": [ 1, 0 ] },\n     *          { \"orderData\": 2 },\n     *          null,\n     *          null\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"aDataSort\": null,\n    \"iDataSort\": -1,\n\n    /**\n     * You can control the default ordering direction, and even alter the\n     * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n     * using this parameter.\n     *  @type array\n     *  @default [ 'asc', 'desc' ]\n     *\n     *  @name DataTable.defaults.column.orderSequence\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n     *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n     *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          null,\n     *          { \"orderSequence\": [ \"asc\" ] },\n     *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n     *          { \"orderSequence\": [ \"desc\" ] },\n     *          null\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"asSorting\": ['asc', 'desc'],\n\n    /**\n     * Enable or disable filtering on the data in this column.\n     *  @type boolean\n     *  @default true\n     *\n     *  @name DataTable.defaults.column.searchable\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"searchable\": false, \"targets\": [ 0 ] }\n     *        ] } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"searchable\": false },\n     *          null,\n     *          null,\n     *          null,\n     *          null\n     *        ] } );\n     *    } );\n     */\n    \"bSearchable\": true,\n\n    /**\n     * Enable or disable ordering on this column.\n     *  @type boolean\n     *  @default true\n     *\n     *  @name DataTable.defaults.column.orderable\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"orderable\": false, \"targets\": [ 0 ] }\n     *        ] } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"orderable\": false },\n     *          null,\n     *          null,\n     *          null,\n     *          null\n     *        ] } );\n     *    } );\n     */\n    \"bSortable\": true,\n\n    /**\n     * Enable or disable the display of this column.\n     *  @type boolean\n     *  @default true\n     *\n     *  @name DataTable.defaults.column.visible\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"visible\": false, \"targets\": [ 0 ] }\n     *        ] } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"visible\": false },\n     *          null,\n     *          null,\n     *          null,\n     *          null\n     *        ] } );\n     *    } );\n     */\n    \"bVisible\": true,\n\n    /**\n     * Developer definable function that is called whenever a cell is created (Ajax source,\n     * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n     * allowing you to modify the DOM element (add background colour for example) when the\n     * element is available.\n     *  @type function\n     *  @param {element} td The TD node that has been created\n     *  @param {*} cellData The Data for the cell\n     *  @param {array|object} rowData The data for the whole row\n     *  @param {int} row The row index for the aoData data store\n     *  @param {int} col The column index for aoColumns\n     *\n     *  @name DataTable.defaults.column.createdCell\n     *  @dtopt Columns\n     *\n     *  @example\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [3],\n     *          \"createdCell\": function (td, cellData, rowData, row, col) {\n     *            if ( cellData == \"1.7\" ) {\n     *              $(td).css('color', 'blue')\n     *            }\n     *          }\n     *        } ]\n     *      });\n     *    } );\n     */\n    \"fnCreatedCell\": null,\n\n    /**\n     * This parameter has been replaced by `data` in DataTables to ensure naming\n     * consistency. `dataProp` can still be used, as there is backwards\n     * compatibility in DataTables for this option, but it is strongly\n     * recommended that you use `data` in preference to `dataProp`.\n     *  @name DataTable.defaults.column.dataProp\n     */\n\n    /**\n     * This property can be used to read data from any data source property,\n     * including deeply nested objects / properties. `data` can be given in a\n     * number of different ways which effect its behaviour:\n     *\n     * * `integer` - treated as an array index for the data source. This is the\n     *   default that DataTables uses (incrementally increased for each column).\n     * * `string` - read an object property from the data source. There are\n     *   three 'special' options that can be used in the string to alter how\n     *   DataTables reads the data from the source object:\n     *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n     *      Javascript to read from nested objects, so to can the options\n     *      specified in `data`. For example: `browser.version` or\n     *      `browser.name`. If your object parameter name contains a period, use\n     *      `\\\\` to escape it - i.e. `first\\\\.name`.\n     *    * `[]` - Array notation. DataTables can automatically combine data\n     *      from and array source, joining the data with the characters provided\n     *      between the two brackets. For example: `name[, ]` would provide a\n     *      comma-space separated list from the source array. If no characters\n     *      are provided between the brackets, the original array source is\n     *      returned.\n     *    * `()` - Function notation. Adding `()` to the end of a parameter will\n     *      execute a function of the name given. For example: `browser()` for a\n     *      simple function on the data source, `browser.version()` for a\n     *      function in a nested property or even `browser().version` to get an\n     *      object property if the function called returns an object. Note that\n     *      function notation is recommended for use in `render` rather than\n     *      `data` as it is much simpler to use as a renderer.\n     * * `null` - use the original data source for the row rather than plucking\n     *   data directly from it. This action has effects on two other\n     *   initialisation options:\n     *    * `defaultContent` - When null is given as the `data` option and\n     *      `defaultContent` is specified for the column, the value defined by\n     *      `defaultContent` will be used for the cell.\n     *    * `render` - When null is used for the `data` option and the `render`\n     *      option is specified for the column, the whole data source for the\n     *      row is used for the renderer.\n     * * `function` - the function given will be executed whenever DataTables\n     *   needs to set or get the data for a cell in the column. The function\n     *   takes three parameters:\n     *    * Parameters:\n     *      * `{array|object}` The data source for the row\n     *      * `{string}` The type call data requested - this will be 'set' when\n     *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n     *        when gathering data. Note that when `undefined` is given for the\n     *        type DataTables expects to get the raw data for the object back<\n     *      * `{*}` Data to set when the second parameter is 'set'.\n     *    * Return:\n     *      * The return value from the function is not required when 'set' is\n     *        the type of call, but otherwise the return is what will be used\n     *        for the data requested.\n     *\n     * Note that `data` is a getter and setter option. If you just require\n     * formatting of data for output, you will likely want to use `render` which\n     * is simply a getter and thus simpler to use.\n     *\n     * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n     * name change reflects the flexibility of this property and is consistent\n     * with the naming of mRender. If 'mDataProp' is given, then it will still\n     * be used by DataTables, as it automatically maps the old name to the new\n     * if required.\n     *\n     *  @type string|int|function|null\n     *  @default null <i>Use automatically calculated column index</i>\n     *\n     *  @name DataTable.defaults.column.data\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Read table data from objects\n     *    // JSON structure for each row:\n     *    //   {\n     *    //      \"engine\": {value},\n     *    //      \"browser\": {value},\n     *    //      \"platform\": {value},\n     *    //      \"version\": {value},\n     *    //      \"grade\": {value}\n     *    //   }\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"ajaxSource\": \"sources/objects.txt\",\n     *        \"columns\": [\n     *          { \"data\": \"engine\" },\n     *          { \"data\": \"browser\" },\n     *          { \"data\": \"platform\" },\n     *          { \"data\": \"version\" },\n     *          { \"data\": \"grade\" }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Read information from deeply nested objects\n     *    // JSON structure for each row:\n     *    //   {\n     *    //      \"engine\": {value},\n     *    //      \"browser\": {value},\n     *    //      \"platform\": {\n     *    //         \"inner\": {value}\n     *    //      },\n     *    //      \"details\": [\n     *    //         {value}, {value}\n     *    //      ]\n     *    //   }\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"ajaxSource\": \"sources/deep.txt\",\n     *        \"columns\": [\n     *          { \"data\": \"engine\" },\n     *          { \"data\": \"browser\" },\n     *          { \"data\": \"platform.inner\" },\n     *          { \"data\": \"details.0\" },\n     *          { \"data\": \"details.1\" }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `data` as a function to provide different information for\n     *    // sorting, filtering and display. In this case, currency (price)\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [ 0 ],\n     *          \"data\": function ( source, type, val ) {\n     *            if (type === 'set') {\n     *              source.price = val;\n     *              // Store the computed display and filter values for efficiency\n     *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n     *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n     *              return;\n     *            }\n     *            else if (type === 'display') {\n     *              return source.price_display;\n     *            }\n     *            else if (type === 'filter') {\n     *              return source.price_filter;\n     *            }\n     *            // 'sort', 'type' and undefined all just use the integer\n     *            return source.price;\n     *          }\n     *        } ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using default content\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [ 0 ],\n     *          \"data\": null,\n     *          \"defaultContent\": \"Click to edit\"\n     *        } ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using array notation - outputting a list from an array\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [ 0 ],\n     *          \"data\": \"name[, ]\"\n     *        } ]\n     *      } );\n     *    } );\n     *\n     */\n    \"mData\": null,\n\n    /**\n     * This property is the rendering partner to `data` and it is suggested that\n     * when you want to manipulate data for display (including filtering,\n     * sorting etc) without altering the underlying data for the table, use this\n     * property. `render` can be considered to be the the read only companion to\n     * `data` which is read / write (then as such more complex). Like `data`\n     * this option can be given in a number of different ways to effect its\n     * behaviour:\n     *\n     * * `integer` - treated as an array index for the data source. This is the\n     *   default that DataTables uses (incrementally increased for each column).\n     * * `string` - read an object property from the data source. There are\n     *   three 'special' options that can be used in the string to alter how\n     *   DataTables reads the data from the source object:\n     *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n     *      Javascript to read from nested objects, so to can the options\n     *      specified in `data`. For example: `browser.version` or\n     *      `browser.name`. If your object parameter name contains a period, use\n     *      `\\\\` to escape it - i.e. `first\\\\.name`.\n     *    * `[]` - Array notation. DataTables can automatically combine data\n     *      from and array source, joining the data with the characters provided\n     *      between the two brackets. For example: `name[, ]` would provide a\n     *      comma-space separated list from the source array. If no characters\n     *      are provided between the brackets, the original array source is\n     *      returned.\n     *    * `()` - Function notation. Adding `()` to the end of a parameter will\n     *      execute a function of the name given. For example: `browser()` for a\n     *      simple function on the data source, `browser.version()` for a\n     *      function in a nested property or even `browser().version` to get an\n     *      object property if the function called returns an object.\n     * * `object` - use different data for the different data types requested by\n     *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n     *   of the object is the data type the property refers to and the value can\n     *   defined using an integer, string or function using the same rules as\n     *   `render` normally does. Note that an `_` option _must_ be specified.\n     *   This is the default value to use if you haven't specified a value for\n     *   the data type requested by DataTables.\n     * * `function` - the function given will be executed whenever DataTables\n     *   needs to set or get the data for a cell in the column. The function\n     *   takes three parameters:\n     *    * Parameters:\n     *      * {array|object} The data source for the row (based on `data`)\n     *      * {string} The type call data requested - this will be 'filter',\n     *        'display', 'type' or 'sort'.\n     *      * {array|object} The full data source for the row (not based on\n     *        `data`)\n     *    * Return:\n     *      * The return value from the function is what will be used for the\n     *        data requested.\n     *\n     *  @type string|int|function|object|null\n     *  @default null Use the data source value.\n     *\n     *  @name DataTable.defaults.column.render\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Create a comma separated list from an array of objects\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"ajaxSource\": \"sources/deep.txt\",\n     *        \"columns\": [\n     *          { \"data\": \"engine\" },\n     *          { \"data\": \"browser\" },\n     *          {\n     *            \"data\": \"platform\",\n     *            \"render\": \"[, ].name\"\n     *          }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Execute a function to obtain data\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [ 0 ],\n     *          \"data\": null, // Use the full data source object for the renderer's source\n     *          \"render\": \"browserName()\"\n     *        } ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // As an object, extracting different data for the different types\n     *    // This would be used with a data source such as:\n     *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n     *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n     *    // (which has both forms) is used for filtering for if a user inputs either format, while\n     *    // the formatted phone number is the one that is shown in the table.\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [ 0 ],\n     *          \"data\": null, // Use the full data source object for the renderer's source\n     *          \"render\": {\n     *            \"_\": \"phone\",\n     *            \"filter\": \"phone_filter\",\n     *            \"display\": \"phone_display\"\n     *          }\n     *        } ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Use as a function to create a link from the data source\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [ 0 ],\n     *          \"data\": \"download_link\",\n     *          \"render\": function ( data, type, full ) {\n     *            return '<a href=\"'+data+'\">Download</a>';\n     *          }\n     *        } ]\n     *      } );\n     *    } );\n     */\n    \"mRender\": null,\n\n    /**\n     * Change the cell type created for the column - either TD cells or TH cells. This\n     * can be useful as TH cells have semantic meaning in the table body, allowing them\n     * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n     *  @type string\n     *  @default td\n     *\n     *  @name DataTable.defaults.column.cellType\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Make the first column use TH cells\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [ {\n     *          \"targets\": [ 0 ],\n     *          \"cellType\": \"th\"\n     *        } ]\n     *      } );\n     *    } );\n     */\n    \"sCellType\": \"td\",\n\n    /**\n     * Class to give to each cell in this column.\n     *  @type string\n     *  @default <i>Empty string</i>\n     *\n     *  @name DataTable.defaults.column.class\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"class\": \"my_class\" },\n     *          null,\n     *          null,\n     *          null,\n     *          null\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sClass\": \"\",\n\n    /**\n     * When DataTables calculates the column widths to assign to each column,\n     * it finds the longest string in each column and then constructs a\n     * temporary table and reads the widths from that. The problem with this\n     * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n     * string - thus the calculation can go wrong (doing it properly and putting\n     * it into an DOM object and measuring that is horribly(!) slow). Thus as\n     * a \"work around\" we provide this option. It will append its value to the\n     * text that is found to be the longest string for the column - i.e. padding.\n     * Generally you shouldn't need this!\n     *  @type string\n     *  @default <i>Empty string<i>\n     *\n     *  @name DataTable.defaults.column.contentPadding\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          null,\n     *          null,\n     *          null,\n     *          {\n     *            \"contentPadding\": \"mmm\"\n     *          }\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sContentPadding\": \"\",\n\n    /**\n     * Allows a default value to be given for a column's data, and will be used\n     * whenever a null data source is encountered (this can be because `data`\n     * is set to null, or because the data source itself is null).\n     *  @type string\n     *  @default null\n     *\n     *  @name DataTable.defaults.column.defaultContent\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          {\n     *            \"data\": null,\n     *            \"defaultContent\": \"Edit\",\n     *            \"targets\": [ -1 ]\n     *          }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          null,\n     *          null,\n     *          null,\n     *          {\n     *            \"data\": null,\n     *            \"defaultContent\": \"Edit\"\n     *          }\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sDefaultContent\": null,\n\n    /**\n     * This parameter is only used in DataTables' server-side processing. It can\n     * be exceptionally useful to know what columns are being displayed on the\n     * client side, and to map these to database fields. When defined, the names\n     * also allow DataTables to reorder information from the server if it comes\n     * back in an unexpected order (i.e. if you switch your columns around on the\n     * client-side, your server-side code does not also need updating).\n     *  @type string\n     *  @default <i>Empty string</i>\n     *\n     *  @name DataTable.defaults.column.name\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n     *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n     *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n     *          { \"name\": \"version\", \"targets\": [ 3 ] },\n     *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"name\": \"engine\" },\n     *          { \"name\": \"browser\" },\n     *          { \"name\": \"platform\" },\n     *          { \"name\": \"version\" },\n     *          { \"name\": \"grade\" }\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sName\": \"\",\n\n    /**\n     * Defines a data source type for the ordering which can be used to read\n     * real-time information from the table (updating the internally cached\n     * version) prior to ordering. This allows ordering to occur on user\n     * editable elements such as form inputs.\n     *  @type string\n     *  @default std\n     *\n     *  @name DataTable.defaults.column.orderDataType\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n     *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n     *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n     *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          null,\n     *          null,\n     *          { \"orderDataType\": \"dom-text\" },\n     *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n     *          { \"orderDataType\": \"dom-select\" },\n     *          { \"orderDataType\": \"dom-checkbox\" }\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sSortDataType\": \"std\",\n\n    /**\n     * The title of this column.\n     *  @type string\n     *  @default null <i>Derived from the 'TH' value for this column in the\n     *    original HTML table.</i>\n     *\n     *  @name DataTable.defaults.column.title\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"title\": \"My column title\" },\n     *          null,\n     *          null,\n     *          null,\n     *          null\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sTitle\": null,\n\n    /**\n     * The type allows you to specify how the data for this column will be\n     * ordered. Four types (string, numeric, date and html (which will strip\n     * HTML tags before ordering)) are currently available. Note that only date\n     * formats understood by Javascript's Date() object will be accepted as type\n     * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n     * 'numeric', 'date' or 'html' (by default). Further types can be adding\n     * through plug-ins.\n     *  @type string\n     *  @default null <i>Auto-detected from raw data</i>\n     *\n     *  @name DataTable.defaults.column.type\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"type\": \"html\", \"targets\": [ 0 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"type\": \"html\" },\n     *          null,\n     *          null,\n     *          null,\n     *          null\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sType\": null,\n\n    /**\n     * Defining the width of the column, this parameter may take any CSS value\n     * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n     * been given a specific width through this interface ensuring that the table\n     * remains readable.\n     *  @type string\n     *  @default null <i>Automatic</i>\n     *\n     *  @name DataTable.defaults.column.width\n     *  @dtopt Columns\n     *\n     *  @example\n     *    // Using `columnDefs`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columnDefs\": [\n     *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n     *        ]\n     *      } );\n     *    } );\n     *\n     *  @example\n     *    // Using `columns`\n     *    $(document).ready( function() {\n     *      $('#example').dataTable( {\n     *        \"columns\": [\n     *          { \"width\": \"20%\" },\n     *          null,\n     *          null,\n     *          null,\n     *          null\n     *        ]\n     *      } );\n     *    } );\n     */\n    \"sWidth\": null\n  };\n\n  _fnHungarianMap(DataTable.defaults.column);\n  /**\n   * DataTables settings object - this holds all the information needed for a\n   * given table, including configuration, data and current application of the\n   * table options. DataTables does not have a single instance for each DataTable\n   * with the settings attached to that instance, but rather instances of the\n   * DataTable \"class\" are created on-the-fly as needed (typically by a\n   * $().dataTable() call) and the settings object is then applied to that\n   * instance.\n   *\n   * Note that this object is related to {@link DataTable.defaults} but this\n   * one is the internal data store for DataTables's cache of columns. It should\n   * NOT be manipulated outside of DataTables. Any configuration should be done\n   * through the initialisation options.\n   *  @namespace\n   *  @todo Really should attach the settings object to individual instances so we\n   *    don't need to create new instances on each $().dataTable() call (if the\n   *    table already exists). It would also save passing oSettings around and\n   *    into every single function. However, this is a very significant\n   *    architecture change for DataTables and will almost certainly break\n   *    backwards compatibility with older installations. This is something that\n   *    will be done in 2.0.\n   */\n\n\n  DataTable.models.oSettings = {\n    /**\n     * Primary features of DataTables and their enablement state.\n     *  @namespace\n     */\n    \"oFeatures\": {\n      /**\n       * Flag to say if DataTables should automatically try to calculate the\n       * optimum table and columns widths (true) or not (false).\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bAutoWidth\": null,\n\n      /**\n       * Delay the creation of TR and TD elements until they are actually\n       * needed by a driven page draw. This can give a significant speed\n       * increase for Ajax source and Javascript source data, but makes no\n       * difference at all for DOM and server-side processing tables.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bDeferRender\": null,\n\n      /**\n       * Enable filtering on the table or not. Note that if this is disabled\n       * then there is no filtering at all on the table, including fnFilter.\n       * To just remove the filtering input use sDom and remove the 'f' option.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bFilter\": null,\n\n      /**\n       * Table information element (the 'Showing x of y records' div) enable\n       * flag.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bInfo\": null,\n\n      /**\n       * Present a user control allowing the end user to change the page size\n       * when pagination is enabled.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bLengthChange\": null,\n\n      /**\n       * Pagination enabled or not. Note that if this is disabled then length\n       * changing must also be disabled.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bPaginate\": null,\n\n      /**\n       * Processing indicator enable flag whenever DataTables is enacting a\n       * user request - typically an Ajax request for server-side processing.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bProcessing\": null,\n\n      /**\n       * Server-side processing enabled flag - when enabled DataTables will\n       * get all data from the server for every draw - there is no filtering,\n       * sorting or paging done on the client-side.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bServerSide\": null,\n\n      /**\n       * Sorting enablement flag.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bSort\": null,\n\n      /**\n       * Multi-column sorting\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bSortMulti\": null,\n\n      /**\n       * Apply a class to the columns which are being sorted to provide a\n       * visual highlight or not. This can slow things down when enabled since\n       * there is a lot of DOM interaction.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bSortClasses\": null,\n\n      /**\n       * State saving enablement flag.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bStateSave\": null\n    },\n\n    /**\n     * Scrolling settings for a table.\n     *  @namespace\n     */\n    \"oScroll\": {\n      /**\n       * When the table is shorter in height than sScrollY, collapse the\n       * table container down to the height of the table (when true).\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type boolean\n       */\n      \"bCollapse\": null,\n\n      /**\n       * Width of the scrollbar for the web-browser's platform. Calculated\n       * during table initialisation.\n       *  @type int\n       *  @default 0\n       */\n      \"iBarWidth\": 0,\n\n      /**\n       * Viewport width for horizontal scrolling. Horizontal scrolling is\n       * disabled if an empty string.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type string\n       */\n      \"sX\": null,\n\n      /**\n       * Width to expand the table to when using x-scrolling. Typically you\n       * should not need to use this.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type string\n       *  @deprecated\n       */\n      \"sXInner\": null,\n\n      /**\n       * Viewport height for vertical scrolling. Vertical scrolling is disabled\n       * if an empty string.\n       * Note that this parameter will be set by the initialisation routine. To\n       * set a default use {@link DataTable.defaults}.\n       *  @type string\n       */\n      \"sY\": null\n    },\n\n    /**\n     * Language information for the table.\n     *  @namespace\n     *  @extends DataTable.defaults.oLanguage\n     */\n    \"oLanguage\": {\n      /**\n       * Information callback function. See\n       * {@link DataTable.defaults.fnInfoCallback}\n       *  @type function\n       *  @default null\n       */\n      \"fnInfoCallback\": null\n    },\n\n    /**\n     * Browser support parameters\n     *  @namespace\n     */\n    \"oBrowser\": {\n      /**\n       * Indicate if the browser incorrectly calculates width:100% inside a\n       * scrolling element (IE6/7)\n       *  @type boolean\n       *  @default false\n       */\n      \"bScrollOversize\": false,\n\n      /**\n       * Determine if the vertical scrollbar is on the right or left of the\n       * scrolling container - needed for rtl language layout, although not\n       * all browsers move the scrollbar (Safari).\n       *  @type boolean\n       *  @default false\n       */\n      \"bScrollbarLeft\": false,\n\n      /**\n       * Flag for if `getBoundingClientRect` is fully supported or not\n       *  @type boolean\n       *  @default false\n       */\n      \"bBounding\": false,\n\n      /**\n       * Browser scrollbar width\n       *  @type integer\n       *  @default 0\n       */\n      \"barWidth\": 0\n    },\n    \"ajax\": null,\n\n    /**\n     * Array referencing the nodes which are used for the features. The\n     * parameters of this object match what is allowed by sDom - i.e.\n     *   <ul>\n     *     <li>'l' - Length changing</li>\n     *     <li>'f' - Filtering input</li>\n     *     <li>'t' - The table!</li>\n     *     <li>'i' - Information</li>\n     *     <li>'p' - Pagination</li>\n     *     <li>'r' - pRocessing</li>\n     *   </ul>\n     *  @type array\n     *  @default []\n     */\n    \"aanFeatures\": [],\n\n    /**\n     * Store data information - see {@link DataTable.models.oRow} for detailed\n     * information.\n     *  @type array\n     *  @default []\n     */\n    \"aoData\": [],\n\n    /**\n     * Array of indexes which are in the current display (after filtering etc)\n     *  @type array\n     *  @default []\n     */\n    \"aiDisplay\": [],\n\n    /**\n     * Array of indexes for display - no filtering\n     *  @type array\n     *  @default []\n     */\n    \"aiDisplayMaster\": [],\n\n    /**\n     * Map of row ids to data indexes\n     *  @type object\n     *  @default {}\n     */\n    \"aIds\": {},\n\n    /**\n     * Store information about each column that is in use\n     *  @type array\n     *  @default []\n     */\n    \"aoColumns\": [],\n\n    /**\n     * Store information about the table's header\n     *  @type array\n     *  @default []\n     */\n    \"aoHeader\": [],\n\n    /**\n     * Store information about the table's footer\n     *  @type array\n     *  @default []\n     */\n    \"aoFooter\": [],\n\n    /**\n     * Store the applied global search information in case we want to force a\n     * research or compare the old search to a new one.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @namespace\n     *  @extends DataTable.models.oSearch\n     */\n    \"oPreviousSearch\": {},\n\n    /**\n     * Store the applied search for each column - see\n     * {@link DataTable.models.oSearch} for the format that is used for the\n     * filtering information for each column.\n     *  @type array\n     *  @default []\n     */\n    \"aoPreSearchCols\": [],\n\n    /**\n     * Sorting that is applied to the table. Note that the inner arrays are\n     * used in the following manner:\n     * <ul>\n     *   <li>Index 0 - column number</li>\n     *   <li>Index 1 - current sorting direction</li>\n     * </ul>\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type array\n     *  @todo These inner arrays should really be objects\n     */\n    \"aaSorting\": null,\n\n    /**\n     * Sorting that is always applied to the table (i.e. prefixed in front of\n     * aaSorting).\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type array\n     *  @default []\n     */\n    \"aaSortingFixed\": [],\n\n    /**\n     * Classes to use for the striping of a table.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type array\n     *  @default []\n     */\n    \"asStripeClasses\": null,\n\n    /**\n     * If restoring a table - we should restore its striping classes as well\n     *  @type array\n     *  @default []\n     */\n    \"asDestroyStripes\": [],\n\n    /**\n     * If restoring a table - we should restore its width\n     *  @type int\n     *  @default 0\n     */\n    \"sDestroyWidth\": 0,\n\n    /**\n     * Callback functions array for every time a row is inserted (i.e. on a draw).\n     *  @type array\n     *  @default []\n     */\n    \"aoRowCallback\": [],\n\n    /**\n     * Callback functions for the header on each draw.\n     *  @type array\n     *  @default []\n     */\n    \"aoHeaderCallback\": [],\n\n    /**\n     * Callback function for the footer on each draw.\n     *  @type array\n     *  @default []\n     */\n    \"aoFooterCallback\": [],\n\n    /**\n     * Array of callback functions for draw callback functions\n     *  @type array\n     *  @default []\n     */\n    \"aoDrawCallback\": [],\n\n    /**\n     * Array of callback functions for row created function\n     *  @type array\n     *  @default []\n     */\n    \"aoRowCreatedCallback\": [],\n\n    /**\n     * Callback functions for just before the table is redrawn. A return of\n     * false will be used to cancel the draw.\n     *  @type array\n     *  @default []\n     */\n    \"aoPreDrawCallback\": [],\n\n    /**\n     * Callback functions for when the table has been initialised.\n     *  @type array\n     *  @default []\n     */\n    \"aoInitComplete\": [],\n\n    /**\n     * Callbacks for modifying the settings to be stored for state saving, prior to\n     * saving state.\n     *  @type array\n     *  @default []\n     */\n    \"aoStateSaveParams\": [],\n\n    /**\n     * Callbacks for modifying the settings that have been stored for state saving\n     * prior to using the stored values to restore the state.\n     *  @type array\n     *  @default []\n     */\n    \"aoStateLoadParams\": [],\n\n    /**\n     * Callbacks for operating on the settings object once the saved state has been\n     * loaded\n     *  @type array\n     *  @default []\n     */\n    \"aoStateLoaded\": [],\n\n    /**\n     * Cache the table ID for quick access\n     *  @type string\n     *  @default <i>Empty string</i>\n     */\n    \"sTableId\": \"\",\n\n    /**\n     * The TABLE node for the main table\n     *  @type node\n     *  @default null\n     */\n    \"nTable\": null,\n\n    /**\n     * Permanent ref to the thead element\n     *  @type node\n     *  @default null\n     */\n    \"nTHead\": null,\n\n    /**\n     * Permanent ref to the tfoot element - if it exists\n     *  @type node\n     *  @default null\n     */\n    \"nTFoot\": null,\n\n    /**\n     * Permanent ref to the tbody element\n     *  @type node\n     *  @default null\n     */\n    \"nTBody\": null,\n\n    /**\n     * Cache the wrapper node (contains all DataTables controlled elements)\n     *  @type node\n     *  @default null\n     */\n    \"nTableWrapper\": null,\n\n    /**\n     * Indicate if when using server-side processing the loading of data\n     * should be deferred until the second draw.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type boolean\n     *  @default false\n     */\n    \"bDeferLoading\": false,\n\n    /**\n     * Indicate if all required information has been read in\n     *  @type boolean\n     *  @default false\n     */\n    \"bInitialised\": false,\n\n    /**\n     * Information about open rows. Each object in the array has the parameters\n     * 'nTr' and 'nParent'\n     *  @type array\n     *  @default []\n     */\n    \"aoOpenRows\": [],\n\n    /**\n     * Dictate the positioning of DataTables' control elements - see\n     * {@link DataTable.model.oInit.sDom}.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type string\n     *  @default null\n     */\n    \"sDom\": null,\n\n    /**\n     * Search delay (in mS)\n     *  @type integer\n     *  @default null\n     */\n    \"searchDelay\": null,\n\n    /**\n     * Which type of pagination should be used.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type string\n     *  @default two_button\n     */\n    \"sPaginationType\": \"two_button\",\n\n    /**\n     * The state duration (for `stateSave`) in seconds.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type int\n     *  @default 0\n     */\n    \"iStateDuration\": 0,\n\n    /**\n     * Array of callback functions for state saving. Each array element is an\n     * object with the following parameters:\n     *   <ul>\n     *     <li>function:fn - function to call. Takes two parameters, oSettings\n     *       and the JSON string to save that has been thus far created. Returns\n     *       a JSON string to be inserted into a json object\n     *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n     *     <li>string:sName - name of callback</li>\n     *   </ul>\n     *  @type array\n     *  @default []\n     */\n    \"aoStateSave\": [],\n\n    /**\n     * Array of callback functions for state loading. Each array element is an\n     * object with the following parameters:\n     *   <ul>\n     *     <li>function:fn - function to call. Takes two parameters, oSettings\n     *       and the object stored. May return false to cancel state loading</li>\n     *     <li>string:sName - name of callback</li>\n     *   </ul>\n     *  @type array\n     *  @default []\n     */\n    \"aoStateLoad\": [],\n\n    /**\n     * State that was saved. Useful for back reference\n     *  @type object\n     *  @default null\n     */\n    \"oSavedState\": null,\n\n    /**\n     * State that was loaded. Useful for back reference\n     *  @type object\n     *  @default null\n     */\n    \"oLoadedState\": null,\n\n    /**\n     * Source url for AJAX data for the table.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type string\n     *  @default null\n     */\n    \"sAjaxSource\": null,\n\n    /**\n     * Property from a given object from which to read the table data from. This\n     * can be an empty string (when not server-side processing), in which case\n     * it is  assumed an an array is given directly.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type string\n     */\n    \"sAjaxDataProp\": null,\n\n    /**\n     * The last jQuery XHR object that was used for server-side data gathering.\n     * This can be used for working with the XHR information in one of the\n     * callbacks\n     *  @type object\n     *  @default null\n     */\n    \"jqXHR\": null,\n\n    /**\n     * JSON returned from the server in the last Ajax request\n     *  @type object\n     *  @default undefined\n     */\n    \"json\": undefined,\n\n    /**\n     * Data submitted as part of the last Ajax request\n     *  @type object\n     *  @default undefined\n     */\n    \"oAjaxData\": undefined,\n\n    /**\n     * Function to get the server-side data.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type function\n     */\n    \"fnServerData\": null,\n\n    /**\n     * Functions which are called prior to sending an Ajax request so extra\n     * parameters can easily be sent to the server\n     *  @type array\n     *  @default []\n     */\n    \"aoServerParams\": [],\n\n    /**\n     * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n     * required).\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type string\n     */\n    \"sServerMethod\": null,\n\n    /**\n     * Format numbers for display.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type function\n     */\n    \"fnFormatNumber\": null,\n\n    /**\n     * List of options that can be used for the user selectable length menu.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type array\n     *  @default []\n     */\n    \"aLengthMenu\": null,\n\n    /**\n     * Counter for the draws that the table does. Also used as a tracker for\n     * server-side processing\n     *  @type int\n     *  @default 0\n     */\n    \"iDraw\": 0,\n\n    /**\n     * Indicate if a redraw is being done - useful for Ajax\n     *  @type boolean\n     *  @default false\n     */\n    \"bDrawing\": false,\n\n    /**\n     * Draw index (iDraw) of the last error when parsing the returned data\n     *  @type int\n     *  @default -1\n     */\n    \"iDrawError\": -1,\n\n    /**\n     * Paging display length\n     *  @type int\n     *  @default 10\n     */\n    \"_iDisplayLength\": 10,\n\n    /**\n     * Paging start point - aiDisplay index\n     *  @type int\n     *  @default 0\n     */\n    \"_iDisplayStart\": 0,\n\n    /**\n     * Server-side processing - number of records in the result set\n     * (i.e. before filtering), Use fnRecordsTotal rather than\n     * this property to get the value of the number of records, regardless of\n     * the server-side processing setting.\n     *  @type int\n     *  @default 0\n     *  @private\n     */\n    \"_iRecordsTotal\": 0,\n\n    /**\n     * Server-side processing - number of records in the current display set\n     * (i.e. after filtering). Use fnRecordsDisplay rather than\n     * this property to get the value of the number of records, regardless of\n     * the server-side processing setting.\n     *  @type boolean\n     *  @default 0\n     *  @private\n     */\n    \"_iRecordsDisplay\": 0,\n\n    /**\n     * The classes to use for the table\n     *  @type object\n     *  @default {}\n     */\n    \"oClasses\": {},\n\n    /**\n     * Flag attached to the settings object so you can check in the draw\n     * callback if filtering has been done in the draw. Deprecated in favour of\n     * events.\n     *  @type boolean\n     *  @default false\n     *  @deprecated\n     */\n    \"bFiltered\": false,\n\n    /**\n     * Flag attached to the settings object so you can check in the draw\n     * callback if sorting has been done in the draw. Deprecated in favour of\n     * events.\n     *  @type boolean\n     *  @default false\n     *  @deprecated\n     */\n    \"bSorted\": false,\n\n    /**\n     * Indicate that if multiple rows are in the header and there is more than\n     * one unique cell per column, if the top one (true) or bottom one (false)\n     * should be used for sorting / title by DataTables.\n     * Note that this parameter will be set by the initialisation routine. To\n     * set a default use {@link DataTable.defaults}.\n     *  @type boolean\n     */\n    \"bSortCellsTop\": null,\n\n    /**\n     * Initialisation object that is used for the table\n     *  @type object\n     *  @default null\n     */\n    \"oInit\": null,\n\n    /**\n     * Destroy callback functions - for plug-ins to attach themselves to the\n     * destroy so they can clean up markup and events.\n     *  @type array\n     *  @default []\n     */\n    \"aoDestroyCallback\": [],\n\n    /**\n     * Get the number of records in the current record set, before filtering\n     *  @type function\n     */\n    \"fnRecordsTotal\": function fnRecordsTotal() {\n      return _fnDataSource(this) == 'ssp' ? this._iRecordsTotal * 1 : this.aiDisplayMaster.length;\n    },\n\n    /**\n     * Get the number of records in the current record set, after filtering\n     *  @type function\n     */\n    \"fnRecordsDisplay\": function fnRecordsDisplay() {\n      return _fnDataSource(this) == 'ssp' ? this._iRecordsDisplay * 1 : this.aiDisplay.length;\n    },\n\n    /**\n     * Get the display end point - aiDisplay index\n     *  @type function\n     */\n    \"fnDisplayEnd\": function fnDisplayEnd() {\n      var len = this._iDisplayLength,\n          start = this._iDisplayStart,\n          calc = start + len,\n          records = this.aiDisplay.length,\n          features = this.oFeatures,\n          paginate = features.bPaginate;\n\n      if (features.bServerSide) {\n        return paginate === false || len === -1 ? start + records : Math.min(start + len, this._iRecordsDisplay);\n      } else {\n        return !paginate || calc > records || len === -1 ? records : calc;\n      }\n    },\n\n    /**\n     * The DataTables object for this table\n     *  @type object\n     *  @default null\n     */\n    \"oInstance\": null,\n\n    /**\n     * Unique identifier for each instance of the DataTables object. If there\n     * is an ID on the table node, then it takes that value, otherwise an\n     * incrementing internal counter is used.\n     *  @type string\n     *  @default null\n     */\n    \"sInstance\": null,\n\n    /**\n     * tabindex attribute value that is added to DataTables control elements, allowing\n     * keyboard navigation of the table and its controls.\n     */\n    \"iTabIndex\": 0,\n\n    /**\n     * DIV container for the footer scrolling table if scrolling\n     */\n    \"nScrollHead\": null,\n\n    /**\n     * DIV container for the footer scrolling table if scrolling\n     */\n    \"nScrollFoot\": null,\n\n    /**\n     * Last applied sort\n     *  @type array\n     *  @default []\n     */\n    \"aLastSort\": [],\n\n    /**\n     * Stored plug-in instances\n     *  @type object\n     *  @default {}\n     */\n    \"oPlugins\": {},\n\n    /**\n     * Function used to get a row's id from the row's data\n     *  @type function\n     *  @default null\n     */\n    \"rowIdFn\": null,\n\n    /**\n     * Data location where to store a row's id\n     *  @type string\n     *  @default null\n     */\n    \"rowId\": null\n  };\n  /**\n   * Extension object for DataTables that is used to provide all extension\n   * options.\n   *\n   * Note that the `DataTable.ext` object is available through\n   * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n   * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n   *  @namespace\n   *  @extends DataTable.models.ext\n   */\n\n  /**\n   * DataTables extensions\n   * \n   * This namespace acts as a collection area for plug-ins that can be used to\n   * extend DataTables capabilities. Indeed many of the build in methods\n   * use this method to provide their own capabilities (sorting methods for\n   * example).\n   *\n   * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n   * reasons\n   *\n   *  @namespace\n   */\n\n  DataTable.ext = _ext = {\n    /**\n     * Buttons. For use with the Buttons extension for DataTables. This is\n     * defined here so other extensions can define buttons regardless of load\n     * order. It is _not_ used by DataTables core.\n     *\n     *  @type object\n     *  @default {}\n     */\n    buttons: {},\n\n    /**\n     * Element class names\n     *\n     *  @type object\n     *  @default {}\n     */\n    classes: {},\n\n    /**\n     * DataTables build type (expanded by the download builder)\n     *\n     *  @type string\n     */\n    builder: \"-source-\",\n\n    /**\n     * Error reporting.\n     * \n     * How should DataTables report an error. Can take the value 'alert',\n     * 'throw', 'none' or a function.\n     *\n     *  @type string|function\n     *  @default alert\n     */\n    errMode: \"alert\",\n\n    /**\n     * Feature plug-ins.\n     * \n     * This is an array of objects which describe the feature plug-ins that are\n     * available to DataTables. These feature plug-ins are then available for\n     * use through the `dom` initialisation option.\n     * \n     * Each feature plug-in is described by an object which must have the\n     * following properties:\n     * \n     * * `fnInit` - function that is used to initialise the plug-in,\n     * * `cFeature` - a character so the feature can be enabled by the `dom`\n     *   instillation option. This is case sensitive.\n     *\n     * The `fnInit` function has the following input parameters:\n     *\n     * 1. `{object}` DataTables settings object: see\n     *    {@link DataTable.models.oSettings}\n     *\n     * And the following return is expected:\n     * \n     * * {node|null} The element which contains your feature. Note that the\n     *   return may also be void if your plug-in does not require to inject any\n     *   DOM elements into DataTables control (`dom`) - for example this might\n     *   be useful when developing a plug-in which allows table control via\n     *   keyboard entry\n     *\n     *  @type array\n     *\n     *  @example\n     *    $.fn.dataTable.ext.features.push( {\n     *      \"fnInit\": function( oSettings ) {\n     *        return new TableTools( { \"oDTSettings\": oSettings } );\n     *      },\n     *      \"cFeature\": \"T\"\n     *    } );\n     */\n    feature: [],\n\n    /**\n     * Row searching.\n     * \n     * This method of searching is complimentary to the default type based\n     * searching, and a lot more comprehensive as it allows you complete control\n     * over the searching logic. Each element in this array is a function\n     * (parameters described below) that is called for every row in the table,\n     * and your logic decides if it should be included in the searching data set\n     * or not.\n     *\n     * Searching functions have the following input parameters:\n     *\n     * 1. `{object}` DataTables settings object: see\n     *    {@link DataTable.models.oSettings}\n     * 2. `{array|object}` Data for the row to be processed (same as the\n     *    original format that was passed in as the data source, or an array\n     *    from a DOM data source\n     * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n     *    can be useful to retrieve the `TR` element if you need DOM interaction.\n     *\n     * And the following return is expected:\n     *\n     * * {boolean} Include the row in the searched result set (true) or not\n     *   (false)\n     *\n     * Note that as with the main search ability in DataTables, technically this\n     * is \"filtering\", since it is subtractive. However, for consistency in\n     * naming we call it searching here.\n     *\n     *  @type array\n     *  @default []\n     *\n     *  @example\n     *    // The following example shows custom search being applied to the\n     *    // fourth column (i.e. the data[3] index) based on two input values\n     *    // from the end-user, matching the data in a certain range.\n     *    $.fn.dataTable.ext.search.push(\n     *      function( settings, data, dataIndex ) {\n     *        var min = document.getElementById('min').value * 1;\n     *        var max = document.getElementById('max').value * 1;\n     *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n     *\n     *        if ( min == \"\" && max == \"\" ) {\n     *          return true;\n     *        }\n     *        else if ( min == \"\" && version < max ) {\n     *          return true;\n     *        }\n     *        else if ( min < version && \"\" == max ) {\n     *          return true;\n     *        }\n     *        else if ( min < version && version < max ) {\n     *          return true;\n     *        }\n     *        return false;\n     *      }\n     *    );\n     */\n    search: [],\n\n    /**\n     * Selector extensions\n     *\n     * The `selector` option can be used to extend the options available for the\n     * selector modifier options (`selector-modifier` object data type) that\n     * each of the three built in selector types offer (row, column and cell +\n     * their plural counterparts). For example the Select extension uses this\n     * mechanism to provide an option to select only rows, columns and cells\n     * that have been marked as selected by the end user (`{selected: true}`),\n     * which can be used in conjunction with the existing built in selector\n     * options.\n     *\n     * Each property is an array to which functions can be pushed. The functions\n     * take three attributes:\n     *\n     * * Settings object for the host table\n     * * Options object (`selector-modifier` object type)\n     * * Array of selected item indexes\n     *\n     * The return is an array of the resulting item indexes after the custom\n     * selector has been applied.\n     *\n     *  @type object\n     */\n    selector: {\n      cell: [],\n      column: [],\n      row: []\n    },\n\n    /**\n     * Internal functions, exposed for used in plug-ins.\n     * \n     * Please note that you should not need to use the internal methods for\n     * anything other than a plug-in (and even then, try to avoid if possible).\n     * The internal function may change between releases.\n     *\n     *  @type object\n     *  @default {}\n     */\n    internal: {},\n\n    /**\n     * Legacy configuration options. Enable and disable legacy options that\n     * are available in DataTables.\n     *\n     *  @type object\n     */\n    legacy: {\n      /**\n       * Enable / disable DataTables 1.9 compatible server-side processing\n       * requests\n       *\n       *  @type boolean\n       *  @default null\n       */\n      ajax: null\n    },\n\n    /**\n     * Pagination plug-in methods.\n     * \n     * Each entry in this object is a function and defines which buttons should\n     * be shown by the pagination rendering method that is used for the table:\n     * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n     * buttons are displayed in the document, while the functions here tell it\n     * what buttons to display. This is done by returning an array of button\n     * descriptions (what each button will do).\n     *\n     * Pagination types (the four built in options and any additional plug-in\n     * options defined here) can be used through the `paginationType`\n     * initialisation parameter.\n     *\n     * The functions defined take two parameters:\n     *\n     * 1. `{int} page` The current page index\n     * 2. `{int} pages` The number of pages in the table\n     *\n     * Each function is expected to return an array where each element of the\n     * array can be one of:\n     *\n     * * `first` - Jump to first page when activated\n     * * `last` - Jump to last page when activated\n     * * `previous` - Show previous page when activated\n     * * `next` - Show next page when activated\n     * * `{int}` - Show page of the index given\n     * * `{array}` - A nested array containing the above elements to add a\n     *   containing 'DIV' element (might be useful for styling).\n     *\n     * Note that DataTables v1.9- used this object slightly differently whereby\n     * an object with two functions would be defined for each plug-in. That\n     * ability is still supported by DataTables 1.10+ to provide backwards\n     * compatibility, but this option of use is now decremented and no longer\n     * documented in DataTables 1.10+.\n     *\n     *  @type object\n     *  @default {}\n     *\n     *  @example\n     *    // Show previous, next and current page buttons only\n     *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n     *      return [ 'previous', page, 'next' ];\n     *    };\n     */\n    pager: {},\n    renderer: {\n      pageButton: {},\n      header: {}\n    },\n\n    /**\n     * Ordering plug-ins - custom data source\n     * \n     * The extension options for ordering of data available here is complimentary\n     * to the default type based ordering that DataTables typically uses. It\n     * allows much greater control over the the data that is being used to\n     * order a column, but is necessarily therefore more complex.\n     * \n     * This type of ordering is useful if you want to do ordering based on data\n     * live from the DOM (for example the contents of an 'input' element) rather\n     * than just the static string that DataTables knows of.\n     * \n     * The way these plug-ins work is that you create an array of the values you\n     * wish to be ordering for the column in question and then return that\n     * array. The data in the array much be in the index order of the rows in\n     * the table (not the currently ordering order!). Which order data gathering\n     * function is run here depends on the `dt-init columns.orderDataType`\n     * parameter that is used for the column (if any).\n     *\n     * The functions defined take two parameters:\n     *\n     * 1. `{object}` DataTables settings object: see\n     *    {@link DataTable.models.oSettings}\n     * 2. `{int}` Target column index\n     *\n     * Each function is expected to return an array:\n     *\n     * * `{array}` Data for the column to be ordering upon\n     *\n     *  @type array\n     *\n     *  @example\n     *    // Ordering using `input` node values\n     *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n     *    {\n     *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n     *        return $('input', td).val();\n     *      } );\n     *    }\n     */\n    order: {},\n\n    /**\n     * Type based plug-ins.\n     *\n     * Each column in DataTables has a type assigned to it, either by automatic\n     * detection or by direct assignment using the `type` option for the column.\n     * The type of a column will effect how it is ordering and search (plug-ins\n     * can also make use of the column type if required).\n     *\n     * @namespace\n     */\n    type: {\n      /**\n       * Type detection functions.\n       *\n       * The functions defined in this object are used to automatically detect\n       * a column's type, making initialisation of DataTables super easy, even\n       * when complex data is in the table.\n       *\n       * The functions defined take two parameters:\n       *\n          *  1. `{*}` Data from the column cell to be analysed\n          *  2. `{settings}` DataTables settings object. This can be used to\n          *     perform context specific type detection - for example detection\n          *     based on language settings such as using a comma for a decimal\n          *     place. Generally speaking the options from the settings will not\n          *     be required\n       *\n       * Each function is expected to return:\n       *\n       * * `{string|null}` Data type detected, or null if unknown (and thus\n       *   pass it on to the other type detection functions.\n       *\n       *  @type array\n       *\n       *  @example\n       *    // Currency type detection plug-in:\n       *    $.fn.dataTable.ext.type.detect.push(\n       *      function ( data, settings ) {\n       *        // Check the numeric part\n       *        if ( ! data.substring(1).match(/[0-9]/) ) {\n       *          return null;\n       *        }\n       *\n       *        // Check prefixed by currency\n       *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n       *          return 'currency';\n       *        }\n       *        return null;\n       *      }\n       *    );\n       */\n      detect: [],\n\n      /**\n       * Type based search formatting.\n       *\n       * The type based searching functions can be used to pre-format the\n       * data to be search on. For example, it can be used to strip HTML\n       * tags or to de-format telephone numbers for numeric only searching.\n       *\n       * Note that is a search is not defined for a column of a given type,\n       * no search formatting will be performed.\n       * \n       * Pre-processing of searching data plug-ins - When you assign the sType\n       * for a column (or have it automatically detected for you by DataTables\n       * or a type detection plug-in), you will typically be using this for\n       * custom sorting, but it can also be used to provide custom searching\n       * by allowing you to pre-processing the data and returning the data in\n       * the format that should be searched upon. This is done by adding\n       * functions this object with a parameter name which matches the sType\n       * for that target column. This is the corollary of <i>afnSortData</i>\n       * for searching data.\n       *\n       * The functions defined take a single parameter:\n       *\n          *  1. `{*}` Data from the column cell to be prepared for searching\n       *\n       * Each function is expected to return:\n       *\n       * * `{string|null}` Formatted string that will be used for the searching.\n       *\n       *  @type object\n       *  @default {}\n       *\n       *  @example\n       *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n       *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n       *    }\n       */\n      search: {},\n\n      /**\n       * Type based ordering.\n       *\n       * The column type tells DataTables what ordering to apply to the table\n       * when a column is sorted upon. The order for each type that is defined,\n       * is defined by the functions available in this object.\n       *\n       * Each ordering option can be described by three properties added to\n       * this object:\n       *\n       * * `{type}-pre` - Pre-formatting function\n       * * `{type}-asc` - Ascending order function\n       * * `{type}-desc` - Descending order function\n       *\n       * All three can be used together, only `{type}-pre` or only\n       * `{type}-asc` and `{type}-desc` together. It is generally recommended\n       * that only `{type}-pre` is used, as this provides the optimal\n       * implementation in terms of speed, although the others are provided\n       * for compatibility with existing Javascript sort functions.\n       *\n       * `{type}-pre`: Functions defined take a single parameter:\n       *\n          *  1. `{*}` Data from the column cell to be prepared for ordering\n       *\n       * And return:\n       *\n       * * `{*}` Data to be sorted upon\n       *\n       * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n       * functions, taking two parameters:\n       *\n          *  1. `{*}` Data to compare to the second parameter\n          *  2. `{*}` Data to compare to the first parameter\n       *\n       * And returning:\n       *\n       * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n       *   than the second parameter, ===0 if the two parameters are equal and\n       *   >0 if the first parameter should be sorted height than the second\n       *   parameter.\n       * \n       *  @type object\n       *  @default {}\n       *\n       *  @example\n       *    // Numeric ordering of formatted numbers with a pre-formatter\n       *    $.extend( $.fn.dataTable.ext.type.order, {\n       *      \"string-pre\": function(x) {\n       *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n       *        return parseFloat( a );\n       *      }\n       *    } );\n       *\n       *  @example\n       *    // Case-sensitive string ordering, with no pre-formatting method\n       *    $.extend( $.fn.dataTable.ext.order, {\n       *      \"string-case-asc\": function(x,y) {\n       *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n       *      },\n       *      \"string-case-desc\": function(x,y) {\n       *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n       *      }\n       *    } );\n       */\n      order: {}\n    },\n\n    /**\n     * Unique DataTables instance counter\n     *\n     * @type int\n     * @private\n     */\n    _unique: 0,\n    //\n    // Depreciated\n    // The following properties are retained for backwards compatibility only.\n    // The should not be used in new projects and will be removed in a future\n    // version\n    //\n\n    /**\n     * Version check function.\n     *  @type function\n     *  @depreciated Since 1.10\n     */\n    fnVersionCheck: DataTable.fnVersionCheck,\n\n    /**\n     * Index for what 'this' index API functions should use\n     *  @type int\n     *  @deprecated Since v1.10\n     */\n    iApiIndex: 0,\n\n    /**\n     * jQuery UI class container\n     *  @type object\n     *  @deprecated Since v1.10\n     */\n    oJUIClasses: {},\n\n    /**\n     * Software version\n     *  @type string\n     *  @deprecated Since v1.10\n     */\n    sVersion: DataTable.version\n  }; //\n  // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n  //\n\n  $.extend(_ext, {\n    afnFiltering: _ext.search,\n    aTypes: _ext.type.detect,\n    ofnSearch: _ext.type.search,\n    oSort: _ext.type.order,\n    afnSortData: _ext.order,\n    aoFeatures: _ext.feature,\n    oApi: _ext.internal,\n    oStdClasses: _ext.classes,\n    oPagination: _ext.pager\n  });\n  $.extend(DataTable.ext.classes, {\n    \"sTable\": \"dataTable\",\n    \"sNoFooter\": \"no-footer\",\n\n    /* Paging buttons */\n    \"sPageButton\": \"paginate_button\",\n    \"sPageButtonActive\": \"current\",\n    \"sPageButtonDisabled\": \"disabled\",\n\n    /* Striping classes */\n    \"sStripeOdd\": \"odd\",\n    \"sStripeEven\": \"even\",\n\n    /* Empty row */\n    \"sRowEmpty\": \"dataTables_empty\",\n\n    /* Features */\n    \"sWrapper\": \"dataTables_wrapper\",\n    \"sFilter\": \"dataTables_filter\",\n    \"sInfo\": \"dataTables_info\",\n    \"sPaging\": \"dataTables_paginate paging_\",\n\n    /* Note that the type is postfixed */\n    \"sLength\": \"dataTables_length\",\n    \"sProcessing\": \"dataTables_processing\",\n\n    /* Sorting */\n    \"sSortAsc\": \"sorting_asc\",\n    \"sSortDesc\": \"sorting_desc\",\n    \"sSortable\": \"sorting\",\n\n    /* Sortable in both directions */\n    \"sSortableAsc\": \"sorting_desc_disabled\",\n    \"sSortableDesc\": \"sorting_asc_disabled\",\n    \"sSortableNone\": \"sorting_disabled\",\n    \"sSortColumn\": \"sorting_\",\n\n    /* Note that an int is postfixed for the sorting order */\n\n    /* Filtering */\n    \"sFilterInput\": \"\",\n\n    /* Page length */\n    \"sLengthSelect\": \"\",\n\n    /* Scrolling */\n    \"sScrollWrapper\": \"dataTables_scroll\",\n    \"sScrollHead\": \"dataTables_scrollHead\",\n    \"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n    \"sScrollBody\": \"dataTables_scrollBody\",\n    \"sScrollFoot\": \"dataTables_scrollFoot\",\n    \"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\n    /* Misc */\n    \"sHeaderTH\": \"\",\n    \"sFooterTH\": \"\",\n    // Deprecated\n    \"sSortJUIAsc\": \"\",\n    \"sSortJUIDesc\": \"\",\n    \"sSortJUI\": \"\",\n    \"sSortJUIAscAllowed\": \"\",\n    \"sSortJUIDescAllowed\": \"\",\n    \"sSortJUIWrapper\": \"\",\n    \"sSortIcon\": \"\",\n    \"sJUIHeader\": \"\",\n    \"sJUIFooter\": \"\"\n  });\n  var extPagination = DataTable.ext.pager;\n\n  function _numbers(page, pages) {\n    var numbers = [],\n        buttons = extPagination.numbers_length,\n        half = Math.floor(buttons / 2),\n        i = 1;\n\n    if (pages <= buttons) {\n      numbers = _range(0, pages);\n    } else if (page <= half) {\n      numbers = _range(0, buttons - 2);\n      numbers.push('ellipsis');\n      numbers.push(pages - 1);\n    } else if (page >= pages - 1 - half) {\n      numbers = _range(pages - (buttons - 2), pages);\n      numbers.splice(0, 0, 'ellipsis'); // no unshift in ie6\n\n      numbers.splice(0, 0, 0);\n    } else {\n      numbers = _range(page - half + 2, page + half - 1);\n      numbers.push('ellipsis');\n      numbers.push(pages - 1);\n      numbers.splice(0, 0, 'ellipsis');\n      numbers.splice(0, 0, 0);\n    }\n\n    numbers.DT_el = 'span';\n    return numbers;\n  }\n\n  $.extend(extPagination, {\n    simple: function simple(page, pages) {\n      return ['previous', 'next'];\n    },\n    full: function full(page, pages) {\n      return ['first', 'previous', 'next', 'last'];\n    },\n    numbers: function numbers(page, pages) {\n      return [_numbers(page, pages)];\n    },\n    simple_numbers: function simple_numbers(page, pages) {\n      return ['previous', _numbers(page, pages), 'next'];\n    },\n    full_numbers: function full_numbers(page, pages) {\n      return ['first', 'previous', _numbers(page, pages), 'next', 'last'];\n    },\n    first_last_numbers: function first_last_numbers(page, pages) {\n      return ['first', _numbers(page, pages), 'last'];\n    },\n    // For testing and plug-ins to use\n    _numbers: _numbers,\n    // Number of number buttons (including ellipsis) to show. _Must be odd!_\n    numbers_length: 7\n  });\n  $.extend(true, DataTable.ext.renderer, {\n    pageButton: {\n      _: function _(settings, host, idx, buttons, page, pages) {\n        var classes = settings.oClasses;\n        var lang = settings.oLanguage.oPaginate;\n        var aria = settings.oLanguage.oAria.paginate || {};\n        var btnDisplay, btnClass;\n\n        var attach = function attach(container, buttons) {\n          var i, ien, node, button, tabIndex;\n          var disabledClass = classes.sPageButtonDisabled;\n\n          var clickHandler = function clickHandler(e) {\n            _fnPageChange(settings, e.data.action, true);\n          };\n\n          for (i = 0, ien = buttons.length; i < ien; i++) {\n            button = buttons[i];\n\n            if (Array.isArray(button)) {\n              var inner = $('<' + (button.DT_el || 'div') + '/>').appendTo(container);\n              attach(inner, button);\n            } else {\n              btnDisplay = null;\n              btnClass = button;\n              tabIndex = settings.iTabIndex;\n\n              switch (button) {\n                case 'ellipsis':\n                  container.append('<span class=\"ellipsis\">&#x2026;</span>');\n                  break;\n\n                case 'first':\n                  btnDisplay = lang.sFirst;\n\n                  if (page === 0) {\n                    tabIndex = -1;\n                    btnClass += ' ' + disabledClass;\n                  }\n\n                  break;\n\n                case 'previous':\n                  btnDisplay = lang.sPrevious;\n\n                  if (page === 0) {\n                    tabIndex = -1;\n                    btnClass += ' ' + disabledClass;\n                  }\n\n                  break;\n\n                case 'next':\n                  btnDisplay = lang.sNext;\n\n                  if (pages === 0 || page === pages - 1) {\n                    tabIndex = -1;\n                    btnClass += ' ' + disabledClass;\n                  }\n\n                  break;\n\n                case 'last':\n                  btnDisplay = lang.sLast;\n\n                  if (pages === 0 || page === pages - 1) {\n                    tabIndex = -1;\n                    btnClass += ' ' + disabledClass;\n                  }\n\n                  break;\n\n                default:\n                  btnDisplay = settings.fnFormatNumber(button + 1);\n                  btnClass = page === button ? classes.sPageButtonActive : '';\n                  break;\n              }\n\n              if (btnDisplay !== null) {\n                var tag = settings.oInit.pagingTag || 'a';\n                var disabled = btnClass.indexOf(disabledClass) !== -1;\n                node = $('<' + tag + '>', {\n                  'class': classes.sPageButton + ' ' + btnClass,\n                  'aria-controls': settings.sTableId,\n                  'aria-disabled': disabled ? 'true' : null,\n                  'aria-label': aria[button],\n                  'role': 'link',\n                  'aria-current': btnClass === classes.sPageButtonActive ? 'page' : null,\n                  'data-dt-idx': button,\n                  'tabindex': tabIndex,\n                  'id': idx === 0 && typeof button === 'string' ? settings.sTableId + '_' + button : null\n                }).html(btnDisplay).appendTo(container);\n\n                _fnBindAction(node, {\n                  action: button\n                }, clickHandler);\n              }\n            }\n          }\n        }; // IE9 throws an 'unknown error' if document.activeElement is used\n        // inside an iframe or frame. Try / catch the error. Not good for\n        // accessibility, but neither are frames.\n\n\n        var activeEl;\n\n        try {\n          // Because this approach is destroying and recreating the paging\n          // elements, focus is lost on the select button which is bad for\n          // accessibility. So we want to restore focus once the draw has\n          // completed\n          activeEl = $(host).find(document.activeElement).data('dt-idx');\n        } catch (e) {}\n\n        attach($(host).empty(), buttons);\n\n        if (activeEl !== undefined) {\n          $(host).find('[data-dt-idx=' + activeEl + ']').trigger('focus');\n        }\n      }\n    }\n  }); // Built in type detection. See model.ext.aTypes for information about\n  // what is required from this methods.\n\n  $.extend(DataTable.ext.type.detect, [// Plain numbers - first since V8 detects some plain numbers as dates\n  // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n  function (d, settings) {\n    var decimal = settings.oLanguage.sDecimal;\n    return _isNumber(d, decimal) ? 'num' + decimal : null;\n  }, // Dates (only those recognised by the browser's Date.parse)\n  function (d, settings) {\n    // V8 tries _very_ hard to make a string passed into `Date.parse()`\n    // valid, so we need to use a regex to restrict date formats. Use a\n    // plug-in for anything other than ISO8601 style strings\n    if (d && !(d instanceof Date) && !_re_date.test(d)) {\n      return null;\n    }\n\n    var parsed = Date.parse(d);\n    return parsed !== null && !isNaN(parsed) || _empty(d) ? 'date' : null;\n  }, // Formatted numbers\n  function (d, settings) {\n    var decimal = settings.oLanguage.sDecimal;\n    return _isNumber(d, decimal, true) ? 'num-fmt' + decimal : null;\n  }, // HTML numeric\n  function (d, settings) {\n    var decimal = settings.oLanguage.sDecimal;\n    return _htmlNumeric(d, decimal) ? 'html-num' + decimal : null;\n  }, // HTML numeric, formatted\n  function (d, settings) {\n    var decimal = settings.oLanguage.sDecimal;\n    return _htmlNumeric(d, decimal, true) ? 'html-num-fmt' + decimal : null;\n  }, // HTML (this is strict checking - there must be html)\n  function (d, settings) {\n    return _empty(d) || typeof d === 'string' && d.indexOf('<') !== -1 ? 'html' : null;\n  }]); // Filter formatting functions. See model.ext.ofnSearch for information about\n  // what is required from these methods.\n  // \n  // Note that additional search methods are added for the html numbers and\n  // html formatted numbers by `_addNumericSort()` when we know what the decimal\n  // place is\n\n  $.extend(DataTable.ext.type.search, {\n    html: function html(data) {\n      return _empty(data) ? data : typeof data === 'string' ? data.replace(_re_new_lines, \" \").replace(_re_html, \"\") : '';\n    },\n    string: function string(data) {\n      return _empty(data) ? data : typeof data === 'string' ? data.replace(_re_new_lines, \" \") : data;\n    }\n  });\n\n  var __numericReplace = function __numericReplace(d, decimalPlace, re1, re2) {\n    if (d !== 0 && (!d || d === '-')) {\n      return -Infinity;\n    }\n\n    var type = _typeof(d);\n\n    if (type === 'number' || type === 'bigint') {\n      return d;\n    } // If a decimal place other than `.` is used, it needs to be given to the\n    // function so we can detect it and replace with a `.` which is the only\n    // decimal place Javascript recognises - it is not locale aware.\n\n\n    if (decimalPlace) {\n      d = _numToDecimal(d, decimalPlace);\n    }\n\n    if (d.replace) {\n      if (re1) {\n        d = d.replace(re1, '');\n      }\n\n      if (re2) {\n        d = d.replace(re2, '');\n      }\n    }\n\n    return d * 1;\n  }; // Add the numeric 'deformatting' functions for sorting and search. This is done\n  // in a function to provide an easy ability for the language options to add\n  // additional methods if a non-period decimal place is used.\n\n\n  function _addNumericSort(decimalPlace) {\n    $.each({\n      // Plain numbers\n      \"num\": function num(d) {\n        return __numericReplace(d, decimalPlace);\n      },\n      // Formatted numbers\n      \"num-fmt\": function numFmt(d) {\n        return __numericReplace(d, decimalPlace, _re_formatted_numeric);\n      },\n      // HTML numeric\n      \"html-num\": function htmlNum(d) {\n        return __numericReplace(d, decimalPlace, _re_html);\n      },\n      // HTML numeric, formatted\n      \"html-num-fmt\": function htmlNumFmt(d) {\n        return __numericReplace(d, decimalPlace, _re_html, _re_formatted_numeric);\n      }\n    }, function (key, fn) {\n      // Add the ordering method\n      _ext.type.order[key + decimalPlace + '-pre'] = fn; // For HTML types add a search formatter that will strip the HTML\n\n      if (key.match(/^html\\-/)) {\n        _ext.type.search[key + decimalPlace] = _ext.type.search.html;\n      }\n    });\n  } // Default sort methods\n\n\n  $.extend(_ext.type.order, {\n    // Dates\n    \"date-pre\": function datePre(d) {\n      var ts = Date.parse(d);\n      return isNaN(ts) ? -Infinity : ts;\n    },\n    // html\n    \"html-pre\": function htmlPre(a) {\n      return _empty(a) ? '' : a.replace ? a.replace(/<.*?>/g, \"\").toLowerCase() : a + '';\n    },\n    // string\n    \"string-pre\": function stringPre(a) {\n      // This is a little complex, but faster than always calling toString,\n      // http://jsperf.com/tostring-v-check\n      return _empty(a) ? '' : typeof a === 'string' ? a.toLowerCase() : !a.toString ? '' : a.toString();\n    },\n    // string-asc and -desc are retained only for compatibility with the old\n    // sort methods\n    \"string-asc\": function stringAsc(x, y) {\n      return x < y ? -1 : x > y ? 1 : 0;\n    },\n    \"string-desc\": function stringDesc(x, y) {\n      return x < y ? 1 : x > y ? -1 : 0;\n    }\n  }); // Numeric sorting types - order doesn't matter here\n\n  _addNumericSort('');\n\n  $.extend(true, DataTable.ext.renderer, {\n    header: {\n      _: function _(settings, cell, column, classes) {\n        // No additional mark-up required\n        // Attach a sort listener to update on sort - note that using the\n        // `DT` namespace will allow the event to be removed automatically\n        // on destroy, while the `dt` namespaced event is the one we are\n        // listening for\n        $(settings.nTable).on('order.dt.DT', function (e, ctx, sorting, columns) {\n          if (settings !== ctx) {\n            // need to check this this is the host\n            return; // table, not a nested one\n          }\n\n          var colIdx = column.idx;\n          cell.removeClass(classes.sSortAsc + ' ' + classes.sSortDesc).addClass(columns[colIdx] == 'asc' ? classes.sSortAsc : columns[colIdx] == 'desc' ? classes.sSortDesc : column.sSortingClass);\n        });\n      },\n      jqueryui: function jqueryui(settings, cell, column, classes) {\n        $('<div/>').addClass(classes.sSortJUIWrapper).append(cell.contents()).append($('<span/>').addClass(classes.sSortIcon + ' ' + column.sSortingClassJUI)).appendTo(cell); // Attach a sort listener to update on sort\n\n        $(settings.nTable).on('order.dt.DT', function (e, ctx, sorting, columns) {\n          if (settings !== ctx) {\n            return;\n          }\n\n          var colIdx = column.idx;\n          cell.removeClass(classes.sSortAsc + \" \" + classes.sSortDesc).addClass(columns[colIdx] == 'asc' ? classes.sSortAsc : columns[colIdx] == 'desc' ? classes.sSortDesc : column.sSortingClass);\n          cell.find('span.' + classes.sSortIcon).removeClass(classes.sSortJUIAsc + \" \" + classes.sSortJUIDesc + \" \" + classes.sSortJUI + \" \" + classes.sSortJUIAscAllowed + \" \" + classes.sSortJUIDescAllowed).addClass(columns[colIdx] == 'asc' ? classes.sSortJUIAsc : columns[colIdx] == 'desc' ? classes.sSortJUIDesc : column.sSortingClassJUI);\n        });\n      }\n    }\n  });\n  /*\n   * Public helper functions. These aren't used internally by DataTables, or\n   * called by any of the options passed into DataTables, but they can be used\n   * externally by developers working with DataTables. They are helper functions\n   * to make working with DataTables a little bit easier.\n   */\n\n  var __htmlEscapeEntities = function __htmlEscapeEntities(d) {\n    if (Array.isArray(d)) {\n      d = d.join(',');\n    }\n\n    return typeof d === 'string' ? d.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;') : d;\n  }; // Common logic for moment, luxon or a date action\n\n\n  function __mld(dt, momentFn, luxonFn, dateFn, arg1) {\n    if (window.moment) {\n      return dt[momentFn](arg1);\n    } else if (window.luxon) {\n      return dt[luxonFn](arg1);\n    }\n\n    return dateFn ? dt[dateFn](arg1) : dt;\n  }\n\n  var __mlWarning = false;\n\n  function __mldObj(d, format, locale) {\n    var dt;\n\n    if (window.moment) {\n      dt = window.moment.utc(d, format, locale, true);\n\n      if (!dt.isValid()) {\n        return null;\n      }\n    } else if (window.luxon) {\n      dt = format && typeof d === 'string' ? window.luxon.DateTime.fromFormat(d, format) : window.luxon.DateTime.fromISO(d);\n\n      if (!dt.isValid) {\n        return null;\n      }\n\n      dt.setLocale(locale);\n    } else if (!format) {\n      // No format given, must be ISO\n      dt = new Date(d);\n    } else {\n      if (!__mlWarning) {\n        alert('DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17');\n      }\n\n      __mlWarning = true;\n    }\n\n    return dt;\n  } // Wrapper for date, datetime and time which all operate the same way with the exception of\n  // the output string for auto locale support\n\n\n  function __mlHelper(localeString) {\n    return function (from, to, locale, def) {\n      // Luxon and Moment support\n      // Argument shifting\n      if (arguments.length === 0) {\n        locale = 'en';\n        to = null; // means toLocaleString\n\n        from = null; // means iso8601\n      } else if (arguments.length === 1) {\n        locale = 'en';\n        to = from;\n        from = null;\n      } else if (arguments.length === 2) {\n        locale = to;\n        to = from;\n        from = null;\n      }\n\n      var typeName = 'datetime-' + to; // Add type detection and sorting specific to this date format - we need to be able to identify\n      // date type columns as such, rather than as numbers in extensions. Hence the need for this.\n\n      if (!DataTable.ext.type.order[typeName]) {\n        // The renderer will give the value to type detect as the type!\n        DataTable.ext.type.detect.unshift(function (d) {\n          return d === typeName ? typeName : false;\n        }); // The renderer gives us Moment, Luxon or Date obects for the sorting, all of which have a\n        // `valueOf` which gives milliseconds epoch\n\n        DataTable.ext.type.order[typeName + '-asc'] = function (a, b) {\n          var x = a.valueOf();\n          var y = b.valueOf();\n          return x === y ? 0 : x < y ? -1 : 1;\n        };\n\n        DataTable.ext.type.order[typeName + '-desc'] = function (a, b) {\n          var x = a.valueOf();\n          var y = b.valueOf();\n          return x === y ? 0 : x > y ? -1 : 1;\n        };\n      }\n\n      return function (d, type) {\n        // Allow for a default value\n        if (d === null || d === undefined) {\n          if (def === '--now') {\n            // We treat everything as UTC further down, so no changes are\n            // made, as such need to get the local date / time as if it were\n            // UTC\n            var local = new Date();\n            d = new Date(Date.UTC(local.getFullYear(), local.getMonth(), local.getDate(), local.getHours(), local.getMinutes(), local.getSeconds()));\n          } else {\n            d = '';\n          }\n        }\n\n        if (type === 'type') {\n          // Typing uses the type name for fast matching\n          return typeName;\n        }\n\n        if (d === '') {\n          return type !== 'sort' ? '' : __mldObj('0000-01-01 00:00:00', null, locale);\n        } // Shortcut. If `from` and `to` are the same, we are using the renderer to\n        // format for ordering, not display - its already in the display format.\n\n\n        if (to !== null && from === to && type !== 'sort' && type !== 'type' && !(d instanceof Date)) {\n          return d;\n        }\n\n        var dt = __mldObj(d, from, locale);\n\n        if (dt === null) {\n          return d;\n        }\n\n        if (type === 'sort') {\n          return dt;\n        }\n\n        var formatted = to === null ? __mld(dt, 'toDate', 'toJSDate', '')[localeString]() : __mld(dt, 'format', 'toFormat', 'toISOString', to); // XSS protection\n\n        return type === 'display' ? __htmlEscapeEntities(formatted) : formatted;\n      };\n    };\n  } // Based on locale, determine standard number formatting\n  // Fallback for legacy browsers is US English\n\n\n  var __thousands = ',';\n  var __decimal = '.';\n\n  if (window.Intl !== undefined) {\n    try {\n      var num = new Intl.NumberFormat().formatToParts(100000.1);\n\n      for (var i = 0; i < num.length; i++) {\n        if (num[i].type === 'group') {\n          __thousands = num[i].value;\n        } else if (num[i].type === 'decimal') {\n          __decimal = num[i].value;\n        }\n      }\n    } catch (e) {// noop\n    }\n  } // Formatted date time detection - use by declaring the formats you are going to use\n\n\n  DataTable.datetime = function (format, locale) {\n    var typeName = 'datetime-detect-' + format;\n\n    if (!locale) {\n      locale = 'en';\n    }\n\n    if (!DataTable.ext.type.order[typeName]) {\n      DataTable.ext.type.detect.unshift(function (d) {\n        var dt = __mldObj(d, format, locale);\n\n        return d === '' || dt ? typeName : false;\n      });\n\n      DataTable.ext.type.order[typeName + '-pre'] = function (d) {\n        return __mldObj(d, format, locale) || 0;\n      };\n    }\n  };\n  /**\n   * Helpers for `columns.render`.\n   *\n   * The options defined here can be used with the `columns.render` initialisation\n   * option to provide a display renderer. The following functions are defined:\n   *\n   * * `number` - Will format numeric data (defined by `columns.data`) for\n   *   display, retaining the original unformatted data for sorting and filtering.\n   *   It takes 5 parameters:\n   *   * `string` - Thousands grouping separator\n   *   * `string` - Decimal point indicator\n   *   * `integer` - Number of decimal points to show\n   *   * `string` (optional) - Prefix.\n   *   * `string` (optional) - Postfix (/suffix).\n   * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n   *   parameters.\n   *\n   * @example\n   *   // Column definition using the number renderer\n   *   {\n   *     data: \"salary\",\n   *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n   *   }\n   *\n   * @namespace\n   */\n\n\n  DataTable.render = {\n    date: __mlHelper('toLocaleDateString'),\n    datetime: __mlHelper('toLocaleString'),\n    time: __mlHelper('toLocaleTimeString'),\n    number: function number(thousands, decimal, precision, prefix, postfix) {\n      // Auto locale detection\n      if (thousands === null || thousands === undefined) {\n        thousands = __thousands;\n      }\n\n      if (decimal === null || decimal === undefined) {\n        decimal = __decimal;\n      }\n\n      return {\n        display: function display(d) {\n          if (typeof d !== 'number' && typeof d !== 'string') {\n            return d;\n          }\n\n          if (d === '' || d === null) {\n            return d;\n          }\n\n          var negative = d < 0 ? '-' : '';\n          var flo = parseFloat(d); // If NaN then there isn't much formatting that we can do - just\n          // return immediately, escaping any HTML (this was supposed to\n          // be a number after all)\n\n          if (isNaN(flo)) {\n            return __htmlEscapeEntities(d);\n          }\n\n          flo = flo.toFixed(precision);\n          d = Math.abs(flo);\n          var intPart = parseInt(d, 10);\n          var floatPart = precision ? decimal + (d - intPart).toFixed(precision).substring(2) : ''; // If zero, then can't have a negative prefix\n\n          if (intPart === 0 && parseFloat(floatPart) === 0) {\n            negative = '';\n          }\n\n          return negative + (prefix || '') + intPart.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousands) + floatPart + (postfix || '');\n        }\n      };\n    },\n    text: function text() {\n      return {\n        display: __htmlEscapeEntities,\n        filter: __htmlEscapeEntities\n      };\n    }\n  };\n  /*\n   * This is really a good bit rubbish this method of exposing the internal methods\n   * publicly... - To be fixed in 2.0 using methods on the prototype\n   */\n\n  /**\n   * Create a wrapper function for exporting an internal functions to an external API.\n   *  @param {string} fn API function name\n   *  @returns {function} wrapped function\n   *  @memberof DataTable#internal\n   */\n\n  function _fnExternApiFunc(fn) {\n    return function () {\n      var args = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));\n      return DataTable.ext.internal[fn].apply(this, args);\n    };\n  }\n  /**\n   * Reference to internal functions for use by plug-in developers. Note that\n   * these methods are references to internal functions and are considered to be\n   * private. If you use these methods, be aware that they are liable to change\n   * between versions.\n   *  @namespace\n   */\n\n\n  $.extend(DataTable.ext.internal, {\n    _fnExternApiFunc: _fnExternApiFunc,\n    _fnBuildAjax: _fnBuildAjax,\n    _fnAjaxUpdate: _fnAjaxUpdate,\n    _fnAjaxParameters: _fnAjaxParameters,\n    _fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n    _fnAjaxDataSrc: _fnAjaxDataSrc,\n    _fnAddColumn: _fnAddColumn,\n    _fnColumnOptions: _fnColumnOptions,\n    _fnAdjustColumnSizing: _fnAdjustColumnSizing,\n    _fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n    _fnColumnIndexToVisible: _fnColumnIndexToVisible,\n    _fnVisbleColumns: _fnVisbleColumns,\n    _fnGetColumns: _fnGetColumns,\n    _fnColumnTypes: _fnColumnTypes,\n    _fnApplyColumnDefs: _fnApplyColumnDefs,\n    _fnHungarianMap: _fnHungarianMap,\n    _fnCamelToHungarian: _fnCamelToHungarian,\n    _fnLanguageCompat: _fnLanguageCompat,\n    _fnBrowserDetect: _fnBrowserDetect,\n    _fnAddData: _fnAddData,\n    _fnAddTr: _fnAddTr,\n    _fnNodeToDataIndex: _fnNodeToDataIndex,\n    _fnNodeToColumnIndex: _fnNodeToColumnIndex,\n    _fnGetCellData: _fnGetCellData,\n    _fnSetCellData: _fnSetCellData,\n    _fnSplitObjNotation: _fnSplitObjNotation,\n    _fnGetObjectDataFn: _fnGetObjectDataFn,\n    _fnSetObjectDataFn: _fnSetObjectDataFn,\n    _fnGetDataMaster: _fnGetDataMaster,\n    _fnClearTable: _fnClearTable,\n    _fnDeleteIndex: _fnDeleteIndex,\n    _fnInvalidate: _fnInvalidate,\n    _fnGetRowElements: _fnGetRowElements,\n    _fnCreateTr: _fnCreateTr,\n    _fnBuildHead: _fnBuildHead,\n    _fnDrawHead: _fnDrawHead,\n    _fnDraw: _fnDraw,\n    _fnReDraw: _fnReDraw,\n    _fnAddOptionsHtml: _fnAddOptionsHtml,\n    _fnDetectHeader: _fnDetectHeader,\n    _fnGetUniqueThs: _fnGetUniqueThs,\n    _fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n    _fnFilterComplete: _fnFilterComplete,\n    _fnFilterCustom: _fnFilterCustom,\n    _fnFilterColumn: _fnFilterColumn,\n    _fnFilter: _fnFilter,\n    _fnFilterCreateSearch: _fnFilterCreateSearch,\n    _fnEscapeRegex: _fnEscapeRegex,\n    _fnFilterData: _fnFilterData,\n    _fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n    _fnUpdateInfo: _fnUpdateInfo,\n    _fnInfoMacros: _fnInfoMacros,\n    _fnInitialise: _fnInitialise,\n    _fnInitComplete: _fnInitComplete,\n    _fnLengthChange: _fnLengthChange,\n    _fnFeatureHtmlLength: _fnFeatureHtmlLength,\n    _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n    _fnPageChange: _fnPageChange,\n    _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n    _fnProcessingDisplay: _fnProcessingDisplay,\n    _fnFeatureHtmlTable: _fnFeatureHtmlTable,\n    _fnScrollDraw: _fnScrollDraw,\n    _fnApplyToChildren: _fnApplyToChildren,\n    _fnCalculateColumnWidths: _fnCalculateColumnWidths,\n    _fnThrottle: _fnThrottle,\n    _fnConvertToWidth: _fnConvertToWidth,\n    _fnGetWidestNode: _fnGetWidestNode,\n    _fnGetMaxLenString: _fnGetMaxLenString,\n    _fnStringToCss: _fnStringToCss,\n    _fnSortFlatten: _fnSortFlatten,\n    _fnSort: _fnSort,\n    _fnSortAria: _fnSortAria,\n    _fnSortListener: _fnSortListener,\n    _fnSortAttachListener: _fnSortAttachListener,\n    _fnSortingClasses: _fnSortingClasses,\n    _fnSortData: _fnSortData,\n    _fnSaveState: _fnSaveState,\n    _fnLoadState: _fnLoadState,\n    _fnImplementState: _fnImplementState,\n    _fnSettingsFromNode: _fnSettingsFromNode,\n    _fnLog: _fnLog,\n    _fnMap: _fnMap,\n    _fnBindAction: _fnBindAction,\n    _fnCallbackReg: _fnCallbackReg,\n    _fnCallbackFire: _fnCallbackFire,\n    _fnLengthOverflow: _fnLengthOverflow,\n    _fnRenderer: _fnRenderer,\n    _fnDataSource: _fnDataSource,\n    _fnRowAttributes: _fnRowAttributes,\n    _fnExtend: _fnExtend,\n    _fnCalculateEnd: function _fnCalculateEnd() {} // Used by a lot of plug-ins, but redundant\n    // in 1.10, so this dead-end function is\n    // added to prevent errors\n\n  }); // jQuery access\n\n  $.fn.dataTable = DataTable; // Provide access to the host jQuery object (circular reference)\n\n  DataTable.$ = $; // Legacy aliases\n\n  $.fn.dataTableSettings = DataTable.settings;\n  $.fn.dataTableExt = DataTable.ext; // With a capital `D` we return a DataTables API instance rather than a\n  // jQuery object\n\n  $.fn.DataTable = function (opts) {\n    return $(this).dataTable(opts).api();\n  }; // All properties that are available to $.fn.dataTable should also be\n  // available on $.fn.DataTable\n\n\n  $.each(DataTable, function (prop, val) {\n    $.fn.DataTable[prop] = val;\n  });\n  return DataTable;\n});\n\n//# sourceURL=webpack://rup/./node_modules/datatables.net/js/jquery.dataTables.js?");

/***/ }),

/***/ "./node_modules/datatables.net/js/jquery.dataTables.mjs":
/*!**************************************************************!*\
  !*** ./node_modules/datatables.net/js/jquery.dataTables.mjs ***!
  \**************************************************************/
/*! exports provided: default */
/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n/*! DataTables 1.13.5\n * ©2008-2023 SpryMedia Ltd - datatables.net/license\n */\n\n\n\n// DataTables code uses $ internally, but we want to be able to\n// reassign $ with the `use` method, so it is a regular var.\nvar $ = jquery__WEBPACK_IMPORTED_MODULE_0__;\n\n\nvar DataTable = function ( selector, options )\n{\n\t// Check if called with a window or jQuery object for DOM less applications\n\t// This is for backwards compatibility\n\tif (DataTable.factory(selector, options)) {\n\t\treturn DataTable;\n\t}\n\n\t// When creating with `new`, create a new DataTable, returning the API instance\n\tif (this instanceof DataTable) {\n\t\treturn $(selector).DataTable(options);\n\t}\n\telse {\n\t\t// Argument switching\n\t\toptions = selector;\n\t}\n\n\t/**\n\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t * return the resulting jQuery object.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {object} jQuery object, filtered by the given selector.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Highlight every second row\n\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t *      oTable.fnFilter('Webkit');\n\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t *      oTable.fnFilter('');\n\t *    } );\n\t */\n\tthis.$ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).$( sSelector, oOpts );\n\t};\n\t\n\t\n\t/**\n\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t * rows are found, the data returned is the original data array/object that was used to\n\t * create the row (or a generated array if from a DOM source).\n\t *\n\t * This method is often useful in-combination with $ where both functions are given the\n\t * same parameters and the array indexes will match identically.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t *    entry in the array.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the data from the first row in the table\n\t *      var data = oTable._('tr:first');\n\t *\n\t *      // Do something useful with the data\n\t *      alert( \"First cell is: \"+data[0] );\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to 'Webkit' and get all data for\n\t *      oTable.fnFilter('Webkit');\n\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t *\n\t *      // Do something with the data\n\t *      alert( data.length+\" rows matched the search\" );\n\t *    } );\n\t */\n\tthis._ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t};\n\t\n\t\n\t/**\n\t * Create a DataTables Api instance, with the currently selected tables for\n\t * the Api's context.\n\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t *   or if all tables captured in the jQuery object should be used.\n\t * @return {DataTables.Api}\n\t */\n\tthis.api = function ( traditional )\n\t{\n\t\treturn traditional ?\n\t\t\tnew _Api(\n\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t) :\n\t\t\tnew _Api( this );\n\t};\n\t\n\t\n\t/**\n\t * Add a single new row or multiple rows of data to the table. Please note\n\t * that this is suitable for client-side processing only - if you are using\n\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t *  @param {array|object} data The data to be added to the table. This can be:\n\t *    <ul>\n\t *      <li>1D array of data - add a single row with the data provided</li>\n\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t *      <li>object - data object when using <i>mData</i></li>\n\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t *    </ul>\n\t *  @param {bool} [redraw=true] redraw the table or not\n\t *  @returns {array} An array of integers, representing the list of indexes in\n\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t *    the table.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Global var for counter\n\t *    var giCount = 2;\n\t *\n\t *    $(document).ready(function() {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *    function fnClickAddRow() {\n\t *      $('#example').dataTable().fnAddData( [\n\t *        giCount+\".1\",\n\t *        giCount+\".2\",\n\t *        giCount+\".3\",\n\t *        giCount+\".4\" ]\n\t *      );\n\t *\n\t *      giCount++;\n\t *    }\n\t */\n\tthis.fnAddData = function( data, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\t/* Check if we want to add multiple rows or not */\n\t\tvar rows = Array.isArray(data) && ( Array.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\tapi.rows.add( data ) :\n\t\t\tapi.row.add( data );\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn rows.flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * This function will make DataTables recalculate the column sizes, based on the data\n\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t * through the sWidth parameter). This can be useful when the width of the table's\n\t * parent element changes (for example a window resize).\n\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable( {\n\t *        \"sScrollY\": \"200px\",\n\t *        \"bPaginate\": false\n\t *      } );\n\t *\n\t *      $(window).on('resize', function () {\n\t *        oTable.fnAdjustColumnSizing();\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t{\n\t\tvar api = this.api( true ).columns.adjust();\n\t\tvar settings = api.settings()[0];\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw( false );\n\t\t}\n\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Quickly and simply clear a table\n\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t *      oTable.fnClearTable();\n\t *    } );\n\t */\n\tthis.fnClearTable = function( bRedraw )\n\t{\n\t\tvar api = this.api( true ).clear();\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t * are currently 'open'.\n\t *  @param {node} nTr the table row to 'close'\n\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnClose = function( nTr )\n\t{\n\t\tthis.api( true ).row( nTr ).child.hide();\n\t};\n\t\n\t\n\t/**\n\t * Remove a row for the table\n\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t *    the TR element you want to delete\n\t *  @param {function|null} [callBack] Callback function\n\t *  @param {bool} [redraw=true] Redraw the table or not\n\t *  @returns {array} The row that was deleted\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately remove the first row\n\t *      oTable.fnDeleteRow( 0 );\n\t *    } );\n\t */\n\tthis.fnDeleteRow = function( target, callback, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar rows = api.rows( target );\n\t\tvar settings = rows.settings()[0];\n\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\n\t\trows.remove();\n\t\n\t\tif ( callback ) {\n\t\t\tcallback.call( this, settings, data );\n\t\t}\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn data;\n\t};\n\t\n\t\n\t/**\n\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnDestroy();\n\t *    } );\n\t */\n\tthis.fnDestroy = function ( remove )\n\t{\n\t\tthis.api( true ).destroy( remove );\n\t};\n\t\n\t\n\t/**\n\t * Redraw the table\n\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t *      oTable.fnDraw();\n\t *    } );\n\t */\n\tthis.fnDraw = function( complete )\n\t{\n\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t// into account the new data, but can hold position.\n\t\tthis.api( true ).draw( complete );\n\t};\n\t\n\t\n\t/**\n\t * Filter the input based on data\n\t *  @param {string} sInput String to filter the table on\n\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sometime later - filter...\n\t *      oTable.fnFilter( 'test string' );\n\t *    } );\n\t */\n\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\telse {\n\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\n\t\tapi.draw();\n\t};\n\t\n\t\n\t/**\n\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t * provided parameters.\n\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t *  @param {int} [col] Optional column index that you want the data of.\n\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t *    defined, only data for the designated cell is returned.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Row data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('tr').click( function () {\n\t *        var data = oTable.fnGetData( this );\n\t *        // ... do something with the array / object of data for the row\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Individual cell data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('td').click( function () {\n\t *        var sData = oTable.fnGetData( this );\n\t *        alert( 'The cell clicked on had the value of '+sData );\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnGetData = function( src, col )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( src !== undefined ) {\n\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\n\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\tapi.row( src ).data() || null;\n\t\t}\n\t\n\t\treturn api.data().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t * typically want to use the '$' API method in preference to this as it is more\n\t * flexible.\n\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the nodes from the table\n\t *      var nNodes = oTable.fnGetNodes( );\n\t *    } );\n\t */\n\tthis.fnGetNodes = function( iRow )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\treturn iRow !== undefined ?\n\t\t\tapi.row( iRow ).node() :\n\t\t\tapi.rows().nodes().flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get the array indexes of a particular cell from it's DOM element\n\t * and column index including hidden columns\n\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t *    if given as a cell, an array of [row index, column index (visible),\n\t *    column index (all)] is given.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      $('#example tbody td').click( function () {\n\t *        // Get the position of the current data from the node\n\t *        var aPos = oTable.fnGetPosition( this );\n\t *\n\t *        // Get the data array for this row\n\t *        var aData = oTable.fnGetData( aPos[0] );\n\t *\n\t *        // Update the data array and return the value\n\t *        aData[ aPos[1] ] = 'clicked';\n\t *        this.innerHTML = 'clicked';\n\t *      } );\n\t *\n\t *      // Init DataTables\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnGetPosition = function( node )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\n\t\tif ( nodeName == 'TR' ) {\n\t\t\treturn api.row( node ).index();\n\t\t}\n\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\tvar cell = api.cell( node ).index();\n\t\n\t\t\treturn [\n\t\t\t\tcell.row,\n\t\t\t\tcell.columnVisible,\n\t\t\t\tcell.column\n\t\t\t];\n\t\t}\n\t\treturn null;\n\t};\n\t\n\t\n\t/**\n\t * Check to see if a row is 'open' or not.\n\t *  @param {node} nTr the table row to check\n\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnIsOpen = function( nTr )\n\t{\n\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t};\n\t\n\t\n\t/**\n\t * This function will place a new row directly after a row which is currently\n\t * on display on the page, with the HTML contents that is passed into the\n\t * function. This can be used, for example, to ask for confirmation that a\n\t * particular record should be deleted.\n\t *  @param {node} nTr The table row to 'open'\n\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t *  @param {string} sClass Class to give the new TD cell\n\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t *    first parameter, is not found in the table, this method will silently\n\t *    return.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t{\n\t\treturn this.api( true )\n\t\t\t.row( nTr )\n\t\t\t.child( mHtml, sClass )\n\t\t\t.show()\n\t\t\t.child()[0];\n\t};\n\t\n\t\n\t/**\n\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t * function. With this function you can have a DataTables table go to the next,\n\t * previous, first or last pages.\n\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnPageChange( 'next' );\n\t *    } );\n\t */\n\tthis.fnPageChange = function ( mAction, bRedraw )\n\t{\n\t\tvar api = this.api( true ).page( mAction );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw(false);\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Show a particular column\n\t *  @param {int} iCol The column whose display should be changed\n\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Hide the second column after initialisation\n\t *      oTable.fnSetColumnVis( 1, false );\n\t *    } );\n\t */\n\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t{\n\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.columns.adjust().draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the settings for a particular table for external manipulation\n\t *  @returns {object} DataTables settings object. See\n\t *    {@link DataTable.models.oSettings}\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      var oSettings = oTable.fnSettings();\n\t *\n\t *      // Show an example parameter from the settings\n\t *      alert( oSettings._iDisplayStart );\n\t *    } );\n\t */\n\tthis.fnSettings = function()\n\t{\n\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t};\n\t\n\t\n\t/**\n\t * Sort the table by a particular column\n\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t *    'display index' if you have hidden data entries\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort immediately with columns 0 and 1\n\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t *    } );\n\t */\n\tthis.fnSort = function( aaSort )\n\t{\n\t\tthis.api( true ).order( aaSort ).draw();\n\t};\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *  @param {node} nNode the element to attach the sort listener to\n\t *  @param {int} iColumn the column that a click on this node will sort on\n\t *  @param {function} [fnCallback] callback function when sort is run\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort on column 1, when 'sorter' is clicked on\n\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t *    } );\n\t */\n\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t{\n\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t};\n\t\n\t\n\t/**\n\t * Update a table cell or row - this method will accept either a single value to\n\t * update the cell with, an array of values with one element for each column or\n\t * an object in the same format as the original data source. The function is\n\t * self-referencing in order to make the multi column updates easier.\n\t *  @param {object|array|string} mData Data to update the cell/row with\n\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t *    update a whole row.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t *  @returns {int} 0 on success, 1 on error\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t *    } );\n\t */\n\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\tapi.row( mRow ).data( mData );\n\t\t}\n\t\telse {\n\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t}\n\t\n\t\tif ( bAction === undefined || bAction ) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\treturn 0;\n\t};\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t * to ensure compatibility.\n\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t *    version, or false if this version of DataTales is not suitable\n\t *  @method\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t *    } );\n\t */\n\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\n\n\tvar _that = this;\n\tvar emptyInit = options === undefined;\n\tvar len = this.length;\n\n\tif ( emptyInit ) {\n\t\toptions = {};\n\t}\n\n\tthis.oApi = this.internal = _ext.internal;\n\n\t// Extend with old style plug-in API methods\n\tfor ( var fn in DataTable.ext.internal ) {\n\t\tif ( fn ) {\n\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t}\n\t}\n\n\tthis.each(function() {\n\t\t// For each initialisation we want to give it a clean initialisation\n\t\t// object that can be bashed around\n\t\tvar o = {};\n\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t_fnExtend( o, options, true ) :\n\t\t\toptions;\n\n\t\t/*global oInit,_that,emptyInit*/\n\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\tvar sId = this.getAttribute( 'id' );\n\t\tvar bInitHandedOff = false;\n\t\tvar defaults = DataTable.defaults;\n\t\tvar $this = $(this);\n\t\t\n\t\t\n\t\t/* Sanity check */\n\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t{\n\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/* Backwards compatibility for the defaults */\n\t\t_fnCompatOpts( defaults );\n\t\t_fnCompatCols( defaults.column );\n\t\t\n\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\n\t\t/* Setting up the initialisation object */\n\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ), true );\n\t\t\n\t\t\n\t\t\n\t\t/* Check to see if we are re-initialising a table */\n\t\tvar allSettings = DataTable.settings;\n\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar s = allSettings[i];\n\t\t\n\t\t\t/* Base check on table node */\n\t\t\tif (\n\t\t\t\ts.nTable == this ||\n\t\t\t\t(s.nTHead && s.nTHead.parentNode == this) ||\n\t\t\t\t(s.nTFoot && s.nTFoot.parentNode == this)\n\t\t\t) {\n\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\n\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t{\n\t\t\t\t\treturn s.oInstance;\n\t\t\t\t}\n\t\t\t\telse if ( bDestroy )\n\t\t\t\t{\n\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t */\n\t\t\tif ( s.sTableId == this.id )\n\t\t\t{\n\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Ensure the table has an ID - required for accessibility */\n\t\tif ( sId === null || sId === \"\" )\n\t\t{\n\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\tthis.id = sId;\n\t\t}\n\t\t\n\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\"sInstance\":     sId,\n\t\t\t\"sTableId\":      sId\n\t\t} );\n\t\toSettings.nTable = this;\n\t\toSettings.oApi   = _that.internal;\n\t\toSettings.oInit  = oInit;\n\t\t\n\t\tallSettings.push( oSettings );\n\t\t\n\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\n\t\t// Backwards compatibility, before we apply all the defaults\n\t\t_fnCompatOpts( oInit );\n\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\n\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t{\n\t\t\toInit.iDisplayLength = Array.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t}\n\t\t\n\t\t// Apply the defaults and init options to make a single init object will all\n\t\t// options defined from defaults and instance options.\n\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\n\t\t\n\t\t// Map the initialisation options onto the settings object\n\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\"bPaginate\",\n\t\t\t\"bLengthChange\",\n\t\t\t\"bFilter\",\n\t\t\t\"bSort\",\n\t\t\t\"bSortMulti\",\n\t\t\t\"bInfo\",\n\t\t\t\"bProcessing\",\n\t\t\t\"bAutoWidth\",\n\t\t\t\"bSortClasses\",\n\t\t\t\"bServerSide\",\n\t\t\t\"bDeferRender\"\n\t\t] );\n\t\t_fnMap( oSettings, oInit, [\n\t\t\t\"asStripeClasses\",\n\t\t\t\"ajax\",\n\t\t\t\"fnServerData\",\n\t\t\t\"fnFormatNumber\",\n\t\t\t\"sServerMethod\",\n\t\t\t\"aaSorting\",\n\t\t\t\"aaSortingFixed\",\n\t\t\t\"aLengthMenu\",\n\t\t\t\"sPaginationType\",\n\t\t\t\"sAjaxSource\",\n\t\t\t\"sAjaxDataProp\",\n\t\t\t\"iStateDuration\",\n\t\t\t\"sDom\",\n\t\t\t\"bSortCellsTop\",\n\t\t\t\"iTabIndex\",\n\t\t\t\"fnStateLoadCallback\",\n\t\t\t\"fnStateSaveCallback\",\n\t\t\t\"renderer\",\n\t\t\t\"searchDelay\",\n\t\t\t\"rowId\",\n\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\n\t\t/* Callback functions which are array driven */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\n\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\n\t\t/* Browser support detection */\n\t\t_fnBrowserDetect( oSettings );\n\t\t\n\t\tvar oClasses = oSettings.oClasses;\n\t\t\n\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t$this.addClass( oClasses.sTable );\n\t\t\n\t\t\n\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t{\n\t\t\t/* Display start point, taking into account the save saving */\n\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t}\n\t\t\n\t\tif ( oInit.iDeferLoading !== null )\n\t\t{\n\t\t\toSettings.bDeferLoading = true;\n\t\t\tvar tmp = Array.isArray( oInit.iDeferLoading );\n\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t}\n\t\t\n\t\t/* Language definitions */\n\t\tvar oLanguage = oSettings.oLanguage;\n\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\n\t\tif ( oLanguage.sUrl )\n\t\t{\n\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t */\n\t\t\t$.ajax( {\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t$.extend( true, oLanguage, json, oSettings.oInit.oLanguage );\n\t\t\n\t\t\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t},\n\t\t\t\terror: function () {\n\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tbInitHandedOff = true;\n\t\t}\n\t\telse {\n\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t}\n\t\t\n\t\t/*\n\t\t * Stripes\n\t\t */\n\t\tif ( oInit.asStripeClasses === null )\n\t\t{\n\t\t\toSettings.asStripeClasses =[\n\t\t\t\toClasses.sStripeOdd,\n\t\t\t\toClasses.sStripeEven\n\t\t\t];\n\t\t}\n\t\t\n\t\t/* Remove row stripe classes if they are already on the table row */\n\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\treturn rowOne.hasClass(el);\n\t\t} ) ) !== -1 ) {\n\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t}\n\t\t\n\t\t/*\n\t\t * Columns\n\t\t * See if we should load columns automatically or use defined ones\n\t\t */\n\t\tvar anThs = [];\n\t\tvar aoColumnsInit;\n\t\tvar nThead = this.getElementsByTagName('thead');\n\t\tif ( nThead.length !== 0 )\n\t\t{\n\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t}\n\t\t\n\t\t/* If not given a column array, generate one with nulls */\n\t\tif ( oInit.aoColumns === null )\n\t\t{\n\t\t\taoColumnsInit = [];\n\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\taoColumnsInit.push( null );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t}\n\t\t\n\t\t/* Add the columns */\n\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t{\n\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t}\n\t\t\n\t\t/* Apply the column definitions */\n\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t} );\n\t\t\n\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t * attributes are found\n\t\t */\n\t\tif ( rowOne.length ) {\n\t\t\tvar a = function ( cell, name ) {\n\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t};\n\t\t\n\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\n\t\t\t\tif (! col) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t\t}\n\t\t\n\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\n\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcol._isArrayHost = true;\n\t\t\n\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\t\n\t\tvar features = oSettings.oFeatures;\n\t\tvar loadedInit = function () {\n\t\t\t/*\n\t\t\t * Sorting\n\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t */\n\t\t\n\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t */\n\t\t\t_fnSortingClasses( oSettings );\n\t\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\n\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t} );\n\t\t\n\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t}\n\t\t\t}, 'sc' );\n\t\t\n\t\t\n\t\t\t/*\n\t\t\t * Final init\n\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t */\n\t\t\n\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t} );\n\t\t\n\t\t\tvar thead = $this.children('thead');\n\t\t\tif ( thead.length === 0 ) {\n\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t}\n\t\t\toSettings.nTHead = thead[0];\n\t\t\n\t\t\tvar tbody = $this.children('tbody');\n\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\ttbody = $('<tbody/>').insertAfter(thead);\n\t\t\t}\n\t\t\toSettings.nTBody = tbody[0];\n\t\t\n\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t}\n\t\t\n\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t}\n\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t}\n\t\t\n\t\t\t/* Check if there is data passing into the constructor */\n\t\t\tif ( oInit.aaData ) {\n\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t * to replace it with Ajax data\n\t\t\t\t */\n\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t}\n\t\t\n\t\t\t/* Copy the data index array */\n\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\n\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\toSettings.bInitialised = true;\n\t\t\n\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t * language processor)\n\t\t\t */\n\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t_fnInitialise( oSettings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\n\t\tif ( oInit.bStateSave )\n\t\t{\n\t\t\tfeatures.bStateSave = true;\n\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t}\n\t\telse {\n\t\t\tloadedInit();\n\t\t}\n\t\t\n\t} );\n\t_that = null;\n\treturn this;\n};\n\n\n/*\n * It is useful to have variables which are scoped locally so only the\n * DataTables functions can access them and they don't leak into global space.\n * At the same time these functions are often useful over multiple files in the\n * core and API, so we list, or at least document, all variables which are used\n * by DataTables as private variables here. This also ensures that there is no\n * clashing of variable names and that they can easily referenced for reuse.\n */\n\n\n// Defined else where\n//  _selector_run\n//  _selector_opts\n//  _selector_first\n//  _selector_row_indexes\n\nvar _ext; // DataTable.ext\nvar _Api; // DataTable.Api\nvar _api_register; // DataTable.Api.register\nvar _api_registerPlural; // DataTable.Api.registerPlural\n\nvar _re_dic = {};\nvar _re_new_lines = /[\\r\\n\\u2028]/g;\nvar _re_html = /<.*?>/g;\n\n// This is not strict ISO8601 - Date.parse() is quite lax, although\n// implementations differ between browsers.\nvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\n// Escape regular expression special characters\nvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\n// http://en.wikipedia.org/wiki/Foreign_exchange_market\n// - \\u20BD - Russian ruble.\n// - \\u20a9 - South Korean Won\n// - \\u20BA - Turkish Lira\n// - \\u20B9 - Indian Rupee\n// - R - Brazil (R$) and South Africa\n// - fr - Swiss Franc\n// - kr - Swedish krona, Norwegian krone and Danish krone\n// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n// - Ƀ - Bitcoin\n// - Ξ - Ethereum\n//   standards as thousands separators.\nvar _re_formatted_numeric = /['\\u00A0,$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfkɃΞ]/gi;\n\n\nvar _empty = function ( d ) {\n\treturn !d || d === true || d === '-' ? true : false;\n};\n\n\nvar _intVal = function ( s ) {\n\tvar integer = parseInt( s, 10 );\n\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n};\n\n// Convert from a formatted number with characters other than `.` as the\n// decimal place, to a Javascript number\nvar _numToDecimal = function ( num, decimalPoint ) {\n\t// Cache created regular expressions for speed as this function is called often\n\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t}\n\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\tnum;\n};\n\n\nvar _isNumber = function ( d, decimalPoint, formatted ) {\n\tvar type = typeof d;\n\tvar strType = type === 'string';\n\n\tif ( type === 'number' || type === 'bigint') {\n\t\treturn true;\n\t}\n\n\t// If empty return immediately so there must be a number if it is a\n\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t// as a formatted number for currency\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tif ( decimalPoint && strType ) {\n\t\td = _numToDecimal( d, decimalPoint );\n\t}\n\n\tif ( formatted && strType ) {\n\t\td = d.replace( _re_formatted_numeric, '' );\n\t}\n\n\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n};\n\n\n// A string without HTML in it can be considered to be HTML still\nvar _isHtml = function ( d ) {\n\treturn _empty( d ) || typeof d === 'string';\n};\n\n\nvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tvar html = _isHtml( d );\n\treturn ! html ?\n\t\tnull :\n\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\ttrue :\n\t\t\tnull;\n};\n\n\nvar _pluck = function ( a, prop, prop2 ) {\n\tvar out = [];\n\tvar i=0, ien=a.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) {\n\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\n// Basically the same as _pluck, but rather than looping over `a` we use `order`\n// as the indexes to pick from `a`\nvar _pluck_order = function ( a, order, prop, prop2 )\n{\n\tvar out = [];\n\tvar i=0, ien=order.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _range = function ( len, start )\n{\n\tvar out = [];\n\tvar end;\n\n\tif ( start === undefined ) {\n\t\tstart = 0;\n\t\tend = len;\n\t}\n\telse {\n\t\tend = start;\n\t\tstart = len;\n\t}\n\n\tfor ( var i=start ; i<end ; i++ ) {\n\t\tout.push( i );\n\t}\n\n\treturn out;\n};\n\n\nvar _removeEmpty = function ( a )\n{\n\tvar out = [];\n\n\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\tout.push( a[i] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _stripHtml = function ( d ) {\n\treturn d\n\t\t.replace( _re_html, '' ) // Complete tags\n\t\t.replace(/<script/i, ''); // Safety for incomplete script tag\n};\n\n\n/**\n * Determine if all values in the array are unique. This means we can short\n * cut the _unique method at the cost of a single loop. A sorted array is used\n * to easily check the values.\n *\n * @param  {array} src Source array\n * @return {boolean} true if all unique, false otherwise\n * @ignore\n */\nvar _areAllUnique = function ( src ) {\n\tif ( src.length < 2 ) {\n\t\treturn true;\n\t}\n\n\tvar sorted = src.slice().sort();\n\tvar last = sorted[0];\n\n\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\tif ( sorted[i] === last ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlast = sorted[i];\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Find the unique elements in a source array.\n *\n * @param  {array} src Source array\n * @return {array} Array of unique items\n * @ignore\n */\nvar _unique = function ( src )\n{\n\tif ( _areAllUnique( src ) ) {\n\t\treturn src.slice();\n\t}\n\n\t// A faster unique method is to use object keys to identify used values,\n\t// but this doesn't work with arrays or objects, which we must also\n\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t// information.\n\tvar\n\t\tout = [],\n\t\tval,\n\t\ti, ien=src.length,\n\t\tj, k=0;\n\n\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\tval = src[i];\n\n\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\tif ( out[j] === val ) {\n\t\t\t\tcontinue again;\n\t\t\t}\n\t\t}\n\n\t\tout.push( val );\n\t\tk++;\n\t}\n\n\treturn out;\n};\n\n// Surprisingly this is faster than [].concat.apply\n// https://jsperf.com/flatten-an-array-loop-vs-reduce/2\nvar _flatten = function (out, val) {\n\tif (Array.isArray(val)) {\n\t\tfor (var i=0 ; i<val.length ; i++) {\n\t\t\t_flatten(out, val[i]);\n\t\t}\n\t}\n\telse {\n\t\tout.push(val);\n\t}\n  \n\treturn out;\n}\n\nvar _includes = function (search, start) {\n\tif (start === undefined) {\n\t\tstart = 0;\n\t}\n\n\treturn this.indexOf(search, start) !== -1;\t\n};\n\n// Array.isArray polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\nif (! Array.isArray) {\n    Array.isArray = function(arg) {\n        return Object.prototype.toString.call(arg) === '[object Array]';\n    };\n}\n\nif (! Array.prototype.includes) {\n\tArray.prototype.includes = _includes;\n}\n\n// .trim() polyfill\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\nif (!String.prototype.trim) {\n  String.prototype.trim = function () {\n    return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n  };\n}\n\nif (! String.prototype.includes) {\n\tString.prototype.includes = _includes;\n}\n\n/**\n * DataTables utility methods\n * \n * This namespace provides helper methods that DataTables uses internally to\n * create a DataTable, but which are not exclusively used only for DataTables.\n * These methods can be used by extension authors to save the duplication of\n * code.\n *\n *  @namespace\n */\nDataTable.util = {\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained\n\t * for the throttled function.\n\t *\n\t * @param {function} fn Function to be called\n\t * @param {integer} freq Call frequency in mS\n\t * @return {function} Wrapped function\n\t */\n\tthrottle: function ( fn, freq ) {\n\t\tvar\n\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\tlast,\n\t\t\ttimer;\n\n\t\treturn function () {\n\t\t\tvar\n\t\t\t\tthat = this,\n\t\t\t\tnow  = +new Date(),\n\t\t\t\targs = arguments;\n\n\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\tclearTimeout( timer );\n\n\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\tlast = undefined;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}, frequency );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlast = now;\n\t\t\t\tfn.apply( that, args );\n\t\t\t}\n\t\t};\n\t},\n\n\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *\n\t *  @param {string} val string to escape\n\t *  @returns {string} escaped string\n\t */\n\tescapeRegex: function ( val ) {\n\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t},\n\n\t/**\n\t * Create a function that will write to a nested object or array\n\t * @param {*} source JSON notation string\n\t * @returns Write function\n\t */\n\tset: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn DataTable.util.set( source._ );\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Nothing to do when the data source is null\n\t\t\treturn function () {};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, val, meta) {\n\t\t\t\tsource( data, 'set', val, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t// Like the get, we need to get data from a nested object\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) {\n\t\t\t\t\t// Protect against prototype pollution\n\t\t\t\t\tif (a[i] === '__proto__' || a[i] === 'constructor') {\n\t\t\t\t\t\tthrow new Error('Cannot set prototype values');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\t\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) ) {\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\treturn setData( data, val, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\tdata[source] = val;\n\t\t\t};\n\t\t}\n\t},\n\n\t/**\n\t * Create a function that will read nested objects from arrays, based on JSON notation\n\t * @param {*} source JSON notation string\n\t * @returns Value read\n\t */\n\tget: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t// Build an object of get functions, and wrap them in a single call\n\t\t\tvar o = {};\n\t\t\t$.each( source, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = DataTable.util.get( val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\tvar t = o[type] || o._;\n\t\t\t\treturn t !== undefined ?\n\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\tdata;\n\t\t\t};\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Give an empty string for rendering / sorting etc\n\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\treturn source( data, type, row, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\n\t\t\t\tif ( src !== \"\" ) {\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tif ( Array.isArray( data ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (data === null || data[ a[i] ] === null) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( data === undefined || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn fetchData( data, type, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn data[source];\n\t\t\t};\n\t\t}\n\t}\n};\n\n\n\n/**\n * Create a mapping object that allows camel case parameters to be looked up\n * for their Hungarian counterparts. The mapping is stored in a private\n * parameter called `_hungarianMap` which can be accessed on the source object.\n *  @param {object} o\n *  @memberof DataTable#oApi\n */\nfunction _fnHungarianMap ( o )\n{\n\tvar\n\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\tmatch,\n\t\tnewKey,\n\t\tmap = {};\n\n\t$.each( o, function (key, val) {\n\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\n\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t{\n\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\tmap[ newKey ] = key;\n\n\t\t\tif ( match[1] === 'o' )\n\t\t\t{\n\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t}\n\t\t}\n\t} );\n\n\to._hungarianMap = map;\n}\n\n\n/**\n * Convert from camel case parameters to Hungarian, based on a Hungarian map\n * created by _fnHungarianMap.\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n *  @memberof DataTable#oApi\n */\nfunction _fnCamelToHungarian ( src, user, force )\n{\n\tif ( ! src._hungarianMap ) {\n\t\t_fnHungarianMap( src );\n\t}\n\n\tvar hungarianKey;\n\n\t$.each( user, function (key, val) {\n\t\thungarianKey = src._hungarianMap[ key ];\n\n\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t{\n\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t{\n\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\n\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t}\n\t\t}\n\t} );\n}\n\n\n/**\n * Language compatibility - when certain options are given, and others aren't, we\n * need to duplicate the values over, in order to provide backwards compatibility\n * with older language files.\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnLanguageCompat( lang )\n{\n\t// Note the use of the Hungarian notation for the parameters in this method as\n\t// this is called after the mapping of camelCase to Hungarian\n\tvar defaults = DataTable.defaults.oLanguage;\n\n\t// Default mapping\n\tvar defaultDecimal = defaults.sDecimal;\n\tif ( defaultDecimal ) {\n\t\t_addNumericSort( defaultDecimal );\n\t}\n\n\tif ( lang ) {\n\t\tvar zeroRecords = lang.sZeroRecords;\n\n\t\t// Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t// sZeroRecords - assuming that is given.\n\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t}\n\n\t\t// Likewise with loading records\n\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t}\n\n\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\tif ( lang.sInfoThousands ) {\n\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t}\n\n\t\tvar decimal = lang.sDecimal;\n\t\tif ( decimal && defaultDecimal !== decimal ) {\n\t\t\t_addNumericSort( decimal );\n\t\t}\n\t}\n}\n\n\n/**\n * Map one parameter onto another\n *  @param {object} o Object to map\n *  @param {*} knew The new parameter name\n *  @param {*} old The old parameter name\n */\nvar _fnCompatMap = function ( o, knew, old ) {\n\tif ( o[ knew ] !== undefined ) {\n\t\to[ old ] = o[ knew ];\n\t}\n};\n\n\n/**\n * Provide backwards compatibility for the main DT options. Note that the new\n * options are mapped onto the old parameters, so this is an external interface\n * change only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatOpts ( init )\n{\n\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t_fnCompatMap( init, 'searching',     'bFilter' );\n\n\t// Boolean initialisation of x-scrolling\n\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t}\n\tif ( typeof init.scrollX === 'boolean' ) {\n\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t}\n\n\t// Column search objects are in an array, so it needs to be converted\n\t// element by element\n\tvar searchCols = init.aoSearchCols;\n\n\tif ( searchCols ) {\n\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\tif ( searchCols[i] ) {\n\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Provide backwards compatibility for column options. Note that the new options\n * are mapped onto the old parameters, so this is an external interface change\n * only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatCols ( init )\n{\n\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\n\t// orderData can be given as an integer\n\tvar dataSort = init.aDataSort;\n\tif ( typeof dataSort === 'number' && ! Array.isArray( dataSort ) ) {\n\t\tinit.aDataSort = [ dataSort ];\n\t}\n}\n\n\n/**\n * Browser feature detection for capabilities, quirks\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBrowserDetect( settings )\n{\n\t// We don't need to do this every time DataTables is constructed, the values\n\t// calculated are specific to the browser and OS configuration which we\n\t// don't expect to change between initialisations\n\tif ( ! DataTable.__browser ) {\n\t\tvar browser = {};\n\t\tDataTable.__browser = browser;\n\n\t\t// Scrolling feature / quirks detection\n\t\tvar n = $('<div/>')\n\t\t\t.css( {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\theight: 1,\n\t\t\t\twidth: 1,\n\t\t\t\toverflow: 'hidden'\n\t\t\t} )\n\t\t\t.append(\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.appendTo( 'body' );\n\n\t\tvar outer = n.children();\n\t\tvar inner = outer.children();\n\n\t\t// Numbers below, in order, are:\n\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t//\n\t\t// IE6 XP:                           100 100 100  83\n\t\t// IE7 Vista:                        100 100 100  83\n\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t// Evergreen Windows:                 83  83 100  83\n\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\n\t\t// Get scrollbar width\n\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\n\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t// element is contained without forcing scrolling\n\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\n\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t// scrollbar on the left, rather than the right.\n\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\n\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\n\t\tn.remove();\n\t}\n\n\t$.extend( settings.oBrowser, DataTable.__browser );\n\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n}\n\n\n/**\n * Array.prototype reduce[Right] method, used for browsers which don't support\n * JS 1.6. Done this way to reduce code size, since we iterate either way\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnReduce ( that, fn, init, start, end, inc )\n{\n\tvar\n\t\ti = start,\n\t\tvalue,\n\t\tisSet = false;\n\n\tif ( init !== undefined ) {\n\t\tvalue = init;\n\t\tisSet = true;\n\t}\n\n\twhile ( i !== end ) {\n\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalue = isSet ?\n\t\t\tfn( value, that[i], i, that ) :\n\t\t\tthat[i];\n\n\t\tisSet = true;\n\t\ti += inc;\n\t}\n\n\treturn value;\n}\n\n/**\n * Add a column to the list used for the table with default values\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nTh The th element for this column\n *  @memberof DataTable#oApi\n */\nfunction _fnAddColumn( oSettings, nTh )\n{\n\t// Add column to aoColumns array\n\tvar oDefaults = DataTable.defaults.column;\n\tvar iCol = oSettings.aoColumns.length;\n\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\tidx: iCol\n\t} );\n\toSettings.aoColumns.push( oCol );\n\n\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t// passed into extend can be undefined. This allows the user to give a default\n\t// with only some of the parameters defined, and also not give a default\n\tvar searchCols = oSettings.aoPreSearchCols;\n\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\n\t// Use the default column options function to initialise classes etc\n\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n}\n\n\n/**\n * Apply options for a column\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iCol column index to consider\n *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnOptions( oSettings, iCol, oOptions )\n{\n\tvar oCol = oSettings.aoColumns[ iCol ];\n\tvar oClasses = oSettings.oClasses;\n\tvar th = $(oCol.nTh);\n\n\t// Try to get width information from the DOM. We can't get it from CSS\n\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\tif ( ! oCol.sWidthOrig ) {\n\t\t// Width attribute\n\t\toCol.sWidthOrig = th.attr('width') || null;\n\n\t\t// Style attribute\n\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\tif ( t ) {\n\t\t\toCol.sWidthOrig = t[1];\n\t\t}\n\t}\n\n\t/* User specified column options */\n\tif ( oOptions !== undefined && oOptions !== null )\n\t{\n\t\t// Backwards compatibility\n\t\t_fnCompatCols( oOptions );\n\n\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );\n\n\t\t/* Backwards compatibility for mDataProp */\n\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t{\n\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t}\n\n\t\tif ( oOptions.sType )\n\t\t{\n\t\t\toCol._sManualType = oOptions.sType;\n\t\t}\n\n\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t// the ability to use a valid name for the camel case input\n\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t{\n\t\t\toOptions.sClass = oOptions.className;\n\t\t}\n\t\tif ( oOptions.sClass ) {\n\t\t\tth.addClass( oOptions.sClass );\n\t\t}\n\n\t\tvar origClass = oCol.sClass;\n\n\t\t$.extend( oCol, oOptions );\n\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\n\t\t// Merge class from previously defined classes with this one, rather than just\n\t\t// overwriting it in the extend above\n\t\tif (origClass !== oCol.sClass) {\n\t\t\toCol.sClass = origClass + ' ' + oCol.sClass;\n\t\t}\n\n\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t * priority if defined\n\t\t */\n\t\tif ( oOptions.iDataSort !== undefined )\n\t\t{\n\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t}\n\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t}\n\n\t/* Cache the data get and set functions for speed */\n\tvar mDataSrc = oCol.mData;\n\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\n\tvar attrTest = function( src ) {\n\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t};\n\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t);\n\toCol._setter = null;\n\n\toCol.fnGetData = function (rowData, type, meta) {\n\t\tvar innerData = mData( rowData, type, undefined, meta );\n\n\t\treturn mRender && type ?\n\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\tinnerData;\n\t};\n\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t};\n\n\t// Indicate if DataTables should read DOM data as an object or array\n\t// Used in _fnGetRowElements\n\tif ( typeof mDataSrc !== 'number' && ! oCol._isArrayHost ) {\n\t\toSettings._rowReadObject = true;\n\t}\n\n\t/* Feature sorting overrides column specific when off */\n\tif ( !oSettings.oFeatures.bSort )\n\t{\n\t\toCol.bSortable = false;\n\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t}\n\n\t/* Check that the class assignment is correct for sorting */\n\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\toCol.sSortingClassJUI = \"\";\n\t}\n\telse if ( bAsc && !bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t}\n\telse if ( !bAsc && bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t}\n\telse\n\t{\n\t\toCol.sSortingClass = oClasses.sSortable;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t}\n}\n\n\n/**\n * Adjust the table column widths for new data. Note: you would probably want to\n * do a redraw after calling this function!\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAdjustColumnSizing ( settings )\n{\n\t/* Not interested in doing column width calculation if auto-width is disabled */\n\tif ( settings.oFeatures.bAutoWidth !== false )\n\t{\n\t\tvar columns = settings.aoColumns;\n\n\t\t_fnCalculateColumnWidths( settings );\n\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t}\n\t}\n\n\tvar scroll = settings.oScroll;\n\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t{\n\t\t_fnScrollDraw( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n}\n\n\n/**\n * Convert the index of a visible column to the index in the data array (take account\n * of hidden columns)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iMatch Visible column index to lookup\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\n\treturn typeof aiVis[iMatch] === 'number' ?\n\t\taiVis[iMatch] :\n\t\tnull;\n}\n\n\n/**\n * Convert the index of an index in the data array and convert it to the visible\n *   column index (take account of hidden columns)\n *  @param {int} iMatch Column index to lookup\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnIndexToVisible( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\tvar iPos = $.inArray( iMatch, aiVis );\n\n\treturn iPos !== -1 ? iPos : null;\n}\n\n\n/**\n * Get the number of visible columns\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the number of visible columns\n *  @memberof DataTable#oApi\n */\nfunction _fnVisbleColumns( oSettings )\n{\n\tvar vis = 0;\n\n\t// No reduce in IE8, use a loop for now\n\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\tvis++;\n\t\t}\n\t} );\n\n\treturn vis;\n}\n\n\n/**\n * Get an array of column indexes that match a given property\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sParam Parameter in aoColumns to look for - typically\n *    bVisible or bSearchable\n *  @returns {array} Array of indexes with matched properties\n *  @memberof DataTable#oApi\n */\nfunction _fnGetColumns( oSettings, sParam )\n{\n\tvar a = [];\n\n\t$.map( oSettings.aoColumns, function(val, i) {\n\t\tif ( val[sParam] ) {\n\t\t\ta.push( i );\n\t\t}\n\t} );\n\n\treturn a;\n}\n\n\n/**\n * Calculate the 'type' of a column\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnTypes ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar data = settings.aoData;\n\tvar types = DataTable.ext.type.detect;\n\tvar i, ien, j, jen, k, ken;\n\tvar col, cell, detectedType, cache;\n\n\t// For each column, spin over the \n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcol = columns[i];\n\t\tcache = [];\n\n\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\tcol.sType = col._sManualType;\n\t\t}\n\t\telse if ( ! col.sType ) {\n\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\n\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t// types\n\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t// bottom of the pile and very similar to string - but it\n\t\t\t\t\t// must not be empty\n\t\t\t\t\tif ( detectedType === 'html' && ! _empty(cache[k]) ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t// type\n\t\t\t\tif ( detectedType ) {\n\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fall back - if no type was detected, always use string\n\t\t\tif ( ! col.sType ) {\n\t\t\t\tcol.sType = 'string';\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Take the column definitions and static columns arrays and calculate how\n * they relate to column indexes. The callback function will then apply the\n * definition found for a column to a suitable configuration object.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n *  @param {array} aoCols The aoColumns array that defines columns individually\n *  @param {function} fn Callback function - takes two parameters, the calculated\n *    column index and the definition for that column.\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n{\n\tvar i, iLen, j, jLen, k, kLen, def;\n\tvar columns = oSettings.aoColumns;\n\n\t// Column definitions with aTargets\n\tif ( aoColDefs )\n\t{\n\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t{\n\t\t\tdef = aoColDefs[i];\n\n\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\tvar aTargets = def.target !== undefined\n\t\t\t\t? def.target\n\t\t\t\t: def.targets !== undefined\n\t\t\t\t\t? def.targets\n\t\t\t\t\t: def.aTargets;\n\n\t\t\tif ( ! Array.isArray( aTargets ) )\n\t\t\t{\n\t\t\t\taTargets = [ aTargets ];\n\t\t\t}\n\n\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t{\n\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Statically defined columns array\n\tif ( aoCols )\n\t{\n\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfn( i, aoCols[i] );\n\t\t}\n\t}\n}\n\n/**\n * Add a data array to the table, creating DOM node etc. This is the parallel to\n * _fnGatherData, but for adding rows from a Javascript source, rather than a\n * DOM source.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aData data array to be added\n *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n *  @memberof DataTable#oApi\n */\nfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n{\n\t/* Create the object for storing information about this new row */\n\tvar iRow = oSettings.aoData.length;\n\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\tsrc: nTr ? 'dom' : 'data',\n\t\tidx: iRow\n\t} );\n\n\toData._aData = aDataIn;\n\toSettings.aoData.push( oData );\n\n\t/* Create the cells */\n\tvar nTd, sThisType;\n\tvar columns = oSettings.aoColumns;\n\n\t// Invalidate the column types as the new data needs to be revalidated\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tcolumns[i].sType = null;\n\t}\n\n\t/* Add to the display array */\n\toSettings.aiDisplayMaster.push( iRow );\n\n\tvar id = oSettings.rowIdFn( aDataIn );\n\tif ( id !== undefined ) {\n\t\toSettings.aIds[ id ] = oData;\n\t}\n\n\t/* Create the DOM information, or register it if already present */\n\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t{\n\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t}\n\n\treturn iRow;\n}\n\n\n/**\n * Add one or more TR elements to the table. Generally we'd expect to\n * use this for reading data from a DOM sourced table, but it could be\n * used for an TR element. Note that if a TR is given, it is used (i.e.\n * it is not cloned).\n *  @param {object} settings dataTables settings object\n *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n *  @returns {array} Array of indexes for the added rows\n *  @memberof DataTable#oApi\n */\nfunction _fnAddTr( settings, trs )\n{\n\tvar row;\n\n\t// Allow an individual node to be passed in\n\tif ( ! (trs instanceof $) ) {\n\t\ttrs = $(trs);\n\t}\n\n\treturn trs.map( function (i, el) {\n\t\trow = _fnGetRowElements( settings, el );\n\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t} );\n}\n\n\n/**\n * Take a TR element and convert it to an index in aoData\n *  @param {object} oSettings dataTables settings object\n *  @param {node} n the TR element to find\n *  @returns {int} index if the node is found, null if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToDataIndex( oSettings, n )\n{\n\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n}\n\n\n/**\n * Take a TD element and convert it into a column data index (not the visible index)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow The row number the TD/TH can be found in\n *  @param {node} n The TD/TH element to find\n *  @returns {int} index if the node is found, -1 if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n{\n\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n}\n\n\n/**\n * Get the data for a given cell from the internal cache, taking into account data mapping\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {string} type data get type ('display', 'type' 'filter|search' 'sort|order')\n *  @returns {*} Cell data\n *  @memberof DataTable#oApi\n */\nfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n{\n\tif (type === 'search') {\n\t\ttype = 'filter';\n\t}\n\telse if (type === 'order') {\n\t\ttype = 'sort';\n\t}\n\n\tvar draw           = settings.iDraw;\n\tvar col            = settings.aoColumns[colIdx];\n\tvar rowData        = settings.aoData[rowIdx]._aData;\n\tvar defaultContent = col.sDefaultContent;\n\tvar cellData       = col.fnGetData( rowData, type, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t} );\n\n\tif ( cellData === undefined ) {\n\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\tsettings.iDrawError = draw;\n\t\t}\n\t\treturn defaultContent;\n\t}\n\n\t// When the data source is null and a specific data type is requested (i.e.\n\t// not the original data), we can use default column data\n\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\tcellData = defaultContent;\n\t}\n\telse if ( typeof cellData === 'function' ) {\n\t\t// If the data source is a function, then we run it and use the return,\n\t\t// executing in the scope of the data object (for instances)\n\t\treturn cellData.call( rowData );\n\t}\n\n\tif ( cellData === null && type === 'display' ) {\n\t\treturn '';\n\t}\n\n\tif ( type === 'filter' ) {\n\t\tvar fomatters = DataTable.ext.type.search;\n\n\t\tif ( fomatters[ col.sType ] ) {\n\t\t\tcellData = fomatters[ col.sType ]( cellData );\n\t\t}\n\t}\n\n\treturn cellData;\n}\n\n\n/**\n * Set the value for a specific cell, into the internal data cache\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {*} val Value to set\n *  @memberof DataTable#oApi\n */\nfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n{\n\tvar col     = settings.aoColumns[colIdx];\n\tvar rowData = settings.aoData[rowIdx]._aData;\n\n\tcol.fnSetData( rowData, val, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t}  );\n}\n\n\n// Private variable that is used to match action syntax in the data property object\nvar __reArray = /\\[.*?\\]$/;\nvar __reFn = /\\(\\)$/;\n\n/**\n * Split string on periods, taking into account escaped periods\n * @param  {string} str String to split\n * @return {array} Split string\n */\nfunction _fnSplitObjNotation( str )\n{\n\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\treturn s.replace(/\\\\\\./g, '.');\n\t} );\n}\n\n\n/**\n * Return a function that can be used to get data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data get function\n *  @memberof DataTable#oApi\n */\nvar _fnGetObjectDataFn = DataTable.util.get;\n\n\n/**\n * Return a function that can be used to set data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data set function\n *  @memberof DataTable#oApi\n */\nvar _fnSetObjectDataFn = DataTable.util.set;\n\n\n/**\n * Return an array with the full table data\n *  @param {object} oSettings dataTables settings object\n *  @returns array {array} aData Master data array\n *  @memberof DataTable#oApi\n */\nfunction _fnGetDataMaster ( settings )\n{\n\treturn _pluck( settings.aoData, '_aData' );\n}\n\n\n/**\n * Nuke the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnClearTable( settings )\n{\n\tsettings.aoData.length = 0;\n\tsettings.aiDisplayMaster.length = 0;\n\tsettings.aiDisplay.length = 0;\n\tsettings.aIds = {};\n}\n\n\n /**\n * Take an array of integers (index array) and remove a target integer (value - not\n * the key!)\n *  @param {array} a Index array to target\n *  @param {int} iTarget value to find\n *  @memberof DataTable#oApi\n */\nfunction _fnDeleteIndex( a, iTarget, splice )\n{\n\tvar iTargetIndex = -1;\n\n\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t{\n\t\tif ( a[i] == iTarget )\n\t\t{\n\t\t\tiTargetIndex = i;\n\t\t}\n\t\telse if ( a[i] > iTarget )\n\t\t{\n\t\t\ta[i]--;\n\t\t}\n\t}\n\n\tif ( iTargetIndex != -1 && splice === undefined )\n\t{\n\t\ta.splice( iTargetIndex, 1 );\n\t}\n}\n\n\n/**\n * Mark cached data as invalid such that a re-read of the data will occur when\n * the cached data is next requested. Also update from the data source object.\n *\n * @param {object} settings DataTables settings object\n * @param {int}    rowIdx   Row index to invalidate\n * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n *     or 'data'\n * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n *     row will be invalidated\n * @memberof DataTable#oApi\n *\n * @todo For the modularisation of v1.11 this will need to become a callback, so\n *   the sort and filter methods can subscribe to it. That will required\n *   initialisation options for sorting, which is why it is not already baked in\n */\nfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n{\n\tvar row = settings.aoData[ rowIdx ];\n\tvar i, ien;\n\tvar cellWrite = function ( cell, col ) {\n\t\t// This is very frustrating, but in IE if you just write directly\n\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t// even if there is a reference to them elsewhere\n\t\twhile ( cell.childNodes.length ) {\n\t\t\tcell.removeChild( cell.firstChild );\n\t\t}\n\n\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t};\n\n\t// Are we reading last data from DOM or the data object?\n\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t// Read the data from the DOM\n\t\trow._aData = _fnGetRowElements(\n\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t)\n\t\t\t.data;\n\t}\n\telse {\n\t\t// Reading from data object, update the DOM\n\t\tvar cells = row.anCells;\n\n\t\tif ( cells ) {\n\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// For both row and cell invalidation, the cached data for sorting and\n\t// filtering is nulled out\n\trow._aSortData = null;\n\trow._aFilterData = null;\n\n\t// Invalidate the type for a specific column (if given) or all columns since\n\t// the data might have changed\n\tvar cols = settings.aoColumns;\n\tif ( colIdx !== undefined ) {\n\t\tcols[ colIdx ].sType = null;\n\t}\n\telse {\n\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\tcols[i].sType = null;\n\t\t}\n\n\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t_fnRowAttributes( settings, row );\n\t}\n}\n\n\n/**\n * Build a data source object from an HTML row, reading the contents of the\n * cells that are in the row.\n *\n * @param {object} settings DataTables settings object\n * @param {node|object} TR element from which to read data or existing row\n *   object from which to re-read the data from the cells\n * @param {int} [colIdx] Optional column index\n * @param {array|object} [d] Data source object. If `colIdx` is given then this\n *   parameter should also be given and will be used to write the data into.\n *   Only the column in question will be written\n * @returns {object} Object with two parameters: `data` the data read, in\n *   document order, and `cells` and array of nodes (they can be useful to the\n *   caller, so rather than needing a second traversal to get them, just return\n *   them from here).\n * @memberof DataTable#oApi\n */\nfunction _fnGetRowElements( settings, row, colIdx, d )\n{\n\tvar\n\t\ttds = [],\n\t\ttd = row.firstChild,\n\t\tname, col, o, i=0, contents,\n\t\tcolumns = settings.aoColumns,\n\t\tobjectRead = settings._rowReadObject;\n\n\t// Allow the data object to be passed in, or construct\n\td = d !== undefined ?\n\t\td :\n\t\tobjectRead ?\n\t\t\t{} :\n\t\t\t[];\n\n\tvar attr = function ( str, td  ) {\n\t\tif ( typeof str === 'string' ) {\n\t\t\tvar idx = str.indexOf('@');\n\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t}\n\t\t}\n\t};\n\n\t// Read data from a cell and store into the data object\n\tvar cellProcess = function ( cell ) {\n\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\tcol = columns[i];\n\t\t\tcontents = (cell.innerHTML).trim();\n\n\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\tsetter( d, contents );\n\n\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t// be read to either an object or an array.\n\t\t\t\tif ( objectRead ) {\n\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t}\n\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td[i] = contents;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ti++;\n\t};\n\n\tif ( td ) {\n\t\t// `tr` element was passed in\n\t\twhile ( td ) {\n\t\t\tname = td.nodeName.toUpperCase();\n\n\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\tcellProcess( td );\n\t\t\t\ttds.push( td );\n\t\t\t}\n\n\t\t\ttd = td.nextSibling;\n\t\t}\n\t}\n\telse {\n\t\t// Existing row object passed in\n\t\ttds = row.anCells;\n\n\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\tcellProcess( tds[j] );\n\t\t}\n\t}\n\n\t// Read the ID from the DOM if present\n\tvar rowNode = row.firstChild ? row : row.nTr;\n\n\tif ( rowNode ) {\n\t\tvar id = rowNode.getAttribute( 'id' );\n\n\t\tif ( id ) {\n\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t}\n\t}\n\n\treturn {\n\t\tdata: d,\n\t\tcells: tds\n\t};\n}\n/**\n * Create a new TR element (and it's TD children) for a row\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow Row to consider\n *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @memberof DataTable#oApi\n */\nfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n{\n\tvar\n\t\trow = oSettings.aoData[iRow],\n\t\trowData = row._aData,\n\t\tcells = [],\n\t\tnTr, nTd, oCol,\n\t\ti, iLen, create;\n\n\tif ( row.nTr === null )\n\t{\n\t\tnTr = nTrIn || document.createElement('tr');\n\n\t\trow.nTr = nTr;\n\t\trow.anCells = cells;\n\n\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t * to the aoData array for fast look up\n\t\t */\n\t\tnTr._DT_RowIndex = iRow;\n\n\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t_fnRowAttributes( oSettings, row );\n\n\t\t/* Process each column */\n\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\toCol = oSettings.aoColumns[i];\n\t\t\tcreate = nTrIn ? false : true;\n\n\t\t\tnTd = create ? document.createElement( oCol.sCellType ) : anTds[i];\n\n\t\t\tif (! nTd) {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\n\t\t\tnTd._DT_CellIndex = {\n\t\t\t\trow: iRow,\n\t\t\t\tcolumn: i\n\t\t\t};\n\t\t\t\n\t\t\tcells.push( nTd );\n\n\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\tif ( create || ((oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t)) {\n\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t}\n\n\t\t\t/* Add user defined class */\n\t\t\tif ( oCol.sClass )\n\t\t\t{\n\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t}\n\n\t\t\t// Visibility - add or remove as required\n\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t{\n\t\t\t\tnTr.appendChild( nTd );\n\t\t\t}\n\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t{\n\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t}\n\n\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t{\n\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );\n\t}\n}\n\n\n/**\n * Add attributes to a row based on the special `DT_*` parameters in a data\n * source object.\n *  @param {object} settings DataTables settings object\n *  @param {object} DataTables row object for the row to be modified\n *  @memberof DataTable#oApi\n */\nfunction _fnRowAttributes( settings, row )\n{\n\tvar tr = row.nTr;\n\tvar data = row._aData;\n\n\tif ( tr ) {\n\t\tvar id = settings.rowIdFn( data );\n\n\t\tif ( id ) {\n\t\t\ttr.id = id;\n\t\t}\n\n\t\tif ( data.DT_RowClass ) {\n\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\ta;\n\n\t\t\t$(tr)\n\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t.addClass( data.DT_RowClass );\n\t\t}\n\n\t\tif ( data.DT_RowAttr ) {\n\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t}\n\n\t\tif ( data.DT_RowData ) {\n\t\t\t$(tr).data( data.DT_RowData );\n\t\t}\n\t}\n}\n\n\n/**\n * Create the HTML header for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBuildHead( oSettings )\n{\n\tvar i, ien, cell, row, column;\n\tvar thead = oSettings.nTHead;\n\tvar tfoot = oSettings.nTFoot;\n\tvar createHeader = $('th, td', thead).length === 0;\n\tvar classes = oSettings.oClasses;\n\tvar columns = oSettings.aoColumns;\n\n\tif ( createHeader ) {\n\t\trow = $('<tr/>').appendTo( thead );\n\t}\n\n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcell = $( column.nTh ).addClass( column.sClass );\n\n\t\tif ( createHeader ) {\n\t\t\tcell.appendTo( row );\n\t\t}\n\n\t\t// 1.11 move into sorting\n\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\tcell.addClass( column.sSortingClass );\n\n\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\tcell\n\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\n\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t}\n\t\t}\n\n\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\tcell.html( column.sTitle );\n\t\t}\n\n\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\toSettings, cell, column, classes\n\t\t);\n\t}\n\n\tif ( createHeader ) {\n\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t}\n\n\t/* Deal with the footer - add classes if required */\n\t$(thead).children('tr').children('th, td').addClass( classes.sHeaderTH );\n\t$(tfoot).children('tr').children('th, td').addClass( classes.sFooterTH );\n\n\t// Cache the footer cells. Note that we only take the cells from the first\n\t// row in the footer. If there is more than one row the user wants to\n\t// interact with, they need to use the table().foot() method. Note also this\n\t// allows cells to be used for multiple columns using colspan\n\tif ( tfoot !== null ) {\n\t\tvar cells = oSettings.aoFooter[0];\n\n\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\n\t\t\tif (column) {\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the header (or footer) element based on the column visibility states. The\n * methodology here is to use the layout array from _fnDetectHeader, modified for\n * the instantaneous column visibility, to construct the new layout. The grid is\n * traversed over cell at a time in a rows x columns grid fashion, although each\n * cell insert can cover multiple elements in the grid - which is tracks using the\n * aApplied array. Cell inserts in the grid will only occur where there isn't\n * already a cell in that position.\n *  @param {object} oSettings dataTables settings object\n *  @param array {objects} aoSource Layout array from _fnDetectHeader\n *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n *  @memberof DataTable#oApi\n */\nfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n{\n\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\tvar aoLocal = [];\n\tvar aApplied = [];\n\tvar iColumns = oSettings.aoColumns.length;\n\tvar iRowspan, iColspan;\n\n\tif ( ! aoSource )\n\t{\n\t\treturn;\n\t}\n\n\tif (  bIncludeHidden === undefined )\n\t{\n\t\tbIncludeHidden = false;\n\t}\n\n\t/* Make a copy of the master layout array, but without the visible columns in it */\n\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t{\n\t\taoLocal[i] = aoSource[i].slice();\n\t\taoLocal[i].nTr = aoSource[i].nTr;\n\n\t\t/* Remove any columns which are currently hidden */\n\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t{\n\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t{\n\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t}\n\t\t}\n\n\t\t/* Prep the applied array - it needs an element for each row */\n\t\taApplied.push( [] );\n\t}\n\n\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t{\n\t\tnLocalTr = aoLocal[i].nTr;\n\n\t\t/* All cells are going to be replaced, so empty out the row */\n\t\tif ( nLocalTr )\n\t\t{\n\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t{\n\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t}\n\t\t}\n\n\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tiRowspan = 1;\n\t\t\tiColspan = 1;\n\n\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t */\n\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t{\n\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\taApplied[i][j] = 1;\n\n\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t{\n\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\tiRowspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t{\n\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t}\n\t\t\t\t\tiColspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Insert the required TR nodes into the table for display\n *  @param {object} oSettings dataTables settings object\n *  @param ajaxComplete true after ajax call to complete rendering\n *  @memberof DataTable#oApi\n */\nfunction _fnDraw( oSettings, ajaxComplete )\n{\n\t// Allow for state saving and a custom start position\n\t_fnStart( oSettings );\n\n\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t{\n\t\t_fnProcessingDisplay( oSettings, false );\n\t\treturn;\n\t}\n\n\tvar anRows = [];\n\tvar iRowCount = 0;\n\tvar asStripeClasses = oSettings.asStripeClasses;\n\tvar iStripes = asStripeClasses.length;\n\tvar oLang = oSettings.oLanguage;\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar aiDisplay = oSettings.aiDisplay;\n\tvar iDisplayStart = oSettings._iDisplayStart;\n\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\n\toSettings.bDrawing = true;\n\n\t/* Server-side processing draw intercept */\n\tif ( oSettings.bDeferLoading )\n\t{\n\t\toSettings.bDeferLoading = false;\n\t\toSettings.iDraw++;\n\t\t_fnProcessingDisplay( oSettings, false );\n\t}\n\telse if ( !bServerSide )\n\t{\n\t\toSettings.iDraw++;\n\t}\n\telse if ( !oSettings.bDestroying && !ajaxComplete)\n\t{\n\t\t_fnAjaxUpdate( oSettings );\n\t\treturn;\n\t}\n\n\tif ( aiDisplay.length !== 0 )\n\t{\n\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\n\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t{\n\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\tif ( aoData.nTr === null )\n\t\t\t{\n\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t}\n\n\t\t\tvar nRow = aoData.nTr;\n\n\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\tif ( iStripes !== 0 )\n\t\t\t{\n\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t{\n\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t// useful?\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t[nRow, aoData._aData, iRowCount, j, iDataIndex] );\n\n\t\t\tanRows.push( nRow );\n\t\t\tiRowCount++;\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* Table is empty - create a row with an empty message in it */\n\t\tvar sZero = oLang.sZeroRecords;\n\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t{\n\t\t\tsZero = oLang.sLoadingRecords;\n\t\t}\n\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t{\n\t\t\tsZero = oLang.sEmptyTable;\n\t\t}\n\n\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t.append( $('<td />', {\n\t\t\t\t'valign':  'top',\n\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t} ).html( sZero ) )[0];\n\t}\n\n\t/* Header and footer callbacks */\n\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\tvar body = $(oSettings.nTBody);\n\n\tbody.children().detach();\n\tbody.append( $(anRows) );\n\n\t/* Call all required callback functions for the end of a draw */\n\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\n\t/* Draw is complete, sorting and filtering must be as well */\n\toSettings.bSorted = false;\n\toSettings.bFiltered = false;\n\toSettings.bDrawing = false;\n}\n\n\n/**\n * Redraw the table - taking account of the various features which are enabled\n *  @param {object} oSettings dataTables settings object\n *  @param {boolean} [holdPosition] Keep the current paging position. By default\n *    the paging is reset to the first page\n *  @memberof DataTable#oApi\n */\nfunction _fnReDraw( settings, holdPosition )\n{\n\tvar\n\t\tfeatures = settings.oFeatures,\n\t\tsort     = features.bSort,\n\t\tfilter   = features.bFilter;\n\n\tif ( sort ) {\n\t\t_fnSort( settings );\n\t}\n\n\tif ( filter ) {\n\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t}\n\telse {\n\t\t// No filtering, so we want to just use the display master\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t}\n\n\tif ( holdPosition !== true ) {\n\t\tsettings._iDisplayStart = 0;\n\t}\n\n\t// Let any modules know about the draw hold position state (used by\n\t// scrolling internally)\n\tsettings._drawHold = holdPosition;\n\n\t_fnDraw( settings );\n\n\tsettings._drawHold = false;\n}\n\n\n/**\n * Add the options to the page HTML for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAddOptionsHtml ( oSettings )\n{\n\tvar classes = oSettings.oClasses;\n\tvar table = $(oSettings.nTable);\n\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\tvar features = oSettings.oFeatures;\n\n\t// All DataTables are wrapped in a div\n\tvar insert = $('<div/>', {\n\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t} );\n\n\toSettings.nHolding = holding[0];\n\toSettings.nTableWrapper = insert[0];\n\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\n\t/* Loop over the user set positioning and place the elements as needed */\n\tvar aDom = oSettings.sDom.split('');\n\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t{\n\t\tfeatureNode = null;\n\t\tcOption = aDom[i];\n\n\t\tif ( cOption == '<' )\n\t\t{\n\t\t\t/* New container div */\n\t\t\tnNewNode = $('<div/>')[0];\n\n\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\tcNext = aDom[i+1];\n\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t{\n\t\t\t\tsAttr = \"\";\n\t\t\t\tj = 2;\n\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t{\n\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t}\n\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t}\n\n\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t */\n\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t{\n\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t}\n\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t{\n\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t}\n\n\t\t\t\ti += j; /* Move along the position array */\n\t\t\t}\n\n\t\t\tinsert.append( nNewNode );\n\t\t\tinsert = $(nNewNode);\n\t\t}\n\t\telse if ( cOption == '>' )\n\t\t{\n\t\t\t/* End container div */\n\t\t\tinsert = insert.parent();\n\t\t}\n\t\t// @todo Move options into their own plugins?\n\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t{\n\t\t\t/* Length */\n\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t}\n\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t{\n\t\t\t/* Filter */\n\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t}\n\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t{\n\t\t\t/* pRocessing */\n\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t}\n\t\telse if ( cOption == 't' )\n\t\t{\n\t\t\t/* Table */\n\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t}\n\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t{\n\t\t\t/* Info */\n\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t}\n\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t{\n\t\t\t/* Pagination */\n\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t}\n\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t{\n\t\t\t/* Plug-in features */\n\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t{\n\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* Add to the 2D features array */\n\t\tif ( featureNode )\n\t\t{\n\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\n\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t{\n\t\t\t\taanFeatures[cOption] = [];\n\t\t\t}\n\n\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\tinsert.append( featureNode );\n\t\t}\n\t}\n\n\t/* Built our DOM structure - replace the holding div with what we want */\n\tholding.replaceWith( insert );\n\toSettings.nHolding = null;\n}\n\n\n/**\n * Use the DOM source to create up an array of header cells. The idea here is to\n * create a layout grid (array) of rows x columns, which contains a reference\n * to the cell that that point in the grid (regardless of col/rowspan), such that\n * any column / row could be removed and the new grid constructed\n *  @param array {object} aLayout Array to store the calculated layout in\n *  @param {node} nThead The header/footer element for the table\n *  @memberof DataTable#oApi\n */\nfunction _fnDetectHeader ( aLayout, nThead )\n{\n\tvar nTrs = $(nThead).children('tr');\n\tvar nTr, nCell;\n\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\tvar bUnique;\n\tvar fnShiftCol = function ( a, i, j ) {\n\t\tvar k = a[i];\n                while ( k[j] ) {\n\t\t\tj++;\n\t\t}\n\t\treturn j;\n\t};\n\n\taLayout.splice( 0, aLayout.length );\n\n\t/* We know how many rows there are in the layout - so prep it */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\taLayout.push( [] );\n\t}\n\n\t/* Calculate a layout array */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\tnTr = nTrs[i];\n\t\tiColumn = 0;\n\n\t\t/* For every cell in the row... */\n\t\tnCell = nTr.firstChild;\n\t\twhile ( nCell ) {\n\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t{\n\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\n\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t * accordingly\n\t\t\t\t */\n\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\n\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\n\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t{\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t};\n\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnCell = nCell.nextSibling;\n\t\t}\n\t}\n}\n\n\n/**\n * Get an array of unique th elements, one for each column\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nHeader automatically detect the layout from this node - optional\n *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n *  @returns array {node} aReturn list of unique th's\n *  @memberof DataTable#oApi\n */\nfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n{\n\tvar aReturn = [];\n\tif ( !aLayout )\n\t{\n\t\taLayout = oSettings.aoHeader;\n\t\tif ( nHeader )\n\t\t{\n\t\t\taLayout = [];\n\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t}\n\t}\n\n\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t{\n\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t{\n\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn aReturn;\n}\n\n/**\n * Set the start position for draw\n *  @param {object} oSettings dataTables settings object\n */\nfunction _fnStart( oSettings )\n{\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\n\t// Check and see if we have an initial draw position from state saving\n\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t{\n\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\tiInitDisplayStart :\n\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t0 :\n\t\t\t\tiInitDisplayStart;\n\n\t\toSettings.iInitDisplayStart = -1;\n\t}\n}\n\n/**\n * Create an Ajax call based on the table's settings, taking into account that\n * parameters can have multiple forms, and backwards compatibility.\n *\n * @param {object} oSettings dataTables settings object\n * @param {array} data Data to send to the server, required by\n *     DataTables - may be augmented by developer callbacks\n * @param {function} fn Callback function to run when data is obtained\n */\nfunction _fnBuildAjax( oSettings, data, fn )\n{\n\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\n\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t// come from server-side processing or serverParams\n\tif ( data && Array.isArray(data) ) {\n\t\tvar tmp = {};\n\t\tvar rbracket = /(.*?)\\[\\]$/;\n\n\t\t$.each( data, function (key, val) {\n\t\t\tvar match = val.name.match(rbracket);\n\n\t\t\tif ( match ) {\n\t\t\t\t// Support for arrays\n\t\t\t\tvar name = match[0];\n\n\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t}\n\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttmp[val.name] = val.value;\n\t\t\t}\n\t\t} );\n\t\tdata = tmp;\n\t}\n\n\tvar ajaxData;\n\tvar ajax = oSettings.ajax;\n\tvar instance = oSettings.oInstance;\n\tvar callback = function ( json ) {\n\t\tvar status = oSettings.jqXHR\n\t\t\t? oSettings.jqXHR.status\n\t\t\t: null;\n\n\t\tif ( json === null || (typeof status === 'number' && status == 204 ) ) {\n\t\t\tjson = {};\n\t\t\t_fnAjaxDataSrc( oSettings, json, [] );\n\t\t}\n\n\t\tvar error = json.error || json.sError;\n\t\tif ( error ) {\n\t\t\t_fnLog( oSettings, 0, error );\n\t\t}\n\n\t\toSettings.json = json;\n\n\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\tfn( json );\n\t};\n\n\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t{\n\t\tajaxData = ajax.data;\n\n\t\tvar newData = typeof ajaxData === 'function' ?\n\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\tajaxData;                      // an object object or array to merge\n\n\t\t// If the function returned something, use that alone\n\t\tdata = typeof ajaxData === 'function' && newData ?\n\t\t\tnewData :\n\t\t\t$.extend( true, data, newData );\n\n\t\t// Remove the data property as we've resolved it already and don't want\n\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\tdelete ajax.data;\n\t}\n\n\tvar baseAjax = {\n\t\t\"data\": data,\n\t\t\"success\": callback,\n\t\t\"dataType\": \"json\",\n\t\t\"cache\": false,\n\t\t\"type\": oSettings.sServerMethod,\n\t\t\"error\": function (xhr, error, thrown) {\n\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\n\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t}\n\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t};\n\n\t// Store the data submitted for the API\n\toSettings.oAjaxData = data;\n\n\t// Allow plug-ins and external processes to modify the data\n\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\n\tif ( oSettings.fnServerData )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.fnServerData.call( instance,\n\t\t\toSettings.sAjaxSource,\n\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\treturn { name: key, value: val };\n\t\t\t} ),\n\t\t\tcallback,\n\t\t\toSettings\n\t\t);\n\t}\n\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t} ) );\n\t}\n\telse if ( typeof ajax === 'function' )\n\t{\n\t\t// Is a function - let the caller define what needs to be done\n\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t}\n\telse\n\t{\n\t\t// Object to extend the base settings\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\n\t\t// Restore for next time around\n\t\tajax.data = ajaxData;\n\t}\n}\n\n\n/**\n * Update the table using an Ajax call\n *  @param {object} settings dataTables settings object\n *  @returns {boolean} Block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdate( settings )\n{\n\tsettings.iDraw++;\n\t_fnProcessingDisplay( settings, true );\n\n\t// Keep track of drawHold state to handle scrolling after the Ajax call\n\tvar drawHold = settings._drawHold;\n\n\t_fnBuildAjax(\n\t\tsettings,\n\t\t_fnAjaxParameters( settings ),\n\t\tfunction(json) {\n\t\t\tsettings._drawHold = drawHold;\n\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t\tsettings._drawHold = false;\n\t\t}\n\t);\n}\n\n\n/**\n * Build up the parameters in an object needed for a server-side processing\n * request. Note that this is basically done twice, is different ways - a modern\n * method which is used by default in DataTables 1.10 which uses objects and\n * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n * the sAjaxSource option is used in the initialisation, or the legacyAjax\n * option is set.\n *  @param {object} oSettings dataTables settings object\n *  @returns {bool} block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxParameters( settings )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tcolumnCount = columns.length,\n\t\tfeatures = settings.oFeatures,\n\t\tpreSearch = settings.oPreviousSearch,\n\t\tpreColSearch = settings.aoPreSearchCols,\n\t\ti, data = [], dataProp, column, columnSearch,\n\t\tsort = _fnSortFlatten( settings ),\n\t\tdisplayStart = settings._iDisplayStart,\n\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\tsettings._iDisplayLength :\n\t\t\t-1;\n\n\tvar param = function ( name, value ) {\n\t\tdata.push( { 'name': name, 'value': value } );\n\t};\n\n\t// DataTables 1.9- compatible method\n\tparam( 'sEcho',          settings.iDraw );\n\tparam( 'iColumns',       columnCount );\n\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\tparam( 'iDisplayStart',  displayStart );\n\tparam( 'iDisplayLength', displayLength );\n\n\t// DataTables 1.10+ method\n\tvar d = {\n\t\tdraw:    settings.iDraw,\n\t\tcolumns: [],\n\t\torder:   [],\n\t\tstart:   displayStart,\n\t\tlength:  displayLength,\n\t\tsearch:  {\n\t\t\tvalue: preSearch.sSearch,\n\t\t\tregex: preSearch.bRegex\n\t\t}\n\t};\n\n\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcolumnSearch = preColSearch[i];\n\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\n\t\td.columns.push( {\n\t\t\tdata:       dataProp,\n\t\t\tname:       column.sName,\n\t\t\tsearchable: column.bSearchable,\n\t\t\torderable:  column.bSortable,\n\t\t\tsearch:     {\n\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\tregex: columnSearch.bRegex\n\t\t\t}\n\t\t} );\n\n\t\tparam( \"mDataProp_\"+i, dataProp );\n\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t}\n\n\t\tif ( features.bSort ) {\n\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t}\n\t}\n\n\tif ( features.bFilter ) {\n\t\tparam( 'sSearch', preSearch.sSearch );\n\t\tparam( 'bRegex', preSearch.bRegex );\n\t}\n\n\tif ( features.bSort ) {\n\t\t$.each( sort, function ( i, val ) {\n\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\n\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t} );\n\n\t\tparam( 'iSortingCols', sort.length );\n\t}\n\n\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t// form to use, based on sAjaxSource\n\tvar legacy = DataTable.ext.legacy.ajax;\n\tif ( legacy === null ) {\n\t\treturn settings.sAjaxSource ? data : d;\n\t}\n\n\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t// form\n\treturn legacy ? data : d;\n}\n\n\n/**\n * Data the data from the server (nuking the old) and redraw the table\n *  @param {object} oSettings dataTables settings object\n *  @param {object} json json data return from the server.\n *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n *  @param {array} json.aaData The data to display on this page\n *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdateDraw ( settings, json )\n{\n\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t// Support both\n\tvar compat = function ( old, modern ) {\n\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t};\n\n\tvar data = _fnAjaxDataSrc( settings, json );\n\tvar draw            = compat( 'sEcho',                'draw' );\n\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\n\tif ( draw !== undefined ) {\n\t\t// Protect against out of sequence returns\n\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\treturn;\n\t\t}\n\t\tsettings.iDraw = draw * 1;\n\t}\n\n\t// No data in returned object, so rather than an array, we show an empty table\n\tif ( ! data ) {\n\t\tdata = [];\n\t}\n\n\t_fnClearTable( settings );\n\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\n\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t_fnAddData( settings, data[i] );\n\t}\n\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\n\t_fnDraw( settings, true );\n\n\tif ( ! settings._bInitComplete ) {\n\t\t_fnInitComplete( settings, json );\n\t}\n\n\t_fnProcessingDisplay( settings, false );\n}\n\n\n/**\n * Get the data from the JSON data source to use for drawing a table. Using\n * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n * source object, or from a processing function.\n *  @param {object} oSettings dataTables settings object\n *  @param  {object} json Data source object / array from the server\n *  @return {array} Array of data to use\n */\n function _fnAjaxDataSrc ( oSettings, json, write )\n {\n\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\toSettings.ajax.dataSrc :\n\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\n\tif ( ! write ) {\n\t\tif ( dataSrc === 'data' ) {\n\t\t\t// If the default, then we still want to support the old style, and safely ignore\n\t\t\t// it if possible\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\n\t// set\n\t_fnSetObjectDataFn( dataSrc )( json, write );\n}\n\n/**\n * Generate the node required for filtering text\n *  @returns {node} Filter control element\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlFilter ( settings )\n{\n\tvar classes = settings.oClasses;\n\tvar tableId = settings.sTableId;\n\tvar language = settings.oLanguage;\n\tvar previousSearch = settings.oPreviousSearch;\n\tvar features = settings.aanFeatures;\n\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\n\tvar str = language.sSearch;\n\tstr = str.match(/_INPUT_/) ?\n\t\tstr.replace('_INPUT_', input) :\n\t\tstr+input;\n\n\tvar filter = $('<div/>', {\n\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t'class': classes.sFilter\n\t\t} )\n\t\t.append( $('<label/>' ).append( str ) );\n\n\tvar searchFn = function(event) {\n\t\t/* Update all other filter input elements for the new display */\n\t\tvar n = features.f;\n\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\tif(previousSearch.return && event.key !== \"Enter\") {\n\t\t\treturn;\n\t\t}\n\t\t/* Now do the filter */\n\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\"sSearch\": val,\n\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive,\n\t\t\t\t\"return\": previousSearch.return\n\t\t\t} );\n\n\t\t\t// Need to redraw, without resorting\n\t\t\tsettings._iDisplayStart = 0;\n\t\t\t_fnDraw( settings );\n\t\t}\n\t};\n\n\tvar searchDelay = settings.searchDelay !== null ?\n\t\tsettings.searchDelay :\n\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t400 :\n\t\t\t0;\n\n\tvar jqFilter = $('input', filter)\n\t\t.val( previousSearch.sSearch )\n\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t.on(\n\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\tsearchDelay ?\n\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\tsearchFn\n\t\t)\n\t\t.on( 'mouseup.DT', function(e) {\n\t\t\t// Edge fix! Edge 17 does not trigger anything other than mouse events when clicking\n\t\t\t// on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`\n\t\t\t// checks the value to see if it has changed. In other browsers it won't have.\n\t\t\tsetTimeout( function () {\n\t\t\t\tsearchFn.call(jqFilter[0], e);\n\t\t\t}, 10);\n\t\t} )\n\t\t.on( 'keypress.DT', function(e) {\n\t\t\t/* Prevent form submission */\n\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} )\n\t\t.attr('aria-controls', tableId);\n\n\t// Update the input elements whenever the table is filtered\n\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\tif ( settings === s ) {\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame...\n\t\t\ttry {\n\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch ( e ) {}\n\t\t}\n\t} );\n\n\treturn filter[0];\n}\n\n\n/**\n * Filter the table using both the global filter and column based filtering\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oSearch search information\n *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterComplete ( oSettings, oInput, iForce )\n{\n\tvar oPrevSearch = oSettings.oPreviousSearch;\n\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\tvar fnSaveFilter = function ( oFilter ) {\n\t\t/* Save the filtering values */\n\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\toPrevSearch.return = oFilter.return;\n\t};\n\tvar fnRegex = function ( o ) {\n\t\t// Backwards compatibility with the bEscapeRegex option\n\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t};\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo As per sort - can this be moved into an event handler?\n\t_fnColumnTypes( oSettings );\n\n\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t{\n\t\t/* Global filter */\n\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );\n\t\tfnSaveFilter( oInput );\n\n\t\t/* Now do the individual column filter */\n\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t{\n\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t}\n\n\t\t/* Custom filtering */\n\t\t_fnFilterCustom( oSettings );\n\t}\n\telse\n\t{\n\t\tfnSaveFilter( oInput );\n\t}\n\n\t/* Tell the draw function we have been filtering */\n\toSettings.bFiltered = true;\n\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n}\n\n\n/**\n * Apply custom filtering functions\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCustom( settings )\n{\n\tvar filters = DataTable.ext.search;\n\tvar displayRows = settings.aiDisplay;\n\tvar row, rowIdx;\n\n\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\tvar rows = [];\n\n\t\t// Loop over each row and see if it should be included\n\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\trowIdx = displayRows[ j ];\n\t\t\trow = settings.aoData[ rowIdx ];\n\n\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\trows.push( rowIdx );\n\t\t\t}\n\t\t}\n\n\t\t// So the array reference doesn't break set the results into the\n\t\t// existing array\n\t\tdisplayRows.length = 0;\n\t\t$.merge( displayRows, rows );\n\t}\n}\n\n\n/**\n * Filter the table on a per-column basis\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sInput string to filter on\n *  @param {int} iColumn column to filter\n *  @param {bool} bRegex treat search string as a regular expression or not\n *  @param {bool} bSmart use smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n{\n\tif ( searchStr === '' ) {\n\t\treturn;\n\t}\n\n\tvar data;\n\tvar out = [];\n\tvar display = settings.aiDisplay;\n\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\n\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\n\t\tif ( rpSearch.test( data ) ) {\n\t\t\tout.push( display[i] );\n\t\t}\n\t}\n\n\tsettings.aiDisplay = out;\n}\n\n\n/**\n * Filter the data table based on user input and draw the table\n *  @param {object} settings dataTables settings object\n *  @param {string} input string to filter on\n *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n *  @param {bool} regex treat as a regular expression or not\n *  @param {bool} smart perform smart filtering or not\n *  @param {bool} caseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n{\n\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\tvar displayMaster = settings.aiDisplayMaster;\n\tvar display, invalidated, i;\n\tvar filtered = [];\n\n\t// Need to take account of custom filtering functions - always filter\n\tif ( DataTable.ext.search.length !== 0 ) {\n\t\tforce = true;\n\t}\n\n\t// Check if any of the rows were invalidated\n\tinvalidated = _fnFilterData( settings );\n\n\t// If the input is blank - we just want the full data set\n\tif ( input.length <= 0 ) {\n\t\tsettings.aiDisplay = displayMaster.slice();\n\t}\n\telse {\n\t\t// New search - start from the master array\n\t\tif ( invalidated ||\n\t\t\t force ||\n\t\t\t regex ||\n\t\t\t prevSearch.length > input.length ||\n\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t                  // re-filtered since indexes will have changed\n\t\t) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\n\t\t// Search the display array\n\t\tdisplay = settings.aiDisplay;\n\n\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\tfiltered.push( display[i] );\n\t\t\t}\n\t\t}\n\n\t\tsettings.aiDisplay = filtered;\n\t}\n}\n\n\n/**\n * Build a regular expression object suitable for searching a table\n *  @param {string} sSearch string to search for\n *  @param {bool} bRegex treat as a regular expression or not\n *  @param {bool} bSmart perform smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @returns {RegExp} constructed object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n{\n\tsearch = regex ?\n\t\tsearch :\n\t\t_fnEscapeRegex( search );\n\t\n\tif ( smart ) {\n\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t * order is important - a la google. So this is what we want to\n\t\t * generate:\n\t\t * \n\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t */\n\t\tvar a = $.map( search.match( /[\"\\u201C][^\"\\u201D]+[\"\\u201D]|[^ ]+/g ) || [''], function ( word ) {\n\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\tword = m ? m[1] : word;\n\t\t\t}\n\t\t\telse if ( word.charAt(0) === '\\u201C' ) {\n\t\t\t\tvar m = word.match( /^\\u201C(.*)\\u201D$/ );\n\t\t\t\tword = m ? m[1] : word;\n\t\t\t}\n\n\t\t\treturn word.replace('\"', '');\n\t\t} );\n\n\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t}\n\n\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n}\n\n\n/**\n * Escape a string such that it can be used in a regular expression\n *  @param {string} sVal string to escape\n *  @returns {string} escaped string\n *  @memberof DataTable#oApi\n */\nvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\nvar __filter_div = $('<div>')[0];\nvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\n// Update the filtering data for each row if needed (by invalidation or first run)\nfunction _fnFilterData ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar column;\n\tvar i, j, ien, jen, filterData, cellData, row;\n\tvar wasInvalidated = false;\n\n\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aFilterData ) {\n\t\t\tfilterData = [];\n\n\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\tcolumn = columns[j];\n\n\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\n\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcellData = '';\n\t\t\t\t}\n\n\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t}\n\n\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\tcellData = cellData.replace(/[\\r\\n\\u2028]/g, '');\n\t\t\t\t}\n\n\t\t\t\tfilterData.push( cellData );\n\t\t\t}\n\n\t\t\trow._aFilterData = filterData;\n\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\twasInvalidated = true;\n\t\t}\n\t}\n\n\treturn wasInvalidated;\n}\n\n\n/**\n * Convert from the internal Hungarian notation to camelCase for external\n * interaction\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToCamel ( obj )\n{\n\treturn {\n\t\tsearch:          obj.sSearch,\n\t\tsmart:           obj.bSmart,\n\t\tregex:           obj.bRegex,\n\t\tcaseInsensitive: obj.bCaseInsensitive\n\t};\n}\n\n\n\n/**\n * Convert from camelCase notation to the internal Hungarian. We could use the\n * Hungarian convert function here, but this is cleaner\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToHung ( obj )\n{\n\treturn {\n\t\tsSearch:          obj.search,\n\t\tbSmart:           obj.smart,\n\t\tbRegex:           obj.regex,\n\t\tbCaseInsensitive: obj.caseInsensitive\n\t};\n}\n\n/**\n * Generate the node required for the info display\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Information element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlInfo ( settings )\n{\n\tvar\n\t\ttid = settings.sTableId,\n\t\tnodes = settings.aanFeatures.i,\n\t\tn = $('<div/>', {\n\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t} );\n\n\tif ( ! nodes ) {\n\t\t// Update display on each draw\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\"sName\": \"information\"\n\t\t} );\n\n\t\tn\n\t\t\t.attr( 'role', 'status' )\n\t\t\t.attr( 'aria-live', 'polite' );\n\n\t\t// Table is described by our info div\n\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t}\n\n\treturn n[0];\n}\n\n\n/**\n * Update the information elements in the display\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnUpdateInfo ( settings )\n{\n\t/* Show information about the table */\n\tvar nodes = settings.aanFeatures.i;\n\tif ( nodes.length === 0 ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\tlang  = settings.oLanguage,\n\t\tstart = settings._iDisplayStart+1,\n\t\tend   = settings.fnDisplayEnd(),\n\t\tmax   = settings.fnRecordsTotal(),\n\t\ttotal = settings.fnRecordsDisplay(),\n\t\tout   = total ?\n\t\t\tlang.sInfo :\n\t\t\tlang.sInfoEmpty;\n\n\tif ( total !== max ) {\n\t\t/* Record set after filtering */\n\t\tout += ' ' + lang.sInfoFiltered;\n\t}\n\n\t// Convert the macros\n\tout += lang.sInfoPostFix;\n\tout = _fnInfoMacros( settings, out );\n\n\tvar callback = lang.fnInfoCallback;\n\tif ( callback !== null ) {\n\t\tout = callback.call( settings.oInstance,\n\t\t\tsettings, start, end, max, total, out\n\t\t);\n\t}\n\n\t$(nodes).html( out );\n}\n\n\nfunction _fnInfoMacros ( settings, str )\n{\n\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t// internally\n\tvar\n\t\tformatter  = settings.fnFormatNumber,\n\t\tstart      = settings._iDisplayStart+1,\n\t\tlen        = settings._iDisplayLength,\n\t\tvis        = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn str.\n\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n}\n\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnInitialise ( settings )\n{\n\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\tvar columns = settings.aoColumns, column;\n\tvar features = settings.oFeatures;\n\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\n\t/* Ensure that the table data is fully initialised */\n\tif ( ! settings.bInitialised ) {\n\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\treturn;\n\t}\n\n\t/* Show the display HTML options */\n\t_fnAddOptionsHtml( settings );\n\n\t/* Build and draw the header / footer for the table */\n\t_fnBuildHead( settings );\n\t_fnDrawHead( settings, settings.aoHeader );\n\t_fnDrawHead( settings, settings.aoFooter );\n\n\t/* Okay to show that something is going on now */\n\t_fnProcessingDisplay( settings, true );\n\n\t/* Calculate sizes for columns */\n\tif ( features.bAutoWidth ) {\n\t\t_fnCalculateColumnWidths( settings );\n\t}\n\n\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\tcolumn = columns[i];\n\n\t\tif ( column.sWidth ) {\n\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t}\n\t}\n\n\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\n\t// If there is default sorting required - let's do it. The sort function\n\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t// data (show 'loading' message possibly)\n\t_fnReDraw( settings );\n\n\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\tvar dataSrc = _fnDataSource( settings );\n\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t// if there is an ajax source load the data\n\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\n\t\t\t\t// Got the data - add it to the table\n\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t}\n\n\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t// it appear 'fresh'\n\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\n\t\t\t\t_fnReDraw( settings );\n\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t}, settings );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t_fnInitComplete( settings );\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} oSettings dataTables settings object\n *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n *    with client-side processing (optional)\n *  @memberof DataTable#oApi\n */\nfunction _fnInitComplete ( settings, json )\n{\n\tsettings._bInitComplete = true;\n\n\t// When data was added after the initialisation (data or Ajax) we need to\n\t// calculate the column sizing\n\tif ( json || settings.oInit.aaData ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n}\n\n\nfunction _fnLengthChange ( settings, val )\n{\n\tvar len = parseInt( val, 10 );\n\tsettings._iDisplayLength = len;\n\n\t_fnLengthOverflow( settings );\n\n\t// Fire length change event\n\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n}\n\n\n/**\n * Generate the node required for user display length changing\n *  @param {object} settings dataTables settings object\n *  @returns {node} Display length feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlLength ( settings )\n{\n\tvar\n\t\tclasses  = settings.oClasses,\n\t\ttableId  = settings.sTableId,\n\t\tmenu     = settings.aLengthMenu,\n\t\td2       = Array.isArray( menu[0] ),\n\t\tlengths  = d2 ? menu[0] : menu,\n\t\tlanguage = d2 ? menu[1] : menu;\n\n\tvar select = $('<select/>', {\n\t\t'name':          tableId+'_length',\n\t\t'aria-controls': tableId,\n\t\t'class':         classes.sLengthSelect\n\t} );\n\n\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\tselect[0][ i ] = new Option(\n\t\t\ttypeof language[i] === 'number' ?\n\t\t\t\tsettings.fnFormatNumber( language[i] ) :\n\t\t\t\tlanguage[i],\n\t\t\tlengths[i]\n\t\t);\n\t}\n\n\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\tif ( ! settings.aanFeatures.l ) {\n\t\tdiv[0].id = tableId+'_length';\n\t}\n\n\tdiv.children().append(\n\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t);\n\n\t// Can't use `select` variable as user might provide their own and the\n\t// reference is broken by the use of outerHTML\n\t$('select', div)\n\t\t.val( settings._iDisplayLength )\n\t\t.on( 'change.DT', function(e) {\n\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t_fnDraw( settings );\n\t\t} );\n\n\t// Update node value whenever anything changes the table's length\n\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\tif ( settings === s ) {\n\t\t\t$('select', div).val( len );\n\t\t}\n\t} );\n\n\treturn div[0];\n}\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Note that most of the paging logic is done in\n * DataTable.ext.pager\n */\n\n/**\n * Generate the node required for default pagination\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Pagination feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlPaginate ( settings )\n{\n\tvar\n\t\ttype   = settings.sPaginationType,\n\t\tplugin = DataTable.ext.pager[ type ],\n\t\tmodern = typeof plugin === 'function',\n\t\tredraw = function( settings ) {\n\t\t\t_fnDraw( settings );\n\t\t},\n\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\tfeatures = settings.aanFeatures;\n\n\tif ( ! modern ) {\n\t\tplugin.fnInit( settings, node, redraw );\n\t}\n\n\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\tif ( ! features.p )\n\t{\n\t\tnode.id = settings.sTableId+'_paginate';\n\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": function( settings ) {\n\t\t\t\tif ( modern ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\ti, ien;\n\n\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"sName\": \"pagination\"\n\t\t} );\n\t}\n\n\treturn node;\n}\n\n\n/**\n * Alter the display settings to change the page\n *  @param {object} settings DataTables settings object\n *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n *    \"next\" or \"last\" or page number to jump to (integer)\n *  @param [bool] redraw Automatically draw the update or not\n *  @returns {bool} true page has changed, false - no change\n *  @memberof DataTable#oApi\n */\nfunction _fnPageChange ( settings, action, redraw )\n{\n\tvar\n\t\tstart     = settings._iDisplayStart,\n\t\tlen       = settings._iDisplayLength,\n\t\trecords   = settings.fnRecordsDisplay();\n\n\tif ( records === 0 || len === -1 )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( typeof action === \"number\" )\n\t{\n\t\tstart = action * len;\n\n\t\tif ( start > records )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t}\n\telse if ( action == \"first\" )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( action == \"previous\" )\n\t{\n\t\tstart = len >= 0 ?\n\t\t\tstart - len :\n\t\t\t0;\n\n\t\tif ( start < 0 )\n\t\t{\n\t\t  start = 0;\n\t\t}\n\t}\n\telse if ( action == \"next\" )\n\t{\n\t\tif ( start + len < records )\n\t\t{\n\t\t\tstart += len;\n\t\t}\n\t}\n\telse if ( action == \"last\" )\n\t{\n\t\tstart = Math.floor( (records-1) / len) * len;\n\t}\n\telse\n\t{\n\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t}\n\n\tvar changed = settings._iDisplayStart !== start;\n\tsettings._iDisplayStart = start;\n\n\tif ( changed ) {\n\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\n\t\tif ( redraw ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t}\n\telse {\n\t\t// No change event - paging was called, but no change\n\t\t_fnCallbackFire( settings, null, 'page-nc', [settings] );\n\t}\n\n\treturn changed;\n}\n\n\n\n/**\n * Generate the node required for the processing node\n *  @param {object} settings dataTables settings object\n *  @returns {node} Processing element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlProcessing ( settings )\n{\n\treturn $('<div/>', {\n\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t'class': settings.oClasses.sProcessing,\n\t\t\t'role': 'status'\n\t\t} )\n\t\t.html( settings.oLanguage.sProcessing )\n\t\t.append('<div><div></div><div></div><div></div><div></div></div>')\n\t\t.insertBefore( settings.nTable )[0];\n}\n\n\n/**\n * Display or hide the processing indicator\n *  @param {object} settings dataTables settings object\n *  @param {bool} show Show the processing indicator (true) or not (false)\n *  @memberof DataTable#oApi\n */\nfunction _fnProcessingDisplay ( settings, show )\n{\n\tif ( settings.oFeatures.bProcessing ) {\n\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t}\n\n\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n}\n\n/**\n * Add any control elements for the table - specifically scrolling\n *  @param {object} settings dataTables settings object\n *  @returns {node} Node to add to the DOM\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlTable ( settings )\n{\n\tvar table = $(settings.nTable);\n\n\t// Scrolling from here on in\n\tvar scroll = settings.oScroll;\n\n\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\treturn settings.nTable;\n\t}\n\n\tvar scrollX = scroll.sX;\n\tvar scrollY = scroll.sY;\n\tvar classes = settings.oClasses;\n\tvar caption = table.children('caption');\n\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\tvar headerClone = $( table[0].cloneNode(false) );\n\tvar footerClone = $( table[0].cloneNode(false) );\n\tvar footer = table.children('tfoot');\n\tvar _div = '<div/>';\n\tvar size = function ( s ) {\n\t\treturn !s ? null : _fnStringToCss( s );\n\t};\n\n\tif ( ! footer.length ) {\n\t\tfooter = null;\n\t}\n\n\t/*\n\t * The HTML structure that we want to generate in this function is:\n\t *  div - scroller\n\t *    div - scroll head\n\t *      div - scroll head inner\n\t *        table - scroll head table\n\t *          thead - thead\n\t *    div - scroll body\n\t *      table - table (master table)\n\t *        thead - thead clone for sizing\n\t *        tbody - tbody\n\t *    div - scroll foot\n\t *      div - scroll foot inner\n\t *        table - scroll foot table\n\t *          tfoot - tfoot\n\t */\n\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t} )\n\t\t\t\t.append( table )\n\t\t);\n\n\tif ( footer ) {\n\t\tscroller.append(\n\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t);\n\t}\n\n\tvar children = scroller.children();\n\tvar scrollHead = children[0];\n\tvar scrollBody = children[1];\n\tvar scrollFoot = footer ? children[2] : null;\n\n\t// When the body is scrolled, then we also want to scroll the headers\n\tif ( scrollX ) {\n\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\tvar scrollLeft = this.scrollLeft;\n\n\t\t\tscrollHead.scrollLeft = scrollLeft;\n\n\t\t\tif ( footer ) {\n\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t}\n\t\t} );\n\t}\n\n\t$(scrollBody).css('max-height', scrollY);\n\tif (! scroll.bCollapse) {\n\t\t$(scrollBody).css('height', scrollY);\n\t}\n\n\tsettings.nScrollHead = scrollHead;\n\tsettings.nScrollBody = scrollBody;\n\tsettings.nScrollFoot = scrollFoot;\n\n\t// On redraw - align columns\n\tsettings.aoDrawCallback.push( {\n\t\t\"fn\": _fnScrollDraw,\n\t\t\"sName\": \"scrolling\"\n\t} );\n\n\treturn scroller[0];\n}\n\n\n\n/**\n * Update the header, footer and body tables for resizing - i.e. column\n * alignment.\n *\n * Welcome to the most horrible function DataTables. The process that this\n * function follows is basically:\n *   1. Re-create the table inside the scrolling div\n *   2. Take live measurements from the DOM\n *   3. Apply the measurements to align the columns\n *   4. Clean up\n *\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnScrollDraw ( settings )\n{\n\t// Given that this is such a monster function, a lot of variables are use\n\t// to try and keep the minimised size as small as possible\n\tvar\n\t\tscroll         = settings.oScroll,\n\t\tscrollX        = scroll.sX,\n\t\tscrollXInner   = scroll.sXInner,\n\t\tscrollY        = scroll.sY,\n\t\tbarWidth       = scroll.iBarWidth,\n\t\tdivHeader      = $(settings.nScrollHead),\n\t\tdivHeaderStyle = divHeader[0].style,\n\t\tdivHeaderInner = divHeader.children('div'),\n\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\tdivBodyEl      = settings.nScrollBody,\n\t\tdivBody        = $(divBodyEl),\n\t\tdivBodyStyle   = divBodyEl.style,\n\t\tdivFooter      = $(settings.nScrollFoot),\n\t\tdivFooterInner = divFooter.children('div'),\n\t\tdivFooterTable = divFooterInner.children('table'),\n\t\theader         = $(settings.nTHead),\n\t\ttable          = $(settings.nTable),\n\t\ttableEl        = table[0],\n\t\ttableStyle     = tableEl.style,\n\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\tbrowser        = settings.oBrowser,\n\t\tie67           = browser.bScrollOversize,\n\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\theaderTrgEls, footerTrgEls,\n\t\theaderSrcEls, footerSrcEls,\n\t\theaderCopy, footerCopy,\n\t\theaderWidths=[], footerWidths=[],\n\t\theaderContent=[], footerContent=[],\n\t\tidx, correction, sanityWidth,\n\t\tzeroOut = function(nSizer) {\n\t\t\tvar style = nSizer.style;\n\t\t\tstyle.paddingTop = \"0\";\n\t\t\tstyle.paddingBottom = \"0\";\n\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\tstyle.height = 0;\n\t\t};\n\n\t// If the scrollbar visibility has changed from the last draw, we need to\n\t// adjust the column sizes as the table width will have changed to account\n\t// for the scrollbar\n\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\n\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t_fnAdjustColumnSizing( settings );\n\t\treturn; // adjust column sizing will call this function again\n\t}\n\telse {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t}\n\n\t/*\n\t * 1. Re-create the table inside the scrolling div\n\t */\n\n\t// Remove the old minimised thead and tfoot elements in the inner table\n\ttable.children('thead, tfoot').remove();\n\n\tif ( footer ) {\n\t\tfooterCopy = footer.clone().prependTo( table );\n\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\tfooterSrcEls = footerCopy.find('tr');\n\t\tfooterCopy.find('[id]').removeAttr('id');\n\t}\n\n\t// Clone the current header and footer elements and then place it into the inner table\n\theaderCopy = header.clone().prependTo( table );\n\theaderTrgEls = header.find('tr'); // original header is in its own table\n\theaderSrcEls = headerCopy.find('tr');\n\theaderCopy.find('th, td').removeAttr('tabindex');\n\theaderCopy.find('[id]').removeAttr('id');\n\n\n\t/*\n\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t */\n\n\t// Remove old sizing and apply the calculated column widths\n\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t// calculated sizes to this header\n\tif ( ! scrollX )\n\t{\n\t\tdivBodyStyle.width = '100%';\n\t\tdivHeader[0].style.width = '100%';\n\t}\n\n\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t} );\n\n\tif ( footer ) {\n\t\t_fnApplyToChildren( function(n) {\n\t\t\tn.style.width = \"\";\n\t\t}, footerSrcEls );\n\t}\n\n\t// Size the table as a whole\n\tsanityWidth = table.outerWidth();\n\tif ( scrollX === \"\" ) {\n\t\t// No x scrolling\n\t\ttableStyle.width = \"100%\";\n\n\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t// into account.\n\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t}\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\telse if ( scrollXInner !== \"\" ) {\n\t\t// legacy x scroll inner has been given - use it\n\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\n\t// Hidden header should have zero height, so remove padding and borders. Then\n\t// set the width based on the real headers\n\n\t// Apply all styles in one pass\n\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\n\t// Read all widths in next pass\n\t_fnApplyToChildren( function(nSizer) {\n\t\tvar style = window.getComputedStyle ?\n\t\t\twindow.getComputedStyle(nSizer).width :\n\t\t\t_fnStringToCss( $(nSizer).width() );\n\n\t\theaderContent.push( nSizer.innerHTML );\n\t\theaderWidths.push( style );\n\t}, headerSrcEls );\n\n\t// Apply all widths in final pass\n\t_fnApplyToChildren( function(nToSize, i) {\n\t\tnToSize.style.width = headerWidths[i];\n\t}, headerTrgEls );\n\n\t$(headerSrcEls).css('height', 0);\n\n\t/* Same again with the footer if we have one */\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\tnToSize.style.width = footerWidths[i];\n\t\t}, footerTrgEls );\n\n\t\t$(footerSrcEls).height(0);\n\t}\n\n\n\t/*\n\t * 3. Apply the measurements\n\t */\n\n\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t// the content of the cell so that the width applied to the header and body\n\t// both match, but we want to hide it completely. We want to also fix their\n\t// width to what they currently are\n\t_fnApplyToChildren( function(nSizer, i) {\n\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+headerContent[i]+'</div>';\n\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\tnSizer.style.width = headerWidths[i];\n\t}, headerSrcEls );\n\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+footerContent[i]+'</div>';\n\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\tnSizer.style.width = footerWidths[i];\n\t\t}, footerSrcEls );\n\t}\n\n\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\tif ( Math.round(table.outerWidth()) < Math.round(sanityWidth) )\n\t{\n\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\tsanityWidth+barWidth :\n\t\t\t\tsanityWidth;\n\n\t\t// IE6/7 are a law unto themselves...\n\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t}\n\n\t\t// And give the user a warning that we've stopped the table getting too small\n\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t}\n\t}\n\telse\n\t{\n\t\tcorrection = '100%';\n\t}\n\n\t// Apply to the container elements\n\tdivBodyStyle.width = _fnStringToCss( correction );\n\tdivHeaderStyle.width = _fnStringToCss( correction );\n\n\tif ( footer ) {\n\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t}\n\n\n\t/*\n\t * 4. Clean up\n\t */\n\tif ( ! scrollY ) {\n\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t */\n\t\tif ( ie67 ) {\n\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t}\n\t}\n\n\t/* Finally set the width's of the header and footer tables */\n\tvar iOuterWidth = table.outerWidth();\n\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\n\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\n\tif ( footer ) {\n\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t}\n\n\t// Correct DOM ordering for colgroup - comes before the thead\n\ttable.children('colgroup').insertBefore( table.children('thead') );\n\n\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\tdivBody.trigger('scroll');\n\n\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t// only if we aren't holding the position\n\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\tdivBodyEl.scrollTop = 0;\n\t}\n}\n\n\n\n/**\n * Apply a given function to the display child nodes of an element array (typically\n * TD children of TR rows\n *  @param {function} fn Method to apply to the objects\n *  @param array {nodes} an1 List of elements to look through for display children\n *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyToChildren( fn, an1, an2 )\n{\n\tvar index=0, i=0, iLen=an1.length;\n\tvar nNode1, nNode2;\n\n\twhile ( i < iLen ) {\n\t\tnNode1 = an1[i].firstChild;\n\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\n\t\twhile ( nNode1 ) {\n\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\tif ( an2 ) {\n\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t}\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t}\n\n\t\ti++;\n\t}\n}\n\n\n\nvar __re_html_remove = /<.*?>/g;\n\n\n/**\n * Calculate the width of columns for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnCalculateColumnWidths ( oSettings )\n{\n\tvar\n\t\ttable = oSettings.nTable,\n\t\tcolumns = oSettings.aoColumns,\n\t\tscroll = oSettings.oScroll,\n\t\tscrollY = scroll.sY,\n\t\tscrollX = scroll.sX,\n\t\tscrollXInner = scroll.sXInner,\n\t\tcolumnCount = columns.length,\n\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\theaderCells = $('th', oSettings.nTHead),\n\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\ttableContainer = table.parentNode,\n\t\tuserInputs = false,\n\t\ti, column, columnIdx, width, outerWidth,\n\t\tbrowser = oSettings.oBrowser,\n\t\tie67 = browser.bScrollOversize;\n\n\tvar styleWidth = table.style.width;\n\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\ttableWidthAttr = styleWidth;\n\t}\n\n\t/* Convert any user input sizes into pixel sizes */\n\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\tif ( column.sWidth !== null ) {\n\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\n\t\t\tuserInputs = true;\n\t\t}\n\t}\n\n\t/* If the number of columns in the DOM equals the number that we have to\n\t * process in DataTables, then we can use the offsets that are created by\n\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t * nor scrolling used\n\t */\n\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t     columnCount == headerCells.length\n\t) {\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\n\t\t\tif ( colIdx !== null ) {\n\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t// table widths\n\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t.removeAttr( 'id' );\n\n\t\t// Clean up the table body\n\t\ttmpTable.find('tbody tr').remove();\n\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\n\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t// real header and footer are contained in different table tags\n\t\ttmpTable.find('thead, tfoot').remove();\n\t\ttmpTable\n\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t.append( $(oSettings.nTFoot).clone() );\n\n\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\n\t\t// Apply custom sizing to the cloned header\n\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t'';\n\n\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t// width the column requires, then it will have no effect\n\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborder: 0,\n\t\t\t\t\theight: 1\n\t\t\t\t} ) );\n\t\t\t}\n\t\t}\n\n\t\t// Find the widest cell for each column and put it into the table\n\t\tif ( oSettings.aoData.length ) {\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\tcolumn = columns[ columnIdx ];\n\n\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t.clone( false )\n\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t.appendTo( tr );\n\t\t\t}\n\t\t}\n\n\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t// duplicated in the dom (radio elements for example)\n\t\t$('[name]', tmpTable).removeAttr('name');\n\n\t\t// Table has been built, attach to the document so we can work with it.\n\t\t// A holding element is used, positioned at the top of the container\n\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t// needed\n\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\theight: 1,\n\t\t\t\t\tright: 0,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} :\n\t\t\t\t{}\n\t\t\t)\n\t\t\t.append( tmpTable )\n\t\t\t.appendTo( tableContainer );\n\n\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t// is. This results in slightly different, but I think correct behaviour\n\t\tif ( scrollX && scrollXInner ) {\n\t\t\ttmpTable.width( scrollXInner );\n\t\t}\n\t\telse if ( scrollX ) {\n\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\ttmpTable.removeAttr('width');\n\n\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t// collapse\n\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t}\n\t\telse if ( scrollY ) {\n\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t}\n\t\telse if ( tableWidthAttr ) {\n\t\t\ttmpTable.width( tableWidthAttr );\n\t\t}\n\n\t\t// Get the width of each column in the constructed table - we need to\n\t\t// know the inner width (so it can be assigned to the other table's\n\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t// column, but if ever a header can span multiple columns, this will\n\t\t// need to be modified.\n\t\tvar total = 0;\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tvar cell = $(headerCells[i]);\n\t\t\tvar border = cell.outerWidth() - cell.width();\n\n\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\tcell.outerWidth();\n\n\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\ttotal += bounding;\n\n\t\t\t// Width for each column to use\n\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t}\n\n\t\ttable.style.width = _fnStringToCss( total );\n\n\t\t// Finished with the table - ditch it\n\t\tholder.remove();\n\t}\n\n\t// If there is a width attr, we want to attach an event listener which\n\t// allows the table sizing to automatically adjust when the window is\n\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t// CSS is a relative value or absolute - DOM read is always px.\n\tif ( tableWidthAttr ) {\n\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t}\n\n\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\tvar bindResize = function () {\n\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t} ) );\n\t\t};\n\n\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\tif ( ie67 ) {\n\t\t\tsetTimeout( bindResize, 1000 );\n\t\t}\n\t\telse {\n\t\t\tbindResize();\n\t\t}\n\n\t\toSettings._reszEvt = true;\n\t}\n}\n\n\n/**\n * Throttle the calls to a function. Arguments and context are maintained for\n * the throttled function\n *  @param {function} fn Function to be called\n *  @param {int} [freq=200] call frequency in mS\n *  @returns {function} wrapped function\n *  @memberof DataTable#oApi\n */\nvar _fnThrottle = DataTable.util.throttle;\n\n\n/**\n * Convert a CSS unit width to pixels (e.g. 2em)\n *  @param {string} width width to be converted\n *  @param {node} parent parent to get the with for (required for relative widths) - optional\n *  @returns {int} width in pixels\n *  @memberof DataTable#oApi\n */\nfunction _fnConvertToWidth ( width, parent )\n{\n\tif ( ! width ) {\n\t\treturn 0;\n\t}\n\n\tvar n = $('<div/>')\n\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t.appendTo( parent || document.body );\n\n\tvar val = n[0].offsetWidth;\n\tn.remove();\n\n\treturn val;\n}\n\n\n/**\n * Get the widest node\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {node} widest table node\n *  @memberof DataTable#oApi\n */\nfunction _fnGetWidestNode( settings, colIdx )\n{\n\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\tif ( idx < 0 ) {\n\t\treturn null;\n\t}\n\n\tvar data = settings.aoData[ idx ];\n\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\tdata.anCells[ colIdx ];\n}\n\n\n/**\n * Get the maximum strlen for each data column\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {string} max string length for each column\n *  @memberof DataTable#oApi\n */\nfunction _fnGetMaxLenString( settings, colIdx )\n{\n\tvar s, max=-1, maxIdx = -1;\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\ts = s.replace( __re_html_remove, '' );\n\t\ts = s.replace( /&nbsp;/g, ' ' );\n\n\t\tif ( s.length > max ) {\n\t\t\tmax = s.length;\n\t\t\tmaxIdx = i;\n\t\t}\n\t}\n\n\treturn maxIdx;\n}\n\n\n/**\n * Append a CSS unit (only if required) to a string\n *  @param {string} value to css-ify\n *  @returns {string} value with css unit\n *  @memberof DataTable#oApi\n */\nfunction _fnStringToCss( s )\n{\n\tif ( s === null ) {\n\t\treturn '0px';\n\t}\n\n\tif ( typeof s == 'number' ) {\n\t\treturn s < 0 ?\n\t\t\t'0px' :\n\t\t\ts+'px';\n\t}\n\n\t// Check it has a unit character already\n\treturn s.match(/\\d$/) ?\n\t\ts+'px' :\n\t\ts;\n}\n\n\n\nfunction _fnSortFlatten ( settings )\n{\n\tvar\n\t\ti, iLen, k, kLen,\n\t\taSort = [],\n\t\taiOrig = [],\n\t\taoColumns = settings.aoColumns,\n\t\taDataSort, iCol, sType, srcCol,\n\t\tfixed = settings.aaSortingFixed,\n\t\tfixedObj = $.isPlainObject( fixed ),\n\t\tnestedSort = [],\n\t\tadd = function ( a ) {\n\t\t\tif ( a.length && ! Array.isArray( a[0] ) ) {\n\t\t\t\t// 1D array\n\t\t\t\tnestedSort.push( a );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// 2D array\n\t\t\t\t$.merge( nestedSort, a );\n\t\t\t}\n\t\t};\n\n\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t// specified\n\tif ( Array.isArray( fixed ) ) {\n\t\tadd( fixed );\n\t}\n\n\tif ( fixedObj && fixed.pre ) {\n\t\tadd( fixed.pre );\n\t}\n\n\tadd( settings.aaSorting );\n\n\tif (fixedObj && fixed.post ) {\n\t\tadd( fixed.post );\n\t}\n\n\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t{\n\t\tsrcCol = nestedSort[i][0];\n\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\n\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t{\n\t\t\tiCol = aDataSort[k];\n\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\n\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t}\n\n\t\t\taSort.push( {\n\t\t\t\tsrc:       srcCol,\n\t\t\t\tcol:       iCol,\n\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\ttype:      sType,\n\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t} );\n\t\t}\n\t}\n\n\treturn aSort;\n}\n\n/**\n * Change the order of the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n *  @todo This really needs split up!\n */\nfunction _fnSort ( oSettings )\n{\n\tvar\n\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\tsDataType, nTh,\n\t\taiOrig = [],\n\t\toExtSort = DataTable.ext.type.order,\n\t\taoData = oSettings.aoData,\n\t\taoColumns = oSettings.aoColumns,\n\t\taDataSort, data, iCol, sType, oSort,\n\t\tformatters = 0,\n\t\tsortCol,\n\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\taSort;\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t//   data is going to be used in the table?\n\t_fnColumnTypes( oSettings );\n\n\taSort = _fnSortFlatten( oSettings );\n\n\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\tsortCol = aSort[i];\n\n\t\t// Track if we can use the fast sort algorithm\n\t\tif ( sortCol.formatter ) {\n\t\t\tformatters++;\n\t\t}\n\n\t\t// Load the data needed for the sort, for each cell\n\t\t_fnSortData( oSettings, sortCol.col );\n\t}\n\n\t/* No sorting required if server-side or no sorting array */\n\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t{\n\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t}\n\n\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t *  fnLocalSorting = function(a,b){\n\t\t *    var iTest;\n\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t *      if (iTest !== 0)\n\t\t *        return iTest;\n\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t *    if (iTest !== 0)\n\t\t *      return iTest;\n\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t *  }\n\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t * positions in the original data array to provide a stable sort.\n\t\t *\n\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t * methods which do not have a pre-sort formatting function.\n\t\t */\n\t\tif ( formatters === aSort.length ) {\n\t\t\t// All sort types have formatting functions\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t\telse {\n\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t// methods.\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t}\n\n\t/* Tell the draw function that we have sorted the data */\n\toSettings.bSorted = true;\n}\n\n\nfunction _fnSortAria ( settings )\n{\n\tvar label;\n\tvar nextSort;\n\tvar columns = settings.aoColumns;\n\tvar aSort = _fnSortFlatten( settings );\n\tvar oAria = settings.oLanguage.oAria;\n\n\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t// attributes as needed)\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tvar col = columns[i];\n\t\tvar asSorting = col.asSorting;\n\t\tvar sTitle = col.ariaTitle || col.sTitle.replace( /<.*?>/g, \"\" );\n\t\tvar th = col.nTh;\n\n\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t// attr() and removeAttr() methods...\n\t\tth.removeAttribute('aria-sort');\n\n\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\tif ( col.bSortable ) {\n\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnextSort = asSorting[0];\n\t\t\t}\n\n\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\toAria.sSortAscending :\n\t\t\t\toAria.sSortDescending\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tlabel = sTitle;\n\t\t}\n\n\t\tth.setAttribute('aria-label', label);\n\t}\n}\n\n\n/**\n * Function to run on user sort request\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {boolean} [append=false] Append the requested sort to the existing\n *    sort if true (i.e. multi-column sort)\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortListener ( settings, colIdx, append, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\tvar sorting = settings.aaSorting;\n\tvar asSorting = col.asSorting;\n\tvar nextSortIdx;\n\tvar next = function ( a, overflow ) {\n\t\tvar idx = a._idx;\n\t\tif ( idx === undefined ) {\n\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t}\n\n\t\treturn idx+1 < asSorting.length ?\n\t\t\tidx+1 :\n\t\t\toverflow ?\n\t\t\t\tnull :\n\t\t\t\t0;\n\t};\n\n\t// Convert to 2D array if needed\n\tif ( typeof sorting[0] === 'number' ) {\n\t\tsorting = settings.aaSorting = [ sorting ];\n\t}\n\n\t// If appending the sort then we are multi-column sorting\n\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t// Are we already doing some kind of sort on this column?\n\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\n\t\tif ( sortIdx !== -1 ) {\n\t\t\t// Yes, modify the sort\n\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\n\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t}\n\n\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// No sort on this column yet\n\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t}\n\t}\n\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t// Single column - already sorting on this column, modify the sort\n\t\tnextSortIdx = next( sorting[0] );\n\n\t\tsorting.length = 1;\n\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\tsorting[0]._idx = nextSortIdx;\n\t}\n\telse {\n\t\t// Single column - sort only on this column\n\t\tsorting.length = 0;\n\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\tsorting[0]._idx = 0;\n\t}\n\n\t// Run the sort by calling a full redraw\n\t_fnReDraw( settings );\n\n\t// callback used for async user interaction\n\tif ( typeof callback == 'function' ) {\n\t\tcallback( settings );\n\t}\n}\n\n\n/**\n * Attach a sort handler (click) to a node\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\n\t_fnBindAction( attachTo, {}, function (e) {\n\t\t/* If the column is not sortable - don't to anything */\n\t\tif ( col.bSortable === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If processing is enabled use a timeout to allow the processing\n\t\t// display to be shown - otherwise to it synchronously\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t_fnProcessingDisplay( settings, true );\n\n\t\t\tsetTimeout( function() {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\n\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t// processing display\n\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t}\n\t\telse {\n\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t}\n\t} );\n}\n\n\n/**\n * Set the sorting classes on table's body, Note: it is safe to call this function\n * when bSort and bSortClasses are false\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSortingClasses( settings )\n{\n\tvar oldSort = settings.aLastSort;\n\tvar sortClass = settings.oClasses.sSortColumn;\n\tvar sort = _fnSortFlatten( settings );\n\tvar features = settings.oFeatures;\n\tvar i, ien, colIdx;\n\n\tif ( features.bSort && features.bSortClasses ) {\n\t\t// Remove old sorting classes\n\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = oldSort[i].src;\n\n\t\t\t// Remove column sorting\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\n\t\t// Add new column sorting\n\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = sort[i].src;\n\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\t}\n\n\tsettings.aLastSort = sort;\n}\n\n\n// Get the data to sort a column, be it from cache, fresh (populating the\n// cache), or from a sort formatter\nfunction _fnSortData( settings, idx )\n{\n\t// Custom sorting function - provided by the sort data type\n\tvar column = settings.aoColumns[ idx ];\n\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\tvar customData;\n\n\tif ( customSort ) {\n\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t);\n\t}\n\n\t// Use / populate cache\n\tvar row, cellData;\n\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aSortData ) {\n\t\t\trow._aSortData = [];\n\t\t}\n\n\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\tcellData = customSort ?\n\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\n\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\tformatter( cellData ) :\n\t\t\t\tcellData;\n\t\t}\n\t}\n}\n\n\n\n/**\n * Save the state of a table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSaveState ( settings )\n{\n\tif (settings._bLoadingState) {\n\t\treturn;\n\t}\n\n\t/* Store the interesting variables */\n\tvar state = {\n\t\ttime:    +new Date(),\n\t\tstart:   settings._iDisplayStart,\n\t\tlength:  settings._iDisplayLength,\n\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\treturn {\n\t\t\t\tvisible: col.bVisible,\n\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t};\n\t\t} )\n\t};\n\n\tsettings.oSavedState = state;\n\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\n\tif ( settings.oFeatures.bStateSave && !settings.bDestroying )\n\t{\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t}\t\n}\n\n\n/**\n * Attempt to load a saved table state\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oInit DataTables init object so we can override settings\n *  @param {function} callback Callback to execute when the state has been loaded\n *  @memberof DataTable#oApi\n */\nfunction _fnLoadState ( settings, oInit, callback )\n{\n\tif ( ! settings.oFeatures.bStateSave ) {\n\t\tcallback();\n\t\treturn;\n\t}\n\n\tvar loaded = function(state) {\n\t\t_fnImplementState(settings, state, callback);\n\t}\n\n\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\n\tif ( state !== undefined ) {\n\t\t_fnImplementState( settings, state, callback );\n\t}\n\t// otherwise, wait for the loaded callback to be executed\n\n\treturn true;\n}\n\nfunction _fnImplementState ( settings, s, callback) {\n\tvar i, ien;\n\tvar columns = settings.aoColumns;\n\tsettings._bLoadingState = true;\n\n\t// When StateRestore was introduced the state could now be implemented at any time\n\t// Not just initialisation. To do this an api instance is required in some places\n\tvar api = settings._bInitComplete ? new DataTable.Api(settings) : null;\n\n\tif ( ! s || ! s.time ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t// cancelling of loading by returning false\n\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Reject old data\n\tvar duration = settings.iStateDuration;\n\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Number of columns have changed - all bets are off, no restore of settings\n\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Store the saved state so it might be accessed at any time\n\tsettings.oLoadedState = $.extend( true, {}, s );\n\n\t// Page Length\n\tif ( s.length !== undefined ) {\n\t\t// If already initialised just set the value directly so that the select element is also updated\n\t\tif (api) {\n\t\t\tapi.page.len(s.length)\n\t\t}\n\t\telse {\n\t\t\tsettings._iDisplayLength   = s.length;\n\t\t}\n\t}\n\n\t// Restore key features - todo - for 1.11 this needs to be done by\n\t// subscribed events\n\tif ( s.start !== undefined ) {\n\t\tif(api === null) {\n\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t}\n\t\telse {\n\t\t\t_fnPageChange(settings, s.start/settings._iDisplayLength);\n\t\t}\n\t}\n\n\t// Order\n\tif ( s.order !== undefined ) {\n\t\tsettings.aaSorting = [];\n\t\t$.each( s.order, function ( i, col ) {\n\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t[ 0, col[1] ] :\n\t\t\t\tcol\n\t\t\t);\n\t\t} );\n\t}\n\n\t// Search\n\tif ( s.search !== undefined ) {\n\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t}\n\n\t// Columns\n\tif ( s.columns ) {\n\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\tvar col = s.columns[i];\n\n\t\t\t// Visibility\n\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t// If the api is defined, the table has been initialised so we need to use it rather than internal settings\n\t\t\t\tif (api) {\n\t\t\t\t\t// Don't redraw the columns on every iteration of this loop, we will do this at the end instead\n\t\t\t\t\tapi.column(i).visible(col.visible, false);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Search\n\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t}\n\t\t}\n\t\t\n\t\t// If the api is defined then we need to adjust the columns once the visibility has been changed\n\t\tif (api) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t}\n\n\tsettings._bLoadingState = false;\n\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\tcallback();\n};\n\n\n/**\n * Return the settings object for a particular table\n *  @param {node} table table we are using as a dataTable\n *  @returns {object} Settings object - or null if not found\n *  @memberof DataTable#oApi\n */\nfunction _fnSettingsFromNode ( table )\n{\n\tvar settings = DataTable.settings;\n\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\n\treturn idx !== -1 ?\n\t\tsettings[ idx ] :\n\t\tnull;\n}\n\n\n/**\n * Log an error message\n *  @param {object} settings dataTables settings object\n *  @param {int} level log error messages, or display them to the user\n *  @param {string} msg error message\n *  @param {int} tn Technical note id to get more information about the error.\n *  @memberof DataTable#oApi\n */\nfunction _fnLog( settings, level, msg, tn )\n{\n\tmsg = 'DataTables warning: '+\n\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\n\tif ( tn ) {\n\t\tmsg += '. For more information about this error, please see '+\n\t\t'http://datatables.net/tn/'+tn;\n\t}\n\n\tif ( ! level  ) {\n\t\t// Backwards compatibility pre 1.10\n\t\tvar ext = DataTable.ext;\n\t\tvar type = ext.sErrMode || ext.errMode;\n\n\t\tif ( settings ) {\n\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t}\n\n\t\tif ( type == 'alert' ) {\n\t\t\talert( msg );\n\t\t}\n\t\telse if ( type == 'throw' ) {\n\t\t\tthrow new Error(msg);\n\t\t}\n\t\telse if ( typeof type == 'function' ) {\n\t\t\ttype( settings, tn, msg );\n\t\t}\n\t}\n\telse if ( window.console && console.log ) {\n\t\tconsole.log( msg );\n\t}\n}\n\n\n/**\n * See if a property is defined on one object, if so assign it to the other object\n *  @param {object} ret target object\n *  @param {object} src source object\n *  @param {string} name property\n *  @param {string} [mappedName] name to map too - optional, name used if not given\n *  @memberof DataTable#oApi\n */\nfunction _fnMap( ret, src, name, mappedName )\n{\n\tif ( Array.isArray( name ) ) {\n\t\t$.each( name, function (i, val) {\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnMap( ret, src, val );\n\t\t\t}\n\t\t} );\n\n\t\treturn;\n\t}\n\n\tif ( mappedName === undefined ) {\n\t\tmappedName = name;\n\t}\n\n\tif ( src[name] !== undefined ) {\n\t\tret[mappedName] = src[name];\n\t}\n}\n\n\n/**\n * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n * shallow copy arrays. The reason we need to do this, is that we don't want to\n * deep copy array init values (such as aaSorting) since the dev wouldn't be\n * able to override them, but we do want to deep copy arrays.\n *  @param {object} out Object to extend\n *  @param {object} extender Object from which the properties will be applied to\n *      out\n *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n *      independent copy with the exception of the `data` or `aaData` parameters\n *      if they are present. This is so you can pass in a collection to\n *      DataTables and have that used as your data source without breaking the\n *      references\n *  @returns {object} out Reference, just for convenience - out === the return.\n *  @memberof DataTable#oApi\n *  @todo This doesn't take account of arrays inside the deep copied objects.\n */\nfunction _fnExtend( out, extender, breakRefs )\n{\n\tvar val;\n\n\tfor ( var prop in extender ) {\n\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\tval = extender[prop];\n\n\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\tout[prop] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t}\n\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && Array.isArray(val) ) {\n\t\t\t\tout[prop] = val.slice();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout[prop] = val;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n}\n\n\n/**\n * Bind an event handers to allow a click or return key to activate the callback.\n * This is good for accessibility since a return on the keyboard will have the\n * same effect as a click, if the element has focus.\n *  @param {element} n Element to bind the action to\n *  @param {object} oData Data object to pass to the triggered function\n *  @param {function} fn Callback function for when the event is triggered\n *  @memberof DataTable#oApi\n */\nfunction _fnBindAction( n, oData, fn )\n{\n\t$(n)\n\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t$(n).trigger('blur'); // Remove focus outline for mouse users\n\t\t\t\tfn(e);\n\t\t\t} )\n\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfn(e);\n\t\t\t\t}\n\t\t\t} )\n\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\treturn false;\n\t\t\t} );\n}\n\n\n/**\n * Register a callback function. Easily allows a callback function to be added to\n * an array store of callback functions that can then all be called together.\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n *  @param {function} fn Function to be called back\n *  @param {string} sName Identifying name for the callback (i.e. a label)\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n{\n\tif ( fn )\n\t{\n\t\toSettings[sStore].push( {\n\t\t\t\"fn\": fn,\n\t\t\t\"sName\": sName\n\t\t} );\n\t}\n}\n\n\n/**\n * Fire callback functions and trigger events. Note that the loop over the\n * callback array store is done backwards! Further note that you do not want to\n * fire off triggers in time sensitive applications (for example cell creation)\n * as its slow.\n *  @param {object} settings dataTables settings object\n *  @param {string} callbackArr Name of the array storage for the callbacks in\n *      oSettings\n *  @param {string} eventName Name of the jQuery custom event to trigger. If\n *      null no trigger is fired\n *  @param {array} args Array of arguments to pass to the callback function /\n *      trigger\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n{\n\tvar ret = [];\n\n\tif ( callbackArr ) {\n\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t} );\n\t}\n\n\tif ( eventName !== null ) {\n\t\tvar e = $.Event( eventName+'.dt' );\n\t\tvar table = $(settings.nTable);\n\n\t\ttable.trigger( e, args );\n\n\t\t// If not yet attached to the document, trigger the event\n\t\t// on the body directly to sort of simulate the bubble\n\t\tif (table.parents('body').length === 0) {\n\t\t\t$('body').trigger( e, args );\n\t\t}\n\n\t\tret.push( e.result );\n\t}\n\n\treturn ret;\n}\n\n\nfunction _fnLengthOverflow ( settings )\n{\n\tvar\n\t\tstart = settings._iDisplayStart,\n\t\tend = settings.fnDisplayEnd(),\n\t\tlen = settings._iDisplayLength;\n\n\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\tif ( start >= end )\n\t{\n\t\tstart = end - len;\n\t}\n\n\t// Keep the start record on the current page\n\tstart -= (start % len);\n\n\tif ( len === -1 || start < 0 )\n\t{\n\t\tstart = 0;\n\t}\n\n\tsettings._iDisplayStart = start;\n}\n\n\nfunction _fnRenderer( settings, type )\n{\n\tvar renderer = settings.renderer;\n\tvar host = DataTable.ext.renderer[type];\n\n\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t// the default.\n\t\treturn host[renderer[type]] || host._;\n\t}\n\telse if ( typeof renderer === 'string' ) {\n\t\t// Common renderer - if there is one available for this type use it,\n\t\t// otherwise use the default\n\t\treturn host[renderer] || host._;\n\t}\n\n\t// Use the default\n\treturn host._;\n}\n\n\n/**\n * Detect the data source being used for the table. Used to simplify the code\n * a little (ajax) and to make it compress a little smaller.\n *\n *  @param {object} settings dataTables settings object\n *  @returns {string} Data source\n *  @memberof DataTable#oApi\n */\nfunction _fnDataSource ( settings )\n{\n\tif ( settings.oFeatures.bServerSide ) {\n\t\treturn 'ssp';\n\t}\n\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\treturn 'ajax';\n\t}\n\treturn 'dom';\n}\n\n\n\n\n/**\n * Computed structure of the DataTables API, defined by the options passed to\n * `DataTable.Api.register()` when building the API.\n *\n * The structure is built in order to speed creation and extension of the Api\n * objects since the extensions are effectively pre-parsed.\n *\n * The array is an array of objects with the following structure, where this\n * base array represents the Api prototype base:\n *\n *     [\n *       {\n *         name:      'data'                -- string   - Property name\n *         val:       function () {},       -- function - Api method (or undefined if just an object\n *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n *       },\n *       {\n *         name:     'row'\n *         val:       {},\n *         methodExt: [ ... ],\n *         propExt:   [\n *           {\n *             name:      'data'\n *             val:       function () {},\n *             methodExt: [ ... ],\n *             propExt:   [ ... ]\n *           },\n *           ...\n *         ]\n *       }\n *     ]\n *\n * @type {Array}\n * @ignore\n */\nvar __apiStruct = [];\n\n\n/**\n * `Array.prototype` reference.\n *\n * @type object\n * @ignore\n */\nvar __arrayProto = Array.prototype;\n\n\n/**\n * Abstraction for `context` parameter of the `Api` constructor to allow it to\n * take several different forms for ease of use.\n *\n * Each of the input parameter types will be converted to a DataTables settings\n * object where possible.\n *\n * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n *   of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n *   * `DataTables.Api` - API instance\n * @return {array|null} Matching DataTables settings objects. `null` or\n *   `undefined` is returned if no matching DataTable is found.\n * @ignore\n */\nvar _toSettings = function ( mixed )\n{\n\tvar idx, jq;\n\tvar settings = DataTable.settings;\n\tvar tables = $.map( settings, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\tif ( ! mixed ) {\n\t\treturn [];\n\t}\n\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t// DataTables settings object\n\t\treturn [ mixed ];\n\t}\n\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t// Table node\n\t\tidx = $.inArray( mixed, tables );\n\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t}\n\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\treturn mixed.settings().toArray();\n\t}\n\telse if ( typeof mixed === 'string' ) {\n\t\t// jQuery selector\n\t\tjq = $(mixed);\n\t}\n\telse if ( mixed instanceof $ ) {\n\t\t// jQuery object (also DataTables instance)\n\t\tjq = mixed;\n\t}\n\n\tif ( jq ) {\n\t\treturn jq.map( function(i) {\n\t\t\tidx = $.inArray( this, tables );\n\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t} ).toArray();\n\t}\n};\n\n\n/**\n * DataTables API class - used to control and interface with  one or more\n * DataTables enhanced tables.\n *\n * The API class is heavily based on jQuery, presenting a chainable interface\n * that you can use to interact with tables. Each instance of the API class has\n * a \"context\" - i.e. the tables that it will operate on. This could be a single\n * table, all tables on a page or a sub-set thereof.\n *\n * Additionally the API is designed to allow you to easily work with the data in\n * the tables, retrieving and manipulating it as required. This is done by\n * presenting the API class as an array like interface. The contents of the\n * array depend upon the actions requested by each method (for example\n * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n * return an array of objects or arrays depending upon your table's\n * configuration). The API object has a number of array like methods (`push`,\n * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n * `unique` etc) to assist your working with the data held in a table.\n *\n * Most methods (those which return an Api instance) are chainable, which means\n * the return from a method call also has all of the methods available that the\n * top level object had. For example, these two calls are equivalent:\n *\n *     // Not chained\n *     api.row.add( {...} );\n *     api.draw();\n *\n *     // Chained\n *     api.row.add( {...} ).draw();\n *\n * @class DataTable.Api\n * @param {array|object|string|jQuery} context DataTable identifier. This is\n *   used to define which DataTables enhanced tables this API will operate on.\n *   Can be one of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n * @param {array} [data] Data to initialise the Api instance with.\n *\n * @example\n *   // Direct initialisation during DataTables construction\n *   var api = $('#example').DataTable();\n *\n * @example\n *   // Initialisation using a DataTables jQuery object\n *   var api = $('#example').dataTable().api();\n *\n * @example\n *   // Initialisation as a constructor\n *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n */\n_Api = function ( context, data )\n{\n\tif ( ! (this instanceof _Api) ) {\n\t\treturn new _Api( context, data );\n\t}\n\n\tvar settings = [];\n\tvar ctxSettings = function ( o ) {\n\t\tvar a = _toSettings( o );\n\t\tif ( a ) {\n\t\t\tsettings.push.apply( settings, a );\n\t\t}\n\t};\n\n\tif ( Array.isArray( context ) ) {\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tctxSettings( context[i] );\n\t\t}\n\t}\n\telse {\n\t\tctxSettings( context );\n\t}\n\n\t// Remove duplicates\n\tthis.context = _unique( settings );\n\n\t// Initial data\n\tif ( data ) {\n\t\t$.merge( this, data );\n\t}\n\n\t// selector\n\tthis.selector = {\n\t\trows: null,\n\t\tcols: null,\n\t\topts: null\n\t};\n\n\t_Api.extend( this, this, __apiStruct );\n};\n\nDataTable.Api = _Api;\n\n// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n// isPlainObject.\n$.extend( _Api.prototype, {\n\tany: function ()\n\t{\n\t\treturn this.count() !== 0;\n\t},\n\n\n\tconcat:  __arrayProto.concat,\n\n\n\tcontext: [], // array of table settings objects\n\n\n\tcount: function ()\n\t{\n\t\treturn this.flatten().length;\n\t},\n\n\n\teach: function ( fn )\n\t{\n\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\tfn.call( this, this[i], i, this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\n\teq: function ( idx )\n\t{\n\t\tvar ctx = this.context;\n\n\t\treturn ctx.length > idx ?\n\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\tnull;\n\t},\n\n\n\tfilter: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.filter ) {\n\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\ta.push( this[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tflatten: function ()\n\t{\n\t\tvar a = [];\n\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t},\n\n\n\tjoin:    __arrayProto.join,\n\n\n\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t{\n\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\tif ( this[i] === obj ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\tvar\n\t\t\ta = [], ret,\n\t\t\ti, ien, j, jen,\n\t\t\tcontext = this.context,\n\t\t\trows, items, item,\n\t\t\tselector = this.selector;\n\n\t\t// Argument shifting\n\t\tif ( typeof flatten === 'string' ) {\n\t\t\talwaysNew = fn;\n\t\t\tfn = type;\n\t\t\ttype = flatten;\n\t\t\tflatten = false;\n\t\t}\n\n\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tvar apiInst = new _Api( context[i] );\n\n\t\t\tif ( type === 'table' ) {\n\t\t\t\tret = fn.call( apiInst, context[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\titems = this[i];\n\n\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t}\n\n\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\titem = items[j];\n\n\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( a.length || alwaysNew ) {\n\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\tvar apiSelector = api.selector;\n\t\t\tapiSelector.rows = selector.rows;\n\t\t\tapiSelector.cols = selector.cols;\n\t\t\tapiSelector.opts = selector.opts;\n\t\t\treturn api;\n\t\t}\n\t\treturn this;\n\t},\n\n\n\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t{\n\t\t// Bit cheeky...\n\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t},\n\n\n\tlength:  0,\n\n\n\tmap: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.map ) {\n\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tpluck: function ( prop )\n\t{\n\t\tvar fn = DataTable.util.get(prop);\n\n\t\treturn this.map( function ( el ) {\n\t\t\treturn fn(el);\n\t\t} );\n\t},\n\n\tpop:     __arrayProto.pop,\n\n\n\tpush:    __arrayProto.push,\n\n\n\t// Does not return an API instance\n\treduce: __arrayProto.reduce || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t},\n\n\n\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t},\n\n\n\treverse: __arrayProto.reverse,\n\n\n\t// Object with rows, columns and opts\n\tselector: null,\n\n\n\tshift:   __arrayProto.shift,\n\n\n\tslice: function () {\n\t\treturn new _Api( this.context, this );\n\t},\n\n\n\tsort:    __arrayProto.sort, // ? name - order?\n\n\n\tsplice:  __arrayProto.splice,\n\n\n\ttoArray: function ()\n\t{\n\t\treturn __arrayProto.slice.call( this );\n\t},\n\n\n\tto$: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\ttoJQuery: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\tunique: function ()\n\t{\n\t\treturn new _Api( this.context, _unique(this) );\n\t},\n\n\n\tunshift: __arrayProto.unshift\n} );\n\n\n_Api.extend = function ( scope, obj, ext )\n{\n\t// Only extend API instances and static properties of the API\n\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\tstruct,\n\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\treturn function () {\n\t\t\t\tvar ret = fn.apply( scope, arguments );\n\n\t\t\t\t// Method extension\n\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\treturn ret;\n\t\t\t};\n\t\t};\n\n\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\tstruct = ext[i];\n\n\t\t// Value\n\t\tobj[ struct.name ] = struct.type === 'function' ?\n\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\tstruct.type === 'object' ?\n\t\t\t\t{} :\n\t\t\t\tstruct.val;\n\n\t\tobj[ struct.name ].__dt_wrapper = true;\n\n\t\t// Property extension\n\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t}\n};\n\n\n// @todo - Is there need for an augment function?\n// _Api.augment = function ( inst, name )\n// {\n// \t// Find src object in the structure from the name\n// \tvar parts = name.split('.');\n\n// \t_Api.extend( inst, obj );\n// };\n\n\n//     [\n//       {\n//         name:      'data'                -- string   - Property name\n//         val:       function () {},       -- function - Api method (or undefined if just an object\n//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n//       },\n//       {\n//         name:     'row'\n//         val:       {},\n//         methodExt: [ ... ],\n//         propExt:   [\n//           {\n//             name:      'data'\n//             val:       function () {},\n//             methodExt: [ ... ],\n//             propExt:   [ ... ]\n//           },\n//           ...\n//         ]\n//       }\n//     ]\n\n_Api.register = _api_register = function ( name, val )\n{\n\tif ( Array.isArray( name ) ) {\n\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t_Api.register( name[j], val );\n\t\t}\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\their = name.split('.'),\n\t\tstruct = __apiStruct,\n\t\tkey, method;\n\n\tvar find = function ( src, name ) {\n\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\tif ( src[i].name === name ) {\n\t\t\t\treturn src[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\tkey = method ?\n\t\t\their[i].replace('()', '') :\n\t\t\their[i];\n\n\t\tvar src = find( struct, key );\n\t\tif ( ! src ) {\n\t\t\tsrc = {\n\t\t\t\tname:      key,\n\t\t\t\tval:       {},\n\t\t\t\tmethodExt: [],\n\t\t\t\tpropExt:   [],\n\t\t\t\ttype:      'object'\n\t\t\t};\n\t\t\tstruct.push( src );\n\t\t}\n\n\t\tif ( i === ien-1 ) {\n\t\t\tsrc.val = val;\n\t\t\tsrc.type = typeof val === 'function' ?\n\t\t\t\t'function' :\n\t\t\t\t$.isPlainObject( val ) ?\n\t\t\t\t\t'object' :\n\t\t\t\t\t'other';\n\t\t}\n\t\telse {\n\t\t\tstruct = method ?\n\t\t\t\tsrc.methodExt :\n\t\t\t\tsrc.propExt;\n\t\t}\n\t}\n};\n\n_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t_Api.register( pluralName, val );\n\n\t_Api.register( singularName, function () {\n\t\tvar ret = val.apply( this, arguments );\n\n\t\tif ( ret === this ) {\n\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\treturn this;\n\t\t}\n\t\telse if ( ret instanceof _Api ) {\n\t\t\t// New API instance returned, want the value from the first item\n\t\t\t// in the returned array for the singular result.\n\t\t\treturn ret.length ?\n\t\t\t\tArray.isArray( ret[0] ) ?\n\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\tret[0] :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// Non-API return - just fire it back\n\t\treturn ret;\n\t} );\n};\n\n\n/**\n * Selector for HTML tables. Apply the given selector to the give array of\n * DataTables settings objects.\n *\n * @param {string|integer} [selector] jQuery selector string or integer\n * @param  {array} Array of DataTables settings objects to be filtered\n * @return {array}\n * @ignore\n */\nvar __table_selector = function ( selector, a )\n{\n\tif ( Array.isArray(selector) ) {\n\t\treturn $.map( selector, function (item) {\n\t\t\treturn __table_selector(item, a);\n\t\t} );\n\t}\n\n\t// Integer is used to pick out a table by index\n\tif ( typeof selector === 'number' ) {\n\t\treturn [ a[ selector ] ];\n\t}\n\n\t// Perform a jQuery selector on the table nodes\n\tvar nodes = $.map( a, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\treturn $(nodes)\n\t\t.filter( selector )\n\t\t.map( function (i) {\n\t\t\t// Need to translate back from the table node to the settings\n\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\treturn a[ idx ];\n\t\t} )\n\t\t.toArray();\n};\n\n\n\n/**\n * Context selector for the API's context (i.e. the tables the API instance\n * refers to.\n *\n * @name    DataTable.Api#tables\n * @param {string|integer} [selector] Selector to pick which tables the iterator\n *   should operate on. If not given, all tables in the current context are\n *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n *   select multiple tables or as an integer to select a single table.\n * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n */\n_api_register( 'tables()', function ( selector ) {\n\t// A new instance is created if there was a selector specified\n\treturn selector !== undefined && selector !== null ?\n\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\tthis;\n} );\n\n\n_api_register( 'table()', function ( selector ) {\n\tvar tables = this.tables( selector );\n\tvar ctx = tables.context;\n\n\t// Truncate to the first matched table\n\treturn ctx.length ?\n\t\tnew _Api( ctx[0] ) :\n\t\ttables;\n} );\n\n\n_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTable;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTBody;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTHead;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTFoot;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTableWrapper;\n\t}, 1 );\n} );\n\n\n\n/**\n * Redraw the tables in the current context.\n */\n_api_register( 'draw()', function ( paging ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( paging === 'page' ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t\telse {\n\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\tfalse :\n\t\t\t\t\ttrue;\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, paging===false );\n\t\t}\n\t} );\n} );\n\n\n\n/**\n * Get the current page index.\n *\n * @return {integer} Current page index (zero based)\n *//**\n * Set the current page.\n *\n * Note that if you attempt to show a page which does not exist, DataTables will\n * not throw an error, but rather reset the paging.\n *\n * @param {integer|string} action The paging action to take. This can be one of:\n *  * `integer` - The page index to jump to\n *  * `string` - An action to take:\n *    * `first` - Jump to first page.\n *    * `next` - Jump to the next page\n *    * `previous` - Jump to previous page\n *    * `last` - Jump to the last page.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page()', function ( action ) {\n\tif ( action === undefined ) {\n\t\treturn this.page.info().page; // not an expensive call\n\t}\n\n\t// else, have an action to take on all tables\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnPageChange( settings, action );\n\t} );\n} );\n\n\n/**\n * Paging information for the first table in the current context.\n *\n * If you require paging information for another table, use the `table()` method\n * with a suitable selector.\n *\n * @return {object} Object with the following properties set:\n *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n *  * `pages` - Total number of pages\n *  * `start` - Display index for the first record shown on the current page\n *  * `end` - Display index for the last record shown on the current page\n *  * `length` - Display length (number of records). Note that generally `start\n *    + length = end`, but this is not always true, for example if there are\n *    only 2 records to show on the final page, with a length of 10.\n *  * `recordsTotal` - Full data set length\n *  * `recordsDisplay` - Data set length once the current filtering criterion\n *    are applied.\n */\n_api_register( 'page.info()', function ( action ) {\n\tif ( this.context.length === 0 ) {\n\t\treturn undefined;\n\t}\n\n\tvar\n\t\tsettings   = this.context[0],\n\t\tstart      = settings._iDisplayStart,\n\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn {\n\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\"start\":          start,\n\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\"length\":         len,\n\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\"recordsDisplay\": visRecords,\n\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t};\n} );\n\n\n/**\n * Get the current page length.\n *\n * @return {integer} Current page length. Note `-1` indicates that all records\n *   are to be shown.\n *//**\n * Set the current page length.\n *\n * @param {integer} Page length to set. Use `-1` to show all records.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page.len()', function ( len ) {\n\t// Note that we can't call this function 'length()' because `length`\n\t// is a Javascript property of functions which defines how many arguments\n\t// the function expects.\n\tif ( len === undefined ) {\n\t\treturn this.context.length !== 0 ?\n\t\t\tthis.context[0]._iDisplayLength :\n\t\t\tundefined;\n\t}\n\n\t// else, set the page length\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnLengthChange( settings, len );\n\t} );\n} );\n\n\n\nvar __reload = function ( settings, holdPosition, callback ) {\n\t// Use the draw event to trigger a callback\n\tif ( callback ) {\n\t\tvar api = new _Api( settings );\n\n\t\tapi.one( 'draw', function () {\n\t\t\tcallback( api.ajax.json() );\n\t\t} );\n\t}\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t_fnReDraw( settings, holdPosition );\n\t}\n\telse {\n\t\t_fnProcessingDisplay( settings, true );\n\n\t\t// Cancel an existing request\n\t\tvar xhr = settings.jqXHR;\n\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\txhr.abort();\n\t\t}\n\n\t\t// Trigger xhr\n\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t_fnClearTable( settings );\n\n\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t} );\n\t}\n};\n\n\n/**\n * Get the JSON response from the last Ajax request that DataTables made to the\n * server. Note that this returns the JSON from the first table in the current\n * context.\n *\n * @return {object} JSON received from the server.\n */\n_api_register( 'ajax.json()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].json;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Get the data submitted in the last Ajax request\n */\n_api_register( 'ajax.params()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].oAjaxData;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Reload tables from the Ajax data source. Note that this function will\n * automatically re-draw the table when the remote data has been loaded.\n *\n * @param {boolean} [reset=true] Reset (default) or hold the current paging\n *   position. A full re-sort and re-filter is performed when this method is\n *   called, which is why the pagination reset is the default action.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\treturn this.iterator( 'table', function (settings) {\n\t\t__reload( settings, resetPaging===false, callback );\n\t} );\n} );\n\n\n/**\n * Get the current Ajax URL. Note that this returns the URL from the first\n * table in the current context.\n *\n * @return {string} Current Ajax source URL\n *//**\n * Set the Ajax URL. Note that this will set the URL for all tables in the\n * current context.\n *\n * @param {string} url URL to set.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url()', function ( url ) {\n\tvar ctx = this.context;\n\n\tif ( url === undefined ) {\n\t\t// get\n\t\tif ( ctx.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tctx = ctx[0];\n\n\t\treturn ctx.ajax ?\n\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\tctx.ajax.url :\n\t\t\t\tctx.ajax :\n\t\t\tctx.sAjaxSource;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\tsettings.ajax.url = url;\n\t\t}\n\t\telse {\n\t\t\tsettings.ajax = url;\n\t\t}\n\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t// value of `sAjaxSource` redundant.\n\t} );\n} );\n\n\n/**\n * Load data from the newly set Ajax URL. Note that this method is only\n * available when `ajax.url()` is used to set a URL. Additionally, this method\n * has the same effect as calling `ajax.reload()` but is provided for\n * convenience when setting a new URL. Like `ajax.reload()` it will\n * automatically redraw the table once the remote data has been loaded.\n *\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t// Same as a reload, but makes sense to present it for easy access after a\n\t// url change\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\t__reload( ctx, resetPaging===false, callback );\n\t} );\n} );\n\n\n\n\nvar _selector_run = function ( type, selector, selectFn, settings, opts )\n{\n\tvar\n\t\tout = [], res,\n\t\ta, i, ien, j, jen,\n\t\tselectorType = typeof selector;\n\n\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t// given with their array like look\n\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\tselector = [ selector ];\n\t}\n\n\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\tselector[i].split(',') :\n\t\t\t[ selector[i] ];\n\n\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\tres = selectFn( typeof a[j] === 'string' ? (a[j]).trim() : a[j] );\n\n\t\t\tif ( res && res.length ) {\n\t\t\t\tout = out.concat( res );\n\t\t\t}\n\t\t}\n\t}\n\n\t// selector extensions\n\tvar ext = _ext.selector[ type ];\n\tif ( ext.length ) {\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tout = ext[i]( settings, opts, out );\n\t\t}\n\t}\n\n\treturn _unique( out );\n};\n\n\nvar _selector_opts = function ( opts )\n{\n\tif ( ! opts ) {\n\t\topts = {};\n\t}\n\n\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t// than search\n\tif ( opts.filter && opts.search === undefined ) {\n\t\topts.search = opts.filter;\n\t}\n\n\treturn $.extend( {\n\t\tsearch: 'none',\n\t\torder: 'current',\n\t\tpage: 'all'\n\t}, opts );\n};\n\n\nvar _selector_first = function ( inst )\n{\n\t// Reduce the API instance to the first item found\n\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\tif ( inst[i].length > 0 ) {\n\t\t\t// Assign the first element to the first item in the instance\n\t\t\t// and truncate the instance and context\n\t\t\tinst[0] = inst[i];\n\t\t\tinst[0].length = 1;\n\t\t\tinst.length = 1;\n\t\t\tinst.context = [ inst.context[i] ];\n\n\t\t\treturn inst;\n\t\t}\n\t}\n\n\t// Not found - return an empty instance\n\tinst.length = 0;\n\treturn inst;\n};\n\n\nvar _selector_row_indexes = function ( settings, opts )\n{\n\tvar\n\t\ti, ien, tmp, a=[],\n\t\tdisplayFiltered = settings.aiDisplay,\n\t\tdisplayMaster = settings.aiDisplayMaster;\n\n\tvar\n\t\tsearch = opts.search,  // none, applied, removed\n\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\tpage   = opts.page;    // all, current\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t// In server-side processing mode, most options are irrelevant since\n\t\t// rows not shown don't exist and the index order is the applied order\n\t\t// Removed is a special case - for consistency just return an empty\n\t\t// array\n\t\treturn search === 'removed' ?\n\t\t\t[] :\n\t\t\t_range( 0, displayMaster.length );\n\t}\n\telse if ( page == 'current' ) {\n\t\t// Current page implies that order=current and filter=applied, since it is\n\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t// are\n\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\ta.push( displayFiltered[i] );\n\t\t}\n\t}\n\telse if ( order == 'current' || order == 'applied' ) {\n\t\tif ( search == 'none') {\n\t\t\ta = displayMaster.slice();\n\t\t}\n\t\telse if ( search == 'applied' ) {\n\t\t\ta = displayFiltered.slice();\n\t\t}\n\t\telse if ( search == 'removed' ) {\n\t\t\t// O(n+m) solution by creating a hash map\n\t\t\tvar displayFilteredMap = {};\n\n\t\t\tfor ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {\n\t\t\t\tdisplayFilteredMap[displayFiltered[i]] = null;\n\t\t\t}\n\n\t\t\ta = $.map( displayMaster, function (el) {\n\t\t\t\treturn ! displayFilteredMap.hasOwnProperty(el) ?\n\t\t\t\t\tel :\n\t\t\t\t\tnull;\n\t\t\t} );\n\t\t}\n\t}\n\telse if ( order == 'index' || order == 'original' ) {\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tif ( search == 'none' ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t\telse { // applied | removed\n\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\n\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t{\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n};\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Rows\n *\n * {}          - no selector - use all available rows\n * {integer}   - row aoData index\n * {node}      - TR node\n * {string}    - jQuery selector to apply to the TR elements\n * {array}     - jQuery array of nodes, or simply an array of TR nodes\n *\n */\nvar __row_selector = function ( settings, selector, opts )\n{\n\tvar rows;\n\tvar run = function ( sel ) {\n\t\tvar selInt = _intVal( sel );\n\t\tvar i, ien;\n\t\tvar aoData = settings.aoData;\n\n\t\t// Short cut - selector is a number and no options provided (default is\n\t\t// all records, so no need to check if the index is in there, since it\n\t\t// must be - dev error if the index doesn't exist).\n\t\tif ( selInt !== null && ! opts ) {\n\t\t\treturn [ selInt ];\n\t\t}\n\n\t\tif ( ! rows ) {\n\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t}\n\n\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t// Selector - integer\n\t\t\treturn [ selInt ];\n\t\t}\n\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t// Selector - none\n\t\t\treturn rows;\n\t\t}\n\n\t\t// Selector - function\n\t\tif ( typeof sel === 'function' ) {\n\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\tvar row = aoData[ idx ];\n\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// Selector - node\n\t\tif ( sel.nodeName ) {\n\t\t\tvar rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup\n\t\t\tvar cellIdx = sel._DT_CellIndex;\n\n\t\t\tif ( rowIdx !== undefined ) {\n\t\t\t\t// Make sure that the row is actually still present in the table\n\t\t\t\treturn aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?\n\t\t\t\t\t[ rowIdx ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse if ( cellIdx ) {\n\t\t\t\treturn aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel.parentNode ?\n\t\t\t\t\t[ cellIdx.row ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\treturn host.length ?\n\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t}\n\n\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t// DataTables simplifies this for row selectors since you can select\n\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t// unescaped.\n\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t// get row index from id\n\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\treturn [ rowObj.idx ];\n\t\t\t}\n\n\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t// matches\n\t\t}\n\t\t\n\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\tvar nodes = _removeEmpty(\n\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t);\n\n\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t// it also allows arrays, so this will cope with all three options\n\t\treturn $(nodes)\n\t\t\t.filter( sel )\n\t\t\t.map( function () {\n\t\t\t\treturn this._DT_RowIndex;\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\n\treturn _selector_run( 'row', selector, run, settings, opts );\n};\n\n\n_api_register( 'rows()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __row_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in __row_selector?\n\tinst.selector.rows = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_register( 'rows().nodes()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn settings.aoData[ row ].nTr || undefined;\n\t}, 1 );\n} );\n\n_api_register( 'rows().data()', function () {\n\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\tvar r = settings.aoData[ row ];\n\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t_fnInvalidate( settings, row, src );\n\t} );\n} );\n\n_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn row;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\tvar a = [];\n\tvar context = this.context;\n\n\t// `iterator` will drop undefined values, but in this case we want them\n\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t}\n\t}\n\n\treturn new _Api( context, a );\n} );\n\n_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\tvar that = this;\n\n\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\tvar data = settings.aoData;\n\t\tvar rowData = data[ row ];\n\t\tvar i, ien, j, jen;\n\t\tvar loopRow, loopCells;\n\n\t\tdata.splice( row, 1 );\n\n\t\t// Update the cached indexes\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\tloopRow = data[i];\n\t\t\tloopCells = loopRow.anCells;\n\n\t\t\t// Rows\n\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t}\n\n\t\t\t// Cells\n\t\t\tif ( loopCells !== null ) {\n\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Delete from the display arrays\n\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\n\t\t// For server-side processing tables - subtract the deleted row from the count\n\t\tif ( settings._iRecordsDisplay > 0 ) {\n\t\t\tsettings._iRecordsDisplay--;\n\t\t}\n\n\t\t// Check for an 'overflow' they case for displaying the table\n\t\t_fnLengthOverflow( settings );\n\n\t\t// Remove the row's ID reference if there is one\n\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\tif ( id !== undefined ) {\n\t\t\tdelete settings.aIds[ id ];\n\t\t}\n\t} );\n\n\tthis.iterator( 'table', function ( settings ) {\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tsettings.aoData[i].idx = i;\n\t\t}\n\t} );\n\n\treturn this;\n} );\n\n\n_api_register( 'rows.add()', function ( rows ) {\n\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\tvar row, i, ien;\n\t\t\tvar out = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn out;\n\t\t}, 1 );\n\n\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\tvar modRows = this.rows( -1 );\n\tmodRows.pop();\n\t$.merge( modRows, newRows );\n\n\treturn modRows;\n} );\n\n\n\n\n\n/**\n *\n */\n_api_register( 'row()', function ( selector, opts ) {\n\treturn _selector_first( this.rows( selector, opts ) );\n} );\n\n\n_api_register( 'row().data()', function ( data ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\tvar row = ctx[0].aoData[ this[0] ];\n\trow._aData = data;\n\n\t// If the DOM has an id, and the data source is an array\n\tif ( Array.isArray( data ) && row.nTr && row.nTr.id ) {\n\t\t_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );\n\t}\n\n\t// Automatically invalidate\n\t_fnInvalidate( ctx[0], this[0], 'data' );\n\n\treturn this;\n} );\n\n\n_api_register( 'row().node()', function () {\n\tvar ctx = this.context;\n\n\treturn ctx.length && this.length ?\n\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\tnull;\n} );\n\n\n_api_register( 'row.add()', function ( row ) {\n\t// Allow a jQuery object to be passed in - only a single row is added from\n\t// it though - the first element in the set\n\tif ( row instanceof $ && row.length ) {\n\t\trow = row[0];\n\t}\n\n\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t}\n\t\treturn _fnAddData( settings, row );\n\t} );\n\n\t// Return an Api.rows() extended instance, with the newly added row selected\n\treturn this.row( rows[0] );\n} );\n\n\n$(document).on('plugin-init.dt', function (e, context) {\n\tvar api = new _Api( context );\n\tvar namespace = 'on-plugin-init';\n\tvar stateSaveParamsEvent = 'stateSaveParams.' + namespace;\n\tvar destroyEvent = 'destroy. ' + namespace;\n\n\tapi.on( stateSaveParamsEvent, function ( e, settings, d ) {\n\t\t// This could be more compact with the API, but it is a lot faster as a simple\n\t\t// internal loop\n\t\tvar idFn = settings.rowIdFn;\n\t\tvar data = settings.aoData;\n\t\tvar ids = [];\n\n\t\tfor (var i=0 ; i<data.length ; i++) {\n\t\t\tif (data[i]._detailsShow) {\n\t\t\t\tids.push( '#' + idFn(data[i]._aData) );\n\t\t\t}\n\t\t}\n\n\t\td.childRows = ids;\n\t});\n\n\tapi.on( destroyEvent, function () {\n\t\tapi.off(stateSaveParamsEvent + ' ' + destroyEvent);\n\t});\n\n\tvar loaded = api.state.loaded();\n\n\tif ( loaded && loaded.childRows ) {\n\t\tapi\n\t\t\t.rows( $.map(loaded.childRows, function (id){\n\t\t\t\treturn id.replace(/:/g, '\\\\:')\n\t\t\t}) )\n\t\t\t.every( function () {\n\t\t\t\t_fnCallbackFire( context, null, 'requestChild', [ this ] )\n\t\t\t});\n\t}\n});\n\nvar __details_add = function ( ctx, row, data, klass )\n{\n\t// Convert to array of TR elements\n\tvar rows = [];\n\tvar addRow = function ( r, k ) {\n\t\t// Recursion to allow for arrays of jQuery objects\n\t\tif ( Array.isArray( r ) || r instanceof $ ) {\n\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\taddRow( r[i], k );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t// to add the correct number of columns etc\n\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\trows.push( r );\n\t\t}\n\t\telse {\n\t\t\t// Otherwise create a row with a wrapper\n\t\t\tvar created = $('<tr><td></td></tr>').addClass( k );\n\t\t\t$('td', created)\n\t\t\t\t.addClass( k )\n\t\t\t\t.html( r )\n\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\n\t\t\trows.push( created[0] );\n\t\t}\n\t};\n\n\taddRow( data, klass );\n\n\tif ( row._details ) {\n\t\trow._details.detach();\n\t}\n\n\trow._details = $(rows);\n\n\t// If the children were already shown, that state should be retained\n\tif ( row._detailsShow ) {\n\t\trow._details.insertAfter( row.nTr );\n\t}\n};\n\n\n// Make state saving of child row details async to allow them to be batch processed\nvar __details_state = DataTable.util.throttle(\n\tfunction (ctx) {\n\t\t_fnSaveState( ctx[0] )\n\t},\n\t500\n);\n\n\nvar __details_remove = function ( api, idx )\n{\n\tvar ctx = api.context;\n\n\tif ( ctx.length ) {\n\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\n\t\tif ( row && row._details ) {\n\t\t\trow._details.remove();\n\n\t\t\trow._detailsShow = undefined;\n\t\t\trow._details = undefined;\n\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_display = function ( api, show ) {\n\tvar ctx = api.context;\n\n\tif ( ctx.length && api.length ) {\n\t\tvar row = ctx[0].aoData[ api[0] ];\n\n\t\tif ( row._details ) {\n\t\t\trow._detailsShow = show;\n\n\t\t\tif ( show ) {\n\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t$( row.nTr ).addClass( 'dt-hasChild' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\trow._details.detach();\n\t\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t}\n\n\t\t\t_fnCallbackFire( ctx[0], null, 'childRow', [ show, api.row( api[0] ) ] )\n\n\t\t\t__details_events( ctx[0] );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_events = function ( settings )\n{\n\tvar api = new _Api( settings );\n\tvar namespace = '.dt.DT_details';\n\tvar drawEvent = 'draw'+namespace;\n\tvar colvisEvent = 'column-sizing'+namespace;\n\tvar destroyEvent = 'destroy'+namespace;\n\tvar data = settings.aoData;\n\n\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\n\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t// On each draw, insert the required elements into the document\n\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t// Internal data grab\n\t\t\t\tvar row = data[ idx ];\n\n\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// Column visibility change - update the colspan\n\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t// a colspan)\n\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\trow = data[i];\n\n\t\t\t\tif ( row._details ) {\n\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Table destroyed - nuke any child rows\n\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n};\n\n// Strings for the method names to help minification\nvar _emp = '';\nvar _child_obj = _emp+'row().child';\nvar _child_mth = _child_obj+'()';\n\n// data can be:\n//  tr\n//  string\n//  jQuery or array of any of the above\n_api_register( _child_mth, function ( data, klass ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\tundefined;\n\t}\n\telse if ( data === true ) {\n\t\t// show\n\t\tthis.child.show();\n\t}\n\telse if ( data === false ) {\n\t\t// remove\n\t\t__details_remove( this );\n\t}\n\telse if ( ctx.length && this.length ) {\n\t\t// set\n\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t}\n\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.show()',\n\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n], function ( show ) {   // it returns an object and this method is not executed)\n\t__details_display( this, true );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.hide()',\n\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n], function () {         // it returns an object and this method is not executed)\n\t__details_display( this, false );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.remove()',\n\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n], function () {           // it returns an object and this method is not executed)\n\t__details_remove( this );\n\treturn this;\n} );\n\n\n_api_register( _child_obj+'.isShown()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length && this.length ) {\n\t\t// _detailsShown as false or undefined will fall through to return false\n\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t}\n\treturn false;\n} );\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Columns\n *\n * {integer}           - column index (>=0 count from left, <0 count from right)\n * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n * \"{string}:name\"     - column name\n * \"{string}\"          - jQuery selector on column header nodes\n *\n */\n\n// can be an array of these items, comma separated list, or an array of comma\n// separated lists\n\nvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\n\n// r1 and r2 are redundant - but it means that the parameters match for the\n// iterator callback in columns().data()\nvar __columnData = function ( settings, column, r1, r2, rows ) {\n\tvar a = [];\n\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t}\n\treturn a;\n};\n\n\nvar __column_selector = function ( settings, selector, opts )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tnames = _pluck( columns, 'sName' ),\n\t\tnodes = _pluck( columns, 'nTh' );\n\n\tvar run = function ( s ) {\n\t\tvar selInt = _intVal( s );\n\n\t\t// Selector - all\n\t\tif ( s === '' ) {\n\t\t\treturn _range( columns.length );\n\t\t}\n\n\t\t// Selector - index\n\t\tif ( selInt !== null ) {\n\t\t\treturn [ selInt >= 0 ?\n\t\t\t\tselInt : // Count from left\n\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t];\n\t\t}\n\n\t\t// Selector = function\n\t\tif ( typeof s === 'function' ) {\n\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\n\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\treturn s(\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// jQuery or string selector\n\t\tvar match = typeof s === 'string' ?\n\t\t\ts.match( __re_column_selector ) :\n\t\t\t'';\n\n\t\tif ( match ) {\n\t\t\tswitch( match[2] ) {\n\t\t\t\tcase 'visIdx':\n\t\t\t\tcase 'visible':\n\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t} );\n\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t}\n\t\t\t\t\t// Counting from the left\n\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\n\t\t\t\tcase 'name':\n\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t} );\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\n\t\t// Cell in the table body\n\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t}\n\n\t\t// jQuery selector on the TH elements for the columns\n\t\tvar jqResult = $( nodes )\n\t\t\t.filter( s )\n\t\t\t.map( function () {\n\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t// a child or such an element\n\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\treturn host.length ?\n\t\t\t[ host.data('dt-column') ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'column', selector, run, settings, opts );\n};\n\n\nvar __setColumnVis = function ( settings, column, vis ) {\n\tvar\n\t\tcols = settings.aoColumns,\n\t\tcol  = cols[ column ],\n\t\tdata = settings.aoData,\n\t\trow, cells, i, ien, tr;\n\n\t// Get\n\tif ( vis === undefined ) {\n\t\treturn col.bVisible;\n\t}\n\n\t// Set\n\t// No change\n\tif ( col.bVisible === vis ) {\n\t\treturn;\n\t}\n\n\tif ( vis ) {\n\t\t// Insert column\n\t\t// Need to decide if we should use appendChild or insertBefore\n\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\ttr = data[i].nTr;\n\t\t\tcells = data[i].anCells;\n\n\t\t\tif ( tr ) {\n\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t// Remove column\n\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t}\n\n\t// Common actions\n\tcol.bVisible = vis;\n};\n\n\n_api_register( 'columns()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __column_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in _row_selector?\n\tinst.selector.cols = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTh;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTf;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\treturn this.iterator( 'column-rows', __columnData, 1 );\n} );\n\n_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].mData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t);\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\tvar that = this;\n\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\tif ( vis === undefined ) {\n\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t} // else\n\t\t__setColumnVis( settings, column, vis );\n\t} );\n\n\t// Group the column visibility changes\n\tif ( vis !== undefined ) {\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\t// Redraw the header after changes\n\t\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t\t// Update colspan for no records display. Child rows and extensions will use their own\n\t\t\t// listeners to do this - only need to update the empty table item here\n\t\t\tif ( ! settings.aiDisplay.length ) {\n\t\t\t\t$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));\n\t\t\t}\n\t\n\t\t\t_fnSaveState( settings );\n\n\t\t\t// Second loop once the first is done for events\n\t\t\tthat.iterator( 'column', function ( settings, column ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t} );\n\n\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\tthat.columns.adjust();\n\t\t\t}\n\t\t});\n\t}\n\n\treturn ret;\n} );\n\n_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn type === 'visible' ?\n\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\tcolumn;\n\t}, 1 );\n} );\n\n_api_register( 'columns.adjust()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}, 1 );\n} );\n\n_api_register( 'column.index()', function ( type, idx ) {\n\tif ( this.context.length !== 0 ) {\n\t\tvar ctx = this.context[0];\n\n\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t}\n\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t}\n\t}\n} );\n\n_api_register( 'column()', function ( selector, opts ) {\n\treturn _selector_first( this.columns( selector, opts ) );\n} );\n\nvar __cell_selector = function ( settings, selector, opts )\n{\n\tvar data = settings.aoData;\n\tvar rows = _selector_row_indexes( settings, opts );\n\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\tvar allCells = $(_flatten( [], cells ));\n\tvar row;\n\tvar columns = settings.aoColumns.length;\n\tvar a, i, ien, j, o, host;\n\n\tvar run = function ( s ) {\n\t\tvar fnSelector = typeof s === 'function';\n\n\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t// All cells and function selectors\n\t\t\ta = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\to = {\n\t\t\t\t\t\trow: row,\n\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\thost = data[ row ];\n\n\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn a;\n\t\t}\n\t\t\n\t\t// Selector - index\n\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t// Valid cell index and its in the array of selectable rows\n\t\t\treturn s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?\n\t\t\t\t[s] :\n\t\t\t\t[];\n\t\t}\n\n\t\t// Selector - jQuery filtered cells\n\t\tvar jqResult = allCells\n\t\t\t.filter( s )\n\t\t\t.map( function (i, el) {\n\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\tcolumn: el._DT_CellIndex.column\n \t\t\t\t};\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t// data attributes\n\t\thost = $(s).closest('*[data-dt-row]');\n\t\treturn host.length ?\n\t\t\t[ {\n\t\t\t\trow: host.data('dt-row'),\n\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t} ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'cell', selector, run, settings, opts );\n};\n\n\n\n\n_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t// Argument shifting\n\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t// Indexes\n\t\tif ( rowSelector.row === undefined ) {\n\t\t\t// Selector options in first parameter\n\t\t\topts = rowSelector;\n\t\t\trowSelector = null;\n\t\t}\n\t\telse {\n\t\t\t// Cell index objects in first parameter\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t}\n\tif ( $.isPlainObject( columnSelector ) ) {\n\t\topts = columnSelector;\n\t\tcolumnSelector = null;\n\t}\n\n\t// Cell selector\n\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t} );\n\t}\n\n\t// The default built in options need to apply to row and columns\n\tvar internalOpts = opts ? {\n\t\tpage: opts.page,\n\t\torder: opts.order,\n\t\tsearch: opts.search\n\t} : {};\n\n\t// Row + column selector\n\tvar columns = this.columns( columnSelector, internalOpts );\n\tvar rows = this.rows( rowSelector, internalOpts );\n\tvar i, ien, j, jen;\n\n\tvar cellsNoOpts = this.iterator( 'table', function ( settings, idx ) {\n\t\tvar a = [];\n\n\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\ta.push( {\n\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\treturn a;\n\t}, 1 );\n\n\t// There is currently only one extension which uses a cell selector extension\n\t// It is a _major_ performance drag to run this if it isn't needed, so this is\n\t// an extension specific check at the moment\n\tvar cells = opts && opts.selected ?\n\t\tthis.cells( cellsNoOpts, opts ) :\n\t\tcellsNoOpts;\n\n\t$.extend( cells.selector, {\n\t\tcols: columnSelector,\n\t\trows: rowSelector,\n\t\topts: opts\n\t} );\n\n\treturn cells;\n} );\n\n\n_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\tvar data = settings.aoData[ row ];\n\n\t\treturn data && data.anCells ?\n\t\t\tdata.anCells[ column ] :\n\t\t\tundefined;\n\t}, 1 );\n} );\n\n\n_api_register( 'cells().data()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn settings.aoData[ row ][ type ][ column ];\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column, type );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn {\n\t\t\trow: row,\n\t\t\tcolumn: column,\n\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t};\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t_fnInvalidate( settings, row, src, column );\n\t} );\n} );\n\n\n\n_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n} );\n\n\n_api_register( 'cell().data()', function ( data ) {\n\tvar ctx = this.context;\n\tvar cell = this[0];\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && cell.length ?\n\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\n\treturn this;\n} );\n\n\n\n/**\n * Get current ordering (sorting) that has been applied to the table.\n *\n * @returns {array} 2D array containing the sorting information for the first\n *   table in the current context. Each element in the parent array represents\n *   a column being sorted upon (i.e. multi-sorting with two columns would have\n *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n *   the column index that the sorting condition applies to, the second is the\n *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n *   index of the sorting order from the `column.sorting` initialisation array.\n *//**\n * Set the ordering for the table.\n *\n * @param {integer} order Column index to sort upon.\n * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 1D array of sorting information to be applied.\n * @param {array} [...] Optional additional sorting conditions\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 2D array of sorting information to be applied.\n * @returns {DataTables.Api} this\n */\n_api_register( 'order()', function ( order, dir ) {\n\tvar ctx = this.context;\n\n\tif ( order === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].aaSorting :\n\t\t\tundefined;\n\t}\n\n\t// set\n\tif ( typeof order === 'number' ) {\n\t\t// Simple column / direction passed in\n\t\torder = [ [ order, dir ] ];\n\t}\n\telse if ( order.length && ! Array.isArray( order[0] ) ) {\n\t\t// Arguments passed in (list of 1D arrays)\n\t\torder = Array.prototype.slice.call( arguments );\n\t}\n\t// otherwise a 2D array was passed in\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSorting = order.slice();\n\t} );\n} );\n\n\n/**\n * Attach a sort listener to an element for a given column\n *\n * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n *   listener to. This can take the form of a single DOM node, a jQuery\n *   collection of nodes or a jQuery selector which will identify the node(s).\n * @param {integer} column the column that a click on this node will sort on\n * @param {function} [callback] callback function when sort is run\n * @returns {DataTables.Api} this\n */\n_api_register( 'order.listener()', function ( node, column, callback ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSortAttachListener( settings, node, column, callback );\n\t} );\n} );\n\n\n_api_register( 'order.fixed()', function ( set ) {\n\tif ( ! set ) {\n\t\tvar ctx = this.context;\n\t\tvar fixed = ctx.length ?\n\t\t\tctx[0].aaSortingFixed :\n\t\t\tundefined;\n\n\t\treturn Array.isArray( fixed ) ?\n\t\t\t{ pre: fixed } :\n\t\t\tfixed;\n\t}\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t} );\n} );\n\n\n// Order by the selected column(s)\n_api_register( [\n\t'columns().order()',\n\t'column().order()'\n], function ( dir ) {\n\tvar that = this;\n\n\treturn this.iterator( 'table', function ( settings, i ) {\n\t\tvar sort = [];\n\n\t\t$.each( that[i], function (j, col) {\n\t\t\tsort.push( [ col, dir ] );\n\t\t} );\n\n\t\tsettings.aaSorting = sort;\n\t} );\n} );\n\n\n\n_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\tvar ctx = this.context;\n\n\tif ( input === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\tundefined;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\treturn;\n\t\t}\n\n\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\"sSearch\": input+\"\",\n\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t} ), 1 );\n\t} );\n} );\n\n\n_api_registerPlural(\n\t'columns().search()',\n\t'column().search()',\n\tfunction ( input, regex, smart, caseInsen ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\tvar preSearch = settings.aoPreSearchCols;\n\n\t\t\tif ( input === undefined ) {\n\t\t\t\t// get\n\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t}\n\n\t\t\t// set\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} );\n\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t} );\n\t}\n);\n\n/*\n * State API methods\n */\n\n_api_register( 'state()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oSavedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t// Save an empty object\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t} );\n} );\n\n\n_api_register( 'state.loaded()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oLoadedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.save()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSaveState( settings );\n\t} );\n} );\n\n\n\n/**\n * Set the jQuery or window object to be used by DataTables\n *\n * @param {*} module Library / container object\n * @param {string} [type] Library or container type `lib`, `win` or `datetime`.\n *   If not provided, automatic detection is attempted.\n */\nDataTable.use = function (module, type) {\n\tif (type === 'lib' || module.fn) {\n\t\t$ = module;\n\t}\n\telse if (type == 'win' || module.document) {\n\t\twindow = module;\n\t\tdocument = module.document;\n\t}\n\telse if (type === 'datetime' || module.type === 'DateTime') {\n\t\tDataTable.DateTime = module;\n\t}\n}\n\n/**\n * CommonJS factory function pass through. This will check if the arguments\n * given are a window object or a jQuery object. If so they are set\n * accordingly.\n * @param {*} root Window\n * @param {*} jq jQUery\n * @returns {boolean} Indicator\n */\nDataTable.factory = function (root, jq) {\n\tvar is = false;\n\n\t// Test if the first parameter is a window object\n\tif (root && root.document) {\n\t\twindow = root;\n\t\tdocument = root.document;\n\t}\n\n\t// Test if the second parameter is a jQuery object\n\tif (jq && jq.fn && jq.fn.jquery) {\n\t\t$ = jq;\n\t\tis = true;\n\t}\n\n\treturn is;\n}\n\n/**\n * Provide a common method for plug-ins to check the version of DataTables being\n * used, in order to ensure compatibility.\n *\n *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n *  @returns {boolean} true if this version of DataTables is greater or equal to\n *    the required version, or false if this version of DataTales is not\n *    suitable\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n */\nDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n{\n\tvar aThis = DataTable.version.split('.');\n\tvar aThat = version.split('.');\n\tvar iThis, iThat;\n\n\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\n\t\t// Parts are the same, keep comparing\n\t\tif (iThis === iThat) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parts are different, return immediately\n\t\treturn iThis > iThat;\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Check if a `<table>` node is a DataTable table already or not.\n *\n *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n *      selector for the table to test. Note that if more than more than one\n *      table is passed on, only the first will be checked\n *  @returns {boolean} true the table given is a DataTable, or false otherwise\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n *      $('#example').dataTable();\n *    }\n */\nDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n{\n\tvar t = $(table).get(0);\n\tvar is = false;\n\n\tif ( table instanceof DataTable.Api ) {\n\t\treturn true;\n\t}\n\n\t$.each( DataTable.settings, function (i, o) {\n\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\n\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\tis = true;\n\t\t}\n\t} );\n\n\treturn is;\n};\n\n\n/**\n * Get all DataTable tables that have been initialised - optionally you can\n * select to get only currently visible tables.\n *\n *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n *    or visible tables only.\n *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n *    DataTables\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    $.each( $.fn.dataTable.tables(true), function () {\n *      $(table).DataTable().columns.adjust();\n *    } );\n */\nDataTable.tables = DataTable.fnTables = function ( visible )\n{\n\tvar api = false;\n\n\tif ( $.isPlainObject( visible ) ) {\n\t\tapi = visible.api;\n\t\tvisible = visible.visible;\n\t}\n\n\tvar a = $.map( DataTable.settings, function (o) {\n\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\treturn o.nTable;\n\t\t}\n\t} );\n\n\treturn api ?\n\t\tnew _Api( a ) :\n\t\ta;\n};\n\n\n/**\n * Convert from camel case parameters to Hungarian notation. This is made public\n * for the extensions to provide the same ability as DataTables core to accept\n * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n * parameters.\n *\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n */\nDataTable.camelToHungarian = _fnCamelToHungarian;\n\n\n\n/**\n *\n */\n_api_register( '$()', function ( selector, opts ) {\n\tvar\n\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\tjqRows = $(rows);\n\n\treturn $( [].concat(\n\t\tjqRows.filter( selector ).toArray(),\n\t\tjqRows.find( selector ).toArray()\n\t) );\n} );\n\n\n// jQuery functions to operate on the tables\n$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\tvar args = Array.prototype.slice.call(arguments);\n\n\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\te+'.dt' :\n\t\t\t\te;\n\t\t\t} ).join( ' ' );\n\n\t\tvar inst = $( this.tables().nodes() );\n\t\tinst[key].apply( inst, args );\n\t\treturn this;\n\t} );\n} );\n\n\n_api_register( 'clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnClearTable( settings );\n\t} );\n} );\n\n\n_api_register( 'settings()', function () {\n\treturn new _Api( this.context, this.context );\n} );\n\n\n_api_register( 'init()', function () {\n\tvar ctx = this.context;\n\treturn ctx.length ? ctx[0].oInit : null;\n} );\n\n\n_api_register( 'data()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t} ).flatten();\n} );\n\n\n_api_register( 'destroy()', function ( remove ) {\n\tremove = remove || false;\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tvar classes   = settings.oClasses;\n\t\tvar table     = settings.nTable;\n\t\tvar tbody     = settings.nTBody;\n\t\tvar thead     = settings.nTHead;\n\t\tvar tfoot     = settings.nTFoot;\n\t\tvar jqTable   = $(table);\n\t\tvar jqTbody   = $(tbody);\n\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\tvar i, ien;\n\n\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t// should be taken\n\t\tsettings.bDestroying = true;\n\n\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\n\t\t// If not being removed from the document, make all columns visible\n\t\tif ( ! remove ) {\n\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t}\n\n\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t// for removing them\n\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t$(window).off('.DT-'+settings.sInstance);\n\n\t\t// When scrolling we had to break the table up - restore it\n\t\tif ( table != thead.parentNode ) {\n\t\t\tjqTable.children('thead').detach();\n\t\t\tjqTable.append( thead );\n\t\t}\n\n\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\tjqTable.children('tfoot').detach();\n\t\t\tjqTable.append( tfoot );\n\t\t}\n\n\t\tsettings.aaSorting = [];\n\t\tsettings.aaSortingFixed = [];\n\t\t_fnSortingClasses( settings );\n\n\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\n\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t);\n\n\t\t// Add the TR elements back into the table in their original order\n\t\tjqTbody.children().detach();\n\t\tjqTbody.append( rows );\n\n\t\tvar orig = settings.nTableWrapper.parentNode;\n\n\t\t// Remove the DataTables generated nodes, events and classes\n\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\tjqTable[ removedMethod ]();\n\t\tjqWrapper[ removedMethod ]();\n\n\t\t// If we need to reattach the table to the document\n\t\tif ( ! remove && orig ) {\n\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\n\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t// so we can restore directly to that\n\t\t\tjqTable\n\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t.removeClass( classes.sTable );\n\n\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\tien = settings.asDestroyStripes.length;\n\n\t\t\tif ( ien ) {\n\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t/* Remove the settings object from the settings array */\n\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\tif ( idx !== -1 ) {\n\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t}\n\t} );\n} );\n\n\n// Add the `every()` method for rows, columns and cells in a compact form\n$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t_api_register( type+'s().every()', function ( fn ) {\n\t\tvar opts = this.selector.opts;\n\t\tvar api = this;\n\n\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t// Rows and columns:\n\t\t\t//  arg1 - index\n\t\t\t//  arg2 - table counter\n\t\t\t//  arg3 - loop counter\n\t\t\t//  arg4 - undefined\n\t\t\t// Cells:\n\t\t\t//  arg1 - row index\n\t\t\t//  arg2 - column index\n\t\t\t//  arg3 - table counter\n\t\t\t//  arg4 - loop counter\n\t\t\tfn.call(\n\t\t\t\tapi[ type ](\n\t\t\t\t\targ1,\n\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t),\n\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t);\n\t\t} );\n\t} );\n} );\n\n\n// i18n method for extensions to be able to use the language object from the\n// DataTable\n_api_register( 'i18n()', function ( token, def, plural ) {\n\tvar ctx = this.context[0];\n\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\n\tif ( resolved === undefined ) {\n\t\tresolved = def;\n\t}\n\n\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\tresolved[ plural ] :\n\t\t\tresolved._;\n\t}\n\n\treturn typeof resolved === 'string'\n\t\t? resolved.replace( '%d', plural ) // nb: plural might be undefined,\n\t\t: resolved;\n} );\n/**\n * Version string for plug-ins to check compatibility. Allowed format is\n * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n * only for non-release builds. See http://semver.org/ for more information.\n *  @member\n *  @type string\n *  @default Version number\n */\nDataTable.version = \"1.13.5\";\n\n/**\n * Private data store, containing all of the settings objects that are\n * created for the tables on a given page.\n *\n * Note that the `DataTable.settings` object is aliased to\n * `jQuery.fn.dataTableExt` through which it may be accessed and\n * manipulated, or `jQuery.fn.dataTable.settings`.\n *  @member\n *  @type array\n *  @default []\n *  @private\n */\nDataTable.settings = [];\n\n/**\n * Object models container, for the various models that DataTables has\n * available to it. These models define the objects that are used to hold\n * the active state and configuration of the table.\n *  @namespace\n */\nDataTable.models = {};\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * search information for the global filter and individual column filters.\n *  @namespace\n */\nDataTable.models.oSearch = {\n\t/**\n\t * Flag to indicate if the filtering should be case insensitive or not\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bCaseInsensitive\": true,\n\n\t/**\n\t * Applied search term\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sSearch\": \"\",\n\n\t/**\n\t * Flag to indicate if the search term should be interpreted as a\n\t * regular expression (true) or not (false) and therefore and special\n\t * regex characters escaped.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bRegex\": false,\n\n\t/**\n\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bSmart\": true,\n\n\t/**\n\t * Flag to indicate if DataTables should only trigger a search when\n\t * the return key is pressed.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"return\": false\n};\n\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * each individual row. This is the object format used for the settings\n * aoData array.\n *  @namespace\n */\nDataTable.models.oRow = {\n\t/**\n\t * TR element for the row\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTr\": null,\n\n\t/**\n\t * Array of TD elements for each row. This is null until the row has been\n\t * created.\n\t *  @type array nodes\n\t *  @default []\n\t */\n\t\"anCells\": null,\n\n\t/**\n\t * Data object from the original data source for the row. This is either\n\t * an array if using the traditional form of DataTables, or an object if\n\t * using mData options. The exact type will depend on the passed in\n\t * data from the data source, or will be an array if using DOM a data\n\t * source.\n\t *  @type array|object\n\t *  @default []\n\t */\n\t\"_aData\": [],\n\n\t/**\n\t * Sorting data cache - this array is ostensibly the same length as the\n\t * number of columns (although each index is generated only as it is\n\t * needed), and holds the data that is used for sorting each column in the\n\t * row. We do this cache generation at the start of the sort in order that\n\t * the formatting of the sort data need be done only once for each cell\n\t * per sort. This array should not be read from or written to by anything\n\t * other than the master sorting methods.\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aSortData\": null,\n\n\t/**\n\t * Per cell filtering data cache. As per the sort data cache, used to\n\t * increase the performance of the filtering in DataTables\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aFilterData\": null,\n\n\t/**\n\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t * in this case a string rather than an array. This is easily computed with\n\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t * needed on every search (memory traded for performance)\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sFilterRow\": null,\n\n\t/**\n\t * Cache of the class name that DataTables has applied to the row, so we\n\t * can quickly look at this variable rather than needing to do a DOM check\n\t * on className for the nTr property.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *  @private\n\t */\n\t\"_sRowStripe\": \"\",\n\n\t/**\n\t * Denote if the original data source was from the DOM, or the data source\n\t * object. This is used for invalidating data, so DataTables can\n\t * automatically read data from the original source, unless uninstructed\n\t * otherwise.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"src\": null,\n\n\t/**\n\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t * object, but want to know the index\n\t *  @type integer\n\t *  @default -1\n\t *  @private\n\t */\n\t\"idx\": -1\n};\n\n\n/**\n * Template object for the column information object in DataTables. This object\n * is held in the settings aoColumns array and contains all the information that\n * DataTables needs about each individual column.\n *\n * Note that this object is related to {@link DataTable.defaults.column}\n * but this one is the internal data store for DataTables's cache of columns.\n * It should NOT be manipulated outside of DataTables. Any configuration should\n * be done through the initialisation options.\n *  @namespace\n */\nDataTable.models.oColumn = {\n\t/**\n\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t * is faster to just hold it as a variable\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"idx\": null,\n\n\t/**\n\t * A list of the columns that sorting should occur on when this column\n\t * is sorted. That this property is an array allows multi-column sorting\n\t * to be defined for a column (for example first name / last name columns\n\t * would benefit from this). The values are integers pointing to the\n\t * columns to be sorted on (typically it will be a single integer pointing\n\t * at itself, but that doesn't need to be the case).\n\t *  @type array\n\t */\n\t\"aDataSort\": null,\n\n\t/**\n\t * Define the sorting directions that are applied to the column, in sequence\n\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t * as the sorting direction when the column if first sorted (clicked on).\n\t * Sort it again (click again) and it will move on to the next index.\n\t * Repeat until loop.\n\t *  @type array\n\t */\n\t\"asSorting\": null,\n\n\t/**\n\t * Flag to indicate if the column is searchable, and thus should be included\n\t * in the filtering or not.\n\t *  @type boolean\n\t */\n\t\"bSearchable\": null,\n\n\t/**\n\t * Flag to indicate if the column is sortable or not.\n\t *  @type boolean\n\t */\n\t\"bSortable\": null,\n\n\t/**\n\t * Flag to indicate if the column is currently visible in the table or not\n\t *  @type boolean\n\t */\n\t\"bVisible\": null,\n\n\t/**\n\t * Store for manual type assignment using the `column.type` option. This\n\t * is held in store so we can manipulate the column's `sType` property.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sManualType\": null,\n\n\t/**\n\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t * source for filtering or sorting. True is either are.\n\t *  @type boolean\n\t *  @default false\n\t *  @private\n\t */\n\t\"_bAttrSrc\": false,\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} nTd The TD node that has been created\n\t *  @param {*} sData The Data for the cell\n\t *  @param {array|object} oData The data for the whole row\n\t *  @param {int} iRow The row index for the aoData data store\n\t *  @default null\n\t */\n\t\"fnCreatedCell\": null,\n\n\t/**\n\t * Function to get data from a cell in a column. You should <b>never</b>\n\t * access data directly through _aData internally in DataTables - always use\n\t * the method attached to this property. It allows mData to function as\n\t * required. This function is automatically assigned by the column\n\t * initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {string} sSpecific The specific data type you want to get -\n\t *    'display', 'type' 'filter' 'sort'\n\t *  @returns {*} The data for the cell from the given row's data\n\t *  @default null\n\t */\n\t\"fnGetData\": null,\n\n\t/**\n\t * Function to set data for a cell in the column. You should <b>never</b>\n\t * set the data directly to _aData internally in DataTables - always use\n\t * this method. It allows mData to function as required. This function\n\t * is automatically assigned by the column initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {*} sValue Value to set\n\t *  @default null\n\t */\n\t\"fnSetData\": null,\n\n\t/**\n\t * Property to read the value for the cells in the column from the data\n\t * source array / object. If null, then the default content is used, if a\n\t * function is given then the return from the function is used.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mData\": null,\n\n\t/**\n\t * Partner property to mData which is used (only when defined) to get\n\t * the data - i.e. it is basically the same as mData, but without the\n\t * 'set' option, and also the data fed to it is the result from mData.\n\t * This is the rendering method to match the data method of mData.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mRender\": null,\n\n\t/**\n\t * Unique header TH/TD element for this column - this is what the sorting\n\t * listener is attached to (if sorting is enabled.)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTh\": null,\n\n\t/**\n\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t * in DataTables as such, but can be used for plug-ins to reference the\n\t * footer for each column.\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTf\": null,\n\n\t/**\n\t * The class to apply to all TD elements in the table's TBODY for the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sClass\": null,\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t *  @type string\n\t */\n\t\"sContentPadding\": null,\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because mData\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDefaultContent\": null,\n\n\t/**\n\t * Name for the column, allowing reference to the column by name as well as\n\t * by index (needs a lookup to work by name).\n\t *  @type string\n\t */\n\t\"sName\": null,\n\n\t/**\n\t * Custom sorting data type - defines which of the available plug-ins in\n\t * afnSortData the custom sorting will use - if any is defined.\n\t *  @type string\n\t *  @default std\n\t */\n\t\"sSortDataType\": 'std',\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClass\": null,\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column -\n\t * when jQuery UI theming is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClassJUI\": null,\n\n\t/**\n\t * Title of the column - what is seen in the TH element (nTh).\n\t *  @type string\n\t */\n\t\"sTitle\": null,\n\n\t/**\n\t * Column sorting and filtering type\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sType\": null,\n\n\t/**\n\t * Width of the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidth\": null,\n\n\t/**\n\t * Width of the column when it was first \"encountered\"\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidthOrig\": null\n};\n\n\n/*\n * Developer note: The properties of the object below are given in Hungarian\n * notation, that was used as the interface for DataTables prior to v1.10, however\n * from v1.10 onwards the primary interface is camel case. In order to avoid\n * breaking backwards compatibility utterly with this change, the Hungarian\n * version is still, internally the primary interface, but is is not documented\n * - hence the @name tags in each doc comment. This allows a Javascript function\n * to create a map from Hungarian notation to camel case (going the other direction\n * would require each property to be listed, which would add around 3K to the size\n * of DataTables, while this method is about a 0.5K hit).\n *\n * Ultimately this does pave the way for Hungarian notation to be dropped\n * completely, but that is a massive amount of work and will break current\n * installs (therefore is on-hold until v2).\n */\n\n/**\n * Initialisation options that can be given to DataTables at initialisation\n * time.\n *  @namespace\n */\nDataTable.defaults = {\n\t/**\n\t * An array of data to use for the table, passed in at initialisation which\n\t * will be used in preference to any data which is already in the DOM. This is\n\t * particularly useful for constructing tables purely in Javascript, for\n\t * example with a custom Ajax call.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.data\n\t *\n\t *  @example\n\t *    // Using a 2D array data source\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\" },\n\t *          { \"title\": \"Browser\" },\n\t *          { \"title\": \"Platform\" },\n\t *          { \"title\": \"Version\" },\n\t *          { \"title\": \"Grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using an array of objects as a data source (`data`)\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  4,\n\t *            \"grade\":    \"X\"\n\t *          },\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  5,\n\t *            \"grade\":    \"C\"\n\t *          }\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aaData\": null,\n\n\n\t/**\n\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t * initialisation. You can define which column(s) the sort is performed\n\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t * should contain an array for each column to be sorted initially containing\n\t * the column's index and a direction string ('asc' or 'desc').\n\t *  @type array\n\t *  @default [[0,'asc']]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.order\n\t *\n\t *  @example\n\t *    // Sort by 3rd column first, and then 4th column\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t *      } );\n\t *    } );\n\t *\n\t *    // No initial sorting\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": []\n\t *      } );\n\t *    } );\n\t */\n\t\"aaSorting\": [[0,'asc']],\n\n\n\t/**\n\t * This parameter is basically identical to the `sorting` parameter, but\n\t * cannot be overridden by user interaction with the table. What this means\n\t * is that you could have a column (visible or hidden) which the sorting\n\t * will always be forced on first - any sorting after that (from the user)\n\t * will then be performed as required. This can be useful for grouping rows\n\t * together.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.orderFixed\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderFixed\": [[0,'asc']]\n\t *      } );\n\t *    } )\n\t */\n\t\"aaSortingFixed\": [],\n\n\n\t/**\n\t * DataTables can be instructed to load data to display in the table from a\n\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t *\n\t * The `ajax` property has three different modes of operation, depending on\n\t * how it is defined. These are:\n\t *\n\t * * `string` - Set the URL from where the data should be loaded from.\n\t * * `object` - Define properties for `jQuery.ajax`.\n\t * * `function` - Custom data get function\n\t *\n\t * `string`\n\t * --------\n\t *\n\t * As a string, the `ajax` property simply defines the URL from which\n\t * DataTables will load data.\n\t *\n\t * `object`\n\t * --------\n\t *\n\t * As an object, the parameters in the object are passed to\n\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t * of the Ajax request. DataTables has a number of default parameters which\n\t * you can override using this option. Please refer to the jQuery\n\t * documentation for a full description of the options available, although\n\t * the following parameters provide additional options in DataTables or\n\t * require special consideration:\n\t *\n\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t *   can also be used as a function to manipulate the data DataTables sends\n\t *   to the server. The function takes a single parameter, an object of\n\t *   parameters with the values that DataTables has readied for sending. An\n\t *   object may be returned which will be merged into the DataTables\n\t *   defaults, or you can add the items to the object that was passed in and\n\t *   not return anything from the function. This supersedes `fnServerParams`\n\t *   from DataTables 1.9-.\n\t *\n\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t *   from an Ajax source or for server-side processing - this parameter\n\t *   allows that property to be changed. You can use Javascript dotted\n\t *   object notation to get a data source for multiple levels of nesting, or\n\t *   it my be used as a function. As a function it takes a single parameter,\n\t *   the JSON returned from the server, which can be manipulated as\n\t *   required, with the returned value being that used by DataTables as the\n\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t *   DataTables 1.9-.\n\t *\n\t * * `success` - Should not be overridden it is used internally in\n\t *   DataTables. To manipulate / transform the data returned by the server\n\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t *\n\t * `function`\n\t * ----------\n\t *\n\t * As a function, making the Ajax call is left up to yourself allowing\n\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t * than Ajax could be used to obtain the required data, such as Web storage\n\t * or an AIR database.\n\t *\n\t * The function is given four parameters and no return is required. The\n\t * parameters are:\n\t *\n\t * 1. _object_ - Data to send to the server\n\t * 2. _function_ - Callback function that must be executed when the required\n\t *    data has been obtained. That data should be passed into the callback\n\t *    as the only parameter\n\t * 3. _object_ - DataTables settings object for the table\n\t *\n\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t *\n\t *  @type string|object|function\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.ajax\n\t *  @since 1.10.0\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax.\n\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": \"data.json\"\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"tableData\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t *   // from a plain array rather than an array in an object\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Manipulate the data returned from the server - add a link to data\n\t *   // (note this can, should, be done using `render` for the column - this\n\t *   // is just a simple example of how the data can be manipulated).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": function ( json ) {\n\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t *         }\n\t *         return json;\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Add data to the request\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"data\": function ( d ) {\n\t *         return {\n\t *           \"extra_search\": $('#extra').val()\n\t *         };\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Send request as POST\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"type\": \"POST\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get the data from localStorage (could interface with a form for\n\t *   // adding, editing and removing rows).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": function (data, callback, settings) {\n\t *       callback(\n\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t *       );\n\t *     }\n\t *   } );\n\t */\n\t\"ajax\": null,\n\n\n\t/**\n\t * This parameter allows you to readily specify the entries in the length drop\n\t * down menu that DataTables shows when pagination is enabled. It can be\n\t * either a 1D array of options which will be used for both the displayed\n\t * option and the value, or a 2D array which will use the array in the first\n\t * position as the value, and the array in the second position as the\n\t * displayed options (useful for language strings such as 'All').\n\t *\n\t * Note that the `pageLength` property will be automatically set to the\n\t * first value given in this array, unless `pageLength` is also provided.\n\t *  @type array\n\t *  @default [ 10, 25, 50, 100 ]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.lengthMenu\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t *      } );\n\t *    } );\n\t */\n\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\n\n\t/**\n\t * The `columns` option in the initialisation parameter allows you to define\n\t * details about the way individual columns behave. For a full list of\n\t * column options that can be set, please see\n\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t * define your columns, you must have an entry in the array for every single\n\t * column that you have in your table (these can be null if you don't which\n\t * to specify any options).\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.column\n\t */\n\t\"aoColumns\": null,\n\n\t/**\n\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t * column, multiple columns, or all columns, using the `targets` property of\n\t * each object in the array. This allows great flexibility when creating\n\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t * columns you specifically want. `columnDefs` may use any of the column\n\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t * have `targets` defined in each object in the array. Values in the `targets`\n\t * array may be:\n\t *   <ul>\n\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t *     <li>a negative integer - column index counting from the right</li>\n\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t *   </ul>\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.columnDefs\n\t */\n\t\"aoColumnDefs\": null,\n\n\n\t/**\n\t * Basically the same as `search`, this parameter defines the individual column\n\t * filtering state at initialisation time. The array must be of the same size\n\t * as the number of columns, and each element be an object with the parameters\n\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t * accepted and the default will be used.\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.searchCols\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchCols\": [\n\t *          null,\n\t *          { \"search\": \"My filter\" },\n\t *          null,\n\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t *        ]\n\t *      } );\n\t *    } )\n\t */\n\t\"aoSearchCols\": [],\n\n\n\t/**\n\t * An array of CSS classes that should be applied to displayed rows. This\n\t * array may be of any length, and DataTables will apply each class\n\t * sequentially, looping when required.\n\t *  @type array\n\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t *    options</i>\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.stripeClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t *      } );\n\t *    } )\n\t */\n\t\"asStripeClasses\": null,\n\n\n\t/**\n\t * Enable or disable automatic column width calculation. This can be disabled\n\t * as an optimisation (it takes some time to calculate the widths) if the\n\t * tables widths are passed in using `columns`.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.autoWidth\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"autoWidth\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bAutoWidth\": true,\n\n\n\t/**\n\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t * are using an Ajax or JS data source for the table. This option, when set to\n\t * true, will cause DataTables to defer the creation of the table elements for\n\t * each row until they are needed for a draw - saving a significant amount of\n\t * time.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.deferRender\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajax\": \"sources/arrays.txt\",\n\t *        \"deferRender\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDeferRender\": false,\n\n\n\t/**\n\t * Replace a DataTable which matches the given selector and replace it with\n\t * one which has the properties of the new initialisation object passed. If no\n\t * table matches the selector, then the new DataTable will be constructed as\n\t * per normal.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.destroy\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"srollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *\n\t *      // Some time later....\n\t *      $('#example').dataTable( {\n\t *        \"filter\": false,\n\t *        \"destroy\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDestroy\": false,\n\n\n\t/**\n\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t * that it allows the end user to input multiple words (space separated) and\n\t * will match a row containing those words, even if not in the order that was\n\t * specified (this allow matching across multiple columns). Note that if you\n\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t * default filtering input box and retain filtering abilities, please use\n\t * {@link DataTable.defaults.dom}.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.searching\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"searching\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bFilter\": true,\n\n\n\t/**\n\t * Enable or disable the table information display. This shows information\n\t * about the data that is currently visible on the page, including information\n\t * about filtered data if that action is being performed.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.info\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"info\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bInfo\": true,\n\n\n\t/**\n\t * Allows the end user to select the size of a formatted page from a select\n\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.lengthChange\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"lengthChange\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bLengthChange\": true,\n\n\n\t/**\n\t * Enable or disable pagination.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.paging\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"paging\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bPaginate\": true,\n\n\n\t/**\n\t * Enable or disable the display of a 'processing' indicator when the table is\n\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t * large amounts of data where it can take a noticeable amount of time to sort\n\t * the entries.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.processing\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"processing\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bProcessing\": false,\n\n\n\t/**\n\t * Retrieve the DataTables object for the given selector. Note that if the\n\t * table has already been initialised, this parameter will cause DataTables\n\t * to simply return the object that has already been set up - it will not take\n\t * account of any changes you might have made to the initialisation object\n\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t * you need.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.retrieve\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      initTable();\n\t *      tableActions();\n\t *    } );\n\t *\n\t *    function initTable ()\n\t *    {\n\t *      return $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false,\n\t *        \"retrieve\": true\n\t *      } );\n\t *    }\n\t *\n\t *    function tableActions ()\n\t *    {\n\t *      var table = initTable();\n\t *      // perform API operations with oTable\n\t *    }\n\t */\n\t\"bRetrieve\": false,\n\n\n\t/**\n\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t * the table's viewport to the given height at all times (useful for layout).\n\t * However, this can look odd when filtering data down to a small data set,\n\t * and the footer is left \"floating\" further down. This parameter (when\n\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t * the result set will fit within the given Y height.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollCollapse\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200\",\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bScrollCollapse\": false,\n\n\n\t/**\n\t * Configure DataTables to use server-side processing. Note that the\n\t * `ajax` parameter must also be given in order to give DataTables a\n\t * source to obtain the required data for each draw.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverSide\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"xhr.php\"\n\t *      } );\n\t *    } );\n\t */\n\t\"bServerSide\": false,\n\n\n\t/**\n\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t * disabled by the `sortable` option for each column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.ordering\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"ordering\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSort\": true,\n\n\n\t/**\n\t * Enable or display DataTables' ability to sort multiple columns at the\n\t * same time (activated by shift-click by the user).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderMulti\n\t *\n\t *  @example\n\t *    // Disable multiple column sorting ability\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderMulti\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortMulti\": true,\n\n\n\t/**\n\t * Allows control over whether DataTables should use the top (true) unique\n\t * cell that is found for a single column, or the bottom (false - default).\n\t * This is useful when using complex headers.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderCellsTop\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderCellsTop\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortCellsTop\": false,\n\n\n\t/**\n\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t * presented as a feature switch as it can increase processing time (while\n\t * classes are removed and added) so for large data sets you might want to\n\t * turn this off.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.orderClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderClasses\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortClasses\": true,\n\n\n\t/**\n\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t * used to save table display information such as pagination information,\n\t * display length, filtering and sorting. As such when the end user reloads\n\t * the page the display display will match what thy had previously set up.\n\t *\n\t * Due to the use of `localStorage` the default state saving is not supported\n\t * in IE6 or 7. If state saving is required in those browsers, use\n\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.stateSave\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bStateSave\": false,\n\n\n\t/**\n\t * This function is called when a TR element is created (and all TD child\n\t * elements have been inserted), or registered if using a DOM source, allowing\n\t * manipulation of the TR element (adding classes etc).\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.createdRow\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" )\n\t *          {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnCreatedRow\": null,\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify any aspect you want about the created DOM.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.drawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"drawCallback\": function( settings ) {\n\t *          alert( 'DataTables has redrawn the table' );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnDrawCallback\": null,\n\n\n\t/**\n\t * Identical to fnHeaderCallback() but for the table footer this function\n\t * allows you to modify the table footer on every 'draw' event.\n\t *  @type function\n\t *  @param {node} foot \"TR\" element for the footer\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.footerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnFooterCallback\": null,\n\n\n\t/**\n\t * When rendering large numbers in the information element for the table\n\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t * function will override the default method DataTables uses.\n\t *  @type function\n\t *  @member\n\t *  @param {int} toFormat number to be formatted\n\t *  @returns {string} formatted string for DataTables to show the number\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.formatNumber\n\t *\n\t *  @example\n\t *    // Format a number using a single quote for the separator (note that\n\t *    // this can also be done with the language.thousands option)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"formatNumber\": function ( toFormat ) {\n\t *          return toFormat.toString().replace(\n\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t *          );\n\t *        };\n\t *      } );\n\t *    } );\n\t */\n\t\"fnFormatNumber\": function ( toFormat ) {\n\t\treturn toFormat.toString().replace(\n\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\tthis.oLanguage.sThousands\n\t\t);\n\t},\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify the header row. This can be used to calculate and\n\t * display useful information about the table.\n\t *  @type function\n\t *  @param {node} head \"TR\" element for the header\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.headerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnHeaderCallback\": null,\n\n\n\t/**\n\t * The information element can be used to convey information about the current\n\t * state of the table. Although the internationalisation options presented by\n\t * DataTables are quite capable of dealing with most customisations, there may\n\t * be times where you wish to customise the string further. This callback\n\t * allows you to do exactly that.\n\t *  @type function\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {int} start Starting position in data for the draw\n\t *  @param {int} end End position in data for the draw\n\t *  @param {int} max Total number of rows in the table (regardless of\n\t *    filtering)\n\t *  @param {int} total Total number of rows in the data set, after filtering\n\t *  @param {string} pre The string that DataTables has formatted using it's\n\t *    own rules\n\t *  @returns {string} The string to be displayed in the information element.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.infoCallback\n\t *\n\t *  @example\n\t *    $('#example').dataTable( {\n\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t *        return start +\" to \"+ end;\n\t *      }\n\t *    } );\n\t */\n\t\"fnInfoCallback\": null,\n\n\n\t/**\n\t * Called when the table has been initialised. Normally DataTables will\n\t * initialise sequentially and there will be no need for this function,\n\t * however, this does not hold true when using external language information\n\t * since that is obtained using an async XHR call.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.initComplete\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"initComplete\": function(settings, json) {\n\t *          alert( 'DataTables has finished its initialisation.' );\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnInitComplete\": null,\n\n\n\t/**\n\t * Called at the very start of each table draw and can be used to cancel the\n\t * draw by returning false, any other return (including undefined) results in\n\t * the full draw occurring).\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t *    return) will allow it to complete.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.preDrawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"preDrawCallback\": function( settings ) {\n\t *          if ( $('#test').val() == 1 ) {\n\t *            return false;\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnPreDrawCallback\": null,\n\n\n\t/**\n\t * This function allows you to 'post process' each row after it have been\n\t * generated for each table draw, but before it is rendered on screen. This\n\t * function might be used for setting the row class name etc.\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} displayIndex The display index for the current table draw\n\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t *    rows (after filtering)\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.rowCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" ) {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnRowCallback\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * This parameter allows you to override the default function which obtains\n\t * the data from the server so something more suitable for your application.\n\t * For example you could use POST data, or pull information from a Gears or\n\t * AIR database.\n\t *  @type function\n\t *  @member\n\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t *  @param {array} data A key/value pair object containing the data to send\n\t *    to the server\n\t *  @param {function} callback to be called on completion of the data get\n\t *    process that will draw the data on the page.\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverData\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerData\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t *  It is often useful to send extra data to the server when making an Ajax\n\t * request - for example custom filtering information, and this callback\n\t * function makes it trivial to send extra information to the server. The\n\t * passed in parameter is the data set that has been constructed by\n\t * DataTables, and you can add to this or modify it as you require.\n\t *  @type function\n\t *  @param {array} data Data array (array of objects which are name/value\n\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t *    server. In the case of Ajax sourced data with server-side processing\n\t *    this will be an empty array, for server-side processing there will be a\n\t *    significant number of parameters!\n\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t *    as this is passed by reference.\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverParams\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerParams\": null,\n\n\n\t/**\n\t * Load the table state. With this function you can define from where, and how, the\n\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} callback Callback that can be executed when done. It\n\t *    should be passed the loaded state object.\n\t *  @return {object} The DataTables state object to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadCallback\": function (settings, callback) {\n\t *          $.ajax( {\n\t *            \"url\": \"/state_load\",\n\t *            \"dataType\": \"json\",\n\t *            \"success\": function (json) {\n\t *              callback( json );\n\t *            }\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadCallback\": function ( settings ) {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t)\n\t\t\t);\n\t\t} catch (e) {\n\t\t\treturn {};\n\t\t}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the saved state prior to loading that state.\n\t * This callback is called when the table is loading state from the stored data, but\n\t * prior to the settings object being modified by the saved state. Note that for\n\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t * a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that is to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never loaded\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Disallow state loading by returning false\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          return false;\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadParams\": null,\n\n\n\t/**\n\t * Callback that is called when the state has been loaded from the state saving method\n\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that was loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoaded\n\t *\n\t *  @example\n\t *    // Show an alert with the filtering value that was saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoaded\": function (settings, data) {\n\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoaded\": null,\n\n\n\t/**\n\t * Save the table state. This function allows you to define where and how the state\n\t * information for the table is stored By default DataTables will use `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveCallback\": function (settings, data) {\n\t *          // Send an Ajax request to the server with the state object\n\t *          $.ajax( {\n\t *            \"url\": \"/state_save\",\n\t *            \"data\": data,\n\t *            \"dataType\": \"json\",\n\t *            \"method\": \"POST\"\n\t *            \"success\": function () {}\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\ttry {\n\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\tJSON.stringify( data )\n\t\t\t);\n\t\t} catch (e) {}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the state to be saved. Called when the table\n\t * has changed state a new state save is required. This method allows modification of\n\t * the state saving object prior to actually doing the save, including addition or\n\t * other state properties or modification. Note that for plug-in authors, you should\n\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveParams\": null,\n\n\n\t/**\n\t * Duration for which the saved state information is considered valid. After this period\n\t * has elapsed the state will be returned to the default.\n\t * Value is given in seconds.\n\t *  @type int\n\t *  @default 7200 <i>(2 hours)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.stateDuration\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateDuration\": 60*60*24; // 1 day\n\t *      } );\n\t *    } )\n\t */\n\t\"iStateDuration\": 7200,\n\n\n\t/**\n\t * When enabled DataTables will not make a request to the server for the first\n\t * page draw - rather it will use the data already on the page (no sorting etc\n\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t * is used to indicate that deferred loading is required, but it is also used\n\t * to tell DataTables how many records there are in the full table (allowing\n\t * the information element and pagination to be displayed correctly). In the case\n\t * where a filtering is applied to the table on initial load, this can be\n\t * indicated by giving the parameter as an array, where the first element is\n\t * the number of records available after filtering and the second element is the\n\t * number of records without filtering (allowing the table information element\n\t * to be shown correctly).\n\t *  @type int | array\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.deferLoading\n\t *\n\t *  @example\n\t *    // 57 records available in the table, no filtering applied\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": 57\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": [ 57, 100 ],\n\t *        \"search\": {\n\t *          \"search\": \"my_filter\"\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"iDeferLoading\": null,\n\n\n\t/**\n\t * Number of rows to display on a single page when using pagination. If\n\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t * this to a custom setting using a pop-up menu.\n\t *  @type int\n\t *  @default 10\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pageLength\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pageLength\": 50\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayLength\": 10,\n\n\n\t/**\n\t * Define the starting point for data display when using DataTables with\n\t * pagination. Note that this parameter is the number of records, rather than\n\t * the page number, so if you have 10 records per page and want to start on\n\t * the third page, it should be \"20\".\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.displayStart\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"displayStart\": 20\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayStart\": 0,\n\n\n\t/**\n\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t * allows you to tab through the controls and press the enter key to activate them.\n\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t * disable built-in keyboard navigation.\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.tabIndex\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"tabIndex\": 1\n\t *      } );\n\t *    } );\n\t */\n\t\"iTabIndex\": 0,\n\n\n\t/**\n\t * Classes that DataTables assigns to the various components and features\n\t * that it adds to the HTML table. This allows classes to be configured\n\t * during initialisation in addition to through the static\n\t * {@link DataTable.ext.oStdClasses} object).\n\t *  @namespace\n\t *  @name DataTable.defaults.classes\n\t */\n\t\"oClasses\": {},\n\n\n\t/**\n\t * All strings that DataTables uses in the user interface that it creates\n\t * are defined in this object, allowing you to modified them individually or\n\t * completely replace them all as required.\n\t *  @namespace\n\t *  @name DataTable.defaults.language\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t * must be internationalised as well).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.aria\n\t\t */\n\t\t\"oAria\": {\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t},\n\n\t\t/**\n\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t * control types.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.paginate\n\t\t */\n\t\t\"oPaginate\": {\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the first page.\n\t\t\t *  @type string\n\t\t\t *  @default First\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"first\": \"First page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sFirst\": \"First\",\n\n\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the last page.\n\t\t\t *  @type string\n\t\t\t *  @default Last\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"last\": \"Last page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLast\": \"Last\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t * next page).\n\t\t\t *  @type string\n\t\t\t *  @default Next\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"next\": \"Next page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sNext\": \"Next\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t * the previous page).\n\t\t\t *  @type string\n\t\t\t *  @default Previous\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sPrevious\": \"Previous\"\n\t\t},\n\n\t\t/**\n\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t * instead (either the default or given value).\n\t\t *  @type string\n\t\t *  @default No data available in table\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sEmptyTable\": \"No data available in table\",\n\n\n\t\t/**\n\t\t * This string gives information to the end user about the information\n\t\t * that is current on display on the page. The following tokens can be\n\t\t * used in the string and will be dynamically replaced as the table\n\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t * removed as needed by the language requires:\n\t\t *\n\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t * * `\\_PAGE\\_` - Current page number\n\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t *\n\t\t *  @type string\n\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\n\n\t\t/**\n\t\t * Display information string for when the table is empty. Typically the\n\t\t * format of this string should match `info`.\n\t\t *  @type string\n\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\n\n\t\t/**\n\t\t * When a user filters the information in a table, this string is appended\n\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t *  @type string\n\t\t *  @default (filtered from _MAX_ total entries)\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\n\n\t\t/**\n\t\t * If can be useful to append extra information to the info string at times,\n\t\t * and this variable does exactly that. This information will be appended to\n\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t * being used) at all times.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoPostFix\": \"\",\n\n\n\t\t/**\n\t\t * This decimal place operator is a little different from the other\n\t\t * language options since DataTables doesn't output floating point\n\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t * what this parameter does is modify the sort methods of the table so\n\t\t * that numbers which are in a format which has a character other than\n\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t *\n\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t * the same table and still be sortable, the table must be consistent.\n\t\t * However, multiple different tables on the page can use different\n\t\t * decimal place characters.\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.decimal\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"decimal\": \",\"\n\t\t *          \"thousands\": \".\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDecimal\": \"\",\n\n\n\t\t/**\n\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t * used to format large numbers that are used in the table information.\n\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t * character you wish with this parameter.\n\t\t *  @type string\n\t\t *  @default ,\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.thousands\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"thousands\": \"'\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sThousands\": \",\",\n\n\n\t\t/**\n\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t * with a custom select box if required.\n\t\t *  @type string\n\t\t *  @default Show _MENU_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    // Language change only\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Language and options change\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t *            '<option value=\"10\">10</option>'+\n\t\t *            '<option value=\"20\">20</option>'+\n\t\t *            '<option value=\"30\">30</option>'+\n\t\t *            '<option value=\"40\">40</option>'+\n\t\t *            '<option value=\"50\">50</option>'+\n\t\t *            '<option value=\"-1\">All</option>'+\n\t\t *            '</select> records'\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\n\n\t\t/**\n\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t * parameter is not used when loading data by server-side processing, just\n\t\t * Ajax sourced data with client-side processing.\n\t\t *  @type string\n\t\t *  @default Loading...\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLoadingRecords\": \"Loading...\",\n\n\n\t\t/**\n\t\t * Text which is displayed when the table is processing a user action\n\t\t * (usually a sort command or similar).\n\t\t *  @type string\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sProcessing\": \"\",\n\n\n\t\t/**\n\t\t * Details the actions that will be taken when the user types into the\n\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t * then the input box is appended to the string automatically.\n\t\t *  @type string\n\t\t *  @default Search:\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.search\n\t\t *\n\t\t *  @example\n\t\t *    // Input text box will be appended at the end automatically\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Filter records:\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Specify where the filter should appear\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSearch\": \"Search:\",\n\n\n\t\t/**\n\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t */\n\t\t\"sSearchPlaceholder\": \"\",\n\n\n\t\t/**\n\t\t * All of the language information can be stored in a file on the\n\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t * and the object has the same properties as the oLanguage object in the\n\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t * the example language files to see how this works in action.\n\t\t *  @type string\n\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.url\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sUrl\": \"\",\n\n\n\t\t/**\n\t\t * Text shown inside the table records when the is no information to be\n\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t * information in the table at all (regardless of filtering).\n\t\t *  @type string\n\t\t *  @default No matching records found\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sZeroRecords\": \"No matching records found\"\n\t},\n\n\n\t/**\n\t * This parameter allows you to have define the global filtering state at\n\t * initialisation time. As an object the `search` parameter must be\n\t * defined, but all other parameters are optional. When `regex` is true,\n\t * the search string will be treated as a regular expression, when false\n\t * (default) it will be treated as a straight string. When `smart`\n\t * DataTables will use it's smart filtering methods (to word match at\n\t * any point in the data), when false this will not be done.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.search\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"search\": {\"search\": \"Initial search\"}\n\t *      } );\n\t *    } )\n\t */\n\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * By default DataTables will look for the property `data` (or `aaData` for\n\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t * source or for server-side processing - this parameter allows that\n\t * property to be changed. You can use Javascript dotted object notation to\n\t * get a data source for multiple levels of nesting.\n\t *  @type string\n\t *  @default data\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxDataProp\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxDataProp\": \"data\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * You can instruct DataTables to load data from an external\n\t * source using this parameter (use aData if you want to pass data in you\n\t * already have). Simply provide a url a JSON object can be obtained from.\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxSource\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxSource\": null,\n\n\n\t/**\n\t * This initialisation variable allows you to specify exactly where in the\n\t * DOM you want DataTables to inject the various controls it adds to the page\n\t * (for example you might want the pagination controls at the top of the\n\t * table). DIV elements (with or without a custom class) can also be added to\n\t * aid styling. The follow syntax is used:\n\t *   <ul>\n\t *     <li>The following options are allowed:\n\t *       <ul>\n\t *         <li>'l' - Length changing</li>\n\t *         <li>'f' - Filtering input</li>\n\t *         <li>'t' - The table!</li>\n\t *         <li>'i' - Information</li>\n\t *         <li>'p' - Pagination</li>\n\t *         <li>'r' - pRocessing</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following constants are allowed:\n\t *       <ul>\n\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following syntax is expected:\n\t *       <ul>\n\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>Examples:\n\t *       <ul>\n\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t *       </ul>\n\t *     </li>\n\t *   </ul>\n\t *  @type string\n\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.dom\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t *      } );\n\t *    } );\n\t */\n\t\"sDom\": \"lfrtip\",\n\n\n\t/**\n\t * Search delay option. This will throttle full table searches that use the\n\t * DataTables provided search input element (it does not effect calls to\n\t * `dt-api search()`, providing a delay before the search is made.\n\t *  @type integer\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.searchDelay\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchDelay\": 200\n\t *      } );\n\t *    } )\n\t */\n\t\"searchDelay\": null,\n\n\n\t/**\n\t * DataTables features six different built-in options for the buttons to\n\t * display for pagination control:\n\t *\n\t * * `numbers` - Page number buttons only\n\t * * `simple` - 'Previous' and 'Next' buttons only\n\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t *  \n\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t *  @type string\n\t *  @default simple_numbers\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pagingType\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pagingType\": \"full_numbers\"\n\t *      } );\n\t *    } )\n\t */\n\t\"sPaginationType\": \"simple_numbers\",\n\n\n\t/**\n\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t * certain layout, or you have a large number of columns in the table, you\n\t * can enable x-scrolling to show the table in a viewport, which can be\n\t * scrolled. This property can be `true` which will allow the table to\n\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t * is recommended.\n\t *  @type boolean|string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollX\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": true,\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollX\": \"\",\n\n\n\t/**\n\t * This property can be used to force a DataTable to use more width than it\n\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t * table which requires to be well spaced, this parameter is useful for\n\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t * measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollXInner\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": \"100%\",\n\t *        \"scrollXInner\": \"110%\"\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollXInner\": \"\",\n\n\n\t/**\n\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t * to the given height, and enable scrolling for any data which overflows the\n\t * current viewport. This can be used as an alternative to paging to display\n\t * a lot of data in a small area (although paging and scrolling can both be\n\t * enabled at the same time). This property can be any CSS unit, or a number\n\t * (in which case it will be treated as a pixel measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollY\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollY\": \"\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t * processing or Ajax sourced data.\n\t *  @type string\n\t *  @default GET\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverMethod\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sServerMethod\": \"GET\",\n\n\n\t/**\n\t * DataTables makes use of renderers when displaying HTML elements for\n\t * a table. These renderers can be added or modified by plug-ins to\n\t * generate suitable mark-up for a site. For example the Bootstrap\n\t * integration plug-in for DataTables uses a paging button renderer to\n\t * display pagination buttons in the mark-up required by Bootstrap.\n\t *\n\t * For further information about the renderers available see\n\t * DataTable.ext.renderer\n\t *  @type string|object\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.renderer\n\t *\n\t */\n\t\"renderer\": null,\n\n\n\t/**\n\t * Set the data property name that DataTables should use to get a row's id\n\t * to set as the `id` property in the node.\n\t *  @type string\n\t *  @default DT_RowId\n\t *\n\t *  @name DataTable.defaults.rowId\n\t */\n\t\"rowId\": \"DT_RowId\"\n};\n\n_fnHungarianMap( DataTable.defaults );\n\n\n\n/*\n * Developer note - See note in model.defaults.js about the use of Hungarian\n * notation and camel case.\n */\n\n/**\n * Column options that can be given to DataTables at initialisation time.\n *  @namespace\n */\nDataTable.defaults.column = {\n\t/**\n\t * Define which column(s) an order will occur on for this column. This\n\t * allows a column's ordering to take multiple columns into account when\n\t * doing a sort or use the data from a different column. For example first\n\t * name / last name columns make sense to do a multi-column sort over the\n\t * two columns.\n\t *  @type array|int\n\t *  @default null <i>Takes the value of the column index automatically</i>\n\t *\n\t *  @name DataTable.defaults.column.orderData\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderData\": [ 0, 1 ] },\n\t *          { \"orderData\": [ 1, 0 ] },\n\t *          { \"orderData\": 2 },\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aDataSort\": null,\n\t\"iDataSort\": -1,\n\n\n\t/**\n\t * You can control the default ordering direction, and even alter the\n\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t * using this parameter.\n\t *  @type array\n\t *  @default [ 'asc', 'desc' ]\n\t *\n\t *  @name DataTable.defaults.column.orderSequence\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          { \"orderSequence\": [ \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\" ] },\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"asSorting\": [ 'asc', 'desc' ],\n\n\n\t/**\n\t * Enable or disable filtering on the data in this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.searchable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"searchable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSearchable\": true,\n\n\n\t/**\n\t * Enable or disable ordering on this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.orderable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSortable\": true,\n\n\n\t/**\n\t * Enable or disable the display of this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.visible\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"visible\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bVisible\": true,\n\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} td The TD node that has been created\n\t *  @param {*} cellData The Data for the cell\n\t *  @param {array|object} rowData The data for the whole row\n\t *  @param {int} row The row index for the aoData data store\n\t *  @param {int} col The column index for aoColumns\n\t *\n\t *  @name DataTable.defaults.column.createdCell\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [3],\n\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t *            if ( cellData == \"1.7\" ) {\n\t *              $(td).css('color', 'blue')\n\t *            }\n\t *          }\n\t *        } ]\n\t *      });\n\t *    } );\n\t */\n\t\"fnCreatedCell\": null,\n\n\n\t/**\n\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t * consistency. `dataProp` can still be used, as there is backwards\n\t * compatibility in DataTables for this option, but it is strongly\n\t * recommended that you use `data` in preference to `dataProp`.\n\t *  @name DataTable.defaults.column.dataProp\n\t */\n\n\n\t/**\n\t * This property can be used to read data from any data source property,\n\t * including deeply nested objects / properties. `data` can be given in a\n\t * number of different ways which effect its behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object. Note that\n\t *      function notation is recommended for use in `render` rather than\n\t *      `data` as it is much simpler to use as a renderer.\n\t * * `null` - use the original data source for the row rather than plucking\n\t *   data directly from it. This action has effects on two other\n\t *   initialisation options:\n\t *    * `defaultContent` - When null is given as the `data` option and\n\t *      `defaultContent` is specified for the column, the value defined by\n\t *      `defaultContent` will be used for the cell.\n\t *    * `render` - When null is used for the `data` option and the `render`\n\t *      option is specified for the column, the whole data source for the\n\t *      row is used for the renderer.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * `{array|object}` The data source for the row\n\t *      * `{string}` The type call data requested - this will be 'set' when\n\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t *        when gathering data. Note that when `undefined` is given for the\n\t *        type DataTables expects to get the raw data for the object back<\n\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t *    * Return:\n\t *      * The return value from the function is not required when 'set' is\n\t *        the type of call, but otherwise the return is what will be used\n\t *        for the data requested.\n\t *\n\t * Note that `data` is a getter and setter option. If you just require\n\t * formatting of data for output, you will likely want to use `render` which\n\t * is simply a getter and thus simpler to use.\n\t *\n\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t * name change reflects the flexibility of this property and is consistent\n\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t * be used by DataTables, as it automatically maps the old name to the new\n\t * if required.\n\t *\n\t *  @type string|int|function|null\n\t *  @default null <i>Use automatically calculated column index</i>\n\t *\n\t *  @name DataTable.defaults.column.data\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Read table data from objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {value},\n\t *    //      \"version\": {value},\n\t *    //      \"grade\": {value}\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform\" },\n\t *          { \"data\": \"version\" },\n\t *          { \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Read information from deeply nested objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {\n\t *    //         \"inner\": {value}\n\t *    //      },\n\t *    //      \"details\": [\n\t *    //         {value}, {value}\n\t *    //      ]\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform.inner\" },\n\t *          { \"data\": \"details.0\" },\n\t *          { \"data\": \"details.1\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `data` as a function to provide different information for\n\t *    // sorting, filtering and display. In this case, currency (price)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": function ( source, type, val ) {\n\t *            if (type === 'set') {\n\t *              source.price = val;\n\t *              // Store the computed display and filter values for efficiency\n\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t *              return;\n\t *            }\n\t *            else if (type === 'display') {\n\t *              return source.price_display;\n\t *            }\n\t *            else if (type === 'filter') {\n\t *              return source.price_filter;\n\t *            }\n\t *            // 'sort', 'type' and undefined all just use the integer\n\t *            return source.price;\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using default content\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null,\n\t *          \"defaultContent\": \"Click to edit\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using array notation - outputting a list from an array\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"name[, ]\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t */\n\t\"mData\": null,\n\n\n\t/**\n\t * This property is the rendering partner to `data` and it is suggested that\n\t * when you want to manipulate data for display (including filtering,\n\t * sorting etc) without altering the underlying data for the table, use this\n\t * property. `render` can be considered to be the the read only companion to\n\t * `data` which is read / write (then as such more complex). Like `data`\n\t * this option can be given in a number of different ways to effect its\n\t * behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object.\n\t * * `object` - use different data for the different data types requested by\n\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t *   of the object is the data type the property refers to and the value can\n\t *   defined using an integer, string or function using the same rules as\n\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t *   This is the default value to use if you haven't specified a value for\n\t *   the data type requested by DataTables.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * {array|object} The data source for the row (based on `data`)\n\t *      * {string} The type call data requested - this will be 'filter',\n\t *        'display', 'type' or 'sort'.\n\t *      * {array|object} The full data source for the row (not based on\n\t *        `data`)\n\t *    * Return:\n\t *      * The return value from the function is what will be used for the\n\t *        data requested.\n\t *\n\t *  @type string|int|function|object|null\n\t *  @default null Use the data source value.\n\t *\n\t *  @name DataTable.defaults.column.render\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Create a comma separated list from an array of objects\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          {\n\t *            \"data\": \"platform\",\n\t *            \"render\": \"[, ].name\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Execute a function to obtain data\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": \"browserName()\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // As an object, extracting different data for the different types\n\t *    // This would be used with a data source such as:\n\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t *    // the formatted phone number is the one that is shown in the table.\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": {\n\t *            \"_\": \"phone\",\n\t *            \"filter\": \"phone_filter\",\n\t *            \"display\": \"phone_display\"\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Use as a function to create a link from the data source\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"download_link\",\n\t *          \"render\": function ( data, type, full ) {\n\t *            return '<a href=\"'+data+'\">Download</a>';\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"mRender\": null,\n\n\n\t/**\n\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t *  @type string\n\t *  @default td\n\t *\n\t *  @name DataTable.defaults.column.cellType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Make the first column use TH cells\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"cellType\": \"th\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sCellType\": \"td\",\n\n\n\t/**\n\t * Class to give to each cell in this column.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.class\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"class\": \"my_class\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sClass\": \"\",\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t * Generally you shouldn't need this!\n\t *  @type string\n\t *  @default <i>Empty string<i>\n\t *\n\t *  @name DataTable.defaults.column.contentPadding\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"contentPadding\": \"mmm\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sContentPadding\": \"\",\n\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because `data`\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.column.defaultContent\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\",\n\t *            \"targets\": [ -1 ]\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sDefaultContent\": null,\n\n\n\t/**\n\t * This parameter is only used in DataTables' server-side processing. It can\n\t * be exceptionally useful to know what columns are being displayed on the\n\t * client side, and to map these to database fields. When defined, the names\n\t * also allow DataTables to reorder information from the server if it comes\n\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t * client-side, your server-side code does not also need updating).\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.name\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"name\": \"engine\" },\n\t *          { \"name\": \"browser\" },\n\t *          { \"name\": \"platform\" },\n\t *          { \"name\": \"version\" },\n\t *          { \"name\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sName\": \"\",\n\n\n\t/**\n\t * Defines a data source type for the ordering which can be used to read\n\t * real-time information from the table (updating the internally cached\n\t * version) prior to ordering. This allows ordering to occur on user\n\t * editable elements such as form inputs.\n\t *  @type string\n\t *  @default std\n\t *\n\t *  @name DataTable.defaults.column.orderDataType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          { \"orderDataType\": \"dom-text\" },\n\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t *          { \"orderDataType\": \"dom-select\" },\n\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sSortDataType\": \"std\",\n\n\n\t/**\n\t * The title of this column.\n\t *  @type string\n\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t *    original HTML table.</i>\n\t *\n\t *  @name DataTable.defaults.column.title\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"title\": \"My column title\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sTitle\": null,\n\n\n\t/**\n\t * The type allows you to specify how the data for this column will be\n\t * ordered. Four types (string, numeric, date and html (which will strip\n\t * HTML tags before ordering)) are currently available. Note that only date\n\t * formats understood by Javascript's Date() object will be accepted as type\n\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t * through plug-ins.\n\t *  @type string\n\t *  @default null <i>Auto-detected from raw data</i>\n\t *\n\t *  @name DataTable.defaults.column.type\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"type\": \"html\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sType\": null,\n\n\n\t/**\n\t * Defining the width of the column, this parameter may take any CSS value\n\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t * been given a specific width through this interface ensuring that the table\n\t * remains readable.\n\t *  @type string\n\t *  @default null <i>Automatic</i>\n\t *\n\t *  @name DataTable.defaults.column.width\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"width\": \"20%\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sWidth\": null\n};\n\n_fnHungarianMap( DataTable.defaults.column );\n\n\n\n/**\n * DataTables settings object - this holds all the information needed for a\n * given table, including configuration, data and current application of the\n * table options. DataTables does not have a single instance for each DataTable\n * with the settings attached to that instance, but rather instances of the\n * DataTable \"class\" are created on-the-fly as needed (typically by a\n * $().dataTable() call) and the settings object is then applied to that\n * instance.\n *\n * Note that this object is related to {@link DataTable.defaults} but this\n * one is the internal data store for DataTables's cache of columns. It should\n * NOT be manipulated outside of DataTables. Any configuration should be done\n * through the initialisation options.\n *  @namespace\n *  @todo Really should attach the settings object to individual instances so we\n *    don't need to create new instances on each $().dataTable() call (if the\n *    table already exists). It would also save passing oSettings around and\n *    into every single function. However, this is a very significant\n *    architecture change for DataTables and will almost certainly break\n *    backwards compatibility with older installations. This is something that\n *    will be done in 2.0.\n */\nDataTable.models.oSettings = {\n\t/**\n\t * Primary features of DataTables and their enablement state.\n\t *  @namespace\n\t */\n\t\"oFeatures\": {\n\n\t\t/**\n\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t * optimum table and columns widths (true) or not (false).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bAutoWidth\": null,\n\n\t\t/**\n\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t * needed by a driven page draw. This can give a significant speed\n\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t * difference at all for DOM and server-side processing tables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bDeferRender\": null,\n\n\t\t/**\n\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bFilter\": null,\n\n\t\t/**\n\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t * flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bInfo\": null,\n\n\t\t/**\n\t\t * Present a user control allowing the end user to change the page size\n\t\t * when pagination is enabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bLengthChange\": null,\n\n\t\t/**\n\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t * changing must also be disabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bPaginate\": null,\n\n\t\t/**\n\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t * user request - typically an Ajax request for server-side processing.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bProcessing\": null,\n\n\t\t/**\n\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t * get all data from the server for every draw - there is no filtering,\n\t\t * sorting or paging done on the client-side.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bServerSide\": null,\n\n\t\t/**\n\t\t * Sorting enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSort\": null,\n\n\t\t/**\n\t\t * Multi-column sorting\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortMulti\": null,\n\n\t\t/**\n\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t * there is a lot of DOM interaction.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortClasses\": null,\n\n\t\t/**\n\t\t * State saving enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bStateSave\": null\n\t},\n\n\n\t/**\n\t * Scrolling settings for a table.\n\t *  @namespace\n\t */\n\t\"oScroll\": {\n\t\t/**\n\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t * table container down to the height of the table (when true).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bCollapse\": null,\n\n\t\t/**\n\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t * during table initialisation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iBarWidth\": 0,\n\n\t\t/**\n\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t * disabled if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sX\": null,\n\n\t\t/**\n\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t * should not need to use this.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @deprecated\n\t\t */\n\t\t\"sXInner\": null,\n\n\t\t/**\n\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t * if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sY\": null\n\t},\n\n\t/**\n\t * Language information for the table.\n\t *  @namespace\n\t *  @extends DataTable.defaults.oLanguage\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Information callback function. See\n\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t *  @type function\n\t\t *  @default null\n\t\t */\n\t\t\"fnInfoCallback\": null\n\t},\n\n\t/**\n\t * Browser support parameters\n\t *  @namespace\n\t */\n\t\"oBrowser\": {\n\t\t/**\n\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t * scrolling element (IE6/7)\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollOversize\": false,\n\n\t\t/**\n\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t * scrolling container - needed for rtl language layout, although not\n\t\t * all browsers move the scrollbar (Safari).\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollbarLeft\": false,\n\n\t\t/**\n\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bBounding\": false,\n\n\t\t/**\n\t\t * Browser scrollbar width\n\t\t *  @type integer\n\t\t *  @default 0\n\t\t */\n\t\t\"barWidth\": 0\n\t},\n\n\n\t\"ajax\": null,\n\n\n\t/**\n\t * Array referencing the nodes which are used for the features. The\n\t * parameters of this object match what is allowed by sDom - i.e.\n\t *   <ul>\n\t *     <li>'l' - Length changing</li>\n\t *     <li>'f' - Filtering input</li>\n\t *     <li>'t' - The table!</li>\n\t *     <li>'i' - Information</li>\n\t *     <li>'p' - Pagination</li>\n\t *     <li>'r' - pRocessing</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aanFeatures\": [],\n\n\t/**\n\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t * information.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoData\": [],\n\n\t/**\n\t * Array of indexes which are in the current display (after filtering etc)\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplay\": [],\n\n\t/**\n\t * Array of indexes for display - no filtering\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplayMaster\": [],\n\n\t/**\n\t * Map of row ids to data indexes\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"aIds\": {},\n\n\t/**\n\t * Store information about each column that is in use\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoColumns\": [],\n\n\t/**\n\t * Store information about the table's header\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeader\": [],\n\n\t/**\n\t * Store information about the table's footer\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooter\": [],\n\n\t/**\n\t * Store the applied global search information in case we want to force a\n\t * research or compare the old search to a new one.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t */\n\t\"oPreviousSearch\": {},\n\n\t/**\n\t * Store the applied search for each column - see\n\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t * filtering information for each column.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreSearchCols\": [],\n\n\t/**\n\t * Sorting that is applied to the table. Note that the inner arrays are\n\t * used in the following manner:\n\t * <ul>\n\t *   <li>Index 0 - column number</li>\n\t *   <li>Index 1 - current sorting direction</li>\n\t * </ul>\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @todo These inner arrays should really be objects\n\t */\n\t\"aaSorting\": null,\n\n\t/**\n\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t * aaSorting).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aaSortingFixed\": [],\n\n\t/**\n\t * Classes to use for the striping of a table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asStripeClasses\": null,\n\n\t/**\n\t * If restoring a table - we should restore its striping classes as well\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asDestroyStripes\": [],\n\n\t/**\n\t * If restoring a table - we should restore its width\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"sDestroyWidth\": 0,\n\n\t/**\n\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCallback\": [],\n\n\t/**\n\t * Callback functions for the header on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeaderCallback\": [],\n\n\t/**\n\t * Callback function for the footer on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooterCallback\": [],\n\n\t/**\n\t * Array of callback functions for draw callback functions\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDrawCallback\": [],\n\n\t/**\n\t * Array of callback functions for row created function\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCreatedCallback\": [],\n\n\t/**\n\t * Callback functions for just before the table is redrawn. A return of\n\t * false will be used to cancel the draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreDrawCallback\": [],\n\n\t/**\n\t * Callback functions for when the table has been initialised.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoInitComplete\": [],\n\n\n\t/**\n\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t * saving state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSaveParams\": [],\n\n\t/**\n\t * Callbacks for modifying the settings that have been stored for state saving\n\t * prior to using the stored values to restore the state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoadParams\": [],\n\n\t/**\n\t * Callbacks for operating on the settings object once the saved state has been\n\t * loaded\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoaded\": [],\n\n\t/**\n\t * Cache the table ID for quick access\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sTableId\": \"\",\n\n\t/**\n\t * The TABLE node for the main table\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTable\": null,\n\n\t/**\n\t * Permanent ref to the thead element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTHead\": null,\n\n\t/**\n\t * Permanent ref to the tfoot element - if it exists\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTFoot\": null,\n\n\t/**\n\t * Permanent ref to the tbody element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTBody\": null,\n\n\t/**\n\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTableWrapper\": null,\n\n\t/**\n\t * Indicate if when using server-side processing the loading of data\n\t * should be deferred until the second draw.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDeferLoading\": false,\n\n\t/**\n\t * Indicate if all required information has been read in\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bInitialised\": false,\n\n\t/**\n\t * Information about open rows. Each object in the array has the parameters\n\t * 'nTr' and 'nParent'\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoOpenRows\": [],\n\n\t/**\n\t * Dictate the positioning of DataTables' control elements - see\n\t * {@link DataTable.model.oInit.sDom}.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDom\": null,\n\n\t/**\n\t * Search delay (in mS)\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"searchDelay\": null,\n\n\t/**\n\t * Which type of pagination should be used.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default two_button\n\t */\n\t\"sPaginationType\": \"two_button\",\n\n\t/**\n\t * The state duration (for `stateSave`) in seconds.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iStateDuration\": 0,\n\n\t/**\n\t * Array of callback functions for state saving. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the JSON string to save that has been thus far created. Returns\n\t *       a JSON string to be inserted into a json object\n\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSave\": [],\n\n\t/**\n\t * Array of callback functions for state loading. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the object stored. May return false to cancel state loading</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoad\": [],\n\n\t/**\n\t * State that was saved. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oSavedState\": null,\n\n\t/**\n\t * State that was loaded. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oLoadedState\": null,\n\n\t/**\n\t * Source url for AJAX data for the table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sAjaxSource\": null,\n\n\t/**\n\t * Property from a given object from which to read the table data from. This\n\t * can be an empty string (when not server-side processing), in which case\n\t * it is  assumed an an array is given directly.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sAjaxDataProp\": null,\n\n\t/**\n\t * The last jQuery XHR object that was used for server-side data gathering.\n\t * This can be used for working with the XHR information in one of the\n\t * callbacks\n\t *  @type object\n\t *  @default null\n\t */\n\t\"jqXHR\": null,\n\n\t/**\n\t * JSON returned from the server in the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"json\": undefined,\n\n\t/**\n\t * Data submitted as part of the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"oAjaxData\": undefined,\n\n\t/**\n\t * Function to get the server-side data.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnServerData\": null,\n\n\t/**\n\t * Functions which are called prior to sending an Ajax request so extra\n\t * parameters can easily be sent to the server\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoServerParams\": [],\n\n\t/**\n\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t * required).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sServerMethod\": null,\n\n\t/**\n\t * Format numbers for display.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnFormatNumber\": null,\n\n\t/**\n\t * List of options that can be used for the user selectable length menu.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLengthMenu\": null,\n\n\t/**\n\t * Counter for the draws that the table does. Also used as a tracker for\n\t * server-side processing\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iDraw\": 0,\n\n\t/**\n\t * Indicate if a redraw is being done - useful for Ajax\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDrawing\": false,\n\n\t/**\n\t * Draw index (iDraw) of the last error when parsing the returned data\n\t *  @type int\n\t *  @default -1\n\t */\n\t\"iDrawError\": -1,\n\n\t/**\n\t * Paging display length\n\t *  @type int\n\t *  @default 10\n\t */\n\t\"_iDisplayLength\": 10,\n\n\t/**\n\t * Paging start point - aiDisplay index\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"_iDisplayStart\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the result set\n\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type int\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsTotal\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the current display set\n\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type boolean\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsDisplay\": 0,\n\n\t/**\n\t * The classes to use for the table\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oClasses\": {},\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bFiltered\": false,\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bSorted\": false,\n\n\t/**\n\t * Indicate that if multiple rows are in the header and there is more than\n\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t * should be used for sorting / title by DataTables.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t */\n\t\"bSortCellsTop\": null,\n\n\t/**\n\t * Initialisation object that is used for the table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInit\": null,\n\n\t/**\n\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t * destroy so they can clean up markup and events.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDestroyCallback\": [],\n\n\n\t/**\n\t * Get the number of records in the current record set, before filtering\n\t *  @type function\n\t */\n\t\"fnRecordsTotal\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsTotal * 1 :\n\t\t\tthis.aiDisplayMaster.length;\n\t},\n\n\t/**\n\t * Get the number of records in the current record set, after filtering\n\t *  @type function\n\t */\n\t\"fnRecordsDisplay\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\tthis.aiDisplay.length;\n\t},\n\n\t/**\n\t * Get the display end point - aiDisplay index\n\t *  @type function\n\t */\n\t\"fnDisplayEnd\": function ()\n\t{\n\t\tvar\n\t\t\tlen      = this._iDisplayLength,\n\t\t\tstart    = this._iDisplayStart,\n\t\t\tcalc     = start + len,\n\t\t\trecords  = this.aiDisplay.length,\n\t\t\tfeatures = this.oFeatures,\n\t\t\tpaginate = features.bPaginate;\n\n\t\tif ( features.bServerSide ) {\n\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\tstart + records :\n\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t}\n\t\telse {\n\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\trecords :\n\t\t\t\tcalc;\n\t\t}\n\t},\n\n\t/**\n\t * The DataTables object for this table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInstance\": null,\n\n\t/**\n\t * Unique identifier for each instance of the DataTables object. If there\n\t * is an ID on the table node, then it takes that value, otherwise an\n\t * incrementing internal counter is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sInstance\": null,\n\n\t/**\n\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t * keyboard navigation of the table and its controls.\n\t */\n\t\"iTabIndex\": 0,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollHead\": null,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollFoot\": null,\n\n\t/**\n\t * Last applied sort\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLastSort\": [],\n\n\t/**\n\t * Stored plug-in instances\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oPlugins\": {},\n\n\t/**\n\t * Function used to get a row's id from the row's data\n\t *  @type function\n\t *  @default null\n\t */\n\t\"rowIdFn\": null,\n\n\t/**\n\t * Data location where to store a row's id\n\t *  @type string\n\t *  @default null\n\t */\n\t\"rowId\": null\n};\n\n/**\n * Extension object for DataTables that is used to provide all extension\n * options.\n *\n * Note that the `DataTable.ext` object is available through\n * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n *  @namespace\n *  @extends DataTable.models.ext\n */\n\n\n/**\n * DataTables extensions\n * \n * This namespace acts as a collection area for plug-ins that can be used to\n * extend DataTables capabilities. Indeed many of the build in methods\n * use this method to provide their own capabilities (sorting methods for\n * example).\n *\n * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n * reasons\n *\n *  @namespace\n */\nDataTable.ext = _ext = {\n\t/**\n\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t * defined here so other extensions can define buttons regardless of load\n\t * order. It is _not_ used by DataTables core.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tbuttons: {},\n\n\n\t/**\n\t * Element class names\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tclasses: {},\n\n\n\t/**\n\t * DataTables build type (expanded by the download builder)\n\t *\n\t *  @type string\n\t */\n\tbuilder: \"-source-\",\n\n\n\t/**\n\t * Error reporting.\n\t * \n\t * How should DataTables report an error. Can take the value 'alert',\n\t * 'throw', 'none' or a function.\n\t *\n\t *  @type string|function\n\t *  @default alert\n\t */\n\terrMode: \"alert\",\n\n\n\t/**\n\t * Feature plug-ins.\n\t * \n\t * This is an array of objects which describe the feature plug-ins that are\n\t * available to DataTables. These feature plug-ins are then available for\n\t * use through the `dom` initialisation option.\n\t * \n\t * Each feature plug-in is described by an object which must have the\n\t * following properties:\n\t * \n\t * * `fnInit` - function that is used to initialise the plug-in,\n\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t *   instillation option. This is case sensitive.\n\t *\n\t * The `fnInit` function has the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t *\n\t * And the following return is expected:\n\t * \n\t * * {node|null} The element which contains your feature. Note that the\n\t *   return may also be void if your plug-in does not require to inject any\n\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t *   be useful when developing a plug-in which allows table control via\n\t *   keyboard entry\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    $.fn.dataTable.ext.features.push( {\n\t *      \"fnInit\": function( oSettings ) {\n\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t *      },\n\t *      \"cFeature\": \"T\"\n\t *    } );\n\t */\n\tfeature: [],\n\n\n\t/**\n\t * Row searching.\n\t * \n\t * This method of searching is complimentary to the default type based\n\t * searching, and a lot more comprehensive as it allows you complete control\n\t * over the searching logic. Each element in this array is a function\n\t * (parameters described below) that is called for every row in the table,\n\t * and your logic decides if it should be included in the searching data set\n\t * or not.\n\t *\n\t * Searching functions have the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t *    original format that was passed in as the data source, or an array\n\t *    from a DOM data source\n\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t *\n\t * And the following return is expected:\n\t *\n\t * * {boolean} Include the row in the searched result set (true) or not\n\t *   (false)\n\t *\n\t * Note that as with the main search ability in DataTables, technically this\n\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t * naming we call it searching here.\n\t *\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @example\n\t *    // The following example shows custom search being applied to the\n\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t *    // from the end-user, matching the data in a certain range.\n\t *    $.fn.dataTable.ext.search.push(\n\t *      function( settings, data, dataIndex ) {\n\t *        var min = document.getElementById('min').value * 1;\n\t *        var max = document.getElementById('max').value * 1;\n\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t *\n\t *        if ( min == \"\" && max == \"\" ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min == \"\" && version < max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && \"\" == max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && version < max ) {\n\t *          return true;\n\t *        }\n\t *        return false;\n\t *      }\n\t *    );\n\t */\n\tsearch: [],\n\n\n\t/**\n\t * Selector extensions\n\t *\n\t * The `selector` option can be used to extend the options available for the\n\t * selector modifier options (`selector-modifier` object data type) that\n\t * each of the three built in selector types offer (row, column and cell +\n\t * their plural counterparts). For example the Select extension uses this\n\t * mechanism to provide an option to select only rows, columns and cells\n\t * that have been marked as selected by the end user (`{selected: true}`),\n\t * which can be used in conjunction with the existing built in selector\n\t * options.\n\t *\n\t * Each property is an array to which functions can be pushed. The functions\n\t * take three attributes:\n\t *\n\t * * Settings object for the host table\n\t * * Options object (`selector-modifier` object type)\n\t * * Array of selected item indexes\n\t *\n\t * The return is an array of the resulting item indexes after the custom\n\t * selector has been applied.\n\t *\n\t *  @type object\n\t */\n\tselector: {\n\t\tcell: [],\n\t\tcolumn: [],\n\t\trow: []\n\t},\n\n\n\t/**\n\t * Internal functions, exposed for used in plug-ins.\n\t * \n\t * Please note that you should not need to use the internal methods for\n\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t * The internal function may change between releases.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tinternal: {},\n\n\n\t/**\n\t * Legacy configuration options. Enable and disable legacy options that\n\t * are available in DataTables.\n\t *\n\t *  @type object\n\t */\n\tlegacy: {\n\t\t/**\n\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t * requests\n\t\t *\n\t\t *  @type boolean\n\t\t *  @default null\n\t\t */\n\t\tajax: null\n\t},\n\n\n\t/**\n\t * Pagination plug-in methods.\n\t * \n\t * Each entry in this object is a function and defines which buttons should\n\t * be shown by the pagination rendering method that is used for the table:\n\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t * buttons are displayed in the document, while the functions here tell it\n\t * what buttons to display. This is done by returning an array of button\n\t * descriptions (what each button will do).\n\t *\n\t * Pagination types (the four built in options and any additional plug-in\n\t * options defined here) can be used through the `paginationType`\n\t * initialisation parameter.\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{int} page` The current page index\n\t * 2. `{int} pages` The number of pages in the table\n\t *\n\t * Each function is expected to return an array where each element of the\n\t * array can be one of:\n\t *\n\t * * `first` - Jump to first page when activated\n\t * * `last` - Jump to last page when activated\n\t * * `previous` - Show previous page when activated\n\t * * `next` - Show next page when activated\n\t * * `{int}` - Show page of the index given\n\t * * `{array}` - A nested array containing the above elements to add a\n\t *   containing 'DIV' element (might be useful for styling).\n\t *\n\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t * an object with two functions would be defined for each plug-in. That\n\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t * compatibility, but this option of use is now decremented and no longer\n\t * documented in DataTables 1.10+.\n\t *\n\t *  @type object\n\t *  @default {}\n\t *\n\t *  @example\n\t *    // Show previous, next and current page buttons only\n\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t *      return [ 'previous', page, 'next' ];\n\t *    };\n\t */\n\tpager: {},\n\n\n\trenderer: {\n\t\tpageButton: {},\n\t\theader: {}\n\t},\n\n\n\t/**\n\t * Ordering plug-ins - custom data source\n\t * \n\t * The extension options for ordering of data available here is complimentary\n\t * to the default type based ordering that DataTables typically uses. It\n\t * allows much greater control over the the data that is being used to\n\t * order a column, but is necessarily therefore more complex.\n\t * \n\t * This type of ordering is useful if you want to do ordering based on data\n\t * live from the DOM (for example the contents of an 'input' element) rather\n\t * than just the static string that DataTables knows of.\n\t * \n\t * The way these plug-ins work is that you create an array of the values you\n\t * wish to be ordering for the column in question and then return that\n\t * array. The data in the array much be in the index order of the rows in\n\t * the table (not the currently ordering order!). Which order data gathering\n\t * function is run here depends on the `dt-init columns.orderDataType`\n\t * parameter that is used for the column (if any).\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{int}` Target column index\n\t *\n\t * Each function is expected to return an array:\n\t *\n\t * * `{array}` Data for the column to be ordering upon\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    // Ordering using `input` node values\n\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t *    {\n\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t *        return $('input', td).val();\n\t *      } );\n\t *    }\n\t */\n\torder: {},\n\n\n\t/**\n\t * Type based plug-ins.\n\t *\n\t * Each column in DataTables has a type assigned to it, either by automatic\n\t * detection or by direct assignment using the `type` option for the column.\n\t * The type of a column will effect how it is ordering and search (plug-ins\n\t * can also make use of the column type if required).\n\t *\n\t * @namespace\n\t */\n\ttype: {\n\t\t/**\n\t\t * Type detection functions.\n\t\t *\n\t\t * The functions defined in this object are used to automatically detect\n\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t * when complex data is in the table.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be analysed\n\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t     *     perform context specific type detection - for example detection\n\t     *     based on language settings such as using a comma for a decimal\n\t     *     place. Generally speaking the options from the settings will not\n\t     *     be required\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t *   pass it on to the other type detection functions.\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Currency type detection plug-in:\n\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t *      function ( data, settings ) {\n\t\t *        // Check the numeric part\n\t\t *        if ( ! data.substring(1).match(/[0-9]/) ) {\n\t\t *          return null;\n\t\t *        }\n\t\t *\n\t\t *        // Check prefixed by currency\n\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t *          return 'currency';\n\t\t *        }\n\t\t *        return null;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tdetect: [],\n\n\n\t\t/**\n\t\t * Type based search formatting.\n\t\t *\n\t\t * The type based searching functions can be used to pre-format the\n\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t *\n\t\t * Note that is a search is not defined for a column of a given type,\n\t\t * no search formatting will be performed.\n\t\t * \n\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t * or a type detection plug-in), you will typically be using this for\n\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t * the format that should be searched upon. This is done by adding\n\t\t * functions this object with a parameter name which matches the sType\n\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t * for searching data.\n\t\t *\n\t\t * The functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t *    }\n\t\t */\n\t\tsearch: {},\n\n\n\t\t/**\n\t\t * Type based ordering.\n\t\t *\n\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t * is defined by the functions available in this object.\n\t\t *\n\t\t * Each ordering option can be described by three properties added to\n\t\t * this object:\n\t\t *\n\t\t * * `{type}-pre` - Pre-formatting function\n\t\t * * `{type}-asc` - Ascending order function\n\t\t * * `{type}-desc` - Descending order function\n\t\t *\n\t\t * All three can be used together, only `{type}-pre` or only\n\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t * implementation in terms of speed, although the others are provided\n\t\t * for compatibility with existing Javascript sort functions.\n\t\t *\n\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t *\n\t\t * And return:\n\t\t *\n\t\t * * `{*}` Data to be sorted upon\n\t\t *\n\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t * functions, taking two parameters:\n\t\t *\n\t     *  1. `{*}` Data to compare to the second parameter\n\t     *  2. `{*}` Data to compare to the first parameter\n\t\t *\n\t\t * And returning:\n\t\t *\n\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t *   parameter.\n\t\t * \n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t *      \"string-pre\": function(x) {\n\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t *        return parseFloat( a );\n\t\t *      }\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t *      \"string-case-asc\": function(x,y) {\n\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t *      },\n\t\t *      \"string-case-desc\": function(x,y) {\n\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\torder: {}\n\t},\n\n\t/**\n\t * Unique DataTables instance counter\n\t *\n\t * @type int\n\t * @private\n\t */\n\t_unique: 0,\n\n\n\t//\n\t// Depreciated\n\t// The following properties are retained for backwards compatibility only.\n\t// The should not be used in new projects and will be removed in a future\n\t// version\n\t//\n\n\t/**\n\t * Version check function.\n\t *  @type function\n\t *  @depreciated Since 1.10\n\t */\n\tfnVersionCheck: DataTable.fnVersionCheck,\n\n\n\t/**\n\t * Index for what 'this' index API functions should use\n\t *  @type int\n\t *  @deprecated Since v1.10\n\t */\n\tiApiIndex: 0,\n\n\n\t/**\n\t * jQuery UI class container\n\t *  @type object\n\t *  @deprecated Since v1.10\n\t */\n\toJUIClasses: {},\n\n\n\t/**\n\t * Software version\n\t *  @type string\n\t *  @deprecated Since v1.10\n\t */\n\tsVersion: DataTable.version\n};\n\n\n//\n// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n//\n$.extend( _ext, {\n\tafnFiltering: _ext.search,\n\taTypes:       _ext.type.detect,\n\tofnSearch:    _ext.type.search,\n\toSort:        _ext.type.order,\n\tafnSortData:  _ext.order,\n\taoFeatures:   _ext.feature,\n\toApi:         _ext.internal,\n\toStdClasses:  _ext.classes,\n\toPagination:  _ext.pager\n} );\n\n\n$.extend( DataTable.ext.classes, {\n\t\"sTable\": \"dataTable\",\n\t\"sNoFooter\": \"no-footer\",\n\n\t/* Paging buttons */\n\t\"sPageButton\": \"paginate_button\",\n\t\"sPageButtonActive\": \"current\",\n\t\"sPageButtonDisabled\": \"disabled\",\n\n\t/* Striping classes */\n\t\"sStripeOdd\": \"odd\",\n\t\"sStripeEven\": \"even\",\n\n\t/* Empty row */\n\t\"sRowEmpty\": \"dataTables_empty\",\n\n\t/* Features */\n\t\"sWrapper\": \"dataTables_wrapper\",\n\t\"sFilter\": \"dataTables_filter\",\n\t\"sInfo\": \"dataTables_info\",\n\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\"sLength\": \"dataTables_length\",\n\t\"sProcessing\": \"dataTables_processing\",\n\n\t/* Sorting */\n\t\"sSortAsc\": \"sorting_asc\",\n\t\"sSortDesc\": \"sorting_desc\",\n\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\"sSortableAsc\": \"sorting_desc_disabled\",\n\t\"sSortableDesc\": \"sorting_asc_disabled\",\n\t\"sSortableNone\": \"sorting_disabled\",\n\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\n\t/* Filtering */\n\t\"sFilterInput\": \"\",\n\n\t/* Page length */\n\t\"sLengthSelect\": \"\",\n\n\t/* Scrolling */\n\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\n\t/* Misc */\n\t\"sHeaderTH\": \"\",\n\t\"sFooterTH\": \"\",\n\n\t// Deprecated\n\t\"sSortJUIAsc\": \"\",\n\t\"sSortJUIDesc\": \"\",\n\t\"sSortJUI\": \"\",\n\t\"sSortJUIAscAllowed\": \"\",\n\t\"sSortJUIDescAllowed\": \"\",\n\t\"sSortJUIWrapper\": \"\",\n\t\"sSortIcon\": \"\",\n\t\"sJUIHeader\": \"\",\n\t\"sJUIFooter\": \"\"\n} );\n\n\nvar extPagination = DataTable.ext.pager;\n\nfunction _numbers ( page, pages ) {\n\tvar\n\t\tnumbers = [],\n\t\tbuttons = extPagination.numbers_length,\n\t\thalf = Math.floor( buttons / 2 ),\n\t\ti = 1;\n\n\tif ( pages <= buttons ) {\n\t\tnumbers = _range( 0, pages );\n\t}\n\telse if ( page <= half ) {\n\t\tnumbers = _range( 0, buttons-2 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t}\n\telse if ( page >= pages - 1 - half ) {\n\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\telse {\n\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\n\tnumbers.DT_el = 'span';\n\treturn numbers;\n}\n\n\n$.extend( extPagination, {\n\tsimple: function ( page, pages ) {\n\t\treturn [ 'previous', 'next' ];\n\t},\n\n\tfull: function ( page, pages ) {\n\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t},\n\n\tnumbers: function ( page, pages ) {\n\t\treturn [ _numbers(page, pages) ];\n\t},\n\n\tsimple_numbers: function ( page, pages ) {\n\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t},\n\n\tfull_numbers: function ( page, pages ) {\n\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t},\n\t\n\tfirst_last_numbers: function (page, pages) {\n \t\treturn ['first', _numbers(page, pages), 'last'];\n \t},\n\n\t// For testing and plug-ins to use\n\t_numbers: _numbers,\n\n\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\tnumbers_length: 7\n} );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\tpageButton: {\n\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\tvar classes = settings.oClasses;\n\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\tvar btnDisplay, btnClass;\n\n\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\tvar i, ien, node, button, tabIndex;\n\t\t\t\tvar disabledClass = classes.sPageButtonDisabled;\n\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t};\n\n\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\tbutton = buttons[i];\n\n\t\t\t\t\tif ( Array.isArray( button ) ) {\n\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\tbtnClass = button;\n\t\t\t\t\t\ttabIndex = settings.iTabIndex;\n\n\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbtnDisplay = settings.fnFormatNumber( button + 1 );\n\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\tvar tag = settings.oInit.pagingTag || 'a';\n\t\t\t\t\t\t\tvar disabled = btnClass.indexOf(disabledClass) !== -1;\n\t\t\n\n\t\t\t\t\t\t\tnode = $('<'+tag+'>', {\n\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t'aria-disabled': disabled ? 'true' : null,\n\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t'role': 'link',\n\t\t\t\t\t\t\t\t\t'aria-current': btnClass === classes.sPageButtonActive ? 'page' : null,\n\t\t\t\t\t\t\t\t\t'data-dt-idx': button,\n\t\t\t\t\t\t\t\t\t'tabindex': tabIndex,\n\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t// accessibility, but neither are frames.\n\t\t\tvar activeEl;\n\n\t\t\ttry {\n\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t// completed\n\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t}\n\t\t\tcatch (e) {}\n\n\t\t\tattach( $(host).empty(), buttons );\n\n\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t\t\t}\n\t\t}\n\t}\n} );\n\n\n\n// Built in type detection. See model.ext.aTypes for information about\n// what is required from this methods.\n$.extend( DataTable.ext.type.detect, [\n\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t},\n\n\t// Dates (only those recognised by the browser's Date.parse)\n\tfunction ( d, settings )\n\t{\n\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t// plug-in for anything other than ISO8601 style strings\n\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\treturn null;\n\t\t}\n\t\tvar parsed = Date.parse(d);\n\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t},\n\n\t// Formatted numbers\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t},\n\n\t// HTML numeric\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t},\n\n\t// HTML numeric, formatted\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t},\n\n\t// HTML (this is strict checking - there must be html)\n\tfunction ( d, settings )\n\t{\n\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t'html' : null;\n\t}\n] );\n\n\n\n// Filter formatting functions. See model.ext.ofnSearch for information about\n// what is required from these methods.\n// \n// Note that additional search methods are added for the html numbers and\n// html formatted numbers by `_addNumericSort()` when we know what the decimal\n// place is\n\n\n$.extend( DataTable.ext.type.search, {\n\thtml: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata\n\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t'';\n\t},\n\n\tstring: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\tdata;\n\t}\n} );\n\n\n\nvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\tif ( d !== 0 && (!d || d === '-') ) {\n\t\treturn -Infinity;\n\t}\n\t\n\tvar type = typeof d;\n\n\tif (type === 'number' || type === 'bigint') {\n\t\treturn d;\n\t}\n\n\t// If a decimal place other than `.` is used, it needs to be given to the\n\t// function so we can detect it and replace with a `.` which is the only\n\t// decimal place Javascript recognises - it is not locale aware.\n\tif ( decimalPlace ) {\n\t\td = _numToDecimal( d, decimalPlace );\n\t}\n\n\tif ( d.replace ) {\n\t\tif ( re1 ) {\n\t\t\td = d.replace( re1, '' );\n\t\t}\n\n\t\tif ( re2 ) {\n\t\t\td = d.replace( re2, '' );\n\t\t}\n\t}\n\n\treturn d * 1;\n};\n\n\n// Add the numeric 'deformatting' functions for sorting and search. This is done\n// in a function to provide an easy ability for the language options to add\n// additional methods if a non-period decimal place is used.\nfunction _addNumericSort ( decimalPlace ) {\n\t$.each(\n\t\t{\n\t\t\t// Plain numbers\n\t\t\t\"num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t},\n\n\t\t\t// Formatted numbers\n\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t},\n\n\t\t\t// HTML numeric\n\t\t\t\"html-num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t},\n\n\t\t\t// HTML numeric, formatted\n\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t}\n\t\t},\n\t\tfunction ( key, fn ) {\n\t\t\t// Add the ordering method\n\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\n\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t}\n\t\t}\n\t);\n}\n\n\n// Default sort methods\n$.extend( _ext.type.order, {\n\t// Dates\n\t\"date-pre\": function ( d ) {\n\t\tvar ts = Date.parse( d );\n\t\treturn isNaN(ts) ? -Infinity : ts;\n\t},\n\n\t// html\n\t\"html-pre\": function ( a ) {\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ta.replace ?\n\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\ta+'';\n\t},\n\n\t// string\n\t\"string-pre\": function ( a ) {\n\t\t// This is a little complex, but faster than always calling toString,\n\t\t// http://jsperf.com/tostring-v-check\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ttypeof a === 'string' ?\n\t\t\t\ta.toLowerCase() :\n\t\t\t\t! a.toString ?\n\t\t\t\t\t'' :\n\t\t\t\t\ta.toString();\n\t},\n\n\t// string-asc and -desc are retained only for compatibility with the old\n\t// sort methods\n\t\"string-asc\": function ( x, y ) {\n\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t},\n\n\t\"string-desc\": function ( x, y ) {\n\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t}\n} );\n\n\n// Numeric sorting types - order doesn't matter here\n_addNumericSort( '' );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\theader: {\n\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t// No additional mark-up required\n\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t// listening for\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\t\t\t} );\n\t\t},\n\n\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t$('<div/>')\n\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t.append( cell.contents() )\n\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t)\n\t\t\t\t.appendTo( cell );\n\n\t\t\t// Attach a sort listener to update on sort\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\n\t\t\t\tcell\n\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t}\n} );\n\n/*\n * Public helper functions. These aren't used internally by DataTables, or\n * called by any of the options passed into DataTables, but they can be used\n * externally by developers working with DataTables. They are helper functions\n * to make working with DataTables a little bit easier.\n */\n\nvar __htmlEscapeEntities = function ( d ) {\n\tif (Array.isArray(d)) {\n\t\td = d.join(',');\n\t}\n\n\treturn typeof d === 'string' ?\n\t\td\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;') :\n\t\td;\n};\n\n// Common logic for moment, luxon or a date action\nfunction __mld( dt, momentFn, luxonFn, dateFn, arg1 ) {\n\tif (window.moment) {\n\t\treturn dt[momentFn]( arg1 );\n\t}\n\telse if (window.luxon) {\n\t\treturn dt[luxonFn]( arg1 );\n\t}\n\t\n\treturn dateFn ? dt[dateFn]( arg1 ) : dt;\n}\n\n\nvar __mlWarning = false;\nfunction __mldObj (d, format, locale) {\n\tvar dt;\n\n\tif (window.moment) {\n\t\tdt = window.moment.utc( d, format, locale, true );\n\n\t\tif (! dt.isValid()) {\n\t\t\treturn null;\n\t\t}\n\t}\n\telse if (window.luxon) {\n\t\tdt = format && typeof d === 'string'\n\t\t\t? window.luxon.DateTime.fromFormat( d, format )\n\t\t\t: window.luxon.DateTime.fromISO( d );\n\n\t\tif (! dt.isValid) {\n\t\t\treturn null;\n\t\t}\n\n\t\tdt.setLocale(locale);\n\t}\n\telse if (! format) {\n\t\t// No format given, must be ISO\n\t\tdt = new Date(d);\n\t}\n\telse {\n\t\tif (! __mlWarning) {\n\t\t\talert('DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17');\n\t\t}\n\n\t\t__mlWarning = true;\n\t}\n\n\treturn dt;\n}\n\n// Wrapper for date, datetime and time which all operate the same way with the exception of\n// the output string for auto locale support\nfunction __mlHelper (localeString) {\n\treturn function ( from, to, locale, def ) {\n\t\t// Luxon and Moment support\n\t\t// Argument shifting\n\t\tif ( arguments.length === 0 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = null; // means toLocaleString\n\t\t\tfrom = null; // means iso8601\n\t\t}\n\t\telse if ( arguments.length === 1 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\t\telse if ( arguments.length === 2 ) {\n\t\t\tlocale = to;\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\n\t\tvar typeName = 'datetime-' + to;\n\n\t\t// Add type detection and sorting specific to this date format - we need to be able to identify\n\t\t// date type columns as such, rather than as numbers in extensions. Hence the need for this.\n\t\tif (! DataTable.ext.type.order[typeName]) {\n\t\t\t// The renderer will give the value to type detect as the type!\n\t\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\t\treturn d === typeName ? typeName : false;\n\t\t\t});\n\n\t\t\t// The renderer gives us Moment, Luxon or Date obects for the sorting, all of which have a\n\t\t\t// `valueOf` which gives milliseconds epoch\n\t\t\tDataTable.ext.type.order[typeName + '-asc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x < y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\n\t\t\tDataTable.ext.type.order[typeName + '-desc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x > y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\t\t}\n\t\n\t\treturn function ( d, type ) {\n\t\t\t// Allow for a default value\n\t\t\tif (d === null || d === undefined) {\n\t\t\t\tif (def === '--now') {\n\t\t\t\t\t// We treat everything as UTC further down, so no changes are\n\t\t\t\t\t// made, as such need to get the local date / time as if it were\n\t\t\t\t\t// UTC\n\t\t\t\t\tvar local = new Date();\n\t\t\t\t\td = new Date( Date.UTC(\n\t\t\t\t\t\tlocal.getFullYear(), local.getMonth(), local.getDate(),\n\t\t\t\t\t\tlocal.getHours(), local.getMinutes(), local.getSeconds()\n\t\t\t\t\t) );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td = '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === 'type') {\n\t\t\t\t// Typing uses the type name for fast matching\n\t\t\t\treturn typeName;\n\t\t\t}\n\n\t\t\tif (d === '') {\n\t\t\t\treturn type !== 'sort'\n\t\t\t\t\t? ''\n\t\t\t\t\t: __mldObj('0000-01-01 00:00:00', null, locale);\n\t\t\t}\n\n\t\t\t// Shortcut. If `from` and `to` are the same, we are using the renderer to\n\t\t\t// format for ordering, not display - its already in the display format.\n\t\t\tif ( to !== null && from === to && type !== 'sort' && type !== 'type' && ! (d instanceof Date) ) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tvar dt = __mldObj(d, from, locale);\n\n\t\t\tif (dt === null) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tif (type === 'sort') {\n\t\t\t\treturn dt;\n\t\t\t}\n\t\t\t\n\t\t\tvar formatted = to === null\n\t\t\t\t? __mld(dt, 'toDate', 'toJSDate', '')[localeString]()\n\t\t\t\t: __mld(dt, 'format', 'toFormat', 'toISOString', to);\n\n\t\t\t// XSS protection\n\t\t\treturn type === 'display' ?\n\t\t\t\t__htmlEscapeEntities( formatted ) :\n\t\t\t\tformatted;\n\t\t};\n\t}\n}\n\n// Based on locale, determine standard number formatting\n// Fallback for legacy browsers is US English\nvar __thousands = ',';\nvar __decimal = '.';\n\nif (window.Intl !== undefined) {\n\ttry {\n\t\tvar num = new Intl.NumberFormat().formatToParts(100000.1);\n\t\n\t\tfor (var i=0 ; i<num.length ; i++) {\n\t\t\tif (num[i].type === 'group') {\n\t\t\t\t__thousands = num[i].value;\n\t\t\t}\n\t\t\telse if (num[i].type === 'decimal') {\n\t\t\t\t__decimal = num[i].value;\n\t\t\t}\n\t\t}\n\t}\n\tcatch (e) {\n\t\t// noop\n\t}\n}\n\n// Formatted date time detection - use by declaring the formats you are going to use\nDataTable.datetime = function ( format, locale ) {\n\tvar typeName = 'datetime-detect-' + format;\n\n\tif (! locale) {\n\t\tlocale = 'en';\n\t}\n\n\tif (! DataTable.ext.type.order[typeName]) {\n\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\tvar dt = __mldObj(d, format, locale);\n\t\t\treturn d === '' || dt ? typeName : false;\n\t\t});\n\n\t\tDataTable.ext.type.order[typeName + '-pre'] = function (d) {\n\t\t\treturn __mldObj(d, format, locale) || 0;\n\t\t}\n\t}\n}\n\n/**\n * Helpers for `columns.render`.\n *\n * The options defined here can be used with the `columns.render` initialisation\n * option to provide a display renderer. The following functions are defined:\n *\n * * `number` - Will format numeric data (defined by `columns.data`) for\n *   display, retaining the original unformatted data for sorting and filtering.\n *   It takes 5 parameters:\n *   * `string` - Thousands grouping separator\n *   * `string` - Decimal point indicator\n *   * `integer` - Number of decimal points to show\n *   * `string` (optional) - Prefix.\n *   * `string` (optional) - Postfix (/suffix).\n * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n *   parameters.\n *\n * @example\n *   // Column definition using the number renderer\n *   {\n *     data: \"salary\",\n *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n *   }\n *\n * @namespace\n */\nDataTable.render = {\n\tdate: __mlHelper('toLocaleDateString'),\n\tdatetime: __mlHelper('toLocaleString'),\n\ttime: __mlHelper('toLocaleTimeString'),\n\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t// Auto locale detection\n\t\tif (thousands === null || thousands === undefined) {\n\t\t\tthousands = __thousands;\n\t\t}\n\n\t\tif (decimal === null || decimal === undefined) {\n\t\t\tdecimal = __decimal;\n\t\t}\n\n\t\treturn {\n\t\t\tdisplay: function ( d ) {\n\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tif (d === '' || d === null) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\tvar flo = parseFloat( d );\n\n\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t// be a number after all)\n\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t}\n\n\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\td = Math.abs( flo );\n\n\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t'';\n\n\t\t\t\t// If zero, then can't have a negative prefix\n\t\t\t\tif (intPart === 0 && parseFloat(floatPart) === 0) {\n\t\t\t\t\tnegative = '';\n\t\t\t\t}\n\n\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t) +\n\t\t\t\t\tfloatPart +\n\t\t\t\t\t(postfix||'');\n\t\t\t}\n\t\t};\n\t},\n\n\ttext: function () {\n\t\treturn {\n\t\t\tdisplay: __htmlEscapeEntities,\n\t\t\tfilter: __htmlEscapeEntities\n\t\t};\n\t}\n};\n\n\n/*\n * This is really a good bit rubbish this method of exposing the internal methods\n * publicly... - To be fixed in 2.0 using methods on the prototype\n */\n\n\n/**\n * Create a wrapper function for exporting an internal functions to an external API.\n *  @param {string} fn API function name\n *  @returns {function} wrapped function\n *  @memberof DataTable#internal\n */\nfunction _fnExternApiFunc (fn)\n{\n\treturn function() {\n\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\tArray.prototype.slice.call(arguments)\n\t\t);\n\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t};\n}\n\n\n/**\n * Reference to internal functions for use by plug-in developers. Note that\n * these methods are references to internal functions and are considered to be\n * private. If you use these methods, be aware that they are liable to change\n * between versions.\n *  @namespace\n */\n$.extend( DataTable.ext.internal, {\n\t_fnExternApiFunc: _fnExternApiFunc,\n\t_fnBuildAjax: _fnBuildAjax,\n\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t_fnAjaxParameters: _fnAjaxParameters,\n\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t_fnAddColumn: _fnAddColumn,\n\t_fnColumnOptions: _fnColumnOptions,\n\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t_fnVisbleColumns: _fnVisbleColumns,\n\t_fnGetColumns: _fnGetColumns,\n\t_fnColumnTypes: _fnColumnTypes,\n\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t_fnHungarianMap: _fnHungarianMap,\n\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t_fnLanguageCompat: _fnLanguageCompat,\n\t_fnBrowserDetect: _fnBrowserDetect,\n\t_fnAddData: _fnAddData,\n\t_fnAddTr: _fnAddTr,\n\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t_fnGetCellData: _fnGetCellData,\n\t_fnSetCellData: _fnSetCellData,\n\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t_fnGetDataMaster: _fnGetDataMaster,\n\t_fnClearTable: _fnClearTable,\n\t_fnDeleteIndex: _fnDeleteIndex,\n\t_fnInvalidate: _fnInvalidate,\n\t_fnGetRowElements: _fnGetRowElements,\n\t_fnCreateTr: _fnCreateTr,\n\t_fnBuildHead: _fnBuildHead,\n\t_fnDrawHead: _fnDrawHead,\n\t_fnDraw: _fnDraw,\n\t_fnReDraw: _fnReDraw,\n\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t_fnDetectHeader: _fnDetectHeader,\n\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t_fnFilterComplete: _fnFilterComplete,\n\t_fnFilterCustom: _fnFilterCustom,\n\t_fnFilterColumn: _fnFilterColumn,\n\t_fnFilter: _fnFilter,\n\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t_fnEscapeRegex: _fnEscapeRegex,\n\t_fnFilterData: _fnFilterData,\n\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t_fnUpdateInfo: _fnUpdateInfo,\n\t_fnInfoMacros: _fnInfoMacros,\n\t_fnInitialise: _fnInitialise,\n\t_fnInitComplete: _fnInitComplete,\n\t_fnLengthChange: _fnLengthChange,\n\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t_fnPageChange: _fnPageChange,\n\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t_fnScrollDraw: _fnScrollDraw,\n\t_fnApplyToChildren: _fnApplyToChildren,\n\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t_fnThrottle: _fnThrottle,\n\t_fnConvertToWidth: _fnConvertToWidth,\n\t_fnGetWidestNode: _fnGetWidestNode,\n\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t_fnStringToCss: _fnStringToCss,\n\t_fnSortFlatten: _fnSortFlatten,\n\t_fnSort: _fnSort,\n\t_fnSortAria: _fnSortAria,\n\t_fnSortListener: _fnSortListener,\n\t_fnSortAttachListener: _fnSortAttachListener,\n\t_fnSortingClasses: _fnSortingClasses,\n\t_fnSortData: _fnSortData,\n\t_fnSaveState: _fnSaveState,\n\t_fnLoadState: _fnLoadState,\n\t_fnImplementState: _fnImplementState,\n\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t_fnLog: _fnLog,\n\t_fnMap: _fnMap,\n\t_fnBindAction: _fnBindAction,\n\t_fnCallbackReg: _fnCallbackReg,\n\t_fnCallbackFire: _fnCallbackFire,\n\t_fnLengthOverflow: _fnLengthOverflow,\n\t_fnRenderer: _fnRenderer,\n\t_fnDataSource: _fnDataSource,\n\t_fnRowAttributes: _fnRowAttributes,\n\t_fnExtend: _fnExtend,\n\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t                                // in 1.10, so this dead-end function is\n\t                                // added to prevent errors\n} );\n\n\n// jQuery access\n$.fn.dataTable = DataTable;\n\n// Provide access to the host jQuery object (circular reference)\nDataTable.$ = $;\n\n// Legacy aliases\n$.fn.dataTableSettings = DataTable.settings;\n$.fn.dataTableExt = DataTable.ext;\n\n// With a capital `D` we return a DataTables API instance rather than a\n// jQuery object\n$.fn.DataTable = function ( opts ) {\n\treturn $(this).dataTable( opts ).api();\n};\n\n// All properties that are available to $.fn.dataTable should also be\n// available on $.fn.DataTable\n$.each( DataTable, function ( prop, val ) {\n\t$.fn.DataTable[ prop ] = val;\n} );\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (DataTable);\n\n\n//# sourceURL=webpack://rup/./node_modules/datatables.net/js/jquery.dataTables.mjs?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars.js":
/*!********************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _handlebarsRuntime = __webpack_require__(/*! ./handlebars.runtime */ \"./node_modules/handlebars/dist/cjs/handlebars.runtime.js\");\n\nvar _handlebarsRuntime2 = _interopRequireDefault(_handlebarsRuntime); // Compiler imports\n\n\nvar _handlebarsCompilerAst = __webpack_require__(/*! ./handlebars/compiler/ast */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js\");\n\nvar _handlebarsCompilerAst2 = _interopRequireDefault(_handlebarsCompilerAst);\n\nvar _handlebarsCompilerBase = __webpack_require__(/*! ./handlebars/compiler/base */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/base.js\");\n\nvar _handlebarsCompilerCompiler = __webpack_require__(/*! ./handlebars/compiler/compiler */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js\");\n\nvar _handlebarsCompilerJavascriptCompiler = __webpack_require__(/*! ./handlebars/compiler/javascript-compiler */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js\");\n\nvar _handlebarsCompilerJavascriptCompiler2 = _interopRequireDefault(_handlebarsCompilerJavascriptCompiler);\n\nvar _handlebarsCompilerVisitor = __webpack_require__(/*! ./handlebars/compiler/visitor */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js\");\n\nvar _handlebarsCompilerVisitor2 = _interopRequireDefault(_handlebarsCompilerVisitor);\n\nvar _handlebarsNoConflict = __webpack_require__(/*! ./handlebars/no-conflict */ \"./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js\");\n\nvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);\n\nvar _create = _handlebarsRuntime2['default'].create;\n\nfunction create() {\n  var hb = _create();\n\n  hb.compile = function (input, options) {\n    return _handlebarsCompilerCompiler.compile(input, options, hb);\n  };\n\n  hb.precompile = function (input, options) {\n    return _handlebarsCompilerCompiler.precompile(input, options, hb);\n  };\n\n  hb.AST = _handlebarsCompilerAst2['default'];\n  hb.Compiler = _handlebarsCompilerCompiler.Compiler;\n  hb.JavaScriptCompiler = _handlebarsCompilerJavascriptCompiler2['default'];\n  hb.Parser = _handlebarsCompilerBase.parser;\n  hb.parse = _handlebarsCompilerBase.parse;\n  hb.parseWithoutProcessing = _handlebarsCompilerBase.parseWithoutProcessing;\n  return hb;\n}\n\nvar inst = create();\ninst.create = create;\n\n_handlebarsNoConflict2['default'](inst);\n\ninst.Visitor = _handlebarsCompilerVisitor2['default'];\ninst['default'] = inst;\nexports['default'] = inst;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars.runtime.js":
/*!****************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars.runtime.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n} // istanbul ignore next\n\n\nfunction _interopRequireWildcard(obj) {\n  if (obj && obj.__esModule) {\n    return obj;\n  } else {\n    var newObj = {};\n\n    if (obj != null) {\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n      }\n    }\n\n    newObj['default'] = obj;\n    return newObj;\n  }\n}\n\nvar _handlebarsBase = __webpack_require__(/*! ./handlebars/base */ \"./node_modules/handlebars/dist/cjs/handlebars/base.js\");\n\nvar base = _interopRequireWildcard(_handlebarsBase); // Each of these augment the Handlebars object. No need to setup here.\n// (This is done to easily share code between commonjs and browse envs)\n\n\nvar _handlebarsSafeString = __webpack_require__(/*! ./handlebars/safe-string */ \"./node_modules/handlebars/dist/cjs/handlebars/safe-string.js\");\n\nvar _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);\n\nvar _handlebarsException = __webpack_require__(/*! ./handlebars/exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _handlebarsException2 = _interopRequireDefault(_handlebarsException);\n\nvar _handlebarsUtils = __webpack_require__(/*! ./handlebars/utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar Utils = _interopRequireWildcard(_handlebarsUtils);\n\nvar _handlebarsRuntime = __webpack_require__(/*! ./handlebars/runtime */ \"./node_modules/handlebars/dist/cjs/handlebars/runtime.js\");\n\nvar runtime = _interopRequireWildcard(_handlebarsRuntime);\n\nvar _handlebarsNoConflict = __webpack_require__(/*! ./handlebars/no-conflict */ \"./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js\");\n\nvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); // For compatibility and usage outside of module systems, make the Handlebars object a namespace\n\n\nfunction create() {\n  var hb = new base.HandlebarsEnvironment();\n  Utils.extend(hb, base);\n  hb.SafeString = _handlebarsSafeString2['default'];\n  hb.Exception = _handlebarsException2['default'];\n  hb.Utils = Utils;\n  hb.escapeExpression = Utils.escapeExpression;\n  hb.VM = runtime;\n\n  hb.template = function (spec) {\n    return runtime.template(spec, hb);\n  };\n\n  return hb;\n}\n\nvar inst = create();\ninst.create = create;\n\n_handlebarsNoConflict2['default'](inst);\n\ninst['default'] = inst;\nexports['default'] = inst;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars.runtime.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/base.js":
/*!*************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/base.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.HandlebarsEnvironment = HandlebarsEnvironment; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _utils = __webpack_require__(/*! ./utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar _exception = __webpack_require__(/*! ./exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _helpers = __webpack_require__(/*! ./helpers */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers.js\");\n\nvar _decorators = __webpack_require__(/*! ./decorators */ \"./node_modules/handlebars/dist/cjs/handlebars/decorators.js\");\n\nvar _logger = __webpack_require__(/*! ./logger */ \"./node_modules/handlebars/dist/cjs/handlebars/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _internalProtoAccess = __webpack_require__(/*! ./internal/proto-access */ \"./node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js\");\n\nvar VERSION = '4.7.7';\nexports.VERSION = VERSION;\nvar COMPILER_REVISION = 8;\nexports.COMPILER_REVISION = COMPILER_REVISION;\nvar LAST_COMPATIBLE_COMPILER_REVISION = 7;\nexports.LAST_COMPATIBLE_COMPILER_REVISION = LAST_COMPATIBLE_COMPILER_REVISION;\nvar REVISION_CHANGES = {\n  1: '<= 1.0.rc.2',\n  // 1.0.rc.2 is actually rev2 but doesn't report it\n  2: '== 1.0.0-rc.3',\n  3: '== 1.0.0-rc.4',\n  4: '== 1.x.x',\n  5: '== 2.0.0-alpha.x',\n  6: '>= 2.0.0-beta.1',\n  7: '>= 4.0.0 <4.3.0',\n  8: '>= 4.3.0'\n};\nexports.REVISION_CHANGES = REVISION_CHANGES;\nvar objectType = '[object Object]';\n\nfunction HandlebarsEnvironment(helpers, partials, decorators) {\n  this.helpers = helpers || {};\n  this.partials = partials || {};\n  this.decorators = decorators || {};\n\n  _helpers.registerDefaultHelpers(this);\n\n  _decorators.registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n  constructor: HandlebarsEnvironment,\n  logger: _logger2['default'],\n  log: _logger2['default'].log,\n  registerHelper: function registerHelper(name, fn) {\n    if (_utils.toString.call(name) === objectType) {\n      if (fn) {\n        throw new _exception2['default']('Arg not supported with multiple helpers');\n      }\n\n      _utils.extend(this.helpers, name);\n    } else {\n      this.helpers[name] = fn;\n    }\n  },\n  unregisterHelper: function unregisterHelper(name) {\n    delete this.helpers[name];\n  },\n  registerPartial: function registerPartial(name, partial) {\n    if (_utils.toString.call(name) === objectType) {\n      _utils.extend(this.partials, name);\n    } else {\n      if (typeof partial === 'undefined') {\n        throw new _exception2['default']('Attempting to register a partial called \"' + name + '\" as undefined');\n      }\n\n      this.partials[name] = partial;\n    }\n  },\n  unregisterPartial: function unregisterPartial(name) {\n    delete this.partials[name];\n  },\n  registerDecorator: function registerDecorator(name, fn) {\n    if (_utils.toString.call(name) === objectType) {\n      if (fn) {\n        throw new _exception2['default']('Arg not supported with multiple decorators');\n      }\n\n      _utils.extend(this.decorators, name);\n    } else {\n      this.decorators[name] = fn;\n    }\n  },\n  unregisterDecorator: function unregisterDecorator(name) {\n    delete this.decorators[name];\n  },\n\n  /**\n   * Reset the memory of illegal property accesses that have already been logged.\n   * @deprecated should only be used in handlebars test-cases\n   */\n  resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() {\n    _internalProtoAccess.resetLoggedProperties();\n  }\n};\nvar log = _logger2['default'].log;\nexports.log = log;\nexports.createFrame = _utils.createFrame;\nexports.logger = _logger2['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/base.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js":
/*!*********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nvar AST = {\n  // Public API used to evaluate derived attributes regarding AST nodes\n  helpers: {\n    // a mustache is definitely a helper if:\n    // * it is an eligible helper, and\n    // * it has at least one parameter or hash segment\n    helperExpression: function helperExpression(node) {\n      return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash);\n    },\n    scopedId: function scopedId(path) {\n      return /^\\.|this\\b/.test(path.original);\n    },\n    // an ID is simple if it only has one part, and that part is not\n    // `..` or `this`.\n    simpleId: function simpleId(path) {\n      return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth;\n    }\n  }\n}; // Must be exported as an object rather than the root of the module as the jison lexer\n// must modify the object to operate properly.\n\nexports['default'] = AST;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/base.js":
/*!**********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/base.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.parseWithoutProcessing = parseWithoutProcessing;\nexports.parse = parse; // istanbul ignore next\n\nfunction _interopRequireWildcard(obj) {\n  if (obj && obj.__esModule) {\n    return obj;\n  } else {\n    var newObj = {};\n\n    if (obj != null) {\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n      }\n    }\n\n    newObj['default'] = obj;\n    return newObj;\n  }\n} // istanbul ignore next\n\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _parser = __webpack_require__(/*! ./parser */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js\");\n\nvar _parser2 = _interopRequireDefault(_parser);\n\nvar _whitespaceControl = __webpack_require__(/*! ./whitespace-control */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js\");\n\nvar _whitespaceControl2 = _interopRequireDefault(_whitespaceControl);\n\nvar _helpers = __webpack_require__(/*! ./helpers */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js\");\n\nvar Helpers = _interopRequireWildcard(_helpers);\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nexports.parser = _parser2['default'];\nvar yy = {};\n\n_utils.extend(yy, Helpers);\n\nfunction parseWithoutProcessing(input, options) {\n  // Just return if an already-compiled AST was passed in.\n  if (input.type === 'Program') {\n    return input;\n  }\n\n  _parser2['default'].yy = yy; // Altering the shared object here, but this is ok as parser is a sync operation\n\n  yy.locInfo = function (locInfo) {\n    return new yy.SourceLocation(options && options.srcName, locInfo);\n  };\n\n  var ast = _parser2['default'].parse(input);\n\n  return ast;\n}\n\nfunction parse(input, options) {\n  var ast = parseWithoutProcessing(input, options);\n  var strip = new _whitespaceControl2['default'](options);\n  return strip.accept(ast);\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/base.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js":
/*!**************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("/* global define */\n\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar SourceNode = undefined;\n\ntry {\n  /* istanbul ignore next */\n  if (false) { var SourceMap; }\n} catch (err) {}\n/* NOP */\n\n/* istanbul ignore if: tested but not covered in istanbul due to dist build  */\n\n\nif (!SourceNode) {\n  SourceNode = function SourceNode(line, column, srcFile, chunks) {\n    this.src = '';\n\n    if (chunks) {\n      this.add(chunks);\n    }\n  };\n  /* istanbul ignore next */\n\n\n  SourceNode.prototype = {\n    add: function add(chunks) {\n      if (_utils.isArray(chunks)) {\n        chunks = chunks.join('');\n      }\n\n      this.src += chunks;\n    },\n    prepend: function prepend(chunks) {\n      if (_utils.isArray(chunks)) {\n        chunks = chunks.join('');\n      }\n\n      this.src = chunks + this.src;\n    },\n    toStringWithSourceMap: function toStringWithSourceMap() {\n      return {\n        code: this.toString()\n      };\n    },\n    toString: function toString() {\n      return this.src;\n    }\n  };\n}\n\nfunction castChunk(chunk, codeGen, loc) {\n  if (_utils.isArray(chunk)) {\n    var ret = [];\n\n    for (var i = 0, len = chunk.length; i < len; i++) {\n      ret.push(codeGen.wrap(chunk[i], loc));\n    }\n\n    return ret;\n  } else if (typeof chunk === 'boolean' || typeof chunk === 'number') {\n    // Handle primitives that the SourceNode will throw up on\n    return chunk + '';\n  }\n\n  return chunk;\n}\n\nfunction CodeGen(srcFile) {\n  this.srcFile = srcFile;\n  this.source = [];\n}\n\nCodeGen.prototype = {\n  isEmpty: function isEmpty() {\n    return !this.source.length;\n  },\n  prepend: function prepend(source, loc) {\n    this.source.unshift(this.wrap(source, loc));\n  },\n  push: function push(source, loc) {\n    this.source.push(this.wrap(source, loc));\n  },\n  merge: function merge() {\n    var source = this.empty();\n    this.each(function (line) {\n      source.add(['  ', line, '\\n']);\n    });\n    return source;\n  },\n  each: function each(iter) {\n    for (var i = 0, len = this.source.length; i < len; i++) {\n      iter(this.source[i]);\n    }\n  },\n  empty: function empty() {\n    var loc = this.currentLocation || {\n      start: {}\n    };\n    return new SourceNode(loc.start.line, loc.start.column, this.srcFile);\n  },\n  wrap: function wrap(chunk) {\n    var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || {\n      start: {}\n    } : arguments[1];\n\n    if (chunk instanceof SourceNode) {\n      return chunk;\n    }\n\n    chunk = castChunk(chunk, this, loc);\n    return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk);\n  },\n  functionCall: function functionCall(fn, type, params) {\n    params = this.generateList(params);\n    return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']);\n  },\n  quotedString: function quotedString(str) {\n    return '\"' + (str + '').replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\u2028/g, \"\\\\u2028\") // Per Ecma-262 7.3 + 7.8.4\n    .replace(/\\u2029/g, \"\\\\u2029\") + '\"';\n  },\n  objectLiteral: function objectLiteral(obj) {\n    // istanbul ignore next\n    var _this = this;\n\n    var pairs = [];\n    Object.keys(obj).forEach(function (key) {\n      var value = castChunk(obj[key], _this);\n\n      if (value !== 'undefined') {\n        pairs.push([_this.quotedString(key), ':', value]);\n      }\n    });\n    var ret = this.generateList(pairs);\n    ret.prepend('{');\n    ret.add('}');\n    return ret;\n  },\n  generateList: function generateList(entries) {\n    var ret = this.empty();\n\n    for (var i = 0, len = entries.length; i < len; i++) {\n      if (i) {\n        ret.add(',');\n      }\n\n      ret.add(castChunk(entries[i], this));\n    }\n\n    return ret;\n  },\n  generateArray: function generateArray(entries) {\n    var ret = this.generateList(entries);\n    ret.prepend('[');\n    ret.add(']');\n    return ret;\n  }\n};\nexports['default'] = CodeGen;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js":
/*!**************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("/* eslint-disable new-cap */\n\n\nexports.__esModule = true;\nexports.Compiler = Compiler;\nexports.precompile = precompile;\nexports.compile = compile; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar _ast = __webpack_require__(/*! ./ast */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js\");\n\nvar _ast2 = _interopRequireDefault(_ast);\n\nvar slice = [].slice;\n\nfunction Compiler() {} // the foundHelper register will disambiguate helper lookup from finding a\n// function in a context. This is necessary for mustache compatibility, which\n// requires that context functions in blocks are evaluated by blockHelperMissing,\n// and then proceed as if the resulting value was provided to blockHelperMissing.\n\n\nCompiler.prototype = {\n  compiler: Compiler,\n  equals: function equals(other) {\n    var len = this.opcodes.length;\n\n    if (other.opcodes.length !== len) {\n      return false;\n    }\n\n    for (var i = 0; i < len; i++) {\n      var opcode = this.opcodes[i],\n          otherOpcode = other.opcodes[i];\n\n      if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {\n        return false;\n      }\n    } // We know that length is the same between the two arrays because they are directly tied\n    // to the opcode behavior above.\n\n\n    len = this.children.length;\n\n    for (var i = 0; i < len; i++) {\n      if (!this.children[i].equals(other.children[i])) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n  guid: 0,\n  compile: function compile(program, options) {\n    this.sourceNode = [];\n    this.opcodes = [];\n    this.children = [];\n    this.options = options;\n    this.stringParams = options.stringParams;\n    this.trackIds = options.trackIds;\n    options.blockParams = options.blockParams || [];\n    options.knownHelpers = _utils.extend(Object.create(null), {\n      helperMissing: true,\n      blockHelperMissing: true,\n      each: true,\n      'if': true,\n      unless: true,\n      'with': true,\n      log: true,\n      lookup: true\n    }, options.knownHelpers);\n    return this.accept(program);\n  },\n  compileProgram: function compileProgram(program) {\n    var childCompiler = new this.compiler(),\n        // eslint-disable-line new-cap\n    result = childCompiler.compile(program, this.options),\n        guid = this.guid++;\n    this.usePartial = this.usePartial || result.usePartial;\n    this.children[guid] = result;\n    this.useDepths = this.useDepths || result.useDepths;\n    return guid;\n  },\n  accept: function accept(node) {\n    /* istanbul ignore next: Sanity code */\n    if (!this[node.type]) {\n      throw new _exception2['default']('Unknown type: ' + node.type, node);\n    }\n\n    this.sourceNode.unshift(node);\n    var ret = this[node.type](node);\n    this.sourceNode.shift();\n    return ret;\n  },\n  Program: function Program(program) {\n    this.options.blockParams.unshift(program.blockParams);\n    var body = program.body,\n        bodyLength = body.length;\n\n    for (var i = 0; i < bodyLength; i++) {\n      this.accept(body[i]);\n    }\n\n    this.options.blockParams.shift();\n    this.isSimple = bodyLength === 1;\n    this.blockParams = program.blockParams ? program.blockParams.length : 0;\n    return this;\n  },\n  BlockStatement: function BlockStatement(block) {\n    transformLiteralToPath(block);\n    var program = block.program,\n        inverse = block.inverse;\n    program = program && this.compileProgram(program);\n    inverse = inverse && this.compileProgram(inverse);\n    var type = this.classifySexpr(block);\n\n    if (type === 'helper') {\n      this.helperSexpr(block, program, inverse);\n    } else if (type === 'simple') {\n      this.simpleSexpr(block); // now that the simple mustache is resolved, we need to\n      // evaluate it by executing `blockHelperMissing`\n\n      this.opcode('pushProgram', program);\n      this.opcode('pushProgram', inverse);\n      this.opcode('emptyHash');\n      this.opcode('blockValue', block.path.original);\n    } else {\n      this.ambiguousSexpr(block, program, inverse); // now that the simple mustache is resolved, we need to\n      // evaluate it by executing `blockHelperMissing`\n\n      this.opcode('pushProgram', program);\n      this.opcode('pushProgram', inverse);\n      this.opcode('emptyHash');\n      this.opcode('ambiguousBlockValue');\n    }\n\n    this.opcode('append');\n  },\n  DecoratorBlock: function DecoratorBlock(decorator) {\n    var program = decorator.program && this.compileProgram(decorator.program);\n    var params = this.setupFullMustacheParams(decorator, program, undefined),\n        path = decorator.path;\n    this.useDecorators = true;\n    this.opcode('registerDecorator', params.length, path.original);\n  },\n  PartialStatement: function PartialStatement(partial) {\n    this.usePartial = true;\n    var program = partial.program;\n\n    if (program) {\n      program = this.compileProgram(partial.program);\n    }\n\n    var params = partial.params;\n\n    if (params.length > 1) {\n      throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial);\n    } else if (!params.length) {\n      if (this.options.explicitPartialContext) {\n        this.opcode('pushLiteral', 'undefined');\n      } else {\n        params.push({\n          type: 'PathExpression',\n          parts: [],\n          depth: 0\n        });\n      }\n    }\n\n    var partialName = partial.name.original,\n        isDynamic = partial.name.type === 'SubExpression';\n\n    if (isDynamic) {\n      this.accept(partial.name);\n    }\n\n    this.setupFullMustacheParams(partial, program, undefined, true);\n    var indent = partial.indent || '';\n\n    if (this.options.preventIndent && indent) {\n      this.opcode('appendContent', indent);\n      indent = '';\n    }\n\n    this.opcode('invokePartial', isDynamic, partialName, indent);\n    this.opcode('append');\n  },\n  PartialBlockStatement: function PartialBlockStatement(partialBlock) {\n    this.PartialStatement(partialBlock);\n  },\n  MustacheStatement: function MustacheStatement(mustache) {\n    this.SubExpression(mustache);\n\n    if (mustache.escaped && !this.options.noEscape) {\n      this.opcode('appendEscaped');\n    } else {\n      this.opcode('append');\n    }\n  },\n  Decorator: function Decorator(decorator) {\n    this.DecoratorBlock(decorator);\n  },\n  ContentStatement: function ContentStatement(content) {\n    if (content.value) {\n      this.opcode('appendContent', content.value);\n    }\n  },\n  CommentStatement: function CommentStatement() {},\n  SubExpression: function SubExpression(sexpr) {\n    transformLiteralToPath(sexpr);\n    var type = this.classifySexpr(sexpr);\n\n    if (type === 'simple') {\n      this.simpleSexpr(sexpr);\n    } else if (type === 'helper') {\n      this.helperSexpr(sexpr);\n    } else {\n      this.ambiguousSexpr(sexpr);\n    }\n  },\n  ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) {\n    var path = sexpr.path,\n        name = path.parts[0],\n        isBlock = program != null || inverse != null;\n    this.opcode('getContext', path.depth);\n    this.opcode('pushProgram', program);\n    this.opcode('pushProgram', inverse);\n    path.strict = true;\n    this.accept(path);\n    this.opcode('invokeAmbiguous', name, isBlock);\n  },\n  simpleSexpr: function simpleSexpr(sexpr) {\n    var path = sexpr.path;\n    path.strict = true;\n    this.accept(path);\n    this.opcode('resolvePossibleLambda');\n  },\n  helperSexpr: function helperSexpr(sexpr, program, inverse) {\n    var params = this.setupFullMustacheParams(sexpr, program, inverse),\n        path = sexpr.path,\n        name = path.parts[0];\n\n    if (this.options.knownHelpers[name]) {\n      this.opcode('invokeKnownHelper', params.length, name);\n    } else if (this.options.knownHelpersOnly) {\n      throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr);\n    } else {\n      path.strict = true;\n      path.falsy = true;\n      this.accept(path);\n      this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path));\n    }\n  },\n  PathExpression: function PathExpression(path) {\n    this.addDepth(path.depth);\n    this.opcode('getContext', path.depth);\n\n    var name = path.parts[0],\n        scoped = _ast2['default'].helpers.scopedId(path),\n        blockParamId = !path.depth && !scoped && this.blockParamIndex(name);\n\n    if (blockParamId) {\n      this.opcode('lookupBlockParam', blockParamId, path.parts);\n    } else if (!name) {\n      // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`\n      this.opcode('pushContext');\n    } else if (path.data) {\n      this.options.data = true;\n      this.opcode('lookupData', path.depth, path.parts, path.strict);\n    } else {\n      this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped);\n    }\n  },\n  StringLiteral: function StringLiteral(string) {\n    this.opcode('pushString', string.value);\n  },\n  NumberLiteral: function NumberLiteral(number) {\n    this.opcode('pushLiteral', number.value);\n  },\n  BooleanLiteral: function BooleanLiteral(bool) {\n    this.opcode('pushLiteral', bool.value);\n  },\n  UndefinedLiteral: function UndefinedLiteral() {\n    this.opcode('pushLiteral', 'undefined');\n  },\n  NullLiteral: function NullLiteral() {\n    this.opcode('pushLiteral', 'null');\n  },\n  Hash: function Hash(hash) {\n    var pairs = hash.pairs,\n        i = 0,\n        l = pairs.length;\n    this.opcode('pushHash');\n\n    for (; i < l; i++) {\n      this.pushParam(pairs[i].value);\n    }\n\n    while (i--) {\n      this.opcode('assignToHash', pairs[i].key);\n    }\n\n    this.opcode('popHash');\n  },\n  // HELPERS\n  opcode: function opcode(name) {\n    this.opcodes.push({\n      opcode: name,\n      args: slice.call(arguments, 1),\n      loc: this.sourceNode[0].loc\n    });\n  },\n  addDepth: function addDepth(depth) {\n    if (!depth) {\n      return;\n    }\n\n    this.useDepths = true;\n  },\n  classifySexpr: function classifySexpr(sexpr) {\n    var isSimple = _ast2['default'].helpers.simpleId(sexpr.path);\n\n    var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); // a mustache is an eligible helper if:\n    // * its id is simple (a single part, not `this` or `..`)\n\n    var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr); // if a mustache is an eligible helper but not a definite\n    // helper, it is ambiguous, and will be resolved in a later\n    // pass or at runtime.\n\n\n    var isEligible = !isBlockParam && (isHelper || isSimple); // if ambiguous, we can possibly resolve the ambiguity now\n    // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.\n\n    if (isEligible && !isHelper) {\n      var _name = sexpr.path.parts[0],\n          options = this.options;\n\n      if (options.knownHelpers[_name]) {\n        isHelper = true;\n      } else if (options.knownHelpersOnly) {\n        isEligible = false;\n      }\n    }\n\n    if (isHelper) {\n      return 'helper';\n    } else if (isEligible) {\n      return 'ambiguous';\n    } else {\n      return 'simple';\n    }\n  },\n  pushParams: function pushParams(params) {\n    for (var i = 0, l = params.length; i < l; i++) {\n      this.pushParam(params[i]);\n    }\n  },\n  pushParam: function pushParam(val) {\n    var value = val.value != null ? val.value : val.original || '';\n\n    if (this.stringParams) {\n      if (value.replace) {\n        value = value.replace(/^(\\.?\\.\\/)*/g, '').replace(/\\//g, '.');\n      }\n\n      if (val.depth) {\n        this.addDepth(val.depth);\n      }\n\n      this.opcode('getContext', val.depth || 0);\n      this.opcode('pushStringParam', value, val.type);\n\n      if (val.type === 'SubExpression') {\n        // SubExpressions get evaluated and passed in\n        // in string params mode.\n        this.accept(val);\n      }\n    } else {\n      if (this.trackIds) {\n        var blockParamIndex = undefined;\n\n        if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) {\n          blockParamIndex = this.blockParamIndex(val.parts[0]);\n        }\n\n        if (blockParamIndex) {\n          var blockParamChild = val.parts.slice(1).join('.');\n          this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild);\n        } else {\n          value = val.original || value;\n\n          if (value.replace) {\n            value = value.replace(/^this(?:\\.|$)/, '').replace(/^\\.\\//, '').replace(/^\\.$/, '');\n          }\n\n          this.opcode('pushId', val.type, value);\n        }\n      }\n\n      this.accept(val);\n    }\n  },\n  setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) {\n    var params = sexpr.params;\n    this.pushParams(params);\n    this.opcode('pushProgram', program);\n    this.opcode('pushProgram', inverse);\n\n    if (sexpr.hash) {\n      this.accept(sexpr.hash);\n    } else {\n      this.opcode('emptyHash', omitEmpty);\n    }\n\n    return params;\n  },\n  blockParamIndex: function blockParamIndex(name) {\n    for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) {\n      var blockParams = this.options.blockParams[depth],\n          param = blockParams && _utils.indexOf(blockParams, name);\n\n      if (blockParams && param >= 0) {\n        return [depth, param];\n      }\n    }\n  }\n};\n\nfunction precompile(input, options, env) {\n  if (input == null || typeof input !== 'string' && input.type !== 'Program') {\n    throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input);\n  }\n\n  options = options || {};\n\n  if (!('data' in options)) {\n    options.data = true;\n  }\n\n  if (options.compat) {\n    options.useDepths = true;\n  }\n\n  var ast = env.parse(input, options),\n      environment = new env.Compiler().compile(ast, options);\n  return new env.JavaScriptCompiler().compile(environment, options);\n}\n\nfunction compile(input, options, env) {\n  if (options === undefined) options = {};\n\n  if (input == null || typeof input !== 'string' && input.type !== 'Program') {\n    throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);\n  }\n\n  options = _utils.extend({}, options);\n\n  if (!('data' in options)) {\n    options.data = true;\n  }\n\n  if (options.compat) {\n    options.useDepths = true;\n  }\n\n  var compiled = undefined;\n\n  function compileInput() {\n    var ast = env.parse(input, options),\n        environment = new env.Compiler().compile(ast, options),\n        templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);\n    return env.template(templateSpec);\n  } // Template is only compiled on first use and cached after that point.\n\n\n  function ret(context, execOptions) {\n    if (!compiled) {\n      compiled = compileInput();\n    }\n\n    return compiled.call(this, context, execOptions);\n  }\n\n  ret._setup = function (setupOptions) {\n    if (!compiled) {\n      compiled = compileInput();\n    }\n\n    return compiled._setup(setupOptions);\n  };\n\n  ret._child = function (i, data, blockParams, depths) {\n    if (!compiled) {\n      compiled = compileInput();\n    }\n\n    return compiled._child(i, data, blockParams, depths);\n  };\n\n  return ret;\n}\n\nfunction argEquals(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) {\n    for (var i = 0; i < a.length; i++) {\n      if (!argEquals(a[i], b[i])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n\nfunction transformLiteralToPath(sexpr) {\n  if (!sexpr.path.parts) {\n    var literal = sexpr.path; // Casting to string here to make false and 0 literal values play nicely with the rest\n    // of the system.\n\n    sexpr.path = {\n      type: 'PathExpression',\n      data: false,\n      depth: 0,\n      parts: [literal.original + ''],\n      original: literal.original + '',\n      loc: literal.loc\n    };\n  }\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js":
/*!*************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.SourceLocation = SourceLocation;\nexports.id = id;\nexports.stripFlags = stripFlags;\nexports.stripComment = stripComment;\nexports.preparePath = preparePath;\nexports.prepareMustache = prepareMustache;\nexports.prepareRawBlock = prepareRawBlock;\nexports.prepareBlock = prepareBlock;\nexports.prepareProgram = prepareProgram;\nexports.preparePartialBlock = preparePartialBlock; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nfunction validateClose(open, close) {\n  close = close.path ? close.path.original : close;\n\n  if (open.path.original !== close) {\n    var errorNode = {\n      loc: open.path.loc\n    };\n    throw new _exception2['default'](open.path.original + \" doesn't match \" + close, errorNode);\n  }\n}\n\nfunction SourceLocation(source, locInfo) {\n  this.source = source;\n  this.start = {\n    line: locInfo.first_line,\n    column: locInfo.first_column\n  };\n  this.end = {\n    line: locInfo.last_line,\n    column: locInfo.last_column\n  };\n}\n\nfunction id(token) {\n  if (/^\\[.*\\]$/.test(token)) {\n    return token.substring(1, token.length - 1);\n  } else {\n    return token;\n  }\n}\n\nfunction stripFlags(open, close) {\n  return {\n    open: open.charAt(2) === '~',\n    close: close.charAt(close.length - 3) === '~'\n  };\n}\n\nfunction stripComment(comment) {\n  return comment.replace(/^\\{\\{~?!-?-?/, '').replace(/-?-?~?\\}\\}$/, '');\n}\n\nfunction preparePath(data, parts, loc) {\n  loc = this.locInfo(loc);\n  var original = data ? '@' : '',\n      dig = [],\n      depth = 0;\n\n  for (var i = 0, l = parts.length; i < l; i++) {\n    var part = parts[i].part,\n        // If we have [] syntax then we do not treat path references as operators,\n    // i.e. foo.[this] resolves to approximately context.foo['this']\n    isLiteral = parts[i].original !== part;\n    original += (parts[i].separator || '') + part;\n\n    if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {\n      if (dig.length > 0) {\n        throw new _exception2['default']('Invalid path: ' + original, {\n          loc: loc\n        });\n      } else if (part === '..') {\n        depth++;\n      }\n    } else {\n      dig.push(part);\n    }\n  }\n\n  return {\n    type: 'PathExpression',\n    data: data,\n    depth: depth,\n    parts: dig,\n    original: original,\n    loc: loc\n  };\n}\n\nfunction prepareMustache(path, params, hash, open, strip, locInfo) {\n  // Must use charAt to support IE pre-10\n  var escapeFlag = open.charAt(3) || open.charAt(2),\n      escaped = escapeFlag !== '{' && escapeFlag !== '&';\n  var decorator = /\\*/.test(open);\n  return {\n    type: decorator ? 'Decorator' : 'MustacheStatement',\n    path: path,\n    params: params,\n    hash: hash,\n    escaped: escaped,\n    strip: strip,\n    loc: this.locInfo(locInfo)\n  };\n}\n\nfunction prepareRawBlock(openRawBlock, contents, close, locInfo) {\n  validateClose(openRawBlock, close);\n  locInfo = this.locInfo(locInfo);\n  var program = {\n    type: 'Program',\n    body: contents,\n    strip: {},\n    loc: locInfo\n  };\n  return {\n    type: 'BlockStatement',\n    path: openRawBlock.path,\n    params: openRawBlock.params,\n    hash: openRawBlock.hash,\n    program: program,\n    openStrip: {},\n    inverseStrip: {},\n    closeStrip: {},\n    loc: locInfo\n  };\n}\n\nfunction prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {\n  if (close && close.path) {\n    validateClose(openBlock, close);\n  }\n\n  var decorator = /\\*/.test(openBlock.open);\n  program.blockParams = openBlock.blockParams;\n  var inverse = undefined,\n      inverseStrip = undefined;\n\n  if (inverseAndProgram) {\n    if (decorator) {\n      throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram);\n    }\n\n    if (inverseAndProgram.chain) {\n      inverseAndProgram.program.body[0].closeStrip = close.strip;\n    }\n\n    inverseStrip = inverseAndProgram.strip;\n    inverse = inverseAndProgram.program;\n  }\n\n  if (inverted) {\n    inverted = inverse;\n    inverse = program;\n    program = inverted;\n  }\n\n  return {\n    type: decorator ? 'DecoratorBlock' : 'BlockStatement',\n    path: openBlock.path,\n    params: openBlock.params,\n    hash: openBlock.hash,\n    program: program,\n    inverse: inverse,\n    openStrip: openBlock.strip,\n    inverseStrip: inverseStrip,\n    closeStrip: close && close.strip,\n    loc: this.locInfo(locInfo)\n  };\n}\n\nfunction prepareProgram(statements, loc) {\n  if (!loc && statements.length) {\n    var firstLoc = statements[0].loc,\n        lastLoc = statements[statements.length - 1].loc;\n    /* istanbul ignore else */\n\n    if (firstLoc && lastLoc) {\n      loc = {\n        source: firstLoc.source,\n        start: {\n          line: firstLoc.start.line,\n          column: firstLoc.start.column\n        },\n        end: {\n          line: lastLoc.end.line,\n          column: lastLoc.end.column\n        }\n      };\n    }\n  }\n\n  return {\n    type: 'Program',\n    body: statements,\n    strip: {},\n    loc: loc\n  };\n}\n\nfunction preparePartialBlock(open, program, close, locInfo) {\n  validateClose(open, close);\n  return {\n    type: 'PartialBlockStatement',\n    name: open.path,\n    params: open.params,\n    hash: open.hash,\n    program: program,\n    openStrip: open.strip,\n    closeStrip: close && close.strip,\n    loc: this.locInfo(locInfo)\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js":
/*!*************************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js ***!
  \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _base = __webpack_require__(/*! ../base */ \"./node_modules/handlebars/dist/cjs/handlebars/base.js\");\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar _codeGen = __webpack_require__(/*! ./code-gen */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js\");\n\nvar _codeGen2 = _interopRequireDefault(_codeGen);\n\nfunction Literal(value) {\n  this.value = value;\n}\n\nfunction JavaScriptCompiler() {}\n\nJavaScriptCompiler.prototype = {\n  // PUBLIC API: You can override these methods in a subclass to provide\n  // alternative compiled forms for name lookup and buffering semantics\n  nameLookup: function nameLookup(parent, name\n  /*,  type */\n  ) {\n    return this.internalNameLookup(parent, name);\n  },\n  depthedLookup: function depthedLookup(name) {\n    return [this.aliasable('container.lookup'), '(depths, ', JSON.stringify(name), ')'];\n  },\n  compilerInfo: function compilerInfo() {\n    var revision = _base.COMPILER_REVISION,\n        versions = _base.REVISION_CHANGES[revision];\n    return [revision, versions];\n  },\n  appendToBuffer: function appendToBuffer(source, location, explicit) {\n    // Force a source as this simplifies the merge logic.\n    if (!_utils.isArray(source)) {\n      source = [source];\n    }\n\n    source = this.source.wrap(source, location);\n\n    if (this.environment.isSimple) {\n      return ['return ', source, ';'];\n    } else if (explicit) {\n      // This is a case where the buffer operation occurs as a child of another\n      // construct, generally braces. We have to explicitly output these buffer\n      // operations to ensure that the emitted code goes in the correct location.\n      return ['buffer += ', source, ';'];\n    } else {\n      source.appendToBuffer = true;\n      return source;\n    }\n  },\n  initializeBuffer: function initializeBuffer() {\n    return this.quotedString('');\n  },\n  // END PUBLIC API\n  internalNameLookup: function internalNameLookup(parent, name) {\n    this.lookupPropertyFunctionIsUsed = true;\n    return ['lookupProperty(', parent, ',', JSON.stringify(name), ')'];\n  },\n  lookupPropertyFunctionIsUsed: false,\n  compile: function compile(environment, options, context, asObject) {\n    this.environment = environment;\n    this.options = options;\n    this.stringParams = this.options.stringParams;\n    this.trackIds = this.options.trackIds;\n    this.precompile = !asObject;\n    this.name = this.environment.name;\n    this.isChild = !!context;\n    this.context = context || {\n      decorators: [],\n      programs: [],\n      environments: []\n    };\n    this.preamble();\n    this.stackSlot = 0;\n    this.stackVars = [];\n    this.aliases = {};\n    this.registers = {\n      list: []\n    };\n    this.hashes = [];\n    this.compileStack = [];\n    this.inlineStack = [];\n    this.blockParams = [];\n    this.compileChildren(environment, options);\n    this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat;\n    this.useBlockParams = this.useBlockParams || environment.useBlockParams;\n    var opcodes = environment.opcodes,\n        opcode = undefined,\n        firstLoc = undefined,\n        i = undefined,\n        l = undefined;\n\n    for (i = 0, l = opcodes.length; i < l; i++) {\n      opcode = opcodes[i];\n      this.source.currentLocation = opcode.loc;\n      firstLoc = firstLoc || opcode.loc;\n      this[opcode.opcode].apply(this, opcode.args);\n    } // Flush any trailing content that might be pending.\n\n\n    this.source.currentLocation = firstLoc;\n    this.pushSource('');\n    /* istanbul ignore next */\n\n    if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {\n      throw new _exception2['default']('Compile completed with content left on stack');\n    }\n\n    if (!this.decorators.isEmpty()) {\n      this.useDecorators = true;\n      this.decorators.prepend(['var decorators = container.decorators, ', this.lookupPropertyFunctionVarDeclaration(), ';\\n']);\n      this.decorators.push('return fn;');\n\n      if (asObject) {\n        this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]);\n      } else {\n        this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\\n');\n        this.decorators.push('}\\n');\n        this.decorators = this.decorators.merge();\n      }\n    } else {\n      this.decorators = undefined;\n    }\n\n    var fn = this.createFunctionContext(asObject);\n\n    if (!this.isChild) {\n      var ret = {\n        compiler: this.compilerInfo(),\n        main: fn\n      };\n\n      if (this.decorators) {\n        ret.main_d = this.decorators; // eslint-disable-line camelcase\n\n        ret.useDecorators = true;\n      }\n\n      var _context = this.context;\n      var programs = _context.programs;\n      var decorators = _context.decorators;\n\n      for (i = 0, l = programs.length; i < l; i++) {\n        if (programs[i]) {\n          ret[i] = programs[i];\n\n          if (decorators[i]) {\n            ret[i + '_d'] = decorators[i];\n            ret.useDecorators = true;\n          }\n        }\n      }\n\n      if (this.environment.usePartial) {\n        ret.usePartial = true;\n      }\n\n      if (this.options.data) {\n        ret.useData = true;\n      }\n\n      if (this.useDepths) {\n        ret.useDepths = true;\n      }\n\n      if (this.useBlockParams) {\n        ret.useBlockParams = true;\n      }\n\n      if (this.options.compat) {\n        ret.compat = true;\n      }\n\n      if (!asObject) {\n        ret.compiler = JSON.stringify(ret.compiler);\n        this.source.currentLocation = {\n          start: {\n            line: 1,\n            column: 0\n          }\n        };\n        ret = this.objectLiteral(ret);\n\n        if (options.srcName) {\n          ret = ret.toStringWithSourceMap({\n            file: options.destName\n          });\n          ret.map = ret.map && ret.map.toString();\n        } else {\n          ret = ret.toString();\n        }\n      } else {\n        ret.compilerOptions = this.options;\n      }\n\n      return ret;\n    } else {\n      return fn;\n    }\n  },\n  preamble: function preamble() {\n    // track the last context pushed into place to allow skipping the\n    // getContext opcode when it would be a noop\n    this.lastContext = 0;\n    this.source = new _codeGen2['default'](this.options.srcName);\n    this.decorators = new _codeGen2['default'](this.options.srcName);\n  },\n  createFunctionContext: function createFunctionContext(asObject) {\n    // istanbul ignore next\n    var _this = this;\n\n    var varDeclarations = '';\n    var locals = this.stackVars.concat(this.registers.list);\n\n    if (locals.length > 0) {\n      varDeclarations += ', ' + locals.join(', ');\n    } // Generate minimizer alias mappings\n    //\n    // When using true SourceNodes, this will update all references to the given alias\n    // as the source nodes are reused in situ. For the non-source node compilation mode,\n    // aliases will not be used, but this case is already being run on the client and\n    // we aren't concern about minimizing the template size.\n\n\n    var aliasCount = 0;\n    Object.keys(this.aliases).forEach(function (alias) {\n      var node = _this.aliases[alias];\n\n      if (node.children && node.referenceCount > 1) {\n        varDeclarations += ', alias' + ++aliasCount + '=' + alias;\n        node.children[0] = 'alias' + aliasCount;\n      }\n    });\n\n    if (this.lookupPropertyFunctionIsUsed) {\n      varDeclarations += ', ' + this.lookupPropertyFunctionVarDeclaration();\n    }\n\n    var params = ['container', 'depth0', 'helpers', 'partials', 'data'];\n\n    if (this.useBlockParams || this.useDepths) {\n      params.push('blockParams');\n    }\n\n    if (this.useDepths) {\n      params.push('depths');\n    } // Perform a second pass over the output to merge content when possible\n\n\n    var source = this.mergeSource(varDeclarations);\n\n    if (asObject) {\n      params.push(source);\n      return Function.apply(this, params);\n    } else {\n      return this.source.wrap(['function(', params.join(','), ') {\\n  ', source, '}']);\n    }\n  },\n  mergeSource: function mergeSource(varDeclarations) {\n    var isSimple = this.environment.isSimple,\n        appendOnly = !this.forceBuffer,\n        appendFirst = undefined,\n        sourceSeen = undefined,\n        bufferStart = undefined,\n        bufferEnd = undefined;\n    this.source.each(function (line) {\n      if (line.appendToBuffer) {\n        if (bufferStart) {\n          line.prepend('  + ');\n        } else {\n          bufferStart = line;\n        }\n\n        bufferEnd = line;\n      } else {\n        if (bufferStart) {\n          if (!sourceSeen) {\n            appendFirst = true;\n          } else {\n            bufferStart.prepend('buffer += ');\n          }\n\n          bufferEnd.add(';');\n          bufferStart = bufferEnd = undefined;\n        }\n\n        sourceSeen = true;\n\n        if (!isSimple) {\n          appendOnly = false;\n        }\n      }\n    });\n\n    if (appendOnly) {\n      if (bufferStart) {\n        bufferStart.prepend('return ');\n        bufferEnd.add(';');\n      } else if (!sourceSeen) {\n        this.source.push('return \"\";');\n      }\n    } else {\n      varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer());\n\n      if (bufferStart) {\n        bufferStart.prepend('return buffer + ');\n        bufferEnd.add(';');\n      } else {\n        this.source.push('return buffer;');\n      }\n    }\n\n    if (varDeclarations) {\n      this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\\n'));\n    }\n\n    return this.source.merge();\n  },\n  lookupPropertyFunctionVarDeclaration: function lookupPropertyFunctionVarDeclaration() {\n    return '\\n      lookupProperty = container.lookupProperty || function(parent, propertyName) {\\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\\n          return parent[propertyName];\\n        }\\n        return undefined\\n    }\\n    '.trim();\n  },\n  // [blockValue]\n  //\n  // On stack, before: hash, inverse, program, value\n  // On stack, after: return value of blockHelperMissing\n  //\n  // The purpose of this opcode is to take a block of the form\n  // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and\n  // replace it on the stack with the result of properly\n  // invoking blockHelperMissing.\n  blockValue: function blockValue(name) {\n    var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'),\n        params = [this.contextName(0)];\n    this.setupHelperArgs(name, 0, params);\n    var blockName = this.popStack();\n    params.splice(1, 0, blockName);\n    this.push(this.source.functionCall(blockHelperMissing, 'call', params));\n  },\n  // [ambiguousBlockValue]\n  //\n  // On stack, before: hash, inverse, program, value\n  // Compiler value, before: lastHelper=value of last found helper, if any\n  // On stack, after, if no lastHelper: same as [blockValue]\n  // On stack, after, if lastHelper: value\n  ambiguousBlockValue: function ambiguousBlockValue() {\n    // We're being a bit cheeky and reusing the options value from the prior exec\n    var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'),\n        params = [this.contextName(0)];\n    this.setupHelperArgs('', 0, params, true);\n    this.flushInline();\n    var current = this.topStack();\n    params.splice(1, 0, current);\n    this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']);\n  },\n  // [appendContent]\n  //\n  // On stack, before: ...\n  // On stack, after: ...\n  //\n  // Appends the string value of `content` to the current buffer\n  appendContent: function appendContent(content) {\n    if (this.pendingContent) {\n      content = this.pendingContent + content;\n    } else {\n      this.pendingLocation = this.source.currentLocation;\n    }\n\n    this.pendingContent = content;\n  },\n  // [append]\n  //\n  // On stack, before: value, ...\n  // On stack, after: ...\n  //\n  // Coerces `value` to a String and appends it to the current buffer.\n  //\n  // If `value` is truthy, or 0, it is coerced into a string and appended\n  // Otherwise, the empty string is appended\n  append: function append() {\n    if (this.isInline()) {\n      this.replaceStack(function (current) {\n        return [' != null ? ', current, ' : \"\"'];\n      });\n      this.pushSource(this.appendToBuffer(this.popStack()));\n    } else {\n      var local = this.popStack();\n      this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']);\n\n      if (this.environment.isSimple) {\n        this.pushSource(['else { ', this.appendToBuffer(\"''\", undefined, true), ' }']);\n      }\n    }\n  },\n  // [appendEscaped]\n  //\n  // On stack, before: value, ...\n  // On stack, after: ...\n  //\n  // Escape `value` and append it to the buffer\n  appendEscaped: function appendEscaped() {\n    this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')']));\n  },\n  // [getContext]\n  //\n  // On stack, before: ...\n  // On stack, after: ...\n  // Compiler value, after: lastContext=depth\n  //\n  // Set the value of the `lastContext` compiler value to the depth\n  getContext: function getContext(depth) {\n    this.lastContext = depth;\n  },\n  // [pushContext]\n  //\n  // On stack, before: ...\n  // On stack, after: currentContext, ...\n  //\n  // Pushes the value of the current context onto the stack.\n  pushContext: function pushContext() {\n    this.pushStackLiteral(this.contextName(this.lastContext));\n  },\n  // [lookupOnContext]\n  //\n  // On stack, before: ...\n  // On stack, after: currentContext[name], ...\n  //\n  // Looks up the value of `name` on the current context and pushes\n  // it onto the stack.\n  lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) {\n    var i = 0;\n\n    if (!scoped && this.options.compat && !this.lastContext) {\n      // The depthed query is expected to handle the undefined logic for the root level that\n      // is implemented below, so we evaluate that directly in compat mode\n      this.push(this.depthedLookup(parts[i++]));\n    } else {\n      this.pushContext();\n    }\n\n    this.resolvePath('context', parts, i, falsy, strict);\n  },\n  // [lookupBlockParam]\n  //\n  // On stack, before: ...\n  // On stack, after: blockParam[name], ...\n  //\n  // Looks up the value of `parts` on the given block param and pushes\n  // it onto the stack.\n  lookupBlockParam: function lookupBlockParam(blockParamId, parts) {\n    this.useBlockParams = true;\n    this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']);\n    this.resolvePath('context', parts, 1);\n  },\n  // [lookupData]\n  //\n  // On stack, before: ...\n  // On stack, after: data, ...\n  //\n  // Push the data lookup operator\n  lookupData: function lookupData(depth, parts, strict) {\n    if (!depth) {\n      this.pushStackLiteral('data');\n    } else {\n      this.pushStackLiteral('container.data(data, ' + depth + ')');\n    }\n\n    this.resolvePath('data', parts, 0, true, strict);\n  },\n  resolvePath: function resolvePath(type, parts, i, falsy, strict) {\n    // istanbul ignore next\n    var _this2 = this;\n\n    if (this.options.strict || this.options.assumeObjects) {\n      this.push(strictLookup(this.options.strict && strict, this, parts, type));\n      return;\n    }\n\n    var len = parts.length;\n\n    for (; i < len; i++) {\n      /* eslint-disable no-loop-func */\n      this.replaceStack(function (current) {\n        var lookup = _this2.nameLookup(current, parts[i], type); // We want to ensure that zero and false are handled properly if the context (falsy flag)\n        // needs to have the special handling for these values.\n\n\n        if (!falsy) {\n          return [' != null ? ', lookup, ' : ', current];\n        } else {\n          // Otherwise we can use generic falsy handling\n          return [' && ', lookup];\n        }\n      });\n      /* eslint-enable no-loop-func */\n    }\n  },\n  // [resolvePossibleLambda]\n  //\n  // On stack, before: value, ...\n  // On stack, after: resolved value, ...\n  //\n  // If the `value` is a lambda, replace it on the stack by\n  // the return value of the lambda\n  resolvePossibleLambda: function resolvePossibleLambda() {\n    this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']);\n  },\n  // [pushStringParam]\n  //\n  // On stack, before: ...\n  // On stack, after: string, currentContext, ...\n  //\n  // This opcode is designed for use in string mode, which\n  // provides the string value of a parameter along with its\n  // depth rather than resolving it immediately.\n  pushStringParam: function pushStringParam(string, type) {\n    this.pushContext();\n    this.pushString(type); // If it's a subexpression, the string result\n    // will be pushed after this opcode.\n\n    if (type !== 'SubExpression') {\n      if (typeof string === 'string') {\n        this.pushString(string);\n      } else {\n        this.pushStackLiteral(string);\n      }\n    }\n  },\n  emptyHash: function emptyHash(omitEmpty) {\n    if (this.trackIds) {\n      this.push('{}'); // hashIds\n    }\n\n    if (this.stringParams) {\n      this.push('{}'); // hashContexts\n\n      this.push('{}'); // hashTypes\n    }\n\n    this.pushStackLiteral(omitEmpty ? 'undefined' : '{}');\n  },\n  pushHash: function pushHash() {\n    if (this.hash) {\n      this.hashes.push(this.hash);\n    }\n\n    this.hash = {\n      values: {},\n      types: [],\n      contexts: [],\n      ids: []\n    };\n  },\n  popHash: function popHash() {\n    var hash = this.hash;\n    this.hash = this.hashes.pop();\n\n    if (this.trackIds) {\n      this.push(this.objectLiteral(hash.ids));\n    }\n\n    if (this.stringParams) {\n      this.push(this.objectLiteral(hash.contexts));\n      this.push(this.objectLiteral(hash.types));\n    }\n\n    this.push(this.objectLiteral(hash.values));\n  },\n  // [pushString]\n  //\n  // On stack, before: ...\n  // On stack, after: quotedString(string), ...\n  //\n  // Push a quoted version of `string` onto the stack\n  pushString: function pushString(string) {\n    this.pushStackLiteral(this.quotedString(string));\n  },\n  // [pushLiteral]\n  //\n  // On stack, before: ...\n  // On stack, after: value, ...\n  //\n  // Pushes a value onto the stack. This operation prevents\n  // the compiler from creating a temporary variable to hold\n  // it.\n  pushLiteral: function pushLiteral(value) {\n    this.pushStackLiteral(value);\n  },\n  // [pushProgram]\n  //\n  // On stack, before: ...\n  // On stack, after: program(guid), ...\n  //\n  // Push a program expression onto the stack. This takes\n  // a compile-time guid and converts it into a runtime-accessible\n  // expression.\n  pushProgram: function pushProgram(guid) {\n    if (guid != null) {\n      this.pushStackLiteral(this.programExpression(guid));\n    } else {\n      this.pushStackLiteral(null);\n    }\n  },\n  // [registerDecorator]\n  //\n  // On stack, before: hash, program, params..., ...\n  // On stack, after: ...\n  //\n  // Pops off the decorator's parameters, invokes the decorator,\n  // and inserts the decorator into the decorators list.\n  registerDecorator: function registerDecorator(paramSize, name) {\n    var foundDecorator = this.nameLookup('decorators', name, 'decorator'),\n        options = this.setupHelperArgs(name, paramSize);\n    this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']);\n  },\n  // [invokeHelper]\n  //\n  // On stack, before: hash, inverse, program, params..., ...\n  // On stack, after: result of helper invocation\n  //\n  // Pops off the helper's parameters, invokes the helper,\n  // and pushes the helper's return value onto the stack.\n  //\n  // If the helper is not found, `helperMissing` is called.\n  invokeHelper: function invokeHelper(paramSize, name, isSimple) {\n    var nonHelper = this.popStack(),\n        helper = this.setupHelper(paramSize, name);\n    var possibleFunctionCalls = [];\n\n    if (isSimple) {\n      // direct call to helper\n      possibleFunctionCalls.push(helper.name);\n    } // call a function from the input object\n\n\n    possibleFunctionCalls.push(nonHelper);\n\n    if (!this.options.strict) {\n      possibleFunctionCalls.push(this.aliasable('container.hooks.helperMissing'));\n    }\n\n    var functionLookupCode = ['(', this.itemsSeparatedBy(possibleFunctionCalls, '||'), ')'];\n    var functionCall = this.source.functionCall(functionLookupCode, 'call', helper.callParams);\n    this.push(functionCall);\n  },\n  itemsSeparatedBy: function itemsSeparatedBy(items, separator) {\n    var result = [];\n    result.push(items[0]);\n\n    for (var i = 1; i < items.length; i++) {\n      result.push(separator, items[i]);\n    }\n\n    return result;\n  },\n  // [invokeKnownHelper]\n  //\n  // On stack, before: hash, inverse, program, params..., ...\n  // On stack, after: result of helper invocation\n  //\n  // This operation is used when the helper is known to exist,\n  // so a `helperMissing` fallback is not required.\n  invokeKnownHelper: function invokeKnownHelper(paramSize, name) {\n    var helper = this.setupHelper(paramSize, name);\n    this.push(this.source.functionCall(helper.name, 'call', helper.callParams));\n  },\n  // [invokeAmbiguous]\n  //\n  // On stack, before: hash, inverse, program, params..., ...\n  // On stack, after: result of disambiguation\n  //\n  // This operation is used when an expression like `{{foo}}`\n  // is provided, but we don't know at compile-time whether it\n  // is a helper or a path.\n  //\n  // This operation emits more code than the other options,\n  // and can be avoided by passing the `knownHelpers` and\n  // `knownHelpersOnly` flags at compile-time.\n  invokeAmbiguous: function invokeAmbiguous(name, helperCall) {\n    this.useRegister('helper');\n    var nonHelper = this.popStack();\n    this.emptyHash();\n    var helper = this.setupHelper(0, name, helperCall);\n    var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');\n    var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')'];\n\n    if (!this.options.strict) {\n      lookup[0] = '(helper = ';\n      lookup.push(' != null ? helper : ', this.aliasable('container.hooks.helperMissing'));\n    }\n\n    this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('\"function\"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']);\n  },\n  // [invokePartial]\n  //\n  // On stack, before: context, ...\n  // On stack after: result of partial invocation\n  //\n  // This operation pops off a context, invokes a partial with that context,\n  // and pushes the result of the invocation back.\n  invokePartial: function invokePartial(isDynamic, name, indent) {\n    var params = [],\n        options = this.setupParams(name, 1, params);\n\n    if (isDynamic) {\n      name = this.popStack();\n      delete options.name;\n    }\n\n    if (indent) {\n      options.indent = JSON.stringify(indent);\n    }\n\n    options.helpers = 'helpers';\n    options.partials = 'partials';\n    options.decorators = 'container.decorators';\n\n    if (!isDynamic) {\n      params.unshift(this.nameLookup('partials', name, 'partial'));\n    } else {\n      params.unshift(name);\n    }\n\n    if (this.options.compat) {\n      options.depths = 'depths';\n    }\n\n    options = this.objectLiteral(options);\n    params.push(options);\n    this.push(this.source.functionCall('container.invokePartial', '', params));\n  },\n  // [assignToHash]\n  //\n  // On stack, before: value, ..., hash, ...\n  // On stack, after: ..., hash, ...\n  //\n  // Pops a value off the stack and assigns it to the current hash\n  assignToHash: function assignToHash(key) {\n    var value = this.popStack(),\n        context = undefined,\n        type = undefined,\n        id = undefined;\n\n    if (this.trackIds) {\n      id = this.popStack();\n    }\n\n    if (this.stringParams) {\n      type = this.popStack();\n      context = this.popStack();\n    }\n\n    var hash = this.hash;\n\n    if (context) {\n      hash.contexts[key] = context;\n    }\n\n    if (type) {\n      hash.types[key] = type;\n    }\n\n    if (id) {\n      hash.ids[key] = id;\n    }\n\n    hash.values[key] = value;\n  },\n  pushId: function pushId(type, name, child) {\n    if (type === 'BlockParam') {\n      this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : ''));\n    } else if (type === 'PathExpression') {\n      this.pushString(name);\n    } else if (type === 'SubExpression') {\n      this.pushStackLiteral('true');\n    } else {\n      this.pushStackLiteral('null');\n    }\n  },\n  // HELPERS\n  compiler: JavaScriptCompiler,\n  compileChildren: function compileChildren(environment, options) {\n    var children = environment.children,\n        child = undefined,\n        compiler = undefined;\n\n    for (var i = 0, l = children.length; i < l; i++) {\n      child = children[i];\n      compiler = new this.compiler(); // eslint-disable-line new-cap\n\n      var existing = this.matchExistingProgram(child);\n\n      if (existing == null) {\n        this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children\n\n        var index = this.context.programs.length;\n        child.index = index;\n        child.name = 'program' + index;\n        this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);\n        this.context.decorators[index] = compiler.decorators;\n        this.context.environments[index] = child;\n        this.useDepths = this.useDepths || compiler.useDepths;\n        this.useBlockParams = this.useBlockParams || compiler.useBlockParams;\n        child.useDepths = this.useDepths;\n        child.useBlockParams = this.useBlockParams;\n      } else {\n        child.index = existing.index;\n        child.name = 'program' + existing.index;\n        this.useDepths = this.useDepths || existing.useDepths;\n        this.useBlockParams = this.useBlockParams || existing.useBlockParams;\n      }\n    }\n  },\n  matchExistingProgram: function matchExistingProgram(child) {\n    for (var i = 0, len = this.context.environments.length; i < len; i++) {\n      var environment = this.context.environments[i];\n\n      if (environment && environment.equals(child)) {\n        return environment;\n      }\n    }\n  },\n  programExpression: function programExpression(guid) {\n    var child = this.environment.children[guid],\n        programParams = [child.index, 'data', child.blockParams];\n\n    if (this.useBlockParams || this.useDepths) {\n      programParams.push('blockParams');\n    }\n\n    if (this.useDepths) {\n      programParams.push('depths');\n    }\n\n    return 'container.program(' + programParams.join(', ') + ')';\n  },\n  useRegister: function useRegister(name) {\n    if (!this.registers[name]) {\n      this.registers[name] = true;\n      this.registers.list.push(name);\n    }\n  },\n  push: function push(expr) {\n    if (!(expr instanceof Literal)) {\n      expr = this.source.wrap(expr);\n    }\n\n    this.inlineStack.push(expr);\n    return expr;\n  },\n  pushStackLiteral: function pushStackLiteral(item) {\n    this.push(new Literal(item));\n  },\n  pushSource: function pushSource(source) {\n    if (this.pendingContent) {\n      this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));\n      this.pendingContent = undefined;\n    }\n\n    if (source) {\n      this.source.push(source);\n    }\n  },\n  replaceStack: function replaceStack(callback) {\n    var prefix = ['('],\n        stack = undefined,\n        createdStack = undefined,\n        usedLiteral = undefined;\n    /* istanbul ignore next */\n\n    if (!this.isInline()) {\n      throw new _exception2['default']('replaceStack on non-inline');\n    } // We want to merge the inline statement into the replacement statement via ','\n\n\n    var top = this.popStack(true);\n\n    if (top instanceof Literal) {\n      // Literals do not need to be inlined\n      stack = [top.value];\n      prefix = ['(', stack];\n      usedLiteral = true;\n    } else {\n      // Get or create the current stack name for use by the inline\n      createdStack = true;\n\n      var _name = this.incrStack();\n\n      prefix = ['((', this.push(_name), ' = ', top, ')'];\n      stack = this.topStack();\n    }\n\n    var item = callback.call(this, stack);\n\n    if (!usedLiteral) {\n      this.popStack();\n    }\n\n    if (createdStack) {\n      this.stackSlot--;\n    }\n\n    this.push(prefix.concat(item, ')'));\n  },\n  incrStack: function incrStack() {\n    this.stackSlot++;\n\n    if (this.stackSlot > this.stackVars.length) {\n      this.stackVars.push('stack' + this.stackSlot);\n    }\n\n    return this.topStackName();\n  },\n  topStackName: function topStackName() {\n    return 'stack' + this.stackSlot;\n  },\n  flushInline: function flushInline() {\n    var inlineStack = this.inlineStack;\n    this.inlineStack = [];\n\n    for (var i = 0, len = inlineStack.length; i < len; i++) {\n      var entry = inlineStack[i];\n      /* istanbul ignore if */\n\n      if (entry instanceof Literal) {\n        this.compileStack.push(entry);\n      } else {\n        var stack = this.incrStack();\n        this.pushSource([stack, ' = ', entry, ';']);\n        this.compileStack.push(stack);\n      }\n    }\n  },\n  isInline: function isInline() {\n    return this.inlineStack.length;\n  },\n  popStack: function popStack(wrapped) {\n    var inline = this.isInline(),\n        item = (inline ? this.inlineStack : this.compileStack).pop();\n\n    if (!wrapped && item instanceof Literal) {\n      return item.value;\n    } else {\n      if (!inline) {\n        /* istanbul ignore next */\n        if (!this.stackSlot) {\n          throw new _exception2['default']('Invalid stack pop');\n        }\n\n        this.stackSlot--;\n      }\n\n      return item;\n    }\n  },\n  topStack: function topStack() {\n    var stack = this.isInline() ? this.inlineStack : this.compileStack,\n        item = stack[stack.length - 1];\n    /* istanbul ignore if */\n\n    if (item instanceof Literal) {\n      return item.value;\n    } else {\n      return item;\n    }\n  },\n  contextName: function contextName(context) {\n    if (this.useDepths && context) {\n      return 'depths[' + context + ']';\n    } else {\n      return 'depth' + context;\n    }\n  },\n  quotedString: function quotedString(str) {\n    return this.source.quotedString(str);\n  },\n  objectLiteral: function objectLiteral(obj) {\n    return this.source.objectLiteral(obj);\n  },\n  aliasable: function aliasable(name) {\n    var ret = this.aliases[name];\n\n    if (ret) {\n      ret.referenceCount++;\n      return ret;\n    }\n\n    ret = this.aliases[name] = this.source.wrap(name);\n    ret.aliasable = true;\n    ret.referenceCount = 1;\n    return ret;\n  },\n  setupHelper: function setupHelper(paramSize, name, blockHelper) {\n    var params = [],\n        paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper);\n    var foundHelper = this.nameLookup('helpers', name, 'helper'),\n        callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : (container.nullContext || {})');\n    return {\n      params: params,\n      paramsInit: paramsInit,\n      name: foundHelper,\n      callParams: [callContext].concat(params)\n    };\n  },\n  setupParams: function setupParams(helper, paramSize, params) {\n    var options = {},\n        contexts = [],\n        types = [],\n        ids = [],\n        objectArgs = !params,\n        param = undefined;\n\n    if (objectArgs) {\n      params = [];\n    }\n\n    options.name = this.quotedString(helper);\n    options.hash = this.popStack();\n\n    if (this.trackIds) {\n      options.hashIds = this.popStack();\n    }\n\n    if (this.stringParams) {\n      options.hashTypes = this.popStack();\n      options.hashContexts = this.popStack();\n    }\n\n    var inverse = this.popStack(),\n        program = this.popStack(); // Avoid setting fn and inverse if neither are set. This allows\n    // helpers to do a check for `if (options.fn)`\n\n    if (program || inverse) {\n      options.fn = program || 'container.noop';\n      options.inverse = inverse || 'container.noop';\n    } // The parameters go on to the stack in order (making sure that they are evaluated in order)\n    // so we need to pop them off the stack in reverse order\n\n\n    var i = paramSize;\n\n    while (i--) {\n      param = this.popStack();\n      params[i] = param;\n\n      if (this.trackIds) {\n        ids[i] = this.popStack();\n      }\n\n      if (this.stringParams) {\n        types[i] = this.popStack();\n        contexts[i] = this.popStack();\n      }\n    }\n\n    if (objectArgs) {\n      options.args = this.source.generateArray(params);\n    }\n\n    if (this.trackIds) {\n      options.ids = this.source.generateArray(ids);\n    }\n\n    if (this.stringParams) {\n      options.types = this.source.generateArray(types);\n      options.contexts = this.source.generateArray(contexts);\n    }\n\n    if (this.options.data) {\n      options.data = 'data';\n    }\n\n    if (this.useBlockParams) {\n      options.blockParams = 'blockParams';\n    }\n\n    return options;\n  },\n  setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) {\n    var options = this.setupParams(helper, paramSize, params);\n    options.loc = JSON.stringify(this.source.currentLocation);\n    options = this.objectLiteral(options);\n\n    if (useRegister) {\n      this.useRegister('options');\n      params.push('options');\n      return ['options=', options];\n    } else if (params) {\n      params.push(options);\n      return '';\n    } else {\n      return options;\n    }\n  }\n};\n\n(function () {\n  var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' ');\n  var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};\n\n  for (var i = 0, l = reservedWords.length; i < l; i++) {\n    compilerWords[reservedWords[i]] = true;\n  }\n})();\n/**\n * @deprecated May be removed in the next major version\n */\n\n\nJavaScriptCompiler.isValidJavaScriptVariableName = function (name) {\n  return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);\n};\n\nfunction strictLookup(requireTerminal, compiler, parts, type) {\n  var stack = compiler.popStack(),\n      i = 0,\n      len = parts.length;\n\n  if (requireTerminal) {\n    len--;\n  }\n\n  for (; i < len; i++) {\n    stack = compiler.nameLookup(stack, parts[i], type);\n  }\n\n  if (requireTerminal) {\n    return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ', ', JSON.stringify(compiler.source.currentLocation), ' )'];\n  } else {\n    return stack;\n  }\n}\n\nexports['default'] = JavaScriptCompiler;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js":
/*!************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// File ignored in coverage tests via setting in .istanbul.yml\n\n/* Jison generated parser */\n\n\nexports.__esModule = true;\n\nvar handlebars = function () {\n  var parser = {\n    trace: function trace() {},\n    yy: {},\n    symbols_: {\n      \"error\": 2,\n      \"root\": 3,\n      \"program\": 4,\n      \"EOF\": 5,\n      \"program_repetition0\": 6,\n      \"statement\": 7,\n      \"mustache\": 8,\n      \"block\": 9,\n      \"rawBlock\": 10,\n      \"partial\": 11,\n      \"partialBlock\": 12,\n      \"content\": 13,\n      \"COMMENT\": 14,\n      \"CONTENT\": 15,\n      \"openRawBlock\": 16,\n      \"rawBlock_repetition0\": 17,\n      \"END_RAW_BLOCK\": 18,\n      \"OPEN_RAW_BLOCK\": 19,\n      \"helperName\": 20,\n      \"openRawBlock_repetition0\": 21,\n      \"openRawBlock_option0\": 22,\n      \"CLOSE_RAW_BLOCK\": 23,\n      \"openBlock\": 24,\n      \"block_option0\": 25,\n      \"closeBlock\": 26,\n      \"openInverse\": 27,\n      \"block_option1\": 28,\n      \"OPEN_BLOCK\": 29,\n      \"openBlock_repetition0\": 30,\n      \"openBlock_option0\": 31,\n      \"openBlock_option1\": 32,\n      \"CLOSE\": 33,\n      \"OPEN_INVERSE\": 34,\n      \"openInverse_repetition0\": 35,\n      \"openInverse_option0\": 36,\n      \"openInverse_option1\": 37,\n      \"openInverseChain\": 38,\n      \"OPEN_INVERSE_CHAIN\": 39,\n      \"openInverseChain_repetition0\": 40,\n      \"openInverseChain_option0\": 41,\n      \"openInverseChain_option1\": 42,\n      \"inverseAndProgram\": 43,\n      \"INVERSE\": 44,\n      \"inverseChain\": 45,\n      \"inverseChain_option0\": 46,\n      \"OPEN_ENDBLOCK\": 47,\n      \"OPEN\": 48,\n      \"mustache_repetition0\": 49,\n      \"mustache_option0\": 50,\n      \"OPEN_UNESCAPED\": 51,\n      \"mustache_repetition1\": 52,\n      \"mustache_option1\": 53,\n      \"CLOSE_UNESCAPED\": 54,\n      \"OPEN_PARTIAL\": 55,\n      \"partialName\": 56,\n      \"partial_repetition0\": 57,\n      \"partial_option0\": 58,\n      \"openPartialBlock\": 59,\n      \"OPEN_PARTIAL_BLOCK\": 60,\n      \"openPartialBlock_repetition0\": 61,\n      \"openPartialBlock_option0\": 62,\n      \"param\": 63,\n      \"sexpr\": 64,\n      \"OPEN_SEXPR\": 65,\n      \"sexpr_repetition0\": 66,\n      \"sexpr_option0\": 67,\n      \"CLOSE_SEXPR\": 68,\n      \"hash\": 69,\n      \"hash_repetition_plus0\": 70,\n      \"hashSegment\": 71,\n      \"ID\": 72,\n      \"EQUALS\": 73,\n      \"blockParams\": 74,\n      \"OPEN_BLOCK_PARAMS\": 75,\n      \"blockParams_repetition_plus0\": 76,\n      \"CLOSE_BLOCK_PARAMS\": 77,\n      \"path\": 78,\n      \"dataName\": 79,\n      \"STRING\": 80,\n      \"NUMBER\": 81,\n      \"BOOLEAN\": 82,\n      \"UNDEFINED\": 83,\n      \"NULL\": 84,\n      \"DATA\": 85,\n      \"pathSegments\": 86,\n      \"SEP\": 87,\n      \"$accept\": 0,\n      \"$end\": 1\n    },\n    terminals_: {\n      2: \"error\",\n      5: \"EOF\",\n      14: \"COMMENT\",\n      15: \"CONTENT\",\n      18: \"END_RAW_BLOCK\",\n      19: \"OPEN_RAW_BLOCK\",\n      23: \"CLOSE_RAW_BLOCK\",\n      29: \"OPEN_BLOCK\",\n      33: \"CLOSE\",\n      34: \"OPEN_INVERSE\",\n      39: \"OPEN_INVERSE_CHAIN\",\n      44: \"INVERSE\",\n      47: \"OPEN_ENDBLOCK\",\n      48: \"OPEN\",\n      51: \"OPEN_UNESCAPED\",\n      54: \"CLOSE_UNESCAPED\",\n      55: \"OPEN_PARTIAL\",\n      60: \"OPEN_PARTIAL_BLOCK\",\n      65: \"OPEN_SEXPR\",\n      68: \"CLOSE_SEXPR\",\n      72: \"ID\",\n      73: \"EQUALS\",\n      75: \"OPEN_BLOCK_PARAMS\",\n      77: \"CLOSE_BLOCK_PARAMS\",\n      80: \"STRING\",\n      81: \"NUMBER\",\n      82: \"BOOLEAN\",\n      83: \"UNDEFINED\",\n      84: \"NULL\",\n      85: \"DATA\",\n      87: \"SEP\"\n    },\n    productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 0], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]],\n    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n      var $0 = $$.length - 1;\n\n      switch (yystate) {\n        case 1:\n          return $$[$0 - 1];\n          break;\n\n        case 2:\n          this.$ = yy.prepareProgram($$[$0]);\n          break;\n\n        case 3:\n          this.$ = $$[$0];\n          break;\n\n        case 4:\n          this.$ = $$[$0];\n          break;\n\n        case 5:\n          this.$ = $$[$0];\n          break;\n\n        case 6:\n          this.$ = $$[$0];\n          break;\n\n        case 7:\n          this.$ = $$[$0];\n          break;\n\n        case 8:\n          this.$ = $$[$0];\n          break;\n\n        case 9:\n          this.$ = {\n            type: 'CommentStatement',\n            value: yy.stripComment($$[$0]),\n            strip: yy.stripFlags($$[$0], $$[$0]),\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 10:\n          this.$ = {\n            type: 'ContentStatement',\n            original: $$[$0],\n            value: $$[$0],\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 11:\n          this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n          break;\n\n        case 12:\n          this.$ = {\n            path: $$[$0 - 3],\n            params: $$[$0 - 2],\n            hash: $$[$0 - 1]\n          };\n          break;\n\n        case 13:\n          this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);\n          break;\n\n        case 14:\n          this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);\n          break;\n\n        case 15:\n          this.$ = {\n            open: $$[$0 - 5],\n            path: $$[$0 - 4],\n            params: $$[$0 - 3],\n            hash: $$[$0 - 2],\n            blockParams: $$[$0 - 1],\n            strip: yy.stripFlags($$[$0 - 5], $$[$0])\n          };\n          break;\n\n        case 16:\n          this.$ = {\n            path: $$[$0 - 4],\n            params: $$[$0 - 3],\n            hash: $$[$0 - 2],\n            blockParams: $$[$0 - 1],\n            strip: yy.stripFlags($$[$0 - 5], $$[$0])\n          };\n          break;\n\n        case 17:\n          this.$ = {\n            path: $$[$0 - 4],\n            params: $$[$0 - 3],\n            hash: $$[$0 - 2],\n            blockParams: $$[$0 - 1],\n            strip: yy.stripFlags($$[$0 - 5], $$[$0])\n          };\n          break;\n\n        case 18:\n          this.$ = {\n            strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]),\n            program: $$[$0]\n          };\n          break;\n\n        case 19:\n          var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),\n              program = yy.prepareProgram([inverse], $$[$0 - 1].loc);\n          program.chained = true;\n          this.$ = {\n            strip: $$[$0 - 2].strip,\n            program: program,\n            chain: true\n          };\n          break;\n\n        case 20:\n          this.$ = $$[$0];\n          break;\n\n        case 21:\n          this.$ = {\n            path: $$[$0 - 1],\n            strip: yy.stripFlags($$[$0 - 2], $$[$0])\n          };\n          break;\n\n        case 22:\n          this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n          break;\n\n        case 23:\n          this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n          break;\n\n        case 24:\n          this.$ = {\n            type: 'PartialStatement',\n            name: $$[$0 - 3],\n            params: $$[$0 - 2],\n            hash: $$[$0 - 1],\n            indent: '',\n            strip: yy.stripFlags($$[$0 - 4], $$[$0]),\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 25:\n          this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n          break;\n\n        case 26:\n          this.$ = {\n            path: $$[$0 - 3],\n            params: $$[$0 - 2],\n            hash: $$[$0 - 1],\n            strip: yy.stripFlags($$[$0 - 4], $$[$0])\n          };\n          break;\n\n        case 27:\n          this.$ = $$[$0];\n          break;\n\n        case 28:\n          this.$ = $$[$0];\n          break;\n\n        case 29:\n          this.$ = {\n            type: 'SubExpression',\n            path: $$[$0 - 3],\n            params: $$[$0 - 2],\n            hash: $$[$0 - 1],\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 30:\n          this.$ = {\n            type: 'Hash',\n            pairs: $$[$0],\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 31:\n          this.$ = {\n            type: 'HashPair',\n            key: yy.id($$[$0 - 2]),\n            value: $$[$0],\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 32:\n          this.$ = yy.id($$[$0 - 1]);\n          break;\n\n        case 33:\n          this.$ = $$[$0];\n          break;\n\n        case 34:\n          this.$ = $$[$0];\n          break;\n\n        case 35:\n          this.$ = {\n            type: 'StringLiteral',\n            value: $$[$0],\n            original: $$[$0],\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 36:\n          this.$ = {\n            type: 'NumberLiteral',\n            value: Number($$[$0]),\n            original: Number($$[$0]),\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 37:\n          this.$ = {\n            type: 'BooleanLiteral',\n            value: $$[$0] === 'true',\n            original: $$[$0] === 'true',\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 38:\n          this.$ = {\n            type: 'UndefinedLiteral',\n            original: undefined,\n            value: undefined,\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 39:\n          this.$ = {\n            type: 'NullLiteral',\n            original: null,\n            value: null,\n            loc: yy.locInfo(this._$)\n          };\n          break;\n\n        case 40:\n          this.$ = $$[$0];\n          break;\n\n        case 41:\n          this.$ = $$[$0];\n          break;\n\n        case 42:\n          this.$ = yy.preparePath(true, $$[$0], this._$);\n          break;\n\n        case 43:\n          this.$ = yy.preparePath(false, $$[$0], this._$);\n          break;\n\n        case 44:\n          $$[$0 - 2].push({\n            part: yy.id($$[$0]),\n            original: $$[$0],\n            separator: $$[$0 - 1]\n          });\n          this.$ = $$[$0 - 2];\n          break;\n\n        case 45:\n          this.$ = [{\n            part: yy.id($$[$0]),\n            original: $$[$0]\n          }];\n          break;\n\n        case 46:\n          this.$ = [];\n          break;\n\n        case 47:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 48:\n          this.$ = [];\n          break;\n\n        case 49:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 50:\n          this.$ = [];\n          break;\n\n        case 51:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 58:\n          this.$ = [];\n          break;\n\n        case 59:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 64:\n          this.$ = [];\n          break;\n\n        case 65:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 70:\n          this.$ = [];\n          break;\n\n        case 71:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 78:\n          this.$ = [];\n          break;\n\n        case 79:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 82:\n          this.$ = [];\n          break;\n\n        case 83:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 86:\n          this.$ = [];\n          break;\n\n        case 87:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 90:\n          this.$ = [];\n          break;\n\n        case 91:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 94:\n          this.$ = [];\n          break;\n\n        case 95:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 98:\n          this.$ = [$$[$0]];\n          break;\n\n        case 99:\n          $$[$0 - 1].push($$[$0]);\n          break;\n\n        case 100:\n          this.$ = [$$[$0]];\n          break;\n\n        case 101:\n          $$[$0 - 1].push($$[$0]);\n          break;\n      }\n    },\n    table: [{\n      3: 1,\n      4: 2,\n      5: [2, 46],\n      6: 3,\n      14: [2, 46],\n      15: [2, 46],\n      19: [2, 46],\n      29: [2, 46],\n      34: [2, 46],\n      48: [2, 46],\n      51: [2, 46],\n      55: [2, 46],\n      60: [2, 46]\n    }, {\n      1: [3]\n    }, {\n      5: [1, 4]\n    }, {\n      5: [2, 2],\n      7: 5,\n      8: 6,\n      9: 7,\n      10: 8,\n      11: 9,\n      12: 10,\n      13: 11,\n      14: [1, 12],\n      15: [1, 20],\n      16: 17,\n      19: [1, 23],\n      24: 15,\n      27: 16,\n      29: [1, 21],\n      34: [1, 22],\n      39: [2, 2],\n      44: [2, 2],\n      47: [2, 2],\n      48: [1, 13],\n      51: [1, 14],\n      55: [1, 18],\n      59: 19,\n      60: [1, 24]\n    }, {\n      1: [2, 1]\n    }, {\n      5: [2, 47],\n      14: [2, 47],\n      15: [2, 47],\n      19: [2, 47],\n      29: [2, 47],\n      34: [2, 47],\n      39: [2, 47],\n      44: [2, 47],\n      47: [2, 47],\n      48: [2, 47],\n      51: [2, 47],\n      55: [2, 47],\n      60: [2, 47]\n    }, {\n      5: [2, 3],\n      14: [2, 3],\n      15: [2, 3],\n      19: [2, 3],\n      29: [2, 3],\n      34: [2, 3],\n      39: [2, 3],\n      44: [2, 3],\n      47: [2, 3],\n      48: [2, 3],\n      51: [2, 3],\n      55: [2, 3],\n      60: [2, 3]\n    }, {\n      5: [2, 4],\n      14: [2, 4],\n      15: [2, 4],\n      19: [2, 4],\n      29: [2, 4],\n      34: [2, 4],\n      39: [2, 4],\n      44: [2, 4],\n      47: [2, 4],\n      48: [2, 4],\n      51: [2, 4],\n      55: [2, 4],\n      60: [2, 4]\n    }, {\n      5: [2, 5],\n      14: [2, 5],\n      15: [2, 5],\n      19: [2, 5],\n      29: [2, 5],\n      34: [2, 5],\n      39: [2, 5],\n      44: [2, 5],\n      47: [2, 5],\n      48: [2, 5],\n      51: [2, 5],\n      55: [2, 5],\n      60: [2, 5]\n    }, {\n      5: [2, 6],\n      14: [2, 6],\n      15: [2, 6],\n      19: [2, 6],\n      29: [2, 6],\n      34: [2, 6],\n      39: [2, 6],\n      44: [2, 6],\n      47: [2, 6],\n      48: [2, 6],\n      51: [2, 6],\n      55: [2, 6],\n      60: [2, 6]\n    }, {\n      5: [2, 7],\n      14: [2, 7],\n      15: [2, 7],\n      19: [2, 7],\n      29: [2, 7],\n      34: [2, 7],\n      39: [2, 7],\n      44: [2, 7],\n      47: [2, 7],\n      48: [2, 7],\n      51: [2, 7],\n      55: [2, 7],\n      60: [2, 7]\n    }, {\n      5: [2, 8],\n      14: [2, 8],\n      15: [2, 8],\n      19: [2, 8],\n      29: [2, 8],\n      34: [2, 8],\n      39: [2, 8],\n      44: [2, 8],\n      47: [2, 8],\n      48: [2, 8],\n      51: [2, 8],\n      55: [2, 8],\n      60: [2, 8]\n    }, {\n      5: [2, 9],\n      14: [2, 9],\n      15: [2, 9],\n      19: [2, 9],\n      29: [2, 9],\n      34: [2, 9],\n      39: [2, 9],\n      44: [2, 9],\n      47: [2, 9],\n      48: [2, 9],\n      51: [2, 9],\n      55: [2, 9],\n      60: [2, 9]\n    }, {\n      20: 25,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 36,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      4: 37,\n      6: 3,\n      14: [2, 46],\n      15: [2, 46],\n      19: [2, 46],\n      29: [2, 46],\n      34: [2, 46],\n      39: [2, 46],\n      44: [2, 46],\n      47: [2, 46],\n      48: [2, 46],\n      51: [2, 46],\n      55: [2, 46],\n      60: [2, 46]\n    }, {\n      4: 38,\n      6: 3,\n      14: [2, 46],\n      15: [2, 46],\n      19: [2, 46],\n      29: [2, 46],\n      34: [2, 46],\n      44: [2, 46],\n      47: [2, 46],\n      48: [2, 46],\n      51: [2, 46],\n      55: [2, 46],\n      60: [2, 46]\n    }, {\n      15: [2, 48],\n      17: 39,\n      18: [2, 48]\n    }, {\n      20: 41,\n      56: 40,\n      64: 42,\n      65: [1, 43],\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      4: 44,\n      6: 3,\n      14: [2, 46],\n      15: [2, 46],\n      19: [2, 46],\n      29: [2, 46],\n      34: [2, 46],\n      47: [2, 46],\n      48: [2, 46],\n      51: [2, 46],\n      55: [2, 46],\n      60: [2, 46]\n    }, {\n      5: [2, 10],\n      14: [2, 10],\n      15: [2, 10],\n      18: [2, 10],\n      19: [2, 10],\n      29: [2, 10],\n      34: [2, 10],\n      39: [2, 10],\n      44: [2, 10],\n      47: [2, 10],\n      48: [2, 10],\n      51: [2, 10],\n      55: [2, 10],\n      60: [2, 10]\n    }, {\n      20: 45,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 46,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 47,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 41,\n      56: 48,\n      64: 42,\n      65: [1, 43],\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      33: [2, 78],\n      49: 49,\n      65: [2, 78],\n      72: [2, 78],\n      80: [2, 78],\n      81: [2, 78],\n      82: [2, 78],\n      83: [2, 78],\n      84: [2, 78],\n      85: [2, 78]\n    }, {\n      23: [2, 33],\n      33: [2, 33],\n      54: [2, 33],\n      65: [2, 33],\n      68: [2, 33],\n      72: [2, 33],\n      75: [2, 33],\n      80: [2, 33],\n      81: [2, 33],\n      82: [2, 33],\n      83: [2, 33],\n      84: [2, 33],\n      85: [2, 33]\n    }, {\n      23: [2, 34],\n      33: [2, 34],\n      54: [2, 34],\n      65: [2, 34],\n      68: [2, 34],\n      72: [2, 34],\n      75: [2, 34],\n      80: [2, 34],\n      81: [2, 34],\n      82: [2, 34],\n      83: [2, 34],\n      84: [2, 34],\n      85: [2, 34]\n    }, {\n      23: [2, 35],\n      33: [2, 35],\n      54: [2, 35],\n      65: [2, 35],\n      68: [2, 35],\n      72: [2, 35],\n      75: [2, 35],\n      80: [2, 35],\n      81: [2, 35],\n      82: [2, 35],\n      83: [2, 35],\n      84: [2, 35],\n      85: [2, 35]\n    }, {\n      23: [2, 36],\n      33: [2, 36],\n      54: [2, 36],\n      65: [2, 36],\n      68: [2, 36],\n      72: [2, 36],\n      75: [2, 36],\n      80: [2, 36],\n      81: [2, 36],\n      82: [2, 36],\n      83: [2, 36],\n      84: [2, 36],\n      85: [2, 36]\n    }, {\n      23: [2, 37],\n      33: [2, 37],\n      54: [2, 37],\n      65: [2, 37],\n      68: [2, 37],\n      72: [2, 37],\n      75: [2, 37],\n      80: [2, 37],\n      81: [2, 37],\n      82: [2, 37],\n      83: [2, 37],\n      84: [2, 37],\n      85: [2, 37]\n    }, {\n      23: [2, 38],\n      33: [2, 38],\n      54: [2, 38],\n      65: [2, 38],\n      68: [2, 38],\n      72: [2, 38],\n      75: [2, 38],\n      80: [2, 38],\n      81: [2, 38],\n      82: [2, 38],\n      83: [2, 38],\n      84: [2, 38],\n      85: [2, 38]\n    }, {\n      23: [2, 39],\n      33: [2, 39],\n      54: [2, 39],\n      65: [2, 39],\n      68: [2, 39],\n      72: [2, 39],\n      75: [2, 39],\n      80: [2, 39],\n      81: [2, 39],\n      82: [2, 39],\n      83: [2, 39],\n      84: [2, 39],\n      85: [2, 39]\n    }, {\n      23: [2, 43],\n      33: [2, 43],\n      54: [2, 43],\n      65: [2, 43],\n      68: [2, 43],\n      72: [2, 43],\n      75: [2, 43],\n      80: [2, 43],\n      81: [2, 43],\n      82: [2, 43],\n      83: [2, 43],\n      84: [2, 43],\n      85: [2, 43],\n      87: [1, 50]\n    }, {\n      72: [1, 35],\n      86: 51\n    }, {\n      23: [2, 45],\n      33: [2, 45],\n      54: [2, 45],\n      65: [2, 45],\n      68: [2, 45],\n      72: [2, 45],\n      75: [2, 45],\n      80: [2, 45],\n      81: [2, 45],\n      82: [2, 45],\n      83: [2, 45],\n      84: [2, 45],\n      85: [2, 45],\n      87: [2, 45]\n    }, {\n      52: 52,\n      54: [2, 82],\n      65: [2, 82],\n      72: [2, 82],\n      80: [2, 82],\n      81: [2, 82],\n      82: [2, 82],\n      83: [2, 82],\n      84: [2, 82],\n      85: [2, 82]\n    }, {\n      25: 53,\n      38: 55,\n      39: [1, 57],\n      43: 56,\n      44: [1, 58],\n      45: 54,\n      47: [2, 54]\n    }, {\n      28: 59,\n      43: 60,\n      44: [1, 58],\n      47: [2, 56]\n    }, {\n      13: 62,\n      15: [1, 20],\n      18: [1, 61]\n    }, {\n      33: [2, 86],\n      57: 63,\n      65: [2, 86],\n      72: [2, 86],\n      80: [2, 86],\n      81: [2, 86],\n      82: [2, 86],\n      83: [2, 86],\n      84: [2, 86],\n      85: [2, 86]\n    }, {\n      33: [2, 40],\n      65: [2, 40],\n      72: [2, 40],\n      80: [2, 40],\n      81: [2, 40],\n      82: [2, 40],\n      83: [2, 40],\n      84: [2, 40],\n      85: [2, 40]\n    }, {\n      33: [2, 41],\n      65: [2, 41],\n      72: [2, 41],\n      80: [2, 41],\n      81: [2, 41],\n      82: [2, 41],\n      83: [2, 41],\n      84: [2, 41],\n      85: [2, 41]\n    }, {\n      20: 64,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      26: 65,\n      47: [1, 66]\n    }, {\n      30: 67,\n      33: [2, 58],\n      65: [2, 58],\n      72: [2, 58],\n      75: [2, 58],\n      80: [2, 58],\n      81: [2, 58],\n      82: [2, 58],\n      83: [2, 58],\n      84: [2, 58],\n      85: [2, 58]\n    }, {\n      33: [2, 64],\n      35: 68,\n      65: [2, 64],\n      72: [2, 64],\n      75: [2, 64],\n      80: [2, 64],\n      81: [2, 64],\n      82: [2, 64],\n      83: [2, 64],\n      84: [2, 64],\n      85: [2, 64]\n    }, {\n      21: 69,\n      23: [2, 50],\n      65: [2, 50],\n      72: [2, 50],\n      80: [2, 50],\n      81: [2, 50],\n      82: [2, 50],\n      83: [2, 50],\n      84: [2, 50],\n      85: [2, 50]\n    }, {\n      33: [2, 90],\n      61: 70,\n      65: [2, 90],\n      72: [2, 90],\n      80: [2, 90],\n      81: [2, 90],\n      82: [2, 90],\n      83: [2, 90],\n      84: [2, 90],\n      85: [2, 90]\n    }, {\n      20: 74,\n      33: [2, 80],\n      50: 71,\n      63: 72,\n      64: 75,\n      65: [1, 43],\n      69: 73,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      72: [1, 79]\n    }, {\n      23: [2, 42],\n      33: [2, 42],\n      54: [2, 42],\n      65: [2, 42],\n      68: [2, 42],\n      72: [2, 42],\n      75: [2, 42],\n      80: [2, 42],\n      81: [2, 42],\n      82: [2, 42],\n      83: [2, 42],\n      84: [2, 42],\n      85: [2, 42],\n      87: [1, 50]\n    }, {\n      20: 74,\n      53: 80,\n      54: [2, 84],\n      63: 81,\n      64: 75,\n      65: [1, 43],\n      69: 82,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      26: 83,\n      47: [1, 66]\n    }, {\n      47: [2, 55]\n    }, {\n      4: 84,\n      6: 3,\n      14: [2, 46],\n      15: [2, 46],\n      19: [2, 46],\n      29: [2, 46],\n      34: [2, 46],\n      39: [2, 46],\n      44: [2, 46],\n      47: [2, 46],\n      48: [2, 46],\n      51: [2, 46],\n      55: [2, 46],\n      60: [2, 46]\n    }, {\n      47: [2, 20]\n    }, {\n      20: 85,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      4: 86,\n      6: 3,\n      14: [2, 46],\n      15: [2, 46],\n      19: [2, 46],\n      29: [2, 46],\n      34: [2, 46],\n      47: [2, 46],\n      48: [2, 46],\n      51: [2, 46],\n      55: [2, 46],\n      60: [2, 46]\n    }, {\n      26: 87,\n      47: [1, 66]\n    }, {\n      47: [2, 57]\n    }, {\n      5: [2, 11],\n      14: [2, 11],\n      15: [2, 11],\n      19: [2, 11],\n      29: [2, 11],\n      34: [2, 11],\n      39: [2, 11],\n      44: [2, 11],\n      47: [2, 11],\n      48: [2, 11],\n      51: [2, 11],\n      55: [2, 11],\n      60: [2, 11]\n    }, {\n      15: [2, 49],\n      18: [2, 49]\n    }, {\n      20: 74,\n      33: [2, 88],\n      58: 88,\n      63: 89,\n      64: 75,\n      65: [1, 43],\n      69: 90,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      65: [2, 94],\n      66: 91,\n      68: [2, 94],\n      72: [2, 94],\n      80: [2, 94],\n      81: [2, 94],\n      82: [2, 94],\n      83: [2, 94],\n      84: [2, 94],\n      85: [2, 94]\n    }, {\n      5: [2, 25],\n      14: [2, 25],\n      15: [2, 25],\n      19: [2, 25],\n      29: [2, 25],\n      34: [2, 25],\n      39: [2, 25],\n      44: [2, 25],\n      47: [2, 25],\n      48: [2, 25],\n      51: [2, 25],\n      55: [2, 25],\n      60: [2, 25]\n    }, {\n      20: 92,\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 74,\n      31: 93,\n      33: [2, 60],\n      63: 94,\n      64: 75,\n      65: [1, 43],\n      69: 95,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      75: [2, 60],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 74,\n      33: [2, 66],\n      36: 96,\n      63: 97,\n      64: 75,\n      65: [1, 43],\n      69: 98,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      75: [2, 66],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 74,\n      22: 99,\n      23: [2, 52],\n      63: 100,\n      64: 75,\n      65: [1, 43],\n      69: 101,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      20: 74,\n      33: [2, 92],\n      62: 102,\n      63: 103,\n      64: 75,\n      65: [1, 43],\n      69: 104,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      33: [1, 105]\n    }, {\n      33: [2, 79],\n      65: [2, 79],\n      72: [2, 79],\n      80: [2, 79],\n      81: [2, 79],\n      82: [2, 79],\n      83: [2, 79],\n      84: [2, 79],\n      85: [2, 79]\n    }, {\n      33: [2, 81]\n    }, {\n      23: [2, 27],\n      33: [2, 27],\n      54: [2, 27],\n      65: [2, 27],\n      68: [2, 27],\n      72: [2, 27],\n      75: [2, 27],\n      80: [2, 27],\n      81: [2, 27],\n      82: [2, 27],\n      83: [2, 27],\n      84: [2, 27],\n      85: [2, 27]\n    }, {\n      23: [2, 28],\n      33: [2, 28],\n      54: [2, 28],\n      65: [2, 28],\n      68: [2, 28],\n      72: [2, 28],\n      75: [2, 28],\n      80: [2, 28],\n      81: [2, 28],\n      82: [2, 28],\n      83: [2, 28],\n      84: [2, 28],\n      85: [2, 28]\n    }, {\n      23: [2, 30],\n      33: [2, 30],\n      54: [2, 30],\n      68: [2, 30],\n      71: 106,\n      72: [1, 107],\n      75: [2, 30]\n    }, {\n      23: [2, 98],\n      33: [2, 98],\n      54: [2, 98],\n      68: [2, 98],\n      72: [2, 98],\n      75: [2, 98]\n    }, {\n      23: [2, 45],\n      33: [2, 45],\n      54: [2, 45],\n      65: [2, 45],\n      68: [2, 45],\n      72: [2, 45],\n      73: [1, 108],\n      75: [2, 45],\n      80: [2, 45],\n      81: [2, 45],\n      82: [2, 45],\n      83: [2, 45],\n      84: [2, 45],\n      85: [2, 45],\n      87: [2, 45]\n    }, {\n      23: [2, 44],\n      33: [2, 44],\n      54: [2, 44],\n      65: [2, 44],\n      68: [2, 44],\n      72: [2, 44],\n      75: [2, 44],\n      80: [2, 44],\n      81: [2, 44],\n      82: [2, 44],\n      83: [2, 44],\n      84: [2, 44],\n      85: [2, 44],\n      87: [2, 44]\n    }, {\n      54: [1, 109]\n    }, {\n      54: [2, 83],\n      65: [2, 83],\n      72: [2, 83],\n      80: [2, 83],\n      81: [2, 83],\n      82: [2, 83],\n      83: [2, 83],\n      84: [2, 83],\n      85: [2, 83]\n    }, {\n      54: [2, 85]\n    }, {\n      5: [2, 13],\n      14: [2, 13],\n      15: [2, 13],\n      19: [2, 13],\n      29: [2, 13],\n      34: [2, 13],\n      39: [2, 13],\n      44: [2, 13],\n      47: [2, 13],\n      48: [2, 13],\n      51: [2, 13],\n      55: [2, 13],\n      60: [2, 13]\n    }, {\n      38: 55,\n      39: [1, 57],\n      43: 56,\n      44: [1, 58],\n      45: 111,\n      46: 110,\n      47: [2, 76]\n    }, {\n      33: [2, 70],\n      40: 112,\n      65: [2, 70],\n      72: [2, 70],\n      75: [2, 70],\n      80: [2, 70],\n      81: [2, 70],\n      82: [2, 70],\n      83: [2, 70],\n      84: [2, 70],\n      85: [2, 70]\n    }, {\n      47: [2, 18]\n    }, {\n      5: [2, 14],\n      14: [2, 14],\n      15: [2, 14],\n      19: [2, 14],\n      29: [2, 14],\n      34: [2, 14],\n      39: [2, 14],\n      44: [2, 14],\n      47: [2, 14],\n      48: [2, 14],\n      51: [2, 14],\n      55: [2, 14],\n      60: [2, 14]\n    }, {\n      33: [1, 113]\n    }, {\n      33: [2, 87],\n      65: [2, 87],\n      72: [2, 87],\n      80: [2, 87],\n      81: [2, 87],\n      82: [2, 87],\n      83: [2, 87],\n      84: [2, 87],\n      85: [2, 87]\n    }, {\n      33: [2, 89]\n    }, {\n      20: 74,\n      63: 115,\n      64: 75,\n      65: [1, 43],\n      67: 114,\n      68: [2, 96],\n      69: 116,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      33: [1, 117]\n    }, {\n      32: 118,\n      33: [2, 62],\n      74: 119,\n      75: [1, 120]\n    }, {\n      33: [2, 59],\n      65: [2, 59],\n      72: [2, 59],\n      75: [2, 59],\n      80: [2, 59],\n      81: [2, 59],\n      82: [2, 59],\n      83: [2, 59],\n      84: [2, 59],\n      85: [2, 59]\n    }, {\n      33: [2, 61],\n      75: [2, 61]\n    }, {\n      33: [2, 68],\n      37: 121,\n      74: 122,\n      75: [1, 120]\n    }, {\n      33: [2, 65],\n      65: [2, 65],\n      72: [2, 65],\n      75: [2, 65],\n      80: [2, 65],\n      81: [2, 65],\n      82: [2, 65],\n      83: [2, 65],\n      84: [2, 65],\n      85: [2, 65]\n    }, {\n      33: [2, 67],\n      75: [2, 67]\n    }, {\n      23: [1, 123]\n    }, {\n      23: [2, 51],\n      65: [2, 51],\n      72: [2, 51],\n      80: [2, 51],\n      81: [2, 51],\n      82: [2, 51],\n      83: [2, 51],\n      84: [2, 51],\n      85: [2, 51]\n    }, {\n      23: [2, 53]\n    }, {\n      33: [1, 124]\n    }, {\n      33: [2, 91],\n      65: [2, 91],\n      72: [2, 91],\n      80: [2, 91],\n      81: [2, 91],\n      82: [2, 91],\n      83: [2, 91],\n      84: [2, 91],\n      85: [2, 91]\n    }, {\n      33: [2, 93]\n    }, {\n      5: [2, 22],\n      14: [2, 22],\n      15: [2, 22],\n      19: [2, 22],\n      29: [2, 22],\n      34: [2, 22],\n      39: [2, 22],\n      44: [2, 22],\n      47: [2, 22],\n      48: [2, 22],\n      51: [2, 22],\n      55: [2, 22],\n      60: [2, 22]\n    }, {\n      23: [2, 99],\n      33: [2, 99],\n      54: [2, 99],\n      68: [2, 99],\n      72: [2, 99],\n      75: [2, 99]\n    }, {\n      73: [1, 108]\n    }, {\n      20: 74,\n      63: 125,\n      64: 75,\n      65: [1, 43],\n      72: [1, 35],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      5: [2, 23],\n      14: [2, 23],\n      15: [2, 23],\n      19: [2, 23],\n      29: [2, 23],\n      34: [2, 23],\n      39: [2, 23],\n      44: [2, 23],\n      47: [2, 23],\n      48: [2, 23],\n      51: [2, 23],\n      55: [2, 23],\n      60: [2, 23]\n    }, {\n      47: [2, 19]\n    }, {\n      47: [2, 77]\n    }, {\n      20: 74,\n      33: [2, 72],\n      41: 126,\n      63: 127,\n      64: 75,\n      65: [1, 43],\n      69: 128,\n      70: 76,\n      71: 77,\n      72: [1, 78],\n      75: [2, 72],\n      78: 26,\n      79: 27,\n      80: [1, 28],\n      81: [1, 29],\n      82: [1, 30],\n      83: [1, 31],\n      84: [1, 32],\n      85: [1, 34],\n      86: 33\n    }, {\n      5: [2, 24],\n      14: [2, 24],\n      15: [2, 24],\n      19: [2, 24],\n      29: [2, 24],\n      34: [2, 24],\n      39: [2, 24],\n      44: [2, 24],\n      47: [2, 24],\n      48: [2, 24],\n      51: [2, 24],\n      55: [2, 24],\n      60: [2, 24]\n    }, {\n      68: [1, 129]\n    }, {\n      65: [2, 95],\n      68: [2, 95],\n      72: [2, 95],\n      80: [2, 95],\n      81: [2, 95],\n      82: [2, 95],\n      83: [2, 95],\n      84: [2, 95],\n      85: [2, 95]\n    }, {\n      68: [2, 97]\n    }, {\n      5: [2, 21],\n      14: [2, 21],\n      15: [2, 21],\n      19: [2, 21],\n      29: [2, 21],\n      34: [2, 21],\n      39: [2, 21],\n      44: [2, 21],\n      47: [2, 21],\n      48: [2, 21],\n      51: [2, 21],\n      55: [2, 21],\n      60: [2, 21]\n    }, {\n      33: [1, 130]\n    }, {\n      33: [2, 63]\n    }, {\n      72: [1, 132],\n      76: 131\n    }, {\n      33: [1, 133]\n    }, {\n      33: [2, 69]\n    }, {\n      15: [2, 12],\n      18: [2, 12]\n    }, {\n      14: [2, 26],\n      15: [2, 26],\n      19: [2, 26],\n      29: [2, 26],\n      34: [2, 26],\n      47: [2, 26],\n      48: [2, 26],\n      51: [2, 26],\n      55: [2, 26],\n      60: [2, 26]\n    }, {\n      23: [2, 31],\n      33: [2, 31],\n      54: [2, 31],\n      68: [2, 31],\n      72: [2, 31],\n      75: [2, 31]\n    }, {\n      33: [2, 74],\n      42: 134,\n      74: 135,\n      75: [1, 120]\n    }, {\n      33: [2, 71],\n      65: [2, 71],\n      72: [2, 71],\n      75: [2, 71],\n      80: [2, 71],\n      81: [2, 71],\n      82: [2, 71],\n      83: [2, 71],\n      84: [2, 71],\n      85: [2, 71]\n    }, {\n      33: [2, 73],\n      75: [2, 73]\n    }, {\n      23: [2, 29],\n      33: [2, 29],\n      54: [2, 29],\n      65: [2, 29],\n      68: [2, 29],\n      72: [2, 29],\n      75: [2, 29],\n      80: [2, 29],\n      81: [2, 29],\n      82: [2, 29],\n      83: [2, 29],\n      84: [2, 29],\n      85: [2, 29]\n    }, {\n      14: [2, 15],\n      15: [2, 15],\n      19: [2, 15],\n      29: [2, 15],\n      34: [2, 15],\n      39: [2, 15],\n      44: [2, 15],\n      47: [2, 15],\n      48: [2, 15],\n      51: [2, 15],\n      55: [2, 15],\n      60: [2, 15]\n    }, {\n      72: [1, 137],\n      77: [1, 136]\n    }, {\n      72: [2, 100],\n      77: [2, 100]\n    }, {\n      14: [2, 16],\n      15: [2, 16],\n      19: [2, 16],\n      29: [2, 16],\n      34: [2, 16],\n      44: [2, 16],\n      47: [2, 16],\n      48: [2, 16],\n      51: [2, 16],\n      55: [2, 16],\n      60: [2, 16]\n    }, {\n      33: [1, 138]\n    }, {\n      33: [2, 75]\n    }, {\n      33: [2, 32]\n    }, {\n      72: [2, 101],\n      77: [2, 101]\n    }, {\n      14: [2, 17],\n      15: [2, 17],\n      19: [2, 17],\n      29: [2, 17],\n      34: [2, 17],\n      39: [2, 17],\n      44: [2, 17],\n      47: [2, 17],\n      48: [2, 17],\n      51: [2, 17],\n      55: [2, 17],\n      60: [2, 17]\n    }],\n    defaultActions: {\n      4: [2, 1],\n      54: [2, 55],\n      56: [2, 20],\n      60: [2, 57],\n      73: [2, 81],\n      82: [2, 85],\n      86: [2, 18],\n      90: [2, 89],\n      101: [2, 53],\n      104: [2, 93],\n      110: [2, 19],\n      111: [2, 77],\n      116: [2, 97],\n      119: [2, 63],\n      122: [2, 69],\n      135: [2, 75],\n      136: [2, 32]\n    },\n    parseError: function parseError(str, hash) {\n      throw new Error(str);\n    },\n    parse: function parse(input) {\n      var self = this,\n          stack = [0],\n          vstack = [null],\n          lstack = [],\n          table = this.table,\n          yytext = \"\",\n          yylineno = 0,\n          yyleng = 0,\n          recovering = 0,\n          TERROR = 2,\n          EOF = 1;\n      this.lexer.setInput(input);\n      this.lexer.yy = this.yy;\n      this.yy.lexer = this.lexer;\n      this.yy.parser = this;\n      if (typeof this.lexer.yylloc == \"undefined\") this.lexer.yylloc = {};\n      var yyloc = this.lexer.yylloc;\n      lstack.push(yyloc);\n      var ranges = this.lexer.options && this.lexer.options.ranges;\n      if (typeof this.yy.parseError === \"function\") this.parseError = this.yy.parseError;\n\n      function popStack(n) {\n        stack.length = stack.length - 2 * n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n      }\n\n      function lex() {\n        var token;\n        token = self.lexer.lex() || 1;\n\n        if (typeof token !== \"number\") {\n          token = self.symbols_[token] || token;\n        }\n\n        return token;\n      }\n\n      var symbol,\n          preErrorSymbol,\n          state,\n          action,\n          a,\n          r,\n          yyval = {},\n          p,\n          len,\n          newState,\n          expected;\n\n      while (true) {\n        state = stack[stack.length - 1];\n\n        if (this.defaultActions[state]) {\n          action = this.defaultActions[state];\n        } else {\n          if (symbol === null || typeof symbol == \"undefined\") {\n            symbol = lex();\n          }\n\n          action = table[state] && table[state][symbol];\n        }\n\n        if (typeof action === \"undefined\" || !action.length || !action[0]) {\n          var errStr = \"\";\n\n          if (!recovering) {\n            expected = [];\n\n            for (p in table[state]) {\n              if (this.terminals_[p] && p > 2) {\n                expected.push(\"'\" + this.terminals_[p] + \"'\");\n              }\n            }\n\n            if (this.lexer.showPosition) {\n              errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + expected.join(\", \") + \", got '\" + (this.terminals_[symbol] || symbol) + \"'\";\n            } else {\n              errStr = \"Parse error on line \" + (yylineno + 1) + \": Unexpected \" + (symbol == 1 ? \"end of input\" : \"'\" + (this.terminals_[symbol] || symbol) + \"'\");\n            }\n\n            this.parseError(errStr, {\n              text: this.lexer.match,\n              token: this.terminals_[symbol] || symbol,\n              line: this.lexer.yylineno,\n              loc: yyloc,\n              expected: expected\n            });\n          }\n        }\n\n        if (action[0] instanceof Array && action.length > 1) {\n          throw new Error(\"Parse Error: multiple actions possible at state: \" + state + \", token: \" + symbol);\n        }\n\n        switch (action[0]) {\n          case 1:\n            stack.push(symbol);\n            vstack.push(this.lexer.yytext);\n            lstack.push(this.lexer.yylloc);\n            stack.push(action[1]);\n            symbol = null;\n\n            if (!preErrorSymbol) {\n              yyleng = this.lexer.yyleng;\n              yytext = this.lexer.yytext;\n              yylineno = this.lexer.yylineno;\n              yyloc = this.lexer.yylloc;\n              if (recovering > 0) recovering--;\n            } else {\n              symbol = preErrorSymbol;\n              preErrorSymbol = null;\n            }\n\n            break;\n\n          case 2:\n            len = this.productions_[action[1]][1];\n            yyval.$ = vstack[vstack.length - len];\n            yyval._$ = {\n              first_line: lstack[lstack.length - (len || 1)].first_line,\n              last_line: lstack[lstack.length - 1].last_line,\n              first_column: lstack[lstack.length - (len || 1)].first_column,\n              last_column: lstack[lstack.length - 1].last_column\n            };\n\n            if (ranges) {\n              yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n            }\n\n            r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n\n            if (typeof r !== \"undefined\") {\n              return r;\n            }\n\n            if (len) {\n              stack = stack.slice(0, -1 * len * 2);\n              vstack = vstack.slice(0, -1 * len);\n              lstack = lstack.slice(0, -1 * len);\n            }\n\n            stack.push(this.productions_[action[1]][0]);\n            vstack.push(yyval.$);\n            lstack.push(yyval._$);\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n            stack.push(newState);\n            break;\n\n          case 3:\n            return true;\n        }\n      }\n\n      return true;\n    }\n  };\n  /* Jison generated lexer */\n\n  var lexer = function () {\n    var lexer = {\n      EOF: 1,\n      parseError: function parseError(str, hash) {\n        if (this.yy.parser) {\n          this.yy.parser.parseError(str, hash);\n        } else {\n          throw new Error(str);\n        }\n      },\n      setInput: function setInput(input) {\n        this._input = input;\n        this._more = this._less = this.done = false;\n        this.yylineno = this.yyleng = 0;\n        this.yytext = this.matched = this.match = '';\n        this.conditionStack = ['INITIAL'];\n        this.yylloc = {\n          first_line: 1,\n          first_column: 0,\n          last_line: 1,\n          last_column: 0\n        };\n        if (this.options.ranges) this.yylloc.range = [0, 0];\n        this.offset = 0;\n        return this;\n      },\n      input: function input() {\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n\n        if (lines) {\n          this.yylineno++;\n          this.yylloc.last_line++;\n        } else {\n          this.yylloc.last_column++;\n        }\n\n        if (this.options.ranges) this.yylloc.range[1]++;\n        this._input = this._input.slice(1);\n        return ch;\n      },\n      unput: function unput(ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); //this.yyleng -= len;\n\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - 1);\n        this.matched = this.matched.substr(0, this.matched.length - 1);\n        if (lines.length - 1) this.yylineno -= lines.length - 1;\n        var r = this.yylloc.range;\n        this.yylloc = {\n          first_line: this.yylloc.first_line,\n          last_line: this.yylineno + 1,\n          first_column: this.yylloc.first_column,\n          last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\n        };\n\n        if (this.options.ranges) {\n          this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n        }\n\n        return this;\n      },\n      more: function more() {\n        this._more = true;\n        return this;\n      },\n      less: function less(n) {\n        this.unput(this.match.slice(n));\n      },\n      pastInput: function pastInput() {\n        var past = this.matched.substr(0, this.matched.length - this.match.length);\n        return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\\n/g, \"\");\n      },\n      upcomingInput: function upcomingInput() {\n        var next = this.match;\n\n        if (next.length < 20) {\n          next += this._input.substr(0, 20 - next.length);\n        }\n\n        return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n      },\n      showPosition: function showPosition() {\n        var pre = this.pastInput();\n        var c = new Array(pre.length + 1).join(\"-\");\n        return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n      },\n      next: function next() {\n        if (this.done) {\n          return this.EOF;\n        }\n\n        if (!this._input) this.done = true;\n        var token, match, tempMatch, index, col, lines;\n\n        if (!this._more) {\n          this.yytext = '';\n          this.match = '';\n        }\n\n        var rules = this._currentRules();\n\n        for (var i = 0; i < rules.length; i++) {\n          tempMatch = this._input.match(this.rules[rules[i]]);\n\n          if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n            match = tempMatch;\n            index = i;\n            if (!this.options.flex) break;\n          }\n        }\n\n        if (match) {\n          lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n          if (lines) this.yylineno += lines.length;\n          this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : this.yylloc.last_column + match[0].length\n          };\n          this.yytext += match[0];\n          this.match += match[0];\n          this.matches = match;\n          this.yyleng = this.yytext.length;\n\n          if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset += this.yyleng];\n          }\n\n          this._more = false;\n          this._input = this._input.slice(match[0].length);\n          this.matched += match[0];\n          token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);\n          if (this.done && this._input) this.done = false;\n          if (token) return token;else return;\n        }\n\n        if (this._input === \"\") {\n          return this.EOF;\n        } else {\n          return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n            text: \"\",\n            token: null,\n            line: this.yylineno\n          });\n        }\n      },\n      lex: function lex() {\n        var r = this.next();\n\n        if (typeof r !== 'undefined') {\n          return r;\n        } else {\n          return this.lex();\n        }\n      },\n      begin: function begin(condition) {\n        this.conditionStack.push(condition);\n      },\n      popState: function popState() {\n        return this.conditionStack.pop();\n      },\n      _currentRules: function _currentRules() {\n        return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n      },\n      topState: function topState() {\n        return this.conditionStack[this.conditionStack.length - 2];\n      },\n      pushState: function begin(condition) {\n        this.begin(condition);\n      }\n    };\n    lexer.options = {};\n\n    lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n      function strip(start, end) {\n        return yy_.yytext = yy_.yytext.substring(start, yy_.yyleng - end + start);\n      }\n\n      var YYSTATE = YY_START;\n\n      switch ($avoiding_name_collisions) {\n        case 0:\n          if (yy_.yytext.slice(-2) === \"\\\\\\\\\") {\n            strip(0, 1);\n            this.begin(\"mu\");\n          } else if (yy_.yytext.slice(-1) === \"\\\\\") {\n            strip(0, 1);\n            this.begin(\"emu\");\n          } else {\n            this.begin(\"mu\");\n          }\n\n          if (yy_.yytext) return 15;\n          break;\n\n        case 1:\n          return 15;\n          break;\n\n        case 2:\n          this.popState();\n          return 15;\n          break;\n\n        case 3:\n          this.begin('raw');\n          return 15;\n          break;\n\n        case 4:\n          this.popState(); // Should be using `this.topState()` below, but it currently\n          // returns the second top instead of the first top. Opened an\n          // issue about it at https://github.com/zaach/jison/issues/291\n\n          if (this.conditionStack[this.conditionStack.length - 1] === 'raw') {\n            return 15;\n          } else {\n            strip(5, 9);\n            return 'END_RAW_BLOCK';\n          }\n\n          break;\n\n        case 5:\n          return 15;\n          break;\n\n        case 6:\n          this.popState();\n          return 14;\n          break;\n\n        case 7:\n          return 65;\n          break;\n\n        case 8:\n          return 68;\n          break;\n\n        case 9:\n          return 19;\n          break;\n\n        case 10:\n          this.popState();\n          this.begin('raw');\n          return 23;\n          break;\n\n        case 11:\n          return 55;\n          break;\n\n        case 12:\n          return 60;\n          break;\n\n        case 13:\n          return 29;\n          break;\n\n        case 14:\n          return 47;\n          break;\n\n        case 15:\n          this.popState();\n          return 44;\n          break;\n\n        case 16:\n          this.popState();\n          return 44;\n          break;\n\n        case 17:\n          return 34;\n          break;\n\n        case 18:\n          return 39;\n          break;\n\n        case 19:\n          return 51;\n          break;\n\n        case 20:\n          return 48;\n          break;\n\n        case 21:\n          this.unput(yy_.yytext);\n          this.popState();\n          this.begin('com');\n          break;\n\n        case 22:\n          this.popState();\n          return 14;\n          break;\n\n        case 23:\n          return 48;\n          break;\n\n        case 24:\n          return 73;\n          break;\n\n        case 25:\n          return 72;\n          break;\n\n        case 26:\n          return 72;\n          break;\n\n        case 27:\n          return 87;\n          break;\n\n        case 28:\n          // ignore whitespace\n          break;\n\n        case 29:\n          this.popState();\n          return 54;\n          break;\n\n        case 30:\n          this.popState();\n          return 33;\n          break;\n\n        case 31:\n          yy_.yytext = strip(1, 2).replace(/\\\\\"/g, '\"');\n          return 80;\n          break;\n\n        case 32:\n          yy_.yytext = strip(1, 2).replace(/\\\\'/g, \"'\");\n          return 80;\n          break;\n\n        case 33:\n          return 85;\n          break;\n\n        case 34:\n          return 82;\n          break;\n\n        case 35:\n          return 82;\n          break;\n\n        case 36:\n          return 83;\n          break;\n\n        case 37:\n          return 84;\n          break;\n\n        case 38:\n          return 81;\n          break;\n\n        case 39:\n          return 75;\n          break;\n\n        case 40:\n          return 77;\n          break;\n\n        case 41:\n          return 72;\n          break;\n\n        case 42:\n          yy_.yytext = yy_.yytext.replace(/\\\\([\\\\\\]])/g, '$1');\n          return 72;\n          break;\n\n        case 43:\n          return 'INVALID';\n          break;\n\n        case 44:\n          return 5;\n          break;\n      }\n    };\n\n    lexer.rules = [/^(?:[^\\x00]*?(?=(\\{\\{)))/, /^(?:[^\\x00]+)/, /^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/, /^(?:\\{\\{\\{\\{(?=[^\\/]))/, /^(?:\\{\\{\\{\\{\\/[^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/, /^(?:[^\\x00]+?(?=(\\{\\{\\{\\{)))/, /^(?:[\\s\\S]*?--(~)?\\}\\})/, /^(?:\\()/, /^(?:\\))/, /^(?:\\{\\{\\{\\{)/, /^(?:\\}\\}\\}\\})/, /^(?:\\{\\{(~)?>)/, /^(?:\\{\\{(~)?#>)/, /^(?:\\{\\{(~)?#\\*?)/, /^(?:\\{\\{(~)?\\/)/, /^(?:\\{\\{(~)?\\^\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\s*else\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\^)/, /^(?:\\{\\{(~)?\\s*else\\b)/, /^(?:\\{\\{(~)?\\{)/, /^(?:\\{\\{(~)?&)/, /^(?:\\{\\{(~)?!--)/, /^(?:\\{\\{(~)?![\\s\\S]*?\\}\\})/, /^(?:\\{\\{(~)?\\*?)/, /^(?:=)/, /^(?:\\.\\.)/, /^(?:\\.(?=([=~}\\s\\/.)|])))/, /^(?:[\\/.])/, /^(?:\\s+)/, /^(?:\\}(~)?\\}\\})/, /^(?:(~)?\\}\\})/, /^(?:\"(\\\\[\"]|[^\"])*\")/, /^(?:'(\\\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\\s)])))/, /^(?:false(?=([~}\\s)])))/, /^(?:undefined(?=([~}\\s)])))/, /^(?:null(?=([~}\\s)])))/, /^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/, /^(?:as\\s+\\|)/, /^(?:\\|)/, /^(?:([^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)|]))))/, /^(?:\\[(\\\\\\]|[^\\]])*\\])/, /^(?:.)/, /^(?:$)/];\n    lexer.conditions = {\n      \"mu\": {\n        \"rules\": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44],\n        \"inclusive\": false\n      },\n      \"emu\": {\n        \"rules\": [2],\n        \"inclusive\": false\n      },\n      \"com\": {\n        \"rules\": [6],\n        \"inclusive\": false\n      },\n      \"raw\": {\n        \"rules\": [3, 4, 5],\n        \"inclusive\": false\n      },\n      \"INITIAL\": {\n        \"rules\": [0, 1, 44],\n        \"inclusive\": true\n      }\n    };\n    return lexer;\n  }();\n\n  parser.lexer = lexer;\n\n  function Parser() {\n    this.yy = {};\n  }\n\n  Parser.prototype = parser;\n  parser.Parser = Parser;\n  return new Parser();\n}();\n\nexports[\"default\"] = handlebars;\nmodule.exports = exports[\"default\"];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js":
/*!*************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nfunction Visitor() {\n  this.parents = [];\n}\n\nVisitor.prototype = {\n  constructor: Visitor,\n  mutating: false,\n  // Visits a given value. If mutating, will replace the value if necessary.\n  acceptKey: function acceptKey(node, name) {\n    var value = this.accept(node[name]);\n\n    if (this.mutating) {\n      // Hacky sanity check: This may have a few false positives for type for the helper\n      // methods but will generally do the right thing without a lot of overhead.\n      if (value && !Visitor.prototype[value.type]) {\n        throw new _exception2['default']('Unexpected node type \"' + value.type + '\" found when accepting ' + name + ' on ' + node.type);\n      }\n\n      node[name] = value;\n    }\n  },\n  // Performs an accept operation with added sanity check to ensure\n  // required keys are not removed.\n  acceptRequired: function acceptRequired(node, name) {\n    this.acceptKey(node, name);\n\n    if (!node[name]) {\n      throw new _exception2['default'](node.type + ' requires ' + name);\n    }\n  },\n  // Traverses a given array. If mutating, empty respnses will be removed\n  // for child elements.\n  acceptArray: function acceptArray(array) {\n    for (var i = 0, l = array.length; i < l; i++) {\n      this.acceptKey(array, i);\n\n      if (!array[i]) {\n        array.splice(i, 1);\n        i--;\n        l--;\n      }\n    }\n  },\n  accept: function accept(object) {\n    if (!object) {\n      return;\n    }\n    /* istanbul ignore next: Sanity code */\n\n\n    if (!this[object.type]) {\n      throw new _exception2['default']('Unknown type: ' + object.type, object);\n    }\n\n    if (this.current) {\n      this.parents.unshift(this.current);\n    }\n\n    this.current = object;\n    var ret = this[object.type](object);\n    this.current = this.parents.shift();\n\n    if (!this.mutating || ret) {\n      return ret;\n    } else if (ret !== false) {\n      return object;\n    }\n  },\n  Program: function Program(program) {\n    this.acceptArray(program.body);\n  },\n  MustacheStatement: visitSubExpression,\n  Decorator: visitSubExpression,\n  BlockStatement: visitBlock,\n  DecoratorBlock: visitBlock,\n  PartialStatement: visitPartial,\n  PartialBlockStatement: function PartialBlockStatement(partial) {\n    visitPartial.call(this, partial);\n    this.acceptKey(partial, 'program');\n  },\n  ContentStatement: function ContentStatement()\n  /* content */\n  {},\n  CommentStatement: function CommentStatement()\n  /* comment */\n  {},\n  SubExpression: visitSubExpression,\n  PathExpression: function PathExpression()\n  /* path */\n  {},\n  StringLiteral: function StringLiteral()\n  /* string */\n  {},\n  NumberLiteral: function NumberLiteral()\n  /* number */\n  {},\n  BooleanLiteral: function BooleanLiteral()\n  /* bool */\n  {},\n  UndefinedLiteral: function UndefinedLiteral()\n  /* literal */\n  {},\n  NullLiteral: function NullLiteral()\n  /* literal */\n  {},\n  Hash: function Hash(hash) {\n    this.acceptArray(hash.pairs);\n  },\n  HashPair: function HashPair(pair) {\n    this.acceptRequired(pair, 'value');\n  }\n};\n\nfunction visitSubExpression(mustache) {\n  this.acceptRequired(mustache, 'path');\n  this.acceptArray(mustache.params);\n  this.acceptKey(mustache, 'hash');\n}\n\nfunction visitBlock(block) {\n  visitSubExpression.call(this, block);\n  this.acceptKey(block, 'program');\n  this.acceptKey(block, 'inverse');\n}\n\nfunction visitPartial(partial) {\n  this.acceptRequired(partial, 'name');\n  this.acceptArray(partial.params);\n  this.acceptKey(partial, 'hash');\n}\n\nexports['default'] = Visitor;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js":
/*!************************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js ***!
  \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _visitor = __webpack_require__(/*! ./visitor */ \"./node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js\");\n\nvar _visitor2 = _interopRequireDefault(_visitor);\n\nfunction WhitespaceControl() {\n  var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n  this.options = options;\n}\n\nWhitespaceControl.prototype = new _visitor2['default']();\n\nWhitespaceControl.prototype.Program = function (program) {\n  var doStandalone = !this.options.ignoreStandalone;\n  var isRoot = !this.isRootSeen;\n  this.isRootSeen = true;\n  var body = program.body;\n\n  for (var i = 0, l = body.length; i < l; i++) {\n    var current = body[i],\n        strip = this.accept(current);\n\n    if (!strip) {\n      continue;\n    }\n\n    var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),\n        _isNextWhitespace = isNextWhitespace(body, i, isRoot),\n        openStandalone = strip.openStandalone && _isPrevWhitespace,\n        closeStandalone = strip.closeStandalone && _isNextWhitespace,\n        inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;\n\n    if (strip.close) {\n      omitRight(body, i, true);\n    }\n\n    if (strip.open) {\n      omitLeft(body, i, true);\n    }\n\n    if (doStandalone && inlineStandalone) {\n      omitRight(body, i);\n\n      if (omitLeft(body, i)) {\n        // If we are on a standalone node, save the indent info for partials\n        if (current.type === 'PartialStatement') {\n          // Pull out the whitespace from the final line\n          current.indent = /([ \\t]+$)/.exec(body[i - 1].original)[1];\n        }\n      }\n    }\n\n    if (doStandalone && openStandalone) {\n      omitRight((current.program || current.inverse).body); // Strip out the previous content node if it's whitespace only\n\n      omitLeft(body, i);\n    }\n\n    if (doStandalone && closeStandalone) {\n      // Always strip the next node\n      omitRight(body, i);\n      omitLeft((current.inverse || current.program).body);\n    }\n  }\n\n  return program;\n};\n\nWhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) {\n  this.accept(block.program);\n  this.accept(block.inverse); // Find the inverse program that is involed with whitespace stripping.\n\n  var program = block.program || block.inverse,\n      inverse = block.program && block.inverse,\n      firstInverse = inverse,\n      lastInverse = inverse;\n\n  if (inverse && inverse.chained) {\n    firstInverse = inverse.body[0].program; // Walk the inverse chain to find the last inverse that is actually in the chain.\n\n    while (lastInverse.chained) {\n      lastInverse = lastInverse.body[lastInverse.body.length - 1].program;\n    }\n  }\n\n  var strip = {\n    open: block.openStrip.open,\n    close: block.closeStrip.close,\n    // Determine the standalone candiacy. Basically flag our content as being possibly standalone\n    // so our parent can determine if we actually are standalone\n    openStandalone: isNextWhitespace(program.body),\n    closeStandalone: isPrevWhitespace((firstInverse || program).body)\n  };\n\n  if (block.openStrip.close) {\n    omitRight(program.body, null, true);\n  }\n\n  if (inverse) {\n    var inverseStrip = block.inverseStrip;\n\n    if (inverseStrip.open) {\n      omitLeft(program.body, null, true);\n    }\n\n    if (inverseStrip.close) {\n      omitRight(firstInverse.body, null, true);\n    }\n\n    if (block.closeStrip.open) {\n      omitLeft(lastInverse.body, null, true);\n    } // Find standalone else statments\n\n\n    if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {\n      omitLeft(program.body);\n      omitRight(firstInverse.body);\n    }\n  } else if (block.closeStrip.open) {\n    omitLeft(program.body, null, true);\n  }\n\n  return strip;\n};\n\nWhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) {\n  return mustache.strip;\n};\n\nWhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {\n  /* istanbul ignore next */\n  var strip = node.strip || {};\n  return {\n    inlineStandalone: true,\n    open: strip.open,\n    close: strip.close\n  };\n};\n\nfunction isPrevWhitespace(body, i, isRoot) {\n  if (i === undefined) {\n    i = body.length;\n  } // Nodes that end with newlines are considered whitespace (but are special\n  // cased for strip operations)\n\n\n  var prev = body[i - 1],\n      sibling = body[i - 2];\n\n  if (!prev) {\n    return isRoot;\n  }\n\n  if (prev.type === 'ContentStatement') {\n    return (sibling || !isRoot ? /\\r?\\n\\s*?$/ : /(^|\\r?\\n)\\s*?$/).test(prev.original);\n  }\n}\n\nfunction isNextWhitespace(body, i, isRoot) {\n  if (i === undefined) {\n    i = -1;\n  }\n\n  var next = body[i + 1],\n      sibling = body[i + 2];\n\n  if (!next) {\n    return isRoot;\n  }\n\n  if (next.type === 'ContentStatement') {\n    return (sibling || !isRoot ? /^\\s*?\\r?\\n/ : /^\\s*?(\\r?\\n|$)/).test(next.original);\n  }\n} // Marks the node to the right of the position as omitted.\n// I.e. {{foo}}' ' will mark the ' ' node as omitted.\n//\n// If i is undefined, then the first child will be marked as such.\n//\n// If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n// content is met.\n\n\nfunction omitRight(body, i, multiple) {\n  var current = body[i == null ? 0 : i + 1];\n\n  if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {\n    return;\n  }\n\n  var original = current.value;\n  current.value = current.value.replace(multiple ? /^\\s+/ : /^[ \\t]*\\r?\\n?/, '');\n  current.rightStripped = current.value !== original;\n} // Marks the node to the left of the position as omitted.\n// I.e. ' '{{foo}} will mark the ' ' node as omitted.\n//\n// If i is undefined then the last child will be marked as such.\n//\n// If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n// content is met.\n\n\nfunction omitLeft(body, i, multiple) {\n  var current = body[i == null ? body.length - 1 : i - 1];\n\n  if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {\n    return;\n  } // We omit the last node if it's whitespace only and not preceded by a non-content node.\n\n\n  var original = current.value;\n  current.value = current.value.replace(multiple ? /\\s+$/ : /[ \\t]+$/, '');\n  current.leftStripped = current.value !== original;\n  return current.leftStripped;\n}\n\nexports['default'] = WhitespaceControl;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/decorators.js":
/*!*******************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/decorators.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.registerDefaultDecorators = registerDefaultDecorators; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _decoratorsInline = __webpack_require__(/*! ./decorators/inline */ \"./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js\");\n\nvar _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);\n\nfunction registerDefaultDecorators(instance) {\n  _decoratorsInline2['default'](instance);\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/decorators.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js":
/*!**************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nexports['default'] = function (instance) {\n  instance.registerDecorator('inline', function (fn, props, container, options) {\n    var ret = fn;\n\n    if (!props.partials) {\n      props.partials = {};\n\n      ret = function ret(context, options) {\n        // Create a new partials stack frame prior to exec.\n        var original = container.partials;\n        container.partials = _utils.extend({}, original, props.partials);\n        var ret = fn(context, options);\n        container.partials = original;\n        return ret;\n      };\n    }\n\n    props.partials[options.args[0]] = options.fn;\n    return ret;\n  });\n};\n\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/exception.js":
/*!******************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/exception.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nvar errorProps = ['description', 'fileName', 'lineNumber', 'endLineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n  var loc = node && node.loc,\n      line = undefined,\n      endLineNumber = undefined,\n      column = undefined,\n      endColumn = undefined;\n\n  if (loc) {\n    line = loc.start.line;\n    endLineNumber = loc.end.line;\n    column = loc.start.column;\n    endColumn = loc.end.column;\n    message += ' - ' + line + ':' + column;\n  }\n\n  var tmp = Error.prototype.constructor.call(this, message); // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n\n  for (var idx = 0; idx < errorProps.length; idx++) {\n    this[errorProps[idx]] = tmp[errorProps[idx]];\n  }\n  /* istanbul ignore else */\n\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, Exception);\n  }\n\n  try {\n    if (loc) {\n      this.lineNumber = line;\n      this.endLineNumber = endLineNumber; // Work around issue under safari where we can't directly set the column value\n\n      /* istanbul ignore next */\n\n      if (Object.defineProperty) {\n        Object.defineProperty(this, 'column', {\n          value: column,\n          enumerable: true\n        });\n        Object.defineProperty(this, 'endColumn', {\n          value: endColumn,\n          enumerable: true\n        });\n      } else {\n        this.column = column;\n        this.endColumn = endColumn;\n      }\n    }\n  } catch (nop) {\n    /* Ignore if the browser is very particular */\n  }\n}\n\nException.prototype = new Error();\nexports['default'] = Exception;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/exception.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers.js":
/*!****************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.registerDefaultHelpers = registerDefaultHelpers;\nexports.moveHelperToHooks = moveHelperToHooks; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _helpersBlockHelperMissing = __webpack_require__(/*! ./helpers/block-helper-missing */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js\");\n\nvar _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);\n\nvar _helpersEach = __webpack_require__(/*! ./helpers/each */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js\");\n\nvar _helpersEach2 = _interopRequireDefault(_helpersEach);\n\nvar _helpersHelperMissing = __webpack_require__(/*! ./helpers/helper-missing */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js\");\n\nvar _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);\n\nvar _helpersIf = __webpack_require__(/*! ./helpers/if */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js\");\n\nvar _helpersIf2 = _interopRequireDefault(_helpersIf);\n\nvar _helpersLog = __webpack_require__(/*! ./helpers/log */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js\");\n\nvar _helpersLog2 = _interopRequireDefault(_helpersLog);\n\nvar _helpersLookup = __webpack_require__(/*! ./helpers/lookup */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js\");\n\nvar _helpersLookup2 = _interopRequireDefault(_helpersLookup);\n\nvar _helpersWith = __webpack_require__(/*! ./helpers/with */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js\");\n\nvar _helpersWith2 = _interopRequireDefault(_helpersWith);\n\nfunction registerDefaultHelpers(instance) {\n  _helpersBlockHelperMissing2['default'](instance);\n\n  _helpersEach2['default'](instance);\n\n  _helpersHelperMissing2['default'](instance);\n\n  _helpersIf2['default'](instance);\n\n  _helpersLog2['default'](instance);\n\n  _helpersLookup2['default'](instance);\n\n  _helpersWith2['default'](instance);\n}\n\nfunction moveHelperToHooks(instance, helperName, keepHelper) {\n  if (instance.helpers[helperName]) {\n    instance.hooks[helperName] = instance.helpers[helperName];\n\n    if (!keepHelper) {\n      delete instance.helpers[helperName];\n    }\n  }\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js":
/*!*************************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js ***!
  \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nexports['default'] = function (instance) {\n  instance.registerHelper('blockHelperMissing', function (context, options) {\n    var inverse = options.inverse,\n        fn = options.fn;\n\n    if (context === true) {\n      return fn(this);\n    } else if (context === false || context == null) {\n      return inverse(this);\n    } else if (_utils.isArray(context)) {\n      if (context.length > 0) {\n        if (options.ids) {\n          options.ids = [options.name];\n        }\n\n        return instance.helpers.each(context, options);\n      } else {\n        return inverse(this);\n      }\n    } else {\n      if (options.data && options.ids) {\n        var data = _utils.createFrame(options.data);\n\n        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);\n        options = {\n          data: data\n        };\n      }\n\n      return fn(context, options);\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js":
/*!*********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('each', function (context, options) {\n    if (!options) {\n      throw new _exception2['default']('Must pass iterator to #each');\n    }\n\n    var fn = options.fn,\n        inverse = options.inverse,\n        i = 0,\n        ret = '',\n        data = undefined,\n        contextPath = undefined;\n\n    if (options.data && options.ids) {\n      contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n    }\n\n    if (_utils.isFunction(context)) {\n      context = context.call(this);\n    }\n\n    if (options.data) {\n      data = _utils.createFrame(options.data);\n    }\n\n    function execIteration(field, index, last) {\n      if (data) {\n        data.key = field;\n        data.index = index;\n        data.first = index === 0;\n        data.last = !!last;\n\n        if (contextPath) {\n          data.contextPath = contextPath + field;\n        }\n      }\n\n      ret = ret + fn(context[field], {\n        data: data,\n        blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])\n      });\n    }\n\n    if (context && _typeof(context) === 'object') {\n      if (_utils.isArray(context)) {\n        for (var j = context.length; i < j; i++) {\n          if (i in context) {\n            execIteration(i, i, i === context.length - 1);\n          }\n        }\n      } else if (global.Symbol && context[global.Symbol.iterator]) {\n        var newContext = [];\n        var iterator = context[global.Symbol.iterator]();\n\n        for (var it = iterator.next(); !it.done; it = iterator.next()) {\n          newContext.push(it.value);\n        }\n\n        context = newContext;\n\n        for (var j = context.length; i < j; i++) {\n          execIteration(i, i, i === context.length - 1);\n        }\n      } else {\n        (function () {\n          var priorKey = undefined;\n          Object.keys(context).forEach(function (key) {\n            // We're running the iterations one step out of sync so we can detect\n            // the last iteration without have to scan the object twice and create\n            // an itermediate keys array.\n            if (priorKey !== undefined) {\n              execIteration(priorKey, i - 1);\n            }\n\n            priorKey = key;\n            i++;\n          });\n\n          if (priorKey !== undefined) {\n            execIteration(priorKey, i - 1, true);\n          }\n        })();\n      }\n    }\n\n    if (i === 0) {\n      ret = inverse(this);\n    }\n\n    return ret;\n  });\n};\n\nmodule.exports = exports['default'];\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js":
/*!*******************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js ***!
  \*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('helperMissing', function ()\n  /* [args, ]options */\n  {\n    if (arguments.length === 1) {\n      // A missing field in a {{foo}} construct.\n      return undefined;\n    } else {\n      // Someone is actually trying to call something, blow up.\n      throw new _exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js":
/*!*******************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('if', function (conditional, options) {\n    if (arguments.length != 2) {\n      throw new _exception2['default']('#if requires exactly one argument');\n    }\n\n    if (_utils.isFunction(conditional)) {\n      conditional = conditional.call(this);\n    } // Default behavior is to render the positive path if the value is truthy and not empty.\n    // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n    // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n\n\n    if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {\n      return options.inverse(this);\n    } else {\n      return options.fn(this);\n    }\n  });\n  instance.registerHelper('unless', function (conditional, options) {\n    if (arguments.length != 2) {\n      throw new _exception2['default']('#unless requires exactly one argument');\n    }\n\n    return instance.helpers['if'].call(this, conditional, {\n      fn: options.inverse,\n      inverse: options.fn,\n      hash: options.hash\n    });\n  });\n};\n\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js":
/*!********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n  instance.registerHelper('log', function ()\n  /* message, options */\n  {\n    var args = [undefined],\n        options = arguments[arguments.length - 1];\n\n    for (var i = 0; i < arguments.length - 1; i++) {\n      args.push(arguments[i]);\n    }\n\n    var level = 1;\n\n    if (options.hash.level != null) {\n      level = options.hash.level;\n    } else if (options.data && options.data.level != null) {\n      level = options.data.level;\n    }\n\n    args[0] = level;\n    instance.log.apply(instance, args);\n  });\n};\n\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js":
/*!***********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n  instance.registerHelper('lookup', function (obj, field, options) {\n    if (!obj) {\n      // Note for 5.0: Change to \"obj == null\" in 5.0\n      return obj;\n    }\n\n    return options.lookupProperty(obj, field);\n  });\n};\n\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js":
/*!*********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n}\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar _exception = __webpack_require__(/*! ../exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('with', function (context, options) {\n    if (arguments.length != 2) {\n      throw new _exception2['default']('#with requires exactly one argument');\n    }\n\n    if (_utils.isFunction(context)) {\n      context = context.call(this);\n    }\n\n    var fn = options.fn;\n\n    if (!_utils.isEmpty(context)) {\n      var data = options.data;\n\n      if (options.data && options.ids) {\n        data = _utils.createFrame(options.data);\n        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);\n      }\n\n      return fn(context, {\n        data: data,\n        blockParams: _utils.blockParams([context], [data && data.contextPath])\n      });\n    } else {\n      return options.inverse(this);\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/internal/create-new-lookup-object.js":
/*!******************************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/internal/create-new-lookup-object.js ***!
  \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.createNewLookupObject = createNewLookupObject;\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n/**\n * Create a new object with \"null\"-prototype to avoid truthy results on prototype properties.\n * The resulting object can be used with \"object[property]\" to check if a property exists\n * @param {...object} sources a varargs parameter of source objects that will be merged\n * @returns {object}\n */\n\n\nfunction createNewLookupObject() {\n  for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) {\n    sources[_key] = arguments[_key];\n  }\n\n  return _utils.extend.apply(undefined, [Object.create(null)].concat(sources));\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/internal/create-new-lookup-object.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js":
/*!******************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js ***!
  \******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.createProtoAccessControl = createProtoAccessControl;\nexports.resultIsAllowed = resultIsAllowed;\nexports.resetLoggedProperties = resetLoggedProperties; // istanbul ignore next\n\nfunction _interopRequireWildcard(obj) {\n  if (obj && obj.__esModule) {\n    return obj;\n  } else {\n    var newObj = {};\n\n    if (obj != null) {\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n      }\n    }\n\n    newObj['default'] = obj;\n    return newObj;\n  }\n}\n\nvar _createNewLookupObject = __webpack_require__(/*! ./create-new-lookup-object */ \"./node_modules/handlebars/dist/cjs/handlebars/internal/create-new-lookup-object.js\");\n\nvar _logger = __webpack_require__(/*! ../logger */ \"./node_modules/handlebars/dist/cjs/handlebars/logger.js\");\n\nvar logger = _interopRequireWildcard(_logger);\n\nvar loggedProperties = Object.create(null);\n\nfunction createProtoAccessControl(runtimeOptions) {\n  var defaultMethodWhiteList = Object.create(null);\n  defaultMethodWhiteList['constructor'] = false;\n  defaultMethodWhiteList['__defineGetter__'] = false;\n  defaultMethodWhiteList['__defineSetter__'] = false;\n  defaultMethodWhiteList['__lookupGetter__'] = false;\n  var defaultPropertyWhiteList = Object.create(null); // eslint-disable-next-line no-proto\n\n  defaultPropertyWhiteList['__proto__'] = false;\n  return {\n    properties: {\n      whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties),\n      defaultValue: runtimeOptions.allowProtoPropertiesByDefault\n    },\n    methods: {\n      whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods),\n      defaultValue: runtimeOptions.allowProtoMethodsByDefault\n    }\n  };\n}\n\nfunction resultIsAllowed(result, protoAccessControl, propertyName) {\n  if (typeof result === 'function') {\n    return checkWhiteList(protoAccessControl.methods, propertyName);\n  } else {\n    return checkWhiteList(protoAccessControl.properties, propertyName);\n  }\n}\n\nfunction checkWhiteList(protoAccessControlForType, propertyName) {\n  if (protoAccessControlForType.whitelist[propertyName] !== undefined) {\n    return protoAccessControlForType.whitelist[propertyName] === true;\n  }\n\n  if (protoAccessControlForType.defaultValue !== undefined) {\n    return protoAccessControlForType.defaultValue;\n  }\n\n  logUnexpecedPropertyAccessOnce(propertyName);\n  return false;\n}\n\nfunction logUnexpecedPropertyAccessOnce(propertyName) {\n  if (loggedProperties[propertyName] !== true) {\n    loggedProperties[propertyName] = true;\n    logger.log('error', 'Handlebars: Access has been denied to resolve the property \"' + propertyName + '\" because it is not an \"own property\" of its parent.\\n' + 'You can add a runtime option to disable the check or this warning:\\n' + 'See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details');\n  }\n}\n\nfunction resetLoggedProperties() {\n  Object.keys(loggedProperties).forEach(function (propertyName) {\n    delete loggedProperties[propertyName];\n  });\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/internal/wrapHelper.js":
/*!****************************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/internal/wrapHelper.js ***!
  \****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\nexports.wrapHelper = wrapHelper;\n\nfunction wrapHelper(helper, transformOptionsFn) {\n  if (typeof helper !== 'function') {\n    // This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639\n    // We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function.\n    return helper;\n  }\n\n  var wrapper = function wrapper()\n  /* dynamic arguments */\n  {\n    var options = arguments[arguments.length - 1];\n    arguments[arguments.length - 1] = transformOptionsFn(options);\n    return helper.apply(this, arguments);\n  };\n\n  return wrapper;\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/internal/wrapHelper.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/logger.js":
/*!***************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/logger.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(/*! ./utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar logger = {\n  methodMap: ['debug', 'info', 'warn', 'error'],\n  level: 'info',\n  // Maps a given level value to the `methodMap` indexes above.\n  lookupLevel: function lookupLevel(level) {\n    if (typeof level === 'string') {\n      var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());\n\n      if (levelMap >= 0) {\n        level = levelMap;\n      } else {\n        level = parseInt(level, 10);\n      }\n    }\n\n    return level;\n  },\n  // Can be overridden in the host environment\n  log: function log(level) {\n    level = logger.lookupLevel(level);\n\n    if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n      var method = logger.methodMap[level]; // eslint-disable-next-line no-console\n\n      if (!console[method]) {\n        method = 'log';\n      }\n\n      for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        message[_key - 1] = arguments[_key];\n      }\n\n      console[method].apply(console, message); // eslint-disable-line no-console\n    }\n  }\n};\nexports['default'] = logger;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/logger.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js":
/*!********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nexports.__esModule = true;\n\nexports['default'] = function (Handlebars) {\n  /* istanbul ignore next */\n  var root = typeof global !== 'undefined' ? global : window,\n      $Handlebars = root.Handlebars;\n  /* istanbul ignore next */\n\n  Handlebars.noConflict = function () {\n    if (root.Handlebars === Handlebars) {\n      root.Handlebars = $Handlebars;\n    }\n\n    return Handlebars;\n  };\n};\n\nmodule.exports = exports['default'];\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/runtime.js":
/*!****************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/runtime.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nexports.__esModule = true;\nexports.checkRevision = checkRevision;\nexports.template = template;\nexports.wrapProgram = wrapProgram;\nexports.resolvePartial = resolvePartial;\nexports.invokePartial = invokePartial;\nexports.noop = noop; // istanbul ignore next\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    'default': obj\n  };\n} // istanbul ignore next\n\n\nfunction _interopRequireWildcard(obj) {\n  if (obj && obj.__esModule) {\n    return obj;\n  } else {\n    var newObj = {};\n\n    if (obj != null) {\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n      }\n    }\n\n    newObj['default'] = obj;\n    return newObj;\n  }\n}\n\nvar _utils = __webpack_require__(/*! ./utils */ \"./node_modules/handlebars/dist/cjs/handlebars/utils.js\");\n\nvar Utils = _interopRequireWildcard(_utils);\n\nvar _exception = __webpack_require__(/*! ./exception */ \"./node_modules/handlebars/dist/cjs/handlebars/exception.js\");\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _base = __webpack_require__(/*! ./base */ \"./node_modules/handlebars/dist/cjs/handlebars/base.js\");\n\nvar _helpers = __webpack_require__(/*! ./helpers */ \"./node_modules/handlebars/dist/cjs/handlebars/helpers.js\");\n\nvar _internalWrapHelper = __webpack_require__(/*! ./internal/wrapHelper */ \"./node_modules/handlebars/dist/cjs/handlebars/internal/wrapHelper.js\");\n\nvar _internalProtoAccess = __webpack_require__(/*! ./internal/proto-access */ \"./node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js\");\n\nfunction checkRevision(compilerInfo) {\n  var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n      currentRevision = _base.COMPILER_REVISION;\n\n  if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) {\n    return;\n  }\n\n  if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) {\n    var runtimeVersions = _base.REVISION_CHANGES[currentRevision],\n        compilerVersions = _base.REVISION_CHANGES[compilerRevision];\n    throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n  } else {\n    // Use the embedded version info since the runtime doesn't know about this revision yet\n    throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n  }\n}\n\nfunction template(templateSpec, env) {\n  /* istanbul ignore next */\n  if (!env) {\n    throw new _exception2['default']('No environment passed to template');\n  }\n\n  if (!templateSpec || !templateSpec.main) {\n    throw new _exception2['default']('Unknown template object: ' + _typeof(templateSpec));\n  }\n\n  templateSpec.main.decorator = templateSpec.main_d; // Note: Using env.VM references rather than local var references throughout this section to allow\n  // for external users to override these as pseudo-supported APIs.\n\n  env.VM.checkRevision(templateSpec.compiler); // backwards compatibility for precompiled templates with compiler-version 7 (<4.3.0)\n\n  var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7;\n\n  function invokePartialWrapper(partial, context, options) {\n    if (options.hash) {\n      context = Utils.extend({}, context, options.hash);\n\n      if (options.ids) {\n        options.ids[0] = true;\n      }\n    }\n\n    partial = env.VM.resolvePartial.call(this, partial, context, options);\n    var extendedOptions = Utils.extend({}, options, {\n      hooks: this.hooks,\n      protoAccessControl: this.protoAccessControl\n    });\n    var result = env.VM.invokePartial.call(this, partial, context, extendedOptions);\n\n    if (result == null && env.compile) {\n      options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n      result = options.partials[options.name](context, extendedOptions);\n    }\n\n    if (result != null) {\n      if (options.indent) {\n        var lines = result.split('\\n');\n\n        for (var i = 0, l = lines.length; i < l; i++) {\n          if (!lines[i] && i + 1 === l) {\n            break;\n          }\n\n          lines[i] = options.indent + lines[i];\n        }\n\n        result = lines.join('\\n');\n      }\n\n      return result;\n    } else {\n      throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n    }\n  } // Just add water\n\n\n  var container = {\n    strict: function strict(obj, name, loc) {\n      if (!obj || !(name in obj)) {\n        throw new _exception2['default']('\"' + name + '\" not defined in ' + obj, {\n          loc: loc\n        });\n      }\n\n      return container.lookupProperty(obj, name);\n    },\n    lookupProperty: function lookupProperty(parent, propertyName) {\n      var result = parent[propertyName];\n\n      if (result == null) {\n        return result;\n      }\n\n      if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n        return result;\n      }\n\n      if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) {\n        return result;\n      }\n\n      return undefined;\n    },\n    lookup: function lookup(depths, name) {\n      var len = depths.length;\n\n      for (var i = 0; i < len; i++) {\n        var result = depths[i] && container.lookupProperty(depths[i], name);\n\n        if (result != null) {\n          return depths[i][name];\n        }\n      }\n    },\n    lambda: function lambda(current, context) {\n      return typeof current === 'function' ? current.call(context) : current;\n    },\n    escapeExpression: Utils.escapeExpression,\n    invokePartial: invokePartialWrapper,\n    fn: function fn(i) {\n      var ret = templateSpec[i];\n      ret.decorator = templateSpec[i + '_d'];\n      return ret;\n    },\n    programs: [],\n    program: function program(i, data, declaredBlockParams, blockParams, depths) {\n      var programWrapper = this.programs[i],\n          fn = this.fn(i);\n\n      if (data || depths || blockParams || declaredBlockParams) {\n        programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n      } else if (!programWrapper) {\n        programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n      }\n\n      return programWrapper;\n    },\n    data: function data(value, depth) {\n      while (value && depth--) {\n        value = value._parent;\n      }\n\n      return value;\n    },\n    mergeIfNeeded: function mergeIfNeeded(param, common) {\n      var obj = param || common;\n\n      if (param && common && param !== common) {\n        obj = Utils.extend({}, common, param);\n      }\n\n      return obj;\n    },\n    // An empty object to use as replacement for null-contexts\n    nullContext: Object.seal({}),\n    noop: env.VM.noop,\n    compilerInfo: templateSpec.compiler\n  };\n\n  function ret(context) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n    var data = options.data;\n\n    ret._setup(options);\n\n    if (!options.partial && templateSpec.useData) {\n      data = initData(context, data);\n    }\n\n    var depths = undefined,\n        blockParams = templateSpec.useBlockParams ? [] : undefined;\n\n    if (templateSpec.useDepths) {\n      if (options.depths) {\n        depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;\n      } else {\n        depths = [context];\n      }\n    }\n\n    function main(context\n    /*, options*/\n    ) {\n      return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n    }\n\n    main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n    return main(context, options);\n  }\n\n  ret.isTop = true;\n\n  ret._setup = function (options) {\n    if (!options.partial) {\n      var mergedHelpers = Utils.extend({}, env.helpers, options.helpers);\n      wrapHelpersToPassLookupProperty(mergedHelpers, container);\n      container.helpers = mergedHelpers;\n\n      if (templateSpec.usePartial) {\n        // Use mergeIfNeeded here to prevent compiling global partials multiple times\n        container.partials = container.mergeIfNeeded(options.partials, env.partials);\n      }\n\n      if (templateSpec.usePartial || templateSpec.useDecorators) {\n        container.decorators = Utils.extend({}, env.decorators, options.decorators);\n      }\n\n      container.hooks = {};\n      container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options);\n      var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7;\n\n      _helpers.moveHelperToHooks(container, 'helperMissing', keepHelperInHelpers);\n\n      _helpers.moveHelperToHooks(container, 'blockHelperMissing', keepHelperInHelpers);\n    } else {\n      container.protoAccessControl = options.protoAccessControl; // internal option\n\n      container.helpers = options.helpers;\n      container.partials = options.partials;\n      container.decorators = options.decorators;\n      container.hooks = options.hooks;\n    }\n  };\n\n  ret._child = function (i, data, blockParams, depths) {\n    if (templateSpec.useBlockParams && !blockParams) {\n      throw new _exception2['default']('must pass block params');\n    }\n\n    if (templateSpec.useDepths && !depths) {\n      throw new _exception2['default']('must pass parent depths');\n    }\n\n    return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n  };\n\n  return ret;\n}\n\nfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n  function prog(context) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n    var currentDepths = depths;\n\n    if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {\n      currentDepths = [context].concat(depths);\n    }\n\n    return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);\n  }\n\n  prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n  prog.program = i;\n  prog.depth = depths ? depths.length : 0;\n  prog.blockParams = declaredBlockParams || 0;\n  return prog;\n}\n/**\n * This is currently part of the official API, therefore implementation details should not be changed.\n */\n\n\nfunction resolvePartial(partial, context, options) {\n  if (!partial) {\n    if (options.name === '@partial-block') {\n      partial = options.data['partial-block'];\n    } else {\n      partial = options.partials[options.name];\n    }\n  } else if (!partial.call && !options.name) {\n    // This is a dynamic partial that returned a string\n    options.name = partial;\n    partial = options.partials[partial];\n  }\n\n  return partial;\n}\n\nfunction invokePartial(partial, context, options) {\n  // Use the current closure context to save the partial-block if this partial\n  var currentPartialBlock = options.data && options.data['partial-block'];\n  options.partial = true;\n\n  if (options.ids) {\n    options.data.contextPath = options.ids[0] || options.data.contextPath;\n  }\n\n  var partialBlock = undefined;\n\n  if (options.fn && options.fn !== noop) {\n    (function () {\n      options.data = _base.createFrame(options.data); // Wrapper function to get access to currentPartialBlock from the closure\n\n      var fn = options.fn;\n\n      partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) {\n        var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; // Restore the partial-block from the closure for the execution of the block\n        // i.e. the part inside the block of the partial call.\n\n        options.data = _base.createFrame(options.data);\n        options.data['partial-block'] = currentPartialBlock;\n        return fn(context, options);\n      };\n\n      if (fn.partials) {\n        options.partials = Utils.extend({}, options.partials, fn.partials);\n      }\n    })();\n  }\n\n  if (partial === undefined && partialBlock) {\n    partial = partialBlock;\n  }\n\n  if (partial === undefined) {\n    throw new _exception2['default']('The partial ' + options.name + ' could not be found');\n  } else if (partial instanceof Function) {\n    return partial(context, options);\n  }\n}\n\nfunction noop() {\n  return '';\n}\n\nfunction initData(context, data) {\n  if (!data || !('root' in data)) {\n    data = data ? _base.createFrame(data) : {};\n    data.root = context;\n  }\n\n  return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n  if (fn.decorator) {\n    var props = {};\n    prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n    Utils.extend(prog, props);\n  }\n\n  return prog;\n}\n\nfunction wrapHelpersToPassLookupProperty(mergedHelpers, container) {\n  Object.keys(mergedHelpers).forEach(function (helperName) {\n    var helper = mergedHelpers[helperName];\n    mergedHelpers[helperName] = passLookupPropertyOption(helper, container);\n  });\n}\n\nfunction passLookupPropertyOption(helper, container) {\n  var lookupProperty = container.lookupProperty;\n  return _internalWrapHelper.wrapHelper(helper, function (options) {\n    return Utils.extend({\n      lookupProperty: lookupProperty\n    }, options);\n  });\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/runtime.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/safe-string.js":
/*!********************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/safe-string.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// Build out our basic SafeString type\n\n\nexports.__esModule = true;\n\nfunction SafeString(string) {\n  this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n  return '' + this.string;\n};\n\nexports['default'] = SafeString;\nmodule.exports = exports['default'];\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/safe-string.js?");

/***/ }),

/***/ "./node_modules/handlebars/dist/cjs/handlebars/utils.js":
/*!**************************************************************!*\
  !*** ./node_modules/handlebars/dist/cjs/handlebars/utils.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nexports.__esModule = true;\nexports.extend = extend;\nexports.indexOf = indexOf;\nexports.escapeExpression = escapeExpression;\nexports.isEmpty = isEmpty;\nexports.createFrame = createFrame;\nexports.blockParams = blockParams;\nexports.appendContextPath = appendContextPath;\nvar escape = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;',\n  '=': '&#x3D;'\n};\nvar badChars = /[&<>\"'`=]/g,\n    possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n  return escape[chr];\n}\n\nfunction extend(obj\n/* , ...source */\n) {\n  for (var i = 1; i < arguments.length; i++) {\n    for (var key in arguments[i]) {\n      if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n        obj[key] = arguments[i][key];\n      }\n    }\n  }\n\n  return obj;\n}\n\nvar toString = Object.prototype.toString;\nexports.toString = toString; // Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n\n/* eslint-disable func-style */\n\nvar isFunction = function isFunction(value) {\n  return typeof value === 'function';\n}; // fallback for older versions of Chrome and Safari\n\n/* istanbul ignore next */\n\n\nif (isFunction(/x/)) {\n  exports.isFunction = isFunction = function isFunction(value) {\n    return typeof value === 'function' && toString.call(value) === '[object Function]';\n  };\n}\n\nexports.isFunction = isFunction;\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\n\nvar isArray = Array.isArray || function (value) {\n  return value && _typeof(value) === 'object' ? toString.call(value) === '[object Array]' : false;\n};\n\nexports.isArray = isArray; // Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\nfunction indexOf(array, value) {\n  for (var i = 0, len = array.length; i < len; i++) {\n    if (array[i] === value) {\n      return i;\n    }\n  }\n\n  return -1;\n}\n\nfunction escapeExpression(string) {\n  if (typeof string !== 'string') {\n    // don't escape SafeStrings, since they're already safe\n    if (string && string.toHTML) {\n      return string.toHTML();\n    } else if (string == null) {\n      return '';\n    } else if (!string) {\n      return string + '';\n    } // Force a string conversion as this will be done by the append regardless and\n    // the regex test will do this transparently behind the scenes, causing issues if\n    // an object's to string has escaped characters in it.\n\n\n    string = '' + string;\n  }\n\n  if (!possible.test(string)) {\n    return string;\n  }\n\n  return string.replace(badChars, escapeChar);\n}\n\nfunction isEmpty(value) {\n  if (!value && value !== 0) {\n    return true;\n  } else if (isArray(value) && value.length === 0) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction createFrame(object) {\n  var frame = extend({}, object);\n  frame._parent = object;\n  return frame;\n}\n\nfunction blockParams(params, ids) {\n  params.path = ids;\n  return params;\n}\n\nfunction appendContextPath(contextPath, id) {\n  return (contextPath ? contextPath + '.' : '') + id;\n}\n\n//# sourceURL=webpack://rup/./node_modules/handlebars/dist/cjs/handlebars/utils.js?");

/***/ }),

/***/ "./node_modules/jquery-contextmenu/dist/jquery.contextMenu.js":
/*!********************************************************************!*\
  !*** ./node_modules/jquery-contextmenu/dist/jquery.contextMenu.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * jQuery contextMenu v2.9.2 - Plugin for simple contextMenu handling\r\n *\r\n * Version: v2.9.2\r\n *\r\n * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF)\r\n * Web: http://swisnl.github.io/jQuery-contextMenu/\r\n *\r\n * Copyright (c) 2011-2020 SWIS BV and contributors\r\n *\r\n * Licensed under\r\n *   MIT License http://www.opensource.org/licenses/mit-license\r\n *\r\n * Date: 2020-05-13T13:55:36.983Z\r\n */\n// jscs:disable\n\n/* jshint ignore:start */\n(function (factory) {\n  if (true) {\n    // AMD. Register as anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  'use strict'; // TODO: -\n  // ARIA stuff: menuitem, menuitemcheckbox und menuitemradio\n  // create <menu> structure if $.support[htmlCommand || htmlMenuitem] and !opt.disableNative\n  // determine html5 compatibility\n\n  $.support.htmlMenuitem = 'HTMLMenuItemElement' in window;\n  $.support.htmlCommand = 'HTMLCommandElement' in window;\n  $.support.eventSelectstart = 'onselectstart' in document.documentElement;\n  /* // should the need arise, test for css user-select\r\n   $.support.cssUserSelect = (function(){\r\n   var t = false,\r\n   e = document.createElement('div');\r\n     $.each('Moz|Webkit|Khtml|O|ms|Icab|'.split('|'), function(i, prefix) {\r\n   var propCC = prefix + (prefix ? 'U' : 'u') + 'serSelect',\r\n   prop = (prefix ? ('-' + prefix.toLowerCase() + '-') : '') + 'user-select';\r\n     e.style.cssText = prop + ': text;';\r\n   if (e.style[propCC] == 'text') {\r\n   t = true;\r\n   return false;\r\n   }\r\n     return true;\r\n   });\r\n     return t;\r\n   })();\r\n   */\n\n  if (!$.ui || !$.widget) {\n    // duck punch $.cleanData like jQueryUI does to get that remove event\n    $.cleanData = function (orig) {\n      return function (elems) {\n        var events, elem, i;\n\n        for (i = 0; elems[i] != null; i++) {\n          elem = elems[i];\n\n          try {\n            // Only trigger remove when necessary to save time\n            events = $._data(elem, 'events');\n\n            if (events && events.remove) {\n              $(elem).triggerHandler('remove');\n            } // Http://bugs.jquery.com/ticket/8235\n\n          } catch (e) {}\n        }\n\n        orig(elems);\n      };\n    }($.cleanData);\n  }\n  /* jshint ignore:end */\n  // jscs:enable\n\n\n  var // currently active contextMenu trigger\n  $currentTrigger = null,\n      // is contextMenu initialized with at least one menu?\n  initialized = false,\n      // window handle\n  $win = $(window),\n      // number of registered menus\n  counter = 0,\n      // mapping selector to namespace\n  namespaces = {},\n      // mapping namespace to options\n  menus = {},\n      // custom command type handlers\n  types = {},\n      // default values\n  defaults = {\n    // selector of contextMenu trigger\n    selector: null,\n    // where to append the menu to\n    appendTo: null,\n    // method to trigger context menu [\"right\", \"left\", \"hover\"]\n    trigger: 'right',\n    // hide menu when mouse leaves trigger / menu elements\n    autoHide: false,\n    // ms to wait before showing a hover-triggered context menu\n    delay: 200,\n    // flag denoting if a second trigger should simply move (true) or rebuild (false) an open menu\n    // as long as the trigger happened on one of the trigger-element's child nodes\n    reposition: true,\n    // Flag denoting if a second trigger should close the menu, as long as\n    // the trigger happened on one of the trigger-element's child nodes.\n    // This overrides the reposition option.\n    hideOnSecondTrigger: false,\n    //ability to select submenu\n    selectableSubMenu: false,\n    // Default classname configuration to be able avoid conflicts in frameworks\n    classNames: {\n      hover: 'context-menu-hover',\n      // Item hover\n      disabled: 'context-menu-disabled',\n      // Item disabled\n      visible: 'context-menu-visible',\n      // Item visible\n      notSelectable: 'context-menu-not-selectable',\n      // Item not selectable\n      icon: 'context-menu-icon',\n      iconEdit: 'context-menu-icon-edit',\n      iconCut: 'context-menu-icon-cut',\n      iconCopy: 'context-menu-icon-copy',\n      iconPaste: 'context-menu-icon-paste',\n      iconDelete: 'context-menu-icon-delete',\n      iconAdd: 'context-menu-icon-add',\n      iconQuit: 'context-menu-icon-quit',\n      iconLoadingClass: 'context-menu-icon-loading'\n    },\n    // determine position to show menu at\n    determinePosition: function determinePosition($menu) {\n      // position to the lower middle of the trigger element\n      if ($.ui && $.ui.position) {\n        // .position() is provided as a jQuery UI utility\n        // (...and it won't work on hidden elements)\n        $menu.css('display', 'block').position({\n          my: 'center top',\n          at: 'center bottom',\n          of: this,\n          offset: '0 5',\n          collision: 'fit'\n        }).css('display', 'none');\n      } else {\n        // determine contextMenu position\n        var offset = this.offset();\n        offset.top += this.outerHeight();\n        offset.left += this.outerWidth() / 2 - $menu.outerWidth() / 2;\n        $menu.css(offset);\n      }\n    },\n    // position menu\n    position: function position(opt, x, y) {\n      var offset; // determine contextMenu position\n\n      if (!x && !y) {\n        opt.determinePosition.call(this, opt.$menu);\n        return;\n      } else if (x === 'maintain' && y === 'maintain') {\n        // x and y must not be changed (after re-show on command click)\n        offset = opt.$menu.position();\n      } else {\n        // x and y are given (by mouse event)\n        var offsetParentOffset = opt.$menu.offsetParent().offset();\n        offset = {\n          top: y - offsetParentOffset.top,\n          left: x - offsetParentOffset.left\n        };\n      } // correct offset if viewport demands it\n\n\n      var bottom = $win.scrollTop() + $win.height(),\n          right = $win.scrollLeft() + $win.width(),\n          height = opt.$menu.outerHeight(),\n          width = opt.$menu.outerWidth();\n\n      if (offset.top + height > bottom) {\n        offset.top -= height;\n      }\n\n      if (offset.top < 0) {\n        offset.top = 0;\n      }\n\n      if (offset.left + width > right) {\n        offset.left -= width;\n      }\n\n      if (offset.left < 0) {\n        offset.left = 0;\n      }\n\n      opt.$menu.css(offset);\n    },\n    // position the sub-menu\n    positionSubmenu: function positionSubmenu($menu) {\n      if (typeof $menu === 'undefined') {\n        // When user hovers over item (which has sub items) handle.focusItem will call this.\n        // but the submenu does not exist yet if opt.items is a promise. just return, will\n        // call positionSubmenu after promise is completed.\n        return;\n      }\n\n      if ($.ui && $.ui.position) {\n        // .position() is provided as a jQuery UI utility\n        // (...and it won't work on hidden elements)\n        $menu.css('display', 'block').position({\n          my: 'left top-5',\n          at: 'right top',\n          of: this,\n          collision: 'flipfit fit'\n        }).css('display', '');\n      } else {\n        // determine contextMenu position\n        var offset = {\n          top: -9,\n          left: this.outerWidth() - 5\n        };\n        $menu.css(offset);\n      }\n    },\n    // offset to add to zIndex\n    zIndex: 1,\n    // show hide animation settings\n    animation: {\n      duration: 50,\n      show: 'slideDown',\n      hide: 'slideUp'\n    },\n    // events\n    events: {\n      preShow: $.noop,\n      show: $.noop,\n      hide: $.noop,\n      activated: $.noop\n    },\n    // default callback\n    callback: null,\n    // list of contextMenu items\n    items: {}\n  },\n      // mouse position for hover activation\n  hoveract = {\n    timer: null,\n    pageX: null,\n    pageY: null\n  },\n      // determine zIndex\n  zindex = function zindex($t) {\n    var zin = 0,\n        $tt = $t;\n\n    while (true) {\n      zin = Math.max(zin, parseInt($tt.css('z-index'), 10) || 0);\n      $tt = $tt.parent();\n\n      if (!$tt || !$tt.length || 'html body'.indexOf($tt.prop('nodeName').toLowerCase()) > -1) {\n        break;\n      }\n    }\n\n    return zin;\n  },\n      // event handlers\n  handle = {\n    // abort anything\n    abortevent: function abortevent(e) {\n      e.preventDefault();\n      e.stopImmediatePropagation();\n    },\n    // contextmenu show dispatcher\n    contextmenu: function contextmenu(e) {\n      var $this = $(this); //Show browser context-menu when preShow returns false\n\n      if (e.data.events.preShow($this, e) === false) {\n        return;\n      } // disable actual context-menu if we are using the right mouse button as the trigger\n\n\n      if (e.data.trigger === 'right') {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n      } // abort native-triggered events unless we're triggering on right click\n\n\n      if (e.data.trigger !== 'right' && e.data.trigger !== 'demand' && e.originalEvent) {\n        return;\n      } // Let the current contextmenu decide if it should show or not based on its own trigger settings\n\n\n      if (typeof e.mouseButton !== 'undefined' && e.data) {\n        if (!(e.data.trigger === 'left' && e.mouseButton === 0) && !(e.data.trigger === 'right' && e.mouseButton === 2)) {\n          // Mouse click is not valid.\n          return;\n        }\n      } // abort event if menu is visible for this trigger\n\n\n      if ($this.hasClass('context-menu-active')) {\n        return;\n      }\n\n      if (!$this.hasClass('context-menu-disabled')) {\n        // theoretically need to fire a show event at <menu>\n        // http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#context-menus\n        // var evt = jQuery.Event(\"show\", { data: data, pageX: e.pageX, pageY: e.pageY, relatedTarget: this });\n        // e.data.$menu.trigger(evt);\n        $currentTrigger = $this;\n\n        if (e.data.build) {\n          var built = e.data.build($currentTrigger, e); // abort if build() returned false\n\n          if (built === false) {\n            return;\n          } // dynamically build menu on invocation\n\n\n          e.data = $.extend(true, {}, defaults, e.data, built || {}); // abort if there are no items to display\n\n          if (!e.data.items || $.isEmptyObject(e.data.items)) {\n            // Note: jQuery captures and ignores errors from event handlers\n            if (window.console) {\n              (console.error || console.log).call(console, 'No items specified to show in contextMenu');\n            }\n\n            throw new Error('No Items specified');\n          } // backreference for custom command type creation\n\n\n          e.data.$trigger = $currentTrigger;\n          op.create(e.data);\n        }\n\n        op.show.call($this, e.data, e.pageX, e.pageY);\n      }\n    },\n    // contextMenu left-click trigger\n    click: function click(e) {\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      $(this).trigger($.Event('contextmenu', {\n        data: e.data,\n        pageX: e.pageX,\n        pageY: e.pageY\n      }));\n    },\n    // contextMenu right-click trigger\n    mousedown: function mousedown(e) {\n      // register mouse down\n      var $this = $(this); // hide any previous menus\n\n      if ($currentTrigger && $currentTrigger.length && !$currentTrigger.is($this)) {\n        $currentTrigger.data('contextMenu').$menu.trigger('contextmenu:hide');\n      } // activate on right click\n\n\n      if (e.button === 2) {\n        $currentTrigger = $this.data('contextMenuActive', true);\n      }\n    },\n    // contextMenu right-click trigger\n    mouseup: function mouseup(e) {\n      // show menu\n      var $this = $(this);\n\n      if ($this.data('contextMenuActive') && $currentTrigger && $currentTrigger.length && $currentTrigger.is($this) && !$this.hasClass('context-menu-disabled')) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        $currentTrigger = $this;\n        $this.trigger($.Event('contextmenu', {\n          data: e.data,\n          pageX: e.pageX,\n          pageY: e.pageY\n        }));\n      }\n\n      $this.removeData('contextMenuActive');\n    },\n    // contextMenu hover trigger\n    mouseenter: function mouseenter(e) {\n      var $this = $(this),\n          $related = $(e.relatedTarget),\n          $document = $(document); // abort if we're coming from a menu\n\n      if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) {\n        return;\n      } // abort if a menu is shown\n\n\n      if ($currentTrigger && $currentTrigger.length) {\n        return;\n      }\n\n      hoveract.pageX = e.pageX;\n      hoveract.pageY = e.pageY;\n      hoveract.data = e.data;\n      $document.on('mousemove.contextMenuShow', handle.mousemove);\n      hoveract.timer = setTimeout(function () {\n        hoveract.timer = null;\n        $document.off('mousemove.contextMenuShow');\n        $currentTrigger = $this;\n        $this.trigger($.Event('contextmenu', {\n          data: hoveract.data,\n          pageX: hoveract.pageX,\n          pageY: hoveract.pageY\n        }));\n      }, e.data.delay);\n    },\n    // contextMenu hover trigger\n    mousemove: function mousemove(e) {\n      hoveract.pageX = e.pageX;\n      hoveract.pageY = e.pageY;\n    },\n    // contextMenu hover trigger\n    mouseleave: function mouseleave(e) {\n      // abort if we're leaving for a menu\n      var $related = $(e.relatedTarget);\n\n      if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) {\n        return;\n      }\n\n      try {\n        clearTimeout(hoveract.timer);\n      } catch (e) {}\n\n      hoveract.timer = null;\n    },\n    // click on layer to hide contextMenu\n    layerClick: function layerClick(e) {\n      var $this = $(this),\n          root = $this.data('contextMenuRoot'),\n          button = e.button,\n          x = e.pageX,\n          y = e.pageY,\n          fakeClick = x === undefined,\n          target,\n          offset;\n      e.preventDefault();\n      setTimeout(function () {\n        // If the click is not real, things break: https://github.com/swisnl/jQuery-contextMenu/issues/132\n        if (fakeClick) {\n          if (root !== null && typeof root !== 'undefined' && root.$menu !== null && typeof root.$menu !== 'undefined') {\n            root.$menu.trigger('contextmenu:hide');\n          }\n\n          return;\n        }\n\n        var $window;\n        var triggerAction = root.trigger === 'left' && button === 0 || root.trigger === 'right' && button === 2; // find the element that would've been clicked, wasn't the layer in the way\n\n        if (document.elementFromPoint && root.$layer) {\n          root.$layer.hide();\n          target = document.elementFromPoint(x - $win.scrollLeft(), y - $win.scrollTop()); // also need to try and focus this element if we're in a contenteditable area,\n          // as the layer will prevent the browser mouse action we want\n\n          if (target !== null && target.isContentEditable) {\n            var range = document.createRange(),\n                sel = window.getSelection();\n            range.selectNode(target);\n            range.collapse(true);\n            sel.removeAllRanges();\n            sel.addRange(range);\n          }\n\n          $(target).trigger(e);\n          root.$layer.show();\n        }\n\n        if (root.hideOnSecondTrigger && triggerAction && root.$menu !== null && typeof root.$menu !== 'undefined') {\n          root.$menu.trigger('contextmenu:hide');\n          return;\n        }\n\n        if (root.reposition && triggerAction) {\n          if (document.elementFromPoint) {\n            if (root.$trigger.is(target)) {\n              root.position.call(root.$trigger, root, x, y);\n              return;\n            }\n          } else {\n            offset = root.$trigger.offset();\n            $window = $(window); // while this looks kinda awful, it's the best way to avoid\n            // unnecessarily calculating any positions\n\n            offset.top += $window.scrollTop();\n\n            if (offset.top <= e.pageY) {\n              offset.left += $window.scrollLeft();\n\n              if (offset.left <= e.pageX) {\n                offset.bottom = offset.top + root.$trigger.outerHeight();\n\n                if (offset.bottom >= e.pageY) {\n                  offset.right = offset.left + root.$trigger.outerWidth();\n\n                  if (offset.right >= e.pageX) {\n                    // reposition\n                    root.position.call(root.$trigger, root, x, y);\n                    return;\n                  }\n                }\n              }\n            }\n          }\n        }\n\n        if (target && triggerAction) {\n          root.$trigger.one('contextmenu:hidden', function () {\n            $(target).contextMenu({\n              x: x,\n              y: y,\n              button: button\n            });\n          });\n        }\n\n        if (root !== null && typeof root !== 'undefined' && root.$menu !== null && typeof root.$menu !== 'undefined') {\n          root.$menu.trigger('contextmenu:hide');\n        }\n      }, 50);\n    },\n    // key handled :hover\n    keyStop: function keyStop(e, opt) {\n      if (!opt.isInput) {\n        e.preventDefault();\n      }\n\n      e.stopPropagation();\n    },\n    key: function key(e) {\n      var opt = {}; // Only get the data from $currentTrigger if it exists\n\n      if ($currentTrigger) {\n        opt = $currentTrigger.data('contextMenu') || {};\n      } // If the trigger happen on a element that are above the contextmenu do this\n\n\n      if (typeof opt.zIndex === 'undefined') {\n        opt.zIndex = 0;\n      }\n\n      var targetZIndex = 0;\n\n      var getZIndexOfTriggerTarget = function getZIndexOfTriggerTarget(target) {\n        if (target.style.zIndex !== '') {\n          targetZIndex = target.style.zIndex;\n        } else {\n          if (target.offsetParent !== null && typeof target.offsetParent !== 'undefined') {\n            getZIndexOfTriggerTarget(target.offsetParent);\n          } else if (target.parentElement !== null && typeof target.parentElement !== 'undefined') {\n            getZIndexOfTriggerTarget(target.parentElement);\n          }\n        }\n      };\n\n      getZIndexOfTriggerTarget(e.target); // If targetZIndex is heigher then opt.zIndex dont progress any futher.\n      // This is used to make sure that if you are using a dialog with a input / textarea / contenteditable div\n      // and its above the contextmenu it wont steal keys events\n\n      if (opt.$menu && parseInt(targetZIndex, 10) > parseInt(opt.$menu.css(\"zIndex\"), 10)) {\n        return;\n      }\n\n      switch (e.keyCode) {\n        case 9:\n        case 38:\n          // up\n          handle.keyStop(e, opt); // if keyCode is [38 (up)] or [9 (tab) with shift]\n\n          if (opt.isInput) {\n            if (e.keyCode === 9 && e.shiftKey) {\n              e.preventDefault();\n\n              if (opt.$selected) {\n                opt.$selected.find('input, textarea, select').blur();\n              }\n\n              if (opt.$menu !== null && typeof opt.$menu !== 'undefined') {\n                opt.$menu.trigger('prevcommand');\n              }\n\n              return;\n            } else if (e.keyCode === 38 && opt.$selected.find('input, textarea, select').prop('type') === 'checkbox') {\n              // checkboxes don't capture this key\n              e.preventDefault();\n              return;\n            }\n          } else if (e.keyCode !== 9 || e.shiftKey) {\n            if (opt.$menu !== null && typeof opt.$menu !== 'undefined') {\n              opt.$menu.trigger('prevcommand');\n            }\n\n            return;\n          }\n\n          break;\n        // omitting break;\n        // case 9: // tab - reached through omitted break;\n\n        case 40:\n          // down\n          handle.keyStop(e, opt);\n\n          if (opt.isInput) {\n            if (e.keyCode === 9) {\n              e.preventDefault();\n\n              if (opt.$selected) {\n                opt.$selected.find('input, textarea, select').blur();\n              }\n\n              if (opt.$menu !== null && typeof opt.$menu !== 'undefined') {\n                opt.$menu.trigger('nextcommand');\n              }\n\n              return;\n            } else if (e.keyCode === 40 && opt.$selected.find('input, textarea, select').prop('type') === 'checkbox') {\n              // checkboxes don't capture this key\n              e.preventDefault();\n              return;\n            }\n          } else {\n            if (opt.$menu !== null && typeof opt.$menu !== 'undefined') {\n              opt.$menu.trigger('nextcommand');\n            }\n\n            return;\n          }\n\n          break;\n\n        case 37:\n          // left\n          handle.keyStop(e, opt);\n\n          if (opt.isInput || !opt.$selected || !opt.$selected.length) {\n            break;\n          }\n\n          if (!opt.$selected.parent().hasClass('context-menu-root')) {\n            var $parent = opt.$selected.parent().parent();\n            opt.$selected.trigger('contextmenu:blur');\n            opt.$selected = $parent;\n            return;\n          }\n\n          break;\n\n        case 39:\n          // right\n          handle.keyStop(e, opt);\n\n          if (opt.isInput || !opt.$selected || !opt.$selected.length) {\n            break;\n          }\n\n          var itemdata = opt.$selected.data('contextMenu') || {};\n\n          if (itemdata.$menu && opt.$selected.hasClass('context-menu-submenu')) {\n            opt.$selected = null;\n            itemdata.$selected = null;\n            itemdata.$menu.trigger('nextcommand');\n            return;\n          }\n\n          break;\n\n        case 35: // end\n\n        case 36:\n          // home\n          if (opt.$selected && opt.$selected.find('input, textarea, select').length) {\n            return;\n          } else {\n            (opt.$selected && opt.$selected.parent() || opt.$menu).children(':not(.' + opt.classNames.disabled + ', .' + opt.classNames.notSelectable + ')')[e.keyCode === 36 ? 'first' : 'last']().trigger('contextmenu:focus');\n            e.preventDefault();\n            return;\n          }\n\n          break;\n\n        case 13:\n          // enter\n          handle.keyStop(e, opt);\n\n          if (opt.isInput) {\n            if (opt.$selected && !opt.$selected.is('textarea, select')) {\n              e.preventDefault();\n              return;\n            }\n\n            break;\n          }\n\n          if (typeof opt.$selected !== 'undefined' && opt.$selected !== null) {\n            opt.$selected.trigger('mouseup');\n          }\n\n          return;\n\n        case 32: // space\n\n        case 33: // page up\n\n        case 34:\n          // page down\n          // prevent browser from scrolling down while menu is visible\n          handle.keyStop(e, opt);\n          return;\n\n        case 27:\n          // esc\n          handle.keyStop(e, opt);\n\n          if (opt.$menu !== null && typeof opt.$menu !== 'undefined') {\n            opt.$menu.trigger('contextmenu:hide');\n          }\n\n          return;\n\n        default:\n          // 0-9, a-z\n          var k = String.fromCharCode(e.keyCode).toUpperCase();\n\n          if (opt.accesskeys && opt.accesskeys[k]) {\n            // according to the specs accesskeys must be invoked immediately\n            opt.accesskeys[k].$node.trigger(opt.accesskeys[k].$menu ? 'contextmenu:focus' : 'mouseup');\n            return;\n          }\n\n          break;\n      } // pass event to selected item,\n      // stop propagation to avoid endless recursion\n\n\n      e.stopPropagation();\n\n      if (typeof opt.$selected !== 'undefined' && opt.$selected !== null) {\n        opt.$selected.trigger(e);\n      }\n    },\n    // select previous possible command in menu\n    prevItem: function prevItem(e) {\n      e.stopPropagation();\n      var opt = $(this).data('contextMenu') || {};\n      var root = $(this).data('contextMenuRoot') || {}; // obtain currently selected menu\n\n      if (opt.$selected) {\n        var $s = opt.$selected;\n        opt = opt.$selected.parent().data('contextMenu') || {};\n        opt.$selected = $s;\n      }\n\n      var $children = opt.$menu.children(),\n          $prev = !opt.$selected || !opt.$selected.prev().length ? $children.last() : opt.$selected.prev(),\n          $round = $prev; // skip disabled or hidden elements\n\n      while ($prev.hasClass(root.classNames.disabled) || $prev.hasClass(root.classNames.notSelectable) || $prev.is(':hidden')) {\n        if ($prev.prev().length) {\n          $prev = $prev.prev();\n        } else {\n          $prev = $children.last();\n        }\n\n        if ($prev.is($round)) {\n          // break endless loop\n          return;\n        }\n      } // leave current\n\n\n      if (opt.$selected) {\n        handle.itemMouseleave.call(opt.$selected.get(0), e);\n      } // activate next\n\n\n      handle.itemMouseenter.call($prev.get(0), e); // focus input\n\n      var $input = $prev.find('input, textarea, select');\n\n      if ($input.length) {\n        $input.focus();\n      }\n    },\n    // select next possible command in menu\n    nextItem: function nextItem(e) {\n      e.stopPropagation();\n      var opt = $(this).data('contextMenu') || {};\n      var root = $(this).data('contextMenuRoot') || {}; // obtain currently selected menu\n\n      if (opt.$selected) {\n        var $s = opt.$selected;\n        opt = opt.$selected.parent().data('contextMenu') || {};\n        opt.$selected = $s;\n      }\n\n      var $children = opt.$menu.children(),\n          $next = !opt.$selected || !opt.$selected.next().length ? $children.first() : opt.$selected.next(),\n          $round = $next; // skip disabled\n\n      while ($next.hasClass(root.classNames.disabled) || $next.hasClass(root.classNames.notSelectable) || $next.is(':hidden')) {\n        if ($next.next().length) {\n          $next = $next.next();\n        } else {\n          $next = $children.first();\n        }\n\n        if ($next.is($round)) {\n          // break endless loop\n          return;\n        }\n      } // leave current\n\n\n      if (opt.$selected) {\n        handle.itemMouseleave.call(opt.$selected.get(0), e);\n      } // activate next\n\n\n      handle.itemMouseenter.call($next.get(0), e); // focus input\n\n      var $input = $next.find('input, textarea, select');\n\n      if ($input.length) {\n        $input.focus();\n      }\n    },\n    // flag that we're inside an input so the key handler can act accordingly\n    focusInput: function focusInput() {\n      var $this = $(this).closest('.context-menu-item'),\n          data = $this.data(),\n          opt = data.contextMenu,\n          root = data.contextMenuRoot;\n      root.$selected = opt.$selected = $this;\n      root.isInput = opt.isInput = true;\n    },\n    // flag that we're inside an input so the key handler can act accordingly\n    blurInput: function blurInput() {\n      var $this = $(this).closest('.context-menu-item'),\n          data = $this.data(),\n          opt = data.contextMenu,\n          root = data.contextMenuRoot;\n      root.isInput = opt.isInput = false;\n    },\n    // :hover on menu\n    menuMouseenter: function menuMouseenter() {\n      var root = $(this).data().contextMenuRoot;\n      root.hovering = true;\n    },\n    // :hover on menu\n    menuMouseleave: function menuMouseleave(e) {\n      var root = $(this).data().contextMenuRoot;\n\n      if (root.$layer && root.$layer.is(e.relatedTarget)) {\n        root.hovering = false;\n      }\n    },\n    // :hover done manually so key handling is possible\n    itemMouseenter: function itemMouseenter(e) {\n      var $this = $(this),\n          data = $this.data(),\n          opt = data.contextMenu,\n          root = data.contextMenuRoot;\n      root.hovering = true; // abort if we're re-entering\n\n      if (e && root.$layer && root.$layer.is(e.relatedTarget)) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n      } // make sure only one item is selected\n\n\n      (opt.$menu ? opt : root).$menu.children('.' + root.classNames.hover).trigger('contextmenu:blur').children('.hover').trigger('contextmenu:blur');\n\n      if ($this.hasClass(root.classNames.disabled) || $this.hasClass(root.classNames.notSelectable)) {\n        opt.$selected = null;\n        return;\n      }\n\n      $this.trigger('contextmenu:focus');\n    },\n    // :hover done manually so key handling is possible\n    itemMouseleave: function itemMouseleave(e) {\n      var $this = $(this),\n          data = $this.data(),\n          opt = data.contextMenu,\n          root = data.contextMenuRoot;\n\n      if (root !== opt && root.$layer && root.$layer.is(e.relatedTarget)) {\n        if (typeof root.$selected !== 'undefined' && root.$selected !== null) {\n          root.$selected.trigger('contextmenu:blur');\n        }\n\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        root.$selected = opt.$selected = opt.$node;\n        return;\n      }\n\n      if (opt && opt.$menu && opt.$menu.hasClass('context-menu-visible')) {\n        return;\n      }\n\n      $this.trigger('contextmenu:blur');\n    },\n    // contextMenu item click\n    itemClick: function itemClick(e) {\n      var $this = $(this),\n          data = $this.data(),\n          opt = data.contextMenu,\n          root = data.contextMenuRoot,\n          key = data.contextMenuKey,\n          callback; // abort if the key is unknown or disabled or is a menu\n\n      if (!opt.items[key] || $this.is('.' + root.classNames.disabled + ', .context-menu-separator, .' + root.classNames.notSelectable) || $this.is('.context-menu-submenu') && root.selectableSubMenu === false) {\n        return;\n      }\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n\n      if ($.isFunction(opt.callbacks[key]) && Object.prototype.hasOwnProperty.call(opt.callbacks, key)) {\n        // item-specific callback\n        callback = opt.callbacks[key];\n      } else if ($.isFunction(root.callback)) {\n        // default callback\n        callback = root.callback;\n      } else {\n        // no callback, no action\n        return;\n      } // hide menu if callback doesn't stop that\n\n\n      if (callback.call(root.$trigger, key, root, e) !== false) {\n        root.$menu.trigger('contextmenu:hide');\n      } else if (root.$menu.parent().length) {\n        op.update.call(root.$trigger, root);\n      }\n    },\n    // ignore click events on input elements\n    inputClick: function inputClick(e) {\n      e.stopImmediatePropagation();\n    },\n    // hide <menu>\n    hideMenu: function hideMenu(e, data) {\n      var root = $(this).data('contextMenuRoot');\n      op.hide.call(root.$trigger, root, data && data.force);\n    },\n    // focus <command>\n    focusItem: function focusItem(e) {\n      e.stopPropagation();\n      var $this = $(this),\n          data = $this.data(),\n          opt = data.contextMenu,\n          root = data.contextMenuRoot;\n\n      if ($this.hasClass(root.classNames.disabled) || $this.hasClass(root.classNames.notSelectable)) {\n        return;\n      }\n\n      $this.addClass([root.classNames.hover, root.classNames.visible].join(' ')) // select other items and included items\n      .parent().find('.context-menu-item').not($this).removeClass(root.classNames.visible).filter('.' + root.classNames.hover).trigger('contextmenu:blur'); // remember selected\n\n      opt.$selected = root.$selected = $this;\n\n      if (opt && opt.$node && opt.$node.hasClass('context-menu-submenu')) {\n        opt.$node.addClass(root.classNames.hover);\n      } // position sub-menu - do after show so dumb $.ui.position can keep up\n\n\n      if (opt.$node) {\n        root.positionSubmenu.call(opt.$node, opt.$menu);\n      }\n    },\n    // blur <command>\n    blurItem: function blurItem(e) {\n      e.stopPropagation();\n      var $this = $(this),\n          data = $this.data(),\n          opt = data.contextMenu,\n          root = data.contextMenuRoot;\n\n      if (opt.autoHide) {\n        // for tablets and touch screens this needs to remain\n        $this.removeClass(root.classNames.visible);\n      }\n\n      $this.removeClass(root.classNames.hover);\n      opt.$selected = null;\n    }\n  },\n      // operations\n  op = {\n    show: function show(opt, x, y) {\n      var $trigger = $(this),\n          css = {}; // hide any open menus\n\n      $('#context-menu-layer').trigger('mousedown'); // backreference for callbacks\n\n      opt.$trigger = $trigger; // show event\n\n      if (opt.events.show.call($trigger, opt) === false) {\n        $currentTrigger = null;\n        return;\n      } // create or update context menu\n\n\n      var hasVisibleItems = op.update.call($trigger, opt);\n\n      if (hasVisibleItems === false) {\n        $currentTrigger = null;\n        return;\n      } // position menu\n\n\n      opt.position.call($trigger, opt, x, y); // make sure we're in front\n\n      if (opt.zIndex) {\n        var additionalZValue = opt.zIndex; // If opt.zIndex is a function, call the function to get the right zIndex.\n\n        if (typeof opt.zIndex === 'function') {\n          additionalZValue = opt.zIndex.call($trigger, opt);\n        }\n\n        css.zIndex = zindex($trigger) + additionalZValue;\n      } // add layer\n\n\n      op.layer.call(opt.$menu, opt, css.zIndex); // adjust sub-menu zIndexes\n\n      opt.$menu.find('ul').css('zIndex', css.zIndex + 1); // position and show context menu\n\n      opt.$menu.css(css)[opt.animation.show](opt.animation.duration, function () {\n        $trigger.trigger('contextmenu:visible');\n        op.activated(opt);\n        opt.events.activated(opt);\n      }); // make options available and set state\n\n      $trigger.data('contextMenu', opt).addClass('context-menu-active'); // register key handler\n\n      $(document).off('keydown.contextMenu').on('keydown.contextMenu', handle.key); // register autoHide handler\n\n      if (opt.autoHide) {\n        // mouse position handler\n        $(document).on('mousemove.contextMenuAutoHide', function (e) {\n          // need to capture the offset on mousemove,\n          // since the page might've been scrolled since activation\n          var pos = $trigger.offset();\n          pos.right = pos.left + $trigger.outerWidth();\n          pos.bottom = pos.top + $trigger.outerHeight();\n\n          if (opt.$layer && !opt.hovering && (!(e.pageX >= pos.left && e.pageX <= pos.right) || !(e.pageY >= pos.top && e.pageY <= pos.bottom))) {\n            /* Additional hover check after short time, you might just miss the edge of the menu */\n            setTimeout(function () {\n              if (!opt.hovering && opt.$menu !== null && typeof opt.$menu !== 'undefined') {\n                opt.$menu.trigger('contextmenu:hide');\n              }\n            }, 50);\n          }\n        });\n      }\n    },\n    hide: function hide(opt, force) {\n      var $trigger = $(this);\n\n      if (!opt) {\n        opt = $trigger.data('contextMenu') || {};\n      } // hide event\n\n\n      if (!force && opt.events && opt.events.hide.call($trigger, opt) === false) {\n        return;\n      } // remove options and revert state\n\n\n      $trigger.removeData('contextMenu').removeClass('context-menu-active');\n\n      if (opt.$layer) {\n        // keep layer for a bit so the contextmenu event can be aborted properly by opera\n        setTimeout(function ($layer) {\n          return function () {\n            $layer.remove();\n          };\n        }(opt.$layer), 10);\n\n        try {\n          delete opt.$layer;\n        } catch (e) {\n          opt.$layer = null;\n        }\n      } // remove handle\n\n\n      $currentTrigger = null; // remove selected\n\n      opt.$menu.find('.' + opt.classNames.hover).trigger('contextmenu:blur');\n      opt.$selected = null; // collapse all submenus\n\n      opt.$menu.find('.' + opt.classNames.visible).removeClass(opt.classNames.visible); // unregister key and mouse handlers\n      // $(document).off('.contextMenuAutoHide keydown.contextMenu'); // http://bugs.jquery.com/ticket/10705\n\n      $(document).off('.contextMenuAutoHide').off('keydown.contextMenu'); // hide menu\n\n      if (opt.$menu) {\n        opt.$menu[opt.animation.hide](opt.animation.duration, function () {\n          // tear down dynamically built menu after animation is completed.\n          if (opt.build) {\n            opt.$menu.remove();\n            $.each(opt, function (key) {\n              switch (key) {\n                case 'ns':\n                case 'selector':\n                case 'build':\n                case 'trigger':\n                  return true;\n\n                default:\n                  opt[key] = undefined;\n\n                  try {\n                    delete opt[key];\n                  } catch (e) {}\n\n                  return true;\n              }\n            });\n          }\n\n          setTimeout(function () {\n            $trigger.trigger('contextmenu:hidden');\n          }, 10);\n        });\n      }\n    },\n    create: function create(opt, root) {\n      if (typeof root === 'undefined') {\n        root = opt;\n      } // create contextMenu\n\n\n      opt.$menu = $('<ul class=\"context-menu-list\"></ul>').addClass(opt.className || '').data({\n        'contextMenu': opt,\n        'contextMenuRoot': root\n      });\n\n      if (opt.dataAttr) {\n        $.each(opt.dataAttr, function (key, item) {\n          opt.$menu.attr('data-' + opt.key, item);\n        });\n      }\n\n      $.each(['callbacks', 'commands', 'inputs'], function (i, k) {\n        opt[k] = {};\n\n        if (!root[k]) {\n          root[k] = {};\n        }\n      });\n\n      if (!root.accesskeys) {\n        root.accesskeys = {};\n      }\n\n      function createNameNode(item) {\n        var $name = $('<span></span>');\n\n        if (item._accesskey) {\n          if (item._beforeAccesskey) {\n            $name.append(document.createTextNode(item._beforeAccesskey));\n          }\n\n          $('<span></span>').addClass('context-menu-accesskey').text(item._accesskey).appendTo($name);\n\n          if (item._afterAccesskey) {\n            $name.append(document.createTextNode(item._afterAccesskey));\n          }\n        } else {\n          if (item.isHtmlName) {\n            // restrict use with access keys\n            if (typeof item.accesskey !== 'undefined') {\n              throw new Error('accesskeys are not compatible with HTML names and cannot be used together in the same item');\n            }\n\n            $name.html(item.name);\n          } else {\n            $name.text(item.name);\n          }\n        }\n\n        return $name;\n      } // create contextMenu items\n\n\n      $.each(opt.items, function (key, item) {\n        var $t = $('<li class=\"context-menu-item\"></li>').addClass(item.className || ''),\n            $label = null,\n            $input = null; // iOS needs to see a click-event bound to an element to actually\n        // have the TouchEvents infrastructure trigger the click event\n\n        $t.on('click', $.noop); // Make old school string seperator a real item so checks wont be\n        // akward later.\n        // And normalize 'cm_separator' into 'cm_seperator'.\n\n        if (typeof item === 'string' || item.type === 'cm_separator') {\n          item = {\n            type: 'cm_seperator'\n          };\n        }\n\n        item.$node = $t.data({\n          'contextMenu': opt,\n          'contextMenuRoot': root,\n          'contextMenuKey': key\n        }); // register accesskey\n        // NOTE: the accesskey attribute should be applicable to any element, but Safari5 and Chrome13 still can't do that\n\n        if (typeof item.accesskey !== 'undefined') {\n          var aks = splitAccesskey(item.accesskey);\n\n          for (var i = 0, ak; ak = aks[i]; i++) {\n            if (!root.accesskeys[ak]) {\n              root.accesskeys[ak] = item;\n              var matched = item.name.match(new RegExp('^(.*?)(' + ak + ')(.*)$', 'i'));\n\n              if (matched) {\n                item._beforeAccesskey = matched[1];\n                item._accesskey = matched[2];\n                item._afterAccesskey = matched[3];\n              }\n\n              break;\n            }\n          }\n        }\n\n        if (item.type && types[item.type]) {\n          // run custom type handler\n          types[item.type].call($t, item, opt, root); // register commands\n\n          $.each([opt, root], function (i, k) {\n            k.commands[key] = item; // Overwrite only if undefined or the item is appended to the root. This so it\n            // doesn't overwrite callbacks of root elements if the name is the same.\n\n            if ($.isFunction(item.callback) && (typeof k.callbacks[key] === 'undefined' || typeof opt.type === 'undefined')) {\n              k.callbacks[key] = item.callback;\n            }\n          });\n        } else {\n          // add label for input\n          if (item.type === 'cm_seperator') {\n            $t.addClass('context-menu-separator ' + root.classNames.notSelectable);\n          } else if (item.type === 'html') {\n            $t.addClass('context-menu-html ' + root.classNames.notSelectable);\n          } else if (item.type !== 'sub' && item.type) {\n            $label = $('<label></label>').appendTo($t);\n            createNameNode(item).appendTo($label);\n            $t.addClass('context-menu-input');\n            opt.hasTypes = true;\n            $.each([opt, root], function (i, k) {\n              k.commands[key] = item;\n              k.inputs[key] = item;\n            });\n          } else if (item.items) {\n            item.type = 'sub';\n          }\n\n          switch (item.type) {\n            case 'cm_seperator':\n              break;\n\n            case 'text':\n              $input = $('<input type=\"text\" value=\"1\" name=\"\" />').attr('name', 'context-menu-input-' + key).val(item.value || '').appendTo($label);\n              break;\n\n            case 'textarea':\n              $input = $('<textarea name=\"\"></textarea>').attr('name', 'context-menu-input-' + key).val(item.value || '').appendTo($label);\n\n              if (item.height) {\n                $input.height(item.height);\n              }\n\n              break;\n\n            case 'checkbox':\n              $input = $('<input type=\"checkbox\" value=\"1\" name=\"\" />').attr('name', 'context-menu-input-' + key).val(item.value || '').prop('checked', !!item.selected).prependTo($label);\n              break;\n\n            case 'radio':\n              $input = $('<input type=\"radio\" value=\"1\" name=\"\" />').attr('name', 'context-menu-input-' + item.radio).val(item.value || '').prop('checked', !!item.selected).prependTo($label);\n              break;\n\n            case 'select':\n              $input = $('<select name=\"\"></select>').attr('name', 'context-menu-input-' + key).appendTo($label);\n\n              if (item.options) {\n                $.each(item.options, function (value, text) {\n                  $('<option></option>').val(value).text(text).appendTo($input);\n                });\n                $input.val(item.selected);\n              }\n\n              break;\n\n            case 'sub':\n              createNameNode(item).appendTo($t);\n              item.appendTo = item.$node;\n              $t.data('contextMenu', item).addClass('context-menu-submenu');\n              item.callback = null; // If item contains items, and this is a promise, we should create it later\n              // check if subitems is of type promise. If it is a promise we need to create\n              // it later, after promise has been resolved.\n\n              if ('function' === typeof item.items.then) {\n                // probably a promise, process it, when completed it will create the sub menu's.\n                op.processPromises(item, root, item.items);\n              } else {\n                // normal submenu.\n                op.create(item, root);\n              }\n\n              break;\n\n            case 'html':\n              $(item.html).appendTo($t);\n              break;\n\n            default:\n              $.each([opt, root], function (i, k) {\n                k.commands[key] = item; // Overwrite only if undefined or the item is appended to the root. This so it\n                // doesn't overwrite callbacks of root elements if the name is the same.\n\n                if ($.isFunction(item.callback) && (typeof k.callbacks[key] === 'undefined' || typeof opt.type === 'undefined')) {\n                  k.callbacks[key] = item.callback;\n                }\n              });\n              createNameNode(item).appendTo($t);\n              break;\n          } // disable key listener in <input>\n\n\n          if (item.type && item.type !== 'sub' && item.type !== 'html' && item.type !== 'cm_seperator') {\n            $input.on('focus', handle.focusInput).on('blur', handle.blurInput);\n\n            if (item.events) {\n              $input.on(item.events, opt);\n            }\n          } // add icons\n\n\n          if (item.icon) {\n            if ($.isFunction(item.icon)) {\n              item._icon = item.icon.call(this, this, $t, key, item);\n            } else {\n              if (typeof item.icon === 'string' && (item.icon.substring(0, 4) === 'fab ' || item.icon.substring(0, 4) === 'fas ' || item.icon.substring(0, 4) === 'fad ' || item.icon.substring(0, 4) === 'far ' || item.icon.substring(0, 4) === 'fal ')) {\n                // to enable font awesome\n                $t.addClass(root.classNames.icon + ' ' + root.classNames.icon + '--fa5');\n                item._icon = $('<i class=\"' + item.icon + '\"></i>');\n              } else if (typeof item.icon === 'string' && item.icon.substring(0, 3) === 'fa-') {\n                item._icon = root.classNames.icon + ' ' + root.classNames.icon + '--fa fa ' + item.icon;\n              } else {\n                item._icon = root.classNames.icon + ' ' + root.classNames.icon + '-' + item.icon;\n              }\n            }\n\n            if (typeof item._icon === \"string\") {\n              $t.addClass(item._icon);\n            } else {\n              $t.prepend(item._icon);\n            }\n          }\n        } // cache contained elements\n\n\n        item.$input = $input;\n        item.$label = $label; // attach item to menu\n\n        $t.appendTo(opt.$menu); // Disable text selection\n\n        if (!opt.hasTypes && $.support.eventSelectstart) {\n          // browsers support user-select: none,\n          // IE has a special event for text-selection\n          // browsers supporting neither will not be preventing text-selection\n          $t.on('selectstart.disableTextSelect', handle.abortevent);\n        }\n      }); // attach contextMenu to <body> (to bypass any possible overflow:hidden issues on parents of the trigger element)\n\n      if (!opt.$node) {\n        opt.$menu.css('display', 'none').addClass('context-menu-root');\n      }\n\n      opt.$menu.appendTo(opt.appendTo || document.body);\n    },\n    resize: function resize($menu, nested) {\n      var domMenu; // determine widths of submenus, as CSS won't grow them automatically\n      // position:absolute within position:absolute; min-width:100; max-width:200; results in width: 100;\n      // kinda sucks hard...\n      // determine width of absolutely positioned element\n\n      $menu.css({\n        position: 'absolute',\n        display: 'block'\n      }); // don't apply yet, because that would break nested elements' widths\n\n      $menu.data('width', (domMenu = $menu.get(0)).getBoundingClientRect ? Math.ceil(domMenu.getBoundingClientRect().width) : $menu.outerWidth() + 1); // outerWidth() returns rounded pixels\n      // reset styles so they allow nested elements to grow/shrink naturally\n\n      $menu.css({\n        position: 'static',\n        minWidth: '0px',\n        maxWidth: '100000px'\n      }); // identify width of nested menus\n\n      $menu.find('> li > ul').each(function () {\n        op.resize($(this), true);\n      }); // reset and apply changes in the end because nested\n      // elements' widths wouldn't be calculatable otherwise\n\n      if (!nested) {\n        $menu.find('ul').addBack().css({\n          position: '',\n          display: '',\n          minWidth: '',\n          maxWidth: ''\n        }).outerWidth(function () {\n          return $(this).data('width');\n        });\n      }\n    },\n    update: function update(opt, root) {\n      var $trigger = this;\n\n      if (typeof root === 'undefined') {\n        root = opt;\n        op.resize(opt.$menu);\n      }\n\n      var hasVisibleItems = false; // re-check disabled for each item\n\n      opt.$menu.children().each(function () {\n        var $item = $(this),\n            key = $item.data('contextMenuKey'),\n            item = opt.items[key],\n            disabled = $.isFunction(item.disabled) && item.disabled.call($trigger, key, root) || item.disabled === true,\n            visible;\n\n        if ($.isFunction(item.visible)) {\n          visible = item.visible.call($trigger, key, root);\n        } else if (typeof item.visible !== 'undefined') {\n          visible = item.visible === true;\n        } else {\n          visible = true;\n        }\n\n        if (visible) {\n          hasVisibleItems = true;\n        }\n\n        $item[visible ? 'show' : 'hide'](); // dis- / enable item\n\n        $item[disabled ? 'addClass' : 'removeClass'](root.classNames.disabled);\n\n        if ($.isFunction(item.icon)) {\n          $item.removeClass(item._icon);\n          var iconResult = item.icon.call(this, $trigger, $item, key, item);\n\n          if (typeof iconResult === \"string\") {\n            $item.addClass(iconResult);\n          } else {\n            $item.prepend(iconResult);\n          }\n        }\n\n        if (item.type) {\n          // dis- / enable input elements\n          $item.find('input, select, textarea').prop('disabled', disabled); // update input states\n\n          switch (item.type) {\n            case 'text':\n            case 'textarea':\n              item.$input.val(item.value || '');\n              break;\n\n            case 'checkbox':\n            case 'radio':\n              item.$input.val(item.value || '').prop('checked', !!item.selected);\n              break;\n\n            case 'select':\n              item.$input.val((item.selected === 0 ? \"0\" : item.selected) || '');\n              break;\n          }\n        }\n\n        if (item.$menu) {\n          // update sub-menu\n          var subMenuHasVisibleItems = op.update.call($trigger, item, root);\n\n          if (subMenuHasVisibleItems) {\n            hasVisibleItems = true;\n          }\n        }\n      });\n      return hasVisibleItems;\n    },\n    layer: function layer(opt, zIndex) {\n      // add transparent layer for click area\n      // filter and background for Internet Explorer, Issue #23\n      var $layer = opt.$layer = $('<div id=\"context-menu-layer\"></div>').css({\n        height: $win.height(),\n        width: $win.width(),\n        display: 'block',\n        position: 'fixed',\n        'z-index': zIndex - 1,\n        top: 0,\n        left: 0,\n        opacity: 0,\n        filter: 'alpha(opacity=0)',\n        'background-color': '#000'\n      }).data('contextMenuRoot', opt).appendTo(document.body).on('contextmenu', handle.abortevent).on('mousedown', handle.layerClick); // IE6 doesn't know position:fixed;\n\n      if (typeof document.body.style.maxWidth === 'undefined') {\n        // IE6 doesn't support maxWidth\n        $layer.css({\n          'position': 'absolute',\n          'height': $(document).height()\n        });\n      }\n\n      return $layer;\n    },\n    processPromises: function processPromises(opt, root, promise) {\n      // Start\n      opt.$node.addClass(root.classNames.iconLoadingClass);\n\n      function completedPromise(opt, root, items) {\n        // Completed promise (dev called promise.resolve). We now have a list of items which can\n        // be used to create the rest of the context menu.\n        if (typeof items === 'undefined') {\n          // Null result, dev should have checked\n          errorPromise(undefined); //own error object\n        }\n\n        finishPromiseProcess(opt, root, items);\n      }\n\n      function errorPromise(opt, root, errorItem) {\n        // User called promise.reject() with an error item, if not, provide own error item.\n        if (typeof errorItem === 'undefined') {\n          errorItem = {\n            \"error\": {\n              name: \"No items and no error item\",\n              icon: \"context-menu-icon context-menu-icon-quit\"\n            }\n          };\n\n          if (window.console) {\n            (console.error || console.log).call(console, 'When you reject a promise, provide an \"items\" object, equal to normal sub-menu items');\n          }\n        } else if (typeof errorItem === 'string') {\n          errorItem = {\n            \"error\": {\n              name: errorItem\n            }\n          };\n        }\n\n        finishPromiseProcess(opt, root, errorItem);\n      }\n\n      function finishPromiseProcess(opt, root, items) {\n        if (typeof root.$menu === 'undefined' || !root.$menu.is(':visible')) {\n          return;\n        }\n\n        opt.$node.removeClass(root.classNames.iconLoadingClass);\n        opt.items = items;\n        op.create(opt, root, true); // Create submenu\n\n        op.update(opt, root); // Correctly update position if user is already hovered over menu item\n\n        root.positionSubmenu.call(opt.$node, opt.$menu); // positionSubmenu, will only do anything if user already hovered over menu item that just got new subitems.\n      } // Wait for promise completion. .then(success, error, notify) (we don't track notify). Bind the opt\n      // and root to avoid scope problems\n\n\n      promise.then(completedPromise.bind(this, opt, root), errorPromise.bind(this, opt, root));\n    },\n    // operation that will run after contextMenu showed on screen\n    activated: function activated(opt) {\n      var $menu = opt.$menu;\n      var $menuOffset = $menu.offset();\n      var winHeight = $(window).height();\n      var winScrollTop = $(window).scrollTop();\n      var menuHeight = $menu.height();\n\n      if (menuHeight > winHeight) {\n        $menu.css({\n          'height': winHeight + 'px',\n          'overflow-x': 'hidden',\n          'overflow-y': 'auto',\n          'top': winScrollTop + 'px'\n        });\n      } else if ($menuOffset.top < winScrollTop || $menuOffset.top + menuHeight > winScrollTop + winHeight) {\n        $menu.css({\n          'top': winScrollTop + 'px'\n        });\n      }\n    }\n  }; // split accesskey according to http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#assigned-access-key\n\n\n  function splitAccesskey(val) {\n    var t = val.split(/\\s+/);\n    var keys = [];\n\n    for (var i = 0, k; k = t[i]; i++) {\n      k = k.charAt(0).toUpperCase(); // first character only\n      // theoretically non-accessible characters should be ignored, but different systems, different keyboard layouts, ... screw it.\n      // a map to look up already used access keys would be nice\n\n      keys.push(k);\n    }\n\n    return keys;\n  } // handle contextMenu triggers\n\n\n  $.fn.contextMenu = function (operation) {\n    var $t = this,\n        $o = operation;\n\n    if (this.length > 0) {\n      // this is not a build on demand menu\n      if (typeof operation === 'undefined') {\n        this.first().trigger('contextmenu');\n      } else if (typeof operation.x !== 'undefined' && typeof operation.y !== 'undefined') {\n        this.first().trigger($.Event('contextmenu', {\n          pageX: operation.x,\n          pageY: operation.y,\n          mouseButton: operation.button\n        }));\n      } else if (operation === 'hide') {\n        var $menu = this.first().data('contextMenu') ? this.first().data('contextMenu').$menu : null;\n\n        if ($menu) {\n          $menu.trigger('contextmenu:hide');\n        }\n      } else if (operation === 'destroy') {\n        $.contextMenu('destroy', {\n          context: this\n        });\n      } else if ($.isPlainObject(operation)) {\n        operation.context = this;\n        $.contextMenu('create', operation);\n      } else if (operation) {\n        this.removeClass('context-menu-disabled');\n      } else if (!operation) {\n        this.addClass('context-menu-disabled');\n      }\n    } else {\n      $.each(menus, function () {\n        if (this.selector === $t.selector) {\n          $o.data = this;\n          $.extend($o.data, {\n            trigger: 'demand'\n          });\n        }\n      });\n      handle.contextmenu.call($o.target, $o);\n    }\n\n    return this;\n  }; // manage contextMenu instances\n\n\n  $.contextMenu = function (operation, options) {\n    if (typeof operation !== 'string') {\n      options = operation;\n      operation = 'create';\n    }\n\n    if (typeof options === 'string') {\n      options = {\n        selector: options\n      };\n    } else if (typeof options === 'undefined') {\n      options = {};\n    } // merge with default options\n\n\n    var o = $.extend(true, {}, defaults, options || {});\n    var $document = $(document);\n    var $context = $document;\n    var _hasContext = false;\n\n    if (!o.context || !o.context.length) {\n      o.context = document;\n    } else {\n      // you never know what they throw at you...\n      $context = $(o.context).first();\n      o.context = $context.get(0);\n      _hasContext = !$(o.context).is(document);\n    }\n\n    switch (operation) {\n      case 'update':\n        // Updates visibility and such\n        if (_hasContext) {\n          op.update($context);\n        } else {\n          for (var menu in menus) {\n            if (menus.hasOwnProperty(menu)) {\n              op.update(menus[menu]);\n            }\n          }\n        }\n\n        break;\n\n      case 'create':\n        // no selector no joy\n        if (!o.selector) {\n          throw new Error('No selector specified');\n        } // make sure internal classes are not bound to\n\n\n        if (o.selector.match(/.context-menu-(list|item|input)($|\\s)/)) {\n          throw new Error('Cannot bind to selector \"' + o.selector + '\" as it contains a reserved className');\n        }\n\n        if (!o.build && (!o.items || $.isEmptyObject(o.items))) {\n          throw new Error('No Items specified');\n        }\n\n        counter++;\n        o.ns = '.contextMenu' + counter;\n\n        if (!_hasContext) {\n          namespaces[o.selector] = o.ns;\n        }\n\n        menus[o.ns] = o; // default to right click\n\n        if (!o.trigger) {\n          o.trigger = 'right';\n        }\n\n        if (!initialized) {\n          var itemClick = o.itemClickEvent === 'click' ? 'click.contextMenu' : 'mouseup.contextMenu';\n          var contextMenuItemObj = {\n            // 'mouseup.contextMenu': handle.itemClick,\n            // 'click.contextMenu': handle.itemClick,\n            'contextmenu:focus.contextMenu': handle.focusItem,\n            'contextmenu:blur.contextMenu': handle.blurItem,\n            'contextmenu.contextMenu': handle.abortevent,\n            'mouseenter.contextMenu': handle.itemMouseenter,\n            'mouseleave.contextMenu': handle.itemMouseleave\n          };\n          contextMenuItemObj[itemClick] = handle.itemClick; // make sure item click is registered first\n\n          $document.on({\n            'contextmenu:hide.contextMenu': handle.hideMenu,\n            'prevcommand.contextMenu': handle.prevItem,\n            'nextcommand.contextMenu': handle.nextItem,\n            'contextmenu.contextMenu': handle.abortevent,\n            'mouseenter.contextMenu': handle.menuMouseenter,\n            'mouseleave.contextMenu': handle.menuMouseleave\n          }, '.context-menu-list').on('mouseup.contextMenu', '.context-menu-input', handle.inputClick).on(contextMenuItemObj, '.context-menu-item');\n          initialized = true;\n        } // engage native contextmenu event\n\n\n        $context.on('contextmenu' + o.ns, o.selector, o, handle.contextmenu);\n\n        if (_hasContext) {\n          // add remove hook, just in case\n          $context.on('remove' + o.ns, function () {\n            $(this).contextMenu('destroy');\n          });\n        }\n\n        switch (o.trigger) {\n          case 'hover':\n            $context.on('mouseenter' + o.ns, o.selector, o, handle.mouseenter).on('mouseleave' + o.ns, o.selector, o, handle.mouseleave);\n            break;\n\n          case 'left':\n            $context.on('click' + o.ns, o.selector, o, handle.click);\n            break;\n\n          case 'touchstart':\n            $context.on('touchstart' + o.ns, o.selector, o, handle.click);\n            break;\n\n          /*\r\n           default:\r\n           // http://www.quirksmode.org/dom/events/contextmenu.html\r\n           $document\r\n           .on('mousedown' + o.ns, o.selector, o, handle.mousedown)\r\n           .on('mouseup' + o.ns, o.selector, o, handle.mouseup);\r\n           break;\r\n           */\n        } // create menu\n\n\n        if (!o.build) {\n          op.create(o);\n        }\n\n        break;\n\n      case 'destroy':\n        var $visibleMenu;\n\n        if (_hasContext) {\n          // get proper options\n          var context = o.context;\n          $.each(menus, function (ns, o) {\n            if (!o) {\n              return true;\n            } // Is this menu equest to the context called from\n\n\n            if (!$(context).is(o.selector)) {\n              return true;\n            }\n\n            $visibleMenu = $('.context-menu-list').filter(':visible');\n\n            if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is($(o.context).find(o.selector))) {\n              $visibleMenu.trigger('contextmenu:hide', {\n                force: true\n              });\n            }\n\n            try {\n              if (menus[o.ns].$menu) {\n                menus[o.ns].$menu.remove();\n              }\n\n              delete menus[o.ns];\n            } catch (e) {\n              menus[o.ns] = null;\n            }\n\n            $(o.context).off(o.ns);\n            return true;\n          });\n        } else if (!o.selector) {\n          $document.off('.contextMenu .contextMenuAutoHide');\n          $.each(menus, function (ns, o) {\n            $(o.context).off(o.ns);\n          });\n          namespaces = {};\n          menus = {};\n          counter = 0;\n          initialized = false;\n          $('#context-menu-layer, .context-menu-list').remove();\n        } else if (namespaces[o.selector]) {\n          $visibleMenu = $('.context-menu-list').filter(':visible');\n\n          if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is(o.selector)) {\n            $visibleMenu.trigger('contextmenu:hide', {\n              force: true\n            });\n          }\n\n          try {\n            if (menus[namespaces[o.selector]].$menu) {\n              menus[namespaces[o.selector]].$menu.remove();\n            }\n\n            delete menus[namespaces[o.selector]];\n          } catch (e) {\n            menus[namespaces[o.selector]] = null;\n          }\n\n          $document.off(namespaces[o.selector]);\n        }\n\n        break;\n\n      case 'html5':\n        // if <command> and <menuitem> are not handled by the browser,\n        // or options was a bool true,\n        // initialize $.contextMenu for them\n        if (!$.support.htmlCommand && !$.support.htmlMenuitem || typeof options === 'boolean' && options) {\n          $('menu[type=\"context\"]').each(function () {\n            if (this.id) {\n              $.contextMenu({\n                selector: '[contextmenu=' + this.id + ']',\n                items: $.contextMenu.fromMenu(this)\n              });\n            }\n          }).css('display', 'none');\n        }\n\n        break;\n\n      default:\n        throw new Error('Unknown operation \"' + operation + '\"');\n    }\n\n    return this;\n  }; // import values into <input> commands\n\n\n  $.contextMenu.setInputValues = function (opt, data) {\n    if (typeof data === 'undefined') {\n      data = {};\n    }\n\n    $.each(opt.inputs, function (key, item) {\n      switch (item.type) {\n        case 'text':\n        case 'textarea':\n          item.value = data[key] || '';\n          break;\n\n        case 'checkbox':\n          item.selected = data[key] ? true : false;\n          break;\n\n        case 'radio':\n          item.selected = (data[item.radio] || '') === item.value;\n          break;\n\n        case 'select':\n          item.selected = data[key] || '';\n          break;\n      }\n    });\n  }; // export values from <input> commands\n\n\n  $.contextMenu.getInputValues = function (opt, data) {\n    if (typeof data === 'undefined') {\n      data = {};\n    }\n\n    $.each(opt.inputs, function (key, item) {\n      switch (item.type) {\n        case 'text':\n        case 'textarea':\n        case 'select':\n          data[key] = item.$input.val();\n          break;\n\n        case 'checkbox':\n          data[key] = item.$input.prop('checked');\n          break;\n\n        case 'radio':\n          if (item.$input.prop('checked')) {\n            data[item.radio] = item.value;\n          }\n\n          break;\n      }\n    });\n    return data;\n  }; // find <label for=\"xyz\">\n\n\n  function inputLabel(node) {\n    return node.id && $('label[for=\"' + node.id + '\"]').val() || node.name;\n  } // convert <menu> to items object\n\n\n  function menuChildren(items, $children, counter) {\n    if (!counter) {\n      counter = 0;\n    }\n\n    $children.each(function () {\n      var $node = $(this),\n          node = this,\n          nodeName = this.nodeName.toLowerCase(),\n          label,\n          item; // extract <label><input>\n\n      if (nodeName === 'label' && $node.find('input, textarea, select').length) {\n        label = $node.text();\n        $node = $node.children().first();\n        node = $node.get(0);\n        nodeName = node.nodeName.toLowerCase();\n      }\n      /*\r\n       * <menu> accepts flow-content as children. that means <embed>, <canvas> and such are valid menu items.\r\n       * Not being the sadistic kind, $.contextMenu only accepts:\r\n       * <command>, <menuitem>, <hr>, <span>, <p> <input [text, radio, checkbox]>, <textarea>, <select> and of course <menu>.\r\n       * Everything else will be imported as an html node, which is not interfaced with contextMenu.\r\n       */\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/commands.html#concept-command\n\n\n      switch (nodeName) {\n        // http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#the-menu-element\n        case 'menu':\n          item = {\n            name: $node.attr('label'),\n            items: {}\n          };\n          counter = menuChildren(item.items, $node.children(), counter);\n          break;\n        // http://www.whatwg.org/specs/web-apps/current-work/multipage/commands.html#using-the-a-element-to-define-a-command\n\n        case 'a': // http://www.whatwg.org/specs/web-apps/current-work/multipage/commands.html#using-the-button-element-to-define-a-command\n\n        case 'button':\n          item = {\n            name: $node.text(),\n            disabled: !!$node.attr('disabled'),\n            callback: function () {\n              return function () {\n                $node.get(0).click();\n              };\n            }()\n          };\n          break;\n        // http://www.whatwg.org/specs/web-apps/current-work/multipage/commands.html#using-the-command-element-to-define-a-command\n\n        case 'menuitem':\n        case 'command':\n          switch ($node.attr('type')) {\n            case undefined:\n            case 'command':\n            case 'menuitem':\n              item = {\n                name: $node.attr('label'),\n                disabled: !!$node.attr('disabled'),\n                icon: $node.attr('icon'),\n                callback: function () {\n                  return function () {\n                    $node.get(0).click();\n                  };\n                }()\n              };\n              break;\n\n            case 'checkbox':\n              item = {\n                type: 'checkbox',\n                disabled: !!$node.attr('disabled'),\n                name: $node.attr('label'),\n                selected: !!$node.attr('checked')\n              };\n              break;\n\n            case 'radio':\n              item = {\n                type: 'radio',\n                disabled: !!$node.attr('disabled'),\n                name: $node.attr('label'),\n                radio: $node.attr('radiogroup'),\n                value: $node.attr('id'),\n                selected: !!$node.attr('checked')\n              };\n              break;\n\n            default:\n              item = undefined;\n          }\n\n          break;\n\n        case 'hr':\n          item = '-------';\n          break;\n\n        case 'input':\n          switch ($node.attr('type')) {\n            case 'text':\n              item = {\n                type: 'text',\n                name: label || inputLabel(node),\n                disabled: !!$node.attr('disabled'),\n                value: $node.val()\n              };\n              break;\n\n            case 'checkbox':\n              item = {\n                type: 'checkbox',\n                name: label || inputLabel(node),\n                disabled: !!$node.attr('disabled'),\n                selected: !!$node.attr('checked')\n              };\n              break;\n\n            case 'radio':\n              item = {\n                type: 'radio',\n                name: label || inputLabel(node),\n                disabled: !!$node.attr('disabled'),\n                radio: !!$node.attr('name'),\n                value: $node.val(),\n                selected: !!$node.attr('checked')\n              };\n              break;\n\n            default:\n              item = undefined;\n              break;\n          }\n\n          break;\n\n        case 'select':\n          item = {\n            type: 'select',\n            name: label || inputLabel(node),\n            disabled: !!$node.attr('disabled'),\n            selected: $node.val(),\n            options: {}\n          };\n          $node.children().each(function () {\n            item.options[this.value] = $(this).text();\n          });\n          break;\n\n        case 'textarea':\n          item = {\n            type: 'textarea',\n            name: label || inputLabel(node),\n            disabled: !!$node.attr('disabled'),\n            value: $node.val()\n          };\n          break;\n\n        case 'label':\n          break;\n\n        default:\n          item = {\n            type: 'html',\n            html: $node.clone(true)\n          };\n          break;\n      }\n\n      if (item) {\n        counter++;\n        items['key' + counter] = item;\n      }\n    });\n    return counter;\n  } // convert html5 menu\n\n\n  $.contextMenu.fromMenu = function (element) {\n    var $this = $(element),\n        items = {};\n    menuChildren(items, $this.children());\n    return items;\n  }; // make defaults accessible\n\n\n  $.contextMenu.defaults = defaults;\n  $.contextMenu.types = types; // export internal functions - undocumented, for hacking only!\n\n  $.contextMenu.handle = handle;\n  $.contextMenu.op = op;\n  $.contextMenu.menus = menus;\n});\n\n//# sourceURL=webpack://rup/./node_modules/jquery-contextmenu/dist/jquery.contextMenu.js?");

/***/ }),

/***/ "./node_modules/jquery-migrate/dist/jquery-migrate.js":
/*!************************************************************!*\
  !*** ./node_modules/jquery-migrate/dist/jquery-migrate.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(module, jQuery) {/*** IMPORTS FROM imports-loader ***/\n\nvar define = false;\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * jQuery Migrate - v3.4.0 - 2022-03-24T16:30Z\n * Copyright OpenJS Foundation and other contributors\n */\n(function (factory) {\n  \"use strict\";\n\n  if (typeof define === \"function\" && define.amd) {\n    // AMD. Register as an anonymous module.\n    define([\"jquery\"], function (jQuery) {\n      return factory(jQuery, window);\n    });\n  } else if (( false ? undefined : _typeof(module)) === \"object\" && module.exports) {\n    // Node/CommonJS\n    // eslint-disable-next-line no-undef\n    module.exports = factory(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), window);\n  } else {\n    // Browser globals\n    factory(jQuery, window);\n  }\n})(function (jQuery, window) {\n  \"use strict\";\n\n  jQuery.migrateVersion = \"3.4.0\"; // Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2\n\n  function compareVersions(v1, v2) {\n    var i,\n        rVersionParts = /^(\\d+)\\.(\\d+)\\.(\\d+)/,\n        v1p = rVersionParts.exec(v1) || [],\n        v2p = rVersionParts.exec(v2) || [];\n\n    for (i = 1; i <= 3; i++) {\n      if (+v1p[i] > +v2p[i]) {\n        return 1;\n      }\n\n      if (+v1p[i] < +v2p[i]) {\n        return -1;\n      }\n    }\n\n    return 0;\n  }\n\n  function jQueryVersionSince(version) {\n    return compareVersions(jQuery.fn.jquery, version) >= 0;\n  } // A map from disabled patch codes to `true`. This should really\n  // be a `Set` but those are unsupported in IE.\n\n\n  var disabledPatches = Object.create(null); // Don't apply patches for specified codes. Helpful for code bases\n  // where some Migrate warnings have been addressed and it's desirable\n  // to avoid needless patches or false positives.\n\n  jQuery.migrateDisablePatches = function () {\n    var i;\n\n    for (i = 0; i < arguments.length; i++) {\n      disabledPatches[arguments[i]] = true;\n    }\n  }; // Allow enabling patches disabled via `jQuery.migrateDisablePatches`.\n  // Helpful if you want to disable a patch only for some code that won't\n  // be updated soon to be able to focus on other warnings - and enable it\n  // immediately after such a call:\n  // ```js\n  // jQuery.migrateDisablePatches( \"workaroundA\" );\n  // elem.pluginViolatingWarningA( \"pluginMethod\" );\n  // jQuery.migrateEnablePatches( \"workaroundA\" );\n  // ```\n\n\n  jQuery.migrateEnablePatches = function () {\n    var i;\n\n    for (i = 0; i < arguments.length; i++) {\n      delete disabledPatches[arguments[i]];\n    }\n  };\n\n  jQuery.migrateIsPatchEnabled = function (patchCode) {\n    return !disabledPatches[patchCode];\n  };\n\n  (function () {\n    // Support: IE9 only\n    // IE9 only creates console object when dev tools are first opened\n    // IE9 console is a host object, callable but doesn't have .apply()\n    if (!window.console || !window.console.log) {\n      return;\n    } // Need jQuery 3.0.0+ and no older Migrate loaded\n\n\n    if (!jQuery || !jQueryVersionSince(\"3.0.0\")) {\n      window.console.log(\"JQMIGRATE: jQuery 3.0.0+ REQUIRED\");\n    }\n\n    if (jQuery.migrateWarnings) {\n      window.console.log(\"JQMIGRATE: Migrate plugin loaded multiple times\");\n    } // Show a message on the console so devs know we're active\n\n\n    window.console.log(\"JQMIGRATE: Migrate is installed\" + (jQuery.migrateMute ? \"\" : \" with logging active\") + \", version \" + jQuery.migrateVersion);\n  })();\n\n  var warnedAbout = {}; // By default each warning is only reported once.\n\n  jQuery.migrateDeduplicateWarnings = true; // List of warnings already given; public read only\n\n  jQuery.migrateWarnings = []; // Set to false to disable traces that appear with warnings\n\n  if (jQuery.migrateTrace === undefined) {\n    jQuery.migrateTrace = true;\n  } // Forget any warnings we've already given; public\n\n\n  jQuery.migrateReset = function () {\n    warnedAbout = {};\n    jQuery.migrateWarnings.length = 0;\n  };\n\n  function migrateWarn(code, msg) {\n    var console = window.console;\n\n    if (jQuery.migrateIsPatchEnabled(code) && (!jQuery.migrateDeduplicateWarnings || !warnedAbout[msg])) {\n      warnedAbout[msg] = true;\n      jQuery.migrateWarnings.push(msg + \" [\" + code + \"]\");\n\n      if (console && console.warn && !jQuery.migrateMute) {\n        console.warn(\"JQMIGRATE: \" + msg);\n\n        if (jQuery.migrateTrace && console.trace) {\n          console.trace();\n        }\n      }\n    }\n  }\n\n  function migrateWarnProp(obj, prop, value, code, msg) {\n    Object.defineProperty(obj, prop, {\n      configurable: true,\n      enumerable: true,\n      get: function get() {\n        migrateWarn(code, msg);\n        return value;\n      },\n      set: function set(newValue) {\n        migrateWarn(code, msg);\n        value = newValue;\n      }\n    });\n  }\n\n  function migrateWarnFuncInternal(obj, prop, newFunc, code, msg) {\n    var finalFunc,\n        origFunc = obj[prop];\n\n    obj[prop] = function () {\n      // If `msg` not provided, do not warn; more sophisticated warnings\n      // logic is most likely embedded in `newFunc`, in that case here\n      // we just care about the logic choosing the proper implementation\n      // based on whether the patch is disabled or not.\n      if (msg) {\n        migrateWarn(code, msg);\n      } // Since patches can be disabled & enabled dynamically, we\n      // need to decide which implementation to run on each invocation.\n\n\n      finalFunc = jQuery.migrateIsPatchEnabled(code) ? newFunc : // The function may not have existed originally so we need a fallback.\n      origFunc || jQuery.noop;\n      return finalFunc.apply(this, arguments);\n    };\n  }\n\n  function migratePatchAndWarnFunc(obj, prop, newFunc, code, msg) {\n    if (!msg) {\n      throw new Error(\"No warning message provided\");\n    }\n\n    return migrateWarnFuncInternal(obj, prop, newFunc, code, msg);\n  }\n\n  function migratePatchFunc(obj, prop, newFunc, code) {\n    return migrateWarnFuncInternal(obj, prop, newFunc, code);\n  }\n\n  if (window.document.compatMode === \"BackCompat\") {\n    // jQuery has never supported or tested Quirks Mode\n    migrateWarn(\"quirks\", \"jQuery is not compatible with Quirks Mode\");\n  }\n\n  var findProp,\n      class2type = {},\n      oldInit = jQuery.fn.init,\n      oldFind = jQuery.find,\n      rattrHashTest = /\\[(\\s*[-\\w]+\\s*)([~|^$*]?=)\\s*([-\\w#]*?#[-\\w#]*)\\s*\\]/,\n      rattrHashGlob = /\\[(\\s*[-\\w]+\\s*)([~|^$*]?=)\\s*([-\\w#]*?#[-\\w#]*)\\s*\\]/g,\n      // Support: Android <=4.0 only\n  // Make sure we trim BOM and NBSP\n  rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n  migratePatchFunc(jQuery.fn, \"init\", function (arg1) {\n    var args = Array.prototype.slice.call(arguments);\n\n    if (jQuery.migrateIsPatchEnabled(\"selector-empty-id\") && typeof arg1 === \"string\" && arg1 === \"#\") {\n      // JQuery( \"#\" ) is a bogus ID selector, but it returned an empty set\n      // before jQuery 3.0\n      migrateWarn(\"selector-empty-id\", \"jQuery( '#' ) is not a valid selector\");\n      args[0] = [];\n    }\n\n    return oldInit.apply(this, args);\n  }, \"selector-empty-id\"); // This is already done in Core but the above patch will lose this assignment\n  // so we need to redo it. It doesn't matter whether the patch is enabled or not\n  // as the method is always going to be a Migrate-created wrapper.\n\n  jQuery.fn.init.prototype = jQuery.fn;\n  migratePatchFunc(jQuery, \"find\", function (selector) {\n    var args = Array.prototype.slice.call(arguments); // Support: PhantomJS 1.x\n    // String#match fails to match when used with a //g RegExp, only on some strings\n\n    if (typeof selector === \"string\" && rattrHashTest.test(selector)) {\n      // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0\n      // First see if qS thinks it's a valid selector, if so avoid a false positive\n      try {\n        window.document.querySelector(selector);\n      } catch (err1) {\n        // Didn't *look* valid to qSA, warn and try quoting what we think is the value\n        selector = selector.replace(rattrHashGlob, function (_, attr, op, value) {\n          return \"[\" + attr + op + \"\\\"\" + value + \"\\\"]\";\n        }); // If the regexp *may* have created an invalid selector, don't update it\n        // Note that there may be false alarms if selector uses jQuery extensions\n\n        try {\n          window.document.querySelector(selector);\n          migrateWarn(\"selector-hash\", \"Attribute selector with '#' must be quoted: \" + args[0]);\n          args[0] = selector;\n        } catch (err2) {\n          migrateWarn(\"selector-hash\", \"Attribute selector with '#' was not fixed: \" + args[0]);\n        }\n      }\n    }\n\n    return oldFind.apply(this, args);\n  }, \"selector-hash\"); // Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)\n\n  for (findProp in oldFind) {\n    if (Object.prototype.hasOwnProperty.call(oldFind, findProp)) {\n      jQuery.find[findProp] = oldFind[findProp];\n    }\n  } // The number of elements contained in the matched element set\n\n\n  migratePatchAndWarnFunc(jQuery.fn, \"size\", function () {\n    return this.length;\n  }, \"size\", \"jQuery.fn.size() is deprecated and removed; use the .length property\");\n  migratePatchAndWarnFunc(jQuery, \"parseJSON\", function () {\n    return JSON.parse.apply(null, arguments);\n  }, \"parseJSON\", \"jQuery.parseJSON is deprecated; use JSON.parse\");\n  migratePatchAndWarnFunc(jQuery, \"holdReady\", jQuery.holdReady, \"holdReady\", \"jQuery.holdReady is deprecated\");\n  migratePatchAndWarnFunc(jQuery, \"unique\", jQuery.uniqueSort, \"unique\", \"jQuery.unique is deprecated; use jQuery.uniqueSort\"); // Now jQuery.expr.pseudos is the standard incantation\n\n  migrateWarnProp(jQuery.expr, \"filters\", jQuery.expr.pseudos, \"expr-pre-pseudos\", \"jQuery.expr.filters is deprecated; use jQuery.expr.pseudos\");\n  migrateWarnProp(jQuery.expr, \":\", jQuery.expr.pseudos, \"expr-pre-pseudos\", \"jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos\"); // Prior to jQuery 3.1.1 there were internal refs so we don't warn there\n\n  if (jQueryVersionSince(\"3.1.1\")) {\n    migratePatchAndWarnFunc(jQuery, \"trim\", function (text) {\n      return text == null ? \"\" : (text + \"\").replace(rtrim, \"\");\n    }, \"trim\", \"jQuery.trim is deprecated; use String.prototype.trim\");\n  } // Prior to jQuery 3.2 there were internal refs so we don't warn there\n\n\n  if (jQueryVersionSince(\"3.2.0\")) {\n    migratePatchAndWarnFunc(jQuery, \"nodeName\", function (elem, name) {\n      return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n    }, \"nodeName\", \"jQuery.nodeName is deprecated\");\n    migratePatchAndWarnFunc(jQuery, \"isArray\", Array.isArray, \"isArray\", \"jQuery.isArray is deprecated; use Array.isArray\");\n  }\n\n  if (jQueryVersionSince(\"3.3.0\")) {\n    migratePatchAndWarnFunc(jQuery, \"isNumeric\", function (obj) {\n      // As of jQuery 3.0, isNumeric is limited to\n      // strings and numbers (primitives or objects)\n      // that can be coerced to finite numbers (gh-2662)\n      var type = _typeof(obj);\n\n      return (type === \"number\" || type === \"string\") && // parseFloat NaNs numeric-cast false positives (\"\")\n      // ...but misinterprets leading-number strings, e.g. hex literals (\"0x...\")\n      // subtraction forces infinities to NaN\n      !isNaN(obj - parseFloat(obj));\n    }, \"isNumeric\", \"jQuery.isNumeric() is deprecated\"); // Populate the class2type map\n\n    jQuery.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"), function (_, name) {\n      class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n    });\n    migratePatchAndWarnFunc(jQuery, \"type\", function (obj) {\n      if (obj == null) {\n        return obj + \"\";\n      } // Support: Android <=2.3 only (functionish RegExp)\n\n\n      return _typeof(obj) === \"object\" || typeof obj === \"function\" ? class2type[Object.prototype.toString.call(obj)] || \"object\" : _typeof(obj);\n    }, \"type\", \"jQuery.type is deprecated\");\n    migratePatchAndWarnFunc(jQuery, \"isFunction\", function (obj) {\n      return typeof obj === \"function\";\n    }, \"isFunction\", \"jQuery.isFunction() is deprecated\");\n    migratePatchAndWarnFunc(jQuery, \"isWindow\", function (obj) {\n      return obj != null && obj === obj.window;\n    }, \"isWindow\", \"jQuery.isWindow() is deprecated\");\n  } // Support jQuery slim which excludes the ajax module\n\n\n  if (jQuery.ajax) {\n    var oldAjax = jQuery.ajax,\n        rjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n    migratePatchFunc(jQuery, \"ajax\", function () {\n      var jQXHR = oldAjax.apply(this, arguments); // Be sure we got a jQXHR (e.g., not sync)\n\n      if (jQXHR.promise) {\n        migratePatchAndWarnFunc(jQXHR, \"success\", jQXHR.done, \"jqXHR-methods\", \"jQXHR.success is deprecated and removed\");\n        migratePatchAndWarnFunc(jQXHR, \"error\", jQXHR.fail, \"jqXHR-methods\", \"jQXHR.error is deprecated and removed\");\n        migratePatchAndWarnFunc(jQXHR, \"complete\", jQXHR.always, \"jqXHR-methods\", \"jQXHR.complete is deprecated and removed\");\n      }\n\n      return jQXHR;\n    }, \"jqXHR-methods\"); // Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion\n    // behavior is gone in jQuery 4.0 and as it has security implications, we don't\n    // want to restore the legacy behavior.\n\n    if (!jQueryVersionSince(\"4.0.0\")) {\n      // Register this prefilter before the jQuery one. Otherwise, a promoted\n      // request is transformed into one with the script dataType and we can't\n      // catch it anymore.\n      jQuery.ajaxPrefilter(\"+json\", function (s) {\n        // Warn if JSON-to-JSONP auto-promotion happens.\n        if (s.jsonp !== false && (rjsonp.test(s.url) || typeof s.data === \"string\" && (s.contentType || \"\").indexOf(\"application/x-www-form-urlencoded\") === 0 && rjsonp.test(s.data))) {\n          migrateWarn(\"jsonp-promotion\", \"JSON-to-JSONP auto-promotion is deprecated\");\n        }\n      });\n    }\n  }\n\n  var oldRemoveAttr = jQuery.fn.removeAttr,\n      oldToggleClass = jQuery.fn.toggleClass,\n      rmatchNonSpace = /\\S+/g;\n  migratePatchFunc(jQuery.fn, \"removeAttr\", function (name) {\n    var self = this;\n    jQuery.each(name.match(rmatchNonSpace), function (_i, attr) {\n      if (jQuery.expr.match.bool.test(attr)) {\n        migrateWarn(\"removeAttr-bool\", \"jQuery.fn.removeAttr no longer sets boolean properties: \" + attr);\n        self.prop(attr, false);\n      }\n    });\n    return oldRemoveAttr.apply(this, arguments);\n  }, \"removeAttr-bool\");\n  migratePatchFunc(jQuery.fn, \"toggleClass\", function (state) {\n    // Only deprecating no-args or single boolean arg\n    if (state !== undefined && typeof state !== \"boolean\") {\n      return oldToggleClass.apply(this, arguments);\n    }\n\n    migrateWarn(\"toggleClass-bool\", \"jQuery.fn.toggleClass( boolean ) is deprecated\"); // Toggle entire class name of each element\n\n    return this.each(function () {\n      var className = this.getAttribute && this.getAttribute(\"class\") || \"\";\n\n      if (className) {\n        jQuery.data(this, \"__className__\", className);\n      } // If the element has a class name or if we're passed `false`,\n      // then remove the whole classname (if there was one, the above saved it).\n      // Otherwise bring back whatever was previously saved (if anything),\n      // falling back to the empty string if nothing was stored.\n\n\n      if (this.setAttribute) {\n        this.setAttribute(\"class\", className || state === false ? \"\" : jQuery.data(this, \"__className__\") || \"\");\n      }\n    });\n  }, \"toggleClass-bool\");\n\n  function camelCase(string) {\n    return string.replace(/-([a-z])/g, function (_, letter) {\n      return letter.toUpperCase();\n    });\n  }\n\n  var origFnCss,\n      internalSwapCall = false,\n      ralphaStart = /^[a-z]/,\n      // The regex visualized:\n  //\n  //                         /----------\\\n  //                        |            |    /-------\\\n  //                        |  / Top  \\  |   |         |\n  //         /--- Border ---+-| Right  |-+---+- Width -+---\\\n  //        |                 | Bottom |                    |\n  //        |                  \\ Left /                     |\n  //        |                                               |\n  //        |                              /----------\\     |\n  //        |          /-------------\\    |            |    |- END\n  //        |         |               |   |  / Top  \\  |    |\n  //        |         |  / Margin  \\  |   | | Right  | |    |\n  //        |---------+-|           |-+---+-| Bottom |-+----|\n  //        |            \\ Padding /         \\ Left /       |\n  // BEGIN -|                                               |\n  //        |                /---------\\                    |\n  //        |               |           |                   |\n  //        |               |  / Min \\  |    / Width  \\     |\n  //         \\--------------+-|       |-+---|          |---/\n  //                           \\ Max /       \\ Height /\n  rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/; // If this version of jQuery has .swap(), don't false-alarm on internal uses\n\n  if (jQuery.swap) {\n    jQuery.each([\"height\", \"width\", \"reliableMarginRight\"], function (_, name) {\n      var oldHook = jQuery.cssHooks[name] && jQuery.cssHooks[name].get;\n\n      if (oldHook) {\n        jQuery.cssHooks[name].get = function () {\n          var ret;\n          internalSwapCall = true;\n          ret = oldHook.apply(this, arguments);\n          internalSwapCall = false;\n          return ret;\n        };\n      }\n    });\n  }\n\n  migratePatchFunc(jQuery, \"swap\", function (elem, options, callback, args) {\n    var ret,\n        name,\n        old = {};\n\n    if (!internalSwapCall) {\n      migrateWarn(\"swap\", \"jQuery.swap() is undocumented and deprecated\");\n    } // Remember the old values, and insert the new ones\n\n\n    for (name in options) {\n      old[name] = elem.style[name];\n      elem.style[name] = options[name];\n    }\n\n    ret = callback.apply(elem, args || []); // Revert the old values\n\n    for (name in options) {\n      elem.style[name] = old[name];\n    }\n\n    return ret;\n  }, \"swap\");\n\n  if (jQueryVersionSince(\"3.4.0\") && typeof Proxy !== \"undefined\") {\n    jQuery.cssProps = new Proxy(jQuery.cssProps || {}, {\n      set: function set() {\n        migrateWarn(\"cssProps\", \"jQuery.cssProps is deprecated\");\n        return Reflect.set.apply(this, arguments);\n      }\n    });\n  } // In jQuery >=4 where jQuery.cssNumber is missing fill it with the latest 3.x version:\n  // https://github.com/jquery/jquery/blob/3.6.0/src/css.js#L212-L233\n  // This way, number values for the CSS properties below won't start triggering\n  // Migrate warnings when jQuery gets updated to >=4.0.0 (gh-438).\n\n\n  if (jQueryVersionSince(\"4.0.0\") && typeof Proxy !== \"undefined\") {\n    jQuery.cssNumber = new Proxy({\n      animationIterationCount: true,\n      columnCount: true,\n      fillOpacity: true,\n      flexGrow: true,\n      flexShrink: true,\n      fontWeight: true,\n      gridArea: true,\n      gridColumn: true,\n      gridColumnEnd: true,\n      gridColumnStart: true,\n      gridRow: true,\n      gridRowEnd: true,\n      gridRowStart: true,\n      lineHeight: true,\n      opacity: true,\n      order: true,\n      orphans: true,\n      widows: true,\n      zIndex: true,\n      zoom: true\n    }, {\n      get: function get() {\n        migrateWarn(\"css-number\", \"jQuery.cssNumber is deprecated\");\n        return Reflect.get.apply(this, arguments);\n      },\n      set: function set() {\n        migrateWarn(\"css-number\", \"jQuery.cssNumber is deprecated\");\n        return Reflect.set.apply(this, arguments);\n      }\n    });\n  }\n\n  function isAutoPx(prop) {\n    // The first test is used to ensure that:\n    // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex).\n    // 2. The prop is not empty.\n    return ralphaStart.test(prop) && rautoPx.test(prop[0].toUpperCase() + prop.slice(1));\n  }\n\n  origFnCss = jQuery.fn.css;\n  migratePatchFunc(jQuery.fn, \"css\", function (name, value) {\n    var camelName,\n        origThis = this;\n\n    if (name && _typeof(name) === \"object\" && !Array.isArray(name)) {\n      jQuery.each(name, function (n, v) {\n        jQuery.fn.css.call(origThis, n, v);\n      });\n      return this;\n    }\n\n    if (typeof value === \"number\") {\n      camelName = camelCase(name);\n\n      if (!isAutoPx(camelName) && !jQuery.cssNumber[camelName]) {\n        migrateWarn(\"css-number\", \"Number-typed values are deprecated for jQuery.fn.css( \\\"\" + name + \"\\\", value )\");\n      }\n    }\n\n    return origFnCss.apply(this, arguments);\n  }, \"css-number\");\n  var origData = jQuery.data;\n  migratePatchFunc(jQuery, \"data\", function (elem, name, value) {\n    var curData, sameKeys, key; // Name can be an object, and each entry in the object is meant to be set as data\n\n    if (name && _typeof(name) === \"object\" && arguments.length === 2) {\n      curData = jQuery.hasData(elem) && origData.call(this, elem);\n      sameKeys = {};\n\n      for (key in name) {\n        if (key !== camelCase(key)) {\n          migrateWarn(\"data-camelCase\", \"jQuery.data() always sets/gets camelCased names: \" + key);\n          curData[key] = name[key];\n        } else {\n          sameKeys[key] = name[key];\n        }\n      }\n\n      origData.call(this, elem, sameKeys);\n      return name;\n    } // If the name is transformed, look for the un-transformed name in the data object\n\n\n    if (name && typeof name === \"string\" && name !== camelCase(name)) {\n      curData = jQuery.hasData(elem) && origData.call(this, elem);\n\n      if (curData && name in curData) {\n        migrateWarn(\"data-camelCase\", \"jQuery.data() always sets/gets camelCased names: \" + name);\n\n        if (arguments.length > 2) {\n          curData[name] = value;\n        }\n\n        return curData[name];\n      }\n    }\n\n    return origData.apply(this, arguments);\n  }, \"data-camelCase\"); // Support jQuery slim which excludes the effects module\n\n  if (jQuery.fx) {\n    var intervalValue,\n        intervalMsg,\n        oldTweenRun = jQuery.Tween.prototype.run,\n        linearEasing = function linearEasing(pct) {\n      return pct;\n    };\n\n    migratePatchFunc(jQuery.Tween.prototype, \"run\", function () {\n      if (jQuery.easing[this.easing].length > 1) {\n        migrateWarn(\"easing-one-arg\", \"'jQuery.easing.\" + this.easing.toString() + \"' should use only one argument\");\n        jQuery.easing[this.easing] = linearEasing;\n      }\n\n      oldTweenRun.apply(this, arguments);\n    }, \"easing-one-arg\");\n    intervalValue = jQuery.fx.interval;\n    intervalMsg = \"jQuery.fx.interval is deprecated\"; // Support: IE9, Android <=4.4\n    // Avoid false positives on browsers that lack rAF\n    // Don't warn if document is hidden, jQuery uses setTimeout (#292)\n\n    if (window.requestAnimationFrame) {\n      Object.defineProperty(jQuery.fx, \"interval\", {\n        configurable: true,\n        enumerable: true,\n        get: function get() {\n          if (!window.document.hidden) {\n            migrateWarn(\"fx-interval\", intervalMsg);\n          } // Only fallback to the default if patch is enabled\n\n\n          if (!jQuery.migrateIsPatchEnabled(\"fx-interval\")) {\n            return intervalValue;\n          }\n\n          return intervalValue === undefined ? 13 : intervalValue;\n        },\n        set: function set(newValue) {\n          migrateWarn(\"fx-interval\", intervalMsg);\n          intervalValue = newValue;\n        }\n      });\n    }\n  }\n\n  var oldLoad = jQuery.fn.load,\n      oldEventAdd = jQuery.event.add,\n      originalFix = jQuery.event.fix;\n  jQuery.event.props = [];\n  jQuery.event.fixHooks = {};\n  migrateWarnProp(jQuery.event.props, \"concat\", jQuery.event.props.concat, \"event-old-patch\", \"jQuery.event.props.concat() is deprecated and removed\");\n  migratePatchFunc(jQuery.event, \"fix\", function (originalEvent) {\n    var event,\n        type = originalEvent.type,\n        fixHook = this.fixHooks[type],\n        props = jQuery.event.props;\n\n    if (props.length) {\n      migrateWarn(\"event-old-patch\", \"jQuery.event.props are deprecated and removed: \" + props.join());\n\n      while (props.length) {\n        jQuery.event.addProp(props.pop());\n      }\n    }\n\n    if (fixHook && !fixHook._migrated_) {\n      fixHook._migrated_ = true;\n      migrateWarn(\"event-old-patch\", \"jQuery.event.fixHooks are deprecated and removed: \" + type);\n\n      if ((props = fixHook.props) && props.length) {\n        while (props.length) {\n          jQuery.event.addProp(props.pop());\n        }\n      }\n    }\n\n    event = originalFix.call(this, originalEvent);\n    return fixHook && fixHook.filter ? fixHook.filter(event, originalEvent) : event;\n  }, \"event-old-patch\");\n  migratePatchFunc(jQuery.event, \"add\", function (elem, types) {\n    // This misses the multiple-types case but that seems awfully rare\n    if (elem === window && types === \"load\" && window.document.readyState === \"complete\") {\n      migrateWarn(\"load-after-event\", \"jQuery(window).on('load'...) called after load event occurred\");\n    }\n\n    return oldEventAdd.apply(this, arguments);\n  }, \"load-after-event\");\n  jQuery.each([\"load\", \"unload\", \"error\"], function (_, name) {\n    migratePatchFunc(jQuery.fn, name, function () {\n      var args = Array.prototype.slice.call(arguments, 0); // If this is an ajax load() the first arg should be the string URL;\n      // technically this could also be the \"Anything\" arg of the event .load()\n      // which just goes to show why this dumb signature has been deprecated!\n      // jQuery custom builds that exclude the Ajax module justifiably die here.\n\n      if (name === \"load\" && typeof args[0] === \"string\") {\n        return oldLoad.apply(this, args);\n      }\n\n      migrateWarn(\"shorthand-removed-v3\", \"jQuery.fn.\" + name + \"() is deprecated\");\n      args.splice(0, 0, name);\n\n      if (arguments.length) {\n        return this.on.apply(this, args);\n      } // Use .triggerHandler here because:\n      // - load and unload events don't need to bubble, only applied to window or image\n      // - error event should not bubble to window, although it does pre-1.7\n      // See http://bugs.jquery.com/ticket/11820\n\n\n      this.triggerHandler.apply(this, args);\n      return this;\n    }, \"shorthand-removed-v3\");\n  });\n  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) {\n    // Handle event binding\n    migratePatchAndWarnFunc(jQuery.fn, name, function (data, fn) {\n      return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);\n    }, \"shorthand-deprecated-v3\", \"jQuery.fn.\" + name + \"() event shorthand is deprecated\");\n  }); // Trigger \"ready\" event only once, on document ready\n\n  jQuery(function () {\n    jQuery(window.document).triggerHandler(\"ready\");\n  });\n  jQuery.event.special.ready = {\n    setup: function setup() {\n      if (this === window.document) {\n        migrateWarn(\"ready-event\", \"'ready' event is deprecated\");\n      }\n    }\n  };\n  migratePatchAndWarnFunc(jQuery.fn, \"bind\", function (types, data, fn) {\n    return this.on(types, null, data, fn);\n  }, \"pre-on-methods\", \"jQuery.fn.bind() is deprecated\");\n  migratePatchAndWarnFunc(jQuery.fn, \"unbind\", function (types, fn) {\n    return this.off(types, null, fn);\n  }, \"pre-on-methods\", \"jQuery.fn.unbind() is deprecated\");\n  migratePatchAndWarnFunc(jQuery.fn, \"delegate\", function (selector, types, data, fn) {\n    return this.on(types, selector, data, fn);\n  }, \"pre-on-methods\", \"jQuery.fn.delegate() is deprecated\");\n  migratePatchAndWarnFunc(jQuery.fn, \"undelegate\", function (selector, types, fn) {\n    return arguments.length === 1 ? this.off(selector, \"**\") : this.off(types, selector || \"**\", fn);\n  }, \"pre-on-methods\", \"jQuery.fn.undelegate() is deprecated\");\n  migratePatchAndWarnFunc(jQuery.fn, \"hover\", function (fnOver, fnOut) {\n    return this.on(\"mouseenter\", fnOver).on(\"mouseleave\", fnOut || fnOver);\n  }, \"pre-on-methods\", \"jQuery.fn.hover() is deprecated\");\n\n  var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n      makeMarkup = function makeMarkup(html) {\n    var doc = window.document.implementation.createHTMLDocument(\"\");\n    doc.body.innerHTML = html;\n    return doc.body && doc.body.innerHTML;\n  },\n      warnIfChanged = function warnIfChanged(html) {\n    var changed = html.replace(rxhtmlTag, \"<$1></$2>\");\n\n    if (changed !== html && makeMarkup(html) !== makeMarkup(changed)) {\n      migrateWarn(\"self-closed-tags\", \"HTML tags must be properly nested and closed: \" + html);\n    }\n  };\n  /**\n   * Deprecated, please use `jQuery.migrateDisablePatches( \"self-closed-tags\" )` instead.\n   * @deprecated\n   */\n\n\n  jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function () {\n    jQuery.migrateEnablePatches(\"self-closed-tags\");\n  };\n\n  migratePatchFunc(jQuery, \"htmlPrefilter\", function (html) {\n    warnIfChanged(html);\n    return html.replace(rxhtmlTag, \"<$1></$2>\");\n  }, \"self-closed-tags\"); // This patch needs to be disabled by default as it re-introduces\n  // security issues (CVE-2020-11022, CVE-2020-11023).\n\n  jQuery.migrateDisablePatches(\"self-closed-tags\");\n  var origOffset = jQuery.fn.offset;\n  migratePatchFunc(jQuery.fn, \"offset\", function () {\n    var elem = this[0];\n\n    if (elem && (!elem.nodeType || !elem.getBoundingClientRect)) {\n      migrateWarn(\"offset-valid-elem\", \"jQuery.fn.offset() requires a valid DOM element\");\n      return arguments.length ? this : undefined;\n    }\n\n    return origOffset.apply(this, arguments);\n  }, \"offset-valid-elem\"); // Support jQuery slim which excludes the ajax module\n  // The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional`\n  // so it doesn't make sense for the slim build.\n\n  if (jQuery.ajax) {\n    var origParam = jQuery.param;\n    migratePatchFunc(jQuery, \"param\", function (data, traditional) {\n      var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\n      if (traditional === undefined && ajaxTraditional) {\n        migrateWarn(\"param-ajax-traditional\", \"jQuery.param() no longer uses jQuery.ajaxSettings.traditional\");\n        traditional = ajaxTraditional;\n      }\n\n      return origParam.call(this, data, traditional);\n    }, \"param-ajax-traditional\");\n  }\n\n  migratePatchAndWarnFunc(jQuery.fn, \"andSelf\", jQuery.fn.addBack, \"andSelf\", \"jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()\"); // Support jQuery slim which excludes the deferred module in jQuery 4.0+\n\n  if (jQuery.Deferred) {\n    var oldDeferred = jQuery.Deferred,\n        tuples = [// Action, add listener, callbacks, .then handlers, final state\n    [\"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), jQuery.Callbacks(\"once memory\"), \"resolved\"], [\"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), jQuery.Callbacks(\"once memory\"), \"rejected\"], [\"notify\", \"progress\", jQuery.Callbacks(\"memory\"), jQuery.Callbacks(\"memory\")]];\n    migratePatchFunc(jQuery, \"Deferred\", function (func) {\n      var deferred = oldDeferred(),\n          promise = deferred.promise();\n\n      function\n        /* fnDone, fnFail, fnProgress */\n      newDeferredPipe() {\n        var fns = arguments;\n        return jQuery.Deferred(function (newDefer) {\n          jQuery.each(tuples, function (i, tuple) {\n            var fn = typeof fns[i] === \"function\" && fns[i]; // Deferred.done(function() { bind to newDefer or newDefer.resolve })\n            // deferred.fail(function() { bind to newDefer or newDefer.reject })\n            // deferred.progress(function() { bind to newDefer or newDefer.notify })\n\n            deferred[tuple[1]](function () {\n              var returned = fn && fn.apply(this, arguments);\n\n              if (returned && typeof returned.promise === \"function\") {\n                returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify);\n              } else {\n                newDefer[tuple[0] + \"With\"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);\n              }\n            });\n          });\n          fns = null;\n        }).promise();\n      }\n\n      migratePatchAndWarnFunc(deferred, \"pipe\", newDeferredPipe, \"deferred-pipe\", \"deferred.pipe() is deprecated\");\n      migratePatchAndWarnFunc(promise, \"pipe\", newDeferredPipe, \"deferred-pipe\", \"deferred.pipe() is deprecated\");\n\n      if (func) {\n        func.call(deferred, deferred);\n      }\n\n      return deferred;\n    }, \"deferred-pipe\"); // Preserve handler of uncaught exceptions in promise chains\n\n    jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;\n  }\n\n  return jQuery;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module), __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./node_modules/jquery-migrate/dist/jquery-migrate.js?");

/***/ }),

/***/ "./node_modules/jquery-ui-dist/jquery-ui.js":
/*!**************************************************!*\
  !*** ./node_modules/jquery-ui-dist/jquery-ui.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj){\"@babel/helpers - typeof\";return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj;}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj;},_typeof(obj);}/*! jQuery UI - v1.13.2 - 2022-07-14\n* http://jqueryui.com\n* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js\n* Copyright jQuery Foundation and other contributors; Licensed MIT */(function(factory){\"use strict\";if(true){// AMD. Register as an anonymous module.\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));}else{}})(function($){\"use strict\";$.ui=$.ui||{};var version=$.ui.version=\"1.13.2\";/*!\n * jQuery UI Widget 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\nvar widgetUuid=0;var widgetHasOwnProperty=Array.prototype.hasOwnProperty;var widgetSlice=Array.prototype.slice;$.cleanData=function(orig){return function(elems){var events,elem,i;for(i=0;(elem=elems[i])!=null;i++){// Only trigger remove when necessary to save time\nevents=$._data(elem,\"events\");if(events&&events.remove){$(elem).triggerHandler(\"remove\");}}orig(elems);};}($.cleanData);$.widget=function(name,base,prototype){var existingConstructor,constructor,basePrototype;// ProxiedPrototype allows the provided prototype to remain unmodified\n// so that it can be used as a mixin for multiple widgets (#8876)\nvar proxiedPrototype={};var namespace=name.split(\".\")[0];name=name.split(\".\")[1];var fullName=namespace+\"-\"+name;if(!prototype){prototype=base;base=$.Widget;}if(Array.isArray(prototype)){prototype=$.extend.apply(null,[{}].concat(prototype));}// Create selector for plugin\n$.expr.pseudos[fullName.toLowerCase()]=function(elem){return!!$.data(elem,fullName);};$[namespace]=$[namespace]||{};existingConstructor=$[namespace][name];constructor=$[namespace][name]=function(options,element){// Allow instantiation without \"new\" keyword\nif(!this||!this._createWidget){return new constructor(options,element);}// Allow instantiation without initializing for simple inheritance\n// must use \"new\" keyword (the code above always passes args)\nif(arguments.length){this._createWidget(options,element);}};// Extend with the existing constructor to carry over any static properties\n$.extend(constructor,existingConstructor,{version:prototype.version,// Copy the object used to create the prototype in case we need to\n// redefine the widget later\n_proto:$.extend({},prototype),// Track widgets that inherit from this widget in case this widget is\n// redefined after a widget inherits from it\n_childConstructors:[]});basePrototype=new base();// We need to make the options hash a property directly on the new instance\n// otherwise we'll modify the options hash on the prototype that we're\n// inheriting from\nbasePrototype.options=$.widget.extend({},basePrototype.options);$.each(prototype,function(prop,value){if(typeof value!==\"function\"){proxiedPrototype[prop]=value;return;}proxiedPrototype[prop]=function(){function _super(){return base.prototype[prop].apply(this,arguments);}function _superApply(args){return base.prototype[prop].apply(this,args);}return function(){var __super=this._super;var __superApply=this._superApply;var returnValue;this._super=_super;this._superApply=_superApply;returnValue=value.apply(this,arguments);this._super=__super;this._superApply=__superApply;return returnValue;};}();});constructor.prototype=$.widget.extend(basePrototype,{// TODO: remove support for widgetEventPrefix\n// always use the name + a colon as the prefix, e.g., draggable:start\n// don't prefix for widgets that aren't DOM-based\nwidgetEventPrefix:existingConstructor?basePrototype.widgetEventPrefix||name:name},proxiedPrototype,{constructor:constructor,namespace:namespace,widgetName:name,widgetFullName:fullName});// If this widget is being redefined then we need to find all widgets that\n// are inheriting from it and redefine all of them so that they inherit from\n// the new version of this widget. We're essentially trying to replace one\n// level in the prototype chain.\nif(existingConstructor){$.each(existingConstructor._childConstructors,function(i,child){var childPrototype=child.prototype;// Redefine the child widget using the same prototype that was\n// originally used, but inherit from the new version of the base\n$.widget(childPrototype.namespace+\".\"+childPrototype.widgetName,constructor,child._proto);});// Remove the list of existing child constructors from the old constructor\n// so the old child constructors can be garbage collected\ndelete existingConstructor._childConstructors;}else{base._childConstructors.push(constructor);}$.widget.bridge(name,constructor);return constructor;};$.widget.extend=function(target){var input=widgetSlice.call(arguments,1);var inputIndex=0;var inputLength=input.length;var key;var value;for(;inputIndex<inputLength;inputIndex++){for(key in input[inputIndex]){value=input[inputIndex][key];if(widgetHasOwnProperty.call(input[inputIndex],key)&&value!==undefined){// Clone objects\nif($.isPlainObject(value)){target[key]=$.isPlainObject(target[key])?$.widget.extend({},target[key],value):// Don't extend strings, arrays, etc. with objects\n$.widget.extend({},value);// Copy everything else by reference\n}else{target[key]=value;}}}}return target;};$.widget.bridge=function(name,object){var fullName=object.prototype.widgetFullName||name;$.fn[name]=function(options){var isMethodCall=typeof options===\"string\";var args=widgetSlice.call(arguments,1);var returnValue=this;if(isMethodCall){// If this is an empty collection, we need to have the instance method\n// return undefined instead of the jQuery instance\nif(!this.length&&options===\"instance\"){returnValue=undefined;}else{this.each(function(){var methodValue;var instance=$.data(this,fullName);if(options===\"instance\"){returnValue=instance;return false;}if(!instance){return $.error(\"cannot call methods on \"+name+\" prior to initialization; \"+\"attempted to call method '\"+options+\"'\");}if(typeof instance[options]!==\"function\"||options.charAt(0)===\"_\"){return $.error(\"no such method '\"+options+\"' for \"+name+\" widget instance\");}methodValue=instance[options].apply(instance,args);if(methodValue!==instance&&methodValue!==undefined){returnValue=methodValue&&methodValue.jquery?returnValue.pushStack(methodValue.get()):methodValue;return false;}});}}else{// Allow multiple hashes to be passed on init\nif(args.length){options=$.widget.extend.apply(null,[options].concat(args));}this.each(function(){var instance=$.data(this,fullName);if(instance){instance.option(options||{});if(instance._init){instance._init();}}else{$.data(this,fullName,new object(options,this));}});}return returnValue;};};$.Widget=function/* options, element */(){};$.Widget._childConstructors=[];$.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",defaultElement:\"<div>\",options:{classes:{},disabled:false,// Callbacks\ncreate:null},_createWidget:function _createWidget(options,element){element=$(element||this.defaultElement||this)[0];this.element=$(element);this.uuid=widgetUuid++;this.eventNamespace=\".\"+this.widgetName+this.uuid;this.bindings=$();this.hoverable=$();this.focusable=$();this.classesElementLookup={};if(element!==this){$.data(element,this.widgetFullName,this);this._on(true,this.element,{remove:function remove(event){if(event.target===element){this.destroy();}}});this.document=$(element.style?// Element within the document\nelement.ownerDocument:// Element is window or document\nelement.document||element);this.window=$(this.document[0].defaultView||this.document[0].parentWindow);}this.options=$.widget.extend({},this.options,this._getCreateOptions(),options);this._create();if(this.options.disabled){this._setOptionDisabled(this.options.disabled);}this._trigger(\"create\",null,this._getCreateEventData());this._init();},_getCreateOptions:function _getCreateOptions(){return{};},_getCreateEventData:$.noop,_create:$.noop,_init:$.noop,destroy:function destroy(){var that=this;this._destroy();$.each(this.classesElementLookup,function(key,value){that._removeClass(value,key);});// We can probably remove the unbind calls in 2.0\n// all event bindings should go through this._on()\nthis.element.off(this.eventNamespace).removeData(this.widgetFullName);this.widget().off(this.eventNamespace).removeAttr(\"aria-disabled\");// Clean up events and states\nthis.bindings.off(this.eventNamespace);},_destroy:$.noop,widget:function widget(){return this.element;},option:function option(key,value){var options=key;var parts;var curOption;var i;if(arguments.length===0){// Don't return a reference to the internal hash\nreturn $.widget.extend({},this.options);}if(typeof key===\"string\"){// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\noptions={};parts=key.split(\".\");key=parts.shift();if(parts.length){curOption=options[key]=$.widget.extend({},this.options[key]);for(i=0;i<parts.length-1;i++){curOption[parts[i]]=curOption[parts[i]]||{};curOption=curOption[parts[i]];}key=parts.pop();if(arguments.length===1){return curOption[key]===undefined?null:curOption[key];}curOption[key]=value;}else{if(arguments.length===1){return this.options[key]===undefined?null:this.options[key];}options[key]=value;}}this._setOptions(options);return this;},_setOptions:function _setOptions(options){var key;for(key in options){this._setOption(key,options[key]);}return this;},_setOption:function _setOption(key,value){if(key===\"classes\"){this._setOptionClasses(value);}this.options[key]=value;if(key===\"disabled\"){this._setOptionDisabled(value);}return this;},_setOptionClasses:function _setOptionClasses(value){var classKey,elements,currentElements;for(classKey in value){currentElements=this.classesElementLookup[classKey];if(value[classKey]===this.options.classes[classKey]||!currentElements||!currentElements.length){continue;}// We are doing this to create a new jQuery object because the _removeClass() call\n// on the next line is going to destroy the reference to the current elements being\n// tracked. We need to save a copy of this collection so that we can add the new classes\n// below.\nelements=$(currentElements.get());this._removeClass(currentElements,classKey);// We don't use _addClass() here, because that uses this.options.classes\n// for generating the string of classes. We want to use the value passed in from\n// _setOption(), this is the new value of the classes option which was passed to\n// _setOption(). We pass this value directly to _classes().\nelements.addClass(this._classes({element:elements,keys:classKey,classes:value,add:true}));}},_setOptionDisabled:function _setOptionDisabled(value){this._toggleClass(this.widget(),this.widgetFullName+\"-disabled\",null,!!value);// If the widget is becoming disabled, then nothing is interactive\nif(value){this._removeClass(this.hoverable,null,\"ui-state-hover\");this._removeClass(this.focusable,null,\"ui-state-focus\");}},enable:function enable(){return this._setOptions({disabled:false});},disable:function disable(){return this._setOptions({disabled:true});},_classes:function _classes(options){var full=[];var that=this;options=$.extend({element:this.element,classes:this.options.classes||{}},options);function bindRemoveEvent(){var nodesToBind=[];options.element.each(function(_,element){var isTracked=$.map(that.classesElementLookup,function(elements){return elements;}).some(function(elements){return elements.is(element);});if(!isTracked){nodesToBind.push(element);}});that._on($(nodesToBind),{remove:\"_untrackClassesElement\"});}function processClassString(classes,checkOption){var current,i;for(i=0;i<classes.length;i++){current=that.classesElementLookup[classes[i]]||$();if(options.add){bindRemoveEvent();current=$($.uniqueSort(current.get().concat(options.element.get())));}else{current=$(current.not(options.element).get());}that.classesElementLookup[classes[i]]=current;full.push(classes[i]);if(checkOption&&options.classes[classes[i]]){full.push(options.classes[classes[i]]);}}}if(options.keys){processClassString(options.keys.match(/\\S+/g)||[],true);}if(options.extra){processClassString(options.extra.match(/\\S+/g)||[]);}return full.join(\" \");},_untrackClassesElement:function _untrackClassesElement(event){var that=this;$.each(that.classesElementLookup,function(key,value){if($.inArray(event.target,value)!==-1){that.classesElementLookup[key]=$(value.not(event.target).get());}});this._off($(event.target));},_removeClass:function _removeClass(element,keys,extra){return this._toggleClass(element,keys,extra,false);},_addClass:function _addClass(element,keys,extra){return this._toggleClass(element,keys,extra,true);},_toggleClass:function _toggleClass(element,keys,extra,add){add=typeof add===\"boolean\"?add:extra;var shift=typeof element===\"string\"||element===null,options={extra:shift?keys:extra,keys:shift?element:keys,element:shift?this.element:element,add:add};options.element.toggleClass(this._classes(options),add);return this;},_on:function _on(suppressDisabledCheck,element,handlers){var delegateElement;var instance=this;// No suppressDisabledCheck flag, shuffle arguments\nif(typeof suppressDisabledCheck!==\"boolean\"){handlers=element;element=suppressDisabledCheck;suppressDisabledCheck=false;}// No element argument, shuffle and use this.element\nif(!handlers){handlers=element;element=this.element;delegateElement=this.widget();}else{element=delegateElement=$(element);this.bindings=this.bindings.add(element);}$.each(handlers,function(event,handler){function handlerProxy(){// Allow widgets to customize the disabled handling\n// - disabled as an array instead of boolean\n// - disabled class as method for disabling individual parts\nif(!suppressDisabledCheck&&(instance.options.disabled===true||$(this).hasClass(\"ui-state-disabled\"))){return;}return(typeof handler===\"string\"?instance[handler]:handler).apply(instance,arguments);}// Copy the guid so direct unbinding works\nif(typeof handler!==\"string\"){handlerProxy.guid=handler.guid=handler.guid||handlerProxy.guid||$.guid++;}var match=event.match(/^([\\w:-]*)\\s*(.*)$/);var eventName=match[1]+instance.eventNamespace;var selector=match[2];if(selector){delegateElement.on(eventName,selector,handlerProxy);}else{element.on(eventName,handlerProxy);}});},_off:function _off(element,eventName){eventName=(eventName||\"\").split(\" \").join(this.eventNamespace+\" \")+this.eventNamespace;element.off(eventName);// Clear the stack to avoid memory leaks (#10056)\nthis.bindings=$(this.bindings.not(element).get());this.focusable=$(this.focusable.not(element).get());this.hoverable=$(this.hoverable.not(element).get());},_delay:function _delay(handler,delay){function handlerProxy(){return(typeof handler===\"string\"?instance[handler]:handler).apply(instance,arguments);}var instance=this;return setTimeout(handlerProxy,delay||0);},_hoverable:function _hoverable(element){this.hoverable=this.hoverable.add(element);this._on(element,{mouseenter:function mouseenter(event){this._addClass($(event.currentTarget),null,\"ui-state-hover\");},mouseleave:function mouseleave(event){this._removeClass($(event.currentTarget),null,\"ui-state-hover\");}});},_focusable:function _focusable(element){this.focusable=this.focusable.add(element);this._on(element,{focusin:function focusin(event){this._addClass($(event.currentTarget),null,\"ui-state-focus\");},focusout:function focusout(event){this._removeClass($(event.currentTarget),null,\"ui-state-focus\");}});},_trigger:function _trigger(type,event,data){var prop,orig;var callback=this.options[type];data=data||{};event=$.Event(event);event.type=(type===this.widgetEventPrefix?type:this.widgetEventPrefix+type).toLowerCase();// The original event may come from any element\n// so we need to reset the target on the new event\nevent.target=this.element[0];// Copy original event properties over to the new event\norig=event.originalEvent;if(orig){for(prop in orig){if(!(prop in event)){event[prop]=orig[prop];}}}this.element.trigger(event,data);return!(typeof callback===\"function\"&&callback.apply(this.element[0],[event].concat(data))===false||event.isDefaultPrevented());}};$.each({show:\"fadeIn\",hide:\"fadeOut\"},function(method,defaultEffect){$.Widget.prototype[\"_\"+method]=function(element,options,callback){if(typeof options===\"string\"){options={effect:options};}var hasOptions;var effectName=!options?method:options===true||typeof options===\"number\"?defaultEffect:options.effect||defaultEffect;options=options||{};if(typeof options===\"number\"){options={duration:options};}else if(options===true){options={};}hasOptions=!$.isEmptyObject(options);options.complete=callback;if(options.delay){element.delay(options.delay);}if(hasOptions&&$.effects&&$.effects.effect[effectName]){element[method](options);}else if(effectName!==method&&element[effectName]){element[effectName](options.duration,options.easing,callback);}else{element.queue(function(next){$(this)[method]();if(callback){callback.call(element[0]);}next();});}};});var widget=$.widget;/*!\n * jQuery UI Position 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */ //>>label: Position\n//>>group: Core\n//>>description: Positions elements relative to other elements.\n//>>docs: http://api.jqueryui.com/position/\n//>>demos: http://jqueryui.com/position/\n(function(){var cachedScrollbarWidth,max=Math.max,abs=Math.abs,rhorizontal=/left|center|right/,rvertical=/top|center|bottom/,roffset=/[\\+\\-]\\d+(\\.[\\d]+)?%?/,rposition=/^\\w+/,rpercent=/%$/,_position=$.fn.position;function getOffsets(offsets,width,height){return[parseFloat(offsets[0])*(rpercent.test(offsets[0])?width/100:1),parseFloat(offsets[1])*(rpercent.test(offsets[1])?height/100:1)];}function parseCss(element,property){return parseInt($.css(element,property),10)||0;}function isWindow(obj){return obj!=null&&obj===obj.window;}function getDimensions(elem){var raw=elem[0];if(raw.nodeType===9){return{width:elem.width(),height:elem.height(),offset:{top:0,left:0}};}if(isWindow(raw)){return{width:elem.width(),height:elem.height(),offset:{top:elem.scrollTop(),left:elem.scrollLeft()}};}if(raw.preventDefault){return{width:0,height:0,offset:{top:raw.pageY,left:raw.pageX}};}return{width:elem.outerWidth(),height:elem.outerHeight(),offset:elem.offset()};}$.position={scrollbarWidth:function scrollbarWidth(){if(cachedScrollbarWidth!==undefined){return cachedScrollbarWidth;}var w1,w2,div=$(\"<div style=\"+\"'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>\"+\"<div style='height:300px;width:auto;'></div></div>\"),innerDiv=div.children()[0];$(\"body\").append(div);w1=innerDiv.offsetWidth;div.css(\"overflow\",\"scroll\");w2=innerDiv.offsetWidth;if(w1===w2){w2=div[0].clientWidth;}div.remove();return cachedScrollbarWidth=w1-w2;},getScrollInfo:function getScrollInfo(within){var overflowX=within.isWindow||within.isDocument?\"\":within.element.css(\"overflow-x\"),overflowY=within.isWindow||within.isDocument?\"\":within.element.css(\"overflow-y\"),hasOverflowX=overflowX===\"scroll\"||overflowX===\"auto\"&&within.width<within.element[0].scrollWidth,hasOverflowY=overflowY===\"scroll\"||overflowY===\"auto\"&&within.height<within.element[0].scrollHeight;return{width:hasOverflowY?$.position.scrollbarWidth():0,height:hasOverflowX?$.position.scrollbarWidth():0};},getWithinInfo:function getWithinInfo(element){var withinElement=$(element||window),isElemWindow=isWindow(withinElement[0]),isDocument=!!withinElement[0]&&withinElement[0].nodeType===9,hasOffset=!isElemWindow&&!isDocument;return{element:withinElement,isWindow:isElemWindow,isDocument:isDocument,offset:hasOffset?$(element).offset():{left:0,top:0},scrollLeft:withinElement.scrollLeft(),scrollTop:withinElement.scrollTop(),width:withinElement.outerWidth(),height:withinElement.outerHeight()};}};$.fn.position=function(options){if(!options||!options.of){return _position.apply(this,arguments);}// Make a copy, we don't want to modify arguments\noptions=$.extend({},options);var atOffset,targetWidth,targetHeight,targetOffset,basePosition,dimensions,// Make sure string options are treated as CSS selectors\ntarget=typeof options.of===\"string\"?$(document).find(options.of):$(options.of),within=$.position.getWithinInfo(options.within),scrollInfo=$.position.getScrollInfo(within),collision=(options.collision||\"flip\").split(\" \"),offsets={};dimensions=getDimensions(target);if(target[0].preventDefault){// Force left top to allow flipping\noptions.at=\"left top\";}targetWidth=dimensions.width;targetHeight=dimensions.height;targetOffset=dimensions.offset;// Clone to reuse original targetOffset later\nbasePosition=$.extend({},targetOffset);// Force my and at to have valid horizontal and vertical positions\n// if a value is missing or invalid, it will be converted to center\n$.each([\"my\",\"at\"],function(){var pos=(options[this]||\"\").split(\" \"),horizontalOffset,verticalOffset;if(pos.length===1){pos=rhorizontal.test(pos[0])?pos.concat([\"center\"]):rvertical.test(pos[0])?[\"center\"].concat(pos):[\"center\",\"center\"];}pos[0]=rhorizontal.test(pos[0])?pos[0]:\"center\";pos[1]=rvertical.test(pos[1])?pos[1]:\"center\";// Calculate offsets\nhorizontalOffset=roffset.exec(pos[0]);verticalOffset=roffset.exec(pos[1]);offsets[this]=[horizontalOffset?horizontalOffset[0]:0,verticalOffset?verticalOffset[0]:0];// Reduce to just the positions without the offsets\noptions[this]=[rposition.exec(pos[0])[0],rposition.exec(pos[1])[0]];});// Normalize collision option\nif(collision.length===1){collision[1]=collision[0];}if(options.at[0]===\"right\"){basePosition.left+=targetWidth;}else if(options.at[0]===\"center\"){basePosition.left+=targetWidth/2;}if(options.at[1]===\"bottom\"){basePosition.top+=targetHeight;}else if(options.at[1]===\"center\"){basePosition.top+=targetHeight/2;}atOffset=getOffsets(offsets.at,targetWidth,targetHeight);basePosition.left+=atOffset[0];basePosition.top+=atOffset[1];return this.each(function(){var collisionPosition,using,elem=$(this),elemWidth=elem.outerWidth(),elemHeight=elem.outerHeight(),marginLeft=parseCss(this,\"marginLeft\"),marginTop=parseCss(this,\"marginTop\"),collisionWidth=elemWidth+marginLeft+parseCss(this,\"marginRight\")+scrollInfo.width,collisionHeight=elemHeight+marginTop+parseCss(this,\"marginBottom\")+scrollInfo.height,position=$.extend({},basePosition),myOffset=getOffsets(offsets.my,elem.outerWidth(),elem.outerHeight());if(options.my[0]===\"right\"){position.left-=elemWidth;}else if(options.my[0]===\"center\"){position.left-=elemWidth/2;}if(options.my[1]===\"bottom\"){position.top-=elemHeight;}else if(options.my[1]===\"center\"){position.top-=elemHeight/2;}position.left+=myOffset[0];position.top+=myOffset[1];collisionPosition={marginLeft:marginLeft,marginTop:marginTop};$.each([\"left\",\"top\"],function(i,dir){if($.ui.position[collision[i]]){$.ui.position[collision[i]][dir](position,{targetWidth:targetWidth,targetHeight:targetHeight,elemWidth:elemWidth,elemHeight:elemHeight,collisionPosition:collisionPosition,collisionWidth:collisionWidth,collisionHeight:collisionHeight,offset:[atOffset[0]+myOffset[0],atOffset[1]+myOffset[1]],my:options.my,at:options.at,within:within,elem:elem});}});if(options.using){// Adds feedback as second argument to using callback, if present\nusing=function using(props){var left=targetOffset.left-position.left,right=left+targetWidth-elemWidth,top=targetOffset.top-position.top,bottom=top+targetHeight-elemHeight,feedback={target:{element:target,left:targetOffset.left,top:targetOffset.top,width:targetWidth,height:targetHeight},element:{element:elem,left:position.left,top:position.top,width:elemWidth,height:elemHeight},horizontal:right<0?\"left\":left>0?\"right\":\"center\",vertical:bottom<0?\"top\":top>0?\"bottom\":\"middle\"};if(targetWidth<elemWidth&&abs(left+right)<targetWidth){feedback.horizontal=\"center\";}if(targetHeight<elemHeight&&abs(top+bottom)<targetHeight){feedback.vertical=\"middle\";}if(max(abs(left),abs(right))>max(abs(top),abs(bottom))){feedback.important=\"horizontal\";}else{feedback.important=\"vertical\";}options.using.call(this,props,feedback);};}elem.offset($.extend(position,{using:using}));});};$.ui.position={fit:{left:function left(position,data){var within=data.within,withinOffset=within.isWindow?within.scrollLeft:within.offset.left,outerWidth=within.width,collisionPosLeft=position.left-data.collisionPosition.marginLeft,overLeft=withinOffset-collisionPosLeft,overRight=collisionPosLeft+data.collisionWidth-outerWidth-withinOffset,newOverRight;// Element is wider than within\nif(data.collisionWidth>outerWidth){// Element is initially over the left side of within\nif(overLeft>0&&overRight<=0){newOverRight=position.left+overLeft+data.collisionWidth-outerWidth-withinOffset;position.left+=overLeft-newOverRight;// Element is initially over right side of within\n}else if(overRight>0&&overLeft<=0){position.left=withinOffset;// Element is initially over both left and right sides of within\n}else{if(overLeft>overRight){position.left=withinOffset+outerWidth-data.collisionWidth;}else{position.left=withinOffset;}}// Too far left -> align with left edge\n}else if(overLeft>0){position.left+=overLeft;// Too far right -> align with right edge\n}else if(overRight>0){position.left-=overRight;// Adjust based on position and margin\n}else{position.left=max(position.left-collisionPosLeft,position.left);}},top:function top(position,data){var within=data.within,withinOffset=within.isWindow?within.scrollTop:within.offset.top,outerHeight=data.within.height,collisionPosTop=position.top-data.collisionPosition.marginTop,overTop=withinOffset-collisionPosTop,overBottom=collisionPosTop+data.collisionHeight-outerHeight-withinOffset,newOverBottom;// Element is taller than within\nif(data.collisionHeight>outerHeight){// Element is initially over the top of within\nif(overTop>0&&overBottom<=0){newOverBottom=position.top+overTop+data.collisionHeight-outerHeight-withinOffset;position.top+=overTop-newOverBottom;// Element is initially over bottom of within\n}else if(overBottom>0&&overTop<=0){position.top=withinOffset;// Element is initially over both top and bottom of within\n}else{if(overTop>overBottom){position.top=withinOffset+outerHeight-data.collisionHeight;}else{position.top=withinOffset;}}// Too far up -> align with top\n}else if(overTop>0){position.top+=overTop;// Too far down -> align with bottom edge\n}else if(overBottom>0){position.top-=overBottom;// Adjust based on position and margin\n}else{position.top=max(position.top-collisionPosTop,position.top);}}},flip:{left:function left(position,data){var within=data.within,withinOffset=within.offset.left+within.scrollLeft,outerWidth=within.width,offsetLeft=within.isWindow?within.scrollLeft:within.offset.left,collisionPosLeft=position.left-data.collisionPosition.marginLeft,overLeft=collisionPosLeft-offsetLeft,overRight=collisionPosLeft+data.collisionWidth-outerWidth-offsetLeft,myOffset=data.my[0]===\"left\"?-data.elemWidth:data.my[0]===\"right\"?data.elemWidth:0,atOffset=data.at[0]===\"left\"?data.targetWidth:data.at[0]===\"right\"?-data.targetWidth:0,offset=-2*data.offset[0],newOverRight,newOverLeft;if(overLeft<0){newOverRight=position.left+myOffset+atOffset+offset+data.collisionWidth-outerWidth-withinOffset;if(newOverRight<0||newOverRight<abs(overLeft)){position.left+=myOffset+atOffset+offset;}}else if(overRight>0){newOverLeft=position.left-data.collisionPosition.marginLeft+myOffset+atOffset+offset-offsetLeft;if(newOverLeft>0||abs(newOverLeft)<overRight){position.left+=myOffset+atOffset+offset;}}},top:function top(position,data){var within=data.within,withinOffset=within.offset.top+within.scrollTop,outerHeight=within.height,offsetTop=within.isWindow?within.scrollTop:within.offset.top,collisionPosTop=position.top-data.collisionPosition.marginTop,overTop=collisionPosTop-offsetTop,overBottom=collisionPosTop+data.collisionHeight-outerHeight-offsetTop,top=data.my[1]===\"top\",myOffset=top?-data.elemHeight:data.my[1]===\"bottom\"?data.elemHeight:0,atOffset=data.at[1]===\"top\"?data.targetHeight:data.at[1]===\"bottom\"?-data.targetHeight:0,offset=-2*data.offset[1],newOverTop,newOverBottom;if(overTop<0){newOverBottom=position.top+myOffset+atOffset+offset+data.collisionHeight-outerHeight-withinOffset;if(newOverBottom<0||newOverBottom<abs(overTop)){position.top+=myOffset+atOffset+offset;}}else if(overBottom>0){newOverTop=position.top-data.collisionPosition.marginTop+myOffset+atOffset+offset-offsetTop;if(newOverTop>0||abs(newOverTop)<overBottom){position.top+=myOffset+atOffset+offset;}}}},flipfit:{left:function left(){$.ui.position.flip.left.apply(this,arguments);$.ui.position.fit.left.apply(this,arguments);},top:function top(){$.ui.position.flip.top.apply(this,arguments);$.ui.position.fit.top.apply(this,arguments);}}};})();var position=$.ui.position;/*!\n * jQuery UI :data 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: :data Selector\n//>>group: Core\n//>>description: Selects elements which have data stored under the specified key.\n//>>docs: http://api.jqueryui.com/data-selector/\nvar data=$.extend($.expr.pseudos,{data:$.expr.createPseudo?$.expr.createPseudo(function(dataName){return function(elem){return!!$.data(elem,dataName);};}):// Support: jQuery <1.8\nfunction(elem,i,match){return!!$.data(elem,match[3]);}});/*!\n * jQuery UI Disable Selection 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: disableSelection\n//>>group: Core\n//>>description: Disable selection of text content within the set of matched elements.\n//>>docs: http://api.jqueryui.com/disableSelection/\n// This file is deprecated\nvar disableSelection=$.fn.extend({disableSelection:function(){var eventType=\"onselectstart\"in document.createElement(\"div\")?\"selectstart\":\"mousedown\";return function(){return this.on(eventType+\".ui-disableSelection\",function(event){event.preventDefault();});};}(),enableSelection:function enableSelection(){return this.off(\".ui-disableSelection\");}});// Create a local jQuery because jQuery Color relies on it and the\n// global may not exist with AMD and a custom build (#10199).\n// This module is a noop if used as a regular AMD module.\n// eslint-disable-next-line no-unused-vars\nvar jQuery=$;/*!\n * jQuery Color Animations v2.2.0\n * https://github.com/jquery/jquery-color\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * Date: Sun May 10 09:02:36 2020 +0200\n */var stepHooks=\"backgroundColor borderBottomColor borderLeftColor borderRightColor \"+\"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",class2type={},toString=class2type.toString,// plusequals test for += 100 -= 100\nrplusequals=/^([\\-+])=\\s*(\\d+\\.?\\d*)/,// a set of RE's that can match strings and generate color tuples.\nstringParsers=[{re:/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function parse(execResult){return[execResult[1],execResult[2],execResult[3],execResult[4]];}},{re:/rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function parse(execResult){return[execResult[1]*2.55,execResult[2]*2.55,execResult[3]*2.55,execResult[4]];}},{// this regex ignores A-F because it's compared against an already lowercased string\nre:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/,parse:function parse(execResult){return[parseInt(execResult[1],16),parseInt(execResult[2],16),parseInt(execResult[3],16),execResult[4]?(parseInt(execResult[4],16)/255).toFixed(2):1];}},{// this regex ignores A-F because it's compared against an already lowercased string\nre:/#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/,parse:function parse(execResult){return[parseInt(execResult[1]+execResult[1],16),parseInt(execResult[2]+execResult[2],16),parseInt(execResult[3]+execResult[3],16),execResult[4]?(parseInt(execResult[4]+execResult[4],16)/255).toFixed(2):1];}},{re:/hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,space:\"hsla\",parse:function parse(execResult){return[execResult[1],execResult[2]/100,execResult[3]/100,execResult[4]];}}],// jQuery.Color( )\ncolor=jQuery.Color=function(color,green,blue,alpha){return new jQuery.Color.fn.parse(color,green,blue,alpha);},spaces={rgba:{props:{red:{idx:0,type:\"byte\"},green:{idx:1,type:\"byte\"},blue:{idx:2,type:\"byte\"}}},hsla:{props:{hue:{idx:0,type:\"degrees\"},saturation:{idx:1,type:\"percent\"},lightness:{idx:2,type:\"percent\"}}}},propTypes={\"byte\":{floor:true,max:255},\"percent\":{max:1},\"degrees\":{mod:360,floor:true}},support=color.support={},// element for support tests\nsupportElem=jQuery(\"<p>\")[0],// colors = jQuery.Color.names\ncolors,// local aliases of functions called often\neach=jQuery.each;// determine rgba support immediately\nsupportElem.style.cssText=\"background-color:rgba(1,1,1,.5)\";support.rgba=supportElem.style.backgroundColor.indexOf(\"rgba\")>-1;// define cache name and alpha properties\n// for rgba and hsla spaces\neach(spaces,function(spaceName,space){space.cache=\"_\"+spaceName;space.props.alpha={idx:3,type:\"percent\",def:1};});// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(_i,name){class2type[\"[object \"+name+\"]\"]=name.toLowerCase();});function getType(obj){if(obj==null){return obj+\"\";}return _typeof(obj)===\"object\"?class2type[toString.call(obj)]||\"object\":_typeof(obj);}function clamp(value,prop,allowEmpty){var type=propTypes[prop.type]||{};if(value==null){return allowEmpty||!prop.def?null:prop.def;}// ~~ is an short way of doing floor for positive numbers\nvalue=type.floor?~~value:parseFloat(value);// IE will pass in empty strings as value for alpha,\n// which will hit this case\nif(isNaN(value)){return prop.def;}if(type.mod){// we add mod before modding to make sure that negatives values\n// get converted properly: -10 -> 350\nreturn(value+type.mod)%type.mod;}// for now all property types without mod have min and max\nreturn Math.min(type.max,Math.max(0,value));}function stringParse(string){var inst=color(),rgba=inst._rgba=[];string=string.toLowerCase();each(stringParsers,function(_i,parser){var parsed,match=parser.re.exec(string),values=match&&parser.parse(match),spaceName=parser.space||\"rgba\";if(values){parsed=inst[spaceName](values);// if this was an rgba parse the assignment might happen twice\n// oh well....\ninst[spaces[spaceName].cache]=parsed[spaces[spaceName].cache];rgba=inst._rgba=parsed._rgba;// exit each( stringParsers ) here because we matched\nreturn false;}});// Found a stringParser that handled it\nif(rgba.length){// if this came from a parsed string, force \"transparent\" when alpha is 0\n// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\nif(rgba.join()===\"0,0,0,0\"){jQuery.extend(rgba,colors.transparent);}return inst;}// named colors\nreturn colors[string];}color.fn=jQuery.extend(color.prototype,{parse:function parse(red,green,blue,alpha){if(red===undefined){this._rgba=[null,null,null,null];return this;}if(red.jquery||red.nodeType){red=jQuery(red).css(green);green=undefined;}var inst=this,type=getType(red),rgba=this._rgba=[];// more than 1 argument specified - assume ( red, green, blue, alpha )\nif(green!==undefined){red=[red,green,blue,alpha];type=\"array\";}if(type===\"string\"){return this.parse(stringParse(red)||colors._default);}if(type===\"array\"){each(spaces.rgba.props,function(_key,prop){rgba[prop.idx]=clamp(red[prop.idx],prop);});return this;}if(type===\"object\"){if(red instanceof color){each(spaces,function(_spaceName,space){if(red[space.cache]){inst[space.cache]=red[space.cache].slice();}});}else{each(spaces,function(_spaceName,space){var cache=space.cache;each(space.props,function(key,prop){// if the cache doesn't exist, and we know how to convert\nif(!inst[cache]&&space.to){// if the value was null, we don't need to copy it\n// if the key was alpha, we don't need to copy it either\nif(key===\"alpha\"||red[key]==null){return;}inst[cache]=space.to(inst._rgba);}// this is the only case where we allow nulls for ALL properties.\n// call clamp with alwaysAllowEmpty\ninst[cache][prop.idx]=clamp(red[key],prop,true);});// everything defined but alpha?\nif(inst[cache]&&jQuery.inArray(null,inst[cache].slice(0,3))<0){// use the default of 1\nif(inst[cache][3]==null){inst[cache][3]=1;}if(space.from){inst._rgba=space.from(inst[cache]);}}});}return this;}},is:function is(compare){var is=color(compare),same=true,inst=this;each(spaces,function(_,space){var localCache,isCache=is[space.cache];if(isCache){localCache=inst[space.cache]||space.to&&space.to(inst._rgba)||[];each(space.props,function(_,prop){if(isCache[prop.idx]!=null){same=isCache[prop.idx]===localCache[prop.idx];return same;}});}return same;});return same;},_space:function _space(){var used=[],inst=this;each(spaces,function(spaceName,space){if(inst[space.cache]){used.push(spaceName);}});return used.pop();},transition:function transition(other,distance){var end=color(other),spaceName=end._space(),space=spaces[spaceName],startColor=this.alpha()===0?color(\"transparent\"):this,start=startColor[space.cache]||space.to(startColor._rgba),result=start.slice();end=end[space.cache];each(space.props,function(_key,prop){var index=prop.idx,startValue=start[index],endValue=end[index],type=propTypes[prop.type]||{};// if null, don't override start value\nif(endValue===null){return;}// if null - use end\nif(startValue===null){result[index]=endValue;}else{if(type.mod){if(endValue-startValue>type.mod/2){startValue+=type.mod;}else if(startValue-endValue>type.mod/2){startValue-=type.mod;}}result[index]=clamp((endValue-startValue)*distance+startValue,prop);}});return this[spaceName](result);},blend:function blend(opaque){// if we are already opaque - return ourself\nif(this._rgba[3]===1){return this;}var rgb=this._rgba.slice(),a=rgb.pop(),blend=color(opaque)._rgba;return color(jQuery.map(rgb,function(v,i){return(1-a)*blend[i]+a*v;}));},toRgbaString:function toRgbaString(){var prefix=\"rgba(\",rgba=jQuery.map(this._rgba,function(v,i){if(v!=null){return v;}return i>2?1:0;});if(rgba[3]===1){rgba.pop();prefix=\"rgb(\";}return prefix+rgba.join()+\")\";},toHslaString:function toHslaString(){var prefix=\"hsla(\",hsla=jQuery.map(this.hsla(),function(v,i){if(v==null){v=i>2?1:0;}// catch 1 and 2\nif(i&&i<3){v=Math.round(v*100)+\"%\";}return v;});if(hsla[3]===1){hsla.pop();prefix=\"hsl(\";}return prefix+hsla.join()+\")\";},toHexString:function toHexString(includeAlpha){var rgba=this._rgba.slice(),alpha=rgba.pop();if(includeAlpha){rgba.push(~~(alpha*255));}return\"#\"+jQuery.map(rgba,function(v){// default to 0 when nulls exist\nv=(v||0).toString(16);return v.length===1?\"0\"+v:v;}).join(\"\");},toString:function toString(){return this._rgba[3]===0?\"transparent\":this.toRgbaString();}});color.fn.parse.prototype=color.fn;// hsla conversions adapted from:\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\nfunction hue2rgb(p,q,h){h=(h+1)%1;if(h*6<1){return p+(q-p)*h*6;}if(h*2<1){return q;}if(h*3<2){return p+(q-p)*(2/3-h)*6;}return p;}spaces.hsla.to=function(rgba){if(rgba[0]==null||rgba[1]==null||rgba[2]==null){return[null,null,null,rgba[3]];}var r=rgba[0]/255,g=rgba[1]/255,b=rgba[2]/255,a=rgba[3],max=Math.max(r,g,b),min=Math.min(r,g,b),diff=max-min,add=max+min,l=add*0.5,h,s;if(min===max){h=0;}else if(r===max){h=60*(g-b)/diff+360;}else if(g===max){h=60*(b-r)/diff+120;}else{h=60*(r-g)/diff+240;}// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\nif(diff===0){s=0;}else if(l<=0.5){s=diff/add;}else{s=diff/(2-add);}return[Math.round(h)%360,s,l,a==null?1:a];};spaces.hsla.from=function(hsla){if(hsla[0]==null||hsla[1]==null||hsla[2]==null){return[null,null,null,hsla[3]];}var h=hsla[0]/360,s=hsla[1],l=hsla[2],a=hsla[3],q=l<=0.5?l*(1+s):l+s-l*s,p=2*l-q;return[Math.round(hue2rgb(p,q,h+1/3)*255),Math.round(hue2rgb(p,q,h)*255),Math.round(hue2rgb(p,q,h-1/3)*255),a];};each(spaces,function(spaceName,space){var props=space.props,cache=space.cache,to=space.to,from=space.from;// makes rgba() and hsla()\ncolor.fn[spaceName]=function(value){// generate a cache for this space if it doesn't exist\nif(to&&!this[cache]){this[cache]=to(this._rgba);}if(value===undefined){return this[cache].slice();}var ret,type=getType(value),arr=type===\"array\"||type===\"object\"?value:arguments,local=this[cache].slice();each(props,function(key,prop){var val=arr[type===\"object\"?key:prop.idx];if(val==null){val=local[prop.idx];}local[prop.idx]=clamp(val,prop);});if(from){ret=color(from(local));ret[cache]=local;return ret;}else{return color(local);}};// makes red() green() blue() alpha() hue() saturation() lightness()\neach(props,function(key,prop){// alpha is included in more than one space\nif(color.fn[key]){return;}color.fn[key]=function(value){var local,cur,match,fn,vtype=getType(value);if(key===\"alpha\"){fn=this._hsla?\"hsla\":\"rgba\";}else{fn=spaceName;}local=this[fn]();cur=local[prop.idx];if(vtype===\"undefined\"){return cur;}if(vtype===\"function\"){value=value.call(this,cur);vtype=getType(value);}if(value==null&&prop.empty){return this;}if(vtype===\"string\"){match=rplusequals.exec(value);if(match){value=cur+parseFloat(match[2])*(match[1]===\"+\"?1:-1);}}local[prop.idx]=value;return this[fn](local);};});});// add cssHook and .fx.step function for each named hook.\n// accept a space separated string of properties\ncolor.hook=function(hook){var hooks=hook.split(\" \");each(hooks,function(_i,hook){jQuery.cssHooks[hook]={set:function set(elem,value){var parsed,curElem,backgroundColor=\"\";if(value!==\"transparent\"&&(getType(value)!==\"string\"||(parsed=stringParse(value)))){value=color(parsed||value);if(!support.rgba&&value._rgba[3]!==1){curElem=hook===\"backgroundColor\"?elem.parentNode:elem;while((backgroundColor===\"\"||backgroundColor===\"transparent\")&&curElem&&curElem.style){try{backgroundColor=jQuery.css(curElem,\"backgroundColor\");curElem=curElem.parentNode;}catch(e){}}value=value.blend(backgroundColor&&backgroundColor!==\"transparent\"?backgroundColor:\"_default\");}value=value.toRgbaString();}try{elem.style[hook]=value;}catch(e){// wrapped to prevent IE from throwing errors on \"invalid\" values like 'auto' or 'inherit'\n}}};jQuery.fx.step[hook]=function(fx){if(!fx.colorInit){fx.start=color(fx.elem,hook);fx.end=color(fx.end);fx.colorInit=true;}jQuery.cssHooks[hook].set(fx.elem,fx.start.transition(fx.end,fx.pos));};});};color.hook(stepHooks);jQuery.cssHooks.borderColor={expand:function expand(value){var expanded={};each([\"Top\",\"Right\",\"Bottom\",\"Left\"],function(_i,part){expanded[\"border\"+part+\"Color\"]=value;});return expanded;}};// Basic color names only.\n// Usage of any of the other color names requires adding yourself or including\n// jquery.color.svg-names.js.\ncolors=jQuery.Color.names={// 4.1. Basic color keywords\naqua:\"#00ffff\",black:\"#000000\",blue:\"#0000ff\",fuchsia:\"#ff00ff\",gray:\"#808080\",green:\"#008000\",lime:\"#00ff00\",maroon:\"#800000\",navy:\"#000080\",olive:\"#808000\",purple:\"#800080\",red:\"#ff0000\",silver:\"#c0c0c0\",teal:\"#008080\",white:\"#ffffff\",yellow:\"#ffff00\",// 4.2.3. \"transparent\" color keyword\ntransparent:[null,null,null,0],_default:\"#ffffff\"};/*!\n * jQuery UI Effects 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Effects Core\n//>>group: Effects\n/* eslint-disable max-len */ //>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.\n/* eslint-enable max-len */ //>>docs: http://api.jqueryui.com/category/effects-core/\n//>>demos: http://jqueryui.com/effect/\nvar dataSpace=\"ui-effects-\",dataSpaceStyle=\"ui-effects-style\",dataSpaceAnimated=\"ui-effects-animated\";$.effects={effect:{}};/******************************************************************************/ /****************************** CLASS ANIMATIONS ******************************/ /******************************************************************************/(function(){var classAnimationActions=[\"add\",\"remove\",\"toggle\"],shorthandStyles={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};$.each([\"borderLeftStyle\",\"borderRightStyle\",\"borderBottomStyle\",\"borderTopStyle\"],function(_,prop){$.fx.step[prop]=function(fx){if(fx.end!==\"none\"&&!fx.setAttr||fx.pos===1&&!fx.setAttr){jQuery.style(fx.elem,prop,fx.end);fx.setAttr=true;}};});function camelCase(string){return string.replace(/-([\\da-z])/gi,function(all,letter){return letter.toUpperCase();});}function getElementStyles(elem){var key,len,style=elem.ownerDocument.defaultView?elem.ownerDocument.defaultView.getComputedStyle(elem,null):elem.currentStyle,styles={};if(style&&style.length&&style[0]&&style[style[0]]){len=style.length;while(len--){key=style[len];if(typeof style[key]===\"string\"){styles[camelCase(key)]=style[key];}}// Support: Opera, IE <9\n}else{for(key in style){if(typeof style[key]===\"string\"){styles[key]=style[key];}}}return styles;}function styleDifference(oldStyle,newStyle){var diff={},name,value;for(name in newStyle){value=newStyle[name];if(oldStyle[name]!==value){if(!shorthandStyles[name]){if($.fx.step[name]||!isNaN(parseFloat(value))){diff[name]=value;}}}}return diff;}// Support: jQuery <1.8\nif(!$.fn.addBack){$.fn.addBack=function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector));};}$.effects.animateClass=function(value,duration,easing,callback){var o=$.speed(duration,easing,callback);return this.queue(function(){var animated=$(this),baseClass=animated.attr(\"class\")||\"\",applyClassChange,allAnimations=o.children?animated.find(\"*\").addBack():animated;// Map the animated objects to store the original styles.\nallAnimations=allAnimations.map(function(){var el=$(this);return{el:el,start:getElementStyles(this)};});// Apply class change\napplyClassChange=function applyClassChange(){$.each(classAnimationActions,function(i,action){if(value[action]){animated[action+\"Class\"](value[action]);}});};applyClassChange();// Map all animated objects again - calculate new styles and diff\nallAnimations=allAnimations.map(function(){this.end=getElementStyles(this.el[0]);this.diff=styleDifference(this.start,this.end);return this;});// Apply original class\nanimated.attr(\"class\",baseClass);// Map all animated objects again - this time collecting a promise\nallAnimations=allAnimations.map(function(){var styleInfo=this,dfd=$.Deferred(),opts=$.extend({},o,{queue:false,complete:function complete(){dfd.resolve(styleInfo);}});this.el.animate(this.diff,opts);return dfd.promise();});// Once all animations have completed:\n$.when.apply($,allAnimations.get()).done(function(){// Set the final class\napplyClassChange();// For each animated element,\n// clear all css properties that were animated\n$.each(arguments,function(){var el=this.el;$.each(this.diff,function(key){el.css(key,\"\");});});// This is guarnteed to be there if you use jQuery.speed()\n// it also handles dequeuing the next anim...\no.complete.call(animated[0]);});});};$.fn.extend({addClass:function(orig){return function(classNames,speed,easing,callback){return speed?$.effects.animateClass.call(this,{add:classNames},speed,easing,callback):orig.apply(this,arguments);};}($.fn.addClass),removeClass:function(orig){return function(classNames,speed,easing,callback){return arguments.length>1?$.effects.animateClass.call(this,{remove:classNames},speed,easing,callback):orig.apply(this,arguments);};}($.fn.removeClass),toggleClass:function(orig){return function(classNames,force,speed,easing,callback){if(typeof force===\"boolean\"||force===undefined){if(!speed){// Without speed parameter\nreturn orig.apply(this,arguments);}else{return $.effects.animateClass.call(this,force?{add:classNames}:{remove:classNames},speed,easing,callback);}}else{// Without force parameter\nreturn $.effects.animateClass.call(this,{toggle:classNames},force,speed,easing);}};}($.fn.toggleClass),switchClass:function switchClass(remove,add,speed,easing,callback){return $.effects.animateClass.call(this,{add:add,remove:remove},speed,easing,callback);}});})();/******************************************************************************/ /*********************************** EFFECTS **********************************/ /******************************************************************************/(function(){if($.expr&&$.expr.pseudos&&$.expr.pseudos.animated){$.expr.pseudos.animated=function(orig){return function(elem){return!!$(elem).data(dataSpaceAnimated)||orig(elem);};}($.expr.pseudos.animated);}if($.uiBackCompat!==false){$.extend($.effects,{// Saves a set of properties in a data storage\nsave:function save(element,set){var i=0,length=set.length;for(;i<length;i++){if(set[i]!==null){element.data(dataSpace+set[i],element[0].style[set[i]]);}}},// Restores a set of previously saved properties from a data storage\nrestore:function restore(element,set){var val,i=0,length=set.length;for(;i<length;i++){if(set[i]!==null){val=element.data(dataSpace+set[i]);element.css(set[i],val);}}},setMode:function setMode(el,mode){if(mode===\"toggle\"){mode=el.is(\":hidden\")?\"show\":\"hide\";}return mode;},// Wraps the element around a wrapper that copies position properties\ncreateWrapper:function createWrapper(element){// If the element is already wrapped, return it\nif(element.parent().is(\".ui-effects-wrapper\")){return element.parent();}// Wrap the element\nvar props={width:element.outerWidth(true),height:element.outerHeight(true),\"float\":element.css(\"float\")},wrapper=$(\"<div></div>\").addClass(\"ui-effects-wrapper\").css({fontSize:\"100%\",background:\"transparent\",border:\"none\",margin:0,padding:0}),// Store the size in case width/height are defined in % - Fixes #5245\nsize={width:element.width(),height:element.height()},active=document.activeElement;// Support: Firefox\n// Firefox incorrectly exposes anonymous content\n// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\ntry{// eslint-disable-next-line no-unused-expressions\nactive.id;}catch(e){active=document.body;}element.wrap(wrapper);// Fixes #7595 - Elements lose focus when wrapped.\nif(element[0]===active||$.contains(element[0],active)){$(active).trigger(\"focus\");}// Hotfix for jQuery 1.4 since some change in wrap() seems to actually\n// lose the reference to the wrapped element\nwrapper=element.parent();// Transfer positioning properties to the wrapper\nif(element.css(\"position\")===\"static\"){wrapper.css({position:\"relative\"});element.css({position:\"relative\"});}else{$.extend(props,{position:element.css(\"position\"),zIndex:element.css(\"z-index\")});$.each([\"top\",\"left\",\"bottom\",\"right\"],function(i,pos){props[pos]=element.css(pos);if(isNaN(parseInt(props[pos],10))){props[pos]=\"auto\";}});element.css({position:\"relative\",top:0,left:0,right:\"auto\",bottom:\"auto\"});}element.css(size);return wrapper.css(props).show();},removeWrapper:function removeWrapper(element){var active=document.activeElement;if(element.parent().is(\".ui-effects-wrapper\")){element.parent().replaceWith(element);// Fixes #7595 - Elements lose focus when wrapped.\nif(element[0]===active||$.contains(element[0],active)){$(active).trigger(\"focus\");}}return element;}});}$.extend($.effects,{version:\"1.13.2\",define:function define(name,mode,effect){if(!effect){effect=mode;mode=\"effect\";}$.effects.effect[name]=effect;$.effects.effect[name].mode=mode;return effect;},scaledDimensions:function scaledDimensions(element,percent,direction){if(percent===0){return{height:0,width:0,outerHeight:0,outerWidth:0};}var x=direction!==\"horizontal\"?(percent||100)/100:1,y=direction!==\"vertical\"?(percent||100)/100:1;return{height:element.height()*y,width:element.width()*x,outerHeight:element.outerHeight()*y,outerWidth:element.outerWidth()*x};},clipToBox:function clipToBox(animation){return{width:animation.clip.right-animation.clip.left,height:animation.clip.bottom-animation.clip.top,left:animation.clip.left,top:animation.clip.top};},// Injects recently queued functions to be first in line (after \"inprogress\")\nunshift:function unshift(element,queueLength,count){var queue=element.queue();if(queueLength>1){queue.splice.apply(queue,[1,0].concat(queue.splice(queueLength,count)));}element.dequeue();},saveStyle:function saveStyle(element){element.data(dataSpaceStyle,element[0].style.cssText);},restoreStyle:function restoreStyle(element){element[0].style.cssText=element.data(dataSpaceStyle)||\"\";element.removeData(dataSpaceStyle);},mode:function mode(element,_mode){var hidden=element.is(\":hidden\");if(_mode===\"toggle\"){_mode=hidden?\"show\":\"hide\";}if(hidden?_mode===\"hide\":_mode===\"show\"){_mode=\"none\";}return _mode;},// Translates a [top,left] array into a baseline value\ngetBaseline:function getBaseline(origin,original){var y,x;switch(origin[0]){case\"top\":y=0;break;case\"middle\":y=0.5;break;case\"bottom\":y=1;break;default:y=origin[0]/original.height;}switch(origin[1]){case\"left\":x=0;break;case\"center\":x=0.5;break;case\"right\":x=1;break;default:x=origin[1]/original.width;}return{x:x,y:y};},// Creates a placeholder element so that the original element can be made absolute\ncreatePlaceholder:function createPlaceholder(element){var placeholder,cssPosition=element.css(\"position\"),position=element.position();// Lock in margins first to account for form elements, which\n// will change margin if you explicitly set height\n// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380\n// Support: Safari\nelement.css({marginTop:element.css(\"marginTop\"),marginBottom:element.css(\"marginBottom\"),marginLeft:element.css(\"marginLeft\"),marginRight:element.css(\"marginRight\")}).outerWidth(element.outerWidth()).outerHeight(element.outerHeight());if(/^(static|relative)/.test(cssPosition)){cssPosition=\"absolute\";placeholder=$(\"<\"+element[0].nodeName+\">\").insertAfter(element).css({// Convert inline to inline block to account for inline elements\n// that turn to inline block based on content (like img)\ndisplay:/^(inline|ruby)/.test(element.css(\"display\"))?\"inline-block\":\"block\",visibility:\"hidden\",// Margins need to be set to account for margin collapse\nmarginTop:element.css(\"marginTop\"),marginBottom:element.css(\"marginBottom\"),marginLeft:element.css(\"marginLeft\"),marginRight:element.css(\"marginRight\"),\"float\":element.css(\"float\")}).outerWidth(element.outerWidth()).outerHeight(element.outerHeight()).addClass(\"ui-effects-placeholder\");element.data(dataSpace+\"placeholder\",placeholder);}element.css({position:cssPosition,left:position.left,top:position.top});return placeholder;},removePlaceholder:function removePlaceholder(element){var dataKey=dataSpace+\"placeholder\",placeholder=element.data(dataKey);if(placeholder){placeholder.remove();element.removeData(dataKey);}},// Removes a placeholder if it exists and restores\n// properties that were modified during placeholder creation\ncleanUp:function cleanUp(element){$.effects.restoreStyle(element);$.effects.removePlaceholder(element);},setTransition:function setTransition(element,list,factor,value){value=value||{};$.each(list,function(i,x){var unit=element.cssUnit(x);if(unit[0]>0){value[x]=unit[0]*factor+unit[1];}});return value;}});// Return an effect options object for the given parameters:\nfunction _normalizeArguments(effect,options,speed,callback){// Allow passing all options as the first parameter\nif($.isPlainObject(effect)){options=effect;effect=effect.effect;}// Convert to an object\neffect={effect:effect};// Catch (effect, null, ...)\nif(options==null){options={};}// Catch (effect, callback)\nif(typeof options===\"function\"){callback=options;speed=null;options={};}// Catch (effect, speed, ?)\nif(typeof options===\"number\"||$.fx.speeds[options]){callback=speed;speed=options;options={};}// Catch (effect, options, callback)\nif(typeof speed===\"function\"){callback=speed;speed=null;}// Add options to effect\nif(options){$.extend(effect,options);}speed=speed||options.duration;effect.duration=$.fx.off?0:typeof speed===\"number\"?speed:speed in $.fx.speeds?$.fx.speeds[speed]:$.fx.speeds._default;effect.complete=callback||options.complete;return effect;}function standardAnimationOption(option){// Valid standard speeds (nothing, number, named speed)\nif(!option||typeof option===\"number\"||$.fx.speeds[option]){return true;}// Invalid strings - treat as \"normal\" speed\nif(typeof option===\"string\"&&!$.effects.effect[option]){return true;}// Complete callback\nif(typeof option===\"function\"){return true;}// Options hash (but not naming an effect)\nif(_typeof(option)===\"object\"&&!option.effect){return true;}// Didn't match any standard API\nreturn false;}$.fn.extend({effect:function/* effect, options, speed, callback */effect(){var args=_normalizeArguments.apply(this,arguments),effectMethod=$.effects.effect[args.effect],defaultMode=effectMethod.mode,queue=args.queue,queueName=queue||\"fx\",complete=args.complete,mode=args.mode,modes=[],prefilter=function prefilter(next){var el=$(this),normalizedMode=$.effects.mode(el,mode)||defaultMode;// Sentinel for duck-punching the :animated pseudo-selector\nel.data(dataSpaceAnimated,true);// Save effect mode for later use,\n// we can't just call $.effects.mode again later,\n// as the .show() below destroys the initial state\nmodes.push(normalizedMode);// See $.uiBackCompat inside of run() for removal of defaultMode in 1.14\nif(defaultMode&&(normalizedMode===\"show\"||normalizedMode===defaultMode&&normalizedMode===\"hide\")){el.show();}if(!defaultMode||normalizedMode!==\"none\"){$.effects.saveStyle(el);}if(typeof next===\"function\"){next();}};if($.fx.off||!effectMethod){// Delegate to the original method (e.g., .show()) if possible\nif(mode){return this[mode](args.duration,complete);}else{return this.each(function(){if(complete){complete.call(this);}});}}function run(next){var elem=$(this);function cleanup(){elem.removeData(dataSpaceAnimated);$.effects.cleanUp(elem);if(args.mode===\"hide\"){elem.hide();}done();}function done(){if(typeof complete===\"function\"){complete.call(elem[0]);}if(typeof next===\"function\"){next();}}// Override mode option on a per element basis,\n// as toggle can be either show or hide depending on element state\nargs.mode=modes.shift();if($.uiBackCompat!==false&&!defaultMode){if(elem.is(\":hidden\")?mode===\"hide\":mode===\"show\"){// Call the core method to track \"olddisplay\" properly\nelem[mode]();done();}else{effectMethod.call(elem[0],args,done);}}else{if(args.mode===\"none\"){// Call the core method to track \"olddisplay\" properly\nelem[mode]();done();}else{effectMethod.call(elem[0],args,cleanup);}}}// Run prefilter on all elements first to ensure that\n// any showing or hiding happens before placeholder creation,\n// which ensures that any layout changes are correctly captured.\nreturn queue===false?this.each(prefilter).each(run):this.queue(queueName,prefilter).queue(queueName,run);},show:function(orig){return function(option){if(standardAnimationOption(option)){return orig.apply(this,arguments);}else{var args=_normalizeArguments.apply(this,arguments);args.mode=\"show\";return this.effect.call(this,args);}};}($.fn.show),hide:function(orig){return function(option){if(standardAnimationOption(option)){return orig.apply(this,arguments);}else{var args=_normalizeArguments.apply(this,arguments);args.mode=\"hide\";return this.effect.call(this,args);}};}($.fn.hide),toggle:function(orig){return function(option){if(standardAnimationOption(option)||typeof option===\"boolean\"){return orig.apply(this,arguments);}else{var args=_normalizeArguments.apply(this,arguments);args.mode=\"toggle\";return this.effect.call(this,args);}};}($.fn.toggle),cssUnit:function cssUnit(key){var style=this.css(key),val=[];$.each([\"em\",\"px\",\"%\",\"pt\"],function(i,unit){if(style.indexOf(unit)>0){val=[parseFloat(style),unit];}});return val;},cssClip:function cssClip(clipObj){if(clipObj){return this.css(\"clip\",\"rect(\"+clipObj.top+\"px \"+clipObj.right+\"px \"+clipObj.bottom+\"px \"+clipObj.left+\"px)\");}return parseClip(this.css(\"clip\"),this);},transfer:function transfer(options,done){var element=$(this),target=$(options.to),targetFixed=target.css(\"position\")===\"fixed\",body=$(\"body\"),fixTop=targetFixed?body.scrollTop():0,fixLeft=targetFixed?body.scrollLeft():0,endPosition=target.offset(),animation={top:endPosition.top-fixTop,left:endPosition.left-fixLeft,height:target.innerHeight(),width:target.innerWidth()},startPosition=element.offset(),transfer=$(\"<div class='ui-effects-transfer'></div>\");transfer.appendTo(\"body\").addClass(options.className).css({top:startPosition.top-fixTop,left:startPosition.left-fixLeft,height:element.innerHeight(),width:element.innerWidth(),position:targetFixed?\"fixed\":\"absolute\"}).animate(animation,options.duration,options.easing,function(){transfer.remove();if(typeof done===\"function\"){done();}});}});function parseClip(str,element){var outerWidth=element.outerWidth(),outerHeight=element.outerHeight(),clipRegex=/^rect\\((-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto)\\)$/,values=clipRegex.exec(str)||[\"\",0,outerWidth,outerHeight,0];return{top:parseFloat(values[1])||0,right:values[2]===\"auto\"?outerWidth:parseFloat(values[2]),bottom:values[3]===\"auto\"?outerHeight:parseFloat(values[3]),left:parseFloat(values[4])||0};}$.fx.step.clip=function(fx){if(!fx.clipInit){fx.start=$(fx.elem).cssClip();if(typeof fx.end===\"string\"){fx.end=parseClip(fx.end,fx.elem);}fx.clipInit=true;}$(fx.elem).cssClip({top:fx.pos*(fx.end.top-fx.start.top)+fx.start.top,right:fx.pos*(fx.end.right-fx.start.right)+fx.start.right,bottom:fx.pos*(fx.end.bottom-fx.start.bottom)+fx.start.bottom,left:fx.pos*(fx.end.left-fx.start.left)+fx.start.left});};})();/******************************************************************************/ /*********************************** EASING ***********************************/ /******************************************************************************/(function(){// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\nvar baseEasings={};$.each([\"Quad\",\"Cubic\",\"Quart\",\"Quint\",\"Expo\"],function(i,name){baseEasings[name]=function(p){return Math.pow(p,i+2);};});$.extend(baseEasings,{Sine:function Sine(p){return 1-Math.cos(p*Math.PI/2);},Circ:function Circ(p){return 1-Math.sqrt(1-p*p);},Elastic:function Elastic(p){return p===0||p===1?p:-Math.pow(2,8*(p-1))*Math.sin(((p-1)*80-7.5)*Math.PI/15);},Back:function Back(p){return p*p*(3*p-2);},Bounce:function Bounce(p){var pow2,bounce=4;while(p<((pow2=Math.pow(2,--bounce))-1)/11){}return 1/Math.pow(4,3-bounce)-7.5625*Math.pow((pow2*3-2)/22-p,2);}});$.each(baseEasings,function(name,easeIn){$.easing[\"easeIn\"+name]=easeIn;$.easing[\"easeOut\"+name]=function(p){return 1-easeIn(1-p);};$.easing[\"easeInOut\"+name]=function(p){return p<0.5?easeIn(p*2)/2:1-easeIn(p*-2+2)/2;};});})();var effect=$.effects;/*!\n * jQuery UI Effects Blind 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Blind Effect\n//>>group: Effects\n//>>description: Blinds the element.\n//>>docs: http://api.jqueryui.com/blind-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectBlind=$.effects.define(\"blind\",\"hide\",function(options,done){var map={up:[\"bottom\",\"top\"],vertical:[\"bottom\",\"top\"],down:[\"top\",\"bottom\"],left:[\"right\",\"left\"],horizontal:[\"right\",\"left\"],right:[\"left\",\"right\"]},element=$(this),direction=options.direction||\"up\",start=element.cssClip(),animate={clip:$.extend({},start)},placeholder=$.effects.createPlaceholder(element);animate.clip[map[direction][0]]=animate.clip[map[direction][1]];if(options.mode===\"show\"){element.cssClip(animate.clip);if(placeholder){placeholder.css($.effects.clipToBox(animate));}animate.clip=start;}if(placeholder){placeholder.animate($.effects.clipToBox(animate),options.duration,options.easing);}element.animate(animate,{queue:false,duration:options.duration,easing:options.easing,complete:done});});/*!\n * jQuery UI Effects Bounce 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Bounce Effect\n//>>group: Effects\n//>>description: Bounces an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/bounce-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectBounce=$.effects.define(\"bounce\",function(options,done){var upAnim,downAnim,refValue,element=$(this),// Defaults:\nmode=options.mode,hide=mode===\"hide\",show=mode===\"show\",direction=options.direction||\"up\",distance=options.distance,times=options.times||5,// Number of internal animations\nanims=times*2+(show||hide?1:0),speed=options.duration/anims,easing=options.easing,// Utility:\nref=direction===\"up\"||direction===\"down\"?\"top\":\"left\",motion=direction===\"up\"||direction===\"left\",i=0,queuelen=element.queue().length;$.effects.createPlaceholder(element);refValue=element.css(ref);// Default distance for the BIGGEST bounce is the outer Distance / 3\nif(!distance){distance=element[ref===\"top\"?\"outerHeight\":\"outerWidth\"]()/3;}if(show){downAnim={opacity:1};downAnim[ref]=refValue;// If we are showing, force opacity 0 and set the initial position\n// then do the \"first\" animation\nelement.css(\"opacity\",0).css(ref,motion?-distance*2:distance*2).animate(downAnim,speed,easing);}// Start at the smallest distance if we are hiding\nif(hide){distance=distance/Math.pow(2,times-1);}downAnim={};downAnim[ref]=refValue;// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here\nfor(;i<times;i++){upAnim={};upAnim[ref]=(motion?\"-=\":\"+=\")+distance;element.animate(upAnim,speed,easing).animate(downAnim,speed,easing);distance=hide?distance*2:distance/2;}// Last Bounce when Hiding\nif(hide){upAnim={opacity:0};upAnim[ref]=(motion?\"-=\":\"+=\")+distance;element.animate(upAnim,speed,easing);}element.queue(done);$.effects.unshift(element,queuelen,anims+1);});/*!\n * jQuery UI Effects Clip 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Clip Effect\n//>>group: Effects\n//>>description: Clips the element on and off like an old TV.\n//>>docs: http://api.jqueryui.com/clip-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectClip=$.effects.define(\"clip\",\"hide\",function(options,done){var start,animate={},element=$(this),direction=options.direction||\"vertical\",both=direction===\"both\",horizontal=both||direction===\"horizontal\",vertical=both||direction===\"vertical\";start=element.cssClip();animate.clip={top:vertical?(start.bottom-start.top)/2:start.top,right:horizontal?(start.right-start.left)/2:start.right,bottom:vertical?(start.bottom-start.top)/2:start.bottom,left:horizontal?(start.right-start.left)/2:start.left};$.effects.createPlaceholder(element);if(options.mode===\"show\"){element.cssClip(animate.clip);animate.clip=start;}element.animate(animate,{queue:false,duration:options.duration,easing:options.easing,complete:done});});/*!\n * jQuery UI Effects Drop 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Drop Effect\n//>>group: Effects\n//>>description: Moves an element in one direction and hides it at the same time.\n//>>docs: http://api.jqueryui.com/drop-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectDrop=$.effects.define(\"drop\",\"hide\",function(options,done){var distance,element=$(this),mode=options.mode,show=mode===\"show\",direction=options.direction||\"left\",ref=direction===\"up\"||direction===\"down\"?\"top\":\"left\",motion=direction===\"up\"||direction===\"left\"?\"-=\":\"+=\",oppositeMotion=motion===\"+=\"?\"-=\":\"+=\",animation={opacity:0};$.effects.createPlaceholder(element);distance=options.distance||element[ref===\"top\"?\"outerHeight\":\"outerWidth\"](true)/2;animation[ref]=motion+distance;if(show){element.css(animation);animation[ref]=oppositeMotion+distance;animation.opacity=1;}// Animate\nelement.animate(animation,{queue:false,duration:options.duration,easing:options.easing,complete:done});});/*!\n * jQuery UI Effects Explode 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Explode Effect\n//>>group: Effects\n/* eslint-disable max-len */ //>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.\n/* eslint-enable max-len */ //>>docs: http://api.jqueryui.com/explode-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectExplode=$.effects.define(\"explode\",\"hide\",function(options,done){var i,j,left,top,mx,my,rows=options.pieces?Math.round(Math.sqrt(options.pieces)):3,cells=rows,element=$(this),mode=options.mode,show=mode===\"show\",// Show and then visibility:hidden the element before calculating offset\noffset=element.show().css(\"visibility\",\"hidden\").offset(),// Width and height of a piece\nwidth=Math.ceil(element.outerWidth()/cells),height=Math.ceil(element.outerHeight()/rows),pieces=[];// Children animate complete:\nfunction childComplete(){pieces.push(this);if(pieces.length===rows*cells){animComplete();}}// Clone the element for each row and cell.\nfor(i=0;i<rows;i++){// ===>\ntop=offset.top+i*height;my=i-(rows-1)/2;for(j=0;j<cells;j++){// |||\nleft=offset.left+j*width;mx=j-(cells-1)/2;// Create a clone of the now hidden main element that will be absolute positioned\n// within a wrapper div off the -left and -top equal to size of our pieces\nelement.clone().appendTo(\"body\").wrap(\"<div></div>\").css({position:\"absolute\",visibility:\"visible\",left:-j*width,top:-i*height})// Select the wrapper - make it overflow: hidden and absolute positioned based on\n// where the original was located +left and +top equal to the size of pieces\n.parent().addClass(\"ui-effects-explode\").css({position:\"absolute\",overflow:\"hidden\",width:width,height:height,left:left+(show?mx*width:0),top:top+(show?my*height:0),opacity:show?0:1}).animate({left:left+(show?0:mx*width),top:top+(show?0:my*height),opacity:show?1:0},options.duration||500,options.easing,childComplete);}}function animComplete(){element.css({visibility:\"visible\"});$(pieces).remove();done();}});/*!\n * jQuery UI Effects Fade 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Fade Effect\n//>>group: Effects\n//>>description: Fades the element.\n//>>docs: http://api.jqueryui.com/fade-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectFade=$.effects.define(\"fade\",\"toggle\",function(options,done){var show=options.mode===\"show\";$(this).css(\"opacity\",show?0:1).animate({opacity:show?1:0},{queue:false,duration:options.duration,easing:options.easing,complete:done});});/*!\n * jQuery UI Effects Fold 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Fold Effect\n//>>group: Effects\n//>>description: Folds an element first horizontally and then vertically.\n//>>docs: http://api.jqueryui.com/fold-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectFold=$.effects.define(\"fold\",\"hide\",function(options,done){// Create element\nvar element=$(this),mode=options.mode,show=mode===\"show\",hide=mode===\"hide\",size=options.size||15,percent=/([0-9]+)%/.exec(size),horizFirst=!!options.horizFirst,ref=horizFirst?[\"right\",\"bottom\"]:[\"bottom\",\"right\"],duration=options.duration/2,placeholder=$.effects.createPlaceholder(element),start=element.cssClip(),animation1={clip:$.extend({},start)},animation2={clip:$.extend({},start)},distance=[start[ref[0]],start[ref[1]]],queuelen=element.queue().length;if(percent){size=parseInt(percent[1],10)/100*distance[hide?0:1];}animation1.clip[ref[0]]=size;animation2.clip[ref[0]]=size;animation2.clip[ref[1]]=0;if(show){element.cssClip(animation2.clip);if(placeholder){placeholder.css($.effects.clipToBox(animation2));}animation2.clip=start;}// Animate\nelement.queue(function(next){if(placeholder){placeholder.animate($.effects.clipToBox(animation1),duration,options.easing).animate($.effects.clipToBox(animation2),duration,options.easing);}next();}).animate(animation1,duration,options.easing).animate(animation2,duration,options.easing).queue(done);$.effects.unshift(element,queuelen,4);});/*!\n * jQuery UI Effects Highlight 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Highlight Effect\n//>>group: Effects\n//>>description: Highlights the background of an element in a defined color for a custom duration.\n//>>docs: http://api.jqueryui.com/highlight-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectHighlight=$.effects.define(\"highlight\",\"show\",function(options,done){var element=$(this),animation={backgroundColor:element.css(\"backgroundColor\")};if(options.mode===\"hide\"){animation.opacity=0;}$.effects.saveStyle(element);element.css({backgroundImage:\"none\",backgroundColor:options.color||\"#ffff99\"}).animate(animation,{queue:false,duration:options.duration,easing:options.easing,complete:done});});/*!\n * jQuery UI Effects Size 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Size Effect\n//>>group: Effects\n//>>description: Resize an element to a specified width and height.\n//>>docs: http://api.jqueryui.com/size-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectSize=$.effects.define(\"size\",function(options,done){// Create element\nvar baseline,factor,temp,element=$(this),// Copy for children\ncProps=[\"fontSize\"],vProps=[\"borderTopWidth\",\"borderBottomWidth\",\"paddingTop\",\"paddingBottom\"],hProps=[\"borderLeftWidth\",\"borderRightWidth\",\"paddingLeft\",\"paddingRight\"],// Set options\nmode=options.mode,restore=mode!==\"effect\",scale=options.scale||\"both\",origin=options.origin||[\"middle\",\"center\"],position=element.css(\"position\"),pos=element.position(),original=$.effects.scaledDimensions(element),from=options.from||original,to=options.to||$.effects.scaledDimensions(element,0);$.effects.createPlaceholder(element);if(mode===\"show\"){temp=from;from=to;to=temp;}// Set scaling factor\nfactor={from:{y:from.height/original.height,x:from.width/original.width},to:{y:to.height/original.height,x:to.width/original.width}};// Scale the css box\nif(scale===\"box\"||scale===\"both\"){// Vertical props scaling\nif(factor.from.y!==factor.to.y){from=$.effects.setTransition(element,vProps,factor.from.y,from);to=$.effects.setTransition(element,vProps,factor.to.y,to);}// Horizontal props scaling\nif(factor.from.x!==factor.to.x){from=$.effects.setTransition(element,hProps,factor.from.x,from);to=$.effects.setTransition(element,hProps,factor.to.x,to);}}// Scale the content\nif(scale===\"content\"||scale===\"both\"){// Vertical props scaling\nif(factor.from.y!==factor.to.y){from=$.effects.setTransition(element,cProps,factor.from.y,from);to=$.effects.setTransition(element,cProps,factor.to.y,to);}}// Adjust the position properties based on the provided origin points\nif(origin){baseline=$.effects.getBaseline(origin,original);from.top=(original.outerHeight-from.outerHeight)*baseline.y+pos.top;from.left=(original.outerWidth-from.outerWidth)*baseline.x+pos.left;to.top=(original.outerHeight-to.outerHeight)*baseline.y+pos.top;to.left=(original.outerWidth-to.outerWidth)*baseline.x+pos.left;}delete from.outerHeight;delete from.outerWidth;element.css(from);// Animate the children if desired\nif(scale===\"content\"||scale===\"both\"){vProps=vProps.concat([\"marginTop\",\"marginBottom\"]).concat(cProps);hProps=hProps.concat([\"marginLeft\",\"marginRight\"]);// Only animate children with width attributes specified\n// TODO: is this right? should we include anything with css width specified as well\nelement.find(\"*[width]\").each(function(){var child=$(this),childOriginal=$.effects.scaledDimensions(child),childFrom={height:childOriginal.height*factor.from.y,width:childOriginal.width*factor.from.x,outerHeight:childOriginal.outerHeight*factor.from.y,outerWidth:childOriginal.outerWidth*factor.from.x},childTo={height:childOriginal.height*factor.to.y,width:childOriginal.width*factor.to.x,outerHeight:childOriginal.height*factor.to.y,outerWidth:childOriginal.width*factor.to.x};// Vertical props scaling\nif(factor.from.y!==factor.to.y){childFrom=$.effects.setTransition(child,vProps,factor.from.y,childFrom);childTo=$.effects.setTransition(child,vProps,factor.to.y,childTo);}// Horizontal props scaling\nif(factor.from.x!==factor.to.x){childFrom=$.effects.setTransition(child,hProps,factor.from.x,childFrom);childTo=$.effects.setTransition(child,hProps,factor.to.x,childTo);}if(restore){$.effects.saveStyle(child);}// Animate children\nchild.css(childFrom);child.animate(childTo,options.duration,options.easing,function(){// Restore children\nif(restore){$.effects.restoreStyle(child);}});});}// Animate\nelement.animate(to,{queue:false,duration:options.duration,easing:options.easing,complete:function complete(){var offset=element.offset();if(to.opacity===0){element.css(\"opacity\",from.opacity);}if(!restore){element.css(\"position\",position===\"static\"?\"relative\":position).offset(offset);// Need to save style here so that automatic style restoration\n// doesn't restore to the original styles from before the animation.\n$.effects.saveStyle(element);}done();}});});/*!\n * jQuery UI Effects Scale 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Scale Effect\n//>>group: Effects\n//>>description: Grows or shrinks an element and its content.\n//>>docs: http://api.jqueryui.com/scale-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectScale=$.effects.define(\"scale\",function(options,done){// Create element\nvar el=$(this),mode=options.mode,percent=parseInt(options.percent,10)||(parseInt(options.percent,10)===0?0:mode!==\"effect\"?0:100),newOptions=$.extend(true,{from:$.effects.scaledDimensions(el),to:$.effects.scaledDimensions(el,percent,options.direction||\"both\"),origin:options.origin||[\"middle\",\"center\"]},options);// Fade option to support puff\nif(options.fade){newOptions.from.opacity=1;newOptions.to.opacity=0;}$.effects.effect.size.call(this,newOptions,done);});/*!\n * jQuery UI Effects Puff 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Puff Effect\n//>>group: Effects\n//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.\n//>>docs: http://api.jqueryui.com/puff-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectPuff=$.effects.define(\"puff\",\"hide\",function(options,done){var newOptions=$.extend(true,{},options,{fade:true,percent:parseInt(options.percent,10)||150});$.effects.effect.scale.call(this,newOptions,done);});/*!\n * jQuery UI Effects Pulsate 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Pulsate Effect\n//>>group: Effects\n//>>description: Pulsates an element n times by changing the opacity to zero and back.\n//>>docs: http://api.jqueryui.com/pulsate-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectPulsate=$.effects.define(\"pulsate\",\"show\",function(options,done){var element=$(this),mode=options.mode,show=mode===\"show\",hide=mode===\"hide\",showhide=show||hide,// Showing or hiding leaves off the \"last\" animation\nanims=(options.times||5)*2+(showhide?1:0),duration=options.duration/anims,animateTo=0,i=1,queuelen=element.queue().length;if(show||!element.is(\":visible\")){element.css(\"opacity\",0).show();animateTo=1;}// Anims - 1 opacity \"toggles\"\nfor(;i<anims;i++){element.animate({opacity:animateTo},duration,options.easing);animateTo=1-animateTo;}element.animate({opacity:animateTo},duration,options.easing);element.queue(done);$.effects.unshift(element,queuelen,anims+1);});/*!\n * jQuery UI Effects Shake 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Shake Effect\n//>>group: Effects\n//>>description: Shakes an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/shake-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectShake=$.effects.define(\"shake\",function(options,done){var i=1,element=$(this),direction=options.direction||\"left\",distance=options.distance||20,times=options.times||3,anims=times*2+1,speed=Math.round(options.duration/anims),ref=direction===\"up\"||direction===\"down\"?\"top\":\"left\",positiveMotion=direction===\"up\"||direction===\"left\",animation={},animation1={},animation2={},queuelen=element.queue().length;$.effects.createPlaceholder(element);// Animation\nanimation[ref]=(positiveMotion?\"-=\":\"+=\")+distance;animation1[ref]=(positiveMotion?\"+=\":\"-=\")+distance*2;animation2[ref]=(positiveMotion?\"-=\":\"+=\")+distance*2;// Animate\nelement.animate(animation,speed,options.easing);// Shakes\nfor(;i<times;i++){element.animate(animation1,speed,options.easing).animate(animation2,speed,options.easing);}element.animate(animation1,speed,options.easing).animate(animation,speed/2,options.easing).queue(done);$.effects.unshift(element,queuelen,anims+1);});/*!\n * jQuery UI Effects Slide 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Slide Effect\n//>>group: Effects\n//>>description: Slides an element in and out of the viewport.\n//>>docs: http://api.jqueryui.com/slide-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effectsEffectSlide=$.effects.define(\"slide\",\"show\",function(options,done){var startClip,startRef,element=$(this),map={up:[\"bottom\",\"top\"],down:[\"top\",\"bottom\"],left:[\"right\",\"left\"],right:[\"left\",\"right\"]},mode=options.mode,direction=options.direction||\"left\",ref=direction===\"up\"||direction===\"down\"?\"top\":\"left\",positiveMotion=direction===\"up\"||direction===\"left\",distance=options.distance||element[ref===\"top\"?\"outerHeight\":\"outerWidth\"](true),animation={};$.effects.createPlaceholder(element);startClip=element.cssClip();startRef=element.position()[ref];// Define hide animation\nanimation[ref]=(positiveMotion?-1:1)*distance+startRef;animation.clip=element.cssClip();animation.clip[map[direction][1]]=animation.clip[map[direction][0]];// Reverse the animation if we're showing\nif(mode===\"show\"){element.cssClip(animation.clip);element.css(ref,animation[ref]);animation.clip=startClip;animation[ref]=startRef;}// Actually animate\nelement.animate(animation,{queue:false,duration:options.duration,easing:options.easing,complete:done});});/*!\n * jQuery UI Effects Transfer 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Transfer Effect\n//>>group: Effects\n//>>description: Displays a transfer effect from one element to another.\n//>>docs: http://api.jqueryui.com/transfer-effect/\n//>>demos: http://jqueryui.com/effect/\nvar effect;if($.uiBackCompat!==false){effect=$.effects.define(\"transfer\",function(options,done){$(this).transfer(options,done);});}var effectsEffectTransfer=effect;/*!\n * jQuery UI Focusable 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: :focusable Selector\n//>>group: Core\n//>>description: Selects elements which can be focused.\n//>>docs: http://api.jqueryui.com/focusable-selector/\n// Selectors\n$.ui.focusable=function(element,hasTabindex){var map,mapName,img,focusableIfVisible,fieldset,nodeName=element.nodeName.toLowerCase();if(\"area\"===nodeName){map=element.parentNode;mapName=map.name;if(!element.href||!mapName||map.nodeName.toLowerCase()!==\"map\"){return false;}img=$(\"img[usemap='#\"+mapName+\"']\");return img.length>0&&img.is(\":visible\");}if(/^(input|select|textarea|button|object)$/.test(nodeName)){focusableIfVisible=!element.disabled;if(focusableIfVisible){// Form controls within a disabled fieldset are disabled.\n// However, controls within the fieldset's legend do not get disabled.\n// Since controls generally aren't placed inside legends, we skip\n// this portion of the check.\nfieldset=$(element).closest(\"fieldset\")[0];if(fieldset){focusableIfVisible=!fieldset.disabled;}}}else if(\"a\"===nodeName){focusableIfVisible=element.href||hasTabindex;}else{focusableIfVisible=hasTabindex;}return focusableIfVisible&&$(element).is(\":visible\")&&visible($(element));};// Support: IE 8 only\n// IE 8 doesn't resolve inherit to visible/hidden for computed values\nfunction visible(element){var visibility=element.css(\"visibility\");while(visibility===\"inherit\"){element=element.parent();visibility=element.css(\"visibility\");}return visibility===\"visible\";}$.extend($.expr.pseudos,{focusable:function focusable(element){return $.ui.focusable(element,$.attr(element,\"tabindex\")!=null);}});var focusable=$.ui.focusable;// Support: IE8 Only\n// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop\n// with a string, so we need to find the proper form.\nvar form=$.fn._form=function(){return typeof this[0].form===\"string\"?this.closest(\"form\"):$(this[0].form);};/*!\n * jQuery UI Form Reset Mixin 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Form Reset Mixin\n//>>group: Core\n//>>description: Refresh input widgets when their form is reset\n//>>docs: http://api.jqueryui.com/form-reset-mixin/\nvar formResetMixin=$.ui.formResetMixin={_formResetHandler:function _formResetHandler(){var form=$(this);// Wait for the form reset to actually happen before refreshing\nsetTimeout(function(){var instances=form.data(\"ui-form-reset-instances\");$.each(instances,function(){this.refresh();});});},_bindFormResetHandler:function _bindFormResetHandler(){this.form=this.element._form();if(!this.form.length){return;}var instances=this.form.data(\"ui-form-reset-instances\")||[];if(!instances.length){// We don't use _on() here because we use a single event handler per form\nthis.form.on(\"reset.ui-form-reset\",this._formResetHandler);}instances.push(this);this.form.data(\"ui-form-reset-instances\",instances);},_unbindFormResetHandler:function _unbindFormResetHandler(){if(!this.form.length){return;}var instances=this.form.data(\"ui-form-reset-instances\");instances.splice($.inArray(this,instances),1);if(instances.length){this.form.data(\"ui-form-reset-instances\",instances);}else{this.form.removeData(\"ui-form-reset-instances\").off(\"reset.ui-form-reset\");}}};/*!\n * jQuery UI Support for jQuery core 1.8.x and newer 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n */ //>>label: jQuery 1.8+ Support\n//>>group: Core\n//>>description: Support version 1.8.x and newer of jQuery core\n// Support: jQuery 1.9.x or older\n// $.expr[ \":\" ] is deprecated.\nif(!$.expr.pseudos){$.expr.pseudos=$.expr[\":\"];}// Support: jQuery 1.11.x or older\n// $.unique has been renamed to $.uniqueSort\nif(!$.uniqueSort){$.uniqueSort=$.unique;}// Support: jQuery 2.2.x or older.\n// This method has been defined in jQuery 3.0.0.\n// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js\nif(!$.escapeSelector){// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;var fcssescape=function fcssescape(ch,asCodePoint){if(asCodePoint){// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\nif(ch===\"\\0\"){return\"\\uFFFD\";}// Control characters and (dependent upon position) numbers get escaped as code points\nreturn ch.slice(0,-1)+\"\\\\\"+ch.charCodeAt(ch.length-1).toString(16)+\" \";}// Other potentially-special ASCII characters get backslash-escaped\nreturn\"\\\\\"+ch;};$.escapeSelector=function(sel){return(sel+\"\").replace(rcssescape,fcssescape);};}// Support: jQuery 3.4.x or older\n// These methods have been defined in jQuery 3.5.0.\nif(!$.fn.even||!$.fn.odd){$.fn.extend({even:function even(){return this.filter(function(i){return i%2===0;});},odd:function odd(){return this.filter(function(i){return i%2===1;});}});};/*!\n * jQuery UI Keycode 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Keycode\n//>>group: Core\n//>>description: Provide keycodes as keynames\n//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/\nvar keycode=$.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38};/*!\n * jQuery UI Labels 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: labels\n//>>group: Core\n//>>description: Find all the labels associated with a given input\n//>>docs: http://api.jqueryui.com/labels/\nvar labels=$.fn.labels=function(){var ancestor,selector,id,labels,ancestors;if(!this.length){return this.pushStack([]);}// Check control.labels first\nif(this[0].labels&&this[0].labels.length){return this.pushStack(this[0].labels);}// Support: IE <= 11, FF <= 37, Android <= 2.3 only\n// Above browsers do not support control.labels. Everything below is to support them\n// as well as document fragments. control.labels does not work on document fragments\nlabels=this.eq(0).parents(\"label\");// Look for the label based on the id\nid=this.attr(\"id\");if(id){// We don't search against the document in case the element\n// is disconnected from the DOM\nancestor=this.eq(0).parents().last();// Get a full set of top level ancestors\nancestors=ancestor.add(ancestor.length?ancestor.siblings():this.siblings());// Create a selector for the label based on the id\nselector=\"label[for='\"+$.escapeSelector(id)+\"']\";labels=labels.add(ancestors.find(selector).addBack(selector));}// Return whatever we have found for labels\nreturn this.pushStack(labels);};/*!\n * jQuery UI Scroll Parent 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: http://api.jqueryui.com/scrollParent/\nvar scrollParent=$.fn.scrollParent=function(includeHidden){var position=this.css(\"position\"),excludeStaticParent=position===\"absolute\",overflowRegex=includeHidden?/(auto|scroll|hidden)/:/(auto|scroll)/,scrollParent=this.parents().filter(function(){var parent=$(this);if(excludeStaticParent&&parent.css(\"position\")===\"static\"){return false;}return overflowRegex.test(parent.css(\"overflow\")+parent.css(\"overflow-y\")+parent.css(\"overflow-x\"));}).eq(0);return position===\"fixed\"||!scrollParent.length?$(this[0].ownerDocument||document):scrollParent;};/*!\n * jQuery UI Tabbable 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: :tabbable Selector\n//>>group: Core\n//>>description: Selects elements which can be tabbed to.\n//>>docs: http://api.jqueryui.com/tabbable-selector/\nvar tabbable=$.extend($.expr.pseudos,{tabbable:function tabbable(element){var tabIndex=$.attr(element,\"tabindex\"),hasTabindex=tabIndex!=null;return(!hasTabindex||tabIndex>=0)&&$.ui.focusable(element,hasTabindex);}});/*!\n * jQuery UI Unique ID 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: uniqueId\n//>>group: Core\n//>>description: Functions to generate and remove uniqueId's\n//>>docs: http://api.jqueryui.com/uniqueId/\nvar uniqueId=$.fn.extend({uniqueId:function(){var uuid=0;return function(){return this.each(function(){if(!this.id){this.id=\"ui-id-\"+ ++uuid;}});};}(),removeUniqueId:function removeUniqueId(){return this.each(function(){if(/^ui-id-\\d+$/.test(this.id)){$(this).removeAttr(\"id\");}});}});/*!\n * jQuery UI Accordion 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Accordion\n//>>group: Widgets\n/* eslint-disable max-len */ //>>description: Displays collapsible content panels for presenting information in a limited amount of space.\n/* eslint-enable max-len */ //>>docs: http://api.jqueryui.com/accordion/\n//>>demos: http://jqueryui.com/accordion/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/accordion.css\n//>>css.theme: ../../themes/base/theme.css\nvar widgetsAccordion=$.widget(\"ui.accordion\",{version:\"1.13.2\",options:{active:0,animate:{},classes:{\"ui-accordion-header\":\"ui-corner-top\",\"ui-accordion-header-collapsed\":\"ui-corner-all\",\"ui-accordion-content\":\"ui-corner-bottom\"},collapsible:false,event:\"click\",header:function header(elem){return elem.find(\"> li > :first-child\").add(elem.find(\"> :not(li)\").even());},heightStyle:\"auto\",icons:{activeHeader:\"ui-icon-triangle-1-s\",header:\"ui-icon-triangle-1-e\"},// Callbacks\nactivate:null,beforeActivate:null},hideProps:{borderTopWidth:\"hide\",borderBottomWidth:\"hide\",paddingTop:\"hide\",paddingBottom:\"hide\",height:\"hide\"},showProps:{borderTopWidth:\"show\",borderBottomWidth:\"show\",paddingTop:\"show\",paddingBottom:\"show\",height:\"show\"},_create:function _create(){var options=this.options;this.prevShow=this.prevHide=$();this._addClass(\"ui-accordion\",\"ui-widget ui-helper-reset\");this.element.attr(\"role\",\"tablist\");// Don't allow collapsible: false and active: false / null\nif(!options.collapsible&&(options.active===false||options.active==null)){options.active=0;}this._processPanels();// handle negative values\nif(options.active<0){options.active+=this.headers.length;}this._refresh();},_getCreateEventData:function _getCreateEventData(){return{header:this.active,panel:!this.active.length?$():this.active.next()};},_createIcons:function _createIcons(){var icon,children,icons=this.options.icons;if(icons){icon=$(\"<span>\");this._addClass(icon,\"ui-accordion-header-icon\",\"ui-icon \"+icons.header);icon.prependTo(this.headers);children=this.active.children(\".ui-accordion-header-icon\");this._removeClass(children,icons.header)._addClass(children,null,icons.activeHeader)._addClass(this.headers,\"ui-accordion-icons\");}},_destroyIcons:function _destroyIcons(){this._removeClass(this.headers,\"ui-accordion-icons\");this.headers.children(\".ui-accordion-header-icon\").remove();},_destroy:function _destroy(){var contents;// Clean up main element\nthis.element.removeAttr(\"role\");// Clean up headers\nthis.headers.removeAttr(\"role aria-expanded aria-selected aria-controls tabIndex\").removeUniqueId();this._destroyIcons();// Clean up content panels\ncontents=this.headers.next().css(\"display\",\"\").removeAttr(\"role aria-hidden aria-labelledby\").removeUniqueId();if(this.options.heightStyle!==\"content\"){contents.css(\"height\",\"\");}},_setOption:function _setOption(key,value){if(key===\"active\"){// _activate() will handle invalid values and update this.options\nthis._activate(value);return;}if(key===\"event\"){if(this.options.event){this._off(this.headers,this.options.event);}this._setupEvents(value);}this._super(key,value);// Setting collapsible: false while collapsed; open first panel\nif(key===\"collapsible\"&&!value&&this.options.active===false){this._activate(0);}if(key===\"icons\"){this._destroyIcons();if(value){this._createIcons();}}},_setOptionDisabled:function _setOptionDisabled(value){this._super(value);this.element.attr(\"aria-disabled\",value);// Support: IE8 Only\n// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE\n// so we need to add the disabled class to the headers and panels\nthis._toggleClass(null,\"ui-state-disabled\",!!value);this._toggleClass(this.headers.add(this.headers.next()),null,\"ui-state-disabled\",!!value);},_keydown:function _keydown(event){if(event.altKey||event.ctrlKey){return;}var keyCode=$.ui.keyCode,length=this.headers.length,currentIndex=this.headers.index(event.target),toFocus=false;switch(event.keyCode){case keyCode.RIGHT:case keyCode.DOWN:toFocus=this.headers[(currentIndex+1)%length];break;case keyCode.LEFT:case keyCode.UP:toFocus=this.headers[(currentIndex-1+length)%length];break;case keyCode.SPACE:case keyCode.ENTER:this._eventHandler(event);break;case keyCode.HOME:toFocus=this.headers[0];break;case keyCode.END:toFocus=this.headers[length-1];break;}if(toFocus){$(event.target).attr(\"tabIndex\",-1);$(toFocus).attr(\"tabIndex\",0);$(toFocus).trigger(\"focus\");event.preventDefault();}},_panelKeyDown:function _panelKeyDown(event){if(event.keyCode===$.ui.keyCode.UP&&event.ctrlKey){$(event.currentTarget).prev().trigger(\"focus\");}},refresh:function refresh(){var options=this.options;this._processPanels();// Was collapsed or no panel\nif(options.active===false&&options.collapsible===true||!this.headers.length){options.active=false;this.active=$();// active false only when collapsible is true\n}else if(options.active===false){this._activate(0);// was active, but active panel is gone\n}else if(this.active.length&&!$.contains(this.element[0],this.active[0])){// all remaining panel are disabled\nif(this.headers.length===this.headers.find(\".ui-state-disabled\").length){options.active=false;this.active=$();// activate previous panel\n}else{this._activate(Math.max(0,options.active-1));}// was active, active panel still exists\n}else{// make sure active index is correct\noptions.active=this.headers.index(this.active);}this._destroyIcons();this._refresh();},_processPanels:function _processPanels(){var prevHeaders=this.headers,prevPanels=this.panels;if(typeof this.options.header===\"function\"){this.headers=this.options.header(this.element);}else{this.headers=this.element.find(this.options.header);}this._addClass(this.headers,\"ui-accordion-header ui-accordion-header-collapsed\",\"ui-state-default\");this.panels=this.headers.next().filter(\":not(.ui-accordion-content-active)\").hide();this._addClass(this.panels,\"ui-accordion-content\",\"ui-helper-reset ui-widget-content\");// Avoid memory leaks (#10056)\nif(prevPanels){this._off(prevHeaders.not(this.headers));this._off(prevPanels.not(this.panels));}},_refresh:function _refresh(){var maxHeight,options=this.options,heightStyle=options.heightStyle,parent=this.element.parent();this.active=this._findActive(options.active);this._addClass(this.active,\"ui-accordion-header-active\",\"ui-state-active\")._removeClass(this.active,\"ui-accordion-header-collapsed\");this._addClass(this.active.next(),\"ui-accordion-content-active\");this.active.next().show();this.headers.attr(\"role\",\"tab\").each(function(){var header=$(this),headerId=header.uniqueId().attr(\"id\"),panel=header.next(),panelId=panel.uniqueId().attr(\"id\");header.attr(\"aria-controls\",panelId);panel.attr(\"aria-labelledby\",headerId);}).next().attr(\"role\",\"tabpanel\");this.headers.not(this.active).attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\",tabIndex:-1}).next().attr({\"aria-hidden\":\"true\"}).hide();// Make sure at least one header is in the tab order\nif(!this.active.length){this.headers.eq(0).attr(\"tabIndex\",0);}else{this.active.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0}).next().attr({\"aria-hidden\":\"false\"});}this._createIcons();this._setupEvents(options.event);if(heightStyle===\"fill\"){maxHeight=parent.height();this.element.siblings(\":visible\").each(function(){var elem=$(this),position=elem.css(\"position\");if(position===\"absolute\"||position===\"fixed\"){return;}maxHeight-=elem.outerHeight(true);});this.headers.each(function(){maxHeight-=$(this).outerHeight(true);});this.headers.next().each(function(){$(this).height(Math.max(0,maxHeight-$(this).innerHeight()+$(this).height()));}).css(\"overflow\",\"auto\");}else if(heightStyle===\"auto\"){maxHeight=0;this.headers.next().each(function(){var isVisible=$(this).is(\":visible\");if(!isVisible){$(this).show();}maxHeight=Math.max(maxHeight,$(this).css(\"height\",\"\").height());if(!isVisible){$(this).hide();}}).height(maxHeight);}},_activate:function _activate(index){var active=this._findActive(index)[0];// Trying to activate the already active panel\nif(active===this.active[0]){return;}// Trying to collapse, simulate a click on the currently active header\nactive=active||this.active[0];this._eventHandler({target:active,currentTarget:active,preventDefault:$.noop});},_findActive:function _findActive(selector){return typeof selector===\"number\"?this.headers.eq(selector):$();},_setupEvents:function _setupEvents(event){var events={keydown:\"_keydown\"};if(event){$.each(event.split(\" \"),function(index,eventName){events[eventName]=\"_eventHandler\";});}this._off(this.headers.add(this.headers.next()));this._on(this.headers,events);this._on(this.headers.next(),{keydown:\"_panelKeyDown\"});this._hoverable(this.headers);this._focusable(this.headers);},_eventHandler:function _eventHandler(event){var activeChildren,clickedChildren,options=this.options,active=this.active,clicked=$(event.currentTarget),clickedIsActive=clicked[0]===active[0],collapsing=clickedIsActive&&options.collapsible,toShow=collapsing?$():clicked.next(),toHide=active.next(),eventData={oldHeader:active,oldPanel:toHide,newHeader:collapsing?$():clicked,newPanel:toShow};event.preventDefault();if(// click on active header, but not collapsible\nclickedIsActive&&!options.collapsible||// allow canceling activation\nthis._trigger(\"beforeActivate\",event,eventData)===false){return;}options.active=collapsing?false:this.headers.index(clicked);// When the call to ._toggle() comes after the class changes\n// it causes a very odd bug in IE 8 (see #6720)\nthis.active=clickedIsActive?$():clicked;this._toggle(eventData);// Switch classes\n// corner classes on the previously active header stay after the animation\nthis._removeClass(active,\"ui-accordion-header-active\",\"ui-state-active\");if(options.icons){activeChildren=active.children(\".ui-accordion-header-icon\");this._removeClass(activeChildren,null,options.icons.activeHeader)._addClass(activeChildren,null,options.icons.header);}if(!clickedIsActive){this._removeClass(clicked,\"ui-accordion-header-collapsed\")._addClass(clicked,\"ui-accordion-header-active\",\"ui-state-active\");if(options.icons){clickedChildren=clicked.children(\".ui-accordion-header-icon\");this._removeClass(clickedChildren,null,options.icons.header)._addClass(clickedChildren,null,options.icons.activeHeader);}this._addClass(clicked.next(),\"ui-accordion-content-active\");}},_toggle:function _toggle(data){var toShow=data.newPanel,toHide=this.prevShow.length?this.prevShow:data.oldPanel;// Handle activating a panel during the animation for another activation\nthis.prevShow.add(this.prevHide).stop(true,true);this.prevShow=toShow;this.prevHide=toHide;if(this.options.animate){this._animate(toShow,toHide,data);}else{toHide.hide();toShow.show();this._toggleComplete(data);}toHide.attr({\"aria-hidden\":\"true\"});toHide.prev().attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\"});// if we're switching panels, remove the old header from the tab order\n// if we're opening from collapsed state, remove the previous header from the tab order\n// if we're collapsing, then keep the collapsing header in the tab order\nif(toShow.length&&toHide.length){toHide.prev().attr({\"tabIndex\":-1,\"aria-expanded\":\"false\"});}else if(toShow.length){this.headers.filter(function(){return parseInt($(this).attr(\"tabIndex\"),10)===0;}).attr(\"tabIndex\",-1);}toShow.attr(\"aria-hidden\",\"false\").prev().attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0});},_animate:function _animate(toShow,toHide,data){var total,easing,duration,that=this,adjust=0,boxSizing=toShow.css(\"box-sizing\"),down=toShow.length&&(!toHide.length||toShow.index()<toHide.index()),animate=this.options.animate||{},options=down&&animate.down||animate,complete=function complete(){that._toggleComplete(data);};if(typeof options===\"number\"){duration=options;}if(typeof options===\"string\"){easing=options;}// fall back from options to animation in case of partial down settings\neasing=easing||options.easing||animate.easing;duration=duration||options.duration||animate.duration;if(!toHide.length){return toShow.animate(this.showProps,duration,easing,complete);}if(!toShow.length){return toHide.animate(this.hideProps,duration,easing,complete);}total=toShow.show().outerHeight();toHide.animate(this.hideProps,{duration:duration,easing:easing,step:function step(now,fx){fx.now=Math.round(now);}});toShow.hide().animate(this.showProps,{duration:duration,easing:easing,complete:complete,step:function step(now,fx){fx.now=Math.round(now);if(fx.prop!==\"height\"){if(boxSizing===\"content-box\"){adjust+=fx.now;}}else if(that.options.heightStyle!==\"content\"){fx.now=Math.round(total-toHide.outerHeight()-adjust);adjust=0;}}});},_toggleComplete:function _toggleComplete(data){var toHide=data.oldPanel,prev=toHide.prev();this._removeClass(toHide,\"ui-accordion-content-active\");this._removeClass(prev,\"ui-accordion-header-active\")._addClass(prev,\"ui-accordion-header-collapsed\");// Work around for rendering bug in IE (#5421)\nif(toHide.length){toHide.parent()[0].className=toHide.parent()[0].className;}this._trigger(\"activate\",null,data);}});var safeActiveElement=$.ui.safeActiveElement=function(document){var activeElement;// Support: IE 9 only\n// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\ntry{activeElement=document.activeElement;}catch(error){activeElement=document.body;}// Support: IE 9 - 11 only\n// IE may return null instead of an element\n// Interestingly, this only seems to occur when NOT in an iframe\nif(!activeElement){activeElement=document.body;}// Support: IE 11 only\n// IE11 returns a seemingly empty object in some cases when accessing\n// document.activeElement from an <iframe>\nif(!activeElement.nodeName){activeElement=document.body;}return activeElement;};/*!\n * jQuery UI Menu 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Menu\n//>>group: Widgets\n//>>description: Creates nestable menus.\n//>>docs: http://api.jqueryui.com/menu/\n//>>demos: http://jqueryui.com/menu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/menu.css\n//>>css.theme: ../../themes/base/theme.css\nvar widgetsMenu=$.widget(\"ui.menu\",{version:\"1.13.2\",defaultElement:\"<ul>\",delay:300,options:{icons:{submenu:\"ui-icon-caret-1-e\"},items:\"> *\",menus:\"ul\",position:{my:\"left top\",at:\"right top\"},role:\"menu\",// Callbacks\nblur:null,focus:null,select:null},_create:function _create(){this.activeMenu=this.element;// Flag used to prevent firing of the click handler\n// as the event bubbles up through nested menus\nthis.mouseHandled=false;this.lastMousePosition={x:null,y:null};this.element.uniqueId().attr({role:this.options.role,tabIndex:0});this._addClass(\"ui-menu\",\"ui-widget ui-widget-content\");this._on({// Prevent focus from sticking to links inside menu after clicking\n// them (focus should always stay on UL during navigation).\n\"mousedown .ui-menu-item\":function mousedownUiMenuItem(event){event.preventDefault();this._activateItem(event);},\"click .ui-menu-item\":function clickUiMenuItem(event){var target=$(event.target);var active=$($.ui.safeActiveElement(this.document[0]));if(!this.mouseHandled&&target.not(\".ui-state-disabled\").length){this.select(event);// Only set the mouseHandled flag if the event will bubble, see #9469.\nif(!event.isPropagationStopped()){this.mouseHandled=true;}// Open submenu on click\nif(target.has(\".ui-menu\").length){this.expand(event);}else if(!this.element.is(\":focus\")&&active.closest(\".ui-menu\").length){// Redirect focus to the menu\nthis.element.trigger(\"focus\",[true]);// If the active item is on the top level, let it stay active.\n// Otherwise, blur the active item since it is no longer visible.\nif(this.active&&this.active.parents(\".ui-menu\").length===1){clearTimeout(this.timer);}}}},\"mouseenter .ui-menu-item\":\"_activateItem\",\"mousemove .ui-menu-item\":\"_activateItem\",mouseleave:\"collapseAll\",\"mouseleave .ui-menu\":\"collapseAll\",focus:function focus(event,keepActiveItem){// If there's already an active item, keep it active\n// If not, activate the first item\nvar item=this.active||this._menuItems().first();if(!keepActiveItem){this.focus(event,item);}},blur:function blur(event){this._delay(function(){var notContained=!$.contains(this.element[0],$.ui.safeActiveElement(this.document[0]));if(notContained){this.collapseAll(event);}});},keydown:\"_keydown\"});this.refresh();// Clicks outside of a menu collapse any open menus\nthis._on(this.document,{click:function click(event){if(this._closeOnDocumentClick(event)){this.collapseAll(event,true);}// Reset the mouseHandled flag\nthis.mouseHandled=false;}});},_activateItem:function _activateItem(event){// Ignore mouse events while typeahead is active, see #10458.\n// Prevents focusing the wrong item when typeahead causes a scroll while the mouse\n// is over an item in the menu\nif(this.previousFilter){return;}// If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)\nif(event.clientX===this.lastMousePosition.x&&event.clientY===this.lastMousePosition.y){return;}this.lastMousePosition={x:event.clientX,y:event.clientY};var actualTarget=$(event.target).closest(\".ui-menu-item\"),target=$(event.currentTarget);// Ignore bubbled events on parent items, see #11641\nif(actualTarget[0]!==target[0]){return;}// If the item is already active, there's nothing to do\nif(target.is(\".ui-state-active\")){return;}// Remove ui-state-active class from siblings of the newly focused menu item\n// to avoid a jump caused by adjacent elements both having a class with a border\nthis._removeClass(target.siblings().children(\".ui-state-active\"),null,\"ui-state-active\");this.focus(event,target);},_destroy:function _destroy(){var items=this.element.find(\".ui-menu-item\").removeAttr(\"role aria-disabled\"),submenus=items.children(\".ui-menu-item-wrapper\").removeUniqueId().removeAttr(\"tabIndex role aria-haspopup\");// Destroy (sub)menus\nthis.element.removeAttr(\"aria-activedescendant\").find(\".ui-menu\").addBack().removeAttr(\"role aria-labelledby aria-expanded aria-hidden aria-disabled \"+\"tabIndex\").removeUniqueId().show();submenus.children().each(function(){var elem=$(this);if(elem.data(\"ui-menu-submenu-caret\")){elem.remove();}});},_keydown:function _keydown(event){var match,prev,character,skip,preventDefault=true;switch(event.keyCode){case $.ui.keyCode.PAGE_UP:this.previousPage(event);break;case $.ui.keyCode.PAGE_DOWN:this.nextPage(event);break;case $.ui.keyCode.HOME:this._move(\"first\",\"first\",event);break;case $.ui.keyCode.END:this._move(\"last\",\"last\",event);break;case $.ui.keyCode.UP:this.previous(event);break;case $.ui.keyCode.DOWN:this.next(event);break;case $.ui.keyCode.LEFT:this.collapse(event);break;case $.ui.keyCode.RIGHT:if(this.active&&!this.active.is(\".ui-state-disabled\")){this.expand(event);}break;case $.ui.keyCode.ENTER:case $.ui.keyCode.SPACE:this._activate(event);break;case $.ui.keyCode.ESCAPE:this.collapse(event);break;default:preventDefault=false;prev=this.previousFilter||\"\";skip=false;// Support number pad values\ncharacter=event.keyCode>=96&&event.keyCode<=105?(event.keyCode-96).toString():String.fromCharCode(event.keyCode);clearTimeout(this.filterTimer);if(character===prev){skip=true;}else{character=prev+character;}match=this._filterMenuItems(character);match=skip&&match.index(this.active.next())!==-1?this.active.nextAll(\".ui-menu-item\"):match;// If no matches on the current filter, reset to the last character pressed\n// to move down the menu to the first item that starts with that character\nif(!match.length){character=String.fromCharCode(event.keyCode);match=this._filterMenuItems(character);}if(match.length){this.focus(event,match);this.previousFilter=character;this.filterTimer=this._delay(function(){delete this.previousFilter;},1000);}else{delete this.previousFilter;}}if(preventDefault){event.preventDefault();}},_activate:function _activate(event){if(this.active&&!this.active.is(\".ui-state-disabled\")){if(this.active.children(\"[aria-haspopup='true']\").length){this.expand(event);}else{this.select(event);}}},refresh:function refresh(){var menus,items,newSubmenus,newItems,newWrappers,that=this,icon=this.options.icons.submenu,submenus=this.element.find(this.options.menus);this._toggleClass(\"ui-menu-icons\",null,!!this.element.find(\".ui-icon\").length);// Initialize nested menus\nnewSubmenus=submenus.filter(\":not(.ui-menu)\").hide().attr({role:this.options.role,\"aria-hidden\":\"true\",\"aria-expanded\":\"false\"}).each(function(){var menu=$(this),item=menu.prev(),submenuCaret=$(\"<span>\").data(\"ui-menu-submenu-caret\",true);that._addClass(submenuCaret,\"ui-menu-icon\",\"ui-icon \"+icon);item.attr(\"aria-haspopup\",\"true\").prepend(submenuCaret);menu.attr(\"aria-labelledby\",item.attr(\"id\"));});this._addClass(newSubmenus,\"ui-menu\",\"ui-widget ui-widget-content ui-front\");menus=submenus.add(this.element);items=menus.find(this.options.items);// Initialize menu-items containing spaces and/or dashes only as dividers\nitems.not(\".ui-menu-item\").each(function(){var item=$(this);if(that._isDivider(item)){that._addClass(item,\"ui-menu-divider\",\"ui-widget-content\");}});// Don't refresh list items that are already adapted\nnewItems=items.not(\".ui-menu-item, .ui-menu-divider\");newWrappers=newItems.children().not(\".ui-menu\").uniqueId().attr({tabIndex:-1,role:this._itemRole()});this._addClass(newItems,\"ui-menu-item\")._addClass(newWrappers,\"ui-menu-item-wrapper\");// Add aria-disabled attribute to any disabled menu item\nitems.filter(\".ui-state-disabled\").attr(\"aria-disabled\",\"true\");// If the active item has been removed, blur the menu\nif(this.active&&!$.contains(this.element[0],this.active[0])){this.blur();}},_itemRole:function _itemRole(){return{menu:\"menuitem\",listbox:\"option\"}[this.options.role];},_setOption:function _setOption(key,value){if(key===\"icons\"){var icons=this.element.find(\".ui-menu-icon\");this._removeClass(icons,null,this.options.icons.submenu)._addClass(icons,null,value.submenu);}this._super(key,value);},_setOptionDisabled:function _setOptionDisabled(value){this._super(value);this.element.attr(\"aria-disabled\",String(value));this._toggleClass(null,\"ui-state-disabled\",!!value);},focus:function focus(event,item){var nested,focused,activeParent;this.blur(event,event&&event.type===\"focus\");this._scrollIntoView(item);this.active=item.first();focused=this.active.children(\".ui-menu-item-wrapper\");this._addClass(focused,null,\"ui-state-active\");// Only update aria-activedescendant if there's a role\n// otherwise we assume focus is managed elsewhere\nif(this.options.role){this.element.attr(\"aria-activedescendant\",focused.attr(\"id\"));}// Highlight active parent menu item, if any\nactiveParent=this.active.parent().closest(\".ui-menu-item\").children(\".ui-menu-item-wrapper\");this._addClass(activeParent,null,\"ui-state-active\");if(event&&event.type===\"keydown\"){this._close();}else{this.timer=this._delay(function(){this._close();},this.delay);}nested=item.children(\".ui-menu\");if(nested.length&&event&&/^mouse/.test(event.type)){this._startOpening(nested);}this.activeMenu=item.parent();this._trigger(\"focus\",event,{item:item});},_scrollIntoView:function _scrollIntoView(item){var borderTop,paddingTop,offset,scroll,elementHeight,itemHeight;if(this._hasScroll()){borderTop=parseFloat($.css(this.activeMenu[0],\"borderTopWidth\"))||0;paddingTop=parseFloat($.css(this.activeMenu[0],\"paddingTop\"))||0;offset=item.offset().top-this.activeMenu.offset().top-borderTop-paddingTop;scroll=this.activeMenu.scrollTop();elementHeight=this.activeMenu.height();itemHeight=item.outerHeight();if(offset<0){this.activeMenu.scrollTop(scroll+offset);}else if(offset+itemHeight>elementHeight){this.activeMenu.scrollTop(scroll+offset-elementHeight+itemHeight);}}},blur:function blur(event,fromFocus){if(!fromFocus){clearTimeout(this.timer);}if(!this.active){return;}this._removeClass(this.active.children(\".ui-menu-item-wrapper\"),null,\"ui-state-active\");this._trigger(\"blur\",event,{item:this.active});this.active=null;},_startOpening:function _startOpening(submenu){clearTimeout(this.timer);// Don't open if already open fixes a Firefox bug that caused a .5 pixel\n// shift in the submenu position when mousing over the caret icon\nif(submenu.attr(\"aria-hidden\")!==\"true\"){return;}this.timer=this._delay(function(){this._close();this._open(submenu);},this.delay);},_open:function _open(submenu){var position=$.extend({of:this.active},this.options.position);clearTimeout(this.timer);this.element.find(\".ui-menu\").not(submenu.parents(\".ui-menu\")).hide().attr(\"aria-hidden\",\"true\");submenu.show().removeAttr(\"aria-hidden\").attr(\"aria-expanded\",\"true\").position(position);},collapseAll:function collapseAll(event,all){clearTimeout(this.timer);this.timer=this._delay(function(){// If we were passed an event, look for the submenu that contains the event\nvar currentMenu=all?this.element:$(event&&event.target).closest(this.element.find(\".ui-menu\"));// If we found no valid submenu ancestor, use the main menu to close all\n// sub menus anyway\nif(!currentMenu.length){currentMenu=this.element;}this._close(currentMenu);this.blur(event);// Work around active item staying active after menu is blurred\nthis._removeClass(currentMenu.find(\".ui-state-active\"),null,\"ui-state-active\");this.activeMenu=currentMenu;},all?0:this.delay);},// With no arguments, closes the currently active menu - if nothing is active\n// it closes all menus.  If passed an argument, it will search for menus BELOW\n_close:function _close(startMenu){if(!startMenu){startMenu=this.active?this.active.parent():this.element;}startMenu.find(\".ui-menu\").hide().attr(\"aria-hidden\",\"true\").attr(\"aria-expanded\",\"false\");},_closeOnDocumentClick:function _closeOnDocumentClick(event){return!$(event.target).closest(\".ui-menu\").length;},_isDivider:function _isDivider(item){// Match hyphen, em dash, en dash\nreturn!/[^\\-\\u2014\\u2013\\s]/.test(item.text());},collapse:function collapse(event){var newItem=this.active&&this.active.parent().closest(\".ui-menu-item\",this.element);if(newItem&&newItem.length){this._close();this.focus(event,newItem);}},expand:function expand(event){var newItem=this.active&&this._menuItems(this.active.children(\".ui-menu\")).first();if(newItem&&newItem.length){this._open(newItem.parent());// Delay so Firefox will not hide activedescendant change in expanding submenu from AT\nthis._delay(function(){this.focus(event,newItem);});}},next:function next(event){this._move(\"next\",\"first\",event);},previous:function previous(event){this._move(\"prev\",\"last\",event);},isFirstItem:function isFirstItem(){return this.active&&!this.active.prevAll(\".ui-menu-item\").length;},isLastItem:function isLastItem(){return this.active&&!this.active.nextAll(\".ui-menu-item\").length;},_menuItems:function _menuItems(menu){return(menu||this.element).find(this.options.items).filter(\".ui-menu-item\");},_move:function _move(direction,filter,event){var next;if(this.active){if(direction===\"first\"||direction===\"last\"){next=this.active[direction===\"first\"?\"prevAll\":\"nextAll\"](\".ui-menu-item\").last();}else{next=this.active[direction+\"All\"](\".ui-menu-item\").first();}}if(!next||!next.length||!this.active){next=this._menuItems(this.activeMenu)[filter]();}this.focus(event,next);},nextPage:function nextPage(event){var item,base,height;if(!this.active){this.next(event);return;}if(this.isLastItem()){return;}if(this._hasScroll()){base=this.active.offset().top;height=this.element.innerHeight();// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.\nif($.fn.jquery.indexOf(\"3.2.\")===0){height+=this.element[0].offsetHeight-this.element.outerHeight();}this.active.nextAll(\".ui-menu-item\").each(function(){item=$(this);return item.offset().top-base-height<0;});this.focus(event,item);}else{this.focus(event,this._menuItems(this.activeMenu)[!this.active?\"first\":\"last\"]());}},previousPage:function previousPage(event){var item,base,height;if(!this.active){this.next(event);return;}if(this.isFirstItem()){return;}if(this._hasScroll()){base=this.active.offset().top;height=this.element.innerHeight();// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.\nif($.fn.jquery.indexOf(\"3.2.\")===0){height+=this.element[0].offsetHeight-this.element.outerHeight();}this.active.prevAll(\".ui-menu-item\").each(function(){item=$(this);return item.offset().top-base+height>0;});this.focus(event,item);}else{this.focus(event,this._menuItems(this.activeMenu).first());}},_hasScroll:function _hasScroll(){return this.element.outerHeight()<this.element.prop(\"scrollHeight\");},select:function select(event){// TODO: It should never be possible to not have an active item at this\n// point, but the tests don't trigger mouseenter before click.\nthis.active=this.active||$(event.target).closest(\".ui-menu-item\");var ui={item:this.active};if(!this.active.has(\".ui-menu\").length){this.collapseAll(event,true);}this._trigger(\"select\",event,ui);},_filterMenuItems:function _filterMenuItems(character){var escapedCharacter=character.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\"),regex=new RegExp(\"^\"+escapedCharacter,\"i\");return this.activeMenu.find(this.options.items)// Only match on items, not dividers or other content (#10571)\n.filter(\".ui-menu-item\").filter(function(){return regex.test(String.prototype.trim.call($(this).children(\".ui-menu-item-wrapper\").text()));});}});/*!\n * jQuery UI Autocomplete 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Autocomplete\n//>>group: Widgets\n//>>description: Lists suggested words as the user is typing.\n//>>docs: http://api.jqueryui.com/autocomplete/\n//>>demos: http://jqueryui.com/autocomplete/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/autocomplete.css\n//>>css.theme: ../../themes/base/theme.css\n$.widget(\"ui.autocomplete\",{version:\"1.13.2\",defaultElement:\"<input>\",options:{appendTo:null,autoFocus:false,delay:300,minLength:1,position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},source:null,// Callbacks\nchange:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function _create(){// Some browsers only repeat keydown events, not keypress events,\n// so we use the suppressKeyPress flag to determine if we've already\n// handled the keydown event. #7269\n// Unfortunately the code for & in keypress is the same as the up arrow,\n// so we use the suppressKeyPressRepeat flag to avoid handling keypress\n// events when we know the keydown event was used to modify the\n// search term. #7799\nvar suppressKeyPress,suppressKeyPressRepeat,suppressInput,nodeName=this.element[0].nodeName.toLowerCase(),isTextarea=nodeName===\"textarea\",isInput=nodeName===\"input\";// Textareas are always multi-line\n// Inputs are always single-line, even if inside a contentEditable element\n// IE also treats inputs as contentEditable\n// All other element types are determined by whether or not they're contentEditable\nthis.isMultiLine=isTextarea||!isInput&&this._isContentEditable(this.element);this.valueMethod=this.element[isTextarea||isInput?\"val\":\"text\"];this.isNewMenu=true;this._addClass(\"ui-autocomplete-input\");this.element.attr(\"autocomplete\",\"off\");this._on(this.element,{keydown:function keydown(event){if(this.element.prop(\"readOnly\")){suppressKeyPress=true;suppressInput=true;suppressKeyPressRepeat=true;return;}suppressKeyPress=false;suppressInput=false;suppressKeyPressRepeat=false;var keyCode=$.ui.keyCode;switch(event.keyCode){case keyCode.PAGE_UP:suppressKeyPress=true;this._move(\"previousPage\",event);break;case keyCode.PAGE_DOWN:suppressKeyPress=true;this._move(\"nextPage\",event);break;case keyCode.UP:suppressKeyPress=true;this._keyEvent(\"previous\",event);break;case keyCode.DOWN:suppressKeyPress=true;this._keyEvent(\"next\",event);break;case keyCode.ENTER:// when menu is open and has focus\nif(this.menu.active){// #6055 - Opera still allows the keypress to occur\n// which causes forms to submit\nsuppressKeyPress=true;event.preventDefault();this.menu.select(event);}break;case keyCode.TAB:if(this.menu.active){this.menu.select(event);}break;case keyCode.ESCAPE:if(this.menu.element.is(\":visible\")){if(!this.isMultiLine){this._value(this.term);}this.close(event);// Different browsers have different default behavior for escape\n// Single press can mean undo or clear\n// Double press in IE means clear the whole form\nevent.preventDefault();}break;default:suppressKeyPressRepeat=true;// search timeout should be triggered before the input value is changed\nthis._searchTimeout(event);break;}},keypress:function keypress(event){if(suppressKeyPress){suppressKeyPress=false;if(!this.isMultiLine||this.menu.element.is(\":visible\")){event.preventDefault();}return;}if(suppressKeyPressRepeat){return;}// Replicate some key handlers to allow them to repeat in Firefox and Opera\nvar keyCode=$.ui.keyCode;switch(event.keyCode){case keyCode.PAGE_UP:this._move(\"previousPage\",event);break;case keyCode.PAGE_DOWN:this._move(\"nextPage\",event);break;case keyCode.UP:this._keyEvent(\"previous\",event);break;case keyCode.DOWN:this._keyEvent(\"next\",event);break;}},input:function input(event){if(suppressInput){suppressInput=false;event.preventDefault();return;}this._searchTimeout(event);},focus:function focus(){this.selectedItem=null;this.previous=this._value();},blur:function blur(event){clearTimeout(this.searching);this.close(event);this._change(event);}});this._initSource();this.menu=$(\"<ul>\").appendTo(this._appendTo()).menu({// disable ARIA support, the live region takes care of that\nrole:null}).hide()// Support: IE 11 only, Edge <= 14\n// For other browsers, we preventDefault() on the mousedown event\n// to keep the dropdown from taking focus from the input. This doesn't\n// work for IE/Edge, causing problems with selection and scrolling (#9638)\n// Happily, IE and Edge support an \"unselectable\" attribute that\n// prevents an element from receiving focus, exactly what we want here.\n.attr({\"unselectable\":\"on\"}).menu(\"instance\");this._addClass(this.menu.element,\"ui-autocomplete\",\"ui-front\");this._on(this.menu.element,{mousedown:function mousedown(event){// Prevent moving focus out of the text field\nevent.preventDefault();},menufocus:function menufocus(event,ui){var label,item;// support: Firefox\n// Prevent accidental activation of menu items in Firefox (#7024 #9118)\nif(this.isNewMenu){this.isNewMenu=false;if(event.originalEvent&&/^mouse/.test(event.originalEvent.type)){this.menu.blur();this.document.one(\"mousemove\",function(){$(event.target).trigger(event.originalEvent);});return;}}item=ui.item.data(\"ui-autocomplete-item\");if(false!==this._trigger(\"focus\",event,{item:item})){// use value to match what will end up in the input, if it was a key event\nif(event.originalEvent&&/^key/.test(event.originalEvent.type)){this._value(item.value);}}// Announce the value in the liveRegion\nlabel=ui.item.attr(\"aria-label\")||item.value;if(label&&String.prototype.trim.call(label).length){clearTimeout(this.liveRegionTimer);this.liveRegionTimer=this._delay(function(){this.liveRegion.html($(\"<div>\").text(label));},100);}},menuselect:function menuselect(event,ui){var item=ui.item.data(\"ui-autocomplete-item\"),previous=this.previous;// Only trigger when focus was lost (click on menu)\nif(this.element[0]!==$.ui.safeActiveElement(this.document[0])){this.element.trigger(\"focus\");this.previous=previous;// #6109 - IE triggers two focus events and the second\n// is asynchronous, so we need to reset the previous\n// term synchronously and asynchronously :-(\nthis._delay(function(){this.previous=previous;this.selectedItem=item;});}if(false!==this._trigger(\"select\",event,{item:item})){this._value(item.value);}// reset the term after the select event\n// this allows custom select handling to work properly\nthis.term=this._value();this.close(event);this.selectedItem=item;}});this.liveRegion=$(\"<div>\",{role:\"status\",\"aria-live\":\"assertive\",\"aria-relevant\":\"additions\"}).appendTo(this.document[0].body);this._addClass(this.liveRegion,null,\"ui-helper-hidden-accessible\");// Turning off autocomplete prevents the browser from remembering the\n// value when navigating through history, so we re-enable autocomplete\n// if the page is unloaded before the widget is destroyed. #7790\nthis._on(this.window,{beforeunload:function beforeunload(){this.element.removeAttr(\"autocomplete\");}});},_destroy:function _destroy(){clearTimeout(this.searching);this.element.removeAttr(\"autocomplete\");this.menu.element.remove();this.liveRegion.remove();},_setOption:function _setOption(key,value){this._super(key,value);if(key===\"source\"){this._initSource();}if(key===\"appendTo\"){this.menu.element.appendTo(this._appendTo());}if(key===\"disabled\"&&value&&this.xhr){this.xhr.abort();}},_isEventTargetInWidget:function _isEventTargetInWidget(event){var menuElement=this.menu.element[0];return event.target===this.element[0]||event.target===menuElement||$.contains(menuElement,event.target);},_closeOnClickOutside:function _closeOnClickOutside(event){if(!this._isEventTargetInWidget(event)){this.close();}},_appendTo:function _appendTo(){var element=this.options.appendTo;if(element){element=element.jquery||element.nodeType?$(element):this.document.find(element).eq(0);}if(!element||!element[0]){element=this.element.closest(\".ui-front, dialog\");}if(!element.length){element=this.document[0].body;}return element;},_initSource:function _initSource(){var array,url,that=this;if(Array.isArray(this.options.source)){array=this.options.source;this.source=function(request,response){response($.ui.autocomplete.filter(array,request.term));};}else if(typeof this.options.source===\"string\"){url=this.options.source;this.source=function(request,response){if(that.xhr){that.xhr.abort();}that.xhr=$.ajax({url:url,data:request,dataType:\"json\",success:function success(data){response(data);},error:function error(){response([]);}});};}else{this.source=this.options.source;}},_searchTimeout:function _searchTimeout(event){clearTimeout(this.searching);this.searching=this._delay(function(){// Search if the value has changed, or if the user retypes the same value (see #7434)\nvar equalValues=this.term===this._value(),menuVisible=this.menu.element.is(\":visible\"),modifierKey=event.altKey||event.ctrlKey||event.metaKey||event.shiftKey;if(!equalValues||equalValues&&!menuVisible&&!modifierKey){this.selectedItem=null;this.search(null,event);}},this.options.delay);},search:function search(value,event){value=value!=null?value:this._value();// Always save the actual value, not the one passed as an argument\nthis.term=this._value();if(value.length<this.options.minLength){return this.close(event);}if(this._trigger(\"search\",event)===false){return;}return this._search(value);},_search:function _search(value){this.pending++;this._addClass(\"ui-autocomplete-loading\");this.cancelSearch=false;this.source({term:value},this._response());},_response:function _response(){var index=++this.requestIndex;return function(content){if(index===this.requestIndex){this.__response(content);}this.pending--;if(!this.pending){this._removeClass(\"ui-autocomplete-loading\");}}.bind(this);},__response:function __response(content){if(content){content=this._normalize(content);}this._trigger(\"response\",null,{content:content});if(!this.options.disabled&&content&&content.length&&!this.cancelSearch){this._suggest(content);this._trigger(\"open\");}else{// use ._close() instead of .close() so we don't cancel future searches\nthis._close();}},close:function close(event){this.cancelSearch=true;this._close(event);},_close:function _close(event){// Remove the handler that closes the menu on outside clicks\nthis._off(this.document,\"mousedown\");if(this.menu.element.is(\":visible\")){this.menu.element.hide();this.menu.blur();this.isNewMenu=true;this._trigger(\"close\",event);}},_change:function _change(event){if(this.previous!==this._value()){this._trigger(\"change\",event,{item:this.selectedItem});}},_normalize:function _normalize(items){// assume all items have the right format when the first item is complete\nif(items.length&&items[0].label&&items[0].value){return items;}return $.map(items,function(item){if(typeof item===\"string\"){return{label:item,value:item};}return $.extend({},item,{label:item.label||item.value,value:item.value||item.label});});},_suggest:function _suggest(items){var ul=this.menu.element.empty();this._renderMenu(ul,items);this.isNewMenu=true;this.menu.refresh();// Size and position menu\nul.show();this._resizeMenu();ul.position($.extend({of:this.element},this.options.position));if(this.options.autoFocus){this.menu.next();}// Listen for interactions outside of the widget (#6642)\nthis._on(this.document,{mousedown:\"_closeOnClickOutside\"});},_resizeMenu:function _resizeMenu(){var ul=this.menu.element;ul.outerWidth(Math.max(// Firefox wraps long text (possibly a rounding bug)\n// so we add 1px to avoid the wrapping (#7513)\nul.width(\"\").outerWidth()+1,this.element.outerWidth()));},_renderMenu:function _renderMenu(ul,items){var that=this;$.each(items,function(index,item){that._renderItemData(ul,item);});},_renderItemData:function _renderItemData(ul,item){return this._renderItem(ul,item).data(\"ui-autocomplete-item\",item);},_renderItem:function _renderItem(ul,item){return $(\"<li>\").append($(\"<div>\").text(item.label)).appendTo(ul);},_move:function _move(direction,event){if(!this.menu.element.is(\":visible\")){this.search(null,event);return;}if(this.menu.isFirstItem()&&/^previous/.test(direction)||this.menu.isLastItem()&&/^next/.test(direction)){if(!this.isMultiLine){this._value(this.term);}this.menu.blur();return;}this.menu[direction](event);},widget:function widget(){return this.menu.element;},_value:function _value(){return this.valueMethod.apply(this.element,arguments);},_keyEvent:function _keyEvent(keyEvent,event){if(!this.isMultiLine||this.menu.element.is(\":visible\")){this._move(keyEvent,event);// Prevents moving cursor to beginning/end of the text field in some browsers\nevent.preventDefault();}},// Support: Chrome <=50\n// We should be able to just use this.element.prop( \"isContentEditable\" )\n// but hidden elements always report false in Chrome.\n// https://code.google.com/p/chromium/issues/detail?id=313082\n_isContentEditable:function _isContentEditable(element){if(!element.length){return false;}var editable=element.prop(\"contentEditable\");if(editable===\"inherit\"){return this._isContentEditable(element.parent());}return editable===\"true\";}});$.extend($.ui.autocomplete,{escapeRegex:function escapeRegex(value){return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\");},filter:function filter(array,term){var matcher=new RegExp($.ui.autocomplete.escapeRegex(term),\"i\");return $.grep(array,function(value){return matcher.test(value.label||value.value||value);});}});// Live region extension, adding a `messages` option\n// NOTE: This is an experimental API. We are still investigating\n// a full solution for string manipulation and internationalization.\n$.widget(\"ui.autocomplete\",$.ui.autocomplete,{options:{messages:{noResults:\"No search results.\",results:function results(amount){return amount+(amount>1?\" results are\":\" result is\")+\" available, use up and down arrow keys to navigate.\";}}},__response:function __response(content){var message;this._superApply(arguments);if(this.options.disabled||this.cancelSearch){return;}if(content&&content.length){message=this.options.messages.results(content.length);}else{message=this.options.messages.noResults;}clearTimeout(this.liveRegionTimer);this.liveRegionTimer=this._delay(function(){this.liveRegion.html($(\"<div>\").text(message));},100);}});var widgetsAutocomplete=$.ui.autocomplete;/*!\n * jQuery UI Controlgroup 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Controlgroup\n//>>group: Widgets\n//>>description: Visually groups form control widgets\n//>>docs: http://api.jqueryui.com/controlgroup/\n//>>demos: http://jqueryui.com/controlgroup/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/controlgroup.css\n//>>css.theme: ../../themes/base/theme.css\nvar controlgroupCornerRegex=/ui-corner-([a-z]){2,6}/g;var widgetsControlgroup=$.widget(\"ui.controlgroup\",{version:\"1.13.2\",defaultElement:\"<div>\",options:{direction:\"horizontal\",disabled:null,onlyVisible:true,items:{\"button\":\"input[type=button], input[type=submit], input[type=reset], button, a\",\"controlgroupLabel\":\".ui-controlgroup-label\",\"checkboxradio\":\"input[type='checkbox'], input[type='radio']\",\"selectmenu\":\"select\",\"spinner\":\".ui-spinner-input\"}},_create:function _create(){this._enhance();},// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation\n_enhance:function _enhance(){this.element.attr(\"role\",\"toolbar\");this.refresh();},_destroy:function _destroy(){this._callChildMethod(\"destroy\");this.childWidgets.removeData(\"ui-controlgroup-data\");this.element.removeAttr(\"role\");if(this.options.items.controlgroupLabel){this.element.find(this.options.items.controlgroupLabel).find(\".ui-controlgroup-label-contents\").contents().unwrap();}},_initWidgets:function _initWidgets(){var that=this,childWidgets=[];// First we iterate over each of the items options\n$.each(this.options.items,function(widget,selector){var labels;var options={};// Make sure the widget has a selector set\nif(!selector){return;}if(widget===\"controlgroupLabel\"){labels=that.element.find(selector);labels.each(function(){var element=$(this);if(element.children(\".ui-controlgroup-label-contents\").length){return;}element.contents().wrapAll(\"<span class='ui-controlgroup-label-contents'></span>\");});that._addClass(labels,null,\"ui-widget ui-widget-content ui-state-default\");childWidgets=childWidgets.concat(labels.get());return;}// Make sure the widget actually exists\nif(!$.fn[widget]){return;}// We assume everything is in the middle to start because we can't determine\n// first / last elements until all enhancments are done.\nif(that[\"_\"+widget+\"Options\"]){options=that[\"_\"+widget+\"Options\"](\"middle\");}else{options={classes:{}};}// Find instances of this widget inside controlgroup and init them\nthat.element.find(selector).each(function(){var element=$(this);var instance=element[widget](\"instance\");// We need to clone the default options for this type of widget to avoid\n// polluting the variable options which has a wider scope than a single widget.\nvar instanceOptions=$.widget.extend({},options);// If the button is the child of a spinner ignore it\n// TODO: Find a more generic solution\nif(widget===\"button\"&&element.parent(\".ui-spinner\").length){return;}// Create the widget if it doesn't exist\nif(!instance){instance=element[widget]()[widget](\"instance\");}if(instance){instanceOptions.classes=that._resolveClassesValues(instanceOptions.classes,instance);}element[widget](instanceOptions);// Store an instance of the controlgroup to be able to reference\n// from the outermost element for changing options and refresh\nvar widgetElement=element[widget](\"widget\");$.data(widgetElement[0],\"ui-controlgroup-data\",instance?instance:element[widget](\"instance\"));childWidgets.push(widgetElement[0]);});});this.childWidgets=$($.uniqueSort(childWidgets));this._addClass(this.childWidgets,\"ui-controlgroup-item\");},_callChildMethod:function _callChildMethod(method){this.childWidgets.each(function(){var element=$(this),data=element.data(\"ui-controlgroup-data\");if(data&&data[method]){data[method]();}});},_updateCornerClass:function _updateCornerClass(element,position){var remove=\"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all\";var add=this._buildSimpleOptions(position,\"label\").classes.label;this._removeClass(element,null,remove);this._addClass(element,null,add);},_buildSimpleOptions:function _buildSimpleOptions(position,key){var direction=this.options.direction===\"vertical\";var result={classes:{}};result.classes[key]={\"middle\":\"\",\"first\":\"ui-corner-\"+(direction?\"top\":\"left\"),\"last\":\"ui-corner-\"+(direction?\"bottom\":\"right\"),\"only\":\"ui-corner-all\"}[position];return result;},_spinnerOptions:function _spinnerOptions(position){var options=this._buildSimpleOptions(position,\"ui-spinner\");options.classes[\"ui-spinner-up\"]=\"\";options.classes[\"ui-spinner-down\"]=\"\";return options;},_buttonOptions:function _buttonOptions(position){return this._buildSimpleOptions(position,\"ui-button\");},_checkboxradioOptions:function _checkboxradioOptions(position){return this._buildSimpleOptions(position,\"ui-checkboxradio-label\");},_selectmenuOptions:function _selectmenuOptions(position){var direction=this.options.direction===\"vertical\";return{width:direction?\"auto\":false,classes:{middle:{\"ui-selectmenu-button-open\":\"\",\"ui-selectmenu-button-closed\":\"\"},first:{\"ui-selectmenu-button-open\":\"ui-corner-\"+(direction?\"top\":\"tl\"),\"ui-selectmenu-button-closed\":\"ui-corner-\"+(direction?\"top\":\"left\")},last:{\"ui-selectmenu-button-open\":direction?\"\":\"ui-corner-tr\",\"ui-selectmenu-button-closed\":\"ui-corner-\"+(direction?\"bottom\":\"right\")},only:{\"ui-selectmenu-button-open\":\"ui-corner-top\",\"ui-selectmenu-button-closed\":\"ui-corner-all\"}}[position]};},_resolveClassesValues:function _resolveClassesValues(classes,instance){var result={};$.each(classes,function(key){var current=instance.options.classes[key]||\"\";current=String.prototype.trim.call(current.replace(controlgroupCornerRegex,\"\"));result[key]=(current+\" \"+classes[key]).replace(/\\s+/g,\" \");});return result;},_setOption:function _setOption(key,value){if(key===\"direction\"){this._removeClass(\"ui-controlgroup-\"+this.options.direction);}this._super(key,value);if(key===\"disabled\"){this._callChildMethod(value?\"disable\":\"enable\");return;}this.refresh();},refresh:function refresh(){var children,that=this;this._addClass(\"ui-controlgroup ui-controlgroup-\"+this.options.direction);if(this.options.direction===\"horizontal\"){this._addClass(null,\"ui-helper-clearfix\");}this._initWidgets();children=this.childWidgets;// We filter here because we need to track all childWidgets not just the visible ones\nif(this.options.onlyVisible){children=children.filter(\":visible\");}if(children.length){// We do this last because we need to make sure all enhancment is done\n// before determining first and last\n$.each([\"first\",\"last\"],function(index,value){var instance=children[value]().data(\"ui-controlgroup-data\");if(instance&&that[\"_\"+instance.widgetName+\"Options\"]){var options=that[\"_\"+instance.widgetName+\"Options\"](children.length===1?\"only\":value);options.classes=that._resolveClassesValues(options.classes,instance);instance.element[instance.widgetName](options);}else{that._updateCornerClass(children[value](),value);}});// Finally call the refresh method on each of the child widgets.\nthis._callChildMethod(\"refresh\");}}});/*!\n * jQuery UI Checkboxradio 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Checkboxradio\n//>>group: Widgets\n//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.\n//>>docs: http://api.jqueryui.com/checkboxradio/\n//>>demos: http://jqueryui.com/checkboxradio/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.structure: ../../themes/base/checkboxradio.css\n//>>css.theme: ../../themes/base/theme.css\n$.widget(\"ui.checkboxradio\",[$.ui.formResetMixin,{version:\"1.13.2\",options:{disabled:null,label:null,icon:true,classes:{\"ui-checkboxradio-label\":\"ui-corner-all\",\"ui-checkboxradio-icon\":\"ui-corner-all\"}},_getCreateOptions:function _getCreateOptions(){var disabled,labels,labelContents;var options=this._super()||{};// We read the type here, because it makes more sense to throw a element type error first,\n// rather then the error for lack of a label. Often if its the wrong type, it\n// won't have a label (e.g. calling on a div, btn, etc)\nthis._readType();labels=this.element.labels();// If there are multiple labels, use the last one\nthis.label=$(labels[labels.length-1]);if(!this.label.length){$.error(\"No label found for checkboxradio widget\");}this.originalLabel=\"\";// We need to get the label text but this may also need to make sure it does not contain the\n// input itself.\n// The label contents could be text, html, or a mix. We wrap all elements\n// and read the wrapper's `innerHTML` to get a string representation of\n// the label, without the input as part of it.\nlabelContents=this.label.contents().not(this.element[0]);if(labelContents.length){this.originalLabel+=labelContents.clone().wrapAll(\"<div></div>\").parent().html();}// Set the label option if we found label text\nif(this.originalLabel){options.label=this.originalLabel;}disabled=this.element[0].disabled;if(disabled!=null){options.disabled=disabled;}return options;},_create:function _create(){var checked=this.element[0].checked;this._bindFormResetHandler();if(this.options.disabled==null){this.options.disabled=this.element[0].disabled;}this._setOption(\"disabled\",this.options.disabled);this._addClass(\"ui-checkboxradio\",\"ui-helper-hidden-accessible\");this._addClass(this.label,\"ui-checkboxradio-label\",\"ui-button ui-widget\");if(this.type===\"radio\"){this._addClass(this.label,\"ui-checkboxradio-radio-label\");}if(this.options.label&&this.options.label!==this.originalLabel){this._updateLabel();}else if(this.originalLabel){this.options.label=this.originalLabel;}this._enhance();if(checked){this._addClass(this.label,\"ui-checkboxradio-checked\",\"ui-state-active\");}this._on({change:\"_toggleClasses\",focus:function focus(){this._addClass(this.label,null,\"ui-state-focus ui-visual-focus\");},blur:function blur(){this._removeClass(this.label,null,\"ui-state-focus ui-visual-focus\");}});},_readType:function _readType(){var nodeName=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type;if(nodeName!==\"input\"||!/radio|checkbox/.test(this.type)){$.error(\"Can't create checkboxradio on element.nodeName=\"+nodeName+\" and element.type=\"+this.type);}},// Support jQuery Mobile enhanced option\n_enhance:function _enhance(){this._updateIcon(this.element[0].checked);},widget:function widget(){return this.label;},_getRadioGroup:function _getRadioGroup(){var group;var name=this.element[0].name;var nameSelector=\"input[name='\"+$.escapeSelector(name)+\"']\";if(!name){return $([]);}if(this.form.length){group=$(this.form[0].elements).filter(nameSelector);}else{// Not inside a form, check all inputs that also are not inside a form\ngroup=$(nameSelector).filter(function(){return $(this)._form().length===0;});}return group.not(this.element);},_toggleClasses:function _toggleClasses(){var checked=this.element[0].checked;this._toggleClass(this.label,\"ui-checkboxradio-checked\",\"ui-state-active\",checked);if(this.options.icon&&this.type===\"checkbox\"){this._toggleClass(this.icon,null,\"ui-icon-check ui-state-checked\",checked)._toggleClass(this.icon,null,\"ui-icon-blank\",!checked);}if(this.type===\"radio\"){this._getRadioGroup().each(function(){var instance=$(this).checkboxradio(\"instance\");if(instance){instance._removeClass(instance.label,\"ui-checkboxradio-checked\",\"ui-state-active\");}});}},_destroy:function _destroy(){this._unbindFormResetHandler();if(this.icon){this.icon.remove();this.iconSpace.remove();}},_setOption:function _setOption(key,value){// We don't allow the value to be set to nothing\nif(key===\"label\"&&!value){return;}this._super(key,value);if(key===\"disabled\"){this._toggleClass(this.label,null,\"ui-state-disabled\",value);this.element[0].disabled=value;// Don't refresh when setting disabled\nreturn;}this.refresh();},_updateIcon:function _updateIcon(checked){var toAdd=\"ui-icon ui-icon-background \";if(this.options.icon){if(!this.icon){this.icon=$(\"<span>\");this.iconSpace=$(\"<span> </span>\");this._addClass(this.iconSpace,\"ui-checkboxradio-icon-space\");}if(this.type===\"checkbox\"){toAdd+=checked?\"ui-icon-check ui-state-checked\":\"ui-icon-blank\";this._removeClass(this.icon,null,checked?\"ui-icon-blank\":\"ui-icon-check\");}else{toAdd+=\"ui-icon-blank\";}this._addClass(this.icon,\"ui-checkboxradio-icon\",toAdd);if(!checked){this._removeClass(this.icon,null,\"ui-icon-check ui-state-checked\");}this.icon.prependTo(this.label).after(this.iconSpace);}else if(this.icon!==undefined){this.icon.remove();this.iconSpace.remove();delete this.icon;}},_updateLabel:function _updateLabel(){// Remove the contents of the label ( minus the icon, icon space, and input )\nvar contents=this.label.contents().not(this.element[0]);if(this.icon){contents=contents.not(this.icon[0]);}if(this.iconSpace){contents=contents.not(this.iconSpace[0]);}contents.remove();this.label.append(this.options.label);},refresh:function refresh(){var checked=this.element[0].checked,isDisabled=this.element[0].disabled;this._updateIcon(checked);this._toggleClass(this.label,\"ui-checkboxradio-checked\",\"ui-state-active\",checked);if(this.options.label!==null){this._updateLabel();}if(isDisabled!==this.options.disabled){this._setOptions({\"disabled\":isDisabled});}}}]);var widgetsCheckboxradio=$.ui.checkboxradio;/*!\n * jQuery UI Button 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Button\n//>>group: Widgets\n//>>description: Enhances a form with themeable buttons.\n//>>docs: http://api.jqueryui.com/button/\n//>>demos: http://jqueryui.com/button/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\n$.widget(\"ui.button\",{version:\"1.13.2\",defaultElement:\"<button>\",options:{classes:{\"ui-button\":\"ui-corner-all\"},disabled:null,icon:null,iconPosition:\"beginning\",label:null,showLabel:true},_getCreateOptions:function _getCreateOptions(){var disabled,// This is to support cases like in jQuery Mobile where the base widget does have\n// an implementation of _getCreateOptions\noptions=this._super()||{};this.isInput=this.element.is(\"input\");disabled=this.element[0].disabled;if(disabled!=null){options.disabled=disabled;}this.originalLabel=this.isInput?this.element.val():this.element.html();if(this.originalLabel){options.label=this.originalLabel;}return options;},_create:function _create(){if(!this.option.showLabel&!this.options.icon){this.options.showLabel=true;}// We have to check the option again here even though we did in _getCreateOptions,\n// because null may have been passed on init which would override what was set in\n// _getCreateOptions\nif(this.options.disabled==null){this.options.disabled=this.element[0].disabled||false;}this.hasTitle=!!this.element.attr(\"title\");// Check to see if the label needs to be set or if its already correct\nif(this.options.label&&this.options.label!==this.originalLabel){if(this.isInput){this.element.val(this.options.label);}else{this.element.html(this.options.label);}}this._addClass(\"ui-button\",\"ui-widget\");this._setOption(\"disabled\",this.options.disabled);this._enhance();if(this.element.is(\"a\")){this._on({\"keyup\":function keyup(event){if(event.keyCode===$.ui.keyCode.SPACE){event.preventDefault();// Support: PhantomJS <= 1.9, IE 8 Only\n// If a native click is available use it so we actually cause navigation\n// otherwise just trigger a click event\nif(this.element[0].click){this.element[0].click();}else{this.element.trigger(\"click\");}}}});}},_enhance:function _enhance(){if(!this.element.is(\"button\")){this.element.attr(\"role\",\"button\");}if(this.options.icon){this._updateIcon(\"icon\",this.options.icon);this._updateTooltip();}},_updateTooltip:function _updateTooltip(){this.title=this.element.attr(\"title\");if(!this.options.showLabel&&!this.title){this.element.attr(\"title\",this.options.label);}},_updateIcon:function _updateIcon(option,value){var icon=option!==\"iconPosition\",position=icon?this.options.iconPosition:value,displayBlock=position===\"top\"||position===\"bottom\";// Create icon\nif(!this.icon){this.icon=$(\"<span>\");this._addClass(this.icon,\"ui-button-icon\",\"ui-icon\");if(!this.options.showLabel){this._addClass(\"ui-button-icon-only\");}}else if(icon){// If we are updating the icon remove the old icon class\nthis._removeClass(this.icon,null,this.options.icon);}// If we are updating the icon add the new icon class\nif(icon){this._addClass(this.icon,null,value);}this._attachIcon(position);// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove\n// the iconSpace if there is one.\nif(displayBlock){this._addClass(this.icon,null,\"ui-widget-icon-block\");if(this.iconSpace){this.iconSpace.remove();}}else{// Position is beginning or end so remove the ui-widget-icon-block class and add the\n// space if it does not exist\nif(!this.iconSpace){this.iconSpace=$(\"<span> </span>\");this._addClass(this.iconSpace,\"ui-button-icon-space\");}this._removeClass(this.icon,null,\"ui-wiget-icon-block\");this._attachIconSpace(position);}},_destroy:function _destroy(){this.element.removeAttr(\"role\");if(this.icon){this.icon.remove();}if(this.iconSpace){this.iconSpace.remove();}if(!this.hasTitle){this.element.removeAttr(\"title\");}},_attachIconSpace:function _attachIconSpace(iconPosition){this.icon[/^(?:end|bottom)/.test(iconPosition)?\"before\":\"after\"](this.iconSpace);},_attachIcon:function _attachIcon(iconPosition){this.element[/^(?:end|bottom)/.test(iconPosition)?\"append\":\"prepend\"](this.icon);},_setOptions:function _setOptions(options){var newShowLabel=options.showLabel===undefined?this.options.showLabel:options.showLabel,newIcon=options.icon===undefined?this.options.icon:options.icon;if(!newShowLabel&&!newIcon){options.showLabel=true;}this._super(options);},_setOption:function _setOption(key,value){if(key===\"icon\"){if(value){this._updateIcon(key,value);}else if(this.icon){this.icon.remove();if(this.iconSpace){this.iconSpace.remove();}}}if(key===\"iconPosition\"){this._updateIcon(key,value);}// Make sure we can't end up with a button that has neither text nor icon\nif(key===\"showLabel\"){this._toggleClass(\"ui-button-icon-only\",null,!value);this._updateTooltip();}if(key===\"label\"){if(this.isInput){this.element.val(value);}else{// If there is an icon, append it, else nothing then append the value\n// this avoids removal of the icon when setting label text\nthis.element.html(value);if(this.icon){this._attachIcon(this.options.iconPosition);this._attachIconSpace(this.options.iconPosition);}}}this._super(key,value);if(key===\"disabled\"){this._toggleClass(null,\"ui-state-disabled\",value);this.element[0].disabled=value;if(value){this.element.trigger(\"blur\");}}},refresh:function refresh(){// Make sure to only check disabled if its an element that supports this otherwise\n// check for the disabled class to determine state\nvar isDisabled=this.element.is(\"input, button\")?this.element[0].disabled:this.element.hasClass(\"ui-button-disabled\");if(isDisabled!==this.options.disabled){this._setOptions({disabled:isDisabled});}this._updateTooltip();}});// DEPRECATED\nif($.uiBackCompat!==false){// Text and Icons options\n$.widget(\"ui.button\",$.ui.button,{options:{text:true,icons:{primary:null,secondary:null}},_create:function _create(){if(this.options.showLabel&&!this.options.text){this.options.showLabel=this.options.text;}if(!this.options.showLabel&&this.options.text){this.options.text=this.options.showLabel;}if(!this.options.icon&&(this.options.icons.primary||this.options.icons.secondary)){if(this.options.icons.primary){this.options.icon=this.options.icons.primary;}else{this.options.icon=this.options.icons.secondary;this.options.iconPosition=\"end\";}}else if(this.options.icon){this.options.icons.primary=this.options.icon;}this._super();},_setOption:function _setOption(key,value){if(key===\"text\"){this._super(\"showLabel\",value);return;}if(key===\"showLabel\"){this.options.text=value;}if(key===\"icon\"){this.options.icons.primary=value;}if(key===\"icons\"){if(value.primary){this._super(\"icon\",value.primary);this._super(\"iconPosition\",\"beginning\");}else if(value.secondary){this._super(\"icon\",value.secondary);this._super(\"iconPosition\",\"end\");}}this._superApply(arguments);}});$.fn.button=function(orig){return function(options){var isMethodCall=typeof options===\"string\";var args=Array.prototype.slice.call(arguments,1);var returnValue=this;if(isMethodCall){// If this is an empty collection, we need to have the instance method\n// return undefined instead of the jQuery instance\nif(!this.length&&options===\"instance\"){returnValue=undefined;}else{this.each(function(){var methodValue;var type=$(this).attr(\"type\");var name=type!==\"checkbox\"&&type!==\"radio\"?\"button\":\"checkboxradio\";var instance=$.data(this,\"ui-\"+name);if(options===\"instance\"){returnValue=instance;return false;}if(!instance){return $.error(\"cannot call methods on button\"+\" prior to initialization; \"+\"attempted to call method '\"+options+\"'\");}if(typeof instance[options]!==\"function\"||options.charAt(0)===\"_\"){return $.error(\"no such method '\"+options+\"' for button\"+\" widget instance\");}methodValue=instance[options].apply(instance,args);if(methodValue!==instance&&methodValue!==undefined){returnValue=methodValue&&methodValue.jquery?returnValue.pushStack(methodValue.get()):methodValue;return false;}});}}else{// Allow multiple hashes to be passed on init\nif(args.length){options=$.widget.extend.apply(null,[options].concat(args));}this.each(function(){var type=$(this).attr(\"type\");var name=type!==\"checkbox\"&&type!==\"radio\"?\"button\":\"checkboxradio\";var instance=$.data(this,\"ui-\"+name);if(instance){instance.option(options||{});if(instance._init){instance._init();}}else{if(name===\"button\"){orig.call($(this),options);return;}$(this).checkboxradio($.extend({icon:false},options));}});}return returnValue;};}($.fn.button);$.fn.buttonset=function(){if(!$.ui.controlgroup){$.error(\"Controlgroup widget missing\");}if(arguments[0]===\"option\"&&arguments[1]===\"items\"&&arguments[2]){return this.controlgroup.apply(this,[arguments[0],\"items.button\",arguments[2]]);}if(arguments[0]===\"option\"&&arguments[1]===\"items\"){return this.controlgroup.apply(this,[arguments[0],\"items.button\"]);}if(_typeof(arguments[0])===\"object\"&&arguments[0].items){arguments[0].items={button:arguments[0].items};}return this.controlgroup.apply(this,arguments);};}var widgetsButton=$.ui.button;/* eslint-disable max-len, camelcase */ /*!\n * jQuery UI Datepicker 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Datepicker\n//>>group: Widgets\n//>>description: Displays a calendar from an input or inline for selecting dates.\n//>>docs: http://api.jqueryui.com/datepicker/\n//>>demos: http://jqueryui.com/datepicker/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/datepicker.css\n//>>css.theme: ../../themes/base/theme.css\n$.extend($.ui,{datepicker:{version:\"1.13.2\"}});var datepicker_instActive;function datepicker_getZindex(elem){var position,value;while(elem.length&&elem[0]!==document){// Ignore z-index if position is set to a value where z-index is ignored by the browser\n// This makes behavior of this function consistent across browsers\n// WebKit always returns auto if the element is positioned\nposition=elem.css(\"position\");if(position===\"absolute\"||position===\"relative\"||position===\"fixed\"){// IE returns 0 when zIndex is not specified\n// other browsers return a string\n// we ignore the case of nested elements with an explicit value of 0\n// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\nvalue=parseInt(elem.css(\"zIndex\"),10);if(!isNaN(value)&&value!==0){return value;}}elem=elem.parent();}return 0;}/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. */function Datepicker(){this._curInst=null;// The current instance in use\nthis._keyEvent=false;// If the last event was a key event\nthis._disabledInputs=[];// List of date picker inputs that have been disabled\nthis._datepickerShowing=false;// True if the popup picker is showing , false if not\nthis._inDialog=false;// True if showing within a \"dialog\", false if not\nthis._mainDivId=\"ui-datepicker-div\";// The ID of the main datepicker division\nthis._inlineClass=\"ui-datepicker-inline\";// The name of the inline marker class\nthis._appendClass=\"ui-datepicker-append\";// The name of the append marker class\nthis._triggerClass=\"ui-datepicker-trigger\";// The name of the trigger marker class\nthis._dialogClass=\"ui-datepicker-dialog\";// The name of the dialog marker class\nthis._disableClass=\"ui-datepicker-disabled\";// The name of the disabled covering marker class\nthis._unselectableClass=\"ui-datepicker-unselectable\";// The name of the unselectable cell marker class\nthis._currentClass=\"ui-datepicker-current-day\";// The name of the current day marker class\nthis._dayOverClass=\"ui-datepicker-days-cell-over\";// The name of the day hover marker class\nthis.regional=[];// Available regional settings, indexed by language code\nthis.regional[\"\"]={// Default regional settings\ncloseText:\"Done\",// Display text for close link\nprevText:\"Prev\",// Display text for previous month link\nnextText:\"Next\",// Display text for next month link\ncurrentText:\"Today\",// Display text for current month link\nmonthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],// Names of months for drop-down and formatting\nmonthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],// For formatting\ndayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],// For formatting\ndayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],// For formatting\ndayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],// Column headings for days starting at Sunday\nweekHeader:\"Wk\",// Column header for week of the year\ndateFormat:\"mm/dd/yy\",// See format options on parseDate\nfirstDay:0,// The first day of the week, Sun = 0, Mon = 1, ...\nisRTL:false,// True if right-to-left language, false if left-to-right\nshowMonthAfterYear:false,// True if the year select precedes month, false for month then year\nyearSuffix:\"\",// Additional text to append to the year in the month headers,\nselectMonthLabel:\"Select month\",// Invisible label for month selector\nselectYearLabel:\"Select year\"// Invisible label for year selector\n};this._defaults={// Global defaults for all the date picker instances\nshowOn:\"focus\",// \"focus\" for popup on focus,\n// \"button\" for trigger button, or \"both\" for either\nshowAnim:\"fadeIn\",// Name of jQuery animation for popup\nshowOptions:{},// Options for enhanced animations\ndefaultDate:null,// Used when field is blank: actual date,\n// +/-number for offset from today, null for today\nappendText:\"\",// Display text following the input box, e.g. showing the format\nbuttonText:\"...\",// Text for trigger button\nbuttonImage:\"\",// URL for trigger button image\nbuttonImageOnly:false,// True if the image appears alone, false if it appears on a button\nhideIfNoPrevNext:false,// True to hide next/previous month links\n// if not applicable, false to just disable them\nnavigationAsDateFormat:false,// True if date formatting applied to prev/today/next links\ngotoCurrent:false,// True if today link goes back to current selection instead\nchangeMonth:false,// True if month can be selected directly, false if only prev/next\nchangeYear:false,// True if year can be selected directly, false if only prev/next\nyearRange:\"c-10:c+10\",// Range of years to display in drop-down,\n// either relative to today's year (-nn:+nn), relative to currently displayed year\n// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\nshowOtherMonths:false,// True to show dates in other months, false to leave blank\nselectOtherMonths:false,// True to allow selection of dates in other months, false for unselectable\nshowWeek:false,// True to show week of the year, false to not show it\ncalculateWeek:this.iso8601Week,// How to calculate the week of the year,\n// takes a Date and returns the number of the week for it\nshortYearCutoff:\"+10\",// Short year values < this are in the current century,\n// > this are in the previous century,\n// string value starting with \"+\" for current year + value\nminDate:null,// The earliest selectable date, or null for no limit\nmaxDate:null,// The latest selectable date, or null for no limit\nduration:\"fast\",// Duration of display/closure\nbeforeShowDay:null,// Function that takes a date and returns an array with\n// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n// [2] = cell title (optional), e.g. $.datepicker.noWeekends\nbeforeShow:null,// Function that takes an input field and\n// returns a set of custom settings for the date picker\nonSelect:null,// Define a callback function when a date is selected\nonChangeMonthYear:null,// Define a callback function when the month or year is changed\nonClose:null,// Define a callback function when the datepicker is closed\nonUpdateDatepicker:null,// Define a callback function when the datepicker is updated\nnumberOfMonths:1,// Number of months to show at a time\nshowCurrentAtPos:0,// The position in multipe months at which to show the current month (starting at 0)\nstepMonths:1,// Number of months to step back/forward\nstepBigMonths:12,// Number of months to step back/forward for the big links\naltField:\"\",// Selector for an alternate field to store selected dates into\naltFormat:\"\",// The date format to use for the alternate field\nconstrainInput:true,// The input is constrained by the current date format\nshowButtonPanel:false,// True to show button panel, false to not show it\nautoSize:false,// True to size the input for the date format, false to leave as is\ndisabled:false// The initial disabled state\n};$.extend(this._defaults,this.regional[\"\"]);this.regional.en=$.extend(true,{},this.regional[\"\"]);this.regional[\"en-US\"]=$.extend(true,{},this.regional.en);this.dpDiv=datepicker_bindHover($(\"<div id='\"+this._mainDivId+\"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\"));}$.extend(Datepicker.prototype,{/* Class name added to elements to indicate already configured with a date picker. */markerClassName:\"hasDatepicker\",//Keep track of the maximum number of rows displayed (see #7043)\nmaxRows:4,// TODO rename to \"widget\" when switching to widget factory\n_widgetDatepicker:function _widgetDatepicker(){return this.dpDiv;},/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t */setDefaults:function setDefaults(settings){datepicker_extendRemove(this._defaults,settings||{});return this;},/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t */_attachDatepicker:function _attachDatepicker(target,settings){var nodeName,inline,inst;nodeName=target.nodeName.toLowerCase();inline=nodeName===\"div\"||nodeName===\"span\";if(!target.id){this.uuid+=1;target.id=\"dp\"+this.uuid;}inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{});if(nodeName===\"input\"){this._connectDatepicker(target,inst);}else if(inline){this._inlineDatepicker(target,inst);}},/* Create a new instance object. */_newInst:function _newInst(target,inline){var id=target[0].id.replace(/([^A-Za-z0-9_\\-])/g,\"\\\\\\\\$1\");// escape jQuery meta chars\nreturn{id:id,input:target,// associated target\nselectedDay:0,selectedMonth:0,selectedYear:0,// current selection\ndrawMonth:0,drawYear:0,// month being drawn\ninline:inline,// is datepicker inline or not\ndpDiv:!inline?this.dpDiv:// presentation div\ndatepicker_bindHover($(\"<div class='\"+this._inlineClass+\" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\"))};},/* Attach the date picker to an input field. */_connectDatepicker:function _connectDatepicker(target,inst){var input=$(target);inst.append=$([]);inst.trigger=$([]);if(input.hasClass(this.markerClassName)){return;}this._attachments(input,inst);input.addClass(this.markerClassName).on(\"keydown\",this._doKeyDown).on(\"keypress\",this._doKeyPress).on(\"keyup\",this._doKeyUp);this._autoSize(inst);$.data(target,\"datepicker\",inst);//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\nif(inst.settings.disabled){this._disableDatepicker(target);}},/* Make attachments based on settings. */_attachments:function _attachments(input,inst){var showOn,buttonText,buttonImage,appendText=this._get(inst,\"appendText\"),isRTL=this._get(inst,\"isRTL\");if(inst.append){inst.append.remove();}if(appendText){inst.append=$(\"<span>\").addClass(this._appendClass).text(appendText);input[isRTL?\"before\":\"after\"](inst.append);}input.off(\"focus\",this._showDatepicker);if(inst.trigger){inst.trigger.remove();}showOn=this._get(inst,\"showOn\");if(showOn===\"focus\"||showOn===\"both\"){// pop-up date picker when in the marked field\ninput.on(\"focus\",this._showDatepicker);}if(showOn===\"button\"||showOn===\"both\"){// pop-up date picker when button clicked\nbuttonText=this._get(inst,\"buttonText\");buttonImage=this._get(inst,\"buttonImage\");if(this._get(inst,\"buttonImageOnly\")){inst.trigger=$(\"<img>\").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText});}else{inst.trigger=$(\"<button type='button'>\").addClass(this._triggerClass);if(buttonImage){inst.trigger.html($(\"<img>\").attr({src:buttonImage,alt:buttonText,title:buttonText}));}else{inst.trigger.text(buttonText);}}input[isRTL?\"before\":\"after\"](inst.trigger);inst.trigger.on(\"click\",function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput===input[0]){$.datepicker._hideDatepicker();}else if($.datepicker._datepickerShowing&&$.datepicker._lastInput!==input[0]){$.datepicker._hideDatepicker();$.datepicker._showDatepicker(input[0]);}else{$.datepicker._showDatepicker(input[0]);}return false;});}},/* Apply the maximum length for the date format. */_autoSize:function _autoSize(inst){if(this._get(inst,\"autoSize\")&&!inst.inline){var findMax,max,maxI,i,date=new Date(2009,12-1,20),// Ensure double digits\ndateFormat=this._get(inst,\"dateFormat\");if(dateFormat.match(/[DM]/)){findMax=function findMax(names){max=0;maxI=0;for(i=0;i<names.length;i++){if(names[i].length>max){max=names[i].length;maxI=i;}}return maxI;};date.setMonth(findMax(this._get(inst,dateFormat.match(/MM/)?\"monthNames\":\"monthNamesShort\")));date.setDate(findMax(this._get(inst,dateFormat.match(/DD/)?\"dayNames\":\"dayNamesShort\"))+20-date.getDay());}inst.input.attr(\"size\",this._formatDate(inst,date).length);}},/* Attach an inline date picker to a div. */_inlineDatepicker:function _inlineDatepicker(target,inst){var divSpan=$(target);if(divSpan.hasClass(this.markerClassName)){return;}divSpan.addClass(this.markerClassName).append(inst.dpDiv);$.data(target,\"datepicker\",inst);this._setDate(inst,this._getDefaultDate(inst),true);this._updateDatepicker(inst);this._updateAlternate(inst);//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\nif(inst.settings.disabled){this._disableDatepicker(target);}// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\ninst.dpDiv.css(\"display\",\"block\");},/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t */_dialogDatepicker:function _dialogDatepicker(input,date,onSelect,settings,pos){var id,browserWidth,browserHeight,scrollX,scrollY,inst=this._dialogInst;// internal instance\nif(!inst){this.uuid+=1;id=\"dp\"+this.uuid;this._dialogInput=$(\"<input type='text' id='\"+id+\"' style='position: absolute; top: -100px; width: 0px;'/>\");this._dialogInput.on(\"keydown\",this._doKeyDown);$(\"body\").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],\"datepicker\",inst);}datepicker_extendRemove(inst.settings,settings||{});date=date&&date.constructor===Date?this._formatDate(inst,date):date;this._dialogInput.val(date);this._pos=pos?pos.length?pos:[pos.pageX,pos.pageY]:null;if(!this._pos){browserWidth=document.documentElement.clientWidth;browserHeight=document.documentElement.clientHeight;scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=// should use actual width/height below\n[browserWidth/2-100+scrollX,browserHeight/2-150+scrollY];}// Move input on screen for focus, but hidden behind dialog\nthis._dialogInput.css(\"left\",this._pos[0]+20+\"px\").css(\"top\",this._pos[1]+\"px\");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv);}$.data(this._dialogInput[0],\"datepicker\",inst);return this;},/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t */_destroyDatepicker:function _destroyDatepicker(target){var nodeName,$target=$(target),inst=$.data(target,\"datepicker\");if(!$target.hasClass(this.markerClassName)){return;}nodeName=target.nodeName.toLowerCase();$.removeData(target,\"datepicker\");if(nodeName===\"input\"){inst.append.remove();inst.trigger.remove();$target.removeClass(this.markerClassName).off(\"focus\",this._showDatepicker).off(\"keydown\",this._doKeyDown).off(\"keypress\",this._doKeyPress).off(\"keyup\",this._doKeyUp);}else if(nodeName===\"div\"||nodeName===\"span\"){$target.removeClass(this.markerClassName).empty();}if(datepicker_instActive===inst){datepicker_instActive=null;this._curInst=null;}},/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */_enableDatepicker:function _enableDatepicker(target){var nodeName,inline,$target=$(target),inst=$.data(target,\"datepicker\");if(!$target.hasClass(this.markerClassName)){return;}nodeName=target.nodeName.toLowerCase();if(nodeName===\"input\"){target.disabled=false;inst.trigger.filter(\"button\").each(function(){this.disabled=false;}).end().filter(\"img\").css({opacity:\"1.0\",cursor:\"\"});}else if(nodeName===\"div\"||nodeName===\"span\"){inline=$target.children(\".\"+this._inlineClass);inline.children().removeClass(\"ui-state-disabled\");inline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\",false);}this._disabledInputs=$.map(this._disabledInputs,// Delete entry\nfunction(value){return value===target?null:value;});},/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */_disableDatepicker:function _disableDatepicker(target){var nodeName,inline,$target=$(target),inst=$.data(target,\"datepicker\");if(!$target.hasClass(this.markerClassName)){return;}nodeName=target.nodeName.toLowerCase();if(nodeName===\"input\"){target.disabled=true;inst.trigger.filter(\"button\").each(function(){this.disabled=true;}).end().filter(\"img\").css({opacity:\"0.5\",cursor:\"default\"});}else if(nodeName===\"div\"||nodeName===\"span\"){inline=$target.children(\".\"+this._inlineClass);inline.children().addClass(\"ui-state-disabled\");inline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\",true);}this._disabledInputs=$.map(this._disabledInputs,// Delete entry\nfunction(value){return value===target?null:value;});this._disabledInputs[this._disabledInputs.length]=target;},/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t */_isDisabledDatepicker:function _isDisabledDatepicker(target){if(!target){return false;}for(var i=0;i<this._disabledInputs.length;i++){if(this._disabledInputs[i]===target){return true;}}return false;},/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t */_getInst:function _getInst(target){try{return $.data(target,\"datepicker\");}catch(err){throw\"Missing instance data for this datepicker\";}},/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t */_optionDatepicker:function _optionDatepicker(target,name,value){var settings,date,minDate,maxDate,inst=this._getInst(target);if(arguments.length===2&&typeof name===\"string\"){return name===\"defaults\"?$.extend({},$.datepicker._defaults):inst?name===\"all\"?$.extend({},inst.settings):this._get(inst,name):null;}settings=name||{};if(typeof name===\"string\"){settings={};settings[name]=value;}if(inst){if(this._curInst===inst){this._hideDatepicker();}date=this._getDateDatepicker(target,true);minDate=this._getMinMaxDate(inst,\"min\");maxDate=this._getMinMaxDate(inst,\"max\");datepicker_extendRemove(inst.settings,settings);// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\nif(minDate!==null&&settings.dateFormat!==undefined&&settings.minDate===undefined){inst.settings.minDate=this._formatDate(inst,minDate);}if(maxDate!==null&&settings.dateFormat!==undefined&&settings.maxDate===undefined){inst.settings.maxDate=this._formatDate(inst,maxDate);}if(\"disabled\"in settings){if(settings.disabled){this._disableDatepicker(target);}else{this._enableDatepicker(target);}}this._attachments($(target),inst);this._autoSize(inst);this._setDate(inst,date);this._updateAlternate(inst);this._updateDatepicker(inst);}},// Change method deprecated\n_changeDatepicker:function _changeDatepicker(target,name,value){this._optionDatepicker(target,name,value);},/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t */_refreshDatepicker:function _refreshDatepicker(target){var inst=this._getInst(target);if(inst){this._updateDatepicker(inst);}},/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t */_setDateDatepicker:function _setDateDatepicker(target,date){var inst=this._getInst(target);if(inst){this._setDate(inst,date);this._updateDatepicker(inst);this._updateAlternate(inst);}},/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t */_getDateDatepicker:function _getDateDatepicker(target,noDefault){var inst=this._getInst(target);if(inst&&!inst.inline){this._setDateFromField(inst,noDefault);}return inst?this._getDate(inst):null;},/* Handle keystrokes. */_doKeyDown:function _doKeyDown(event){var onSelect,dateStr,sel,inst=$.datepicker._getInst(event.target),handled=true,isRTL=inst.dpDiv.is(\".ui-datepicker-rtl\");inst._keyEvent=true;if($.datepicker._datepickerShowing){switch(event.keyCode){case 9:$.datepicker._hideDatepicker();handled=false;break;// hide on tab out\ncase 13:sel=$(\"td.\"+$.datepicker._dayOverClass+\":not(.\"+$.datepicker._currentClass+\")\",inst.dpDiv);if(sel[0]){$.datepicker._selectDay(event.target,inst.selectedMonth,inst.selectedYear,sel[0]);}onSelect=$.datepicker._get(inst,\"onSelect\");if(onSelect){dateStr=$.datepicker._formatDate(inst);// Trigger custom callback\nonSelect.apply(inst.input?inst.input[0]:null,[dateStr,inst]);}else{$.datepicker._hideDatepicker();}return false;// don't submit the form\ncase 27:$.datepicker._hideDatepicker();break;// hide on escape\ncase 33:$.datepicker._adjustDate(event.target,event.ctrlKey?-$.datepicker._get(inst,\"stepBigMonths\"):-$.datepicker._get(inst,\"stepMonths\"),\"M\");break;// previous month/year on page up/+ ctrl\ncase 34:$.datepicker._adjustDate(event.target,event.ctrlKey?+$.datepicker._get(inst,\"stepBigMonths\"):+$.datepicker._get(inst,\"stepMonths\"),\"M\");break;// next month/year on page down/+ ctrl\ncase 35:if(event.ctrlKey||event.metaKey){$.datepicker._clearDate(event.target);}handled=event.ctrlKey||event.metaKey;break;// clear on ctrl or command +end\ncase 36:if(event.ctrlKey||event.metaKey){$.datepicker._gotoToday(event.target);}handled=event.ctrlKey||event.metaKey;break;// current on ctrl or command +home\ncase 37:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,isRTL?+1:-1,\"D\");}handled=event.ctrlKey||event.metaKey;// -1 day on ctrl or command +left\nif(event.originalEvent.altKey){$.datepicker._adjustDate(event.target,event.ctrlKey?-$.datepicker._get(inst,\"stepBigMonths\"):-$.datepicker._get(inst,\"stepMonths\"),\"M\");}// next month/year on alt +left on Mac\nbreak;case 38:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,-7,\"D\");}handled=event.ctrlKey||event.metaKey;break;// -1 week on ctrl or command +up\ncase 39:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,isRTL?-1:+1,\"D\");}handled=event.ctrlKey||event.metaKey;// +1 day on ctrl or command +right\nif(event.originalEvent.altKey){$.datepicker._adjustDate(event.target,event.ctrlKey?+$.datepicker._get(inst,\"stepBigMonths\"):+$.datepicker._get(inst,\"stepMonths\"),\"M\");}// next month/year on alt +right\nbreak;case 40:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,+7,\"D\");}handled=event.ctrlKey||event.metaKey;break;// +1 week on ctrl or command +down\ndefault:handled=false;}}else if(event.keyCode===36&&event.ctrlKey){// display the date picker on ctrl+home\n$.datepicker._showDatepicker(this);}else{handled=false;}if(handled){event.preventDefault();event.stopPropagation();}},/* Filter entered characters - based on date format. */_doKeyPress:function _doKeyPress(event){var chars,chr,inst=$.datepicker._getInst(event.target);if($.datepicker._get(inst,\"constrainInput\")){chars=$.datepicker._possibleChars($.datepicker._get(inst,\"dateFormat\"));chr=String.fromCharCode(event.charCode==null?event.keyCode:event.charCode);return event.ctrlKey||event.metaKey||chr<\" \"||!chars||chars.indexOf(chr)>-1;}},/* Synchronise manual entry and field/alternate field. */_doKeyUp:function _doKeyUp(event){var date,inst=$.datepicker._getInst(event.target);if(inst.input.val()!==inst.lastVal){try{date=$.datepicker.parseDate($.datepicker._get(inst,\"dateFormat\"),inst.input?inst.input.val():null,$.datepicker._getFormatConfig(inst));if(date){// only if valid\n$.datepicker._setDateFromField(inst);$.datepicker._updateAlternate(inst);$.datepicker._updateDatepicker(inst);}}catch(err){}}return true;},/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t */_showDatepicker:function _showDatepicker(input){input=input.target||input;if(input.nodeName.toLowerCase()!==\"input\"){// find from button/image trigger\ninput=$(\"input\",input.parentNode)[0];}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput===input){// already here\nreturn;}var inst,beforeShow,beforeShowSettings,isFixed,offset,showAnim,duration;inst=$.datepicker._getInst(input);if($.datepicker._curInst&&$.datepicker._curInst!==inst){$.datepicker._curInst.dpDiv.stop(true,true);if(inst&&$.datepicker._datepickerShowing){$.datepicker._hideDatepicker($.datepicker._curInst.input[0]);}}beforeShow=$.datepicker._get(inst,\"beforeShow\");beforeShowSettings=beforeShow?beforeShow.apply(input,[input,inst]):{};if(beforeShowSettings===false){return;}datepicker_extendRemove(inst.settings,beforeShowSettings);inst.lastVal=null;$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){// hide cursor\ninput.value=\"\";}if(!$.datepicker._pos){// position below input\n$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight;// add the height\n}isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css(\"position\")===\"fixed\";return!isFixed;});offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;//to avoid flashes on Firefox\ninst.dpDiv.empty();// determine sizing offscreen\ninst.dpDiv.css({position:\"absolute\",display:\"block\",top:\"-1000px\"});$.datepicker._updateDatepicker(inst);// fix width for dynamic number of date pickers\n// and adjust position before showing\noffset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?\"static\":isFixed?\"fixed\":\"absolute\",display:\"none\",left:offset.left+\"px\",top:offset.top+\"px\"});if(!inst.inline){showAnim=$.datepicker._get(inst,\"showAnim\");duration=$.datepicker._get(inst,\"duration\");inst.dpDiv.css(\"z-index\",datepicker_getZindex($(input))+1);$.datepicker._datepickerShowing=true;if($.effects&&$.effects.effect[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,\"showOptions\"),duration);}else{inst.dpDiv[showAnim||\"show\"](showAnim?duration:null);}if($.datepicker._shouldFocusInput(inst)){inst.input.trigger(\"focus\");}$.datepicker._curInst=inst;}},/* Generate the date picker content. */_updateDatepicker:function _updateDatepicker(inst){this.maxRows=4;//Reset the max number of rows being displayed (see #7043)\ndatepicker_instActive=inst;// for delegate hover events\ninst.dpDiv.empty().append(this._generateHTML(inst));this._attachHandlers(inst);var origyearshtml,numMonths=this._getNumberOfMonths(inst),cols=numMonths[1],width=17,activeCell=inst.dpDiv.find(\".\"+this._dayOverClass+\" a\"),onUpdateDatepicker=$.datepicker._get(inst,\"onUpdateDatepicker\");if(activeCell.length>0){datepicker_handleMouseover.apply(activeCell.get(0));}inst.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\");if(cols>1){inst.dpDiv.addClass(\"ui-datepicker-multi-\"+cols).css(\"width\",width*cols+\"em\");}inst.dpDiv[(numMonths[0]!==1||numMonths[1]!==1?\"add\":\"remove\")+\"Class\"](\"ui-datepicker-multi\");inst.dpDiv[(this._get(inst,\"isRTL\")?\"add\":\"remove\")+\"Class\"](\"ui-datepicker-rtl\");if(inst===$.datepicker._curInst&&$.datepicker._datepickerShowing&&$.datepicker._shouldFocusInput(inst)){inst.input.trigger(\"focus\");}// Deffered render of the years select (to avoid flashes on Firefox)\nif(inst.yearshtml){origyearshtml=inst.yearshtml;setTimeout(function(){//assure that inst.yearshtml didn't change.\nif(origyearshtml===inst.yearshtml&&inst.yearshtml){inst.dpDiv.find(\"select.ui-datepicker-year\").first().replaceWith(inst.yearshtml);}origyearshtml=inst.yearshtml=null;},0);}if(onUpdateDatepicker){onUpdateDatepicker.apply(inst.input?inst.input[0]:null,[inst]);}},// #6694 - don't focus the input if it's already focused\n// this breaks the change event in IE\n// Support: IE and jQuery <1.9\n_shouldFocusInput:function _shouldFocusInput(inst){return inst.input&&inst.input.is(\":visible\")&&!inst.input.is(\":disabled\")&&!inst.input.is(\":focus\");},/* Check positioning to remain on screen. */_checkOffset:function _checkOffset(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth(),dpHeight=inst.dpDiv.outerHeight(),inputWidth=inst.input?inst.input.outerWidth():0,inputHeight=inst.input?inst.input.outerHeight():0,viewWidth=document.documentElement.clientWidth+(isFixed?0:$(document).scrollLeft()),viewHeight=document.documentElement.clientHeight+(isFixed?0:$(document).scrollTop());offset.left-=this._get(inst,\"isRTL\")?dpWidth-inputWidth:0;offset.left-=isFixed&&offset.left===inst.input.offset().left?$(document).scrollLeft():0;offset.top-=isFixed&&offset.top===inst.input.offset().top+inputHeight?$(document).scrollTop():0;// Now check if datepicker is showing outside window viewport - move to a better place if so.\noffset.left-=Math.min(offset.left,offset.left+dpWidth>viewWidth&&viewWidth>dpWidth?Math.abs(offset.left+dpWidth-viewWidth):0);offset.top-=Math.min(offset.top,offset.top+dpHeight>viewHeight&&viewHeight>dpHeight?Math.abs(dpHeight+inputHeight):0);return offset;},/* Find an object's position on the screen. */_findPos:function _findPos(obj){var position,inst=this._getInst(obj),isRTL=this._get(inst,\"isRTL\");while(obj&&(obj.type===\"hidden\"||obj.nodeType!==1||$.expr.pseudos.hidden(obj))){obj=obj[isRTL?\"previousSibling\":\"nextSibling\"];}position=$(obj).offset();return[position.left,position.top];},/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t */_hideDatepicker:function _hideDatepicker(input){var showAnim,duration,postProcess,onClose,inst=this._curInst;if(!inst||input&&inst!==$.data(input,\"datepicker\")){return;}if(this._datepickerShowing){showAnim=this._get(inst,\"showAnim\");duration=this._get(inst,\"duration\");postProcess=function postProcess(){$.datepicker._tidyDialog(inst);};// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\nif($.effects&&($.effects.effect[showAnim]||$.effects[showAnim])){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,\"showOptions\"),duration,postProcess);}else{inst.dpDiv[showAnim===\"slideDown\"?\"slideUp\":showAnim===\"fadeIn\"?\"fadeOut\":\"hide\"](showAnim?duration:null,postProcess);}if(!showAnim){postProcess();}this._datepickerShowing=false;onClose=this._get(inst,\"onClose\");if(onClose){onClose.apply(inst.input?inst.input[0]:null,[inst.input?inst.input.val():\"\",inst]);}this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:\"absolute\",left:\"0\",top:\"-100px\"});if($.blockUI){$.unblockUI();$(\"body\").append(this.dpDiv);}}this._inDialog=false;}},/* Tidy up after a dialog display. */_tidyDialog:function _tidyDialog(inst){inst.dpDiv.removeClass(this._dialogClass).off(\".ui-datepicker-calendar\");},/* Close date picker if clicked elsewhere. */_checkExternalClick:function _checkExternalClick(event){if(!$.datepicker._curInst){return;}var $target=$(event.target),inst=$.datepicker._getInst($target[0]);if($target[0].id!==$.datepicker._mainDivId&&$target.parents(\"#\"+$.datepicker._mainDivId).length===0&&!$target.hasClass($.datepicker.markerClassName)&&!$target.closest(\".\"+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)||$target.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!==inst){$.datepicker._hideDatepicker();}},/* Adjust one of the date sub-fields. */_adjustDate:function _adjustDate(id,offset,period){var target=$(id),inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return;}this._adjustInstDate(inst,offset,period);this._updateDatepicker(inst);},/* Action for current link. */_gotoToday:function _gotoToday(id){var date,target=$(id),inst=this._getInst(target[0]);if(this._get(inst,\"gotoCurrent\")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear;}else{date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();}this._notifyChange(inst);this._adjustDate(target);},/* Action for selecting a new month/year. */_selectMonthYear:function _selectMonthYear(id,select,period){var target=$(id),inst=this._getInst(target[0]);inst[\"selected\"+(period===\"M\"?\"Month\":\"Year\")]=inst[\"draw\"+(period===\"M\"?\"Month\":\"Year\")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target);},/* Action for selecting a day. */_selectDay:function _selectDay(id,month,year,td){var inst,target=$(id);if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return;}inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=parseInt($(\"a\",td).attr(\"data-date\"));inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));},/* Erase the input field and hide the date picker. */_clearDate:function _clearDate(id){var target=$(id);this._selectDate(target,\"\");},/* Update the input field with the selected date. */_selectDate:function _selectDate(id,dateStr){var onSelect,target=$(id),inst=this._getInst(target[0]);dateStr=dateStr!=null?dateStr:this._formatDate(inst);if(inst.input){inst.input.val(dateStr);}this._updateAlternate(inst);onSelect=this._get(inst,\"onSelect\");if(onSelect){onSelect.apply(inst.input?inst.input[0]:null,[dateStr,inst]);// trigger custom callback\n}else if(inst.input){inst.input.trigger(\"change\");// fire the change event\n}if(inst.inline){this._updateDatepicker(inst);}else{this._hideDatepicker();this._lastInput=inst.input[0];if(_typeof(inst.input[0])!==\"object\"){inst.input.trigger(\"focus\");// restore focus\n}this._lastInput=null;}},/* Update any alternate field to synchronise with the main field. */_updateAlternate:function _updateAlternate(inst){var altFormat,date,dateStr,altField=this._get(inst,\"altField\");if(altField){// update alternate field too\naltFormat=this._get(inst,\"altFormat\")||this._get(inst,\"dateFormat\");date=this._getDate(inst);dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));$(document).find(altField).val(dateStr);}},/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t */noWeekends:function noWeekends(date){var day=date.getDay();return[day>0&&day<6,\"\"];},/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t */iso8601Week:function iso8601Week(date){var time,checkDate=new Date(date.getTime());// Find Thursday of this week starting on Monday\ncheckDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));time=checkDate.getTime();checkDate.setMonth(0);// Compare with Jan 1\ncheckDate.setDate(1);return Math.floor(Math.round((time-checkDate)/86400000)/7)+1;},/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t */parseDate:function parseDate(format,value,settings){if(format==null||value==null){throw\"Invalid arguments\";}value=_typeof(value)===\"object\"?value.toString():value+\"\";if(value===\"\"){return null;}var iFormat,dim,extra,iValue=0,shortYearCutoffTemp=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff,shortYearCutoff=typeof shortYearCutoffTemp!==\"string\"?shortYearCutoffTemp:new Date().getFullYear()%100+parseInt(shortYearCutoffTemp,10),dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort,dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames,monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort,monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames,year=-1,month=-1,day=-1,doy=-1,literal=false,date,// Check whether a format character is doubled\nlookAhead=function lookAhead(match){var matches=iFormat+1<format.length&&format.charAt(iFormat+1)===match;if(matches){iFormat++;}return matches;},// Extract a number from the string value\ngetNumber=function getNumber(match){var isDoubled=lookAhead(match),size=match===\"@\"?14:match===\"!\"?20:match===\"y\"&&isDoubled?4:match===\"o\"?3:2,minSize=match===\"y\"?size:1,digits=new RegExp(\"^\\\\d{\"+minSize+\",\"+size+\"}\"),num=value.substring(iValue).match(digits);if(!num){throw\"Missing number at position \"+iValue;}iValue+=num[0].length;return parseInt(num[0],10);},// Extract a name from the string value and convert to an index\ngetName=function getName(match,shortNames,longNames){var index=-1,names=$.map(lookAhead(match)?longNames:shortNames,function(v,k){return[[k,v]];}).sort(function(a,b){return-(a[1].length-b[1].length);});$.each(names,function(i,pair){var name=pair[1];if(value.substr(iValue,name.length).toLowerCase()===name.toLowerCase()){index=pair[0];iValue+=name.length;return false;}});if(index!==-1){return index+1;}else{throw\"Unknown name at position \"+iValue;}},// Confirm that a literal character matches the string value\ncheckLiteral=function checkLiteral(){if(value.charAt(iValue)!==format.charAt(iFormat)){throw\"Unexpected literal at position \"+iValue;}iValue++;};for(iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)===\"'\"&&!lookAhead(\"'\")){literal=false;}else{checkLiteral();}}else{switch(format.charAt(iFormat)){case\"d\":day=getNumber(\"d\");break;case\"D\":getName(\"D\",dayNamesShort,dayNames);break;case\"o\":doy=getNumber(\"o\");break;case\"m\":month=getNumber(\"m\");break;case\"M\":month=getName(\"M\",monthNamesShort,monthNames);break;case\"y\":year=getNumber(\"y\");break;case\"@\":date=new Date(getNumber(\"@\"));year=date.getFullYear();month=date.getMonth()+1;day=date.getDate();break;case\"!\":date=new Date((getNumber(\"!\")-this._ticksTo1970)/10000);year=date.getFullYear();month=date.getMonth()+1;day=date.getDate();break;case\"'\":if(lookAhead(\"'\")){checkLiteral();}else{literal=true;}break;default:checkLiteral();}}}if(iValue<value.length){extra=value.substr(iValue);if(!/^\\s+/.test(extra)){throw\"Extra/unparsed characters found in date: \"+extra;}}if(year===-1){year=new Date().getFullYear();}else if(year<100){year+=new Date().getFullYear()-new Date().getFullYear()%100+(year<=shortYearCutoff?0:-100);}if(doy>-1){month=1;day=doy;do{dim=this._getDaysInMonth(year,month-1);if(day<=dim){break;}month++;day-=dim;}while(true);}date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!==year||date.getMonth()+1!==month||date.getDate()!==day){throw\"Invalid date\";// E.g. 31/02/00\n}return date;},/* Standard date formats. */ATOM:\"yy-mm-dd\",// RFC 3339 (ISO 8601)\nCOOKIE:\"D, dd M yy\",ISO_8601:\"yy-mm-dd\",RFC_822:\"D, d M y\",RFC_850:\"DD, dd-M-y\",RFC_1036:\"D, d M y\",RFC_1123:\"D, d M yy\",RFC_2822:\"D, d M yy\",RSS:\"D, d M y\",// RFC 822\nTICKS:\"!\",TIMESTAMP:\"@\",W3C:\"yy-mm-dd\",// ISO 8601\n_ticksTo1970:((1970-1)*365+Math.floor(1970/4)-Math.floor(1970/100)+Math.floor(1970/400))*24*60*60*10000000,/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01/01/1970)\n\t * ! - Windows ticks (100ns since 01/01/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t */formatDate:function formatDate(format,date,settings){if(!date){return\"\";}var iFormat,dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort,dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames,monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort,monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames,// Check whether a format character is doubled\nlookAhead=function lookAhead(match){var matches=iFormat+1<format.length&&format.charAt(iFormat+1)===match;if(matches){iFormat++;}return matches;},// Format a number, with leading zero if necessary\nformatNumber=function formatNumber(match,value,len){var num=\"\"+value;if(lookAhead(match)){while(num.length<len){num=\"0\"+num;}}return num;},// Format a name, short or long as requested\nformatName=function formatName(match,value,shortNames,longNames){return lookAhead(match)?longNames[value]:shortNames[value];},output=\"\",literal=false;if(date){for(iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)===\"'\"&&!lookAhead(\"'\")){literal=false;}else{output+=format.charAt(iFormat);}}else{switch(format.charAt(iFormat)){case\"d\":output+=formatNumber(\"d\",date.getDate(),2);break;case\"D\":output+=formatName(\"D\",date.getDay(),dayNamesShort,dayNames);break;case\"o\":output+=formatNumber(\"o\",Math.round((new Date(date.getFullYear(),date.getMonth(),date.getDate()).getTime()-new Date(date.getFullYear(),0,0).getTime())/86400000),3);break;case\"m\":output+=formatNumber(\"m\",date.getMonth()+1,2);break;case\"M\":output+=formatName(\"M\",date.getMonth(),monthNamesShort,monthNames);break;case\"y\":output+=lookAhead(\"y\")?date.getFullYear():(date.getFullYear()%100<10?\"0\":\"\")+date.getFullYear()%100;break;case\"@\":output+=date.getTime();break;case\"!\":output+=date.getTime()*10000+this._ticksTo1970;break;case\"'\":if(lookAhead(\"'\")){output+=\"'\";}else{literal=true;}break;default:output+=format.charAt(iFormat);}}}}return output;},/* Extract all possible characters from the date format. */_possibleChars:function _possibleChars(format){var iFormat,chars=\"\",literal=false,// Check whether a format character is doubled\nlookAhead=function lookAhead(match){var matches=iFormat+1<format.length&&format.charAt(iFormat+1)===match;if(matches){iFormat++;}return matches;};for(iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)===\"'\"&&!lookAhead(\"'\")){literal=false;}else{chars+=format.charAt(iFormat);}}else{switch(format.charAt(iFormat)){case\"d\":case\"m\":case\"y\":case\"@\":chars+=\"0123456789\";break;case\"D\":case\"M\":return null;// Accept anything\ncase\"'\":if(lookAhead(\"'\")){chars+=\"'\";}else{literal=true;}break;default:chars+=format.charAt(iFormat);}}}return chars;},/* Get a setting value, defaulting if necessary. */_get:function _get(inst,name){return inst.settings[name]!==undefined?inst.settings[name]:this._defaults[name];},/* Parse existing date and initialise date picker. */_setDateFromField:function _setDateFromField(inst,noDefault){if(inst.input.val()===inst.lastVal){return;}var dateFormat=this._get(inst,\"dateFormat\"),dates=inst.lastVal=inst.input?inst.input.val():null,defaultDate=this._getDefaultDate(inst),date=defaultDate,settings=this._getFormatConfig(inst);try{date=this.parseDate(dateFormat,dates,settings)||defaultDate;}catch(event){dates=noDefault?\"\":dates;}inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();inst.currentDay=dates?date.getDate():0;inst.currentMonth=dates?date.getMonth():0;inst.currentYear=dates?date.getFullYear():0;this._adjustInstDate(inst);},/* Retrieve the default date shown on opening. */_getDefaultDate:function _getDefaultDate(inst){return this._restrictMinMax(inst,this._determineDate(inst,this._get(inst,\"defaultDate\"),new Date()));},/* A date may be specified as an exact value or a relative one. */_determineDate:function _determineDate(inst,date,defaultDate){var offsetNumeric=function offsetNumeric(offset){var date=new Date();date.setDate(date.getDate()+offset);return date;},offsetString=function offsetString(offset){try{return $.datepicker.parseDate($.datepicker._get(inst,\"dateFormat\"),offset,$.datepicker._getFormatConfig(inst));}catch(e){// Ignore\n}var date=(offset.toLowerCase().match(/^c/)?$.datepicker._getDate(inst):null)||new Date(),year=date.getFullYear(),month=date.getMonth(),day=date.getDate(),pattern=/([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,matches=pattern.exec(offset);while(matches){switch(matches[2]||\"d\"){case\"d\":case\"D\":day+=parseInt(matches[1],10);break;case\"w\":case\"W\":day+=parseInt(matches[1],10)*7;break;case\"m\":case\"M\":month+=parseInt(matches[1],10);day=Math.min(day,$.datepicker._getDaysInMonth(year,month));break;case\"y\":case\"Y\":year+=parseInt(matches[1],10);day=Math.min(day,$.datepicker._getDaysInMonth(year,month));break;}matches=pattern.exec(offset);}return new Date(year,month,day);},newDate=date==null||date===\"\"?defaultDate:typeof date===\"string\"?offsetString(date):typeof date===\"number\"?isNaN(date)?defaultDate:offsetNumeric(date):new Date(date.getTime());newDate=newDate&&newDate.toString()===\"Invalid Date\"?defaultDate:newDate;if(newDate){newDate.setHours(0);newDate.setMinutes(0);newDate.setSeconds(0);newDate.setMilliseconds(0);}return this._daylightSavingAdjust(newDate);},/* Handle switch to/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t */_daylightSavingAdjust:function _daylightSavingAdjust(date){if(!date){return null;}date.setHours(date.getHours()>12?date.getHours()+2:0);return date;},/* Set the date(s) directly. */_setDate:function _setDate(inst,date,noChange){var clear=!date,origMonth=inst.selectedMonth,origYear=inst.selectedYear,newDate=this._restrictMinMax(inst,this._determineDate(inst,date,new Date()));inst.selectedDay=inst.currentDay=newDate.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=newDate.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=newDate.getFullYear();if((origMonth!==inst.selectedMonth||origYear!==inst.selectedYear)&&!noChange){this._notifyChange(inst);}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?\"\":this._formatDate(inst));}},/* Retrieve the date(s) directly. */_getDate:function _getDate(inst){var startDate=!inst.currentYear||inst.input&&inst.input.val()===\"\"?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));return startDate;},/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t */_attachHandlers:function _attachHandlers(inst){var stepMonths=this._get(inst,\"stepMonths\"),id=\"#\"+inst.id.replace(/\\\\\\\\/g,\"\\\\\");inst.dpDiv.find(\"[data-handler]\").map(function(){var handler={prev:function prev(){$.datepicker._adjustDate(id,-stepMonths,\"M\");},next:function next(){$.datepicker._adjustDate(id,+stepMonths,\"M\");},hide:function hide(){$.datepicker._hideDatepicker();},today:function today(){$.datepicker._gotoToday(id);},selectDay:function selectDay(){$.datepicker._selectDay(id,+this.getAttribute(\"data-month\"),+this.getAttribute(\"data-year\"),this);return false;},selectMonth:function selectMonth(){$.datepicker._selectMonthYear(id,this,\"M\");return false;},selectYear:function selectYear(){$.datepicker._selectMonthYear(id,this,\"Y\");return false;}};$(this).on(this.getAttribute(\"data-event\"),handler[this.getAttribute(\"data-handler\")]);});},/* Generate the HTML for the current state of the date picker. */_generateHTML:function _generateHTML(inst){var maxDraw,prevText,prev,nextText,next,currentText,gotoDate,controls,buttonPanel,firstDay,showWeek,dayNames,dayNamesMin,monthNames,monthNamesShort,beforeShowDay,showOtherMonths,selectOtherMonths,defaultDate,html,dow,row,group,col,selectedDate,cornerClass,calender,thead,day,daysInMonth,leadDays,curRows,numRows,printDate,dRow,tbody,daySettings,otherMonth,unselectable,tempDate=new Date(),today=this._daylightSavingAdjust(new Date(tempDate.getFullYear(),tempDate.getMonth(),tempDate.getDate())),// clear time\nisRTL=this._get(inst,\"isRTL\"),showButtonPanel=this._get(inst,\"showButtonPanel\"),hideIfNoPrevNext=this._get(inst,\"hideIfNoPrevNext\"),navigationAsDateFormat=this._get(inst,\"navigationAsDateFormat\"),numMonths=this._getNumberOfMonths(inst),showCurrentAtPos=this._get(inst,\"showCurrentAtPos\"),stepMonths=this._get(inst,\"stepMonths\"),isMultiMonth=numMonths[0]!==1||numMonths[1]!==1,currentDate=this._daylightSavingAdjust(!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)),minDate=this._getMinMaxDate(inst,\"min\"),maxDate=this._getMinMaxDate(inst,\"max\"),drawMonth=inst.drawMonth-showCurrentAtPos,drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--;}if(maxDate){maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[0]*numMonths[1]+1,maxDate.getDate()));maxDraw=minDate&&maxDraw<minDate?minDate:maxDraw;while(this._daylightSavingAdjust(new Date(drawYear,drawMonth,1))>maxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--;}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;prevText=this._get(inst,\"prevText\");prevText=!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst));if(this._canAdjustMonth(inst,-1,drawYear,drawMonth)){prev=$(\"<a>\").attr({\"class\":\"ui-datepicker-prev ui-corner-all\",\"data-handler\":\"prev\",\"data-event\":\"click\",title:prevText}).append($(\"<span>\").addClass(\"ui-icon ui-icon-circle-triangle-\"+(isRTL?\"e\":\"w\")).text(prevText))[0].outerHTML;}else if(hideIfNoPrevNext){prev=\"\";}else{prev=$(\"<a>\").attr({\"class\":\"ui-datepicker-prev ui-corner-all ui-state-disabled\",title:prevText}).append($(\"<span>\").addClass(\"ui-icon ui-icon-circle-triangle-\"+(isRTL?\"e\":\"w\")).text(prevText))[0].outerHTML;}nextText=this._get(inst,\"nextText\");nextText=!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst));if(this._canAdjustMonth(inst,+1,drawYear,drawMonth)){next=$(\"<a>\").attr({\"class\":\"ui-datepicker-next ui-corner-all\",\"data-handler\":\"next\",\"data-event\":\"click\",title:nextText}).append($(\"<span>\").addClass(\"ui-icon ui-icon-circle-triangle-\"+(isRTL?\"w\":\"e\")).text(nextText))[0].outerHTML;}else if(hideIfNoPrevNext){next=\"\";}else{next=$(\"<a>\").attr({\"class\":\"ui-datepicker-next ui-corner-all ui-state-disabled\",title:nextText}).append($(\"<span>\").attr(\"class\",\"ui-icon ui-icon-circle-triangle-\"+(isRTL?\"w\":\"e\")).text(nextText))[0].outerHTML;}currentText=this._get(inst,\"currentText\");gotoDate=this._get(inst,\"gotoCurrent\")&&inst.currentDay?currentDate:today;currentText=!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst));controls=\"\";if(!inst.inline){controls=$(\"<button>\").attr({type:\"button\",\"class\":\"ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all\",\"data-handler\":\"hide\",\"data-event\":\"click\"}).text(this._get(inst,\"closeText\"))[0].outerHTML;}buttonPanel=\"\";if(showButtonPanel){buttonPanel=$(\"<div class='ui-datepicker-buttonpane ui-widget-content'>\").append(isRTL?controls:\"\").append(this._isInRange(inst,gotoDate)?$(\"<button>\").attr({type:\"button\",\"class\":\"ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all\",\"data-handler\":\"today\",\"data-event\":\"click\"}).text(currentText):\"\").append(isRTL?\"\":controls)[0].outerHTML;}firstDay=parseInt(this._get(inst,\"firstDay\"),10);firstDay=isNaN(firstDay)?0:firstDay;showWeek=this._get(inst,\"showWeek\");dayNames=this._get(inst,\"dayNames\");dayNamesMin=this._get(inst,\"dayNamesMin\");monthNames=this._get(inst,\"monthNames\");monthNamesShort=this._get(inst,\"monthNamesShort\");beforeShowDay=this._get(inst,\"beforeShowDay\");showOtherMonths=this._get(inst,\"showOtherMonths\");selectOtherMonths=this._get(inst,\"selectOtherMonths\");defaultDate=this._getDefaultDate(inst);html=\"\";for(row=0;row<numMonths[0];row++){group=\"\";this.maxRows=4;for(col=0;col<numMonths[1];col++){selectedDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,inst.selectedDay));cornerClass=\" ui-corner-all\";calender=\"\";if(isMultiMonth){calender+=\"<div class='ui-datepicker-group\";if(numMonths[1]>1){switch(col){case 0:calender+=\" ui-datepicker-group-first\";cornerClass=\" ui-corner-\"+(isRTL?\"right\":\"left\");break;case numMonths[1]-1:calender+=\" ui-datepicker-group-last\";cornerClass=\" ui-corner-\"+(isRTL?\"left\":\"right\");break;default:calender+=\" ui-datepicker-group-middle\";cornerClass=\"\";break;}}calender+=\"'>\";}calender+=\"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\"+cornerClass+\"'>\"+(/all|left/.test(cornerClass)&&row===0?isRTL?next:prev:\"\")+(/all|right/.test(cornerClass)&&row===0?isRTL?prev:next:\"\")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,row>0||col>0,monthNames,monthNamesShort)+// draw month headers\n\"</div><table class='ui-datepicker-calendar'><thead>\"+\"<tr>\";thead=showWeek?\"<th class='ui-datepicker-week-col'>\"+this._get(inst,\"weekHeader\")+\"</th>\":\"\";for(dow=0;dow<7;dow++){// days of the week\nday=(dow+firstDay)%7;thead+=\"<th scope='col'\"+((dow+firstDay+6)%7>=5?\" class='ui-datepicker-week-end'\":\"\")+\">\"+\"<span title='\"+dayNames[day]+\"'>\"+dayNamesMin[day]+\"</span></th>\";}calender+=thead+\"</tr></thead><tbody>\";daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear===inst.selectedYear&&drawMonth===inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth);}leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;curRows=Math.ceil((leadDays+daysInMonth)/7);// calculate the number of rows to generate\nnumRows=isMultiMonth?this.maxRows>curRows?this.maxRows:curRows:curRows;//If multiple months, use the higher number of rows (see #7043)\nthis.maxRows=numRows;printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(dRow=0;dRow<numRows;dRow++){// create date picker rows\ncalender+=\"<tr>\";tbody=!showWeek?\"\":\"<td class='ui-datepicker-week-col'>\"+this._get(inst,\"calculateWeek\")(printDate)+\"</td>\";for(dow=0;dow<7;dow++){// create date picker days\ndaySettings=beforeShowDay?beforeShowDay.apply(inst.input?inst.input[0]:null,[printDate]):[true,\"\"];otherMonth=printDate.getMonth()!==drawMonth;unselectable=otherMonth&&!selectOtherMonths||!daySettings[0]||minDate&&printDate<minDate||maxDate&&printDate>maxDate;tbody+=\"<td class='\"+((dow+firstDay+6)%7>=5?\" ui-datepicker-week-end\":\"\")+(// highlight weekends\notherMonth?\" ui-datepicker-other-month\":\"\")+(// highlight days from other months\nprintDate.getTime()===selectedDate.getTime()&&drawMonth===inst.selectedMonth&&inst._keyEvent||// user pressed key\ndefaultDate.getTime()===printDate.getTime()&&defaultDate.getTime()===selectedDate.getTime()?// or defaultDate is current printedDate and defaultDate is selectedDate\n\" \"+this._dayOverClass:\"\")+(// highlight selected day\nunselectable?\" \"+this._unselectableClass+\" ui-state-disabled\":\"\")+(// highlight unselectable days\notherMonth&&!showOtherMonths?\"\":\" \"+daySettings[1]+(// highlight custom dates\nprintDate.getTime()===currentDate.getTime()?\" \"+this._currentClass:\"\")+(// highlight selected day\nprintDate.getTime()===today.getTime()?\" ui-datepicker-today\":\"\"))+\"'\"+(// highlight today (if different)\n(!otherMonth||showOtherMonths)&&daySettings[2]?\" title='\"+daySettings[2].replace(/'/g,\"&#39;\")+\"'\":\"\")+(// cell title\nunselectable?\"\":\" data-handler='selectDay' data-event='click' data-month='\"+printDate.getMonth()+\"' data-year='\"+printDate.getFullYear()+\"'\")+\">\"+(// actions\notherMonth&&!showOtherMonths?\"&#xa0;\":// display for other months\nunselectable?\"<span class='ui-state-default'>\"+printDate.getDate()+\"</span>\":\"<a class='ui-state-default\"+(printDate.getTime()===today.getTime()?\" ui-state-highlight\":\"\")+(printDate.getTime()===currentDate.getTime()?\" ui-state-active\":\"\")+(// highlight selected day\notherMonth?\" ui-priority-secondary\":\"\")+// distinguish dates from other months\n\"' href='#' aria-current='\"+(printDate.getTime()===currentDate.getTime()?\"true\":\"false\")+// mark date as selected for screen reader\n\"' data-date='\"+printDate.getDate()+// store date as data\n\"'>\"+printDate.getDate()+\"</a>\")+\"</td>\";// display selectable date\nprintDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate);}calender+=tbody+\"</tr>\";}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++;}calender+=\"</tbody></table>\"+(isMultiMonth?\"</div>\"+(numMonths[0]>0&&col===numMonths[1]-1?\"<div class='ui-datepicker-row-break'></div>\":\"\"):\"\");group+=calender;}html+=group;}html+=buttonPanel;inst._keyEvent=false;return html;},/* Generate the month and year header. */_generateMonthYearHeader:function _generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,secondary,monthNames,monthNamesShort){var inMinYear,inMaxYear,month,years,thisYear,determineYear,year,endYear,changeMonth=this._get(inst,\"changeMonth\"),changeYear=this._get(inst,\"changeYear\"),showMonthAfterYear=this._get(inst,\"showMonthAfterYear\"),selectMonthLabel=this._get(inst,\"selectMonthLabel\"),selectYearLabel=this._get(inst,\"selectYearLabel\"),html=\"<div class='ui-datepicker-title'>\",monthHtml=\"\";// Month selection\nif(secondary||!changeMonth){monthHtml+=\"<span class='ui-datepicker-month'>\"+monthNames[drawMonth]+\"</span>\";}else{inMinYear=minDate&&minDate.getFullYear()===drawYear;inMaxYear=maxDate&&maxDate.getFullYear()===drawYear;monthHtml+=\"<select class='ui-datepicker-month' aria-label='\"+selectMonthLabel+\"' data-handler='selectMonth' data-event='change'>\";for(month=0;month<12;month++){if((!inMinYear||month>=minDate.getMonth())&&(!inMaxYear||month<=maxDate.getMonth())){monthHtml+=\"<option value='\"+month+\"'\"+(month===drawMonth?\" selected='selected'\":\"\")+\">\"+monthNamesShort[month]+\"</option>\";}}monthHtml+=\"</select>\";}if(!showMonthAfterYear){html+=monthHtml+(secondary||!(changeMonth&&changeYear)?\"&#xa0;\":\"\");}// Year selection\nif(!inst.yearshtml){inst.yearshtml=\"\";if(secondary||!changeYear){html+=\"<span class='ui-datepicker-year'>\"+drawYear+\"</span>\";}else{// determine range of years to display\nyears=this._get(inst,\"yearRange\").split(\":\");thisYear=new Date().getFullYear();determineYear=function determineYear(value){var year=value.match(/c[+\\-].*/)?drawYear+parseInt(value.substring(1),10):value.match(/[+\\-].*/)?thisYear+parseInt(value,10):parseInt(value,10);return isNaN(year)?thisYear:year;};year=determineYear(years[0]);endYear=Math.max(year,determineYear(years[1]||\"\"));year=minDate?Math.max(year,minDate.getFullYear()):year;endYear=maxDate?Math.min(endYear,maxDate.getFullYear()):endYear;inst.yearshtml+=\"<select class='ui-datepicker-year' aria-label='\"+selectYearLabel+\"' data-handler='selectYear' data-event='change'>\";for(;year<=endYear;year++){inst.yearshtml+=\"<option value='\"+year+\"'\"+(year===drawYear?\" selected='selected'\":\"\")+\">\"+year+\"</option>\";}inst.yearshtml+=\"</select>\";html+=inst.yearshtml;inst.yearshtml=null;}}html+=this._get(inst,\"yearSuffix\");if(showMonthAfterYear){html+=(secondary||!(changeMonth&&changeYear)?\"&#xa0;\":\"\")+monthHtml;}html+=\"</div>\";// Close datepicker_header\nreturn html;},/* Adjust one of the date sub-fields. */_adjustInstDate:function _adjustInstDate(inst,offset,period){var year=inst.selectedYear+(period===\"Y\"?offset:0),month=inst.selectedMonth+(period===\"M\"?offset:0),day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period===\"D\"?offset:0),date=this._restrictMinMax(inst,this._daylightSavingAdjust(new Date(year,month,day)));inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period===\"M\"||period===\"Y\"){this._notifyChange(inst);}},/* Ensure a date is within any min/max bounds. */_restrictMinMax:function _restrictMinMax(inst,date){var minDate=this._getMinMaxDate(inst,\"min\"),maxDate=this._getMinMaxDate(inst,\"max\"),newDate=minDate&&date<minDate?minDate:date;return maxDate&&newDate>maxDate?maxDate:newDate;},/* Notify change of month/year. */_notifyChange:function _notifyChange(inst){var onChange=this._get(inst,\"onChangeMonthYear\");if(onChange){onChange.apply(inst.input?inst.input[0]:null,[inst.selectedYear,inst.selectedMonth+1,inst]);}},/* Determine the number of months to show. */_getNumberOfMonths:function _getNumberOfMonths(inst){var numMonths=this._get(inst,\"numberOfMonths\");return numMonths==null?[1,1]:typeof numMonths===\"number\"?[1,numMonths]:numMonths;},/* Determine the current maximum date - ensure no time components are set. */_getMinMaxDate:function _getMinMaxDate(inst,minMax){return this._determineDate(inst,this._get(inst,minMax+\"Date\"),null);},/* Find the number of days in a given month. */_getDaysInMonth:function _getDaysInMonth(year,month){return 32-this._daylightSavingAdjust(new Date(year,month,32)).getDate();},/* Find the day of the week of the first of a month. */_getFirstDayOfMonth:function _getFirstDayOfMonth(year,month){return new Date(year,month,1).getDay();},/* Determines if we should allow a \"next/prev\" month display change. */_canAdjustMonth:function _canAdjustMonth(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst),date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[0]*numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()));}return this._isInRange(inst,date);},/* Is the given date in the accepted range? */_isInRange:function _isInRange(inst,date){var yearSplit,currentYear,minDate=this._getMinMaxDate(inst,\"min\"),maxDate=this._getMinMaxDate(inst,\"max\"),minYear=null,maxYear=null,years=this._get(inst,\"yearRange\");if(years){yearSplit=years.split(\":\");currentYear=new Date().getFullYear();minYear=parseInt(yearSplit[0],10);maxYear=parseInt(yearSplit[1],10);if(yearSplit[0].match(/[+\\-].*/)){minYear+=currentYear;}if(yearSplit[1].match(/[+\\-].*/)){maxYear+=currentYear;}}return(!minDate||date.getTime()>=minDate.getTime())&&(!maxDate||date.getTime()<=maxDate.getTime())&&(!minYear||date.getFullYear()>=minYear)&&(!maxYear||date.getFullYear()<=maxYear);},/* Provide the configuration settings for formatting/parsing. */_getFormatConfig:function _getFormatConfig(inst){var shortYearCutoff=this._get(inst,\"shortYearCutoff\");shortYearCutoff=typeof shortYearCutoff!==\"string\"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10);return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,\"dayNamesShort\"),dayNames:this._get(inst,\"dayNames\"),monthNamesShort:this._get(inst,\"monthNamesShort\"),monthNames:this._get(inst,\"monthNames\")};},/* Format the given date for display. */_formatDate:function _formatDate(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear;}var date=day?_typeof(day)===\"object\"?day:this._daylightSavingAdjust(new Date(year,month,day)):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));return this.formatDate(this._get(inst,\"dateFormat\"),date,this._getFormatConfig(inst));}});/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */function datepicker_bindHover(dpDiv){var selector=\"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";return dpDiv.on(\"mouseout\",selector,function(){$(this).removeClass(\"ui-state-hover\");if(this.className.indexOf(\"ui-datepicker-prev\")!==-1){$(this).removeClass(\"ui-datepicker-prev-hover\");}if(this.className.indexOf(\"ui-datepicker-next\")!==-1){$(this).removeClass(\"ui-datepicker-next-hover\");}}).on(\"mouseover\",selector,datepicker_handleMouseover);}function datepicker_handleMouseover(){if(!$.datepicker._isDisabledDatepicker(datepicker_instActive.inline?datepicker_instActive.dpDiv.parent()[0]:datepicker_instActive.input[0])){$(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\");$(this).addClass(\"ui-state-hover\");if(this.className.indexOf(\"ui-datepicker-prev\")!==-1){$(this).addClass(\"ui-datepicker-prev-hover\");}if(this.className.indexOf(\"ui-datepicker-next\")!==-1){$(this).addClass(\"ui-datepicker-next-hover\");}}}/* jQuery extend now ignores nulls! */function datepicker_extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null){target[name]=props[name];}}return target;}/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object */$.fn.datepicker=function(options){/* Verify an empty collection wasn't passed - Fixes #6976 */if(!this.length){return this;}/* Initialise the date picker. */if(!$.datepicker.initialized){$(document).on(\"mousedown\",$.datepicker._checkExternalClick);$.datepicker.initialized=true;}/* Append datepicker main container to body if not exist. */if($(\"#\"+$.datepicker._mainDivId).length===0){$(\"body\").append($.datepicker.dpDiv);}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options===\"string\"&&(options===\"isDisabled\"||options===\"getDate\"||options===\"widget\")){return $.datepicker[\"_\"+options+\"Datepicker\"].apply($.datepicker,[this[0]].concat(otherArgs));}if(options===\"option\"&&arguments.length===2&&typeof arguments[1]===\"string\"){return $.datepicker[\"_\"+options+\"Datepicker\"].apply($.datepicker,[this[0]].concat(otherArgs));}return this.each(function(){if(typeof options===\"string\"){$.datepicker[\"_\"+options+\"Datepicker\"].apply($.datepicker,[this].concat(otherArgs));}else{$.datepicker._attachDatepicker(this,options);}});};$.datepicker=new Datepicker();// singleton instance\n$.datepicker.initialized=false;$.datepicker.uuid=new Date().getTime();$.datepicker.version=\"1.13.2\";var widgetsDatepicker=$.datepicker;// This file is deprecated\nvar ie=$.ui.ie=!!/msie [\\w.]+/.exec(navigator.userAgent.toLowerCase());/*!\n * jQuery UI Mouse 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Mouse\n//>>group: Widgets\n//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.\n//>>docs: http://api.jqueryui.com/mouse/\nvar mouseHandled=false;$(document).on(\"mouseup\",function(){mouseHandled=false;});var widgetsMouse=$.widget(\"ui.mouse\",{version:\"1.13.2\",options:{cancel:\"input, textarea, button, select, option\",distance:1,delay:0},_mouseInit:function _mouseInit(){var that=this;this.element.on(\"mousedown.\"+this.widgetName,function(event){return that._mouseDown(event);}).on(\"click.\"+this.widgetName,function(event){if(true===$.data(event.target,that.widgetName+\".preventClickEvent\")){$.removeData(event.target,that.widgetName+\".preventClickEvent\");event.stopImmediatePropagation();return false;}});this.started=false;},// TODO: make sure destroying one instance of mouse doesn't mess with\n// other instances of mouse\n_mouseDestroy:function _mouseDestroy(){this.element.off(\".\"+this.widgetName);if(this._mouseMoveDelegate){this.document.off(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).off(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);}},_mouseDown:function _mouseDown(event){// don't let more than one widget handle mouseStart\nif(mouseHandled){return;}this._mouseMoved=false;// We may have missed mouseup (out of window)\nif(this._mouseStarted){this._mouseUp(event);}this._mouseDownEvent=event;var that=this,btnIsLeft=event.which===1,// event.target.nodeName works around a bug in IE 8 with\n// disabled inputs (#7620)\nelIsCancel=typeof this.options.cancel===\"string\"&&event.target.nodeName?$(event.target).closest(this.options.cancel).length:false;if(!btnIsLeft||elIsCancel||!this._mouseCapture(event)){return true;}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){that.mouseDelayMet=true;},this.options.delay);}if(this._mouseDistanceMet(event)&&this._mouseDelayMet(event)){this._mouseStarted=this._mouseStart(event)!==false;if(!this._mouseStarted){event.preventDefault();return true;}}// Click event may never have fired (Gecko & Opera)\nif(true===$.data(event.target,this.widgetName+\".preventClickEvent\")){$.removeData(event.target,this.widgetName+\".preventClickEvent\");}// These delegates are required to keep context\nthis._mouseMoveDelegate=function(event){return that._mouseMove(event);};this._mouseUpDelegate=function(event){return that._mouseUp(event);};this.document.on(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).on(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);event.preventDefault();mouseHandled=true;return true;},_mouseMove:function _mouseMove(event){// Only check for mouseups outside the document if you've moved inside the document\n// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n// fire a mousemove event if content is placed under the cursor. See #7778\n// Support: IE <9\nif(this._mouseMoved){// IE mouseup check - mouseup happened when mouse was out of window\nif($.ui.ie&&(!document.documentMode||document.documentMode<9)&&!event.button){return this._mouseUp(event);// Iframe mouseup check - mouseup occurred in another document\n}else if(!event.which){// Support: Safari <=8 - 9\n// Safari sets which to 0 if you press any of the following keys\n// during a drag (#14461)\nif(event.originalEvent.altKey||event.originalEvent.ctrlKey||event.originalEvent.metaKey||event.originalEvent.shiftKey){this.ignoreMissingWhich=true;}else if(!this.ignoreMissingWhich){return this._mouseUp(event);}}}if(event.which||event.button){this._mouseMoved=true;}if(this._mouseStarted){this._mouseDrag(event);return event.preventDefault();}if(this._mouseDistanceMet(event)&&this._mouseDelayMet(event)){this._mouseStarted=this._mouseStart(this._mouseDownEvent,event)!==false;if(this._mouseStarted){this._mouseDrag(event);}else{this._mouseUp(event);}}return!this._mouseStarted;},_mouseUp:function _mouseUp(event){this.document.off(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).off(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(event.target===this._mouseDownEvent.target){$.data(event.target,this.widgetName+\".preventClickEvent\",true);}this._mouseStop(event);}if(this._mouseDelayTimer){clearTimeout(this._mouseDelayTimer);delete this._mouseDelayTimer;}this.ignoreMissingWhich=false;mouseHandled=false;event.preventDefault();},_mouseDistanceMet:function _mouseDistanceMet(event){return Math.max(Math.abs(this._mouseDownEvent.pageX-event.pageX),Math.abs(this._mouseDownEvent.pageY-event.pageY))>=this.options.distance;},_mouseDelayMet:function/* event */_mouseDelayMet(){return this.mouseDelayMet;},// These are placeholder methods, to be overriden by extending plugin\n_mouseStart:function/* event */_mouseStart(){},_mouseDrag:function/* event */_mouseDrag(){},_mouseStop:function/* event */_mouseStop(){},_mouseCapture:function/* event */_mouseCapture(){return true;}});// $.ui.plugin is deprecated. Use $.widget() extensions instead.\nvar plugin=$.ui.plugin={add:function add(module,option,set){var i,proto=$.ui[module].prototype;for(i in set){proto.plugins[i]=proto.plugins[i]||[];proto.plugins[i].push([option,set[i]]);}},call:function call(instance,name,args,allowDisconnected){var i,set=instance.plugins[name];if(!set){return;}if(!allowDisconnected&&(!instance.element[0].parentNode||instance.element[0].parentNode.nodeType===11)){return;}for(i=0;i<set.length;i++){if(instance.options[set[i][0]]){set[i][1].apply(instance.element,args);}}}};var safeBlur=$.ui.safeBlur=function(element){// Support: IE9 - 10 only\n// If the <body> is blurred, IE will switch windows, see #9420\nif(element&&element.nodeName.toLowerCase()!==\"body\"){$(element).trigger(\"blur\");}};/*!\n * jQuery UI Draggable 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Draggable\n//>>group: Interactions\n//>>description: Enables dragging functionality for any element.\n//>>docs: http://api.jqueryui.com/draggable/\n//>>demos: http://jqueryui.com/draggable/\n//>>css.structure: ../../themes/base/draggable.css\n$.widget(\"ui.draggable\",$.ui.mouse,{version:\"1.13.2\",widgetEventPrefix:\"drag\",options:{addClasses:true,appendTo:\"parent\",axis:false,connectToSortable:false,containment:false,cursor:\"auto\",cursorAt:false,grid:false,handle:false,helper:\"original\",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:\"default\",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:\"both\",snapTolerance:20,stack:false,zIndex:false,// Callbacks\ndrag:null,start:null,stop:null},_create:function _create(){if(this.options.helper===\"original\"){this._setPositionRelative();}if(this.options.addClasses){this._addClass(\"ui-draggable\");}this._setHandleClassName();this._mouseInit();},_setOption:function _setOption(key,value){this._super(key,value);if(key===\"handle\"){this._removeHandleClassName();this._setHandleClassName();}},_destroy:function _destroy(){if((this.helper||this.element).is(\".ui-draggable-dragging\")){this.destroyOnClear=true;return;}this._removeHandleClassName();this._mouseDestroy();},_mouseCapture:function _mouseCapture(event){var o=this.options;// Among others, prevent a drag on a resizable-handle\nif(this.helper||o.disabled||$(event.target).closest(\".ui-resizable-handle\").length>0){return false;}//Quit if we're not on a valid handle\nthis.handle=this._getHandle(event);if(!this.handle){return false;}this._blurActiveElement(event);this._blockFrames(o.iframeFix===true?\"iframe\":o.iframeFix);return true;},_blockFrames:function _blockFrames(selector){this.iframeBlocks=this.document.find(selector).map(function(){var iframe=$(this);return $(\"<div>\").css(\"position\",\"absolute\").appendTo(iframe.parent()).outerWidth(iframe.outerWidth()).outerHeight(iframe.outerHeight()).offset(iframe.offset())[0];});},_unblockFrames:function _unblockFrames(){if(this.iframeBlocks){this.iframeBlocks.remove();delete this.iframeBlocks;}},_blurActiveElement:function _blurActiveElement(event){var activeElement=$.ui.safeActiveElement(this.document[0]),target=$(event.target);// Don't blur if the event occurred on an element that is within\n// the currently focused element\n// See #10527, #12472\nif(target.closest(activeElement).length){return;}// Blur any element that currently has focus, see #4261\n$.ui.safeBlur(activeElement);},_mouseStart:function _mouseStart(event){var o=this.options;//Create and append the visible helper\nthis.helper=this._createHelper(event);this._addClass(this.helper,\"ui-draggable-dragging\");//Cache the helper size\nthis._cacheHelperProportions();//If ddmanager is used for droppables, set the global draggable\nif($.ui.ddmanager){$.ui.ddmanager.current=this;}/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */ //Cache the margins of the original element\nthis._cacheMargins();//Store the helper's css position\nthis.cssPosition=this.helper.css(\"position\");this.scrollParent=this.helper.scrollParent(true);this.offsetParent=this.helper.offsetParent();this.hasFixedAncestor=this.helper.parents().filter(function(){return $(this).css(\"position\")===\"fixed\";}).length>0;//The element's absolute position on the page minus margins\nthis.positionAbs=this.element.offset();this._refreshOffsets(event);//Generate the original position\nthis.originalPosition=this.position=this._generatePosition(event,false);this.originalPageX=event.pageX;this.originalPageY=event.pageY;//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\nif(o.cursorAt){this._adjustOffsetFromHelper(o.cursorAt);}//Set a containment if given in the options\nthis._setContainment();//Trigger event + callbacks\nif(this._trigger(\"start\",event)===false){this._clear();return false;}//Recache the helper size\nthis._cacheHelperProportions();//Prepare the droppable offsets\nif($.ui.ddmanager&&!o.dropBehaviour){$.ui.ddmanager.prepareOffsets(this,event);}// Execute the drag once - this causes the helper not to be visible before getting its\n// correct position\nthis._mouseDrag(event,true);// If the ddmanager is used for droppables, inform the manager that dragging has started\n// (see #5003)\nif($.ui.ddmanager){$.ui.ddmanager.dragStart(this,event);}return true;},_refreshOffsets:function _refreshOffsets(event){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:false,parent:this._getParentOffset(),relative:this._getRelativeOffset()};this.offset.click={left:event.pageX-this.offset.left,top:event.pageY-this.offset.top};},_mouseDrag:function _mouseDrag(event,noPropagation){// reset any necessary cached properties (see #5009)\nif(this.hasFixedAncestor){this.offset.parent=this._getParentOffset();}//Compute the helpers position\nthis.position=this._generatePosition(event,true);this.positionAbs=this._convertPositionTo(\"absolute\");//Call plugins and callbacks and use the resulting position if something is returned\nif(!noPropagation){var ui=this._uiHash();if(this._trigger(\"drag\",event,ui)===false){this._mouseUp(new $.Event(\"mouseup\",event));return false;}this.position=ui.position;}this.helper[0].style.left=this.position.left+\"px\";this.helper[0].style.top=this.position.top+\"px\";if($.ui.ddmanager){$.ui.ddmanager.drag(this,event);}return false;},_mouseStop:function _mouseStop(event){//If we are using droppables, inform the manager about the drop\nvar that=this,dropped=false;if($.ui.ddmanager&&!this.options.dropBehaviour){dropped=$.ui.ddmanager.drop(this,event);}//if a drop comes from outside (a sortable)\nif(this.dropped){dropped=this.dropped;this.dropped=false;}if(this.options.revert===\"invalid\"&&!dropped||this.options.revert===\"valid\"&&dropped||this.options.revert===true||typeof this.options.revert===\"function\"&&this.options.revert.call(this.element,dropped)){$(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){if(that._trigger(\"stop\",event)!==false){that._clear();}});}else{if(this._trigger(\"stop\",event)!==false){this._clear();}}return false;},_mouseUp:function _mouseUp(event){this._unblockFrames();// If the ddmanager is used for droppables, inform the manager that dragging has stopped\n// (see #5003)\nif($.ui.ddmanager){$.ui.ddmanager.dragStop(this,event);}// Only need to focus if the event occurred on the draggable itself, see #10527\nif(this.handleElement.is(event.target)){// The interaction is over; whether or not the click resulted in a drag,\n// focus the element\nthis.element.trigger(\"focus\");}return $.ui.mouse.prototype._mouseUp.call(this,event);},cancel:function cancel(){if(this.helper.is(\".ui-draggable-dragging\")){this._mouseUp(new $.Event(\"mouseup\",{target:this.element[0]}));}else{this._clear();}return this;},_getHandle:function _getHandle(event){return this.options.handle?!!$(event.target).closest(this.element.find(this.options.handle)).length:true;},_setHandleClassName:function _setHandleClassName(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element;this._addClass(this.handleElement,\"ui-draggable-handle\");},_removeHandleClassName:function _removeHandleClassName(){this._removeClass(this.handleElement,\"ui-draggable-handle\");},_createHelper:function _createHelper(event){var o=this.options,helperIsFunction=typeof o.helper===\"function\",helper=helperIsFunction?$(o.helper.apply(this.element[0],[event])):o.helper===\"clone\"?this.element.clone().removeAttr(\"id\"):this.element;if(!helper.parents(\"body\").length){helper.appendTo(o.appendTo===\"parent\"?this.element[0].parentNode:o.appendTo);}// Http://bugs.jqueryui.com/ticket/9446\n// a helper function can return the original element\n// which wouldn't have been set to relative in _create\nif(helperIsFunction&&helper[0]===this.element[0]){this._setPositionRelative();}if(helper[0]!==this.element[0]&&!/(fixed|absolute)/.test(helper.css(\"position\"))){helper.css(\"position\",\"absolute\");}return helper;},_setPositionRelative:function _setPositionRelative(){if(!/^(?:r|a|f)/.test(this.element.css(\"position\"))){this.element[0].style.position=\"relative\";}},_adjustOffsetFromHelper:function _adjustOffsetFromHelper(obj){if(typeof obj===\"string\"){obj=obj.split(\" \");}if(Array.isArray(obj)){obj={left:+obj[0],top:+obj[1]||0};}if(\"left\"in obj){this.offset.click.left=obj.left+this.margins.left;}if(\"right\"in obj){this.offset.click.left=this.helperProportions.width-obj.right+this.margins.left;}if(\"top\"in obj){this.offset.click.top=obj.top+this.margins.top;}if(\"bottom\"in obj){this.offset.click.top=this.helperProportions.height-obj.bottom+this.margins.top;}},_isRootNode:function _isRootNode(element){return /(html|body)/i.test(element.tagName)||element===this.document[0];},_getParentOffset:function _getParentOffset(){//Get the offsetParent and cache its position\nvar po=this.offsetParent.offset(),document=this.document[0];// This is a special case where we need to modify a offset calculated on start, since the\n// following happened:\n// 1. The position of the helper is absolute, so it's position is calculated based on the\n// next positioned parent\n// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n// the document, which means that the scroll is included in the initial calculation of the\n// offset of the parent, and never recalculated upon drag\nif(this.cssPosition===\"absolute\"&&this.scrollParent[0]!==document&&$.contains(this.scrollParent[0],this.offsetParent[0])){po.left+=this.scrollParent.scrollLeft();po.top+=this.scrollParent.scrollTop();}if(this._isRootNode(this.offsetParent[0])){po={top:0,left:0};}return{top:po.top+(parseInt(this.offsetParent.css(\"borderTopWidth\"),10)||0),left:po.left+(parseInt(this.offsetParent.css(\"borderLeftWidth\"),10)||0)};},_getRelativeOffset:function _getRelativeOffset(){if(this.cssPosition!==\"relative\"){return{top:0,left:0};}var p=this.element.position(),scrollIsRootNode=this._isRootNode(this.scrollParent[0]);return{top:p.top-(parseInt(this.helper.css(\"top\"),10)||0)+(!scrollIsRootNode?this.scrollParent.scrollTop():0),left:p.left-(parseInt(this.helper.css(\"left\"),10)||0)+(!scrollIsRootNode?this.scrollParent.scrollLeft():0)};},_cacheMargins:function _cacheMargins(){this.margins={left:parseInt(this.element.css(\"marginLeft\"),10)||0,top:parseInt(this.element.css(\"marginTop\"),10)||0,right:parseInt(this.element.css(\"marginRight\"),10)||0,bottom:parseInt(this.element.css(\"marginBottom\"),10)||0};},_cacheHelperProportions:function _cacheHelperProportions(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()};},_setContainment:function _setContainment(){var isUserScrollable,c,ce,o=this.options,document=this.document[0];this.relativeContainer=null;if(!o.containment){this.containment=null;return;}if(o.containment===\"window\"){this.containment=[$(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,$(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,$(window).scrollLeft()+$(window).width()-this.helperProportions.width-this.margins.left,$(window).scrollTop()+($(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];return;}if(o.containment===\"document\"){this.containment=[0,0,$(document).width()-this.helperProportions.width-this.margins.left,($(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];return;}if(o.containment.constructor===Array){this.containment=o.containment;return;}if(o.containment===\"parent\"){o.containment=this.helper[0].parentNode;}c=$(o.containment);ce=c[0];if(!ce){return;}isUserScrollable=/(scroll|auto)/.test(c.css(\"overflow\"));this.containment=[(parseInt(c.css(\"borderLeftWidth\"),10)||0)+(parseInt(c.css(\"paddingLeft\"),10)||0),(parseInt(c.css(\"borderTopWidth\"),10)||0)+(parseInt(c.css(\"paddingTop\"),10)||0),(isUserScrollable?Math.max(ce.scrollWidth,ce.offsetWidth):ce.offsetWidth)-(parseInt(c.css(\"borderRightWidth\"),10)||0)-(parseInt(c.css(\"paddingRight\"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(isUserScrollable?Math.max(ce.scrollHeight,ce.offsetHeight):ce.offsetHeight)-(parseInt(c.css(\"borderBottomWidth\"),10)||0)-(parseInt(c.css(\"paddingBottom\"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relativeContainer=c;},_convertPositionTo:function _convertPositionTo(d,pos){if(!pos){pos=this.position;}var mod=d===\"absolute\"?1:-1,scrollIsRootNode=this._isRootNode(this.scrollParent[0]);return{top:// The absolute mouse position\npos.top+// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.top*mod+// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.top*mod-(this.cssPosition===\"fixed\"?-this.offset.scroll.top:scrollIsRootNode?0:this.offset.scroll.top)*mod,left:// The absolute mouse position\npos.left+// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.left*mod+// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.left*mod-(this.cssPosition===\"fixed\"?-this.offset.scroll.left:scrollIsRootNode?0:this.offset.scroll.left)*mod};},_generatePosition:function _generatePosition(event,constrainPosition){var containment,co,top,left,o=this.options,scrollIsRootNode=this._isRootNode(this.scrollParent[0]),pageX=event.pageX,pageY=event.pageY;// Cache the scroll\nif(!scrollIsRootNode||!this.offset.scroll){this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()};}/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */ // If we are not dragging yet, we won't check for options\nif(constrainPosition){if(this.containment){if(this.relativeContainer){co=this.relativeContainer.offset();containment=[this.containment[0]+co.left,this.containment[1]+co.top,this.containment[2]+co.left,this.containment[3]+co.top];}else{containment=this.containment;}if(event.pageX-this.offset.click.left<containment[0]){pageX=containment[0]+this.offset.click.left;}if(event.pageY-this.offset.click.top<containment[1]){pageY=containment[1]+this.offset.click.top;}if(event.pageX-this.offset.click.left>containment[2]){pageX=containment[2]+this.offset.click.left;}if(event.pageY-this.offset.click.top>containment[3]){pageY=containment[3]+this.offset.click.top;}}if(o.grid){//Check for grid elements set to 0 to prevent divide by 0 error causing invalid\n// argument errors in IE (see ticket #6950)\ntop=o.grid[1]?this.originalPageY+Math.round((pageY-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY;pageY=containment?top-this.offset.click.top>=containment[1]||top-this.offset.click.top>containment[3]?top:top-this.offset.click.top>=containment[1]?top-o.grid[1]:top+o.grid[1]:top;left=o.grid[0]?this.originalPageX+Math.round((pageX-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX;pageX=containment?left-this.offset.click.left>=containment[0]||left-this.offset.click.left>containment[2]?left:left-this.offset.click.left>=containment[0]?left-o.grid[0]:left+o.grid[0]:left;}if(o.axis===\"y\"){pageX=this.originalPageX;}if(o.axis===\"x\"){pageY=this.originalPageY;}}return{top:// The absolute mouse position\npageY-// Click offset (relative to the element)\nthis.offset.click.top-// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.top-// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.top+(this.cssPosition===\"fixed\"?-this.offset.scroll.top:scrollIsRootNode?0:this.offset.scroll.top),left:// The absolute mouse position\npageX-// Click offset (relative to the element)\nthis.offset.click.left-// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.left-// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.left+(this.cssPosition===\"fixed\"?-this.offset.scroll.left:scrollIsRootNode?0:this.offset.scroll.left)};},_clear:function _clear(){this._removeClass(this.helper,\"ui-draggable-dragging\");if(this.helper[0]!==this.element[0]&&!this.cancelHelperRemoval){this.helper.remove();}this.helper=null;this.cancelHelperRemoval=false;if(this.destroyOnClear){this.destroy();}},// From now on bulk stuff - mainly helpers\n_trigger:function _trigger(type,event,ui){ui=ui||this._uiHash();$.ui.plugin.call(this,type,[event,ui,this],true);// Absolute position and offset (see #6884 ) have to be recalculated after plugins\nif(/^(drag|start|stop)/.test(type)){this.positionAbs=this._convertPositionTo(\"absolute\");ui.offset=this.positionAbs;}return $.Widget.prototype._trigger.call(this,type,event,ui);},plugins:{},_uiHash:function _uiHash(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs};}});$.ui.plugin.add(\"draggable\",\"connectToSortable\",{start:function start(event,ui,draggable){var uiSortable=$.extend({},ui,{item:draggable.element});draggable.sortables=[];$(draggable.options.connectToSortable).each(function(){var sortable=$(this).sortable(\"instance\");if(sortable&&!sortable.options.disabled){draggable.sortables.push(sortable);// RefreshPositions is called at drag start to refresh the containerCache\n// which is used in drag. This ensures it's initialized and synchronized\n// with any changes that might have happened on the page since initialization.\nsortable.refreshPositions();sortable._trigger(\"activate\",event,uiSortable);}});},stop:function stop(event,ui,draggable){var uiSortable=$.extend({},ui,{item:draggable.element});draggable.cancelHelperRemoval=false;$.each(draggable.sortables,function(){var sortable=this;if(sortable.isOver){sortable.isOver=0;// Allow this sortable to handle removing the helper\ndraggable.cancelHelperRemoval=true;sortable.cancelHelperRemoval=false;// Use _storedCSS To restore properties in the sortable,\n// as this also handles revert (#9675) since the draggable\n// may have modified them in unexpected ways (#8809)\nsortable._storedCSS={position:sortable.placeholder.css(\"position\"),top:sortable.placeholder.css(\"top\"),left:sortable.placeholder.css(\"left\")};sortable._mouseStop(event);// Once drag has ended, the sortable should return to using\n// its original helper, not the shared helper from draggable\nsortable.options.helper=sortable.options._helper;}else{// Prevent this Sortable from removing the helper.\n// However, don't set the draggable to remove the helper\n// either as another connected Sortable may yet handle the removal.\nsortable.cancelHelperRemoval=true;sortable._trigger(\"deactivate\",event,uiSortable);}});},drag:function drag(event,ui,draggable){$.each(draggable.sortables,function(){var innermostIntersecting=false,sortable=this;// Copy over variables that sortable's _intersectsWith uses\nsortable.positionAbs=draggable.positionAbs;sortable.helperProportions=draggable.helperProportions;sortable.offset.click=draggable.offset.click;if(sortable._intersectsWith(sortable.containerCache)){innermostIntersecting=true;$.each(draggable.sortables,function(){// Copy over variables that sortable's _intersectsWith uses\nthis.positionAbs=draggable.positionAbs;this.helperProportions=draggable.helperProportions;this.offset.click=draggable.offset.click;if(this!==sortable&&this._intersectsWith(this.containerCache)&&$.contains(sortable.element[0],this.element[0])){innermostIntersecting=false;}return innermostIntersecting;});}if(innermostIntersecting){// If it intersects, we use a little isOver variable and set it once,\n// so that the move-in stuff gets fired only once.\nif(!sortable.isOver){sortable.isOver=1;// Store draggable's parent in case we need to reappend to it later.\ndraggable._parent=ui.helper.parent();sortable.currentItem=ui.helper.appendTo(sortable.element).data(\"ui-sortable-item\",true);// Store helper option to later restore it\nsortable.options._helper=sortable.options.helper;sortable.options.helper=function(){return ui.helper[0];};// Fire the start events of the sortable with our passed browser event,\n// and our own helper (so it doesn't create a new one)\nevent.target=sortable.currentItem[0];sortable._mouseCapture(event,true);sortable._mouseStart(event,true,true);// Because the browser event is way off the new appended portlet,\n// modify necessary variables to reflect the changes\nsortable.offset.click.top=draggable.offset.click.top;sortable.offset.click.left=draggable.offset.click.left;sortable.offset.parent.left-=draggable.offset.parent.left-sortable.offset.parent.left;sortable.offset.parent.top-=draggable.offset.parent.top-sortable.offset.parent.top;draggable._trigger(\"toSortable\",event);// Inform draggable that the helper is in a valid drop zone,\n// used solely in the revert option to handle \"valid/invalid\".\ndraggable.dropped=sortable.element;// Need to refreshPositions of all sortables in the case that\n// adding to one sortable changes the location of the other sortables (#9675)\n$.each(draggable.sortables,function(){this.refreshPositions();});// Hack so receive/update callbacks work (mostly)\ndraggable.currentItem=draggable.element;sortable.fromOutside=draggable;}if(sortable.currentItem){sortable._mouseDrag(event);// Copy the sortable's position because the draggable's can potentially reflect\n// a relative position, while sortable is always absolute, which the dragged\n// element has now become. (#8809)\nui.position=sortable.position;}}else{// If it doesn't intersect with the sortable, and it intersected before,\n// we fake the drag stop of the sortable, but make sure it doesn't remove\n// the helper by using cancelHelperRemoval.\nif(sortable.isOver){sortable.isOver=0;sortable.cancelHelperRemoval=true;// Calling sortable's mouseStop would trigger a revert,\n// so revert must be temporarily false until after mouseStop is called.\nsortable.options._revert=sortable.options.revert;sortable.options.revert=false;sortable._trigger(\"out\",event,sortable._uiHash(sortable));sortable._mouseStop(event,true);// Restore sortable behaviors that were modfied\n// when the draggable entered the sortable area (#9481)\nsortable.options.revert=sortable.options._revert;sortable.options.helper=sortable.options._helper;if(sortable.placeholder){sortable.placeholder.remove();}// Restore and recalculate the draggable's offset considering the sortable\n// may have modified them in unexpected ways. (#8809, #10669)\nui.helper.appendTo(draggable._parent);draggable._refreshOffsets(event);ui.position=draggable._generatePosition(event,true);draggable._trigger(\"fromSortable\",event);// Inform draggable that the helper is no longer in a valid drop zone\ndraggable.dropped=false;// Need to refreshPositions of all sortables just in case removing\n// from one sortable changes the location of other sortables (#9675)\n$.each(draggable.sortables,function(){this.refreshPositions();});}}});}});$.ui.plugin.add(\"draggable\",\"cursor\",{start:function start(event,ui,instance){var t=$(\"body\"),o=instance.options;if(t.css(\"cursor\")){o._cursor=t.css(\"cursor\");}t.css(\"cursor\",o.cursor);},stop:function stop(event,ui,instance){var o=instance.options;if(o._cursor){$(\"body\").css(\"cursor\",o._cursor);}}});$.ui.plugin.add(\"draggable\",\"opacity\",{start:function start(event,ui,instance){var t=$(ui.helper),o=instance.options;if(t.css(\"opacity\")){o._opacity=t.css(\"opacity\");}t.css(\"opacity\",o.opacity);},stop:function stop(event,ui,instance){var o=instance.options;if(o._opacity){$(ui.helper).css(\"opacity\",o._opacity);}}});$.ui.plugin.add(\"draggable\",\"scroll\",{start:function start(event,ui,i){if(!i.scrollParentNotHidden){i.scrollParentNotHidden=i.helper.scrollParent(false);}if(i.scrollParentNotHidden[0]!==i.document[0]&&i.scrollParentNotHidden[0].tagName!==\"HTML\"){i.overflowOffset=i.scrollParentNotHidden.offset();}},drag:function drag(event,ui,i){var o=i.options,scrolled=false,scrollParent=i.scrollParentNotHidden[0],document=i.document[0];if(scrollParent!==document&&scrollParent.tagName!==\"HTML\"){if(!o.axis||o.axis!==\"x\"){if(i.overflowOffset.top+scrollParent.offsetHeight-event.pageY<o.scrollSensitivity){scrollParent.scrollTop=scrolled=scrollParent.scrollTop+o.scrollSpeed;}else if(event.pageY-i.overflowOffset.top<o.scrollSensitivity){scrollParent.scrollTop=scrolled=scrollParent.scrollTop-o.scrollSpeed;}}if(!o.axis||o.axis!==\"y\"){if(i.overflowOffset.left+scrollParent.offsetWidth-event.pageX<o.scrollSensitivity){scrollParent.scrollLeft=scrolled=scrollParent.scrollLeft+o.scrollSpeed;}else if(event.pageX-i.overflowOffset.left<o.scrollSensitivity){scrollParent.scrollLeft=scrolled=scrollParent.scrollLeft-o.scrollSpeed;}}}else{if(!o.axis||o.axis!==\"x\"){if(event.pageY-$(document).scrollTop()<o.scrollSensitivity){scrolled=$(document).scrollTop($(document).scrollTop()-o.scrollSpeed);}else if($(window).height()-(event.pageY-$(document).scrollTop())<o.scrollSensitivity){scrolled=$(document).scrollTop($(document).scrollTop()+o.scrollSpeed);}}if(!o.axis||o.axis!==\"y\"){if(event.pageX-$(document).scrollLeft()<o.scrollSensitivity){scrolled=$(document).scrollLeft($(document).scrollLeft()-o.scrollSpeed);}else if($(window).width()-(event.pageX-$(document).scrollLeft())<o.scrollSensitivity){scrolled=$(document).scrollLeft($(document).scrollLeft()+o.scrollSpeed);}}}if(scrolled!==false&&$.ui.ddmanager&&!o.dropBehaviour){$.ui.ddmanager.prepareOffsets(i,event);}}});$.ui.plugin.add(\"draggable\",\"snap\",{start:function start(event,ui,i){var o=i.options;i.snapElements=[];$(o.snap.constructor!==String?o.snap.items||\":data(ui-draggable)\":o.snap).each(function(){var $t=$(this),$o=$t.offset();if(this!==i.element[0]){i.snapElements.push({item:this,width:$t.outerWidth(),height:$t.outerHeight(),top:$o.top,left:$o.left});}});},drag:function drag(event,ui,inst){var ts,bs,ls,rs,l,r,t,b,i,first,o=inst.options,d=o.snapTolerance,x1=ui.offset.left,x2=x1+inst.helperProportions.width,y1=ui.offset.top,y2=y1+inst.helperProportions.height;for(i=inst.snapElements.length-1;i>=0;i--){l=inst.snapElements[i].left-inst.margins.left;r=l+inst.snapElements[i].width;t=inst.snapElements[i].top-inst.margins.top;b=t+inst.snapElements[i].height;if(x2<l-d||x1>r+d||y2<t-d||y1>b+d||!$.contains(inst.snapElements[i].item.ownerDocument,inst.snapElements[i].item)){if(inst.snapElements[i].snapping){if(inst.options.snap.release){inst.options.snap.release.call(inst.element,event,$.extend(inst._uiHash(),{snapItem:inst.snapElements[i].item}));}}inst.snapElements[i].snapping=false;continue;}if(o.snapMode!==\"inner\"){ts=Math.abs(t-y2)<=d;bs=Math.abs(b-y1)<=d;ls=Math.abs(l-x2)<=d;rs=Math.abs(r-x1)<=d;if(ts){ui.position.top=inst._convertPositionTo(\"relative\",{top:t-inst.helperProportions.height,left:0}).top;}if(bs){ui.position.top=inst._convertPositionTo(\"relative\",{top:b,left:0}).top;}if(ls){ui.position.left=inst._convertPositionTo(\"relative\",{top:0,left:l-inst.helperProportions.width}).left;}if(rs){ui.position.left=inst._convertPositionTo(\"relative\",{top:0,left:r}).left;}}first=ts||bs||ls||rs;if(o.snapMode!==\"outer\"){ts=Math.abs(t-y1)<=d;bs=Math.abs(b-y2)<=d;ls=Math.abs(l-x1)<=d;rs=Math.abs(r-x2)<=d;if(ts){ui.position.top=inst._convertPositionTo(\"relative\",{top:t,left:0}).top;}if(bs){ui.position.top=inst._convertPositionTo(\"relative\",{top:b-inst.helperProportions.height,left:0}).top;}if(ls){ui.position.left=inst._convertPositionTo(\"relative\",{top:0,left:l}).left;}if(rs){ui.position.left=inst._convertPositionTo(\"relative\",{top:0,left:r-inst.helperProportions.width}).left;}}if(!inst.snapElements[i].snapping&&(ts||bs||ls||rs||first)){if(inst.options.snap.snap){inst.options.snap.snap.call(inst.element,event,$.extend(inst._uiHash(),{snapItem:inst.snapElements[i].item}));}}inst.snapElements[i].snapping=ts||bs||ls||rs||first;}}});$.ui.plugin.add(\"draggable\",\"stack\",{start:function start(event,ui,instance){var min,o=instance.options,group=$.makeArray($(o.stack)).sort(function(a,b){return(parseInt($(a).css(\"zIndex\"),10)||0)-(parseInt($(b).css(\"zIndex\"),10)||0);});if(!group.length){return;}min=parseInt($(group[0]).css(\"zIndex\"),10)||0;$(group).each(function(i){$(this).css(\"zIndex\",min+i);});this.css(\"zIndex\",min+group.length);}});$.ui.plugin.add(\"draggable\",\"zIndex\",{start:function start(event,ui,instance){var t=$(ui.helper),o=instance.options;if(t.css(\"zIndex\")){o._zIndex=t.css(\"zIndex\");}t.css(\"zIndex\",o.zIndex);},stop:function stop(event,ui,instance){var o=instance.options;if(o._zIndex){$(ui.helper).css(\"zIndex\",o._zIndex);}}});var widgetsDraggable=$.ui.draggable;/*!\n * jQuery UI Resizable 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Resizable\n//>>group: Interactions\n//>>description: Enables resize functionality for any element.\n//>>docs: http://api.jqueryui.com/resizable/\n//>>demos: http://jqueryui.com/resizable/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/resizable.css\n//>>css.theme: ../../themes/base/theme.css\n$.widget(\"ui.resizable\",$.ui.mouse,{version:\"1.13.2\",widgetEventPrefix:\"resize\",options:{alsoResize:false,animate:false,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:false,autoHide:false,classes:{\"ui-resizable-se\":\"ui-icon ui-icon-gripsmall-diagonal-se\"},containment:false,ghost:false,grid:false,handles:\"e,s,se\",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,// See #7960\nzIndex:90,// Callbacks\nresize:null,start:null,stop:null},_num:function _num(value){return parseFloat(value)||0;},_isNumber:function _isNumber(value){return!isNaN(parseFloat(value));},_hasScroll:function _hasScroll(el,a){if($(el).css(\"overflow\")===\"hidden\"){return false;}var scroll=a&&a===\"left\"?\"scrollLeft\":\"scrollTop\",has=false;if(el[scroll]>0){return true;}// TODO: determine which cases actually cause this to happen\n// if the element doesn't have the scroll set, see if it's possible to\n// set the scroll\ntry{el[scroll]=1;has=el[scroll]>0;el[scroll]=0;}catch(e){// `el` might be a string, then setting `scroll` will throw\n// an error in strict mode; ignore it.\n}return has;},_create:function _create(){var margins,o=this.options,that=this;this._addClass(\"ui-resizable\");$.extend(this,{_aspectRatio:!!o.aspectRatio,aspectRatio:o.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:o.helper||o.ghost||o.animate?o.helper||\"ui-resizable-helper\":null});// Wrap the element if it cannot hold child nodes\nif(this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)){this.element.wrap($(\"<div class='ui-wrapper'></div>\").css({overflow:\"hidden\",position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")}));this.element=this.element.parent().data(\"ui-resizable\",this.element.resizable(\"instance\"));this.elementIsWrapper=true;margins={marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\"),marginLeft:this.originalElement.css(\"marginLeft\")};this.element.css(margins);this.originalElement.css(\"margin\",0);// support: Safari\n// Prevent Safari textarea resize\nthis.originalResizeStyle=this.originalElement.css(\"resize\");this.originalElement.css(\"resize\",\"none\");this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"}));// Support: IE9\n// avoid IE jump (hard set the margin)\nthis.originalElement.css(margins);this._proportionallyResize();}this._setupHandles();if(o.autoHide){$(this.element).on(\"mouseenter\",function(){if(o.disabled){return;}that._removeClass(\"ui-resizable-autohide\");that._handles.show();}).on(\"mouseleave\",function(){if(o.disabled){return;}if(!that.resizing){that._addClass(\"ui-resizable-autohide\");that._handles.hide();}});}this._mouseInit();},_destroy:function _destroy(){this._mouseDestroy();this._addedHandles.remove();var wrapper,_destroy=function _destroy(exp){$(exp).removeData(\"resizable\").removeData(\"ui-resizable\").off(\".resizable\");};// TODO: Unwrap at same DOM position\nif(this.elementIsWrapper){_destroy(this.element);wrapper=this.element;this.originalElement.css({position:wrapper.css(\"position\"),width:wrapper.outerWidth(),height:wrapper.outerHeight(),top:wrapper.css(\"top\"),left:wrapper.css(\"left\")}).insertAfter(wrapper);wrapper.remove();}this.originalElement.css(\"resize\",this.originalResizeStyle);_destroy(this.originalElement);return this;},_setOption:function _setOption(key,value){this._super(key,value);switch(key){case\"handles\":this._removeHandles();this._setupHandles();break;case\"aspectRatio\":this._aspectRatio=!!value;break;default:break;}},_setupHandles:function _setupHandles(){var o=this.options,handle,i,n,hname,axis,that=this;this.handles=o.handles||(!$(\".ui-resizable-handle\",this.element).length?\"e,s,se\":{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"});this._handles=$();this._addedHandles=$();if(this.handles.constructor===String){if(this.handles===\"all\"){this.handles=\"n,e,s,w,se,sw,ne,nw\";}n=this.handles.split(\",\");this.handles={};for(i=0;i<n.length;i++){handle=String.prototype.trim.call(n[i]);hname=\"ui-resizable-\"+handle;axis=$(\"<div>\");this._addClass(axis,\"ui-resizable-handle \"+hname);axis.css({zIndex:o.zIndex});this.handles[handle]=\".ui-resizable-\"+handle;if(!this.element.children(this.handles[handle]).length){this.element.append(axis);this._addedHandles=this._addedHandles.add(axis);}}}this._renderAxis=function(target){var i,axis,padPos,padWrapper;target=target||this.element;for(i in this.handles){if(this.handles[i].constructor===String){this.handles[i]=this.element.children(this.handles[i]).first().show();}else if(this.handles[i].jquery||this.handles[i].nodeType){this.handles[i]=$(this.handles[i]);this._on(this.handles[i],{\"mousedown\":that._mouseDown});}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)){axis=$(this.handles[i],this.element);padWrapper=/sw|ne|nw|se|n|s/.test(i)?axis.outerHeight():axis.outerWidth();padPos=[\"padding\",/ne|nw|n/.test(i)?\"Top\":/se|sw|s/.test(i)?\"Bottom\":/^e$/.test(i)?\"Right\":\"Left\"].join(\"\");target.css(padPos,padWrapper);this._proportionallyResize();}this._handles=this._handles.add(this.handles[i]);}};// TODO: make renderAxis a prototype function\nthis._renderAxis(this.element);this._handles=this._handles.add(this.element.find(\".ui-resizable-handle\"));this._handles.disableSelection();this._handles.on(\"mouseover\",function(){if(!that.resizing){if(this.className){axis=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);}that.axis=axis&&axis[1]?axis[1]:\"se\";}});if(o.autoHide){this._handles.hide();this._addClass(\"ui-resizable-autohide\");}},_removeHandles:function _removeHandles(){this._addedHandles.remove();},_mouseCapture:function _mouseCapture(event){var i,handle,capture=false;for(i in this.handles){handle=$(this.handles[i])[0];if(handle===event.target||$.contains(handle,event.target)){capture=true;}}return!this.options.disabled&&capture;},_mouseStart:function _mouseStart(event){var curleft,curtop,cursor,o=this.options,el=this.element;this.resizing=true;this._renderProxy();curleft=this._num(this.helper.css(\"left\"));curtop=this._num(this.helper.css(\"top\"));if(o.containment){curleft+=$(o.containment).scrollLeft()||0;curtop+=$(o.containment).scrollTop()||0;}this.offset=this.helper.offset();this.position={left:curleft,top:curtop};this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:el.width(),height:el.height()};this.originalSize=this._helper?{width:el.outerWidth(),height:el.outerHeight()}:{width:el.width(),height:el.height()};this.sizeDiff={width:el.outerWidth()-el.width(),height:el.outerHeight()-el.height()};this.originalPosition={left:curleft,top:curtop};this.originalMousePosition={left:event.pageX,top:event.pageY};this.aspectRatio=typeof o.aspectRatio===\"number\"?o.aspectRatio:this.originalSize.width/this.originalSize.height||1;cursor=$(\".ui-resizable-\"+this.axis).css(\"cursor\");$(\"body\").css(\"cursor\",cursor===\"auto\"?this.axis+\"-resize\":cursor);this._addClass(\"ui-resizable-resizing\");this._propagate(\"start\",event);return true;},_mouseDrag:function _mouseDrag(event){var data,props,smp=this.originalMousePosition,a=this.axis,dx=event.pageX-smp.left||0,dy=event.pageY-smp.top||0,trigger=this._change[a];this._updatePrevProperties();if(!trigger){return false;}data=trigger.apply(this,[event,dx,dy]);this._updateVirtualBoundaries(event.shiftKey);if(this._aspectRatio||event.shiftKey){data=this._updateRatio(data,event);}data=this._respectSize(data,event);this._updateCache(data);this._propagate(\"resize\",event);props=this._applyChanges();if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize();}if(!$.isEmptyObject(props)){this._updatePrevProperties();this._trigger(\"resize\",event,this.ui());this._applyChanges();}return false;},_mouseStop:function _mouseStop(event){this.resizing=false;var pr,ista,soffseth,soffsetw,s,left,top,o=this.options,that=this;if(this._helper){pr=this._proportionallyResizeElements;ista=pr.length&&/textarea/i.test(pr[0].nodeName);soffseth=ista&&this._hasScroll(pr[0],\"left\")?0:that.sizeDiff.height;soffsetw=ista?0:that.sizeDiff.width;s={width:that.helper.width()-soffsetw,height:that.helper.height()-soffseth};left=parseFloat(that.element.css(\"left\"))+(that.position.left-that.originalPosition.left)||null;top=parseFloat(that.element.css(\"top\"))+(that.position.top-that.originalPosition.top)||null;if(!o.animate){this.element.css($.extend(s,{top:top,left:left}));}that.helper.height(that.size.height);that.helper.width(that.size.width);if(this._helper&&!o.animate){this._proportionallyResize();}}$(\"body\").css(\"cursor\",\"auto\");this._removeClass(\"ui-resizable-resizing\");this._propagate(\"stop\",event);if(this._helper){this.helper.remove();}return false;},_updatePrevProperties:function _updatePrevProperties(){this.prevPosition={top:this.position.top,left:this.position.left};this.prevSize={width:this.size.width,height:this.size.height};},_applyChanges:function _applyChanges(){var props={};if(this.position.top!==this.prevPosition.top){props.top=this.position.top+\"px\";}if(this.position.left!==this.prevPosition.left){props.left=this.position.left+\"px\";}if(this.size.width!==this.prevSize.width){props.width=this.size.width+\"px\";}if(this.size.height!==this.prevSize.height){props.height=this.size.height+\"px\";}this.helper.css(props);return props;},_updateVirtualBoundaries:function _updateVirtualBoundaries(forceAspectRatio){var pMinWidth,pMaxWidth,pMinHeight,pMaxHeight,b,o=this.options;b={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:Infinity,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:Infinity};if(this._aspectRatio||forceAspectRatio){pMinWidth=b.minHeight*this.aspectRatio;pMinHeight=b.minWidth/this.aspectRatio;pMaxWidth=b.maxHeight*this.aspectRatio;pMaxHeight=b.maxWidth/this.aspectRatio;if(pMinWidth>b.minWidth){b.minWidth=pMinWidth;}if(pMinHeight>b.minHeight){b.minHeight=pMinHeight;}if(pMaxWidth<b.maxWidth){b.maxWidth=pMaxWidth;}if(pMaxHeight<b.maxHeight){b.maxHeight=pMaxHeight;}}this._vBoundaries=b;},_updateCache:function _updateCache(data){this.offset=this.helper.offset();if(this._isNumber(data.left)){this.position.left=data.left;}if(this._isNumber(data.top)){this.position.top=data.top;}if(this._isNumber(data.height)){this.size.height=data.height;}if(this._isNumber(data.width)){this.size.width=data.width;}},_updateRatio:function _updateRatio(data){var cpos=this.position,csize=this.size,a=this.axis;if(this._isNumber(data.height)){data.width=data.height*this.aspectRatio;}else if(this._isNumber(data.width)){data.height=data.width/this.aspectRatio;}if(a===\"sw\"){data.left=cpos.left+(csize.width-data.width);data.top=null;}if(a===\"nw\"){data.top=cpos.top+(csize.height-data.height);data.left=cpos.left+(csize.width-data.width);}return data;},_respectSize:function _respectSize(data){var o=this._vBoundaries,a=this.axis,ismaxw=this._isNumber(data.width)&&o.maxWidth&&o.maxWidth<data.width,ismaxh=this._isNumber(data.height)&&o.maxHeight&&o.maxHeight<data.height,isminw=this._isNumber(data.width)&&o.minWidth&&o.minWidth>data.width,isminh=this._isNumber(data.height)&&o.minHeight&&o.minHeight>data.height,dw=this.originalPosition.left+this.originalSize.width,dh=this.originalPosition.top+this.originalSize.height,cw=/sw|nw|w/.test(a),ch=/nw|ne|n/.test(a);if(isminw){data.width=o.minWidth;}if(isminh){data.height=o.minHeight;}if(ismaxw){data.width=o.maxWidth;}if(ismaxh){data.height=o.maxHeight;}if(isminw&&cw){data.left=dw-o.minWidth;}if(ismaxw&&cw){data.left=dw-o.maxWidth;}if(isminh&&ch){data.top=dh-o.minHeight;}if(ismaxh&&ch){data.top=dh-o.maxHeight;}// Fixing jump error on top/left - bug #2330\nif(!data.width&&!data.height&&!data.left&&data.top){data.top=null;}else if(!data.width&&!data.height&&!data.top&&data.left){data.left=null;}return data;},_getPaddingPlusBorderDimensions:function _getPaddingPlusBorderDimensions(element){var i=0,widths=[],borders=[element.css(\"borderTopWidth\"),element.css(\"borderRightWidth\"),element.css(\"borderBottomWidth\"),element.css(\"borderLeftWidth\")],paddings=[element.css(\"paddingTop\"),element.css(\"paddingRight\"),element.css(\"paddingBottom\"),element.css(\"paddingLeft\")];for(;i<4;i++){widths[i]=parseFloat(borders[i])||0;widths[i]+=parseFloat(paddings[i])||0;}return{height:widths[0]+widths[2],width:widths[1]+widths[3]};},_proportionallyResize:function _proportionallyResize(){if(!this._proportionallyResizeElements.length){return;}var prel,i=0,element=this.helper||this.element;for(;i<this._proportionallyResizeElements.length;i++){prel=this._proportionallyResizeElements[i];// TODO: Seems like a bug to cache this.outerDimensions\n// considering that we are in a loop.\nif(!this.outerDimensions){this.outerDimensions=this._getPaddingPlusBorderDimensions(prel);}prel.css({height:element.height()-this.outerDimensions.height||0,width:element.width()-this.outerDimensions.width||0});}},_renderProxy:function _renderProxy(){var el=this.element,o=this.options;this.elementOffset=el.offset();if(this._helper){this.helper=this.helper||$(\"<div></div>\").css({overflow:\"hidden\"});this._addClass(this.helper,this._helper);this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:\"absolute\",left:this.elementOffset.left+\"px\",top:this.elementOffset.top+\"px\",zIndex:++o.zIndex//TODO: Don't modify option\n});this.helper.appendTo(\"body\").disableSelection();}else{this.helper=this.element;}},_change:{e:function e(event,dx){return{width:this.originalSize.width+dx};},w:function w(event,dx){var cs=this.originalSize,sp=this.originalPosition;return{left:sp.left+dx,width:cs.width-dx};},n:function n(event,dx,dy){var cs=this.originalSize,sp=this.originalPosition;return{top:sp.top+dy,height:cs.height-dy};},s:function s(event,dx,dy){return{height:this.originalSize.height+dy};},se:function se(event,dx,dy){return $.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[event,dx,dy]));},sw:function sw(event,dx,dy){return $.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[event,dx,dy]));},ne:function ne(event,dx,dy){return $.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[event,dx,dy]));},nw:function nw(event,dx,dy){return $.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[event,dx,dy]));}},_propagate:function _propagate(n,event){$.ui.plugin.call(this,n,[event,this.ui()]);if(n!==\"resize\"){this._trigger(n,event,this.ui());}},plugins:{},ui:function ui(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition};}});/*\n * Resizable Extensions\n */$.ui.plugin.add(\"resizable\",\"animate\",{stop:function stop(event){var that=$(this).resizable(\"instance\"),o=that.options,pr=that._proportionallyResizeElements,ista=pr.length&&/textarea/i.test(pr[0].nodeName),soffseth=ista&&that._hasScroll(pr[0],\"left\")?0:that.sizeDiff.height,soffsetw=ista?0:that.sizeDiff.width,style={width:that.size.width-soffsetw,height:that.size.height-soffseth},left=parseFloat(that.element.css(\"left\"))+(that.position.left-that.originalPosition.left)||null,top=parseFloat(that.element.css(\"top\"))+(that.position.top-that.originalPosition.top)||null;that.element.animate($.extend(style,top&&left?{top:top,left:left}:{}),{duration:o.animateDuration,easing:o.animateEasing,step:function step(){var data={width:parseFloat(that.element.css(\"width\")),height:parseFloat(that.element.css(\"height\")),top:parseFloat(that.element.css(\"top\")),left:parseFloat(that.element.css(\"left\"))};if(pr&&pr.length){$(pr[0]).css({width:data.width,height:data.height});}// Propagating resize, and updating values for each animation step\nthat._updateCache(data);that._propagate(\"resize\",event);}});}});$.ui.plugin.add(\"resizable\",\"containment\",{start:function start(){var element,p,co,ch,cw,width,height,that=$(this).resizable(\"instance\"),o=that.options,el=that.element,oc=o.containment,ce=oc instanceof $?oc.get(0):/parent/.test(oc)?el.parent().get(0):oc;if(!ce){return;}that.containerElement=$(ce);if(/document/.test(oc)||oc===document){that.containerOffset={left:0,top:0};that.containerPosition={left:0,top:0};that.parentData={element:$(document),left:0,top:0,width:$(document).width(),height:$(document).height()||document.body.parentNode.scrollHeight};}else{element=$(ce);p=[];$([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(i,name){p[i]=that._num(element.css(\"padding\"+name));});that.containerOffset=element.offset();that.containerPosition=element.position();that.containerSize={height:element.innerHeight()-p[3],width:element.innerWidth()-p[1]};co=that.containerOffset;ch=that.containerSize.height;cw=that.containerSize.width;width=that._hasScroll(ce,\"left\")?ce.scrollWidth:cw;height=that._hasScroll(ce)?ce.scrollHeight:ch;that.parentData={element:ce,left:co.left,top:co.top,width:width,height:height};}},resize:function resize(event){var woset,hoset,isParent,isOffsetRelative,that=$(this).resizable(\"instance\"),o=that.options,co=that.containerOffset,cp=that.position,pRatio=that._aspectRatio||event.shiftKey,cop={top:0,left:0},ce=that.containerElement,continueResize=true;if(ce[0]!==document&&/static/.test(ce.css(\"position\"))){cop=co;}if(cp.left<(that._helper?co.left:0)){that.size.width=that.size.width+(that._helper?that.position.left-co.left:that.position.left-cop.left);if(pRatio){that.size.height=that.size.width/that.aspectRatio;continueResize=false;}that.position.left=o.helper?co.left:0;}if(cp.top<(that._helper?co.top:0)){that.size.height=that.size.height+(that._helper?that.position.top-co.top:that.position.top);if(pRatio){that.size.width=that.size.height*that.aspectRatio;continueResize=false;}that.position.top=that._helper?co.top:0;}isParent=that.containerElement.get(0)===that.element.parent().get(0);isOffsetRelative=/relative|absolute/.test(that.containerElement.css(\"position\"));if(isParent&&isOffsetRelative){that.offset.left=that.parentData.left+that.position.left;that.offset.top=that.parentData.top+that.position.top;}else{that.offset.left=that.element.offset().left;that.offset.top=that.element.offset().top;}woset=Math.abs(that.sizeDiff.width+(that._helper?that.offset.left-cop.left:that.offset.left-co.left));hoset=Math.abs(that.sizeDiff.height+(that._helper?that.offset.top-cop.top:that.offset.top-co.top));if(woset+that.size.width>=that.parentData.width){that.size.width=that.parentData.width-woset;if(pRatio){that.size.height=that.size.width/that.aspectRatio;continueResize=false;}}if(hoset+that.size.height>=that.parentData.height){that.size.height=that.parentData.height-hoset;if(pRatio){that.size.width=that.size.height*that.aspectRatio;continueResize=false;}}if(!continueResize){that.position.left=that.prevPosition.left;that.position.top=that.prevPosition.top;that.size.width=that.prevSize.width;that.size.height=that.prevSize.height;}},stop:function stop(){var that=$(this).resizable(\"instance\"),o=that.options,co=that.containerOffset,cop=that.containerPosition,ce=that.containerElement,helper=$(that.helper),ho=helper.offset(),w=helper.outerWidth()-that.sizeDiff.width,h=helper.outerHeight()-that.sizeDiff.height;if(that._helper&&!o.animate&&/relative/.test(ce.css(\"position\"))){$(this).css({left:ho.left-cop.left-co.left,width:w,height:h});}if(that._helper&&!o.animate&&/static/.test(ce.css(\"position\"))){$(this).css({left:ho.left-cop.left-co.left,width:w,height:h});}}});$.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function start(){var that=$(this).resizable(\"instance\"),o=that.options;$(o.alsoResize).each(function(){var el=$(this);el.data(\"ui-resizable-alsoresize\",{width:parseFloat(el.width()),height:parseFloat(el.height()),left:parseFloat(el.css(\"left\")),top:parseFloat(el.css(\"top\"))});});},resize:function resize(event,ui){var that=$(this).resizable(\"instance\"),o=that.options,os=that.originalSize,op=that.originalPosition,delta={height:that.size.height-os.height||0,width:that.size.width-os.width||0,top:that.position.top-op.top||0,left:that.position.left-op.left||0};$(o.alsoResize).each(function(){var el=$(this),start=$(this).data(\"ui-resizable-alsoresize\"),style={},css=el.parents(ui.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];$.each(css,function(i,prop){var sum=(start[prop]||0)+(delta[prop]||0);if(sum&&sum>=0){style[prop]=sum||null;}});el.css(style);});},stop:function stop(){$(this).removeData(\"ui-resizable-alsoresize\");}});$.ui.plugin.add(\"resizable\",\"ghost\",{start:function start(){var that=$(this).resizable(\"instance\"),cs=that.size;that.ghost=that.originalElement.clone();that.ghost.css({opacity:0.25,display:\"block\",position:\"relative\",height:cs.height,width:cs.width,margin:0,left:0,top:0});that._addClass(that.ghost,\"ui-resizable-ghost\");// DEPRECATED\n// TODO: remove after 1.12\nif($.uiBackCompat!==false&&typeof that.options.ghost===\"string\"){// Ghost option\nthat.ghost.addClass(this.options.ghost);}that.ghost.appendTo(that.helper);},resize:function resize(){var that=$(this).resizable(\"instance\");if(that.ghost){that.ghost.css({position:\"relative\",height:that.size.height,width:that.size.width});}},stop:function stop(){var that=$(this).resizable(\"instance\");if(that.ghost&&that.helper){that.helper.get(0).removeChild(that.ghost.get(0));}}});$.ui.plugin.add(\"resizable\",\"grid\",{resize:function resize(){var outerDimensions,that=$(this).resizable(\"instance\"),o=that.options,cs=that.size,os=that.originalSize,op=that.originalPosition,a=that.axis,grid=typeof o.grid===\"number\"?[o.grid,o.grid]:o.grid,gridX=grid[0]||1,gridY=grid[1]||1,ox=Math.round((cs.width-os.width)/gridX)*gridX,oy=Math.round((cs.height-os.height)/gridY)*gridY,newWidth=os.width+ox,newHeight=os.height+oy,isMaxWidth=o.maxWidth&&o.maxWidth<newWidth,isMaxHeight=o.maxHeight&&o.maxHeight<newHeight,isMinWidth=o.minWidth&&o.minWidth>newWidth,isMinHeight=o.minHeight&&o.minHeight>newHeight;o.grid=grid;if(isMinWidth){newWidth+=gridX;}if(isMinHeight){newHeight+=gridY;}if(isMaxWidth){newWidth-=gridX;}if(isMaxHeight){newHeight-=gridY;}if(/^(se|s|e)$/.test(a)){that.size.width=newWidth;that.size.height=newHeight;}else if(/^(ne)$/.test(a)){that.size.width=newWidth;that.size.height=newHeight;that.position.top=op.top-oy;}else if(/^(sw)$/.test(a)){that.size.width=newWidth;that.size.height=newHeight;that.position.left=op.left-ox;}else{if(newHeight-gridY<=0||newWidth-gridX<=0){outerDimensions=that._getPaddingPlusBorderDimensions(this);}if(newHeight-gridY>0){that.size.height=newHeight;that.position.top=op.top-oy;}else{newHeight=gridY-outerDimensions.height;that.size.height=newHeight;that.position.top=op.top+os.height-newHeight;}if(newWidth-gridX>0){that.size.width=newWidth;that.position.left=op.left-ox;}else{newWidth=gridX-outerDimensions.width;that.size.width=newWidth;that.position.left=op.left+os.width-newWidth;}}}});var widgetsResizable=$.ui.resizable;/*!\n * jQuery UI Dialog 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Dialog\n//>>group: Widgets\n//>>description: Displays customizable dialog windows.\n//>>docs: http://api.jqueryui.com/dialog/\n//>>demos: http://jqueryui.com/dialog/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/dialog.css\n//>>css.theme: ../../themes/base/theme.css\n$.widget(\"ui.dialog\",{version:\"1.13.2\",options:{appendTo:\"body\",autoOpen:true,buttons:[],classes:{\"ui-dialog\":\"ui-corner-all\",\"ui-dialog-titlebar\":\"ui-corner-all\"},closeOnEscape:true,closeText:\"Close\",draggable:true,hide:null,height:\"auto\",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:false,position:{my:\"center\",at:\"center\",of:window,collision:\"fit\",// Ensure the titlebar is always visible\nusing:function using(pos){var topOffset=$(this).css(pos).offset().top;if(topOffset<0){$(this).css(\"top\",pos.top-topOffset);}}},resizable:true,show:null,title:null,width:300,// Callbacks\nbeforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},resizableRelatedOptions:{maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},_create:function _create(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height};this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)};this.originalTitle=this.element.attr(\"title\");if(this.options.title==null&&this.originalTitle!=null){this.options.title=this.originalTitle;}// Dialogs can't be disabled\nif(this.options.disabled){this.options.disabled=false;}this._createWrapper();this.element.show().removeAttr(\"title\").appendTo(this.uiDialog);this._addClass(\"ui-dialog-content\",\"ui-widget-content\");this._createTitlebar();this._createButtonPane();if(this.options.draggable&&$.fn.draggable){this._makeDraggable();}if(this.options.resizable&&$.fn.resizable){this._makeResizable();}this._isOpen=false;this._trackFocus();},_init:function _init(){if(this.options.autoOpen){this.open();}},_appendTo:function _appendTo(){var element=this.options.appendTo;if(element&&(element.jquery||element.nodeType)){return $(element);}return this.document.find(element||\"body\").eq(0);},_destroy:function _destroy(){var next,originalPosition=this.originalPosition;this._untrackInstance();this._destroyOverlay();this.element.removeUniqueId().css(this.originalCss)// Without detaching first, the following becomes really slow\n.detach();this.uiDialog.remove();if(this.originalTitle){this.element.attr(\"title\",this.originalTitle);}next=originalPosition.parent.children().eq(originalPosition.index);// Don't try to place the dialog next to itself (#8613)\nif(next.length&&next[0]!==this.element[0]){next.before(this.element);}else{originalPosition.parent.append(this.element);}},widget:function widget(){return this.uiDialog;},disable:$.noop,enable:$.noop,close:function close(event){var that=this;if(!this._isOpen||this._trigger(\"beforeClose\",event)===false){return;}this._isOpen=false;this._focusedElement=null;this._destroyOverlay();this._untrackInstance();if(!this.opener.filter(\":focusable\").trigger(\"focus\").length){// Hiding a focused element doesn't trigger blur in WebKit\n// so in case we have nothing to focus on, explicitly blur the active element\n// https://bugs.webkit.org/show_bug.cgi?id=47182\n$.ui.safeBlur($.ui.safeActiveElement(this.document[0]));}this._hide(this.uiDialog,this.options.hide,function(){that._trigger(\"close\",event);});},isOpen:function isOpen(){return this._isOpen;},moveToTop:function moveToTop(){this._moveToTop();},_moveToTop:function _moveToTop(event,silent){var moved=false,zIndices=this.uiDialog.siblings(\".ui-front:visible\").map(function(){return+$(this).css(\"z-index\");}).get(),zIndexMax=Math.max.apply(null,zIndices);if(zIndexMax>=+this.uiDialog.css(\"z-index\")){this.uiDialog.css(\"z-index\",zIndexMax+1);moved=true;}if(moved&&!silent){this._trigger(\"focus\",event);}return moved;},open:function open(){var that=this;if(this._isOpen){if(this._moveToTop()){this._focusTabbable();}return;}this._isOpen=true;this.opener=$($.ui.safeActiveElement(this.document[0]));this._size();this._position();this._createOverlay();this._moveToTop(null,true);// Ensure the overlay is moved to the top with the dialog, but only when\n// opening. The overlay shouldn't move after the dialog is open so that\n// modeless dialogs opened after the modal dialog stack properly.\nif(this.overlay){this.overlay.css(\"z-index\",this.uiDialog.css(\"z-index\")-1);}this._show(this.uiDialog,this.options.show,function(){that._focusTabbable();that._trigger(\"focus\");});// Track the dialog immediately upon opening in case a focus event\n// somehow occurs outside of the dialog before an element inside the\n// dialog is focused (#10152)\nthis._makeFocusTarget();this._trigger(\"open\");},_focusTabbable:function _focusTabbable(){// Set focus to the first match:\n// 1. An element that was focused previously\n// 2. First element inside the dialog matching [autofocus]\n// 3. Tabbable element inside the content element\n// 4. Tabbable element inside the buttonpane\n// 5. The close button\n// 6. The dialog itself\nvar hasFocus=this._focusedElement;if(!hasFocus){hasFocus=this.element.find(\"[autofocus]\");}if(!hasFocus.length){hasFocus=this.element.find(\":tabbable\");}if(!hasFocus.length){hasFocus=this.uiDialogButtonPane.find(\":tabbable\");}if(!hasFocus.length){hasFocus=this.uiDialogTitlebarClose.filter(\":tabbable\");}if(!hasFocus.length){hasFocus=this.uiDialog;}hasFocus.eq(0).trigger(\"focus\");},_restoreTabbableFocus:function _restoreTabbableFocus(){var activeElement=$.ui.safeActiveElement(this.document[0]),isActive=this.uiDialog[0]===activeElement||$.contains(this.uiDialog[0],activeElement);if(!isActive){this._focusTabbable();}},_keepFocus:function _keepFocus(event){event.preventDefault();this._restoreTabbableFocus();// support: IE\n// IE <= 8 doesn't prevent moving focus even with event.preventDefault()\n// so we check again later\nthis._delay(this._restoreTabbableFocus);},_createWrapper:function _createWrapper(){this.uiDialog=$(\"<div>\").hide().attr({// Setting tabIndex makes the div focusable\ntabIndex:-1,role:\"dialog\"}).appendTo(this._appendTo());this._addClass(this.uiDialog,\"ui-dialog\",\"ui-widget ui-widget-content ui-front\");this._on(this.uiDialog,{keydown:function keydown(event){if(this.options.closeOnEscape&&!event.isDefaultPrevented()&&event.keyCode&&event.keyCode===$.ui.keyCode.ESCAPE){event.preventDefault();this.close(event);return;}// Prevent tabbing out of dialogs\nif(event.keyCode!==$.ui.keyCode.TAB||event.isDefaultPrevented()){return;}var tabbables=this.uiDialog.find(\":tabbable\"),first=tabbables.first(),last=tabbables.last();if((event.target===last[0]||event.target===this.uiDialog[0])&&!event.shiftKey){this._delay(function(){first.trigger(\"focus\");});event.preventDefault();}else if((event.target===first[0]||event.target===this.uiDialog[0])&&event.shiftKey){this._delay(function(){last.trigger(\"focus\");});event.preventDefault();}},mousedown:function mousedown(event){if(this._moveToTop(event)){this._focusTabbable();}}});// We assume that any existing aria-describedby attribute means\n// that the dialog content is marked up properly\n// otherwise we brute force the content as the description\nif(!this.element.find(\"[aria-describedby]\").length){this.uiDialog.attr({\"aria-describedby\":this.element.uniqueId().attr(\"id\")});}},_createTitlebar:function _createTitlebar(){var uiDialogTitle;this.uiDialogTitlebar=$(\"<div>\");this._addClass(this.uiDialogTitlebar,\"ui-dialog-titlebar\",\"ui-widget-header ui-helper-clearfix\");this._on(this.uiDialogTitlebar,{mousedown:function mousedown(event){// Don't prevent click on close button (#8838)\n// Focusing a dialog that is partially scrolled out of view\n// causes the browser to scroll it into view, preventing the click event\nif(!$(event.target).closest(\".ui-dialog-titlebar-close\")){// Dialog isn't getting focus when dragging (#8063)\nthis.uiDialog.trigger(\"focus\");}}});// Support: IE\n// Use type=\"button\" to prevent enter keypresses in textboxes from closing the\n// dialog in IE (#9312)\nthis.uiDialogTitlebarClose=$(\"<button type='button'></button>\").button({label:$(\"<a>\").text(this.options.closeText).html(),icon:\"ui-icon-closethick\",showLabel:false}).appendTo(this.uiDialogTitlebar);this._addClass(this.uiDialogTitlebarClose,\"ui-dialog-titlebar-close\");this._on(this.uiDialogTitlebarClose,{click:function click(event){event.preventDefault();this.close(event);}});uiDialogTitle=$(\"<span>\").uniqueId().prependTo(this.uiDialogTitlebar);this._addClass(uiDialogTitle,\"ui-dialog-title\");this._title(uiDialogTitle);this.uiDialogTitlebar.prependTo(this.uiDialog);this.uiDialog.attr({\"aria-labelledby\":uiDialogTitle.attr(\"id\")});},_title:function _title(title){if(this.options.title){title.text(this.options.title);}else{title.html(\"&#160;\");}},_createButtonPane:function _createButtonPane(){this.uiDialogButtonPane=$(\"<div>\");this._addClass(this.uiDialogButtonPane,\"ui-dialog-buttonpane\",\"ui-widget-content ui-helper-clearfix\");this.uiButtonSet=$(\"<div>\").appendTo(this.uiDialogButtonPane);this._addClass(this.uiButtonSet,\"ui-dialog-buttonset\");this._createButtons();},_createButtons:function _createButtons(){var that=this,buttons=this.options.buttons;// If we already have a button pane, remove it\nthis.uiDialogButtonPane.remove();this.uiButtonSet.empty();if($.isEmptyObject(buttons)||Array.isArray(buttons)&&!buttons.length){this._removeClass(this.uiDialog,\"ui-dialog-buttons\");return;}$.each(buttons,function(name,props){var click,buttonOptions;props=typeof props===\"function\"?{click:props,text:name}:props;// Default to a non-submitting button\nprops=$.extend({type:\"button\"},props);// Change the context for the click callback to be the main element\nclick=props.click;buttonOptions={icon:props.icon,iconPosition:props.iconPosition,showLabel:props.showLabel,// Deprecated options\nicons:props.icons,text:props.text};delete props.click;delete props.icon;delete props.iconPosition;delete props.showLabel;// Deprecated options\ndelete props.icons;if(typeof props.text===\"boolean\"){delete props.text;}$(\"<button></button>\",props).button(buttonOptions).appendTo(that.uiButtonSet).on(\"click\",function(){click.apply(that.element[0],arguments);});});this._addClass(this.uiDialog,\"ui-dialog-buttons\");this.uiDialogButtonPane.appendTo(this.uiDialog);},_makeDraggable:function _makeDraggable(){var that=this,options=this.options;function filteredUi(ui){return{position:ui.position,offset:ui.offset};}this.uiDialog.draggable({cancel:\".ui-dialog-content, .ui-dialog-titlebar-close\",handle:\".ui-dialog-titlebar\",containment:\"document\",start:function start(event,ui){that._addClass($(this),\"ui-dialog-dragging\");that._blockFrames();that._trigger(\"dragStart\",event,filteredUi(ui));},drag:function drag(event,ui){that._trigger(\"drag\",event,filteredUi(ui));},stop:function stop(event,ui){var left=ui.offset.left-that.document.scrollLeft(),top=ui.offset.top-that.document.scrollTop();options.position={my:\"left top\",at:\"left\"+(left>=0?\"+\":\"\")+left+\" \"+\"top\"+(top>=0?\"+\":\"\")+top,of:that.window};that._removeClass($(this),\"ui-dialog-dragging\");that._unblockFrames();that._trigger(\"dragStop\",event,filteredUi(ui));}});},_makeResizable:function _makeResizable(){var that=this,options=this.options,handles=options.resizable,// .ui-resizable has position: relative defined in the stylesheet\n// but dialogs have to use absolute or fixed positioning\nposition=this.uiDialog.css(\"position\"),resizeHandles=typeof handles===\"string\"?handles:\"n,e,s,w,se,sw,ne,nw\";function filteredUi(ui){return{originalPosition:ui.originalPosition,originalSize:ui.originalSize,position:ui.position,size:ui.size};}this.uiDialog.resizable({cancel:\".ui-dialog-content\",containment:\"document\",alsoResize:this.element,maxWidth:options.maxWidth,maxHeight:options.maxHeight,minWidth:options.minWidth,minHeight:this._minHeight(),handles:resizeHandles,start:function start(event,ui){that._addClass($(this),\"ui-dialog-resizing\");that._blockFrames();that._trigger(\"resizeStart\",event,filteredUi(ui));},resize:function resize(event,ui){that._trigger(\"resize\",event,filteredUi(ui));},stop:function stop(event,ui){var offset=that.uiDialog.offset(),left=offset.left-that.document.scrollLeft(),top=offset.top-that.document.scrollTop();options.height=that.uiDialog.height();options.width=that.uiDialog.width();options.position={my:\"left top\",at:\"left\"+(left>=0?\"+\":\"\")+left+\" \"+\"top\"+(top>=0?\"+\":\"\")+top,of:that.window};that._removeClass($(this),\"ui-dialog-resizing\");that._unblockFrames();that._trigger(\"resizeStop\",event,filteredUi(ui));}}).css(\"position\",position);},_trackFocus:function _trackFocus(){this._on(this.widget(),{focusin:function focusin(event){this._makeFocusTarget();this._focusedElement=$(event.target);}});},_makeFocusTarget:function _makeFocusTarget(){this._untrackInstance();this._trackingInstances().unshift(this);},_untrackInstance:function _untrackInstance(){var instances=this._trackingInstances(),exists=$.inArray(this,instances);if(exists!==-1){instances.splice(exists,1);}},_trackingInstances:function _trackingInstances(){var instances=this.document.data(\"ui-dialog-instances\");if(!instances){instances=[];this.document.data(\"ui-dialog-instances\",instances);}return instances;},_minHeight:function _minHeight(){var options=this.options;return options.height===\"auto\"?options.minHeight:Math.min(options.minHeight,options.height);},_position:function _position(){// Need to show the dialog to get the actual offset in the position plugin\nvar isVisible=this.uiDialog.is(\":visible\");if(!isVisible){this.uiDialog.show();}this.uiDialog.position(this.options.position);if(!isVisible){this.uiDialog.hide();}},_setOptions:function _setOptions(options){var that=this,resize=false,resizableOptions={};$.each(options,function(key,value){that._setOption(key,value);if(key in that.sizeRelatedOptions){resize=true;}if(key in that.resizableRelatedOptions){resizableOptions[key]=value;}});if(resize){this._size();this._position();}if(this.uiDialog.is(\":data(ui-resizable)\")){this.uiDialog.resizable(\"option\",resizableOptions);}},_setOption:function _setOption(key,value){var isDraggable,isResizable,uiDialog=this.uiDialog;if(key===\"disabled\"){return;}this._super(key,value);if(key===\"appendTo\"){this.uiDialog.appendTo(this._appendTo());}if(key===\"buttons\"){this._createButtons();}if(key===\"closeText\"){this.uiDialogTitlebarClose.button({// Ensure that we always pass a string\nlabel:$(\"<a>\").text(\"\"+this.options.closeText).html()});}if(key===\"draggable\"){isDraggable=uiDialog.is(\":data(ui-draggable)\");if(isDraggable&&!value){uiDialog.draggable(\"destroy\");}if(!isDraggable&&value){this._makeDraggable();}}if(key===\"position\"){this._position();}if(key===\"resizable\"){// currently resizable, becoming non-resizable\nisResizable=uiDialog.is(\":data(ui-resizable)\");if(isResizable&&!value){uiDialog.resizable(\"destroy\");}// Currently resizable, changing handles\nif(isResizable&&typeof value===\"string\"){uiDialog.resizable(\"option\",\"handles\",value);}// Currently non-resizable, becoming resizable\nif(!isResizable&&value!==false){this._makeResizable();}}if(key===\"title\"){this._title(this.uiDialogTitlebar.find(\".ui-dialog-title\"));}},_size:function _size(){// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\n// divs will both have width and height set, so we need to reset them\nvar nonContentHeight,minContentHeight,maxContentHeight,options=this.options;// Reset content sizing\nthis.element.show().css({width:\"auto\",minHeight:0,maxHeight:\"none\",height:0});if(options.minWidth>options.width){options.width=options.minWidth;}// Reset wrapper sizing\n// determine the height of all the non-content elements\nnonContentHeight=this.uiDialog.css({height:\"auto\",width:options.width}).outerHeight();minContentHeight=Math.max(0,options.minHeight-nonContentHeight);maxContentHeight=typeof options.maxHeight===\"number\"?Math.max(0,options.maxHeight-nonContentHeight):\"none\";if(options.height===\"auto\"){this.element.css({minHeight:minContentHeight,maxHeight:maxContentHeight,height:\"auto\"});}else{this.element.height(Math.max(0,options.height-nonContentHeight));}if(this.uiDialog.is(\":data(ui-resizable)\")){this.uiDialog.resizable(\"option\",\"minHeight\",this._minHeight());}},_blockFrames:function _blockFrames(){this.iframeBlocks=this.document.find(\"iframe\").map(function(){var iframe=$(this);return $(\"<div>\").css({position:\"absolute\",width:iframe.outerWidth(),height:iframe.outerHeight()}).appendTo(iframe.parent()).offset(iframe.offset())[0];});},_unblockFrames:function _unblockFrames(){if(this.iframeBlocks){this.iframeBlocks.remove();delete this.iframeBlocks;}},_allowInteraction:function _allowInteraction(event){if($(event.target).closest(\".ui-dialog\").length){return true;}// TODO: Remove hack when datepicker implements\n// the .ui-front logic (#8989)\nreturn!!$(event.target).closest(\".ui-datepicker\").length;},_createOverlay:function _createOverlay(){if(!this.options.modal){return;}var jqMinor=$.fn.jquery.substring(0,4);// We use a delay in case the overlay is created from an\n// event that we're going to be cancelling (#2804)\nvar isOpening=true;this._delay(function(){isOpening=false;});if(!this.document.data(\"ui-dialog-overlays\")){// Prevent use of anchors and inputs\n// This doesn't use `_on()` because it is a shared event handler\n// across all open modal dialogs.\nthis.document.on(\"focusin.ui-dialog\",function(event){if(isOpening){return;}var instance=this._trackingInstances()[0];if(!instance._allowInteraction(event)){event.preventDefault();instance._focusTabbable();// Support: jQuery >=3.4 <3.6 only\n// Focus re-triggering in jQuery 3.4/3.5 makes the original element\n// have its focus event propagated last, breaking the re-targeting.\n// Trigger focus in a delay in addition if needed to avoid the issue\n// See https://github.com/jquery/jquery/issues/4382\nif(jqMinor===\"3.4.\"||jqMinor===\"3.5.\"){instance._delay(instance._restoreTabbableFocus);}}}.bind(this));}this.overlay=$(\"<div>\").appendTo(this._appendTo());this._addClass(this.overlay,null,\"ui-widget-overlay ui-front\");this._on(this.overlay,{mousedown:\"_keepFocus\"});this.document.data(\"ui-dialog-overlays\",(this.document.data(\"ui-dialog-overlays\")||0)+1);},_destroyOverlay:function _destroyOverlay(){if(!this.options.modal){return;}if(this.overlay){var overlays=this.document.data(\"ui-dialog-overlays\")-1;if(!overlays){this.document.off(\"focusin.ui-dialog\");this.document.removeData(\"ui-dialog-overlays\");}else{this.document.data(\"ui-dialog-overlays\",overlays);}this.overlay.remove();this.overlay=null;}}});// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif($.uiBackCompat!==false){// Backcompat for dialogClass option\n$.widget(\"ui.dialog\",$.ui.dialog,{options:{dialogClass:\"\"},_createWrapper:function _createWrapper(){this._super();this.uiDialog.addClass(this.options.dialogClass);},_setOption:function _setOption(key,value){if(key===\"dialogClass\"){this.uiDialog.removeClass(this.options.dialogClass).addClass(value);}this._superApply(arguments);}});}var widgetsDialog=$.ui.dialog;/*!\n * jQuery UI Droppable 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Droppable\n//>>group: Interactions\n//>>description: Enables drop targets for draggable elements.\n//>>docs: http://api.jqueryui.com/droppable/\n//>>demos: http://jqueryui.com/droppable/\n$.widget(\"ui.droppable\",{version:\"1.13.2\",widgetEventPrefix:\"drop\",options:{accept:\"*\",addClasses:true,greedy:false,scope:\"default\",tolerance:\"intersect\",// Callbacks\nactivate:null,deactivate:null,drop:null,out:null,over:null},_create:function _create(){var proportions,o=this.options,accept=o.accept;this.isover=false;this.isout=true;this.accept=typeof accept===\"function\"?accept:function(d){return d.is(accept);};this.proportions=function/* valueToWrite */(){if(arguments.length){// Store the droppable's proportions\nproportions=arguments[0];}else{// Retrieve or derive the droppable's proportions\nreturn proportions?proportions:proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};}};this._addToManager(o.scope);if(o.addClasses){this._addClass(\"ui-droppable\");}},_addToManager:function _addToManager(scope){// Add the reference and positions to the manager\n$.ui.ddmanager.droppables[scope]=$.ui.ddmanager.droppables[scope]||[];$.ui.ddmanager.droppables[scope].push(this);},_splice:function _splice(drop){var i=0;for(;i<drop.length;i++){if(drop[i]===this){drop.splice(i,1);}}},_destroy:function _destroy(){var drop=$.ui.ddmanager.droppables[this.options.scope];this._splice(drop);},_setOption:function _setOption(key,value){if(key===\"accept\"){this.accept=typeof value===\"function\"?value:function(d){return d.is(value);};}else if(key===\"scope\"){var drop=$.ui.ddmanager.droppables[this.options.scope];this._splice(drop);this._addToManager(value);}this._super(key,value);},_activate:function _activate(event){var draggable=$.ui.ddmanager.current;this._addActiveClass();if(draggable){this._trigger(\"activate\",event,this.ui(draggable));}},_deactivate:function _deactivate(event){var draggable=$.ui.ddmanager.current;this._removeActiveClass();if(draggable){this._trigger(\"deactivate\",event,this.ui(draggable));}},_over:function _over(event){var draggable=$.ui.ddmanager.current;// Bail if draggable and droppable are same element\nif(!draggable||(draggable.currentItem||draggable.element)[0]===this.element[0]){return;}if(this.accept.call(this.element[0],draggable.currentItem||draggable.element)){this._addHoverClass();this._trigger(\"over\",event,this.ui(draggable));}},_out:function _out(event){var draggable=$.ui.ddmanager.current;// Bail if draggable and droppable are same element\nif(!draggable||(draggable.currentItem||draggable.element)[0]===this.element[0]){return;}if(this.accept.call(this.element[0],draggable.currentItem||draggable.element)){this._removeHoverClass();this._trigger(\"out\",event,this.ui(draggable));}},_drop:function _drop(event,custom){var draggable=custom||$.ui.ddmanager.current,childrenIntersection=false;// Bail if draggable and droppable are same element\nif(!draggable||(draggable.currentItem||draggable.element)[0]===this.element[0]){return false;}this.element.find(\":data(ui-droppable)\").not(\".ui-draggable-dragging\").each(function(){var inst=$(this).droppable(\"instance\");if(inst.options.greedy&&!inst.options.disabled&&inst.options.scope===draggable.options.scope&&inst.accept.call(inst.element[0],draggable.currentItem||draggable.element)&&$.ui.intersect(draggable,$.extend(inst,{offset:inst.element.offset()}),inst.options.tolerance,event)){childrenIntersection=true;return false;}});if(childrenIntersection){return false;}if(this.accept.call(this.element[0],draggable.currentItem||draggable.element)){this._removeActiveClass();this._removeHoverClass();this._trigger(\"drop\",event,this.ui(draggable));return this.element;}return false;},ui:function ui(c){return{draggable:c.currentItem||c.element,helper:c.helper,position:c.position,offset:c.positionAbs};},// Extension points just to make backcompat sane and avoid duplicating logic\n// TODO: Remove in 1.14 along with call to it below\n_addHoverClass:function _addHoverClass(){this._addClass(\"ui-droppable-hover\");},_removeHoverClass:function _removeHoverClass(){this._removeClass(\"ui-droppable-hover\");},_addActiveClass:function _addActiveClass(){this._addClass(\"ui-droppable-active\");},_removeActiveClass:function _removeActiveClass(){this._removeClass(\"ui-droppable-active\");}});$.ui.intersect=function(){function isOverAxis(x,reference,size){return x>=reference&&x<reference+size;}return function(draggable,droppable,toleranceMode,event){if(!droppable.offset){return false;}var x1=(draggable.positionAbs||draggable.position.absolute).left+draggable.margins.left,y1=(draggable.positionAbs||draggable.position.absolute).top+draggable.margins.top,x2=x1+draggable.helperProportions.width,y2=y1+draggable.helperProportions.height,l=droppable.offset.left,t=droppable.offset.top,r=l+droppable.proportions().width,b=t+droppable.proportions().height;switch(toleranceMode){case\"fit\":return l<=x1&&x2<=r&&t<=y1&&y2<=b;case\"intersect\":return l<x1+draggable.helperProportions.width/2&&// Right Half\nx2-draggable.helperProportions.width/2<r&&// Left Half\nt<y1+draggable.helperProportions.height/2&&// Bottom Half\ny2-draggable.helperProportions.height/2<b;// Top Half\ncase\"pointer\":return isOverAxis(event.pageY,t,droppable.proportions().height)&&isOverAxis(event.pageX,l,droppable.proportions().width);case\"touch\":return(y1>=t&&y1<=b||// Top edge touching\ny2>=t&&y2<=b||// Bottom edge touching\ny1<t&&y2>b// Surrounded vertically\n)&&(x1>=l&&x1<=r||// Left edge touching\nx2>=l&&x2<=r||// Right edge touching\nx1<l&&x2>r// Surrounded horizontally\n);default:return false;}};}();/*\n\tThis manager tracks offsets of draggables and droppables\n*/$.ui.ddmanager={current:null,droppables:{\"default\":[]},prepareOffsets:function prepareOffsets(t,event){var i,j,m=$.ui.ddmanager.droppables[t.options.scope]||[],type=event?event.type:null,// workaround for #2317\nlist=(t.currentItem||t.element).find(\":data(ui-droppable)\").addBack();droppablesLoop:for(i=0;i<m.length;i++){// No disabled and non-accepted\nif(m[i].options.disabled||t&&!m[i].accept.call(m[i].element[0],t.currentItem||t.element)){continue;}// Filter out elements in the current dragged item\nfor(j=0;j<list.length;j++){if(list[j]===m[i].element[0]){m[i].proportions().height=0;continue droppablesLoop;}}m[i].visible=m[i].element.css(\"display\")!==\"none\";if(!m[i].visible){continue;}// Activate the droppable if used directly from draggables\nif(type===\"mousedown\"){m[i]._activate.call(m[i],event);}m[i].offset=m[i].element.offset();m[i].proportions({width:m[i].element[0].offsetWidth,height:m[i].element[0].offsetHeight});}},drop:function drop(draggable,event){var dropped=false;// Create a copy of the droppables in case the list changes during the drop (#9116)\n$.each(($.ui.ddmanager.droppables[draggable.options.scope]||[]).slice(),function(){if(!this.options){return;}if(!this.options.disabled&&this.visible&&$.ui.intersect(draggable,this,this.options.tolerance,event)){dropped=this._drop.call(this,event)||dropped;}if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],draggable.currentItem||draggable.element)){this.isout=true;this.isover=false;this._deactivate.call(this,event);}});return dropped;},dragStart:function dragStart(draggable,event){// Listen for scrolling so that if the dragging causes scrolling the position of the\n// droppables can be recalculated (see #5003)\ndraggable.element.parentsUntil(\"body\").on(\"scroll.droppable\",function(){if(!draggable.options.refreshPositions){$.ui.ddmanager.prepareOffsets(draggable,event);}});},drag:function drag(draggable,event){// If you have a highly dynamic page, you might try this option. It renders positions\n// every time you move the mouse.\nif(draggable.options.refreshPositions){$.ui.ddmanager.prepareOffsets(draggable,event);}// Run through all droppables and check their positions based on specific tolerance options\n$.each($.ui.ddmanager.droppables[draggable.options.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible){return;}var parentInstance,scope,parent,intersects=$.ui.intersect(draggable,this,this.options.tolerance,event),c=!intersects&&this.isover?\"isout\":intersects&&!this.isover?\"isover\":null;if(!c){return;}if(this.options.greedy){// find droppable parents with same scope\nscope=this.options.scope;parent=this.element.parents(\":data(ui-droppable)\").filter(function(){return $(this).droppable(\"instance\").options.scope===scope;});if(parent.length){parentInstance=$(parent[0]).droppable(\"instance\");parentInstance.greedyChild=c===\"isover\";}}// We just moved into a greedy child\nif(parentInstance&&c===\"isover\"){parentInstance.isover=false;parentInstance.isout=true;parentInstance._out.call(parentInstance,event);}this[c]=true;this[c===\"isout\"?\"isover\":\"isout\"]=false;this[c===\"isover\"?\"_over\":\"_out\"].call(this,event);// We just moved out of a greedy child\nif(parentInstance&&c===\"isout\"){parentInstance.isout=false;parentInstance.isover=true;parentInstance._over.call(parentInstance,event);}});},dragStop:function dragStop(draggable,event){draggable.element.parentsUntil(\"body\").off(\"scroll.droppable\");// Call prepareOffsets one final time since IE does not fire return scroll events when\n// overflow was caused by drag (see #5003)\nif(!draggable.options.refreshPositions){$.ui.ddmanager.prepareOffsets(draggable,event);}}};// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif($.uiBackCompat!==false){// Backcompat for activeClass and hoverClass options\n$.widget(\"ui.droppable\",$.ui.droppable,{options:{hoverClass:false,activeClass:false},_addActiveClass:function _addActiveClass(){this._super();if(this.options.activeClass){this.element.addClass(this.options.activeClass);}},_removeActiveClass:function _removeActiveClass(){this._super();if(this.options.activeClass){this.element.removeClass(this.options.activeClass);}},_addHoverClass:function _addHoverClass(){this._super();if(this.options.hoverClass){this.element.addClass(this.options.hoverClass);}},_removeHoverClass:function _removeHoverClass(){this._super();if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass);}}});}var widgetsDroppable=$.ui.droppable;/*!\n * jQuery UI Progressbar 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Progressbar\n//>>group: Widgets\n/* eslint-disable max-len */ //>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.\n/* eslint-enable max-len */ //>>docs: http://api.jqueryui.com/progressbar/\n//>>demos: http://jqueryui.com/progressbar/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/progressbar.css\n//>>css.theme: ../../themes/base/theme.css\nvar widgetsProgressbar=$.widget(\"ui.progressbar\",{version:\"1.13.2\",options:{classes:{\"ui-progressbar\":\"ui-corner-all\",\"ui-progressbar-value\":\"ui-corner-left\",\"ui-progressbar-complete\":\"ui-corner-right\"},max:100,value:0,change:null,complete:null},min:0,_create:function _create(){// Constrain initial value\nthis.oldValue=this.options.value=this._constrainedValue();this.element.attr({// Only set static values; aria-valuenow and aria-valuemax are\n// set inside _refreshValue()\nrole:\"progressbar\",\"aria-valuemin\":this.min});this._addClass(\"ui-progressbar\",\"ui-widget ui-widget-content\");this.valueDiv=$(\"<div>\").appendTo(this.element);this._addClass(this.valueDiv,\"ui-progressbar-value\",\"ui-widget-header\");this._refreshValue();},_destroy:function _destroy(){this.element.removeAttr(\"role aria-valuemin aria-valuemax aria-valuenow\");this.valueDiv.remove();},value:function value(newValue){if(newValue===undefined){return this.options.value;}this.options.value=this._constrainedValue(newValue);this._refreshValue();},_constrainedValue:function _constrainedValue(newValue){if(newValue===undefined){newValue=this.options.value;}this.indeterminate=newValue===false;// Sanitize value\nif(typeof newValue!==\"number\"){newValue=0;}return this.indeterminate?false:Math.min(this.options.max,Math.max(this.min,newValue));},_setOptions:function _setOptions(options){// Ensure \"value\" option is set after other values (like max)\nvar value=options.value;delete options.value;this._super(options);this.options.value=this._constrainedValue(value);this._refreshValue();},_setOption:function _setOption(key,value){if(key===\"max\"){// Don't allow a max less than min\nvalue=Math.max(this.min,value);}this._super(key,value);},_setOptionDisabled:function _setOptionDisabled(value){this._super(value);this.element.attr(\"aria-disabled\",value);this._toggleClass(null,\"ui-state-disabled\",!!value);},_percentage:function _percentage(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min);},_refreshValue:function _refreshValue(){var value=this.options.value,percentage=this._percentage();this.valueDiv.toggle(this.indeterminate||value>this.min).width(percentage.toFixed(0)+\"%\");this._toggleClass(this.valueDiv,\"ui-progressbar-complete\",null,value===this.options.max)._toggleClass(\"ui-progressbar-indeterminate\",null,this.indeterminate);if(this.indeterminate){this.element.removeAttr(\"aria-valuenow\");if(!this.overlayDiv){this.overlayDiv=$(\"<div>\").appendTo(this.valueDiv);this._addClass(this.overlayDiv,\"ui-progressbar-overlay\");}}else{this.element.attr({\"aria-valuemax\":this.options.max,\"aria-valuenow\":value});if(this.overlayDiv){this.overlayDiv.remove();this.overlayDiv=null;}}if(this.oldValue!==value){this.oldValue=value;this._trigger(\"change\");}if(value===this.options.max){this._trigger(\"complete\");}}});/*!\n * jQuery UI Selectable 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Selectable\n//>>group: Interactions\n//>>description: Allows groups of elements to be selected with the mouse.\n//>>docs: http://api.jqueryui.com/selectable/\n//>>demos: http://jqueryui.com/selectable/\n//>>css.structure: ../../themes/base/selectable.css\nvar widgetsSelectable=$.widget(\"ui.selectable\",$.ui.mouse,{version:\"1.13.2\",options:{appendTo:\"body\",autoRefresh:true,distance:0,filter:\"*\",tolerance:\"touch\",// Callbacks\nselected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function _create(){var that=this;this._addClass(\"ui-selectable\");this.dragged=false;// Cache selectee children based on filter\nthis.refresh=function(){that.elementPos=$(that.element[0]).offset();that.selectees=$(that.options.filter,that.element[0]);that._addClass(that.selectees,\"ui-selectee\");that.selectees.each(function(){var $this=$(this),selecteeOffset=$this.offset(),pos={left:selecteeOffset.left-that.elementPos.left,top:selecteeOffset.top-that.elementPos.top};$.data(this,\"selectable-item\",{element:this,$element:$this,left:pos.left,top:pos.top,right:pos.left+$this.outerWidth(),bottom:pos.top+$this.outerHeight(),startselected:false,selected:$this.hasClass(\"ui-selected\"),selecting:$this.hasClass(\"ui-selecting\"),unselecting:$this.hasClass(\"ui-unselecting\")});});};this.refresh();this._mouseInit();this.helper=$(\"<div>\");this._addClass(this.helper,\"ui-selectable-helper\");},_destroy:function _destroy(){this.selectees.removeData(\"selectable-item\");this._mouseDestroy();},_mouseStart:function _mouseStart(event){var that=this,options=this.options;this.opos=[event.pageX,event.pageY];this.elementPos=$(this.element[0]).offset();if(this.options.disabled){return;}this.selectees=$(options.filter,this.element[0]);this._trigger(\"start\",event);$(options.appendTo).append(this.helper);// position helper (lasso)\nthis.helper.css({\"left\":event.pageX,\"top\":event.pageY,\"width\":0,\"height\":0});if(options.autoRefresh){this.refresh();}this.selectees.filter(\".ui-selected\").each(function(){var selectee=$.data(this,\"selectable-item\");selectee.startselected=true;if(!event.metaKey&&!event.ctrlKey){that._removeClass(selectee.$element,\"ui-selected\");selectee.selected=false;that._addClass(selectee.$element,\"ui-unselecting\");selectee.unselecting=true;// selectable UNSELECTING callback\nthat._trigger(\"unselecting\",event,{unselecting:selectee.element});}});$(event.target).parents().addBack().each(function(){var doSelect,selectee=$.data(this,\"selectable-item\");if(selectee){doSelect=!event.metaKey&&!event.ctrlKey||!selectee.$element.hasClass(\"ui-selected\");that._removeClass(selectee.$element,doSelect?\"ui-unselecting\":\"ui-selected\")._addClass(selectee.$element,doSelect?\"ui-selecting\":\"ui-unselecting\");selectee.unselecting=!doSelect;selectee.selecting=doSelect;selectee.selected=doSelect;// selectable (UN)SELECTING callback\nif(doSelect){that._trigger(\"selecting\",event,{selecting:selectee.element});}else{that._trigger(\"unselecting\",event,{unselecting:selectee.element});}return false;}});},_mouseDrag:function _mouseDrag(event){this.dragged=true;if(this.options.disabled){return;}var tmp,that=this,options=this.options,x1=this.opos[0],y1=this.opos[1],x2=event.pageX,y2=event.pageY;if(x1>x2){tmp=x2;x2=x1;x1=tmp;}if(y1>y2){tmp=y2;y2=y1;y1=tmp;}this.helper.css({left:x1,top:y1,width:x2-x1,height:y2-y1});this.selectees.each(function(){var selectee=$.data(this,\"selectable-item\"),hit=false,offset={};//prevent helper from being selected if appendTo: selectable\nif(!selectee||selectee.element===that.element[0]){return;}offset.left=selectee.left+that.elementPos.left;offset.right=selectee.right+that.elementPos.left;offset.top=selectee.top+that.elementPos.top;offset.bottom=selectee.bottom+that.elementPos.top;if(options.tolerance===\"touch\"){hit=!(offset.left>x2||offset.right<x1||offset.top>y2||offset.bottom<y1);}else if(options.tolerance===\"fit\"){hit=offset.left>x1&&offset.right<x2&&offset.top>y1&&offset.bottom<y2;}if(hit){// SELECT\nif(selectee.selected){that._removeClass(selectee.$element,\"ui-selected\");selectee.selected=false;}if(selectee.unselecting){that._removeClass(selectee.$element,\"ui-unselecting\");selectee.unselecting=false;}if(!selectee.selecting){that._addClass(selectee.$element,\"ui-selecting\");selectee.selecting=true;// selectable SELECTING callback\nthat._trigger(\"selecting\",event,{selecting:selectee.element});}}else{// UNSELECT\nif(selectee.selecting){if((event.metaKey||event.ctrlKey)&&selectee.startselected){that._removeClass(selectee.$element,\"ui-selecting\");selectee.selecting=false;that._addClass(selectee.$element,\"ui-selected\");selectee.selected=true;}else{that._removeClass(selectee.$element,\"ui-selecting\");selectee.selecting=false;if(selectee.startselected){that._addClass(selectee.$element,\"ui-unselecting\");selectee.unselecting=true;}// selectable UNSELECTING callback\nthat._trigger(\"unselecting\",event,{unselecting:selectee.element});}}if(selectee.selected){if(!event.metaKey&&!event.ctrlKey&&!selectee.startselected){that._removeClass(selectee.$element,\"ui-selected\");selectee.selected=false;that._addClass(selectee.$element,\"ui-unselecting\");selectee.unselecting=true;// selectable UNSELECTING callback\nthat._trigger(\"unselecting\",event,{unselecting:selectee.element});}}}});return false;},_mouseStop:function _mouseStop(event){var that=this;this.dragged=false;$(\".ui-unselecting\",this.element[0]).each(function(){var selectee=$.data(this,\"selectable-item\");that._removeClass(selectee.$element,\"ui-unselecting\");selectee.unselecting=false;selectee.startselected=false;that._trigger(\"unselected\",event,{unselected:selectee.element});});$(\".ui-selecting\",this.element[0]).each(function(){var selectee=$.data(this,\"selectable-item\");that._removeClass(selectee.$element,\"ui-selecting\")._addClass(selectee.$element,\"ui-selected\");selectee.selecting=false;selectee.selected=true;selectee.startselected=true;that._trigger(\"selected\",event,{selected:selectee.element});});this._trigger(\"stop\",event);this.helper.remove();return false;}});/*!\n * jQuery UI Selectmenu 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Selectmenu\n//>>group: Widgets\n/* eslint-disable max-len */ //>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.\n/* eslint-enable max-len */ //>>docs: http://api.jqueryui.com/selectmenu/\n//>>demos: http://jqueryui.com/selectmenu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\nvar widgetsSelectmenu=$.widget(\"ui.selectmenu\",[$.ui.formResetMixin,{version:\"1.13.2\",defaultElement:\"<select>\",options:{appendTo:null,classes:{\"ui-selectmenu-button-open\":\"ui-corner-top\",\"ui-selectmenu-button-closed\":\"ui-corner-all\"},disabled:null,icons:{button:\"ui-icon-triangle-1-s\"},position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},width:false,// Callbacks\nchange:null,close:null,focus:null,open:null,select:null},_create:function _create(){var selectmenuId=this.element.uniqueId().attr(\"id\");this.ids={element:selectmenuId,button:selectmenuId+\"-button\",menu:selectmenuId+\"-menu\"};this._drawButton();this._drawMenu();this._bindFormResetHandler();this._rendered=false;this.menuItems=$();},_drawButton:function _drawButton(){var icon,that=this,item=this._parseOption(this.element.find(\"option:selected\"),this.element[0].selectedIndex);// Associate existing label with the new button\nthis.labels=this.element.labels().attr(\"for\",this.ids.button);this._on(this.labels,{click:function click(event){this.button.trigger(\"focus\");event.preventDefault();}});// Hide original select element\nthis.element.hide();// Create button\nthis.button=$(\"<span>\",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:\"combobox\",\"aria-expanded\":\"false\",\"aria-autocomplete\":\"list\",\"aria-owns\":this.ids.menu,\"aria-haspopup\":\"true\",title:this.element.attr(\"title\")}).insertAfter(this.element);this._addClass(this.button,\"ui-selectmenu-button ui-selectmenu-button-closed\",\"ui-button ui-widget\");icon=$(\"<span>\").appendTo(this.button);this._addClass(icon,\"ui-selectmenu-icon\",\"ui-icon \"+this.options.icons.button);this.buttonItem=this._renderButtonItem(item).appendTo(this.button);if(this.options.width!==false){this._resizeButton();}this._on(this.button,this._buttonEvents);this.button.one(\"focusin\",function(){// Delay rendering the menu items until the button receives focus.\n// The menu may have already been rendered via a programmatic open.\nif(!that._rendered){that._refreshMenu();}});},_drawMenu:function _drawMenu(){var that=this;// Create menu\nthis.menu=$(\"<ul>\",{\"aria-hidden\":\"true\",\"aria-labelledby\":this.ids.button,id:this.ids.menu});// Wrap menu\nthis.menuWrap=$(\"<div>\").append(this.menu);this._addClass(this.menuWrap,\"ui-selectmenu-menu\",\"ui-front\");this.menuWrap.appendTo(this._appendTo());// Initialize menu widget\nthis.menuInstance=this.menu.menu({classes:{\"ui-menu\":\"ui-corner-bottom\"},role:\"listbox\",select:function select(event,ui){event.preventDefault();// Support: IE8\n// If the item was selected via a click, the text selection\n// will be destroyed in IE\nthat._setSelection();that._select(ui.item.data(\"ui-selectmenu-item\"),event);},focus:function focus(event,ui){var item=ui.item.data(\"ui-selectmenu-item\");// Prevent inital focus from firing and check if its a newly focused item\nif(that.focusIndex!=null&&item.index!==that.focusIndex){that._trigger(\"focus\",event,{item:item});if(!that.isOpen){that._select(item,event);}}that.focusIndex=item.index;that.button.attr(\"aria-activedescendant\",that.menuItems.eq(item.index).attr(\"id\"));}}).menu(\"instance\");// Don't close the menu on mouseleave\nthis.menuInstance._off(this.menu,\"mouseleave\");// Cancel the menu's collapseAll on document click\nthis.menuInstance._closeOnDocumentClick=function(){return false;};// Selects often contain empty items, but never contain dividers\nthis.menuInstance._isDivider=function(){return false;};},refresh:function refresh(){this._refreshMenu();this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(// Fall back to an empty object in case there are no options\nthis._getSelectedItem().data(\"ui-selectmenu-item\")||{}));if(this.options.width===null){this._resizeButton();}},_refreshMenu:function _refreshMenu(){var item,options=this.element.find(\"option\");this.menu.empty();this._parseOptions(options);this._renderMenu(this.menu,this.items);this.menuInstance.refresh();this.menuItems=this.menu.find(\"li\").not(\".ui-selectmenu-optgroup\").find(\".ui-menu-item-wrapper\");this._rendered=true;if(!options.length){return;}item=this._getSelectedItem();// Update the menu to have the correct item focused\nthis.menuInstance.focus(null,item);this._setAria(item.data(\"ui-selectmenu-item\"));// Set disabled state\nthis._setOption(\"disabled\",this.element.prop(\"disabled\"));},open:function open(event){if(this.options.disabled){return;}// If this is the first time the menu is being opened, render the items\nif(!this._rendered){this._refreshMenu();}else{// Menu clears focus on close, reset focus to selected item\nthis._removeClass(this.menu.find(\".ui-state-active\"),null,\"ui-state-active\");this.menuInstance.focus(null,this._getSelectedItem());}// If there are no options, don't open the menu\nif(!this.menuItems.length){return;}this.isOpen=true;this._toggleAttr();this._resizeMenu();this._position();this._on(this.document,this._documentClick);this._trigger(\"open\",event);},_position:function _position(){this.menuWrap.position($.extend({of:this.button},this.options.position));},close:function close(event){if(!this.isOpen){return;}this.isOpen=false;this._toggleAttr();this.range=null;this._off(this.document);this._trigger(\"close\",event);},widget:function widget(){return this.button;},menuWidget:function menuWidget(){return this.menu;},_renderButtonItem:function _renderButtonItem(item){var buttonItem=$(\"<span>\");this._setText(buttonItem,item.label);this._addClass(buttonItem,\"ui-selectmenu-text\");return buttonItem;},_renderMenu:function _renderMenu(ul,items){var that=this,currentOptgroup=\"\";$.each(items,function(index,item){var li;if(item.optgroup!==currentOptgroup){li=$(\"<li>\",{text:item.optgroup});that._addClass(li,\"ui-selectmenu-optgroup\",\"ui-menu-divider\"+(item.element.parent(\"optgroup\").prop(\"disabled\")?\" ui-state-disabled\":\"\"));li.appendTo(ul);currentOptgroup=item.optgroup;}that._renderItemData(ul,item);});},_renderItemData:function _renderItemData(ul,item){return this._renderItem(ul,item).data(\"ui-selectmenu-item\",item);},_renderItem:function _renderItem(ul,item){var li=$(\"<li>\"),wrapper=$(\"<div>\",{title:item.element.attr(\"title\")});if(item.disabled){this._addClass(li,null,\"ui-state-disabled\");}this._setText(wrapper,item.label);return li.append(wrapper).appendTo(ul);},_setText:function _setText(element,value){if(value){element.text(value);}else{element.html(\"&#160;\");}},_move:function _move(direction,event){var item,next,filter=\".ui-menu-item\";if(this.isOpen){item=this.menuItems.eq(this.focusIndex).parent(\"li\");}else{item=this.menuItems.eq(this.element[0].selectedIndex).parent(\"li\");filter+=\":not(.ui-state-disabled)\";}if(direction===\"first\"||direction===\"last\"){next=item[direction===\"first\"?\"prevAll\":\"nextAll\"](filter).eq(-1);}else{next=item[direction+\"All\"](filter).eq(0);}if(next.length){this.menuInstance.focus(event,next);}},_getSelectedItem:function _getSelectedItem(){return this.menuItems.eq(this.element[0].selectedIndex).parent(\"li\");},_toggle:function _toggle(event){this[this.isOpen?\"close\":\"open\"](event);},_setSelection:function _setSelection(){var selection;if(!this.range){return;}if(window.getSelection){selection=window.getSelection();selection.removeAllRanges();selection.addRange(this.range);// Support: IE8\n}else{this.range.select();}// Support: IE\n// Setting the text selection kills the button focus in IE, but\n// restoring the focus doesn't kill the selection.\nthis.button.trigger(\"focus\");},_documentClick:{mousedown:function mousedown(event){if(!this.isOpen){return;}if(!$(event.target).closest(\".ui-selectmenu-menu, #\"+$.escapeSelector(this.ids.button)).length){this.close(event);}}},_buttonEvents:{// Prevent text selection from being reset when interacting with the selectmenu (#10144)\nmousedown:function mousedown(){var selection;if(window.getSelection){selection=window.getSelection();if(selection.rangeCount){this.range=selection.getRangeAt(0);}// Support: IE8\n}else{this.range=document.selection.createRange();}},click:function click(event){this._setSelection();this._toggle(event);},keydown:function keydown(event){var preventDefault=true;switch(event.keyCode){case $.ui.keyCode.TAB:case $.ui.keyCode.ESCAPE:this.close(event);preventDefault=false;break;case $.ui.keyCode.ENTER:if(this.isOpen){this._selectFocusedItem(event);}break;case $.ui.keyCode.UP:if(event.altKey){this._toggle(event);}else{this._move(\"prev\",event);}break;case $.ui.keyCode.DOWN:if(event.altKey){this._toggle(event);}else{this._move(\"next\",event);}break;case $.ui.keyCode.SPACE:if(this.isOpen){this._selectFocusedItem(event);}else{this._toggle(event);}break;case $.ui.keyCode.LEFT:this._move(\"prev\",event);break;case $.ui.keyCode.RIGHT:this._move(\"next\",event);break;case $.ui.keyCode.HOME:case $.ui.keyCode.PAGE_UP:this._move(\"first\",event);break;case $.ui.keyCode.END:case $.ui.keyCode.PAGE_DOWN:this._move(\"last\",event);break;default:this.menu.trigger(event);preventDefault=false;}if(preventDefault){event.preventDefault();}}},_selectFocusedItem:function _selectFocusedItem(event){var item=this.menuItems.eq(this.focusIndex).parent(\"li\");if(!item.hasClass(\"ui-state-disabled\")){this._select(item.data(\"ui-selectmenu-item\"),event);}},_select:function _select(item,event){var oldIndex=this.element[0].selectedIndex;// Change native select element\nthis.element[0].selectedIndex=item.index;this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(item));this._setAria(item);this._trigger(\"select\",event,{item:item});if(item.index!==oldIndex){this._trigger(\"change\",event,{item:item});}this.close(event);},_setAria:function _setAria(item){var id=this.menuItems.eq(item.index).attr(\"id\");this.button.attr({\"aria-labelledby\":id,\"aria-activedescendant\":id});this.menu.attr(\"aria-activedescendant\",id);},_setOption:function _setOption(key,value){if(key===\"icons\"){var icon=this.button.find(\"span.ui-icon\");this._removeClass(icon,null,this.options.icons.button)._addClass(icon,null,value.button);}this._super(key,value);if(key===\"appendTo\"){this.menuWrap.appendTo(this._appendTo());}if(key===\"width\"){this._resizeButton();}},_setOptionDisabled:function _setOptionDisabled(value){this._super(value);this.menuInstance.option(\"disabled\",value);this.button.attr(\"aria-disabled\",value);this._toggleClass(this.button,null,\"ui-state-disabled\",value);this.element.prop(\"disabled\",value);if(value){this.button.attr(\"tabindex\",-1);this.close();}else{this.button.attr(\"tabindex\",0);}},_appendTo:function _appendTo(){var element=this.options.appendTo;if(element){element=element.jquery||element.nodeType?$(element):this.document.find(element).eq(0);}if(!element||!element[0]){element=this.element.closest(\".ui-front, dialog\");}if(!element.length){element=this.document[0].body;}return element;},_toggleAttr:function _toggleAttr(){this.button.attr(\"aria-expanded\",this.isOpen);// We can't use two _toggleClass() calls here, because we need to make sure\n// we always remove classes first and add them second, otherwise if both classes have the\n// same theme class, it will be removed after we add it.\nthis._removeClass(this.button,\"ui-selectmenu-button-\"+(this.isOpen?\"closed\":\"open\"))._addClass(this.button,\"ui-selectmenu-button-\"+(this.isOpen?\"open\":\"closed\"))._toggleClass(this.menuWrap,\"ui-selectmenu-open\",null,this.isOpen);this.menu.attr(\"aria-hidden\",!this.isOpen);},_resizeButton:function _resizeButton(){var width=this.options.width;// For `width: false`, just remove inline style and stop\nif(width===false){this.button.css(\"width\",\"\");return;}// For `width: null`, match the width of the original element\nif(width===null){width=this.element.show().outerWidth();this.element.hide();}this.button.outerWidth(width);},_resizeMenu:function _resizeMenu(){this.menu.outerWidth(Math.max(this.button.outerWidth(),// Support: IE10\n// IE10 wraps long text (possibly a rounding bug)\n// so we add 1px to avoid the wrapping\nthis.menu.width(\"\").outerWidth()+1));},_getCreateOptions:function _getCreateOptions(){var options=this._super();options.disabled=this.element.prop(\"disabled\");return options;},_parseOptions:function _parseOptions(options){var that=this,data=[];options.each(function(index,item){if(item.hidden){return;}data.push(that._parseOption($(item),index));});this.items=data;},_parseOption:function _parseOption(option,index){var optgroup=option.parent(\"optgroup\");return{element:option,index:index,value:option.val(),label:option.text(),optgroup:optgroup.attr(\"label\")||\"\",disabled:optgroup.prop(\"disabled\")||option.prop(\"disabled\")};},_destroy:function _destroy(){this._unbindFormResetHandler();this.menuWrap.remove();this.button.remove();this.element.show();this.element.removeUniqueId();this.labels.attr(\"for\",this.ids.element);}}]);/*!\n * jQuery UI Slider 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Slider\n//>>group: Widgets\n//>>description: Displays a flexible slider with ranges and accessibility via keyboard.\n//>>docs: http://api.jqueryui.com/slider/\n//>>demos: http://jqueryui.com/slider/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/slider.css\n//>>css.theme: ../../themes/base/theme.css\nvar widgetsSlider=$.widget(\"ui.slider\",$.ui.mouse,{version:\"1.13.2\",widgetEventPrefix:\"slide\",options:{animate:false,classes:{\"ui-slider\":\"ui-corner-all\",\"ui-slider-handle\":\"ui-corner-all\",// Note: ui-widget-header isn't the most fittingly semantic framework class for this\n// element, but worked best visually with a variety of themes\n\"ui-slider-range\":\"ui-corner-all ui-widget-header\"},distance:0,max:100,min:0,orientation:\"horizontal\",range:false,step:1,value:0,values:null,// Callbacks\nchange:null,slide:null,start:null,stop:null},// Number of pages in a slider\n// (how many times can you page up/down to go through the whole range)\nnumPages:5,_create:function _create(){this._keySliding=false;this._mouseSliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this._calculateNewMax();this._addClass(\"ui-slider ui-slider-\"+this.orientation,\"ui-widget ui-widget-content\");this._refresh();this._animateOff=false;},_refresh:function _refresh(){this._createRange();this._createHandles();this._setupEvents();this._refreshValue();},_createHandles:function _createHandles(){var i,handleCount,options=this.options,existingHandles=this.element.find(\".ui-slider-handle\"),handle=\"<span tabindex='0'></span>\",handles=[];handleCount=options.values&&options.values.length||1;if(existingHandles.length>handleCount){existingHandles.slice(handleCount).remove();existingHandles=existingHandles.slice(0,handleCount);}for(i=existingHandles.length;i<handleCount;i++){handles.push(handle);}this.handles=existingHandles.add($(handles.join(\"\")).appendTo(this.element));this._addClass(this.handles,\"ui-slider-handle\",\"ui-state-default\");this.handle=this.handles.eq(0);this.handles.each(function(i){$(this).data(\"ui-slider-handle-index\",i).attr(\"tabIndex\",0);});},_createRange:function _createRange(){var options=this.options;if(options.range){if(options.range===true){if(!options.values){options.values=[this._valueMin(),this._valueMin()];}else if(options.values.length&&options.values.length!==2){options.values=[options.values[0],options.values[0]];}else if(Array.isArray(options.values)){options.values=options.values.slice(0);}}if(!this.range||!this.range.length){this.range=$(\"<div>\").appendTo(this.element);this._addClass(this.range,\"ui-slider-range\");}else{this._removeClass(this.range,\"ui-slider-range-min ui-slider-range-max\");// Handle range switching from true to min/max\nthis.range.css({\"left\":\"\",\"bottom\":\"\"});}if(options.range===\"min\"||options.range===\"max\"){this._addClass(this.range,\"ui-slider-range-\"+options.range);}}else{if(this.range){this.range.remove();}this.range=null;}},_setupEvents:function _setupEvents(){this._off(this.handles);this._on(this.handles,this._handleEvents);this._hoverable(this.handles);this._focusable(this.handles);},_destroy:function _destroy(){this.handles.remove();if(this.range){this.range.remove();}this._mouseDestroy();},_mouseCapture:function _mouseCapture(event){var position,normValue,distance,closestHandle,index,allowed,offset,mouseOverHandle,that=this,o=this.options;if(o.disabled){return false;}this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();position={x:event.pageX,y:event.pageY};normValue=this._normValueFromMouse(position);distance=this._valueMax()-this._valueMin()+1;this.handles.each(function(i){var thisDistance=Math.abs(normValue-that.values(i));if(distance>thisDistance||distance===thisDistance&&(i===that._lastChangedValue||that.values(i)===o.min)){distance=thisDistance;closestHandle=$(this);index=i;}});allowed=this._start(event,index);if(allowed===false){return false;}this._mouseSliding=true;this._handleIndex=index;this._addClass(closestHandle,null,\"ui-state-active\");closestHandle.trigger(\"focus\");offset=closestHandle.offset();mouseOverHandle=!$(event.target).parents().addBack().is(\".ui-slider-handle\");this._clickOffset=mouseOverHandle?{left:0,top:0}:{left:event.pageX-offset.left-closestHandle.width()/2,top:event.pageY-offset.top-closestHandle.height()/2-(parseInt(closestHandle.css(\"borderTopWidth\"),10)||0)-(parseInt(closestHandle.css(\"borderBottomWidth\"),10)||0)+(parseInt(closestHandle.css(\"marginTop\"),10)||0)};if(!this.handles.hasClass(\"ui-state-hover\")){this._slide(event,index,normValue);}this._animateOff=true;return true;},_mouseStart:function _mouseStart(){return true;},_mouseDrag:function _mouseDrag(event){var position={x:event.pageX,y:event.pageY},normValue=this._normValueFromMouse(position);this._slide(event,this._handleIndex,normValue);return false;},_mouseStop:function _mouseStop(event){this._removeClass(this.handles,null,\"ui-state-active\");this._mouseSliding=false;this._stop(event,this._handleIndex);this._change(event,this._handleIndex);this._handleIndex=null;this._clickOffset=null;this._animateOff=false;return false;},_detectOrientation:function _detectOrientation(){this.orientation=this.options.orientation===\"vertical\"?\"vertical\":\"horizontal\";},_normValueFromMouse:function _normValueFromMouse(position){var pixelTotal,pixelMouse,percentMouse,valueTotal,valueMouse;if(this.orientation===\"horizontal\"){pixelTotal=this.elementSize.width;pixelMouse=position.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0);}else{pixelTotal=this.elementSize.height;pixelMouse=position.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0);}percentMouse=pixelMouse/pixelTotal;if(percentMouse>1){percentMouse=1;}if(percentMouse<0){percentMouse=0;}if(this.orientation===\"vertical\"){percentMouse=1-percentMouse;}valueTotal=this._valueMax()-this._valueMin();valueMouse=this._valueMin()+percentMouse*valueTotal;return this._trimAlignValue(valueMouse);},_uiHash:function _uiHash(index,value,values){var uiHash={handle:this.handles[index],handleIndex:index,value:value!==undefined?value:this.value()};if(this._hasMultipleValues()){uiHash.value=value!==undefined?value:this.values(index);uiHash.values=values||this.values();}return uiHash;},_hasMultipleValues:function _hasMultipleValues(){return this.options.values&&this.options.values.length;},_start:function _start(event,index){return this._trigger(\"start\",event,this._uiHash(index));},_slide:function _slide(event,index,newVal){var allowed,otherVal,currentValue=this.value(),newValues=this.values();if(this._hasMultipleValues()){otherVal=this.values(index?0:1);currentValue=this.values(index);if(this.options.values.length===2&&this.options.range===true){newVal=index===0?Math.min(otherVal,newVal):Math.max(otherVal,newVal);}newValues[index]=newVal;}if(newVal===currentValue){return;}allowed=this._trigger(\"slide\",event,this._uiHash(index,newVal,newValues));// A slide can be canceled by returning false from the slide callback\nif(allowed===false){return;}if(this._hasMultipleValues()){this.values(index,newVal);}else{this.value(newVal);}},_stop:function _stop(event,index){this._trigger(\"stop\",event,this._uiHash(index));},_change:function _change(event,index){if(!this._keySliding&&!this._mouseSliding){//store the last changed value index for reference when handles overlap\nthis._lastChangedValue=index;this._trigger(\"change\",event,this._uiHash(index));}},value:function value(newValue){if(arguments.length){this.options.value=this._trimAlignValue(newValue);this._refreshValue();this._change(null,0);return;}return this._value();},values:function values(index,newValue){var vals,newValues,i;if(arguments.length>1){this.options.values[index]=this._trimAlignValue(newValue);this._refreshValue();this._change(null,index);return;}if(arguments.length){if(Array.isArray(arguments[0])){vals=this.options.values;newValues=arguments[0];for(i=0;i<vals.length;i+=1){vals[i]=this._trimAlignValue(newValues[i]);this._change(null,i);}this._refreshValue();}else{if(this._hasMultipleValues()){return this._values(index);}else{return this.value();}}}else{return this._values();}},_setOption:function _setOption(key,value){var i,valsLength=0;if(key===\"range\"&&this.options.range===true){if(value===\"min\"){this.options.value=this._values(0);this.options.values=null;}else if(value===\"max\"){this.options.value=this._values(this.options.values.length-1);this.options.values=null;}}if(Array.isArray(this.options.values)){valsLength=this.options.values.length;}this._super(key,value);switch(key){case\"orientation\":this._detectOrientation();this._removeClass(\"ui-slider-horizontal ui-slider-vertical\")._addClass(\"ui-slider-\"+this.orientation);this._refreshValue();if(this.options.range){this._refreshRange(value);}// Reset positioning from previous orientation\nthis.handles.css(value===\"horizontal\"?\"bottom\":\"left\",\"\");break;case\"value\":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case\"values\":this._animateOff=true;this._refreshValue();// Start from the last handle to prevent unreachable handles (#9046)\nfor(i=valsLength-1;i>=0;i--){this._change(null,i);}this._animateOff=false;break;case\"step\":case\"min\":case\"max\":this._animateOff=true;this._calculateNewMax();this._refreshValue();this._animateOff=false;break;case\"range\":this._animateOff=true;this._refresh();this._animateOff=false;break;}},_setOptionDisabled:function _setOptionDisabled(value){this._super(value);this._toggleClass(null,\"ui-state-disabled\",!!value);},//internal value getter\n// _value() returns value trimmed by min and max, aligned by step\n_value:function _value(){var val=this.options.value;val=this._trimAlignValue(val);return val;},//internal values getter\n// _values() returns array of values trimmed by min and max, aligned by step\n// _values( index ) returns single value trimmed by min and max, aligned by step\n_values:function _values(index){var val,vals,i;if(arguments.length){val=this.options.values[index];val=this._trimAlignValue(val);return val;}else if(this._hasMultipleValues()){// .slice() creates a copy of the array\n// this copy gets trimmed by min and max and then returned\nvals=this.options.values.slice();for(i=0;i<vals.length;i+=1){vals[i]=this._trimAlignValue(vals[i]);}return vals;}else{return[];}},// Returns the step-aligned value that val is closest to, between (inclusive) min and max\n_trimAlignValue:function _trimAlignValue(val){if(val<=this._valueMin()){return this._valueMin();}if(val>=this._valueMax()){return this._valueMax();}var step=this.options.step>0?this.options.step:1,valModStep=(val-this._valueMin())%step,alignValue=val-valModStep;if(Math.abs(valModStep)*2>=step){alignValue+=valModStep>0?step:-step;}// Since JavaScript has problems with large floats, round\n// the final value to 5 digits after the decimal point (see #4124)\nreturn parseFloat(alignValue.toFixed(5));},_calculateNewMax:function _calculateNewMax(){var max=this.options.max,min=this._valueMin(),step=this.options.step,aboveMin=Math.round((max-min)/step)*step;max=aboveMin+min;if(max>this.options.max){//If max is not divisible by step, rounding off may increase its value\nmax-=step;}this.max=parseFloat(max.toFixed(this._precision()));},_precision:function _precision(){var precision=this._precisionOf(this.options.step);if(this.options.min!==null){precision=Math.max(precision,this._precisionOf(this.options.min));}return precision;},_precisionOf:function _precisionOf(num){var str=num.toString(),decimal=str.indexOf(\".\");return decimal===-1?0:str.length-decimal-1;},_valueMin:function _valueMin(){return this.options.min;},_valueMax:function _valueMax(){return this.max;},_refreshRange:function _refreshRange(orientation){if(orientation===\"vertical\"){this.range.css({\"width\":\"\",\"left\":\"\"});}if(orientation===\"horizontal\"){this.range.css({\"height\":\"\",\"bottom\":\"\"});}},_refreshValue:function _refreshValue(){var lastValPercent,valPercent,value,valueMin,valueMax,oRange=this.options.range,o=this.options,that=this,animate=!this._animateOff?o.animate:false,_set={};if(this._hasMultipleValues()){this.handles.each(function(i){valPercent=(that.values(i)-that._valueMin())/(that._valueMax()-that._valueMin())*100;_set[that.orientation===\"horizontal\"?\"left\":\"bottom\"]=valPercent+\"%\";$(this).stop(1,1)[animate?\"animate\":\"css\"](_set,o.animate);if(that.options.range===true){if(that.orientation===\"horizontal\"){if(i===0){that.range.stop(1,1)[animate?\"animate\":\"css\"]({left:valPercent+\"%\"},o.animate);}if(i===1){that.range[animate?\"animate\":\"css\"]({width:valPercent-lastValPercent+\"%\"},{queue:false,duration:o.animate});}}else{if(i===0){that.range.stop(1,1)[animate?\"animate\":\"css\"]({bottom:valPercent+\"%\"},o.animate);}if(i===1){that.range[animate?\"animate\":\"css\"]({height:valPercent-lastValPercent+\"%\"},{queue:false,duration:o.animate});}}}lastValPercent=valPercent;});}else{value=this.value();valueMin=this._valueMin();valueMax=this._valueMax();valPercent=valueMax!==valueMin?(value-valueMin)/(valueMax-valueMin)*100:0;_set[this.orientation===\"horizontal\"?\"left\":\"bottom\"]=valPercent+\"%\";this.handle.stop(1,1)[animate?\"animate\":\"css\"](_set,o.animate);if(oRange===\"min\"&&this.orientation===\"horizontal\"){this.range.stop(1,1)[animate?\"animate\":\"css\"]({width:valPercent+\"%\"},o.animate);}if(oRange===\"max\"&&this.orientation===\"horizontal\"){this.range.stop(1,1)[animate?\"animate\":\"css\"]({width:100-valPercent+\"%\"},o.animate);}if(oRange===\"min\"&&this.orientation===\"vertical\"){this.range.stop(1,1)[animate?\"animate\":\"css\"]({height:valPercent+\"%\"},o.animate);}if(oRange===\"max\"&&this.orientation===\"vertical\"){this.range.stop(1,1)[animate?\"animate\":\"css\"]({height:100-valPercent+\"%\"},o.animate);}}},_handleEvents:{keydown:function keydown(event){var allowed,curVal,newVal,step,index=$(event.target).data(\"ui-slider-handle-index\");switch(event.keyCode){case $.ui.keyCode.HOME:case $.ui.keyCode.END:case $.ui.keyCode.PAGE_UP:case $.ui.keyCode.PAGE_DOWN:case $.ui.keyCode.UP:case $.ui.keyCode.RIGHT:case $.ui.keyCode.DOWN:case $.ui.keyCode.LEFT:event.preventDefault();if(!this._keySliding){this._keySliding=true;this._addClass($(event.target),null,\"ui-state-active\");allowed=this._start(event,index);if(allowed===false){return;}}break;}step=this.options.step;if(this._hasMultipleValues()){curVal=newVal=this.values(index);}else{curVal=newVal=this.value();}switch(event.keyCode){case $.ui.keyCode.HOME:newVal=this._valueMin();break;case $.ui.keyCode.END:newVal=this._valueMax();break;case $.ui.keyCode.PAGE_UP:newVal=this._trimAlignValue(curVal+(this._valueMax()-this._valueMin())/this.numPages);break;case $.ui.keyCode.PAGE_DOWN:newVal=this._trimAlignValue(curVal-(this._valueMax()-this._valueMin())/this.numPages);break;case $.ui.keyCode.UP:case $.ui.keyCode.RIGHT:if(curVal===this._valueMax()){return;}newVal=this._trimAlignValue(curVal+step);break;case $.ui.keyCode.DOWN:case $.ui.keyCode.LEFT:if(curVal===this._valueMin()){return;}newVal=this._trimAlignValue(curVal-step);break;}this._slide(event,index,newVal);},keyup:function keyup(event){var index=$(event.target).data(\"ui-slider-handle-index\");if(this._keySliding){this._keySliding=false;this._stop(event,index);this._change(event,index);this._removeClass($(event.target),null,\"ui-state-active\");}}}});/*!\n * jQuery UI Sortable 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Sortable\n//>>group: Interactions\n//>>description: Enables items in a list to be sorted using the mouse.\n//>>docs: http://api.jqueryui.com/sortable/\n//>>demos: http://jqueryui.com/sortable/\n//>>css.structure: ../../themes/base/sortable.css\nvar widgetsSortable=$.widget(\"ui.sortable\",$.ui.mouse,{version:\"1.13.2\",widgetEventPrefix:\"sort\",ready:false,options:{appendTo:\"parent\",axis:false,connectWith:false,containment:false,cursor:\"auto\",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:\"original\",items:\"> *\",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:\"default\",tolerance:\"intersect\",zIndex:1000,// Callbacks\nactivate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function _isOverAxis(x,reference,size){return x>=reference&&x<reference+size;},_isFloating:function _isFloating(item){return /left|right/.test(item.css(\"float\"))||/inline|table-cell/.test(item.css(\"display\"));},_create:function _create(){this.containerCache={};this._addClass(\"ui-sortable\");//Get the items\nthis.refresh();//Let's determine the parent's offset\nthis.offset=this.element.offset();//Initialize mouse events for interaction\nthis._mouseInit();this._setHandleClassName();//We're ready to go\nthis.ready=true;},_setOption:function _setOption(key,value){this._super(key,value);if(key===\"handle\"){this._setHandleClassName();}},_setHandleClassName:function _setHandleClassName(){var that=this;this._removeClass(this.element.find(\".ui-sortable-handle\"),\"ui-sortable-handle\");$.each(this.items,function(){that._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,\"ui-sortable-handle\");});},_destroy:function _destroy(){this._mouseDestroy();for(var i=this.items.length-1;i>=0;i--){this.items[i].item.removeData(this.widgetName+\"-item\");}return this;},_mouseCapture:function _mouseCapture(event,overrideHandle){var currentItem=null,validHandle=false,that=this;if(this.reverting){return false;}if(this.options.disabled||this.options.type===\"static\"){return false;}//We have to refresh the items data once first\nthis._refreshItems(event);//Find out if the clicked node (or one of its parents) is a actual item in this.items\n$(event.target).parents().each(function(){if($.data(this,that.widgetName+\"-item\")===that){currentItem=$(this);return false;}});if($.data(event.target,that.widgetName+\"-item\")===that){currentItem=$(event.target);}if(!currentItem){return false;}if(this.options.handle&&!overrideHandle){$(this.options.handle,currentItem).find(\"*\").addBack().each(function(){if(this===event.target){validHandle=true;}});if(!validHandle){return false;}}this.currentItem=currentItem;this._removeCurrentsFromItems();return true;},_mouseStart:function _mouseStart(event,overrideHandle,noActivation){var i,body,o=this.options;this.currentContainer=this;//We only need to call refreshPositions, because the refreshItems call has been moved to\n// mouseCapture\nthis.refreshPositions();//Prepare the dragged items parent\nthis.appendTo=$(o.appendTo!==\"parent\"?o.appendTo:this.currentItem.parent());//Create and append the visible helper\nthis.helper=this._createHelper(event);//Cache the helper size\nthis._cacheHelperProportions();/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */ //Cache the margins of the original element\nthis._cacheMargins();//The element's absolute position on the page minus margins\nthis.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};$.extend(this.offset,{click:{//Where the click happened, relative to the element\nleft:event.pageX-this.offset.left,top:event.pageY-this.offset.top},// This is a relative to absolute position minus the actual position calculation -\n// only used for relative positioned helper\nrelative:this._getRelativeOffset()});// After we get the helper offset, but before we get the parent offset we can\n// change the helper's position to absolute\n// TODO: Still need to figure out a way to make relative sorting possible\nthis.helper.css(\"position\",\"absolute\");this.cssPosition=this.helper.css(\"position\");//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\nif(o.cursorAt){this._adjustOffsetFromHelper(o.cursorAt);}//Cache the former DOM position\nthis.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};// If the helper is not the original, hide the original so it's not playing any role during\n// the drag, won't cause anything bad this way\nif(this.helper[0]!==this.currentItem[0]){this.currentItem.hide();}//Create the placeholder\nthis._createPlaceholder();//Get the next scrolling parent\nthis.scrollParent=this.placeholder.scrollParent();$.extend(this.offset,{parent:this._getParentOffset()});//Set a containment if given in the options\nif(o.containment){this._setContainment();}if(o.cursor&&o.cursor!==\"auto\"){// cursor option\nbody=this.document.find(\"body\");// Support: IE\nthis.storedCursor=body.css(\"cursor\");body.css(\"cursor\",o.cursor);this.storedStylesheet=$(\"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\").appendTo(body);}// We need to make sure to grab the zIndex before setting the\n// opacity, because setting the opacity to anything lower than 1\n// causes the zIndex to change from \"auto\" to 0.\nif(o.zIndex){// zIndex option\nif(this.helper.css(\"zIndex\")){this._storedZIndex=this.helper.css(\"zIndex\");}this.helper.css(\"zIndex\",o.zIndex);}if(o.opacity){// opacity option\nif(this.helper.css(\"opacity\")){this._storedOpacity=this.helper.css(\"opacity\");}this.helper.css(\"opacity\",o.opacity);}//Prepare scrolling\nif(this.scrollParent[0]!==this.document[0]&&this.scrollParent[0].tagName!==\"HTML\"){this.overflowOffset=this.scrollParent.offset();}//Call callbacks\nthis._trigger(\"start\",event,this._uiHash());//Recache the helper size\nif(!this._preserveHelperProportions){this._cacheHelperProportions();}//Post \"activate\" events to possible containers\nif(!noActivation){for(i=this.containers.length-1;i>=0;i--){this.containers[i]._trigger(\"activate\",event,this._uiHash(this));}}//Prepare possible droppables\nif($.ui.ddmanager){$.ui.ddmanager.current=this;}if($.ui.ddmanager&&!o.dropBehaviour){$.ui.ddmanager.prepareOffsets(this,event);}this.dragging=true;this._addClass(this.helper,\"ui-sortable-helper\");//Move the helper, if needed\nif(!this.helper.parent().is(this.appendTo)){this.helper.detach().appendTo(this.appendTo);//Update position\nthis.offset.parent=this._getParentOffset();}//Generate the original position\nthis.position=this.originalPosition=this._generatePosition(event);this.originalPageX=event.pageX;this.originalPageY=event.pageY;this.lastPositionAbs=this.positionAbs=this._convertPositionTo(\"absolute\");this._mouseDrag(event);return true;},_scroll:function _scroll(event){var o=this.options,scrolled=false;if(this.scrollParent[0]!==this.document[0]&&this.scrollParent[0].tagName!==\"HTML\"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-event.pageY<o.scrollSensitivity){this.scrollParent[0].scrollTop=scrolled=this.scrollParent[0].scrollTop+o.scrollSpeed;}else if(event.pageY-this.overflowOffset.top<o.scrollSensitivity){this.scrollParent[0].scrollTop=scrolled=this.scrollParent[0].scrollTop-o.scrollSpeed;}if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-event.pageX<o.scrollSensitivity){this.scrollParent[0].scrollLeft=scrolled=this.scrollParent[0].scrollLeft+o.scrollSpeed;}else if(event.pageX-this.overflowOffset.left<o.scrollSensitivity){this.scrollParent[0].scrollLeft=scrolled=this.scrollParent[0].scrollLeft-o.scrollSpeed;}}else{if(event.pageY-this.document.scrollTop()<o.scrollSensitivity){scrolled=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed);}else if(this.window.height()-(event.pageY-this.document.scrollTop())<o.scrollSensitivity){scrolled=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed);}if(event.pageX-this.document.scrollLeft()<o.scrollSensitivity){scrolled=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed);}else if(this.window.width()-(event.pageX-this.document.scrollLeft())<o.scrollSensitivity){scrolled=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed);}}return scrolled;},_mouseDrag:function _mouseDrag(event){var i,item,itemElement,intersection,o=this.options;//Compute the helpers position\nthis.position=this._generatePosition(event);this.positionAbs=this._convertPositionTo(\"absolute\");//Set the helper position\nif(!this.options.axis||this.options.axis!==\"y\"){this.helper[0].style.left=this.position.left+\"px\";}if(!this.options.axis||this.options.axis!==\"x\"){this.helper[0].style.top=this.position.top+\"px\";}//Do scrolling\nif(o.scroll){if(this._scroll(event)!==false){//Update item positions used in position checks\nthis._refreshItemPositions(true);if($.ui.ddmanager&&!o.dropBehaviour){$.ui.ddmanager.prepareOffsets(this,event);}}}this.dragDirection={vertical:this._getDragVerticalDirection(),horizontal:this._getDragHorizontalDirection()};//Rearrange\nfor(i=this.items.length-1;i>=0;i--){//Cache variables and intersection, continue if no intersection\nitem=this.items[i];itemElement=item.item[0];intersection=this._intersectsWithPointer(item);if(!intersection){continue;}// Only put the placeholder inside the current Container, skip all\n// items from other containers. This works because when moving\n// an item from one container to another the\n// currentContainer is switched before the placeholder is moved.\n//\n// Without this, moving items in \"sub-sortables\" can cause\n// the placeholder to jitter between the outer and inner container.\nif(item.instance!==this.currentContainer){continue;}// Cannot intersect with itself\n// no useless actions that have been done before\n// no action if the item moved is the parent of the item checked\nif(itemElement!==this.currentItem[0]&&this.placeholder[intersection===1?\"next\":\"prev\"]()[0]!==itemElement&&!$.contains(this.placeholder[0],itemElement)&&(this.options.type===\"semi-dynamic\"?!$.contains(this.element[0],itemElement):true)){this.direction=intersection===1?\"down\":\"up\";if(this.options.tolerance===\"pointer\"||this._intersectsWithSides(item)){this._rearrange(event,item);}else{break;}this._trigger(\"change\",event,this._uiHash());break;}}//Post events to containers\nthis._contactContainers(event);//Interconnect with droppables\nif($.ui.ddmanager){$.ui.ddmanager.drag(this,event);}//Call callbacks\nthis._trigger(\"sort\",event,this._uiHash());this.lastPositionAbs=this.positionAbs;return false;},_mouseStop:function _mouseStop(event,noPropagation){if(!event){return;}//If we are using droppables, inform the manager about the drop\nif($.ui.ddmanager&&!this.options.dropBehaviour){$.ui.ddmanager.drop(this,event);}if(this.options.revert){var that=this,cur=this.placeholder.offset(),axis=this.options.axis,animation={};if(!axis||axis===\"x\"){animation.left=cur.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft);}if(!axis||axis===\"y\"){animation.top=cur.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop);}this.reverting=true;$(this.helper).animate(animation,parseInt(this.options.revert,10)||500,function(){that._clear(event);});}else{this._clear(event,noPropagation);}return false;},cancel:function cancel(){if(this.dragging){this._mouseUp(new $.Event(\"mouseup\",{target:null}));if(this.options.helper===\"original\"){this.currentItem.css(this._storedCSS);this._removeClass(this.currentItem,\"ui-sortable-helper\");}else{this.currentItem.show();}//Post deactivating events to containers\nfor(var i=this.containers.length-1;i>=0;i--){this.containers[i]._trigger(\"deactivate\",null,this._uiHash(this));if(this.containers[i].containerCache.over){this.containers[i]._trigger(\"out\",null,this._uiHash(this));this.containers[i].containerCache.over=0;}}}if(this.placeholder){//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n// it unbinds ALL events from the original node!\nif(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0]);}if(this.options.helper!==\"original\"&&this.helper&&this.helper[0].parentNode){this.helper.remove();}$.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){$(this.domPosition.prev).after(this.currentItem);}else{$(this.domPosition.parent).prepend(this.currentItem);}}return this;},serialize:function serialize(o){var items=this._getItemsAsjQuery(o&&o.connected),str=[];o=o||{};$(items).each(function(){var res=($(o.item||this).attr(o.attribute||\"id\")||\"\").match(o.expression||/(.+)[\\-=_](.+)/);if(res){str.push((o.key||res[1]+\"[]\")+\"=\"+(o.key&&o.expression?res[1]:res[2]));}});if(!str.length&&o.key){str.push(o.key+\"=\");}return str.join(\"&\");},toArray:function toArray(o){var items=this._getItemsAsjQuery(o&&o.connected),ret=[];o=o||{};items.each(function(){ret.push($(o.item||this).attr(o.attribute||\"id\")||\"\");});return ret;},/* Be careful with the following core functions */_intersectsWith:function _intersectsWith(item){var x1=this.positionAbs.left,x2=x1+this.helperProportions.width,y1=this.positionAbs.top,y2=y1+this.helperProportions.height,l=item.left,r=l+item.width,t=item.top,b=t+item.height,dyClick=this.offset.click.top,dxClick=this.offset.click.left,isOverElementHeight=this.options.axis===\"x\"||y1+dyClick>t&&y1+dyClick<b,isOverElementWidth=this.options.axis===\"y\"||x1+dxClick>l&&x1+dxClick<r,isOverElement=isOverElementHeight&&isOverElementWidth;if(this.options.tolerance===\"pointer\"||this.options.forcePointerForContainers||this.options.tolerance!==\"pointer\"&&this.helperProportions[this.floating?\"width\":\"height\"]>item[this.floating?\"width\":\"height\"]){return isOverElement;}else{return l<x1+this.helperProportions.width/2&&// Right Half\nx2-this.helperProportions.width/2<r&&// Left Half\nt<y1+this.helperProportions.height/2&&// Bottom Half\ny2-this.helperProportions.height/2<b;// Top Half\n}},_intersectsWithPointer:function _intersectsWithPointer(item){var verticalDirection,horizontalDirection,isOverElementHeight=this.options.axis===\"x\"||this._isOverAxis(this.positionAbs.top+this.offset.click.top,item.top,item.height),isOverElementWidth=this.options.axis===\"y\"||this._isOverAxis(this.positionAbs.left+this.offset.click.left,item.left,item.width),isOverElement=isOverElementHeight&&isOverElementWidth;if(!isOverElement){return false;}verticalDirection=this.dragDirection.vertical;horizontalDirection=this.dragDirection.horizontal;return this.floating?horizontalDirection===\"right\"||verticalDirection===\"down\"?2:1:verticalDirection&&(verticalDirection===\"down\"?2:1);},_intersectsWithSides:function _intersectsWithSides(item){var isOverBottomHalf=this._isOverAxis(this.positionAbs.top+this.offset.click.top,item.top+item.height/2,item.height),isOverRightHalf=this._isOverAxis(this.positionAbs.left+this.offset.click.left,item.left+item.width/2,item.width),verticalDirection=this.dragDirection.vertical,horizontalDirection=this.dragDirection.horizontal;if(this.floating&&horizontalDirection){return horizontalDirection===\"right\"&&isOverRightHalf||horizontalDirection===\"left\"&&!isOverRightHalf;}else{return verticalDirection&&(verticalDirection===\"down\"&&isOverBottomHalf||verticalDirection===\"up\"&&!isOverBottomHalf);}},_getDragVerticalDirection:function _getDragVerticalDirection(){var delta=this.positionAbs.top-this.lastPositionAbs.top;return delta!==0&&(delta>0?\"down\":\"up\");},_getDragHorizontalDirection:function _getDragHorizontalDirection(){var delta=this.positionAbs.left-this.lastPositionAbs.left;return delta!==0&&(delta>0?\"right\":\"left\");},refresh:function refresh(event){this._refreshItems(event);this._setHandleClassName();this.refreshPositions();return this;},_connectWith:function _connectWith(){var options=this.options;return options.connectWith.constructor===String?[options.connectWith]:options.connectWith;},_getItemsAsjQuery:function _getItemsAsjQuery(connected){var i,j,cur,inst,items=[],queries=[],connectWith=this._connectWith();if(connectWith&&connected){for(i=connectWith.length-1;i>=0;i--){cur=$(connectWith[i],this.document[0]);for(j=cur.length-1;j>=0;j--){inst=$.data(cur[j],this.widgetFullName);if(inst&&inst!==this&&!inst.options.disabled){queries.push([typeof inst.options.items===\"function\"?inst.options.items.call(inst.element):$(inst.options.items,inst.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"),inst]);}}}}queries.push([typeof this.options.items===\"function\"?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):$(this.options.items,this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"),this]);function addItems(){items.push(this);}for(i=queries.length-1;i>=0;i--){queries[i][0].each(addItems);}return $(items);},_removeCurrentsFromItems:function _removeCurrentsFromItems(){var list=this.currentItem.find(\":data(\"+this.widgetName+\"-item)\");this.items=$.grep(this.items,function(item){for(var j=0;j<list.length;j++){if(list[j]===item.item[0]){return false;}}return true;});},_refreshItems:function _refreshItems(event){this.items=[];this.containers=[this];var i,j,cur,inst,targetData,_queries,item,queriesLength,items=this.items,queries=[[typeof this.options.items===\"function\"?this.options.items.call(this.element[0],event,{item:this.currentItem}):$(this.options.items,this.element),this]],connectWith=this._connectWith();//Shouldn't be run the first time through due to massive slow-down\nif(connectWith&&this.ready){for(i=connectWith.length-1;i>=0;i--){cur=$(connectWith[i],this.document[0]);for(j=cur.length-1;j>=0;j--){inst=$.data(cur[j],this.widgetFullName);if(inst&&inst!==this&&!inst.options.disabled){queries.push([typeof inst.options.items===\"function\"?inst.options.items.call(inst.element[0],event,{item:this.currentItem}):$(inst.options.items,inst.element),inst]);this.containers.push(inst);}}}}for(i=queries.length-1;i>=0;i--){targetData=queries[i][1];_queries=queries[i][0];for(j=0,queriesLength=_queries.length;j<queriesLength;j++){item=$(_queries[j]);// Data for target checking (mouse manager)\nitem.data(this.widgetName+\"-item\",targetData);items.push({item:item,instance:targetData,width:0,height:0,left:0,top:0});}}},_refreshItemPositions:function _refreshItemPositions(fast){var i,item,t,p;for(i=this.items.length-1;i>=0;i--){item=this.items[i];//We ignore calculating positions of all connected containers when we're not over them\nif(this.currentContainer&&item.instance!==this.currentContainer&&item.item[0]!==this.currentItem[0]){continue;}t=this.options.toleranceElement?$(this.options.toleranceElement,item.item):item.item;if(!fast){item.width=t.outerWidth();item.height=t.outerHeight();}p=t.offset();item.left=p.left;item.top=p.top;}},refreshPositions:function refreshPositions(fast){// Determine whether items are being displayed horizontally\nthis.floating=this.items.length?this.options.axis===\"x\"||this._isFloating(this.items[0].item):false;// This has to be redone because due to the item being moved out/into the offsetParent,\n// the offsetParent's position will change\nif(this.offsetParent&&this.helper){this.offset.parent=this._getParentOffset();}this._refreshItemPositions(fast);var i,p;if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this);}else{for(i=this.containers.length-1;i>=0;i--){p=this.containers[i].element.offset();this.containers[i].containerCache.left=p.left;this.containers[i].containerCache.top=p.top;this.containers[i].containerCache.width=this.containers[i].element.outerWidth();this.containers[i].containerCache.height=this.containers[i].element.outerHeight();}}return this;},_createPlaceholder:function _createPlaceholder(that){that=that||this;var className,nodeName,o=that.options;if(!o.placeholder||o.placeholder.constructor===String){className=o.placeholder;nodeName=that.currentItem[0].nodeName.toLowerCase();o.placeholder={element:function element(){var element=$(\"<\"+nodeName+\">\",that.document[0]);that._addClass(element,\"ui-sortable-placeholder\",className||that.currentItem[0].className)._removeClass(element,\"ui-sortable-helper\");if(nodeName===\"tbody\"){that._createTrPlaceholder(that.currentItem.find(\"tr\").eq(0),$(\"<tr>\",that.document[0]).appendTo(element));}else if(nodeName===\"tr\"){that._createTrPlaceholder(that.currentItem,element);}else if(nodeName===\"img\"){element.attr(\"src\",that.currentItem.attr(\"src\"));}if(!className){element.css(\"visibility\",\"hidden\");}return element;},update:function update(container,p){// 1. If a className is set as 'placeholder option, we don't force sizes -\n// the class is responsible for that\n// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n// class name is specified\nif(className&&!o.forcePlaceholderSize){return;}// If the element doesn't have a actual height or width by itself (without\n// styles coming from a stylesheet), it receives the inline height and width\n// from the dragged item. Or, if it's a tbody or tr, it's going to have a height\n// anyway since we're populating them with <td>s above, but they're unlikely to\n// be the correct height on their own if the row heights are dynamic, so we'll\n// always assign the height of the dragged item given forcePlaceholderSize\n// is true.\nif(!p.height()||o.forcePlaceholderSize&&(nodeName===\"tbody\"||nodeName===\"tr\")){p.height(that.currentItem.innerHeight()-parseInt(that.currentItem.css(\"paddingTop\")||0,10)-parseInt(that.currentItem.css(\"paddingBottom\")||0,10));}if(!p.width()){p.width(that.currentItem.innerWidth()-parseInt(that.currentItem.css(\"paddingLeft\")||0,10)-parseInt(that.currentItem.css(\"paddingRight\")||0,10));}}};}//Create the placeholder\nthat.placeholder=$(o.placeholder.element.call(that.element,that.currentItem));//Append it after the actual current item\nthat.currentItem.after(that.placeholder);//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\no.placeholder.update(that,that.placeholder);},_createTrPlaceholder:function _createTrPlaceholder(sourceTr,targetTr){var that=this;sourceTr.children().each(function(){$(\"<td>&#160;</td>\",that.document[0]).attr(\"colspan\",$(this).attr(\"colspan\")||1).appendTo(targetTr);});},_contactContainers:function _contactContainers(event){var i,j,dist,itemWithLeastDistance,posProperty,sizeProperty,cur,nearBottom,floating,axis,innermostContainer=null,innermostIndex=null;// Get innermost container that intersects with item\nfor(i=this.containers.length-1;i>=0;i--){// Never consider a container that's located within the item itself\nif($.contains(this.currentItem[0],this.containers[i].element[0])){continue;}if(this._intersectsWith(this.containers[i].containerCache)){// If we've already found a container and it's more \"inner\" than this, then continue\nif(innermostContainer&&$.contains(this.containers[i].element[0],innermostContainer.element[0])){continue;}innermostContainer=this.containers[i];innermostIndex=i;}else{// container doesn't intersect. trigger \"out\" event if necessary\nif(this.containers[i].containerCache.over){this.containers[i]._trigger(\"out\",event,this._uiHash(this));this.containers[i].containerCache.over=0;}}}// If no intersecting containers found, return\nif(!innermostContainer){return;}// Move the item into the container if it's not there already\nif(this.containers.length===1){if(!this.containers[innermostIndex].containerCache.over){this.containers[innermostIndex]._trigger(\"over\",event,this._uiHash(this));this.containers[innermostIndex].containerCache.over=1;}}else{// When entering a new container, we will find the item with the least distance and\n// append our item near it\ndist=10000;itemWithLeastDistance=null;floating=innermostContainer.floating||this._isFloating(this.currentItem);posProperty=floating?\"left\":\"top\";sizeProperty=floating?\"width\":\"height\";axis=floating?\"pageX\":\"pageY\";for(j=this.items.length-1;j>=0;j--){if(!$.contains(this.containers[innermostIndex].element[0],this.items[j].item[0])){continue;}if(this.items[j].item[0]===this.currentItem[0]){continue;}cur=this.items[j].item.offset()[posProperty];nearBottom=false;if(event[axis]-cur>this.items[j][sizeProperty]/2){nearBottom=true;}if(Math.abs(event[axis]-cur)<dist){dist=Math.abs(event[axis]-cur);itemWithLeastDistance=this.items[j];this.direction=nearBottom?\"up\":\"down\";}}//Check if dropOnEmpty is enabled\nif(!itemWithLeastDistance&&!this.options.dropOnEmpty){return;}if(this.currentContainer===this.containers[innermostIndex]){if(!this.currentContainer.containerCache.over){this.containers[innermostIndex]._trigger(\"over\",event,this._uiHash());this.currentContainer.containerCache.over=1;}return;}if(itemWithLeastDistance){this._rearrange(event,itemWithLeastDistance,null,true);}else{this._rearrange(event,null,this.containers[innermostIndex].element,true);}this._trigger(\"change\",event,this._uiHash());this.containers[innermostIndex]._trigger(\"change\",event,this._uiHash(this));this.currentContainer=this.containers[innermostIndex];//Update the placeholder\nthis.options.placeholder.update(this.currentContainer,this.placeholder);//Update scrollParent\nthis.scrollParent=this.placeholder.scrollParent();//Update overflowOffset\nif(this.scrollParent[0]!==this.document[0]&&this.scrollParent[0].tagName!==\"HTML\"){this.overflowOffset=this.scrollParent.offset();}this.containers[innermostIndex]._trigger(\"over\",event,this._uiHash(this));this.containers[innermostIndex].containerCache.over=1;}},_createHelper:function _createHelper(event){var o=this.options,helper=typeof o.helper===\"function\"?$(o.helper.apply(this.element[0],[event,this.currentItem])):o.helper===\"clone\"?this.currentItem.clone():this.currentItem;//Add the helper to the DOM if that didn't happen already\nif(!helper.parents(\"body\").length){this.appendTo[0].appendChild(helper[0]);}if(helper[0]===this.currentItem[0]){this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css(\"position\"),top:this.currentItem.css(\"top\"),left:this.currentItem.css(\"left\")};}if(!helper[0].style.width||o.forceHelperSize){helper.width(this.currentItem.width());}if(!helper[0].style.height||o.forceHelperSize){helper.height(this.currentItem.height());}return helper;},_adjustOffsetFromHelper:function _adjustOffsetFromHelper(obj){if(typeof obj===\"string\"){obj=obj.split(\" \");}if(Array.isArray(obj)){obj={left:+obj[0],top:+obj[1]||0};}if(\"left\"in obj){this.offset.click.left=obj.left+this.margins.left;}if(\"right\"in obj){this.offset.click.left=this.helperProportions.width-obj.right+this.margins.left;}if(\"top\"in obj){this.offset.click.top=obj.top+this.margins.top;}if(\"bottom\"in obj){this.offset.click.top=this.helperProportions.height-obj.bottom+this.margins.top;}},_getParentOffset:function _getParentOffset(){//Get the offsetParent and cache its position\nthis.offsetParent=this.helper.offsetParent();var po=this.offsetParent.offset();// This is a special case where we need to modify a offset calculated on start, since the\n// following happened:\n// 1. The position of the helper is absolute, so it's position is calculated based on the\n// next positioned parent\n// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n// the document, which means that the scroll is included in the initial calculation of the\n// offset of the parent, and never recalculated upon drag\nif(this.cssPosition===\"absolute\"&&this.scrollParent[0]!==this.document[0]&&$.contains(this.scrollParent[0],this.offsetParent[0])){po.left+=this.scrollParent.scrollLeft();po.top+=this.scrollParent.scrollTop();}// This needs to be actually done for all browsers, since pageX/pageY includes this\n// information with an ugly IE fix\nif(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()===\"html\"&&$.ui.ie){po={top:0,left:0};}return{top:po.top+(parseInt(this.offsetParent.css(\"borderTopWidth\"),10)||0),left:po.left+(parseInt(this.offsetParent.css(\"borderLeftWidth\"),10)||0)};},_getRelativeOffset:function _getRelativeOffset(){if(this.cssPosition===\"relative\"){var p=this.currentItem.position();return{top:p.top-(parseInt(this.helper.css(\"top\"),10)||0)+this.scrollParent.scrollTop(),left:p.left-(parseInt(this.helper.css(\"left\"),10)||0)+this.scrollParent.scrollLeft()};}else{return{top:0,left:0};}},_cacheMargins:function _cacheMargins(){this.margins={left:parseInt(this.currentItem.css(\"marginLeft\"),10)||0,top:parseInt(this.currentItem.css(\"marginTop\"),10)||0};},_cacheHelperProportions:function _cacheHelperProportions(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()};},_setContainment:function _setContainment(){var ce,co,over,o=this.options;if(o.containment===\"parent\"){o.containment=this.helper[0].parentNode;}if(o.containment===\"document\"||o.containment===\"window\"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,o.containment===\"document\"?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,(o.containment===\"document\"?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];}if(!/^(document|window|parent)$/.test(o.containment)){ce=$(o.containment)[0];co=$(o.containment).offset();over=$(ce).css(\"overflow\")!==\"hidden\";this.containment=[co.left+(parseInt($(ce).css(\"borderLeftWidth\"),10)||0)+(parseInt($(ce).css(\"paddingLeft\"),10)||0)-this.margins.left,co.top+(parseInt($(ce).css(\"borderTopWidth\"),10)||0)+(parseInt($(ce).css(\"paddingTop\"),10)||0)-this.margins.top,co.left+(over?Math.max(ce.scrollWidth,ce.offsetWidth):ce.offsetWidth)-(parseInt($(ce).css(\"borderLeftWidth\"),10)||0)-(parseInt($(ce).css(\"paddingRight\"),10)||0)-this.helperProportions.width-this.margins.left,co.top+(over?Math.max(ce.scrollHeight,ce.offsetHeight):ce.offsetHeight)-(parseInt($(ce).css(\"borderTopWidth\"),10)||0)-(parseInt($(ce).css(\"paddingBottom\"),10)||0)-this.helperProportions.height-this.margins.top];}},_convertPositionTo:function _convertPositionTo(d,pos){if(!pos){pos=this.position;}var mod=d===\"absolute\"?1:-1,scroll=this.cssPosition===\"absolute\"&&!(this.scrollParent[0]!==this.document[0]&&$.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,scrollIsRootNode=/(html|body)/i.test(scroll[0].tagName);return{top:// The absolute mouse position\npos.top+// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.top*mod+// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.top*mod-(this.cssPosition===\"fixed\"?-this.scrollParent.scrollTop():scrollIsRootNode?0:scroll.scrollTop())*mod,left:// The absolute mouse position\npos.left+// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.left*mod+// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.left*mod-(this.cssPosition===\"fixed\"?-this.scrollParent.scrollLeft():scrollIsRootNode?0:scroll.scrollLeft())*mod};},_generatePosition:function _generatePosition(event){var top,left,o=this.options,pageX=event.pageX,pageY=event.pageY,scroll=this.cssPosition===\"absolute\"&&!(this.scrollParent[0]!==this.document[0]&&$.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,scrollIsRootNode=/(html|body)/i.test(scroll[0].tagName);// This is another very weird special case that only happens for relative elements:\n// 1. If the css position is relative\n// 2. and the scroll parent is the document or similar to the offset parent\n// we have to refresh the relative offset during the scroll so there are no jumps\nif(this.cssPosition===\"relative\"&&!(this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0])){this.offset.relative=this._getRelativeOffset();}/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */if(this.originalPosition){//If we are not dragging yet, we won't check for options\nif(this.containment){if(event.pageX-this.offset.click.left<this.containment[0]){pageX=this.containment[0]+this.offset.click.left;}if(event.pageY-this.offset.click.top<this.containment[1]){pageY=this.containment[1]+this.offset.click.top;}if(event.pageX-this.offset.click.left>this.containment[2]){pageX=this.containment[2]+this.offset.click.left;}if(event.pageY-this.offset.click.top>this.containment[3]){pageY=this.containment[3]+this.offset.click.top;}}if(o.grid){top=this.originalPageY+Math.round((pageY-this.originalPageY)/o.grid[1])*o.grid[1];pageY=this.containment?top-this.offset.click.top>=this.containment[1]&&top-this.offset.click.top<=this.containment[3]?top:top-this.offset.click.top>=this.containment[1]?top-o.grid[1]:top+o.grid[1]:top;left=this.originalPageX+Math.round((pageX-this.originalPageX)/o.grid[0])*o.grid[0];pageX=this.containment?left-this.offset.click.left>=this.containment[0]&&left-this.offset.click.left<=this.containment[2]?left:left-this.offset.click.left>=this.containment[0]?left-o.grid[0]:left+o.grid[0]:left;}}return{top:// The absolute mouse position\npageY-// Click offset (relative to the element)\nthis.offset.click.top-// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.top-// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.top+(this.cssPosition===\"fixed\"?-this.scrollParent.scrollTop():scrollIsRootNode?0:scroll.scrollTop()),left:// The absolute mouse position\npageX-// Click offset (relative to the element)\nthis.offset.click.left-// Only for relative positioned nodes: Relative offset from element to offset parent\nthis.offset.relative.left-// The offsetParent's offset without borders (offset + border)\nthis.offset.parent.left+(this.cssPosition===\"fixed\"?-this.scrollParent.scrollLeft():scrollIsRootNode?0:scroll.scrollLeft())};},_rearrange:function _rearrange(event,i,a,hardRefresh){if(a){a[0].appendChild(this.placeholder[0]);}else{i.item[0].parentNode.insertBefore(this.placeholder[0],this.direction===\"down\"?i.item[0]:i.item[0].nextSibling);}//Various things done here to improve the performance:\n// 1. we create a setTimeout, that calls refreshPositions\n// 2. on the instance, we have a counter variable, that get's higher after every append\n// 3. on the local scope, we copy the counter variable, and check in the timeout,\n// if it's still the same\n// 4. this lets only the last addition to the timeout stack through\nthis.counter=this.counter?++this.counter:1;var counter=this.counter;this._delay(function(){if(counter===this.counter){//Precompute after each DOM insertion, NOT on mousemove\nthis.refreshPositions(!hardRefresh);}});},_clear:function _clear(event,noPropagation){this.reverting=false;// We delay all events that have to be triggered to after the point where the placeholder\n// has been removed and everything else normalized again\nvar i,delayedTriggers=[];// We first have to update the dom position of the actual currentItem\n// Note: don't do it if the current item is already removed (by a user), or it gets\n// reappended (see #4088)\nif(!this._noFinalSort&&this.currentItem.parent().length){this.placeholder.before(this.currentItem);}this._noFinalSort=null;if(this.helper[0]===this.currentItem[0]){for(i in this._storedCSS){if(this._storedCSS[i]===\"auto\"||this._storedCSS[i]===\"static\"){this._storedCSS[i]=\"\";}}this.currentItem.css(this._storedCSS);this._removeClass(this.currentItem,\"ui-sortable-helper\");}else{this.currentItem.show();}if(this.fromOutside&&!noPropagation){delayedTriggers.push(function(event){this._trigger(\"receive\",event,this._uiHash(this.fromOutside));});}if((this.fromOutside||this.domPosition.prev!==this.currentItem.prev().not(\".ui-sortable-helper\")[0]||this.domPosition.parent!==this.currentItem.parent()[0])&&!noPropagation){// Trigger update callback if the DOM position has changed\ndelayedTriggers.push(function(event){this._trigger(\"update\",event,this._uiHash());});}// Check if the items Container has Changed and trigger appropriate\n// events.\nif(this!==this.currentContainer){if(!noPropagation){delayedTriggers.push(function(event){this._trigger(\"remove\",event,this._uiHash());});delayedTriggers.push(function(c){return function(event){c._trigger(\"receive\",event,this._uiHash(this));};}.call(this,this.currentContainer));delayedTriggers.push(function(c){return function(event){c._trigger(\"update\",event,this._uiHash(this));};}.call(this,this.currentContainer));}}//Post events to containers\nfunction delayEvent(type,instance,container){return function(event){container._trigger(type,event,instance._uiHash(instance));};}for(i=this.containers.length-1;i>=0;i--){if(!noPropagation){delayedTriggers.push(delayEvent(\"deactivate\",this,this.containers[i]));}if(this.containers[i].containerCache.over){delayedTriggers.push(delayEvent(\"out\",this,this.containers[i]));this.containers[i].containerCache.over=0;}}//Do what was originally in plugins\nif(this.storedCursor){this.document.find(\"body\").css(\"cursor\",this.storedCursor);this.storedStylesheet.remove();}if(this._storedOpacity){this.helper.css(\"opacity\",this._storedOpacity);}if(this._storedZIndex){this.helper.css(\"zIndex\",this._storedZIndex===\"auto\"?\"\":this._storedZIndex);}this.dragging=false;if(!noPropagation){this._trigger(\"beforeStop\",event,this._uiHash());}//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n// it unbinds ALL events from the original node!\nthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);if(!this.cancelHelperRemoval){if(this.helper[0]!==this.currentItem[0]){this.helper.remove();}this.helper=null;}if(!noPropagation){for(i=0;i<delayedTriggers.length;i++){// Trigger all delayed events\ndelayedTriggers[i].call(this,event);}this._trigger(\"stop\",event,this._uiHash());}this.fromOutside=false;return!this.cancelHelperRemoval;},_trigger:function _trigger(){if($.Widget.prototype._trigger.apply(this,arguments)===false){this.cancel();}},_uiHash:function _uiHash(_inst){var inst=_inst||this;return{helper:inst.helper,placeholder:inst.placeholder||$([]),position:inst.position,originalPosition:inst.originalPosition,offset:inst.positionAbs,item:inst.currentItem,sender:_inst?_inst.element:null};}});/*!\n * jQuery UI Spinner 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\nfunction spinnerModifier(fn){return function(){var previous=this.element.val();fn.apply(this,arguments);this._refresh();if(previous!==this.element.val()){this._trigger(\"change\");}};}$.widget(\"ui.spinner\",{version:\"1.13.2\",defaultElement:\"<input>\",widgetEventPrefix:\"spin\",options:{classes:{\"ui-spinner\":\"ui-corner-all\",\"ui-spinner-down\":\"ui-corner-br\",\"ui-spinner-up\":\"ui-corner-tr\"},culture:null,icons:{down:\"ui-icon-triangle-1-s\",up:\"ui-icon-triangle-1-n\"},incremental:true,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function _create(){// handle string values that need to be parsed\nthis._setOption(\"max\",this.options.max);this._setOption(\"min\",this.options.min);this._setOption(\"step\",this.options.step);// Only format if there is a value, prevents the field from being marked\n// as invalid in Firefox, see #9573.\nif(this.value()!==\"\"){// Format the value, but don't constrain.\nthis._value(this.element.val(),true);}this._draw();this._on(this._events);this._refresh();// Turning off autocomplete prevents the browser from remembering the\n// value when navigating through history, so we re-enable autocomplete\n// if the page is unloaded before the widget is destroyed. #7790\nthis._on(this.window,{beforeunload:function beforeunload(){this.element.removeAttr(\"autocomplete\");}});},_getCreateOptions:function _getCreateOptions(){var options=this._super();var element=this.element;$.each([\"min\",\"max\",\"step\"],function(i,option){var value=element.attr(option);if(value!=null&&value.length){options[option]=value;}});return options;},_events:{keydown:function keydown(event){if(this._start(event)&&this._keydown(event)){event.preventDefault();}},keyup:\"_stop\",focus:function focus(){this.previous=this.element.val();},blur:function blur(event){if(this.cancelBlur){delete this.cancelBlur;return;}this._stop();this._refresh();if(this.previous!==this.element.val()){this._trigger(\"change\",event);}},mousewheel:function mousewheel(event,delta){var activeElement=$.ui.safeActiveElement(this.document[0]);var isActive=this.element[0]===activeElement;if(!isActive||!delta){return;}if(!this.spinning&&!this._start(event)){return false;}this._spin((delta>0?1:-1)*this.options.step,event);clearTimeout(this.mousewheelTimer);this.mousewheelTimer=this._delay(function(){if(this.spinning){this._stop(event);}},100);event.preventDefault();},\"mousedown .ui-spinner-button\":function mousedownUiSpinnerButton(event){var previous;// We never want the buttons to have focus; whenever the user is\n// interacting with the spinner, the focus should be on the input.\n// If the input is focused then this.previous is properly set from\n// when the input first received focus. If the input is not focused\n// then we need to set this.previous based on the value before spinning.\nprevious=this.element[0]===$.ui.safeActiveElement(this.document[0])?this.previous:this.element.val();function checkFocus(){var isActive=this.element[0]===$.ui.safeActiveElement(this.document[0]);if(!isActive){this.element.trigger(\"focus\");this.previous=previous;// support: IE\n// IE sets focus asynchronously, so we need to check if focus\n// moved off of the input because the user clicked on the button.\nthis._delay(function(){this.previous=previous;});}}// Ensure focus is on (or stays on) the text field\nevent.preventDefault();checkFocus.call(this);// Support: IE\n// IE doesn't prevent moving focus even with event.preventDefault()\n// so we set a flag to know when we should ignore the blur event\n// and check (again) if focus moved off of the input.\nthis.cancelBlur=true;this._delay(function(){delete this.cancelBlur;checkFocus.call(this);});if(this._start(event)===false){return;}this._repeat(null,$(event.currentTarget).hasClass(\"ui-spinner-up\")?1:-1,event);},\"mouseup .ui-spinner-button\":\"_stop\",\"mouseenter .ui-spinner-button\":function mouseenterUiSpinnerButton(event){// button will add ui-state-active if mouse was down while mouseleave and kept down\nif(!$(event.currentTarget).hasClass(\"ui-state-active\")){return;}if(this._start(event)===false){return false;}this._repeat(null,$(event.currentTarget).hasClass(\"ui-spinner-up\")?1:-1,event);},// TODO: do we really want to consider this a stop?\n// shouldn't we just stop the repeater and wait until mouseup before\n// we trigger the stop event?\n\"mouseleave .ui-spinner-button\":\"_stop\"},// Support mobile enhanced option and make backcompat more sane\n_enhance:function _enhance(){this.uiSpinner=this.element.attr(\"autocomplete\",\"off\").wrap(\"<span>\").parent()// Add buttons\n.append(\"<a></a><a></a>\");},_draw:function _draw(){this._enhance();this._addClass(this.uiSpinner,\"ui-spinner\",\"ui-widget ui-widget-content\");this._addClass(\"ui-spinner-input\");this.element.attr(\"role\",\"spinbutton\");// Button bindings\nthis.buttons=this.uiSpinner.children(\"a\").attr(\"tabIndex\",-1).attr(\"aria-hidden\",true).button({classes:{\"ui-button\":\"\"}});// TODO: Right now button does not support classes this is already updated in button PR\nthis._removeClass(this.buttons,\"ui-corner-all\");this._addClass(this.buttons.first(),\"ui-spinner-button ui-spinner-up\");this._addClass(this.buttons.last(),\"ui-spinner-button ui-spinner-down\");this.buttons.first().button({\"icon\":this.options.icons.up,\"showLabel\":false});this.buttons.last().button({\"icon\":this.options.icons.down,\"showLabel\":false});// IE 6 doesn't understand height: 50% for the buttons\n// unless the wrapper has an explicit height\nif(this.buttons.height()>Math.ceil(this.uiSpinner.height()*0.5)&&this.uiSpinner.height()>0){this.uiSpinner.height(this.uiSpinner.height());}},_keydown:function _keydown(event){var options=this.options,keyCode=$.ui.keyCode;switch(event.keyCode){case keyCode.UP:this._repeat(null,1,event);return true;case keyCode.DOWN:this._repeat(null,-1,event);return true;case keyCode.PAGE_UP:this._repeat(null,options.page,event);return true;case keyCode.PAGE_DOWN:this._repeat(null,-options.page,event);return true;}return false;},_start:function _start(event){if(!this.spinning&&this._trigger(\"start\",event)===false){return false;}if(!this.counter){this.counter=1;}this.spinning=true;return true;},_repeat:function _repeat(i,steps,event){i=i||500;clearTimeout(this.timer);this.timer=this._delay(function(){this._repeat(40,steps,event);},i);this._spin(steps*this.options.step,event);},_spin:function _spin(step,event){var value=this.value()||0;if(!this.counter){this.counter=1;}value=this._adjustValue(value+step*this._increment(this.counter));if(!this.spinning||this._trigger(\"spin\",event,{value:value})!==false){this._value(value);this.counter++;}},_increment:function _increment(i){var incremental=this.options.incremental;if(incremental){return typeof incremental===\"function\"?incremental(i):Math.floor(i*i*i/50000-i*i/500+17*i/200+1);}return 1;},_precision:function _precision(){var precision=this._precisionOf(this.options.step);if(this.options.min!==null){precision=Math.max(precision,this._precisionOf(this.options.min));}return precision;},_precisionOf:function _precisionOf(num){var str=num.toString(),decimal=str.indexOf(\".\");return decimal===-1?0:str.length-decimal-1;},_adjustValue:function _adjustValue(value){var base,aboveMin,options=this.options;// Make sure we're at a valid step\n// - find out where we are relative to the base (min or 0)\nbase=options.min!==null?options.min:0;aboveMin=value-base;// - round to the nearest step\naboveMin=Math.round(aboveMin/options.step)*options.step;// - rounding is based on 0, so adjust back to our base\nvalue=base+aboveMin;// Fix precision from bad JS floating point math\nvalue=parseFloat(value.toFixed(this._precision()));// Clamp the value\nif(options.max!==null&&value>options.max){return options.max;}if(options.min!==null&&value<options.min){return options.min;}return value;},_stop:function _stop(event){if(!this.spinning){return;}clearTimeout(this.timer);clearTimeout(this.mousewheelTimer);this.counter=0;this.spinning=false;this._trigger(\"stop\",event);},_setOption:function _setOption(key,value){var prevValue,first,last;if(key===\"culture\"||key===\"numberFormat\"){prevValue=this._parse(this.element.val());this.options[key]=value;this.element.val(this._format(prevValue));return;}if(key===\"max\"||key===\"min\"||key===\"step\"){if(typeof value===\"string\"){value=this._parse(value);}}if(key===\"icons\"){first=this.buttons.first().find(\".ui-icon\");this._removeClass(first,null,this.options.icons.up);this._addClass(first,null,value.up);last=this.buttons.last().find(\".ui-icon\");this._removeClass(last,null,this.options.icons.down);this._addClass(last,null,value.down);}this._super(key,value);},_setOptionDisabled:function _setOptionDisabled(value){this._super(value);this._toggleClass(this.uiSpinner,null,\"ui-state-disabled\",!!value);this.element.prop(\"disabled\",!!value);this.buttons.button(value?\"disable\":\"enable\");},_setOptions:spinnerModifier(function(options){this._super(options);}),_parse:function _parse(val){if(typeof val===\"string\"&&val!==\"\"){val=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(val,10,this.options.culture):+val;}return val===\"\"||isNaN(val)?null:val;},_format:function _format(value){if(value===\"\"){return\"\";}return window.Globalize&&this.options.numberFormat?Globalize.format(value,this.options.numberFormat,this.options.culture):value;},_refresh:function _refresh(){this.element.attr({\"aria-valuemin\":this.options.min,\"aria-valuemax\":this.options.max,// TODO: what should we do with values that can't be parsed?\n\"aria-valuenow\":this._parse(this.element.val())});},isValid:function isValid(){var value=this.value();// Null is invalid\nif(value===null){return false;}// If value gets adjusted, it's invalid\nreturn value===this._adjustValue(value);},// Update the value without triggering change\n_value:function _value(value,allowAny){var parsed;if(value!==\"\"){parsed=this._parse(value);if(parsed!==null){if(!allowAny){parsed=this._adjustValue(parsed);}value=this._format(parsed);}}this.element.val(value);this._refresh();},_destroy:function _destroy(){this.element.prop(\"disabled\",false).removeAttr(\"autocomplete role aria-valuemin aria-valuemax aria-valuenow\");this.uiSpinner.replaceWith(this.element);},stepUp:spinnerModifier(function(steps){this._stepUp(steps);}),_stepUp:function _stepUp(steps){if(this._start()){this._spin((steps||1)*this.options.step);this._stop();}},stepDown:spinnerModifier(function(steps){this._stepDown(steps);}),_stepDown:function _stepDown(steps){if(this._start()){this._spin((steps||1)*-this.options.step);this._stop();}},pageUp:spinnerModifier(function(pages){this._stepUp((pages||1)*this.options.page);}),pageDown:spinnerModifier(function(pages){this._stepDown((pages||1)*this.options.page);}),value:function value(newVal){if(!arguments.length){return this._parse(this.element.val());}spinnerModifier(this._value).call(this,newVal);},widget:function widget(){return this.uiSpinner;}});// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif($.uiBackCompat!==false){// Backcompat for spinner html extension points\n$.widget(\"ui.spinner\",$.ui.spinner,{_enhance:function _enhance(){this.uiSpinner=this.element.attr(\"autocomplete\",\"off\").wrap(this._uiSpinnerHtml()).parent()// Add buttons\n.append(this._buttonHtml());},_uiSpinnerHtml:function _uiSpinnerHtml(){return\"<span>\";},_buttonHtml:function _buttonHtml(){return\"<a></a><a></a>\";}});}var widgetsSpinner=$.ui.spinner;/*!\n * jQuery UI Tabs 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n$.widget(\"ui.tabs\",{version:\"1.13.2\",delay:300,options:{active:null,classes:{\"ui-tabs\":\"ui-corner-all\",\"ui-tabs-nav\":\"ui-corner-all\",\"ui-tabs-panel\":\"ui-corner-bottom\",\"ui-tabs-tab\":\"ui-corner-top\"},collapsible:false,event:\"click\",heightStyle:\"content\",hide:null,show:null,// Callbacks\nactivate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var rhash=/#.*$/;return function(anchor){var anchorUrl,locationUrl;anchorUrl=anchor.href.replace(rhash,\"\");locationUrl=location.href.replace(rhash,\"\");// Decoding may throw an error if the URL isn't UTF-8 (#9518)\ntry{anchorUrl=decodeURIComponent(anchorUrl);}catch(error){}try{locationUrl=decodeURIComponent(locationUrl);}catch(error){}return anchor.hash.length>1&&anchorUrl===locationUrl;};}(),_create:function _create(){var that=this,options=this.options;this.running=false;this._addClass(\"ui-tabs\",\"ui-widget ui-widget-content\");this._toggleClass(\"ui-tabs-collapsible\",null,options.collapsible);this._processTabs();options.active=this._initialActive();// Take disabling tabs via class attribute from HTML\n// into account and update option properly.\nif(Array.isArray(options.disabled)){options.disabled=$.uniqueSort(options.disabled.concat($.map(this.tabs.filter(\".ui-state-disabled\"),function(li){return that.tabs.index(li);}))).sort();}// Check for length avoids error when initializing empty list\nif(this.options.active!==false&&this.anchors.length){this.active=this._findActive(options.active);}else{this.active=$();}this._refresh();if(this.active.length){this.load(options.active);}},_initialActive:function _initialActive(){var active=this.options.active,collapsible=this.options.collapsible,locationHash=location.hash.substring(1);if(active===null){// check the fragment identifier in the URL\nif(locationHash){this.tabs.each(function(i,tab){if($(tab).attr(\"aria-controls\")===locationHash){active=i;return false;}});}// Check for a tab marked active via a class\nif(active===null){active=this.tabs.index(this.tabs.filter(\".ui-tabs-active\"));}// No active tab, set to false\nif(active===null||active===-1){active=this.tabs.length?0:false;}}// Handle numbers: negative, out of range\nif(active!==false){active=this.tabs.index(this.tabs.eq(active));if(active===-1){active=collapsible?false:0;}}// Don't allow collapsible: false and active: false\nif(!collapsible&&active===false&&this.anchors.length){active=0;}return active;},_getCreateEventData:function _getCreateEventData(){return{tab:this.active,panel:!this.active.length?$():this._getPanelForTab(this.active)};},_tabKeydown:function _tabKeydown(event){var focusedTab=$($.ui.safeActiveElement(this.document[0])).closest(\"li\"),selectedIndex=this.tabs.index(focusedTab),goingForward=true;if(this._handlePageNav(event)){return;}switch(event.keyCode){case $.ui.keyCode.RIGHT:case $.ui.keyCode.DOWN:selectedIndex++;break;case $.ui.keyCode.UP:case $.ui.keyCode.LEFT:goingForward=false;selectedIndex--;break;case $.ui.keyCode.END:selectedIndex=this.anchors.length-1;break;case $.ui.keyCode.HOME:selectedIndex=0;break;case $.ui.keyCode.SPACE:// Activate only, no collapsing\nevent.preventDefault();clearTimeout(this.activating);this._activate(selectedIndex);return;case $.ui.keyCode.ENTER:// Toggle (cancel delayed activation, allow collapsing)\nevent.preventDefault();clearTimeout(this.activating);// Determine if we should collapse or activate\nthis._activate(selectedIndex===this.options.active?false:selectedIndex);return;default:return;}// Focus the appropriate tab, based on which key was pressed\nevent.preventDefault();clearTimeout(this.activating);selectedIndex=this._focusNextTab(selectedIndex,goingForward);// Navigating with control/command key will prevent automatic activation\nif(!event.ctrlKey&&!event.metaKey){// Update aria-selected immediately so that AT think the tab is already selected.\n// Otherwise AT may confuse the user by stating that they need to activate the tab,\n// but the tab will already be activated by the time the announcement finishes.\nfocusedTab.attr(\"aria-selected\",\"false\");this.tabs.eq(selectedIndex).attr(\"aria-selected\",\"true\");this.activating=this._delay(function(){this.option(\"active\",selectedIndex);},this.delay);}},_panelKeydown:function _panelKeydown(event){if(this._handlePageNav(event)){return;}// Ctrl+up moves focus to the current tab\nif(event.ctrlKey&&event.keyCode===$.ui.keyCode.UP){event.preventDefault();this.active.trigger(\"focus\");}},// Alt+page up/down moves focus to the previous/next tab (and activates)\n_handlePageNav:function _handlePageNav(event){if(event.altKey&&event.keyCode===$.ui.keyCode.PAGE_UP){this._activate(this._focusNextTab(this.options.active-1,false));return true;}if(event.altKey&&event.keyCode===$.ui.keyCode.PAGE_DOWN){this._activate(this._focusNextTab(this.options.active+1,true));return true;}},_findNextTab:function _findNextTab(index,goingForward){var lastTabIndex=this.tabs.length-1;function constrain(){if(index>lastTabIndex){index=0;}if(index<0){index=lastTabIndex;}return index;}while($.inArray(constrain(),this.options.disabled)!==-1){index=goingForward?index+1:index-1;}return index;},_focusNextTab:function _focusNextTab(index,goingForward){index=this._findNextTab(index,goingForward);this.tabs.eq(index).trigger(\"focus\");return index;},_setOption:function _setOption(key,value){if(key===\"active\"){// _activate() will handle invalid values and update this.options\nthis._activate(value);return;}this._super(key,value);if(key===\"collapsible\"){this._toggleClass(\"ui-tabs-collapsible\",null,value);// Setting collapsible: false while collapsed; open first panel\nif(!value&&this.options.active===false){this._activate(0);}}if(key===\"event\"){this._setupEvents(value);}if(key===\"heightStyle\"){this._setupHeightStyle(value);}},_sanitizeSelector:function _sanitizeSelector(hash){return hash?hash.replace(/[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g,\"\\\\$&\"):\"\";},refresh:function refresh(){var options=this.options,lis=this.tablist.children(\":has(a[href])\");// Get disabled tabs from class attribute from HTML\n// this will get converted to a boolean if needed in _refresh()\noptions.disabled=$.map(lis.filter(\".ui-state-disabled\"),function(tab){return lis.index(tab);});this._processTabs();// Was collapsed or no tabs\nif(options.active===false||!this.anchors.length){options.active=false;this.active=$();// was active, but active tab is gone\n}else if(this.active.length&&!$.contains(this.tablist[0],this.active[0])){// all remaining tabs are disabled\nif(this.tabs.length===options.disabled.length){options.active=false;this.active=$();// activate previous tab\n}else{this._activate(this._findNextTab(Math.max(0,options.active-1),false));}// was active, active tab still exists\n}else{// make sure active index is correct\noptions.active=this.tabs.index(this.active);}this._refresh();},_refresh:function _refresh(){this._setOptionDisabled(this.options.disabled);this._setupEvents(this.options.event);this._setupHeightStyle(this.options.heightStyle);this.tabs.not(this.active).attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\",tabIndex:-1});this.panels.not(this._getPanelForTab(this.active)).hide().attr({\"aria-hidden\":\"true\"});// Make sure one tab is in the tab order\nif(!this.active.length){this.tabs.eq(0).attr(\"tabIndex\",0);}else{this.active.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0});this._addClass(this.active,\"ui-tabs-active\",\"ui-state-active\");this._getPanelForTab(this.active).show().attr({\"aria-hidden\":\"false\"});}},_processTabs:function _processTabs(){var that=this,prevTabs=this.tabs,prevAnchors=this.anchors,prevPanels=this.panels;this.tablist=this._getList().attr(\"role\",\"tablist\");this._addClass(this.tablist,\"ui-tabs-nav\",\"ui-helper-reset ui-helper-clearfix ui-widget-header\");// Prevent users from focusing disabled tabs via click\nthis.tablist.on(\"mousedown\"+this.eventNamespace,\"> li\",function(event){if($(this).is(\".ui-state-disabled\")){event.preventDefault();}})// Support: IE <9\n// Preventing the default action in mousedown doesn't prevent IE\n// from focusing the element, so if the anchor gets focused, blur.\n// We don't have to worry about focusing the previously focused\n// element since clicking on a non-focusable element should focus\n// the body anyway.\n.on(\"focus\"+this.eventNamespace,\".ui-tabs-anchor\",function(){if($(this).closest(\"li\").is(\".ui-state-disabled\")){this.blur();}});this.tabs=this.tablist.find(\"> li:has(a[href])\").attr({role:\"tab\",tabIndex:-1});this._addClass(this.tabs,\"ui-tabs-tab\",\"ui-state-default\");this.anchors=this.tabs.map(function(){return $(\"a\",this)[0];}).attr({tabIndex:-1});this._addClass(this.anchors,\"ui-tabs-anchor\");this.panels=$();this.anchors.each(function(i,anchor){var selector,panel,panelId,anchorId=$(anchor).uniqueId().attr(\"id\"),tab=$(anchor).closest(\"li\"),originalAriaControls=tab.attr(\"aria-controls\");// Inline tab\nif(that._isLocal(anchor)){selector=anchor.hash;panelId=selector.substring(1);panel=that.element.find(that._sanitizeSelector(selector));// remote tab\n}else{// If the tab doesn't already have aria-controls,\n// generate an id by using a throw-away element\npanelId=tab.attr(\"aria-controls\")||$({}).uniqueId()[0].id;selector=\"#\"+panelId;panel=that.element.find(selector);if(!panel.length){panel=that._createPanel(panelId);panel.insertAfter(that.panels[i-1]||that.tablist);}panel.attr(\"aria-live\",\"polite\");}if(panel.length){that.panels=that.panels.add(panel);}if(originalAriaControls){tab.data(\"ui-tabs-aria-controls\",originalAriaControls);}tab.attr({\"aria-controls\":panelId,\"aria-labelledby\":anchorId});panel.attr(\"aria-labelledby\",anchorId);});this.panels.attr(\"role\",\"tabpanel\");this._addClass(this.panels,\"ui-tabs-panel\",\"ui-widget-content\");// Avoid memory leaks (#10056)\nif(prevTabs){this._off(prevTabs.not(this.tabs));this._off(prevAnchors.not(this.anchors));this._off(prevPanels.not(this.panels));}},// Allow overriding how to find the list for rare usage scenarios (#7715)\n_getList:function _getList(){return this.tablist||this.element.find(\"ol, ul\").eq(0);},_createPanel:function _createPanel(id){return $(\"<div>\").attr(\"id\",id).data(\"ui-tabs-destroy\",true);},_setOptionDisabled:function _setOptionDisabled(disabled){var currentItem,li,i;if(Array.isArray(disabled)){if(!disabled.length){disabled=false;}else if(disabled.length===this.anchors.length){disabled=true;}}// Disable tabs\nfor(i=0;li=this.tabs[i];i++){currentItem=$(li);if(disabled===true||$.inArray(i,disabled)!==-1){currentItem.attr(\"aria-disabled\",\"true\");this._addClass(currentItem,null,\"ui-state-disabled\");}else{currentItem.removeAttr(\"aria-disabled\");this._removeClass(currentItem,null,\"ui-state-disabled\");}}this.options.disabled=disabled;this._toggleClass(this.widget(),this.widgetFullName+\"-disabled\",null,disabled===true);},_setupEvents:function _setupEvents(event){var events={};if(event){$.each(event.split(\" \"),function(index,eventName){events[eventName]=\"_eventHandler\";});}this._off(this.anchors.add(this.tabs).add(this.panels));// Always prevent the default action, even when disabled\nthis._on(true,this.anchors,{click:function click(event){event.preventDefault();}});this._on(this.anchors,events);this._on(this.tabs,{keydown:\"_tabKeydown\"});this._on(this.panels,{keydown:\"_panelKeydown\"});this._focusable(this.tabs);this._hoverable(this.tabs);},_setupHeightStyle:function _setupHeightStyle(heightStyle){var maxHeight,parent=this.element.parent();if(heightStyle===\"fill\"){maxHeight=parent.height();maxHeight-=this.element.outerHeight()-this.element.height();this.element.siblings(\":visible\").each(function(){var elem=$(this),position=elem.css(\"position\");if(position===\"absolute\"||position===\"fixed\"){return;}maxHeight-=elem.outerHeight(true);});this.element.children().not(this.panels).each(function(){maxHeight-=$(this).outerHeight(true);});this.panels.each(function(){$(this).height(Math.max(0,maxHeight-$(this).innerHeight()+$(this).height()));}).css(\"overflow\",\"auto\");}else if(heightStyle===\"auto\"){maxHeight=0;this.panels.each(function(){maxHeight=Math.max(maxHeight,$(this).height(\"\").height());}).height(maxHeight);}},_eventHandler:function _eventHandler(event){var options=this.options,active=this.active,anchor=$(event.currentTarget),tab=anchor.closest(\"li\"),clickedIsActive=tab[0]===active[0],collapsing=clickedIsActive&&options.collapsible,toShow=collapsing?$():this._getPanelForTab(tab),toHide=!active.length?$():this._getPanelForTab(active),eventData={oldTab:active,oldPanel:toHide,newTab:collapsing?$():tab,newPanel:toShow};event.preventDefault();if(tab.hasClass(\"ui-state-disabled\")||// tab is already loading\ntab.hasClass(\"ui-tabs-loading\")||// can't switch durning an animation\nthis.running||// click on active header, but not collapsible\nclickedIsActive&&!options.collapsible||// allow canceling activation\nthis._trigger(\"beforeActivate\",event,eventData)===false){return;}options.active=collapsing?false:this.tabs.index(tab);this.active=clickedIsActive?$():tab;if(this.xhr){this.xhr.abort();}if(!toHide.length&&!toShow.length){$.error(\"jQuery UI Tabs: Mismatching fragment identifier.\");}if(toShow.length){this.load(this.tabs.index(tab),event);}this._toggle(event,eventData);},// Handles show/hide for selecting tabs\n_toggle:function _toggle(event,eventData){var that=this,toShow=eventData.newPanel,toHide=eventData.oldPanel;this.running=true;function complete(){that.running=false;that._trigger(\"activate\",event,eventData);}function show(){that._addClass(eventData.newTab.closest(\"li\"),\"ui-tabs-active\",\"ui-state-active\");if(toShow.length&&that.options.show){that._show(toShow,that.options.show,complete);}else{toShow.show();complete();}}// Start out by hiding, then showing, then completing\nif(toHide.length&&this.options.hide){this._hide(toHide,this.options.hide,function(){that._removeClass(eventData.oldTab.closest(\"li\"),\"ui-tabs-active\",\"ui-state-active\");show();});}else{this._removeClass(eventData.oldTab.closest(\"li\"),\"ui-tabs-active\",\"ui-state-active\");toHide.hide();show();}toHide.attr(\"aria-hidden\",\"true\");eventData.oldTab.attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\"});// If we're switching tabs, remove the old tab from the tab order.\n// If we're opening from collapsed state, remove the previous tab from the tab order.\n// If we're collapsing, then keep the collapsing tab in the tab order.\nif(toShow.length&&toHide.length){eventData.oldTab.attr(\"tabIndex\",-1);}else if(toShow.length){this.tabs.filter(function(){return $(this).attr(\"tabIndex\")===0;}).attr(\"tabIndex\",-1);}toShow.attr(\"aria-hidden\",\"false\");eventData.newTab.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0});},_activate:function _activate(index){var anchor,active=this._findActive(index);// Trying to activate the already active panel\nif(active[0]===this.active[0]){return;}// Trying to collapse, simulate a click on the current active header\nif(!active.length){active=this.active;}anchor=active.find(\".ui-tabs-anchor\")[0];this._eventHandler({target:anchor,currentTarget:anchor,preventDefault:$.noop});},_findActive:function _findActive(index){return index===false?$():this.tabs.eq(index);},_getIndex:function _getIndex(index){// meta-function to give users option to provide a href string instead of a numerical index.\nif(typeof index===\"string\"){index=this.anchors.index(this.anchors.filter(\"[href$='\"+$.escapeSelector(index)+\"']\"));}return index;},_destroy:function _destroy(){if(this.xhr){this.xhr.abort();}this.tablist.removeAttr(\"role\").off(this.eventNamespace);this.anchors.removeAttr(\"role tabIndex\").removeUniqueId();this.tabs.add(this.panels).each(function(){if($.data(this,\"ui-tabs-destroy\")){$(this).remove();}else{$(this).removeAttr(\"role tabIndex \"+\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\");}});this.tabs.each(function(){var li=$(this),prev=li.data(\"ui-tabs-aria-controls\");if(prev){li.attr(\"aria-controls\",prev).removeData(\"ui-tabs-aria-controls\");}else{li.removeAttr(\"aria-controls\");}});this.panels.show();if(this.options.heightStyle!==\"content\"){this.panels.css(\"height\",\"\");}},enable:function enable(index){var disabled=this.options.disabled;if(disabled===false){return;}if(index===undefined){disabled=false;}else{index=this._getIndex(index);if(Array.isArray(disabled)){disabled=$.map(disabled,function(num){return num!==index?num:null;});}else{disabled=$.map(this.tabs,function(li,num){return num!==index?num:null;});}}this._setOptionDisabled(disabled);},disable:function disable(index){var disabled=this.options.disabled;if(disabled===true){return;}if(index===undefined){disabled=true;}else{index=this._getIndex(index);if($.inArray(index,disabled)!==-1){return;}if(Array.isArray(disabled)){disabled=$.merge([index],disabled).sort();}else{disabled=[index];}}this._setOptionDisabled(disabled);},load:function load(index,event){index=this._getIndex(index);var that=this,tab=this.tabs.eq(index),anchor=tab.find(\".ui-tabs-anchor\"),panel=this._getPanelForTab(tab),eventData={tab:tab,panel:panel},complete=function complete(jqXHR,status){if(status===\"abort\"){that.panels.stop(false,true);}that._removeClass(tab,\"ui-tabs-loading\");panel.removeAttr(\"aria-busy\");if(jqXHR===that.xhr){delete that.xhr;}};// Not remote\nif(this._isLocal(anchor[0])){return;}this.xhr=$.ajax(this._ajaxSettings(anchor,event,eventData));// Support: jQuery <1.8\n// jQuery <1.8 returns false if the request is canceled in beforeSend,\n// but as of 1.8, $.ajax() always returns a jqXHR object.\nif(this.xhr&&this.xhr.statusText!==\"canceled\"){this._addClass(tab,\"ui-tabs-loading\");panel.attr(\"aria-busy\",\"true\");this.xhr.done(function(response,status,jqXHR){// support: jQuery <1.8\n// http://bugs.jquery.com/ticket/11778\nsetTimeout(function(){panel.html(response);that._trigger(\"load\",event,eventData);complete(jqXHR,status);},1);}).fail(function(jqXHR,status){// support: jQuery <1.8\n// http://bugs.jquery.com/ticket/11778\nsetTimeout(function(){complete(jqXHR,status);},1);});}},_ajaxSettings:function _ajaxSettings(anchor,event,eventData){var that=this;return{// Support: IE <11 only\n// Strip any hash that exists to prevent errors with the Ajax request\nurl:anchor.attr(\"href\").replace(/#.*$/,\"\"),beforeSend:function beforeSend(jqXHR,settings){return that._trigger(\"beforeLoad\",event,$.extend({jqXHR:jqXHR,ajaxSettings:settings},eventData));}};},_getPanelForTab:function _getPanelForTab(tab){var id=$(tab).attr(\"aria-controls\");return this.element.find(this._sanitizeSelector(\"#\"+id));}});// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif($.uiBackCompat!==false){// Backcompat for ui-tab class (now ui-tabs-tab)\n$.widget(\"ui.tabs\",$.ui.tabs,{_processTabs:function _processTabs(){this._superApply(arguments);this._addClass(this.tabs,\"ui-tab\");}});}var widgetsTabs=$.ui.tabs;/*!\n * jQuery UI Tooltip 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */ //>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n$.widget(\"ui.tooltip\",{version:\"1.13.2\",options:{classes:{\"ui-tooltip\":\"ui-corner-all ui-widget-shadow\"},content:function content(){var title=$(this).attr(\"title\");// Escape title, since we're going from an attribute to raw HTML\nreturn $(\"<a>\").text(title).html();},hide:true,// Disabled elements have inconsistent behavior across browsers (#8661)\nitems:\"[title]:not([disabled])\",position:{my:\"left top+15\",at:\"left bottom\",collision:\"flipfit flip\"},show:true,track:false,// Callbacks\nclose:null,open:null},_addDescribedBy:function _addDescribedBy(elem,id){var describedby=(elem.attr(\"aria-describedby\")||\"\").split(/\\s+/);describedby.push(id);elem.data(\"ui-tooltip-id\",id).attr(\"aria-describedby\",String.prototype.trim.call(describedby.join(\" \")));},_removeDescribedBy:function _removeDescribedBy(elem){var id=elem.data(\"ui-tooltip-id\"),describedby=(elem.attr(\"aria-describedby\")||\"\").split(/\\s+/),index=$.inArray(id,describedby);if(index!==-1){describedby.splice(index,1);}elem.removeData(\"ui-tooltip-id\");describedby=String.prototype.trim.call(describedby.join(\" \"));if(describedby){elem.attr(\"aria-describedby\",describedby);}else{elem.removeAttr(\"aria-describedby\");}},_create:function _create(){this._on({mouseover:\"open\",focusin:\"open\"});// IDs of generated tooltips, needed for destroy\nthis.tooltips={};// IDs of parent tooltips where we removed the title attribute\nthis.parents={};// Append the aria-live region so tooltips announce correctly\nthis.liveRegion=$(\"<div>\").attr({role:\"log\",\"aria-live\":\"assertive\",\"aria-relevant\":\"additions\"}).appendTo(this.document[0].body);this._addClass(this.liveRegion,null,\"ui-helper-hidden-accessible\");this.disabledTitles=$([]);},_setOption:function _setOption(key,value){var that=this;this._super(key,value);if(key===\"content\"){$.each(this.tooltips,function(id,tooltipData){that._updateContent(tooltipData.element);});}},_setOptionDisabled:function _setOptionDisabled(value){this[value?\"_disable\":\"_enable\"]();},_disable:function _disable(){var that=this;// Close open tooltips\n$.each(this.tooltips,function(id,tooltipData){var event=$.Event(\"blur\");event.target=event.currentTarget=tooltipData.element[0];that.close(event,true);});// Remove title attributes to prevent native tooltips\nthis.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var element=$(this);if(element.is(\"[title]\")){return element.data(\"ui-tooltip-title\",element.attr(\"title\")).removeAttr(\"title\");}}));},_enable:function _enable(){// restore title attributes\nthis.disabledTitles.each(function(){var element=$(this);if(element.data(\"ui-tooltip-title\")){element.attr(\"title\",element.data(\"ui-tooltip-title\"));}});this.disabledTitles=$([]);},open:function open(event){var that=this,target=$(event?event.target:this.element)// we need closest here due to mouseover bubbling,\n// but always pointing at the same event target\n.closest(this.options.items);// No element to show a tooltip for or the tooltip is already open\nif(!target.length||target.data(\"ui-tooltip-id\")){return;}if(target.attr(\"title\")){target.data(\"ui-tooltip-title\",target.attr(\"title\"));}target.data(\"ui-tooltip-open\",true);// Kill parent tooltips, custom or native, for hover\nif(event&&event.type===\"mouseover\"){target.parents().each(function(){var parent=$(this),blurEvent;if(parent.data(\"ui-tooltip-open\")){blurEvent=$.Event(\"blur\");blurEvent.target=blurEvent.currentTarget=this;that.close(blurEvent,true);}if(parent.attr(\"title\")){parent.uniqueId();that.parents[this.id]={element:this,title:parent.attr(\"title\")};parent.attr(\"title\",\"\");}});}this._registerCloseHandlers(event,target);this._updateContent(target,event);},_updateContent:function _updateContent(target,event){var content,contentOption=this.options.content,that=this,eventType=event?event.type:null;if(typeof contentOption===\"string\"||contentOption.nodeType||contentOption.jquery){return this._open(event,target,contentOption);}content=contentOption.call(target[0],function(response){// IE may instantly serve a cached response for ajax requests\n// delay this call to _open so the other call to _open runs first\nthat._delay(function(){// Ignore async response if tooltip was closed already\nif(!target.data(\"ui-tooltip-open\")){return;}// JQuery creates a special event for focusin when it doesn't\n// exist natively. To improve performance, the native event\n// object is reused and the type is changed. Therefore, we can't\n// rely on the type being correct after the event finished\n// bubbling, so we set it back to the previous value. (#8740)\nif(event){event.type=eventType;}this._open(event,target,response);});});if(content){this._open(event,target,content);}},_open:function _open(event,target,content){var tooltipData,tooltip,delayedShow,a11yContent,positionOption=$.extend({},this.options.position);if(!content){return;}// Content can be updated multiple times. If the tooltip already\n// exists, then just update the content and bail.\ntooltipData=this._find(target);if(tooltipData){tooltipData.tooltip.find(\".ui-tooltip-content\").html(content);return;}// If we have a title, clear it to prevent the native tooltip\n// we have to check first to avoid defining a title if none exists\n// (we don't want to cause an element to start matching [title])\n//\n// We use removeAttr only for key events, to allow IE to export the correct\n// accessible attributes. For mouse events, set to empty string to avoid\n// native tooltip showing up (happens only when removing inside mouseover).\nif(target.is(\"[title]\")){if(event&&event.type===\"mouseover\"){target.attr(\"title\",\"\");}else{target.removeAttr(\"title\");}}tooltipData=this._tooltip(target);tooltip=tooltipData.tooltip;this._addDescribedBy(target,tooltip.attr(\"id\"));tooltip.find(\".ui-tooltip-content\").html(content);// Support: Voiceover on OS X, JAWS on IE <= 9\n// JAWS announces deletions even when aria-relevant=\"additions\"\n// Voiceover will sometimes re-read the entire log region's contents from the beginning\nthis.liveRegion.children().hide();a11yContent=$(\"<div>\").html(tooltip.find(\".ui-tooltip-content\").html());a11yContent.removeAttr(\"name\").find(\"[name]\").removeAttr(\"name\");a11yContent.removeAttr(\"id\").find(\"[id]\").removeAttr(\"id\");a11yContent.appendTo(this.liveRegion);function position(event){positionOption.of=event;if(tooltip.is(\":hidden\")){return;}tooltip.position(positionOption);}if(this.options.track&&event&&/^mouse/.test(event.type)){this._on(this.document,{mousemove:position});// trigger once to override element-relative positioning\nposition(event);}else{tooltip.position($.extend({of:target},this.options.position));}tooltip.hide();this._show(tooltip,this.options.show);// Handle tracking tooltips that are shown with a delay (#8644). As soon\n// as the tooltip is visible, position the tooltip using the most recent\n// event.\n// Adds the check to add the timers only when both delay and track options are set (#14682)\nif(this.options.track&&this.options.show&&this.options.show.delay){delayedShow=this.delayedShow=setInterval(function(){if(tooltip.is(\":visible\")){position(positionOption.of);clearInterval(delayedShow);}},13);}this._trigger(\"open\",event,{tooltip:tooltip});},_registerCloseHandlers:function _registerCloseHandlers(event,target){var events={keyup:function keyup(event){if(event.keyCode===$.ui.keyCode.ESCAPE){var fakeEvent=$.Event(event);fakeEvent.currentTarget=target[0];this.close(fakeEvent,true);}}};// Only bind remove handler for delegated targets. Non-delegated\n// tooltips will handle this in destroy.\nif(target[0]!==this.element[0]){events.remove=function(){var targetElement=this._find(target);if(targetElement){this._removeTooltip(targetElement.tooltip);}};}if(!event||event.type===\"mouseover\"){events.mouseleave=\"close\";}if(!event||event.type===\"focusin\"){events.focusout=\"close\";}this._on(true,target,events);},close:function close(event){var tooltip,that=this,target=$(event?event.currentTarget:this.element),tooltipData=this._find(target);// The tooltip may already be closed\nif(!tooltipData){// We set ui-tooltip-open immediately upon open (in open()), but only set the\n// additional data once there's actually content to show (in _open()). So even if the\n// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n// the period between open() and _open().\ntarget.removeData(\"ui-tooltip-open\");return;}tooltip=tooltipData.tooltip;// Disabling closes the tooltip, so we need to track when we're closing\n// to avoid an infinite loop in case the tooltip becomes disabled on close\nif(tooltipData.closing){return;}// Clear the interval for delayed tracking tooltips\nclearInterval(this.delayedShow);// Only set title if we had one before (see comment in _open())\n// If the title attribute has changed since open(), don't restore\nif(target.data(\"ui-tooltip-title\")&&!target.attr(\"title\")){target.attr(\"title\",target.data(\"ui-tooltip-title\"));}this._removeDescribedBy(target);tooltipData.hiding=true;tooltip.stop(true);this._hide(tooltip,this.options.hide,function(){that._removeTooltip($(this));});target.removeData(\"ui-tooltip-open\");this._off(target,\"mouseleave focusout keyup\");// Remove 'remove' binding only on delegated targets\nif(target[0]!==this.element[0]){this._off(target,\"remove\");}this._off(this.document,\"mousemove\");if(event&&event.type===\"mouseleave\"){$.each(this.parents,function(id,parent){$(parent.element).attr(\"title\",parent.title);delete that.parents[id];});}tooltipData.closing=true;this._trigger(\"close\",event,{tooltip:tooltip});if(!tooltipData.hiding){tooltipData.closing=false;}},_tooltip:function _tooltip(element){var tooltip=$(\"<div>\").attr(\"role\",\"tooltip\"),content=$(\"<div>\").appendTo(tooltip),id=tooltip.uniqueId().attr(\"id\");this._addClass(content,\"ui-tooltip-content\");this._addClass(tooltip,\"ui-tooltip\",\"ui-widget ui-widget-content\");tooltip.appendTo(this._appendTo(element));return this.tooltips[id]={element:element,tooltip:tooltip};},_find:function _find(target){var id=target.data(\"ui-tooltip-id\");return id?this.tooltips[id]:null;},_removeTooltip:function _removeTooltip(tooltip){// Clear the interval for delayed tracking tooltips\nclearInterval(this.delayedShow);tooltip.remove();delete this.tooltips[tooltip.attr(\"id\")];},_appendTo:function _appendTo(target){var element=target.closest(\".ui-front, dialog\");if(!element.length){element=this.document[0].body;}return element;},_destroy:function _destroy(){var that=this;// Close open tooltips\n$.each(this.tooltips,function(id,tooltipData){// Delegate to close method to handle common cleanup\nvar event=$.Event(\"blur\"),element=tooltipData.element;event.target=event.currentTarget=element[0];that.close(event,true);// Remove immediately; destroying an open tooltip doesn't use the\n// hide animation\n$(\"#\"+id).remove();// Restore the title\nif(element.data(\"ui-tooltip-title\")){// If the title attribute has changed since open(), don't restore\nif(!element.attr(\"title\")){element.attr(\"title\",element.data(\"ui-tooltip-title\"));}element.removeData(\"ui-tooltip-title\");}});this.liveRegion.remove();}});// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif($.uiBackCompat!==false){// Backcompat for tooltipClass option\n$.widget(\"ui.tooltip\",$.ui.tooltip,{options:{tooltipClass:null},_tooltip:function _tooltip(){var tooltipData=this._superApply(arguments);if(this.options.tooltipClass){tooltipData.tooltip.addClass(this.options.tooltipClass);}return tooltipData;}});}var widgetsTooltip=$.ui.tooltip;});\n\n//# sourceURL=webpack://rup/./node_modules/jquery-ui-dist/jquery-ui.js?");

/***/ }),

/***/ "./node_modules/jquery-ui/ui/version.js":
/*!**********************************************!*\
  !*** ./node_modules/jquery-ui/ui/version.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (factory) {\n  \"use strict\";\n\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  \"use strict\";\n\n  $.ui = $.ui || {};\n  return $.ui.version = \"1.13.2\";\n});\n\n//# sourceURL=webpack://rup/./node_modules/jquery-ui/ui/version.js?");

/***/ }),

/***/ "./node_modules/jquery-ui/ui/widget.js":
/*!*********************************************!*\
  !*** ./node_modules/jquery-ui/ui/widget.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery UI Widget 1.13.2\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n(function (factory) {\n  \"use strict\";\n\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./version */ \"./node_modules/jquery-ui/ui/version.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  \"use strict\";\n\n  var widgetUuid = 0;\n  var widgetHasOwnProperty = Array.prototype.hasOwnProperty;\n  var widgetSlice = Array.prototype.slice;\n\n  $.cleanData = function (orig) {\n    return function (elems) {\n      var events, elem, i;\n\n      for (i = 0; (elem = elems[i]) != null; i++) {\n        // Only trigger remove when necessary to save time\n        events = $._data(elem, \"events\");\n\n        if (events && events.remove) {\n          $(elem).triggerHandler(\"remove\");\n        }\n      }\n\n      orig(elems);\n    };\n  }($.cleanData);\n\n  $.widget = function (name, base, prototype) {\n    var existingConstructor, constructor, basePrototype; // ProxiedPrototype allows the provided prototype to remain unmodified\n    // so that it can be used as a mixin for multiple widgets (#8876)\n\n    var proxiedPrototype = {};\n    var namespace = name.split(\".\")[0];\n    name = name.split(\".\")[1];\n    var fullName = namespace + \"-\" + name;\n\n    if (!prototype) {\n      prototype = base;\n      base = $.Widget;\n    }\n\n    if (Array.isArray(prototype)) {\n      prototype = $.extend.apply(null, [{}].concat(prototype));\n    } // Create selector for plugin\n\n\n    $.expr.pseudos[fullName.toLowerCase()] = function (elem) {\n      return !!$.data(elem, fullName);\n    };\n\n    $[namespace] = $[namespace] || {};\n    existingConstructor = $[namespace][name];\n\n    constructor = $[namespace][name] = function (options, element) {\n      // Allow instantiation without \"new\" keyword\n      if (!this || !this._createWidget) {\n        return new constructor(options, element);\n      } // Allow instantiation without initializing for simple inheritance\n      // must use \"new\" keyword (the code above always passes args)\n\n\n      if (arguments.length) {\n        this._createWidget(options, element);\n      }\n    }; // Extend with the existing constructor to carry over any static properties\n\n\n    $.extend(constructor, existingConstructor, {\n      version: prototype.version,\n      // Copy the object used to create the prototype in case we need to\n      // redefine the widget later\n      _proto: $.extend({}, prototype),\n      // Track widgets that inherit from this widget in case this widget is\n      // redefined after a widget inherits from it\n      _childConstructors: []\n    });\n    basePrototype = new base(); // We need to make the options hash a property directly on the new instance\n    // otherwise we'll modify the options hash on the prototype that we're\n    // inheriting from\n\n    basePrototype.options = $.widget.extend({}, basePrototype.options);\n    $.each(prototype, function (prop, value) {\n      if (typeof value !== \"function\") {\n        proxiedPrototype[prop] = value;\n        return;\n      }\n\n      proxiedPrototype[prop] = function () {\n        function _super() {\n          return base.prototype[prop].apply(this, arguments);\n        }\n\n        function _superApply(args) {\n          return base.prototype[prop].apply(this, args);\n        }\n\n        return function () {\n          var __super = this._super;\n          var __superApply = this._superApply;\n          var returnValue;\n          this._super = _super;\n          this._superApply = _superApply;\n          returnValue = value.apply(this, arguments);\n          this._super = __super;\n          this._superApply = __superApply;\n          return returnValue;\n        };\n      }();\n    });\n    constructor.prototype = $.widget.extend(basePrototype, {\n      // TODO: remove support for widgetEventPrefix\n      // always use the name + a colon as the prefix, e.g., draggable:start\n      // don't prefix for widgets that aren't DOM-based\n      widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix || name : name\n    }, proxiedPrototype, {\n      constructor: constructor,\n      namespace: namespace,\n      widgetName: name,\n      widgetFullName: fullName\n    }); // If this widget is being redefined then we need to find all widgets that\n    // are inheriting from it and redefine all of them so that they inherit from\n    // the new version of this widget. We're essentially trying to replace one\n    // level in the prototype chain.\n\n    if (existingConstructor) {\n      $.each(existingConstructor._childConstructors, function (i, child) {\n        var childPrototype = child.prototype; // Redefine the child widget using the same prototype that was\n        // originally used, but inherit from the new version of the base\n\n        $.widget(childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto);\n      }); // Remove the list of existing child constructors from the old constructor\n      // so the old child constructors can be garbage collected\n\n      delete existingConstructor._childConstructors;\n    } else {\n      base._childConstructors.push(constructor);\n    }\n\n    $.widget.bridge(name, constructor);\n    return constructor;\n  };\n\n  $.widget.extend = function (target) {\n    var input = widgetSlice.call(arguments, 1);\n    var inputIndex = 0;\n    var inputLength = input.length;\n    var key;\n    var value;\n\n    for (; inputIndex < inputLength; inputIndex++) {\n      for (key in input[inputIndex]) {\n        value = input[inputIndex][key];\n\n        if (widgetHasOwnProperty.call(input[inputIndex], key) && value !== undefined) {\n          // Clone objects\n          if ($.isPlainObject(value)) {\n            target[key] = $.isPlainObject(target[key]) ? $.widget.extend({}, target[key], value) : // Don't extend strings, arrays, etc. with objects\n            $.widget.extend({}, value); // Copy everything else by reference\n          } else {\n            target[key] = value;\n          }\n        }\n      }\n    }\n\n    return target;\n  };\n\n  $.widget.bridge = function (name, object) {\n    var fullName = object.prototype.widgetFullName || name;\n\n    $.fn[name] = function (options) {\n      var isMethodCall = typeof options === \"string\";\n      var args = widgetSlice.call(arguments, 1);\n      var returnValue = this;\n\n      if (isMethodCall) {\n        // If this is an empty collection, we need to have the instance method\n        // return undefined instead of the jQuery instance\n        if (!this.length && options === \"instance\") {\n          returnValue = undefined;\n        } else {\n          this.each(function () {\n            var methodValue;\n            var instance = $.data(this, fullName);\n\n            if (options === \"instance\") {\n              returnValue = instance;\n              return false;\n            }\n\n            if (!instance) {\n              return $.error(\"cannot call methods on \" + name + \" prior to initialization; \" + \"attempted to call method '\" + options + \"'\");\n            }\n\n            if (typeof instance[options] !== \"function\" || options.charAt(0) === \"_\") {\n              return $.error(\"no such method '\" + options + \"' for \" + name + \" widget instance\");\n            }\n\n            methodValue = instance[options].apply(instance, args);\n\n            if (methodValue !== instance && methodValue !== undefined) {\n              returnValue = methodValue && methodValue.jquery ? returnValue.pushStack(methodValue.get()) : methodValue;\n              return false;\n            }\n          });\n        }\n      } else {\n        // Allow multiple hashes to be passed on init\n        if (args.length) {\n          options = $.widget.extend.apply(null, [options].concat(args));\n        }\n\n        this.each(function () {\n          var instance = $.data(this, fullName);\n\n          if (instance) {\n            instance.option(options || {});\n\n            if (instance._init) {\n              instance._init();\n            }\n          } else {\n            $.data(this, fullName, new object(options, this));\n          }\n        });\n      }\n\n      return returnValue;\n    };\n  };\n\n  $.Widget = function\n    /* options, element */\n  () {};\n\n  $.Widget._childConstructors = [];\n  $.Widget.prototype = {\n    widgetName: \"widget\",\n    widgetEventPrefix: \"\",\n    defaultElement: \"<div>\",\n    options: {\n      classes: {},\n      disabled: false,\n      // Callbacks\n      create: null\n    },\n    _createWidget: function _createWidget(options, element) {\n      element = $(element || this.defaultElement || this)[0];\n      this.element = $(element);\n      this.uuid = widgetUuid++;\n      this.eventNamespace = \".\" + this.widgetName + this.uuid;\n      this.bindings = $();\n      this.hoverable = $();\n      this.focusable = $();\n      this.classesElementLookup = {};\n\n      if (element !== this) {\n        $.data(element, this.widgetFullName, this);\n\n        this._on(true, this.element, {\n          remove: function remove(event) {\n            if (event.target === element) {\n              this.destroy();\n            }\n          }\n        });\n\n        this.document = $(element.style ? // Element within the document\n        element.ownerDocument : // Element is window or document\n        element.document || element);\n        this.window = $(this.document[0].defaultView || this.document[0].parentWindow);\n      }\n\n      this.options = $.widget.extend({}, this.options, this._getCreateOptions(), options);\n\n      this._create();\n\n      if (this.options.disabled) {\n        this._setOptionDisabled(this.options.disabled);\n      }\n\n      this._trigger(\"create\", null, this._getCreateEventData());\n\n      this._init();\n    },\n    _getCreateOptions: function _getCreateOptions() {\n      return {};\n    },\n    _getCreateEventData: $.noop,\n    _create: $.noop,\n    _init: $.noop,\n    destroy: function destroy() {\n      var that = this;\n\n      this._destroy();\n\n      $.each(this.classesElementLookup, function (key, value) {\n        that._removeClass(value, key);\n      }); // We can probably remove the unbind calls in 2.0\n      // all event bindings should go through this._on()\n\n      this.element.off(this.eventNamespace).removeData(this.widgetFullName);\n      this.widget().off(this.eventNamespace).removeAttr(\"aria-disabled\"); // Clean up events and states\n\n      this.bindings.off(this.eventNamespace);\n    },\n    _destroy: $.noop,\n    widget: function widget() {\n      return this.element;\n    },\n    option: function option(key, value) {\n      var options = key;\n      var parts;\n      var curOption;\n      var i;\n\n      if (arguments.length === 0) {\n        // Don't return a reference to the internal hash\n        return $.widget.extend({}, this.options);\n      }\n\n      if (typeof key === \"string\") {\n        // Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n        options = {};\n        parts = key.split(\".\");\n        key = parts.shift();\n\n        if (parts.length) {\n          curOption = options[key] = $.widget.extend({}, this.options[key]);\n\n          for (i = 0; i < parts.length - 1; i++) {\n            curOption[parts[i]] = curOption[parts[i]] || {};\n            curOption = curOption[parts[i]];\n          }\n\n          key = parts.pop();\n\n          if (arguments.length === 1) {\n            return curOption[key] === undefined ? null : curOption[key];\n          }\n\n          curOption[key] = value;\n        } else {\n          if (arguments.length === 1) {\n            return this.options[key] === undefined ? null : this.options[key];\n          }\n\n          options[key] = value;\n        }\n      }\n\n      this._setOptions(options);\n\n      return this;\n    },\n    _setOptions: function _setOptions(options) {\n      var key;\n\n      for (key in options) {\n        this._setOption(key, options[key]);\n      }\n\n      return this;\n    },\n    _setOption: function _setOption(key, value) {\n      if (key === \"classes\") {\n        this._setOptionClasses(value);\n      }\n\n      this.options[key] = value;\n\n      if (key === \"disabled\") {\n        this._setOptionDisabled(value);\n      }\n\n      return this;\n    },\n    _setOptionClasses: function _setOptionClasses(value) {\n      var classKey, elements, currentElements;\n\n      for (classKey in value) {\n        currentElements = this.classesElementLookup[classKey];\n\n        if (value[classKey] === this.options.classes[classKey] || !currentElements || !currentElements.length) {\n          continue;\n        } // We are doing this to create a new jQuery object because the _removeClass() call\n        // on the next line is going to destroy the reference to the current elements being\n        // tracked. We need to save a copy of this collection so that we can add the new classes\n        // below.\n\n\n        elements = $(currentElements.get());\n\n        this._removeClass(currentElements, classKey); // We don't use _addClass() here, because that uses this.options.classes\n        // for generating the string of classes. We want to use the value passed in from\n        // _setOption(), this is the new value of the classes option which was passed to\n        // _setOption(). We pass this value directly to _classes().\n\n\n        elements.addClass(this._classes({\n          element: elements,\n          keys: classKey,\n          classes: value,\n          add: true\n        }));\n      }\n    },\n    _setOptionDisabled: function _setOptionDisabled(value) {\n      this._toggleClass(this.widget(), this.widgetFullName + \"-disabled\", null, !!value); // If the widget is becoming disabled, then nothing is interactive\n\n\n      if (value) {\n        this._removeClass(this.hoverable, null, \"ui-state-hover\");\n\n        this._removeClass(this.focusable, null, \"ui-state-focus\");\n      }\n    },\n    enable: function enable() {\n      return this._setOptions({\n        disabled: false\n      });\n    },\n    disable: function disable() {\n      return this._setOptions({\n        disabled: true\n      });\n    },\n    _classes: function _classes(options) {\n      var full = [];\n      var that = this;\n      options = $.extend({\n        element: this.element,\n        classes: this.options.classes || {}\n      }, options);\n\n      function bindRemoveEvent() {\n        var nodesToBind = [];\n        options.element.each(function (_, element) {\n          var isTracked = $.map(that.classesElementLookup, function (elements) {\n            return elements;\n          }).some(function (elements) {\n            return elements.is(element);\n          });\n\n          if (!isTracked) {\n            nodesToBind.push(element);\n          }\n        });\n\n        that._on($(nodesToBind), {\n          remove: \"_untrackClassesElement\"\n        });\n      }\n\n      function processClassString(classes, checkOption) {\n        var current, i;\n\n        for (i = 0; i < classes.length; i++) {\n          current = that.classesElementLookup[classes[i]] || $();\n\n          if (options.add) {\n            bindRemoveEvent();\n            current = $($.uniqueSort(current.get().concat(options.element.get())));\n          } else {\n            current = $(current.not(options.element).get());\n          }\n\n          that.classesElementLookup[classes[i]] = current;\n          full.push(classes[i]);\n\n          if (checkOption && options.classes[classes[i]]) {\n            full.push(options.classes[classes[i]]);\n          }\n        }\n      }\n\n      if (options.keys) {\n        processClassString(options.keys.match(/\\S+/g) || [], true);\n      }\n\n      if (options.extra) {\n        processClassString(options.extra.match(/\\S+/g) || []);\n      }\n\n      return full.join(\" \");\n    },\n    _untrackClassesElement: function _untrackClassesElement(event) {\n      var that = this;\n      $.each(that.classesElementLookup, function (key, value) {\n        if ($.inArray(event.target, value) !== -1) {\n          that.classesElementLookup[key] = $(value.not(event.target).get());\n        }\n      });\n\n      this._off($(event.target));\n    },\n    _removeClass: function _removeClass(element, keys, extra) {\n      return this._toggleClass(element, keys, extra, false);\n    },\n    _addClass: function _addClass(element, keys, extra) {\n      return this._toggleClass(element, keys, extra, true);\n    },\n    _toggleClass: function _toggleClass(element, keys, extra, add) {\n      add = typeof add === \"boolean\" ? add : extra;\n      var shift = typeof element === \"string\" || element === null,\n          options = {\n        extra: shift ? keys : extra,\n        keys: shift ? element : keys,\n        element: shift ? this.element : element,\n        add: add\n      };\n      options.element.toggleClass(this._classes(options), add);\n      return this;\n    },\n    _on: function _on(suppressDisabledCheck, element, handlers) {\n      var delegateElement;\n      var instance = this; // No suppressDisabledCheck flag, shuffle arguments\n\n      if (typeof suppressDisabledCheck !== \"boolean\") {\n        handlers = element;\n        element = suppressDisabledCheck;\n        suppressDisabledCheck = false;\n      } // No element argument, shuffle and use this.element\n\n\n      if (!handlers) {\n        handlers = element;\n        element = this.element;\n        delegateElement = this.widget();\n      } else {\n        element = delegateElement = $(element);\n        this.bindings = this.bindings.add(element);\n      }\n\n      $.each(handlers, function (event, handler) {\n        function handlerProxy() {\n          // Allow widgets to customize the disabled handling\n          // - disabled as an array instead of boolean\n          // - disabled class as method for disabling individual parts\n          if (!suppressDisabledCheck && (instance.options.disabled === true || $(this).hasClass(\"ui-state-disabled\"))) {\n            return;\n          }\n\n          return (typeof handler === \"string\" ? instance[handler] : handler).apply(instance, arguments);\n        } // Copy the guid so direct unbinding works\n\n\n        if (typeof handler !== \"string\") {\n          handlerProxy.guid = handler.guid = handler.guid || handlerProxy.guid || $.guid++;\n        }\n\n        var match = event.match(/^([\\w:-]*)\\s*(.*)$/);\n        var eventName = match[1] + instance.eventNamespace;\n        var selector = match[2];\n\n        if (selector) {\n          delegateElement.on(eventName, selector, handlerProxy);\n        } else {\n          element.on(eventName, handlerProxy);\n        }\n      });\n    },\n    _off: function _off(element, eventName) {\n      eventName = (eventName || \"\").split(\" \").join(this.eventNamespace + \" \") + this.eventNamespace;\n      element.off(eventName); // Clear the stack to avoid memory leaks (#10056)\n\n      this.bindings = $(this.bindings.not(element).get());\n      this.focusable = $(this.focusable.not(element).get());\n      this.hoverable = $(this.hoverable.not(element).get());\n    },\n    _delay: function _delay(handler, delay) {\n      function handlerProxy() {\n        return (typeof handler === \"string\" ? instance[handler] : handler).apply(instance, arguments);\n      }\n\n      var instance = this;\n      return setTimeout(handlerProxy, delay || 0);\n    },\n    _hoverable: function _hoverable(element) {\n      this.hoverable = this.hoverable.add(element);\n\n      this._on(element, {\n        mouseenter: function mouseenter(event) {\n          this._addClass($(event.currentTarget), null, \"ui-state-hover\");\n        },\n        mouseleave: function mouseleave(event) {\n          this._removeClass($(event.currentTarget), null, \"ui-state-hover\");\n        }\n      });\n    },\n    _focusable: function _focusable(element) {\n      this.focusable = this.focusable.add(element);\n\n      this._on(element, {\n        focusin: function focusin(event) {\n          this._addClass($(event.currentTarget), null, \"ui-state-focus\");\n        },\n        focusout: function focusout(event) {\n          this._removeClass($(event.currentTarget), null, \"ui-state-focus\");\n        }\n      });\n    },\n    _trigger: function _trigger(type, event, data) {\n      var prop, orig;\n      var callback = this.options[type];\n      data = data || {};\n      event = $.Event(event);\n      event.type = (type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type).toLowerCase(); // The original event may come from any element\n      // so we need to reset the target on the new event\n\n      event.target = this.element[0]; // Copy original event properties over to the new event\n\n      orig = event.originalEvent;\n\n      if (orig) {\n        for (prop in orig) {\n          if (!(prop in event)) {\n            event[prop] = orig[prop];\n          }\n        }\n      }\n\n      this.element.trigger(event, data);\n      return !(typeof callback === \"function\" && callback.apply(this.element[0], [event].concat(data)) === false || event.isDefaultPrevented());\n    }\n  };\n  $.each({\n    show: \"fadeIn\",\n    hide: \"fadeOut\"\n  }, function (method, defaultEffect) {\n    $.Widget.prototype[\"_\" + method] = function (element, options, callback) {\n      if (typeof options === \"string\") {\n        options = {\n          effect: options\n        };\n      }\n\n      var hasOptions;\n      var effectName = !options ? method : options === true || typeof options === \"number\" ? defaultEffect : options.effect || defaultEffect;\n      options = options || {};\n\n      if (typeof options === \"number\") {\n        options = {\n          duration: options\n        };\n      } else if (options === true) {\n        options = {};\n      }\n\n      hasOptions = !$.isEmptyObject(options);\n      options.complete = callback;\n\n      if (options.delay) {\n        element.delay(options.delay);\n      }\n\n      if (hasOptions && $.effects && $.effects.effect[effectName]) {\n        element[method](options);\n      } else if (effectName !== method && element[effectName]) {\n        element[effectName](options.duration, options.easing, callback);\n      } else {\n        element.queue(function (next) {\n          $(this)[method]();\n\n          if (callback) {\n            callback.call(element[0]);\n          }\n\n          next();\n        });\n      }\n    };\n  });\n  return $.widget;\n});\n\n//# sourceURL=webpack://rup/./node_modules/jquery-ui/ui/widget.js?");

/***/ }),

/***/ "./node_modules/jquery-validation/dist/additional-methods.js":
/*!*******************************************************************!*\
  !*** ./node_modules/jquery-validation/dist/additional-methods.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * jQuery Validation Plugin v1.19.5\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2022 Jörn Zaefferer\n * Released under the MIT license\n */\n(function (factory) {\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./jquery.validate */ \"./node_modules/jquery-validation/dist/jquery.validate.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  (function () {\n    function stripHtml(value) {\n      // Remove html tags and space chars\n      return value.replace(/<.[^<>]*?>/g, \" \").replace(/&nbsp;|&#160;/gi, \" \") // Remove punctuation\n      .replace(/[.(),;:!?%#$'\\\"_+=\\/\\-“”’]*/g, \"\");\n    }\n\n    $.validator.addMethod(\"maxWords\", function (value, element, params) {\n      return this.optional(element) || stripHtml(value).match(/\\b\\w+\\b/g).length <= params;\n    }, $.validator.format(\"Please enter {0} words or less.\"));\n    $.validator.addMethod(\"minWords\", function (value, element, params) {\n      return this.optional(element) || stripHtml(value).match(/\\b\\w+\\b/g).length >= params;\n    }, $.validator.format(\"Please enter at least {0} words.\"));\n    $.validator.addMethod(\"rangeWords\", function (value, element, params) {\n      var valueStripped = stripHtml(value),\n          regex = /\\b\\w+\\b/g;\n      return this.optional(element) || valueStripped.match(regex).length >= params[0] && valueStripped.match(regex).length <= params[1];\n    }, $.validator.format(\"Please enter between {0} and {1} words.\"));\n  })();\n  /**\n   * This is used in the United States to process payments, deposits,\n   * or transfers using the Automated Clearing House (ACH) or Fedwire\n   * systems. A very common use case would be to validate a form for\n   * an ACH bill payment.\n   */\n\n\n  $.validator.addMethod(\"abaRoutingNumber\", function (value) {\n    var checksum = 0;\n    var tokens = value.split(\"\");\n    var length = tokens.length; // Length Check\n\n    if (length !== 9) {\n      return false;\n    } // Calc the checksum\n    // https://en.wikipedia.org/wiki/ABA_routing_transit_number\n\n\n    for (var i = 0; i < length; i += 3) {\n      checksum += parseInt(tokens[i], 10) * 3 + parseInt(tokens[i + 1], 10) * 7 + parseInt(tokens[i + 2], 10);\n    } // If not zero and divisible by 10 then valid\n\n\n    if (checksum !== 0 && checksum % 10 === 0) {\n      return true;\n    }\n\n    return false;\n  }, \"Please enter a valid routing number.\"); // Accept a value from a file input based on a required mimetype\n\n  $.validator.addMethod(\"accept\", function (value, element, param) {\n    // Split mime on commas in case we have multiple types we can accept\n    var typeParam = typeof param === \"string\" ? param.replace(/\\s/g, \"\") : \"image/*\",\n        optionalValue = this.optional(element),\n        i,\n        file,\n        regex; // Element is optional\n\n    if (optionalValue) {\n      return optionalValue;\n    }\n\n    if ($(element).attr(\"type\") === \"file\") {\n      // Escape string to be used in the regex\n      // see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\n      // Escape also \"/*\" as \"/.*\" as a wildcard\n      typeParam = typeParam.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\").replace(/,/g, \"|\").replace(/\\/\\*/g, \"/.*\"); // Check if the element has a FileList before checking each file\n\n      if (element.files && element.files.length) {\n        regex = new RegExp(\".?(\" + typeParam + \")$\", \"i\");\n\n        for (i = 0; i < element.files.length; i++) {\n          file = element.files[i]; // Grab the mimetype from the loaded file, verify it matches\n\n          if (!file.type.match(regex)) {\n            return false;\n          }\n        }\n      }\n    } // Either return true because we've validated each file, or because the\n    // browser does not support element.files and the FileList feature\n\n\n    return true;\n  }, $.validator.format(\"Please enter a value with a valid mimetype.\"));\n  $.validator.addMethod(\"alphanumeric\", function (value, element) {\n    return this.optional(element) || /^\\w+$/i.test(value);\n  }, \"Letters, numbers, and underscores only please.\");\n  /*\n   * Dutch bank account numbers (not 'giro' numbers) have 9 digits\n   * and pass the '11 check'.\n   * We accept the notation with spaces, as that is common.\n   * acceptable: 123456789 or 12 34 56 789\n   */\n\n  $.validator.addMethod(\"bankaccountNL\", function (value, element) {\n    if (this.optional(element)) {\n      return true;\n    }\n\n    if (!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(value)) {\n      return false;\n    } // Now '11 check'\n\n\n    var account = value.replace(/ /g, \"\"),\n        // Remove spaces\n    sum = 0,\n        len = account.length,\n        pos,\n        factor,\n        digit;\n\n    for (pos = 0; pos < len; pos++) {\n      factor = len - pos;\n      digit = account.substring(pos, pos + 1);\n      sum = sum + factor * digit;\n    }\n\n    return sum % 11 === 0;\n  }, \"Please specify a valid bank account number.\");\n  $.validator.addMethod(\"bankorgiroaccountNL\", function (value, element) {\n    return this.optional(element) || $.validator.methods.bankaccountNL.call(this, value, element) || $.validator.methods.giroaccountNL.call(this, value, element);\n  }, \"Please specify a valid bank or giro account number.\");\n  /**\n   * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.\n   *\n   * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)\n   *\n   * Validation is case-insensitive. Please make sure to normalize input yourself.\n   *\n   * BIC definition in detail:\n   * - First 4 characters - bank code (only letters)\n   * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)\n   * - Next 2 characters - location code (letters and digits)\n   *   a. shall not start with '0' or '1'\n   *   b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)\n   * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)\n   */\n\n  $.validator.addMethod(\"bic\", function (value, element) {\n    return this.optional(element) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(value.toUpperCase());\n  }, \"Please specify a valid BIC code.\");\n  /*\n   * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities\n   * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal\n   *\n   * Spanish CIF structure:\n   *\n   * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]\n   *\n   * Where:\n   *\n   * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]\n   * P: 2 characters. Province.\n   * N: 5 characters. Secuencial Number within the province.\n   * C: 1 character. Control Digit: [0-9A-J].\n   *\n   * [ T ]: Kind of Organizations. Possible values:\n   *\n   *   A. Corporations\n   *   B. LLCs\n   *   C. General partnerships\n   *   D. Companies limited partnerships\n   *   E. Communities of goods\n   *   F. Cooperative Societies\n   *   G. Associations\n   *   H. Communities of homeowners in horizontal property regime\n   *   J. Civil Societies\n   *   K. Old format\n   *   L. Old format\n   *   M. Old format\n   *   N. Nonresident entities\n   *   P. Local authorities\n   *   Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions\n   *   R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)\n   *   S. Organs of State Administration and regions\n   *   V. Agrarian Transformation\n   *   W. Permanent establishments of non-resident in Spain\n   *\n   * [ C ]: Control Digit. It can be a number or a letter depending on T value:\n   * [ T ]  -->  [ C ]\n   * ------    ----------\n   *   A         Number\n   *   B         Number\n   *   E         Number\n   *   H         Number\n   *   K         Letter\n   *   P         Letter\n   *   Q         Letter\n   *   S         Letter\n   *\n   */\n\n  $.validator.addMethod(\"cifES\", function (value, element) {\n    \"use strict\";\n\n    if (this.optional(element)) {\n      return true;\n    }\n\n    var cifRegEx = new RegExp(/^([ABCDEFGHJKLMNPQRSUVW])(\\d{7})([0-9A-J])$/gi);\n    var letter = value.substring(0, 1),\n        // [ T ]\n    number = value.substring(1, 8),\n        // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]\n    control = value.substring(8, 9),\n        // [ C ]\n    all_sum = 0,\n        even_sum = 0,\n        odd_sum = 0,\n        i,\n        n,\n        control_digit,\n        control_letter;\n\n    function isOdd(n) {\n      return n % 2 === 0;\n    } // Quick format test\n\n\n    if (value.length !== 9 || !cifRegEx.test(value)) {\n      return false;\n    }\n\n    for (i = 0; i < number.length; i++) {\n      n = parseInt(number[i], 10); // Odd positions\n\n      if (isOdd(i)) {\n        // Odd positions are multiplied first.\n        n *= 2; // If the multiplication is bigger than 10 we need to adjust\n\n        odd_sum += n < 10 ? n : n - 9; // Even positions\n        // Just sum them\n      } else {\n        even_sum += n;\n      }\n    }\n\n    all_sum = even_sum + odd_sum;\n    control_digit = (10 - all_sum.toString().substr(-1)).toString();\n    control_digit = parseInt(control_digit, 10) > 9 ? \"0\" : control_digit;\n    control_letter = \"JABCDEFGHI\".substr(control_digit, 1).toString(); // Control must be a digit\n\n    if (letter.match(/[ABEH]/)) {\n      return control === control_digit; // Control must be a letter\n    } else if (letter.match(/[KPQS]/)) {\n      return control === control_letter;\n    } // Can be either\n\n\n    return control === control_digit || control === control_letter;\n  }, \"Please specify a valid CIF number.\");\n  /*\n   * Brazillian CNH number (Carteira Nacional de Habilitacao) is the License Driver number.\n   * CNH numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.\n   */\n\n  $.validator.addMethod(\"cnhBR\", function (value) {\n    // Removing special characters from value\n    value = value.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\-|\\\\:;'<>,.\\/? ])+/g, \"\"); // Checking value to have 11 digits only\n\n    if (value.length !== 11) {\n      return false;\n    }\n\n    var sum = 0,\n        dsc = 0,\n        firstChar,\n        firstCN,\n        secondCN,\n        i,\n        j,\n        v;\n    firstChar = value.charAt(0);\n\n    if (new Array(12).join(firstChar) === value) {\n      return false;\n    } // Step 1 - using first Check Number:\n\n\n    for (i = 0, j = 9, v = 0; i < 9; ++i, --j) {\n      sum += +(value.charAt(i) * j);\n    }\n\n    firstCN = sum % 11;\n\n    if (firstCN >= 10) {\n      firstCN = 0;\n      dsc = 2;\n    }\n\n    sum = 0;\n\n    for (i = 0, j = 1, v = 0; i < 9; ++i, ++j) {\n      sum += +(value.charAt(i) * j);\n    }\n\n    secondCN = sum % 11;\n\n    if (secondCN >= 10) {\n      secondCN = 0;\n    } else {\n      secondCN = secondCN - dsc;\n    }\n\n    return String(firstCN).concat(secondCN) === value.substr(-2);\n  }, \"Please specify a valid CNH number.\");\n  /*\n   * Brazillian value number (Cadastrado de Pessoas Juridica).\n   * value numbers have 14 digits in total: 12 numbers followed by 2 check numbers that are being used for validation.\n   */\n\n  $.validator.addMethod(\"cnpjBR\", function (value, element) {\n    \"use strict\";\n\n    if (this.optional(element)) {\n      return true;\n    } // Removing no number\n\n\n    value = value.replace(/[^\\d]+/g, \"\"); // Checking value to have 14 digits only\n\n    if (value.length !== 14) {\n      return false;\n    } // Elimina values invalidos conhecidos\n\n\n    if (value === \"00000000000000\" || value === \"11111111111111\" || value === \"22222222222222\" || value === \"33333333333333\" || value === \"44444444444444\" || value === \"55555555555555\" || value === \"66666666666666\" || value === \"77777777777777\" || value === \"88888888888888\" || value === \"99999999999999\") {\n      return false;\n    } // Valida DVs\n\n\n    var tamanho = value.length - 2;\n    var numeros = value.substring(0, tamanho);\n    var digitos = value.substring(tamanho);\n    var soma = 0;\n    var pos = tamanho - 7;\n\n    for (var i = tamanho; i >= 1; i--) {\n      soma += numeros.charAt(tamanho - i) * pos--;\n\n      if (pos < 2) {\n        pos = 9;\n      }\n    }\n\n    var resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;\n\n    if (resultado !== parseInt(digitos.charAt(0), 10)) {\n      return false;\n    }\n\n    tamanho = tamanho + 1;\n    numeros = value.substring(0, tamanho);\n    soma = 0;\n    pos = tamanho - 7;\n\n    for (var il = tamanho; il >= 1; il--) {\n      soma += numeros.charAt(tamanho - il) * pos--;\n\n      if (pos < 2) {\n        pos = 9;\n      }\n    }\n\n    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;\n\n    if (resultado !== parseInt(digitos.charAt(1), 10)) {\n      return false;\n    }\n\n    return true;\n  }, \"Please specify a CNPJ value number.\");\n  /*\n   * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.\n   * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.\n   */\n\n  $.validator.addMethod(\"cpfBR\", function (value, element) {\n    \"use strict\";\n\n    if (this.optional(element)) {\n      return true;\n    } // Removing special characters from value\n\n\n    value = value.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\-|\\\\:;'<>,.\\/? ])+/g, \"\"); // Checking value to have 11 digits only\n\n    if (value.length !== 11) {\n      return false;\n    }\n\n    var sum = 0,\n        firstCN,\n        secondCN,\n        checkResult,\n        i;\n    firstCN = parseInt(value.substring(9, 10), 10);\n    secondCN = parseInt(value.substring(10, 11), 10);\n\n    checkResult = function checkResult(sum, cn) {\n      var result = sum * 10 % 11;\n\n      if (result === 10 || result === 11) {\n        result = 0;\n      }\n\n      return result === cn;\n    }; // Checking for dump data\n\n\n    if (value === \"\" || value === \"00000000000\" || value === \"11111111111\" || value === \"22222222222\" || value === \"33333333333\" || value === \"44444444444\" || value === \"55555555555\" || value === \"66666666666\" || value === \"77777777777\" || value === \"88888888888\" || value === \"99999999999\") {\n      return false;\n    } // Step 1 - using first Check Number:\n\n\n    for (i = 1; i <= 9; i++) {\n      sum = sum + parseInt(value.substring(i - 1, i), 10) * (11 - i);\n    } // If first Check Number (CN) is valid, move to Step 2 - using second Check Number:\n\n\n    if (checkResult(sum, firstCN)) {\n      sum = 0;\n\n      for (i = 1; i <= 10; i++) {\n        sum = sum + parseInt(value.substring(i - 1, i), 10) * (12 - i);\n      }\n\n      return checkResult(sum, secondCN);\n    }\n\n    return false;\n  }, \"Please specify a valid CPF number.\"); // https://jqueryvalidation.org/creditcard-method/\n  // based on https://en.wikipedia.org/wiki/Luhn_algorithm\n\n  $.validator.addMethod(\"creditcard\", function (value, element) {\n    if (this.optional(element)) {\n      return \"dependency-mismatch\";\n    } // Accept only spaces, digits and dashes\n\n\n    if (/[^0-9 \\-]+/.test(value)) {\n      return false;\n    }\n\n    var nCheck = 0,\n        nDigit = 0,\n        bEven = false,\n        n,\n        cDigit;\n    value = value.replace(/\\D/g, \"\"); // Basing min and max length on\n    // https://dev.ean.com/general-info/valid-card-types/\n\n    if (value.length < 13 || value.length > 19) {\n      return false;\n    }\n\n    for (n = value.length - 1; n >= 0; n--) {\n      cDigit = value.charAt(n);\n      nDigit = parseInt(cDigit, 10);\n\n      if (bEven) {\n        if ((nDigit *= 2) > 9) {\n          nDigit -= 9;\n        }\n      }\n\n      nCheck += nDigit;\n      bEven = !bEven;\n    }\n\n    return nCheck % 10 === 0;\n  }, \"Please enter a valid credit card number.\");\n  /* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator\n   * Redistributed under the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0\n   * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)\n   */\n\n  $.validator.addMethod(\"creditcardtypes\", function (value, element, param) {\n    if (/[^0-9\\-]+/.test(value)) {\n      return false;\n    }\n\n    value = value.replace(/\\D/g, \"\");\n    var validTypes = 0x0000;\n\n    if (param.mastercard) {\n      validTypes |= 0x0001;\n    }\n\n    if (param.visa) {\n      validTypes |= 0x0002;\n    }\n\n    if (param.amex) {\n      validTypes |= 0x0004;\n    }\n\n    if (param.dinersclub) {\n      validTypes |= 0x0008;\n    }\n\n    if (param.enroute) {\n      validTypes |= 0x0010;\n    }\n\n    if (param.discover) {\n      validTypes |= 0x0020;\n    }\n\n    if (param.jcb) {\n      validTypes |= 0x0040;\n    }\n\n    if (param.unknown) {\n      validTypes |= 0x0080;\n    }\n\n    if (param.all) {\n      validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;\n    }\n\n    if (validTypes & 0x0001 && (/^(5[12345])/.test(value) || /^(2[234567])/.test(value))) {\n      // Mastercard\n      return value.length === 16;\n    }\n\n    if (validTypes & 0x0002 && /^(4)/.test(value)) {\n      // Visa\n      return value.length === 16;\n    }\n\n    if (validTypes & 0x0004 && /^(3[47])/.test(value)) {\n      // Amex\n      return value.length === 15;\n    }\n\n    if (validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test(value)) {\n      // Dinersclub\n      return value.length === 14;\n    }\n\n    if (validTypes & 0x0010 && /^(2(014|149))/.test(value)) {\n      // Enroute\n      return value.length === 15;\n    }\n\n    if (validTypes & 0x0020 && /^(6011)/.test(value)) {\n      // Discover\n      return value.length === 16;\n    }\n\n    if (validTypes & 0x0040 && /^(3)/.test(value)) {\n      // Jcb\n      return value.length === 16;\n    }\n\n    if (validTypes & 0x0040 && /^(2131|1800)/.test(value)) {\n      // Jcb\n      return value.length === 15;\n    }\n\n    if (validTypes & 0x0080) {\n      // Unknown\n      return true;\n    }\n\n    return false;\n  }, \"Please enter a valid credit card number.\");\n  /**\n   * Validates currencies with any given symbols by @jameslouiz\n   * Symbols can be optional or required. Symbols required by default\n   *\n   * Usage examples:\n   *  currency: [\"£\", false] - Use false for soft currency validation\n   *  currency: [\"$\", false]\n   *  currency: [\"RM\", false] - also works with text based symbols such as \"RM\" - Malaysia Ringgit etc\n   *\n   *  <input class=\"currencyInput\" name=\"currencyInput\">\n   *\n   * Soft symbol checking\n   *  currencyInput: {\n   *     currency: [\"$\", false]\n   *  }\n   *\n   * Strict symbol checking (default)\n   *  currencyInput: {\n   *     currency: \"$\"\n   *     //OR\n   *     currency: [\"$\", true]\n   *  }\n   *\n   * Multiple Symbols\n   *  currencyInput: {\n   *     currency: \"$,£,¢\"\n   *  }\n   */\n\n  $.validator.addMethod(\"currency\", function (value, element, param) {\n    var isParamString = typeof param === \"string\",\n        symbol = isParamString ? param : param[0],\n        soft = isParamString ? true : param[1],\n        regex;\n    symbol = symbol.replace(/,/g, \"\");\n    symbol = soft ? symbol + \"]\" : symbol + \"]?\";\n    regex = \"^[\" + symbol + \"([1-9]{1}[0-9]{0,2}(\\\\,[0-9]{3})*(\\\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\\\.[0-9]{0,2})?|0(\\\\.[0-9]{0,2})?|(\\\\.[0-9]{1,2})?)$\";\n    regex = new RegExp(regex);\n    return this.optional(element) || regex.test(value);\n  }, \"Please specify a valid currency.\");\n  $.validator.addMethod(\"dateFA\", function (value, element) {\n    return this.optional(element) || /^[1-4]\\d{3}\\/((0?[1-6]\\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(value);\n  }, $.validator.messages.date);\n  /**\n   * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.\n   *\n   * @example $.validator.methods.date(\"01/01/1900\")\n   * @result true\n   *\n   * @example $.validator.methods.date(\"01/13/1990\")\n   * @result false\n   *\n   * @example $.validator.methods.date(\"01.01.1900\")\n   * @result false\n   *\n   * @example <input name=\"pippo\" class=\"{dateITA:true}\" />\n   * @desc Declares an optional input element whose value must be a valid date.\n   *\n   * @name $.validator.methods.dateITA\n   * @type Boolean\n   * @cat Plugins/Validate/Methods\n   */\n\n  $.validator.addMethod(\"dateITA\", function (value, element) {\n    var check = false,\n        re = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/,\n        adata,\n        gg,\n        mm,\n        aaaa,\n        xdata;\n\n    if (re.test(value)) {\n      adata = value.split(\"/\");\n      gg = parseInt(adata[0], 10);\n      mm = parseInt(adata[1], 10);\n      aaaa = parseInt(adata[2], 10);\n      xdata = new Date(Date.UTC(aaaa, mm - 1, gg, 12, 0, 0, 0));\n\n      if (xdata.getUTCFullYear() === aaaa && xdata.getUTCMonth() === mm - 1 && xdata.getUTCDate() === gg) {\n        check = true;\n      } else {\n        check = false;\n      }\n    } else {\n      check = false;\n    }\n\n    return this.optional(element) || check;\n  }, $.validator.messages.date);\n  $.validator.addMethod(\"dateNL\", function (value, element) {\n    return this.optional(element) || /^(0?[1-9]|[12]\\d|3[01])[\\.\\/\\-](0?[1-9]|1[012])[\\.\\/\\-]([12]\\d)?(\\d\\d)$/.test(value);\n  }, $.validator.messages.date); // Older \"accept\" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept\n\n  $.validator.addMethod(\"extension\", function (value, element, param) {\n    param = typeof param === \"string\" ? param.replace(/,/g, \"|\") : \"png|jpe?g|gif\";\n    return this.optional(element) || value.match(new RegExp(\"\\\\.(\" + param + \")$\", \"i\"));\n  }, $.validator.format(\"Please enter a value with a valid extension.\"));\n  /**\n   * Dutch giro account numbers (not bank numbers) have max 7 digits\n   */\n\n  $.validator.addMethod(\"giroaccountNL\", function (value, element) {\n    return this.optional(element) || /^[0-9]{1,7}$/.test(value);\n  }, \"Please specify a valid giro account number.\");\n  $.validator.addMethod(\"greaterThan\", function (value, element, param) {\n    var target = $(param);\n\n    if (this.settings.onfocusout && target.not(\".validate-greaterThan-blur\").length) {\n      target.addClass(\"validate-greaterThan-blur\").on(\"blur.validate-greaterThan\", function () {\n        $(element).valid();\n      });\n    }\n\n    return value > target.val();\n  }, \"Please enter a greater value.\");\n  $.validator.addMethod(\"greaterThanEqual\", function (value, element, param) {\n    var target = $(param);\n\n    if (this.settings.onfocusout && target.not(\".validate-greaterThanEqual-blur\").length) {\n      target.addClass(\"validate-greaterThanEqual-blur\").on(\"blur.validate-greaterThanEqual\", function () {\n        $(element).valid();\n      });\n    }\n\n    return value >= target.val();\n  }, \"Please enter a greater value.\");\n  /**\n   * IBAN is the international bank account number.\n   * It has a country - specific format, that is checked here too\n   *\n   * Validation is case-insensitive. Please make sure to normalize input yourself.\n   */\n\n  $.validator.addMethod(\"iban\", function (value, element) {\n    // Some quick simple tests to prevent needless work\n    if (this.optional(element)) {\n      return true;\n    } // Remove spaces and to upper case\n\n\n    var iban = value.replace(/ /g, \"\").toUpperCase(),\n        ibancheckdigits = \"\",\n        leadingZeroes = true,\n        cRest = \"\",\n        cOperator = \"\",\n        countrycode,\n        ibancheck,\n        charAt,\n        cChar,\n        bbanpattern,\n        bbancountrypatterns,\n        ibanregexp,\n        i,\n        p; // Check for IBAN code length.\n    // It contains:\n    // country code ISO 3166-1 - two letters,\n    // two check digits,\n    // Basic Bank Account Number (BBAN) - up to 30 chars\n\n    var minimalIBANlength = 5;\n\n    if (iban.length < minimalIBANlength) {\n      return false;\n    } // Check the country code and find the country specific format\n\n\n    countrycode = iban.substring(0, 2);\n    bbancountrypatterns = {\n      \"AL\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n      \"AD\": \"\\\\d{8}[\\\\dA-Z]{12}\",\n      \"AT\": \"\\\\d{16}\",\n      \"AZ\": \"[\\\\dA-Z]{4}\\\\d{20}\",\n      \"BE\": \"\\\\d{12}\",\n      \"BH\": \"[A-Z]{4}[\\\\dA-Z]{14}\",\n      \"BA\": \"\\\\d{16}\",\n      \"BR\": \"\\\\d{23}[A-Z][\\\\dA-Z]\",\n      \"BG\": \"[A-Z]{4}\\\\d{6}[\\\\dA-Z]{8}\",\n      \"CR\": \"\\\\d{17}\",\n      \"HR\": \"\\\\d{17}\",\n      \"CY\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n      \"CZ\": \"\\\\d{20}\",\n      \"DK\": \"\\\\d{14}\",\n      \"DO\": \"[A-Z]{4}\\\\d{20}\",\n      \"EE\": \"\\\\d{16}\",\n      \"FO\": \"\\\\d{14}\",\n      \"FI\": \"\\\\d{14}\",\n      \"FR\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n      \"GE\": \"[\\\\dA-Z]{2}\\\\d{16}\",\n      \"DE\": \"\\\\d{18}\",\n      \"GI\": \"[A-Z]{4}[\\\\dA-Z]{15}\",\n      \"GR\": \"\\\\d{7}[\\\\dA-Z]{16}\",\n      \"GL\": \"\\\\d{14}\",\n      \"GT\": \"[\\\\dA-Z]{4}[\\\\dA-Z]{20}\",\n      \"HU\": \"\\\\d{24}\",\n      \"IS\": \"\\\\d{22}\",\n      \"IE\": \"[\\\\dA-Z]{4}\\\\d{14}\",\n      \"IL\": \"\\\\d{19}\",\n      \"IT\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n      \"KZ\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n      \"KW\": \"[A-Z]{4}[\\\\dA-Z]{22}\",\n      \"LV\": \"[A-Z]{4}[\\\\dA-Z]{13}\",\n      \"LB\": \"\\\\d{4}[\\\\dA-Z]{20}\",\n      \"LI\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n      \"LT\": \"\\\\d{16}\",\n      \"LU\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n      \"MK\": \"\\\\d{3}[\\\\dA-Z]{10}\\\\d{2}\",\n      \"MT\": \"[A-Z]{4}\\\\d{5}[\\\\dA-Z]{18}\",\n      \"MR\": \"\\\\d{23}\",\n      \"MU\": \"[A-Z]{4}\\\\d{19}[A-Z]{3}\",\n      \"MC\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n      \"MD\": \"[\\\\dA-Z]{2}\\\\d{18}\",\n      \"ME\": \"\\\\d{18}\",\n      \"NL\": \"[A-Z]{4}\\\\d{10}\",\n      \"NO\": \"\\\\d{11}\",\n      \"PK\": \"[\\\\dA-Z]{4}\\\\d{16}\",\n      \"PS\": \"[\\\\dA-Z]{4}\\\\d{21}\",\n      \"PL\": \"\\\\d{24}\",\n      \"PT\": \"\\\\d{21}\",\n      \"RO\": \"[A-Z]{4}[\\\\dA-Z]{16}\",\n      \"SM\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n      \"SA\": \"\\\\d{2}[\\\\dA-Z]{18}\",\n      \"RS\": \"\\\\d{18}\",\n      \"SK\": \"\\\\d{20}\",\n      \"SI\": \"\\\\d{15}\",\n      \"ES\": \"\\\\d{20}\",\n      \"SE\": \"\\\\d{20}\",\n      \"CH\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n      \"TN\": \"\\\\d{20}\",\n      \"TR\": \"\\\\d{5}[\\\\dA-Z]{17}\",\n      \"AE\": \"\\\\d{3}\\\\d{16}\",\n      \"GB\": \"[A-Z]{4}\\\\d{14}\",\n      \"VG\": \"[\\\\dA-Z]{4}\\\\d{16}\"\n    };\n    bbanpattern = bbancountrypatterns[countrycode]; // As new countries will start using IBAN in the\n    // future, we only check if the countrycode is known.\n    // This prevents false negatives, while almost all\n    // false positives introduced by this, will be caught\n    // by the checksum validation below anyway.\n    // Strict checking should return FALSE for unknown\n    // countries.\n\n    if (typeof bbanpattern !== \"undefined\") {\n      ibanregexp = new RegExp(\"^[A-Z]{2}\\\\d{2}\" + bbanpattern + \"$\", \"\");\n\n      if (!ibanregexp.test(iban)) {\n        return false; // Invalid country specific format\n      }\n    } // Now check the checksum, first convert to digits\n\n\n    ibancheck = iban.substring(4, iban.length) + iban.substring(0, 4);\n\n    for (i = 0; i < ibancheck.length; i++) {\n      charAt = ibancheck.charAt(i);\n\n      if (charAt !== \"0\") {\n        leadingZeroes = false;\n      }\n\n      if (!leadingZeroes) {\n        ibancheckdigits += \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\".indexOf(charAt);\n      }\n    } // Calculate the result of: ibancheckdigits % 97\n\n\n    for (p = 0; p < ibancheckdigits.length; p++) {\n      cChar = ibancheckdigits.charAt(p);\n      cOperator = \"\" + cRest + \"\" + cChar;\n      cRest = cOperator % 97;\n    }\n\n    return cRest === 1;\n  }, \"Please specify a valid IBAN.\");\n  $.validator.addMethod(\"integer\", function (value, element) {\n    return this.optional(element) || /^-?\\d+$/.test(value);\n  }, \"A positive or negative non-decimal number please.\");\n  $.validator.addMethod(\"ipv4\", function (value, element) {\n    return this.optional(element) || /^(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/i.test(value);\n  }, \"Please enter a valid IP v4 address.\");\n  $.validator.addMethod(\"ipv6\", function (value, element) {\n    return this.optional(element) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);\n  }, \"Please enter a valid IP v6 address.\");\n  $.validator.addMethod(\"lessThan\", function (value, element, param) {\n    var target = $(param);\n\n    if (this.settings.onfocusout && target.not(\".validate-lessThan-blur\").length) {\n      target.addClass(\"validate-lessThan-blur\").on(\"blur.validate-lessThan\", function () {\n        $(element).valid();\n      });\n    }\n\n    return value < target.val();\n  }, \"Please enter a lesser value.\");\n  $.validator.addMethod(\"lessThanEqual\", function (value, element, param) {\n    var target = $(param);\n\n    if (this.settings.onfocusout && target.not(\".validate-lessThanEqual-blur\").length) {\n      target.addClass(\"validate-lessThanEqual-blur\").on(\"blur.validate-lessThanEqual\", function () {\n        $(element).valid();\n      });\n    }\n\n    return value <= target.val();\n  }, \"Please enter a lesser value.\");\n  $.validator.addMethod(\"lettersonly\", function (value, element) {\n    return this.optional(element) || /^[a-z]+$/i.test(value);\n  }, \"Letters only please.\");\n  $.validator.addMethod(\"letterswithbasicpunc\", function (value, element) {\n    return this.optional(element) || /^[a-z\\-.,()'\"\\s]+$/i.test(value);\n  }, \"Letters or punctuation only please.\"); // Limit the number of files in a FileList.\n\n  $.validator.addMethod(\"maxfiles\", function (value, element, param) {\n    if (this.optional(element)) {\n      return true;\n    }\n\n    if ($(element).attr(\"type\") === \"file\") {\n      if (element.files && element.files.length > param) {\n        return false;\n      }\n    }\n\n    return true;\n  }, $.validator.format(\"Please select no more than {0} files.\")); // Limit the size of each individual file in a FileList.\n\n  $.validator.addMethod(\"maxsize\", function (value, element, param) {\n    if (this.optional(element)) {\n      return true;\n    }\n\n    if ($(element).attr(\"type\") === \"file\") {\n      if (element.files && element.files.length) {\n        for (var i = 0; i < element.files.length; i++) {\n          if (element.files[i].size > param) {\n            return false;\n          }\n        }\n      }\n    }\n\n    return true;\n  }, $.validator.format(\"File size must not exceed {0} bytes each.\")); // Limit the size of all files in a FileList.\n\n  $.validator.addMethod(\"maxsizetotal\", function (value, element, param) {\n    if (this.optional(element)) {\n      return true;\n    }\n\n    if ($(element).attr(\"type\") === \"file\") {\n      if (element.files && element.files.length) {\n        var totalSize = 0;\n\n        for (var i = 0; i < element.files.length; i++) {\n          totalSize += element.files[i].size;\n\n          if (totalSize > param) {\n            return false;\n          }\n        }\n      }\n    }\n\n    return true;\n  }, $.validator.format(\"Total size of all files must not exceed {0} bytes.\"));\n  $.validator.addMethod(\"mobileNL\", function (value, element) {\n    return this.optional(element) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)6((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test(value);\n  }, \"Please specify a valid mobile number.\");\n  $.validator.addMethod(\"mobileRU\", function (phone_number, element) {\n    var ruPhone_number = phone_number.replace(/\\(|\\)|\\s+|-/g, \"\");\n    return this.optional(element) || ruPhone_number.length > 9 && /^((\\+7|7|8)+([0-9]){10})$/.test(ruPhone_number);\n  }, \"Please specify a valid mobile number.\");\n  /* For UK phone functions, do the following server side processing:\n   * Compare original input with this RegEx pattern:\n   * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n   * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n   * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n   * A number of very detailed GB telephone number RegEx patterns can also be found at:\n   * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n   */\n\n  $.validator.addMethod(\"mobileUK\", function (phone_number, element) {\n    phone_number = phone_number.replace(/\\(|\\)|\\s+|-/g, \"\");\n    return this.optional(element) || phone_number.length > 9 && phone_number.match(/^(?:(?:(?:00\\s?|\\+)44\\s?|0)7(?:[1345789]\\d{2}|624)\\s?\\d{3}\\s?\\d{3})$/);\n  }, \"Please specify a valid mobile number.\");\n  $.validator.addMethod(\"netmask\", function (value, element) {\n    return this.optional(element) || /^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(254|252|248|240|224|192|128|0)/i.test(value);\n  }, \"Please enter a valid netmask.\");\n  /*\n   * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish\n   * authorities to any foreigner.\n   *\n   * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal\n   * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to\n   * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.\n   */\n\n  $.validator.addMethod(\"nieES\", function (value, element) {\n    \"use strict\";\n\n    if (this.optional(element)) {\n      return true;\n    }\n\n    var nieRegEx = new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi);\n    var validChars = \"TRWAGMYFPDXBNJZSQVHLCKET\",\n        letter = value.substr(value.length - 1).toUpperCase(),\n        number;\n    value = value.toString().toUpperCase(); // Quick format test\n\n    if (value.length > 10 || value.length < 9 || !nieRegEx.test(value)) {\n      return false;\n    } // X means same number\n    // Y means number + 10000000\n    // Z means number + 20000000\n\n\n    value = value.replace(/^[X]/, \"0\").replace(/^[Y]/, \"1\").replace(/^[Z]/, \"2\");\n    number = value.length === 9 ? value.substr(0, 8) : value.substr(0, 9);\n    return validChars.charAt(parseInt(number, 10) % 23) === letter;\n  }, \"Please specify a valid NIE number.\");\n  /*\n   * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals\n   */\n\n  $.validator.addMethod(\"nifES\", function (value, element) {\n    \"use strict\";\n\n    if (this.optional(element)) {\n      return true;\n    }\n\n    value = value.toUpperCase(); // Basic format test\n\n    if (!value.match(\"((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)\")) {\n      return false;\n    } // Test NIF\n\n\n    if (/^[0-9]{8}[A-Z]{1}$/.test(value)) {\n      return \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt(value.substring(8, 0) % 23) === value.charAt(8);\n    } // Test specials NIF (starts with K, L or M)\n\n\n    if (/^[KLM]{1}/.test(value)) {\n      return value[8] === \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt(value.substring(8, 1) % 23);\n    }\n\n    return false;\n  }, \"Please specify a valid NIF number.\");\n  /*\n   * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies\n   */\n\n  $.validator.addMethod(\"nipPL\", function (value) {\n    \"use strict\";\n\n    value = value.replace(/[^0-9]/g, \"\");\n\n    if (value.length !== 10) {\n      return false;\n    }\n\n    var arrSteps = [6, 5, 7, 2, 3, 4, 5, 6, 7];\n    var intSum = 0;\n\n    for (var i = 0; i < 9; i++) {\n      intSum += arrSteps[i] * value[i];\n    }\n\n    var int2 = intSum % 11;\n    var intControlNr = int2 === 10 ? 0 : int2;\n    return intControlNr === parseInt(value[9], 10);\n  }, \"Please specify a valid NIP number.\");\n  /**\n   * Created for project jquery-validation.\n   * @Description Brazillian PIS or NIS number (Número de Identificação Social Pis ou Pasep) is the equivalent of a\n   * Brazilian tax registration number NIS of PIS numbers have 11 digits in total: 10 numbers followed by 1 check numbers\n   * that are being used for validation.\n   * @copyright (c) 21/08/2018 13:14, Cleiton da Silva Mendonça\n   * @author Cleiton da Silva Mendonça <cleiton.mendonca@gmail.com>\n   * @link http://gitlab.com/csmendonca Gitlab of Cleiton da Silva Mendonça\n   * @link http://github.com/csmendonca Github of Cleiton da Silva Mendonça\n   */\n\n  $.validator.addMethod(\"nisBR\", function (value) {\n    var number;\n    var cn;\n    var sum = 0;\n    var dv;\n    var count;\n    var multiplier; // Removing special characters from value\n\n    value = value.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\-|\\\\:;'<>,.\\/? ])+/g, \"\"); // Checking value to have 11 digits only\n\n    if (value.length !== 11) {\n      return false;\n    } //Get check number of value\n\n\n    cn = parseInt(value.substring(10, 11), 10); //Get number with 10 digits of the value\n\n    number = parseInt(value.substring(0, 10), 10);\n\n    for (count = 2; count < 12; count++) {\n      multiplier = count;\n\n      if (count === 10) {\n        multiplier = 2;\n      }\n\n      if (count === 11) {\n        multiplier = 3;\n      }\n\n      sum += number % 10 * multiplier;\n      number = parseInt(number / 10, 10);\n    }\n\n    dv = sum % 11;\n\n    if (dv > 1) {\n      dv = 11 - dv;\n    } else {\n      dv = 0;\n    }\n\n    if (cn === dv) {\n      return true;\n    } else {\n      return false;\n    }\n  }, \"Please specify a valid NIS/PIS number.\");\n  $.validator.addMethod(\"notEqualTo\", function (value, element, param) {\n    return this.optional(element) || !$.validator.methods.equalTo.call(this, value, element, param);\n  }, \"Please enter a different value, values must not be the same.\");\n  $.validator.addMethod(\"nowhitespace\", function (value, element) {\n    return this.optional(element) || /^\\S+$/i.test(value);\n  }, \"No white space please.\");\n  /**\n  * Return true if the field value matches the given format RegExp\n  *\n  * @example $.validator.methods.pattern(\"AR1004\",element,/^AR\\d{4}$/)\n  * @result true\n  *\n  * @example $.validator.methods.pattern(\"BR1004\",element,/^AR\\d{4}$/)\n  * @result false\n  *\n  * @name $.validator.methods.pattern\n  * @type Boolean\n  * @cat Plugins/Validate/Methods\n  */\n\n  $.validator.addMethod(\"pattern\", function (value, element, param) {\n    if (this.optional(element)) {\n      return true;\n    }\n\n    if (typeof param === \"string\") {\n      param = new RegExp(\"^(?:\" + param + \")$\");\n    }\n\n    return param.test(value);\n  }, \"Invalid format.\");\n  /**\n   * Dutch phone numbers have 10 digits (or 11 and start with +31).\n   */\n\n  $.validator.addMethod(\"phoneNL\", function (value, element) {\n    return this.optional(element) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)[1-9]((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test(value);\n  }, \"Please specify a valid phone number.\");\n  /**\n   * Polish telephone numbers have 9 digits.\n   *\n   * Mobile phone numbers starts with following digits:\n   * 45, 50, 51, 53, 57, 60, 66, 69, 72, 73, 78, 79, 88.\n   *\n   * Fixed-line numbers starts with area codes:\n   * 12, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, 29, 32, 33,\n   * 34, 41, 42, 43, 44, 46, 48, 52, 54, 55, 56, 58, 59, 61,\n   * 62, 63, 65, 67, 68, 71, 74, 75, 76, 77, 81, 82, 83, 84,\n   * 85, 86, 87, 89, 91, 94, 95.\n   *\n   * Ministry of National Defence numbers and VoIP numbers starts with 26 and 39.\n   *\n   * Excludes intelligent networks (premium rate, shared cost, free phone numbers).\n   *\n   * Poland National Numbering Plan http://www.itu.int/oth/T02020000A8/en\n   */\n\n  $.validator.addMethod(\"phonePL\", function (phone_number, element) {\n    phone_number = phone_number.replace(/\\s+/g, \"\");\n    var regexp = /^(?:(?:(?:\\+|00)?48)|(?:\\(\\+?48\\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\\d{7}$/;\n    return this.optional(element) || regexp.test(phone_number);\n  }, \"Please specify a valid phone number.\");\n  /* For UK phone functions, do the following server side processing:\n   * Compare original input with this RegEx pattern:\n   * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n   * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n   * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n   * A number of very detailed GB telephone number RegEx patterns can also be found at:\n   * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n   */\n  // Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers\n\n  $.validator.addMethod(\"phonesUK\", function (phone_number, element) {\n    phone_number = phone_number.replace(/\\(|\\)|\\s+|-/g, \"\");\n    return this.optional(element) || phone_number.length > 9 && phone_number.match(/^(?:(?:(?:00\\s?|\\+)44\\s?|0)(?:1\\d{8,9}|[23]\\d{9}|7(?:[1345789]\\d{8}|624\\d{6})))$/);\n  }, \"Please specify a valid uk phone number.\");\n  /* For UK phone functions, do the following server side processing:\n   * Compare original input with this RegEx pattern:\n   * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n   * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n   * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n   * A number of very detailed GB telephone number RegEx patterns can also be found at:\n   * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n   */\n\n  $.validator.addMethod(\"phoneUK\", function (phone_number, element) {\n    phone_number = phone_number.replace(/\\(|\\)|\\s+|-/g, \"\");\n    return this.optional(element) || phone_number.length > 9 && phone_number.match(/^(?:(?:(?:00\\s?|\\+)44\\s?)|(?:\\(?0))(?:\\d{2}\\)?\\s?\\d{4}\\s?\\d{4}|\\d{3}\\)?\\s?\\d{3}\\s?\\d{3,4}|\\d{4}\\)?\\s?(?:\\d{5}|\\d{3}\\s?\\d{3})|\\d{5}\\)?\\s?\\d{4,5})$/);\n  }, \"Please specify a valid phone number.\");\n  /**\n   * Matches US phone number format\n   *\n   * where the area code may not start with 1 and the prefix may not start with 1\n   * allows '-' or ' ' as a separator and allows parens around area code\n   * some people may want to put a '1' in front of their number\n   *\n   * 1(212)-999-2345 or\n   * 212 999 2344 or\n   * 212-999-0983\n   *\n   * but not\n   * 111-123-5434\n   * and not\n   * 212 123 4567\n   */\n\n  $.validator.addMethod(\"phoneUS\", function (phone_number, element) {\n    phone_number = phone_number.replace(/\\s+/g, \"\");\n    return this.optional(element) || phone_number.length > 9 && phone_number.match(/^(\\+?1-?)?(\\([2-9]([02-9]\\d|1[02-9])\\)|[2-9]([02-9]\\d|1[02-9]))-?[2-9]\\d{2}-?\\d{4}$/);\n  }, \"Please specify a valid phone number.\");\n  /*\n  * Valida CEPs do brasileiros:\n  *\n  * Formatos aceitos:\n  * 99999-999\n  * 99.999-999\n  * 99999999\n  */\n\n  $.validator.addMethod(\"postalcodeBR\", function (cep_value, element) {\n    return this.optional(element) || /^\\d{2}.\\d{3}-\\d{3}?$|^\\d{5}-?\\d{3}?$/.test(cep_value);\n  }, \"Informe um CEP válido.\");\n  /**\n   * Matches a valid Canadian Postal Code\n   *\n   * @example jQuery.validator.methods.postalCodeCA( \"H0H 0H0\", element )\n   * @result true\n   *\n   * @example jQuery.validator.methods.postalCodeCA( \"H0H0H0\", element )\n   * @result false\n   *\n   * @name jQuery.validator.methods.postalCodeCA\n   * @type Boolean\n   * @cat Plugins/Validate/Methods\n   */\n\n  $.validator.addMethod(\"postalCodeCA\", function (value, element) {\n    return this.optional(element) || /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ] *\\d[ABCEGHJKLMNPRSTVWXYZ]\\d$/i.test(value);\n  }, \"Please specify a valid postal code.\");\n  /* Matches Italian postcode (CAP) */\n\n  $.validator.addMethod(\"postalcodeIT\", function (value, element) {\n    return this.optional(element) || /^\\d{5}$/.test(value);\n  }, \"Please specify a valid postal code.\");\n  $.validator.addMethod(\"postalcodeNL\", function (value, element) {\n    return this.optional(element) || /^[1-9][0-9]{3}\\s?[a-zA-Z]{2}$/.test(value);\n  }, \"Please specify a valid postal code.\"); // Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)\n\n  $.validator.addMethod(\"postcodeUK\", function (value, element) {\n    return this.optional(element) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\\s?(0AA))$/i.test(value);\n  }, \"Please specify a valid UK postcode.\");\n  /*\n   * Lets you say \"at least X inputs that match selector Y must be filled.\"\n   *\n   * The end result is that neither of these inputs:\n   *\n   *\t<input class=\"productinfo\" name=\"partnumber\">\n   *\t<input class=\"productinfo\" name=\"description\">\n   *\n   *\t...will validate unless at least one of them is filled.\n   *\n   * partnumber:\t{require_from_group: [1,\".productinfo\"]},\n   * description: {require_from_group: [1,\".productinfo\"]}\n   *\n   * options[0]: number of fields that must be filled in the group\n   * options[1]: CSS selector that defines the group of conditionally required fields\n   */\n\n  $.validator.addMethod(\"require_from_group\", function (value, element, options) {\n    var $fields = $(options[1], element.form),\n        $fieldsFirst = $fields.eq(0),\n        validator = $fieldsFirst.data(\"valid_req_grp\") ? $fieldsFirst.data(\"valid_req_grp\") : $.extend({}, this),\n        isValid = $fields.filter(function () {\n      return validator.elementValue(this);\n    }).length >= options[0]; // Store the cloned validator for future validation\n\n    $fieldsFirst.data(\"valid_req_grp\", validator); // If element isn't being validated, run each require_from_group field's validation rules\n\n    if (!$(element).data(\"being_validated\")) {\n      $fields.data(\"being_validated\", true);\n      $fields.each(function () {\n        validator.element(this);\n      });\n      $fields.data(\"being_validated\", false);\n    }\n\n    return isValid;\n  }, $.validator.format(\"Please fill at least {0} of these fields.\"));\n  /*\n   * Lets you say \"either at least X inputs that match selector Y must be filled,\n   * OR they must all be skipped (left blank).\"\n   *\n   * The end result, is that none of these inputs:\n   *\n   *\t<input class=\"productinfo\" name=\"partnumber\">\n   *\t<input class=\"productinfo\" name=\"description\">\n   *\t<input class=\"productinfo\" name=\"color\">\n   *\n   *\t...will validate unless either at least two of them are filled,\n   *\tOR none of them are.\n   *\n   * partnumber:\t{skip_or_fill_minimum: [2,\".productinfo\"]},\n   * description: {skip_or_fill_minimum: [2,\".productinfo\"]},\n   * color:\t\t{skip_or_fill_minimum: [2,\".productinfo\"]}\n   *\n   * options[0]: number of fields that must be filled in the group\n   * options[1]: CSS selector that defines the group of conditionally required fields\n   *\n   */\n\n  $.validator.addMethod(\"skip_or_fill_minimum\", function (value, element, options) {\n    var $fields = $(options[1], element.form),\n        $fieldsFirst = $fields.eq(0),\n        validator = $fieldsFirst.data(\"valid_skip\") ? $fieldsFirst.data(\"valid_skip\") : $.extend({}, this),\n        numberFilled = $fields.filter(function () {\n      return validator.elementValue(this);\n    }).length,\n        isValid = numberFilled === 0 || numberFilled >= options[0]; // Store the cloned validator for future validation\n\n    $fieldsFirst.data(\"valid_skip\", validator); // If element isn't being validated, run each skip_or_fill_minimum field's validation rules\n\n    if (!$(element).data(\"being_validated\")) {\n      $fields.data(\"being_validated\", true);\n      $fields.each(function () {\n        validator.element(this);\n      });\n      $fields.data(\"being_validated\", false);\n    }\n\n    return isValid;\n  }, $.validator.format(\"Please either skip these fields or fill at least {0} of them.\"));\n  /* Validates US States and/or Territories by @jdforsythe\n   * Can be case insensitive or require capitalization - default is case insensitive\n   * Can include US Territories or not - default does not\n   * Can include US Military postal abbreviations (AA, AE, AP) - default does not\n   *\n   * Note: \"States\" always includes DC (District of Colombia)\n   *\n   * Usage examples:\n   *\n   *  This is the default - case insensitive, no territories, no military zones\n   *  stateInput: {\n   *     caseSensitive: false,\n   *     includeTerritories: false,\n   *     includeMilitary: false\n   *  }\n   *\n   *  Only allow capital letters, no territories, no military zones\n   *  stateInput: {\n   *     caseSensitive: false\n   *  }\n   *\n   *  Case insensitive, include territories but not military zones\n   *  stateInput: {\n   *     includeTerritories: true\n   *  }\n   *\n   *  Only allow capital letters, include territories and military zones\n   *  stateInput: {\n   *     caseSensitive: true,\n   *     includeTerritories: true,\n   *     includeMilitary: true\n   *  }\n   *\n   */\n\n  $.validator.addMethod(\"stateUS\", function (value, element, options) {\n    var isDefault = typeof options === \"undefined\",\n        caseSensitive = isDefault || typeof options.caseSensitive === \"undefined\" ? false : options.caseSensitive,\n        includeTerritories = isDefault || typeof options.includeTerritories === \"undefined\" ? false : options.includeTerritories,\n        includeMilitary = isDefault || typeof options.includeMilitary === \"undefined\" ? false : options.includeMilitary,\n        regex;\n\n    if (!includeTerritories && !includeMilitary) {\n      regex = \"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n    } else if (includeTerritories && includeMilitary) {\n      regex = \"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n    } else if (includeTerritories) {\n      regex = \"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n    } else {\n      regex = \"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n    }\n\n    regex = caseSensitive ? new RegExp(regex) : new RegExp(regex, \"i\");\n    return this.optional(element) || regex.test(value);\n  }, \"Please specify a valid state.\"); // TODO check if value starts with <, otherwise don't try stripping anything\n\n  $.validator.addMethod(\"strippedminlength\", function (value, element, param) {\n    return $(value).text().length >= param;\n  }, $.validator.format(\"Please enter at least {0} characters.\"));\n  $.validator.addMethod(\"time\", function (value, element) {\n    return this.optional(element) || /^([01]\\d|2[0-3]|[0-9])(:[0-5]\\d){1,2}$/.test(value);\n  }, \"Please enter a valid time, between 00:00 and 23:59.\");\n  $.validator.addMethod(\"time12h\", function (value, element) {\n    return this.optional(element) || /^((0?[1-9]|1[012])(:[0-5]\\d){1,2}(\\ ?[AP]M))$/i.test(value);\n  }, \"Please enter a valid time in 12-hour am/pm format.\"); // Same as url, but TLD is optional\n\n  $.validator.addMethod(\"url2\", function (value, element) {\n    return this.optional(element) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?)|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff])|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62}\\.)))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test(value);\n  }, $.validator.messages.url);\n  /**\n   * Return true, if the value is a valid vehicle identification number (VIN).\n   *\n   * Works with all kind of text inputs.\n   *\n   * @example <input type=\"text\" size=\"20\" name=\"VehicleID\" class=\"{required:true,vinUS:true}\" />\n   * @desc Declares a required input element whose value must be a valid vehicle identification number.\n   *\n   * @name $.validator.methods.vinUS\n   * @type Boolean\n   * @cat Plugins/Validate/Methods\n   */\n\n  $.validator.addMethod(\"vinUS\", function (v) {\n    if (v.length !== 17) {\n      return false;\n    }\n\n    var LL = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"J\", \"K\", \"L\", \"M\", \"N\", \"P\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"],\n        VL = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9],\n        FL = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2],\n        rs = 0,\n        i,\n        n,\n        d,\n        f,\n        cd,\n        cdv;\n\n    for (i = 0; i < 17; i++) {\n      f = FL[i];\n      d = v.slice(i, i + 1);\n\n      if (i === 8) {\n        cdv = d;\n      }\n\n      if (!isNaN(d)) {\n        d *= f;\n      } else {\n        for (n = 0; n < LL.length; n++) {\n          if (d.toUpperCase() === LL[n]) {\n            d = VL[n];\n            d *= f;\n\n            if (isNaN(cdv) && n === 8) {\n              cdv = LL[n];\n            }\n\n            break;\n          }\n        }\n      }\n\n      rs += d;\n    }\n\n    cd = rs % 11;\n\n    if (cd === 10) {\n      cd = \"X\";\n    }\n\n    if (cd === cdv) {\n      return true;\n    }\n\n    return false;\n  }, \"The specified vehicle identification number (VIN) is invalid.\");\n  $.validator.addMethod(\"zipcodeUS\", function (value, element) {\n    return this.optional(element) || /^\\d{5}(-\\d{4})?$/.test(value);\n  }, \"The specified US ZIP Code is invalid.\");\n  $.validator.addMethod(\"ziprange\", function (value, element) {\n    return this.optional(element) || /^90[2-5]\\d\\{2\\}-\\d{4}$/.test(value);\n  }, \"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx.\");\n  return $;\n});\n\n//# sourceURL=webpack://rup/./node_modules/jquery-validation/dist/additional-methods.js?");

/***/ }),

/***/ "./node_modules/jquery-validation/dist/jquery.validate.js":
/*!****************************************************************!*\
  !*** ./node_modules/jquery-validation/dist/jquery.validate.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * jQuery Validation Plugin v1.19.5\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2022 Jörn Zaefferer\n * Released under the MIT license\n */\n(function (factory) {\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.extend($.fn, {\n    // https://jqueryvalidation.org/validate/\n    validate: function validate(options) {\n      // If nothing is selected, return nothing; can't chain anyway\n      if (!this.length) {\n        if (options && options.debug && window.console) {\n          console.warn(\"Nothing selected, can't validate, returning nothing.\");\n        }\n\n        return;\n      } // Check if a validator for this form was already created\n\n\n      var validator = $.data(this[0], \"validator\");\n\n      if (validator) {\n        return validator;\n      } // Add novalidate tag if HTML5.\n\n\n      this.attr(\"novalidate\", \"novalidate\");\n      validator = new $.validator(options, this[0]);\n      $.data(this[0], \"validator\", validator);\n\n      if (validator.settings.onsubmit) {\n        this.on(\"click.validate\", \":submit\", function (event) {\n          // Track the used submit button to properly handle scripted\n          // submits later.\n          validator.submitButton = event.currentTarget; // Allow suppressing validation by adding a cancel class to the submit button\n\n          if ($(this).hasClass(\"cancel\")) {\n            validator.cancelSubmit = true;\n          } // Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\n\n          if ($(this).attr(\"formnovalidate\") !== undefined) {\n            validator.cancelSubmit = true;\n          }\n        }); // Validate the form on submit\n\n        this.on(\"submit.validate\", function (event) {\n          if (validator.settings.debug) {\n            // Prevent form submit to be able to see console output\n            event.preventDefault();\n          }\n\n          function handle() {\n            var hidden, result; // Insert a hidden input as a replacement for the missing submit button\n            // The hidden input is inserted in two cases:\n            //   - A user defined a `submitHandler`\n            //   - There was a pending request due to `remote` method and `stopRequest()`\n            //     was called to submit the form in case it's valid\n\n            if (validator.submitButton && (validator.settings.submitHandler || validator.formSubmitted)) {\n              hidden = $(\"<input type='hidden'/>\").attr(\"name\", validator.submitButton.name).val($(validator.submitButton).val()).appendTo(validator.currentForm);\n            }\n\n            if (validator.settings.submitHandler && !validator.settings.debug) {\n              result = validator.settings.submitHandler.call(validator, validator.currentForm, event);\n\n              if (hidden) {\n                // And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n                hidden.remove();\n              }\n\n              if (result !== undefined) {\n                return result;\n              }\n\n              return false;\n            }\n\n            return true;\n          } // Prevent submit for invalid forms or custom submit handlers\n\n\n          if (validator.cancelSubmit) {\n            validator.cancelSubmit = false;\n            return handle();\n          }\n\n          if (validator.form()) {\n            if (validator.pendingRequest) {\n              validator.formSubmitted = true;\n              return false;\n            }\n\n            return handle();\n          } else {\n            validator.focusInvalid();\n            return false;\n          }\n        });\n      }\n\n      return validator;\n    },\n    // https://jqueryvalidation.org/valid/\n    valid: function valid() {\n      var valid, validator, errorList;\n\n      if ($(this[0]).is(\"form\")) {\n        valid = this.validate().form();\n      } else {\n        errorList = [];\n        valid = true;\n        validator = $(this[0].form).validate();\n        this.each(function () {\n          valid = validator.element(this) && valid;\n\n          if (!valid) {\n            errorList = errorList.concat(validator.errorList);\n          }\n        });\n        validator.errorList = errorList;\n      }\n\n      return valid;\n    },\n    // https://jqueryvalidation.org/rules/\n    rules: function rules(command, argument) {\n      var element = this[0],\n          isContentEditable = typeof this.attr(\"contenteditable\") !== \"undefined\" && this.attr(\"contenteditable\") !== \"false\",\n          settings,\n          staticRules,\n          existingRules,\n          data,\n          param,\n          filtered; // If nothing is selected, return empty object; can't chain anyway\n\n      if (element == null) {\n        return;\n      }\n\n      if (!element.form && isContentEditable) {\n        element.form = this.closest(\"form\")[0];\n        element.name = this.attr(\"name\");\n      }\n\n      if (element.form == null) {\n        return;\n      }\n\n      if (command) {\n        settings = $.data(element.form, \"validator\").settings;\n        staticRules = settings.rules;\n        existingRules = $.validator.staticRules(element);\n\n        switch (command) {\n          case \"add\":\n            $.extend(existingRules, $.validator.normalizeRule(argument)); // Remove messages from rules, but allow them to be set separately\n\n            delete existingRules.messages;\n            staticRules[element.name] = existingRules;\n\n            if (argument.messages) {\n              settings.messages[element.name] = $.extend(settings.messages[element.name], argument.messages);\n            }\n\n            break;\n\n          case \"remove\":\n            if (!argument) {\n              delete staticRules[element.name];\n              return existingRules;\n            }\n\n            filtered = {};\n            $.each(argument.split(/\\s/), function (index, method) {\n              filtered[method] = existingRules[method];\n              delete existingRules[method];\n            });\n            return filtered;\n        }\n      }\n\n      data = $.validator.normalizeRules($.extend({}, $.validator.classRules(element), $.validator.attributeRules(element), $.validator.dataRules(element), $.validator.staticRules(element)), element); // Make sure required is at front\n\n      if (data.required) {\n        param = data.required;\n        delete data.required;\n        data = $.extend({\n          required: param\n        }, data);\n      } // Make sure remote is at back\n\n\n      if (data.remote) {\n        param = data.remote;\n        delete data.remote;\n        data = $.extend(data, {\n          remote: param\n        });\n      }\n\n      return data;\n    }\n  }); // JQuery trim is deprecated, provide a trim method based on String.prototype.trim\n\n  var trim = function trim(str) {\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill\n    return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\n  }; // Custom selectors\n\n\n  $.extend($.expr.pseudos || $.expr[\":\"], {\n    // '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n    // https://jqueryvalidation.org/blank-selector/\n    blank: function blank(a) {\n      return !trim(\"\" + $(a).val());\n    },\n    // https://jqueryvalidation.org/filled-selector/\n    filled: function filled(a) {\n      var val = $(a).val();\n      return val !== null && !!trim(\"\" + val);\n    },\n    // https://jqueryvalidation.org/unchecked-selector/\n    unchecked: function unchecked(a) {\n      return !$(a).prop(\"checked\");\n    }\n  }); // Constructor for validator\n\n  $.validator = function (options, form) {\n    this.settings = $.extend(true, {}, $.validator.defaults, options);\n    this.currentForm = form;\n    this.init();\n  }; // https://jqueryvalidation.org/jQuery.validator.format/\n\n\n  $.validator.format = function (source, params) {\n    if (arguments.length === 1) {\n      return function () {\n        var args = $.makeArray(arguments);\n        args.unshift(source);\n        return $.validator.format.apply(this, args);\n      };\n    }\n\n    if (params === undefined) {\n      return source;\n    }\n\n    if (arguments.length > 2 && params.constructor !== Array) {\n      params = $.makeArray(arguments).slice(1);\n    }\n\n    if (params.constructor !== Array) {\n      params = [params];\n    }\n\n    $.each(params, function (i, n) {\n      source = source.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"g\"), function () {\n        return n;\n      });\n    });\n    return source;\n  };\n\n  $.extend($.validator, {\n    defaults: {\n      messages: {},\n      groups: {},\n      rules: {},\n      errorClass: \"error\",\n      pendingClass: \"pending\",\n      validClass: \"valid\",\n      errorElement: \"label\",\n      focusCleanup: false,\n      focusInvalid: true,\n      errorContainer: $([]),\n      errorLabelContainer: $([]),\n      onsubmit: true,\n      ignore: \":hidden\",\n      ignoreTitle: false,\n      onfocusin: function onfocusin(element) {\n        this.lastActive = element; // Hide error label and remove error class on focus if enabled\n\n        if (this.settings.focusCleanup) {\n          if (this.settings.unhighlight) {\n            this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass);\n          }\n\n          this.hideThese(this.errorsFor(element));\n        }\n      },\n      onfocusout: function onfocusout(element) {\n        if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {\n          this.element(element);\n        }\n      },\n      onkeyup: function onkeyup(element, event) {\n        // Avoid revalidate the field when pressing one of the following keys\n        // Shift       => 16\n        // Ctrl        => 17\n        // Alt         => 18\n        // Caps lock   => 20\n        // End         => 35\n        // Home        => 36\n        // Left arrow  => 37\n        // Up arrow    => 38\n        // Right arrow => 39\n        // Down arrow  => 40\n        // Insert      => 45\n        // Num lock    => 144\n        // AltGr key   => 225\n        var excludedKeys = [16, 17, 18, 20, 35, 36, 37, 38, 39, 40, 45, 144, 225];\n\n        if (event.which === 9 && this.elementValue(element) === \"\" || $.inArray(event.keyCode, excludedKeys) !== -1) {\n          return;\n        } else if (element.name in this.submitted || element.name in this.invalid) {\n          this.element(element);\n        }\n      },\n      onclick: function onclick(element) {\n        // Click on selects, radiobuttons and checkboxes\n        if (element.name in this.submitted) {\n          this.element(element); // Or option elements, check parent select in that case\n        } else if (element.parentNode.name in this.submitted) {\n          this.element(element.parentNode);\n        }\n      },\n      highlight: function highlight(element, errorClass, validClass) {\n        if (element.type === \"radio\") {\n          this.findByName(element.name).addClass(errorClass).removeClass(validClass);\n        } else {\n          $(element).addClass(errorClass).removeClass(validClass);\n        }\n      },\n      unhighlight: function unhighlight(element, errorClass, validClass) {\n        if (element.type === \"radio\") {\n          this.findByName(element.name).removeClass(errorClass).addClass(validClass);\n        } else {\n          $(element).removeClass(errorClass).addClass(validClass);\n        }\n      }\n    },\n    // https://jqueryvalidation.org/jQuery.validator.setDefaults/\n    setDefaults: function setDefaults(settings) {\n      $.extend($.validator.defaults, settings);\n    },\n    messages: {\n      required: \"This field is required.\",\n      remote: \"Please fix this field.\",\n      email: \"Please enter a valid email address.\",\n      url: \"Please enter a valid URL.\",\n      date: \"Please enter a valid date.\",\n      dateISO: \"Please enter a valid date (ISO).\",\n      number: \"Please enter a valid number.\",\n      digits: \"Please enter only digits.\",\n      equalTo: \"Please enter the same value again.\",\n      maxlength: $.validator.format(\"Please enter no more than {0} characters.\"),\n      minlength: $.validator.format(\"Please enter at least {0} characters.\"),\n      rangelength: $.validator.format(\"Please enter a value between {0} and {1} characters long.\"),\n      range: $.validator.format(\"Please enter a value between {0} and {1}.\"),\n      max: $.validator.format(\"Please enter a value less than or equal to {0}.\"),\n      min: $.validator.format(\"Please enter a value greater than or equal to {0}.\"),\n      step: $.validator.format(\"Please enter a multiple of {0}.\")\n    },\n    autoCreateRanges: false,\n    prototype: {\n      init: function init() {\n        this.labelContainer = $(this.settings.errorLabelContainer);\n        this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);\n        this.containers = $(this.settings.errorContainer).add(this.settings.errorLabelContainer);\n        this.submitted = {};\n        this.valueCache = {};\n        this.pendingRequest = 0;\n        this.pending = {};\n        this.invalid = {};\n        this.reset();\n        var currentForm = this.currentForm,\n            groups = this.groups = {},\n            rules;\n        $.each(this.settings.groups, function (key, value) {\n          if (typeof value === \"string\") {\n            value = value.split(/\\s/);\n          }\n\n          $.each(value, function (index, name) {\n            groups[name] = key;\n          });\n        });\n        rules = this.settings.rules;\n        $.each(rules, function (key, value) {\n          rules[key] = $.validator.normalizeRule(value);\n        });\n\n        function delegate(event) {\n          var isContentEditable = typeof $(this).attr(\"contenteditable\") !== \"undefined\" && $(this).attr(\"contenteditable\") !== \"false\"; // Set form expando on contenteditable\n\n          if (!this.form && isContentEditable) {\n            this.form = $(this).closest(\"form\")[0];\n            this.name = $(this).attr(\"name\");\n          } // Ignore the element if it belongs to another form. This will happen mainly\n          // when setting the `form` attribute of an input to the id of another form.\n\n\n          if (currentForm !== this.form) {\n            return;\n          }\n\n          var validator = $.data(this.form, \"validator\"),\n              eventType = \"on\" + event.type.replace(/^validate/, \"\"),\n              settings = validator.settings;\n\n          if (settings[eventType] && !$(this).is(settings.ignore)) {\n            settings[eventType].call(validator, this, event);\n          }\n        }\n\n        $(this.currentForm).on(\"focusin.validate focusout.validate keyup.validate\", \":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" + \"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" + \"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" + \"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate) // Support: Chrome, oldIE\n        // \"select\" is provided as event.target when clicking a option\n        .on(\"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate);\n\n        if (this.settings.invalidHandler) {\n          $(this.currentForm).on(\"invalid-form.validate\", this.settings.invalidHandler);\n        }\n      },\n      // https://jqueryvalidation.org/Validator.form/\n      form: function form() {\n        this.checkForm();\n        $.extend(this.submitted, this.errorMap);\n        this.invalid = $.extend({}, this.errorMap);\n\n        if (!this.valid()) {\n          $(this.currentForm).triggerHandler(\"invalid-form\", [this]);\n        }\n\n        this.showErrors();\n        return this.valid();\n      },\n      checkForm: function checkForm() {\n        this.prepareForm();\n\n        for (var i = 0, elements = this.currentElements = this.elements(); elements[i]; i++) {\n          this.check(elements[i]);\n        }\n\n        return this.valid();\n      },\n      // https://jqueryvalidation.org/Validator.element/\n      element: function element(_element) {\n        var cleanElement = this.clean(_element),\n            checkElement = this.validationTargetFor(cleanElement),\n            v = this,\n            result = true,\n            rs,\n            group;\n\n        if (checkElement === undefined) {\n          delete this.invalid[cleanElement.name];\n        } else {\n          this.prepareElement(checkElement);\n          this.currentElements = $(checkElement); // If this element is grouped, then validate all group elements already\n          // containing a value\n\n          group = this.groups[checkElement.name];\n\n          if (group) {\n            $.each(this.groups, function (name, testgroup) {\n              if (testgroup === group && name !== checkElement.name) {\n                cleanElement = v.validationTargetFor(v.clean(v.findByName(name)));\n\n                if (cleanElement && cleanElement.name in v.invalid) {\n                  v.currentElements.push(cleanElement);\n                  result = v.check(cleanElement) && result;\n                }\n              }\n            });\n          }\n\n          rs = this.check(checkElement) !== false;\n          result = result && rs;\n\n          if (rs) {\n            this.invalid[checkElement.name] = false;\n          } else {\n            this.invalid[checkElement.name] = true;\n          }\n\n          if (!this.numberOfInvalids()) {\n            // Hide error containers on last error\n            this.toHide = this.toHide.add(this.containers);\n          }\n\n          this.showErrors(); // Add aria-invalid status for screen readers\n\n          $(_element).attr(\"aria-invalid\", !rs);\n        }\n\n        return result;\n      },\n      // https://jqueryvalidation.org/Validator.showErrors/\n      showErrors: function showErrors(errors) {\n        if (errors) {\n          var validator = this; // Add items to error list and map\n\n          $.extend(this.errorMap, errors);\n          this.errorList = $.map(this.errorMap, function (message, name) {\n            return {\n              message: message,\n              element: validator.findByName(name)[0]\n            };\n          }); // Remove items from success list\n\n          this.successList = $.grep(this.successList, function (element) {\n            return !(element.name in errors);\n          });\n        }\n\n        if (this.settings.showErrors) {\n          this.settings.showErrors.call(this, this.errorMap, this.errorList);\n        } else {\n          this.defaultShowErrors();\n        }\n      },\n      // https://jqueryvalidation.org/Validator.resetForm/\n      resetForm: function resetForm() {\n        if ($.fn.resetForm) {\n          $(this.currentForm).resetForm();\n        }\n\n        this.invalid = {};\n        this.submitted = {};\n        this.prepareForm();\n        this.hideErrors();\n        var elements = this.elements().removeData(\"previousValue\").removeAttr(\"aria-invalid\");\n        this.resetElements(elements);\n      },\n      resetElements: function resetElements(elements) {\n        var i;\n\n        if (this.settings.unhighlight) {\n          for (i = 0; elements[i]; i++) {\n            this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, \"\");\n            this.findByName(elements[i].name).removeClass(this.settings.validClass);\n          }\n        } else {\n          elements.removeClass(this.settings.errorClass).removeClass(this.settings.validClass);\n        }\n      },\n      numberOfInvalids: function numberOfInvalids() {\n        return this.objectLength(this.invalid);\n      },\n      objectLength: function objectLength(obj) {\n        /* jshint unused: false */\n        var count = 0,\n            i;\n\n        for (i in obj) {\n          // This check allows counting elements with empty error\n          // message as invalid elements\n          if (obj[i] !== undefined && obj[i] !== null && obj[i] !== false) {\n            count++;\n          }\n        }\n\n        return count;\n      },\n      hideErrors: function hideErrors() {\n        this.hideThese(this.toHide);\n      },\n      hideThese: function hideThese(errors) {\n        errors.not(this.containers).text(\"\");\n        this.addWrapper(errors).hide();\n      },\n      valid: function valid() {\n        return this.size() === 0;\n      },\n      size: function size() {\n        return this.errorList.length;\n      },\n      focusInvalid: function focusInvalid() {\n        if (this.settings.focusInvalid) {\n          try {\n            $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(\":visible\").trigger(\"focus\") // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n            .trigger(\"focusin\");\n          } catch (e) {// Ignore IE throwing errors when focusing hidden elements\n          }\n        }\n      },\n      findLastActive: function findLastActive() {\n        var lastActive = this.lastActive;\n        return lastActive && $.grep(this.errorList, function (n) {\n          return n.element.name === lastActive.name;\n        }).length === 1 && lastActive;\n      },\n      elements: function elements() {\n        var validator = this,\n            rulesCache = {}; // Select all valid inputs inside the form (no submit or reset buttons)\n\n        return $(this.currentForm).find(\"input, select, textarea, [contenteditable]\").not(\":submit, :reset, :image, :disabled\").not(this.settings.ignore).filter(function () {\n          var name = this.name || $(this).attr(\"name\"); // For contenteditable\n\n          var isContentEditable = typeof $(this).attr(\"contenteditable\") !== \"undefined\" && $(this).attr(\"contenteditable\") !== \"false\";\n\n          if (!name && validator.settings.debug && window.console) {\n            console.error(\"%o has no name assigned\", this);\n          } // Set form expando on contenteditable\n\n\n          if (isContentEditable) {\n            this.form = $(this).closest(\"form\")[0];\n            this.name = name;\n          } // Ignore elements that belong to other/nested forms\n\n\n          if (this.form !== validator.currentForm) {\n            return false;\n          } // Select only the first element for each name, and only those with rules specified\n\n\n          if (name in rulesCache || !validator.objectLength($(this).rules())) {\n            return false;\n          }\n\n          rulesCache[name] = true;\n          return true;\n        });\n      },\n      clean: function clean(selector) {\n        return $(selector)[0];\n      },\n      errors: function errors() {\n        var errorClass = this.settings.errorClass.split(\" \").join(\".\");\n        return $(this.settings.errorElement + \".\" + errorClass, this.errorContext);\n      },\n      resetInternals: function resetInternals() {\n        this.successList = [];\n        this.errorList = [];\n        this.errorMap = {};\n        this.toShow = $([]);\n        this.toHide = $([]);\n      },\n      reset: function reset() {\n        this.resetInternals();\n        this.currentElements = $([]);\n      },\n      prepareForm: function prepareForm() {\n        this.reset();\n        this.toHide = this.errors().add(this.containers);\n      },\n      prepareElement: function prepareElement(element) {\n        this.reset();\n        this.toHide = this.errorsFor(element);\n      },\n      elementValue: function elementValue(element) {\n        var $element = $(element),\n            type = element.type,\n            isContentEditable = typeof $element.attr(\"contenteditable\") !== \"undefined\" && $element.attr(\"contenteditable\") !== \"false\",\n            val,\n            idx;\n\n        if (type === \"radio\" || type === \"checkbox\") {\n          return this.findByName(element.name).filter(\":checked\").val();\n        } else if (type === \"number\" && typeof element.validity !== \"undefined\") {\n          return element.validity.badInput ? \"NaN\" : $element.val();\n        }\n\n        if (isContentEditable) {\n          val = $element.text();\n        } else {\n          val = $element.val();\n        }\n\n        if (type === \"file\") {\n          // Modern browser (chrome & safari)\n          if (val.substr(0, 12) === \"C:\\\\fakepath\\\\\") {\n            return val.substr(12);\n          } // Legacy browsers\n          // Unix-based path\n\n\n          idx = val.lastIndexOf(\"/\");\n\n          if (idx >= 0) {\n            return val.substr(idx + 1);\n          } // Windows-based path\n\n\n          idx = val.lastIndexOf(\"\\\\\");\n\n          if (idx >= 0) {\n            return val.substr(idx + 1);\n          } // Just the file name\n\n\n          return val;\n        }\n\n        if (typeof val === \"string\") {\n          return val.replace(/\\r/g, \"\");\n        }\n\n        return val;\n      },\n      check: function check(element) {\n        element = this.validationTargetFor(this.clean(element));\n        var rules = $(element).rules(),\n            rulesCount = $.map(rules, function (n, i) {\n          return i;\n        }).length,\n            dependencyMismatch = false,\n            val = this.elementValue(element),\n            result,\n            method,\n            rule,\n            normalizer; // Prioritize the local normalizer defined for this element over the global one\n        // if the former exists, otherwise user the global one in case it exists.\n\n        if (typeof rules.normalizer === \"function\") {\n          normalizer = rules.normalizer;\n        } else if (typeof this.settings.normalizer === \"function\") {\n          normalizer = this.settings.normalizer;\n        } // If normalizer is defined, then call it to retreive the changed value instead\n        // of using the real one.\n        // Note that `this` in the normalizer is `element`.\n\n\n        if (normalizer) {\n          val = normalizer.call(element, val); // Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\n          delete rules.normalizer;\n        }\n\n        for (method in rules) {\n          rule = {\n            method: method,\n            parameters: rules[method]\n          };\n\n          try {\n            result = $.validator.methods[method].call(this, val, element, rule.parameters); // If a method indicates that the field is optional and therefore valid,\n            // don't mark it as valid when there are no other rules\n\n            if (result === \"dependency-mismatch\" && rulesCount === 1) {\n              dependencyMismatch = true;\n              continue;\n            }\n\n            dependencyMismatch = false;\n\n            if (result === \"pending\") {\n              this.toHide = this.toHide.not(this.errorsFor(element));\n              return;\n            }\n\n            if (!result) {\n              this.formatAndAdd(element, rule);\n              return false;\n            }\n          } catch (e) {\n            if (this.settings.debug && window.console) {\n              console.log(\"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e);\n            }\n\n            if (e instanceof TypeError) {\n              e.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n            }\n\n            throw e;\n          }\n        }\n\n        if (dependencyMismatch) {\n          return;\n        }\n\n        if (this.objectLength(rules)) {\n          this.successList.push(element);\n        }\n\n        return true;\n      },\n      // Return the custom message for the given element and validation method\n      // specified in the element's HTML5 data attribute\n      // return the generic message if present and no method specific message is present\n      customDataMessage: function customDataMessage(element, method) {\n        return $(element).data(\"msg\" + method.charAt(0).toUpperCase() + method.substring(1).toLowerCase()) || $(element).data(\"msg\");\n      },\n      // Return the custom message for the given element name and validation method\n      customMessage: function customMessage(name, method) {\n        var m = this.settings.messages[name];\n        return m && (m.constructor === String ? m : m[method]);\n      },\n      // Return the first defined argument, allowing empty strings\n      findDefined: function findDefined() {\n        for (var i = 0; i < arguments.length; i++) {\n          if (arguments[i] !== undefined) {\n            return arguments[i];\n          }\n        }\n\n        return undefined;\n      },\n      // The second parameter 'rule' used to be a string, and extended to an object literal\n      // of the following form:\n      // rule = {\n      //     method: \"method name\",\n      //     parameters: \"the given method parameters\"\n      // }\n      //\n      // The old behavior still supported, kept to maintain backward compatibility with\n      // old code, and will be removed in the next major release.\n      defaultMessage: function defaultMessage(element, rule) {\n        if (typeof rule === \"string\") {\n          rule = {\n            method: rule\n          };\n        }\n\n        var message = this.findDefined(this.customMessage(element.name, rule.method), this.customDataMessage(element, rule.method), // 'title' is never undefined, so handle empty string as undefined\n        !this.settings.ignoreTitle && element.title || undefined, $.validator.messages[rule.method], \"<strong>Warning: No message defined for \" + element.name + \"</strong>\"),\n            theregex = /\\$?\\{(\\d+)\\}/g;\n\n        if (typeof message === \"function\") {\n          message = message.call(this, rule.parameters, element);\n        } else if (theregex.test(message)) {\n          message = $.validator.format(message.replace(theregex, \"{$1}\"), rule.parameters);\n        }\n\n        return message;\n      },\n      formatAndAdd: function formatAndAdd(element, rule) {\n        var message = this.defaultMessage(element, rule);\n        this.errorList.push({\n          message: message,\n          element: element,\n          method: rule.method\n        });\n        this.errorMap[element.name] = message;\n        this.submitted[element.name] = message;\n      },\n      addWrapper: function addWrapper(toToggle) {\n        if (this.settings.wrapper) {\n          toToggle = toToggle.add(toToggle.parent(this.settings.wrapper));\n        }\n\n        return toToggle;\n      },\n      defaultShowErrors: function defaultShowErrors() {\n        var i, elements, error;\n\n        for (i = 0; this.errorList[i]; i++) {\n          error = this.errorList[i];\n\n          if (this.settings.highlight) {\n            this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass);\n          }\n\n          this.showLabel(error.element, error.message);\n        }\n\n        if (this.errorList.length) {\n          this.toShow = this.toShow.add(this.containers);\n        }\n\n        if (this.settings.success) {\n          for (i = 0; this.successList[i]; i++) {\n            this.showLabel(this.successList[i]);\n          }\n        }\n\n        if (this.settings.unhighlight) {\n          for (i = 0, elements = this.validElements(); elements[i]; i++) {\n            this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, this.settings.validClass);\n          }\n        }\n\n        this.toHide = this.toHide.not(this.toShow);\n        this.hideErrors();\n        this.addWrapper(this.toShow).show();\n      },\n      validElements: function validElements() {\n        return this.currentElements.not(this.invalidElements());\n      },\n      invalidElements: function invalidElements() {\n        return $(this.errorList).map(function () {\n          return this.element;\n        });\n      },\n      showLabel: function showLabel(element, message) {\n        var place,\n            group,\n            errorID,\n            v,\n            error = this.errorsFor(element),\n            elementID = this.idOrName(element),\n            describedBy = $(element).attr(\"aria-describedby\");\n\n        if (error.length) {\n          // Refresh error/success class\n          error.removeClass(this.settings.validClass).addClass(this.settings.errorClass); // Replace message on existing label\n\n          error.html(message);\n        } else {\n          // Create error element\n          error = $(\"<\" + this.settings.errorElement + \">\").attr(\"id\", elementID + \"-error\").addClass(this.settings.errorClass).html(message || \"\"); // Maintain reference to the element to be placed into the DOM\n\n          place = error;\n\n          if (this.settings.wrapper) {\n            // Make sure the element is visible, even in IE\n            // actually showing the wrapped element is handled elsewhere\n            place = error.hide().show().wrap(\"<\" + this.settings.wrapper + \"/>\").parent();\n          }\n\n          if (this.labelContainer.length) {\n            this.labelContainer.append(place);\n          } else if (this.settings.errorPlacement) {\n            this.settings.errorPlacement.call(this, place, $(element));\n          } else {\n            place.insertAfter(element);\n          } // Link error back to the element\n\n\n          if (error.is(\"label\")) {\n            // If the error is a label, then associate using 'for'\n            error.attr(\"for\", elementID); // If the element is not a child of an associated label, then it's necessary\n            // to explicitly apply aria-describedby\n          } else if (error.parents(\"label[for='\" + this.escapeCssMeta(elementID) + \"']\").length === 0) {\n            errorID = error.attr(\"id\"); // Respect existing non-error aria-describedby\n\n            if (!describedBy) {\n              describedBy = errorID;\n            } else if (!describedBy.match(new RegExp(\"\\\\b\" + this.escapeCssMeta(errorID) + \"\\\\b\"))) {\n              // Add to end of list if not already present\n              describedBy += \" \" + errorID;\n            }\n\n            $(element).attr(\"aria-describedby\", describedBy); // If this element is grouped, then assign to all elements in the same group\n\n            group = this.groups[element.name];\n\n            if (group) {\n              v = this;\n              $.each(v.groups, function (name, testgroup) {\n                if (testgroup === group) {\n                  $(\"[name='\" + v.escapeCssMeta(name) + \"']\", v.currentForm).attr(\"aria-describedby\", error.attr(\"id\"));\n                }\n              });\n            }\n          }\n        }\n\n        if (!message && this.settings.success) {\n          error.text(\"\");\n\n          if (typeof this.settings.success === \"string\") {\n            error.addClass(this.settings.success);\n          } else {\n            this.settings.success(error, element);\n          }\n        }\n\n        this.toShow = this.toShow.add(error);\n      },\n      errorsFor: function errorsFor(element) {\n        var name = this.escapeCssMeta(this.idOrName(element)),\n            describer = $(element).attr(\"aria-describedby\"),\n            selector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\"; // 'aria-describedby' should directly reference the error element\n\n        if (describer) {\n          selector = selector + \", #\" + this.escapeCssMeta(describer).replace(/\\s+/g, \", #\");\n        }\n\n        return this.errors().filter(selector);\n      },\n      // See https://api.jquery.com/category/selectors/, for CSS\n      // meta-characters that should be escaped in order to be used with JQuery\n      // as a literal part of a name/id or any selector.\n      escapeCssMeta: function escapeCssMeta(string) {\n        if (string === undefined) {\n          return \"\";\n        }\n\n        return string.replace(/([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\");\n      },\n      idOrName: function idOrName(element) {\n        return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);\n      },\n      validationTargetFor: function validationTargetFor(element) {\n        // If radio/checkbox, validate first element in group instead\n        if (this.checkable(element)) {\n          element = this.findByName(element.name);\n        } // Always apply ignore filter\n\n\n        return $(element).not(this.settings.ignore)[0];\n      },\n      checkable: function checkable(element) {\n        return /radio|checkbox/i.test(element.type);\n      },\n      findByName: function findByName(name) {\n        return $(this.currentForm).find(\"[name='\" + this.escapeCssMeta(name) + \"']\");\n      },\n      getLength: function getLength(value, element) {\n        switch (element.nodeName.toLowerCase()) {\n          case \"select\":\n            return $(\"option:selected\", element).length;\n\n          case \"input\":\n            if (this.checkable(element)) {\n              return this.findByName(element.name).filter(\":checked\").length;\n            }\n\n        }\n\n        return value.length;\n      },\n      depend: function depend(param, element) {\n        return this.dependTypes[_typeof(param)] ? this.dependTypes[_typeof(param)](param, element) : true;\n      },\n      dependTypes: {\n        \"boolean\": function boolean(param) {\n          return param;\n        },\n        \"string\": function string(param, element) {\n          return !!$(param, element.form).length;\n        },\n        \"function\": function _function(param, element) {\n          return param(element);\n        }\n      },\n      optional: function optional(element) {\n        var val = this.elementValue(element);\n        return !$.validator.methods.required.call(this, val, element) && \"dependency-mismatch\";\n      },\n      startRequest: function startRequest(element) {\n        if (!this.pending[element.name]) {\n          this.pendingRequest++;\n          $(element).addClass(this.settings.pendingClass);\n          this.pending[element.name] = true;\n        }\n      },\n      stopRequest: function stopRequest(element, valid) {\n        this.pendingRequest--; // Sometimes synchronization fails, make sure pendingRequest is never < 0\n\n        if (this.pendingRequest < 0) {\n          this.pendingRequest = 0;\n        }\n\n        delete this.pending[element.name];\n        $(element).removeClass(this.settings.pendingClass);\n\n        if (valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0) {\n          $(this.currentForm).trigger(\"submit\"); // Remove the hidden input that was used as a replacement for the\n          // missing submit button. The hidden input is added by `handle()`\n          // to ensure that the value of the used submit button is passed on\n          // for scripted submits triggered by this method\n\n          if (this.submitButton) {\n            $(\"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm).remove();\n          }\n\n          this.formSubmitted = false;\n        } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) {\n          $(this.currentForm).triggerHandler(\"invalid-form\", [this]);\n          this.formSubmitted = false;\n        }\n      },\n      previousValue: function previousValue(element, method) {\n        method = typeof method === \"string\" && method || \"remote\";\n        return $.data(element, \"previousValue\") || $.data(element, \"previousValue\", {\n          old: null,\n          valid: true,\n          message: this.defaultMessage(element, {\n            method: method\n          })\n        });\n      },\n      // Cleans up all forms and elements, removes validator-specific events\n      destroy: function destroy() {\n        this.resetForm();\n        $(this.currentForm).off(\".validate\").removeData(\"validator\").find(\".validate-equalTo-blur\").off(\".validate-equalTo\").removeClass(\"validate-equalTo-blur\").find(\".validate-lessThan-blur\").off(\".validate-lessThan\").removeClass(\"validate-lessThan-blur\").find(\".validate-lessThanEqual-blur\").off(\".validate-lessThanEqual\").removeClass(\"validate-lessThanEqual-blur\").find(\".validate-greaterThanEqual-blur\").off(\".validate-greaterThanEqual\").removeClass(\"validate-greaterThanEqual-blur\").find(\".validate-greaterThan-blur\").off(\".validate-greaterThan\").removeClass(\"validate-greaterThan-blur\");\n      }\n    },\n    classRuleSettings: {\n      required: {\n        required: true\n      },\n      email: {\n        email: true\n      },\n      url: {\n        url: true\n      },\n      date: {\n        date: true\n      },\n      dateISO: {\n        dateISO: true\n      },\n      number: {\n        number: true\n      },\n      digits: {\n        digits: true\n      },\n      creditcard: {\n        creditcard: true\n      }\n    },\n    addClassRules: function addClassRules(className, rules) {\n      if (className.constructor === String) {\n        this.classRuleSettings[className] = rules;\n      } else {\n        $.extend(this.classRuleSettings, className);\n      }\n    },\n    classRules: function classRules(element) {\n      var rules = {},\n          classes = $(element).attr(\"class\");\n\n      if (classes) {\n        $.each(classes.split(\" \"), function () {\n          if (this in $.validator.classRuleSettings) {\n            $.extend(rules, $.validator.classRuleSettings[this]);\n          }\n        });\n      }\n\n      return rules;\n    },\n    normalizeAttributeRule: function normalizeAttributeRule(rules, type, method, value) {\n      // Convert the value to a number for number inputs, and for text for backwards compability\n      // allows type=\"date\" and others to be compared as strings\n      if (/min|max|step/.test(method) && (type === null || /number|range|text/.test(type))) {\n        value = Number(value); // Support Opera Mini, which returns NaN for undefined minlength\n\n        if (isNaN(value)) {\n          value = undefined;\n        }\n      }\n\n      if (value || value === 0) {\n        rules[method] = value;\n      } else if (type === method && type !== \"range\") {\n        // Exception: the jquery validate 'range' method\n        // does not test for the html5 'range' type\n        rules[type === \"date\" ? \"dateISO\" : method] = true;\n      }\n    },\n    attributeRules: function attributeRules(element) {\n      var rules = {},\n          $element = $(element),\n          type = element.getAttribute(\"type\"),\n          method,\n          value;\n\n      for (method in $.validator.methods) {\n        // Support for <input required> in both html5 and older browsers\n        if (method === \"required\") {\n          value = element.getAttribute(method); // Some browsers return an empty string for the required attribute\n          // and non-HTML5 browsers might have required=\"\" markup\n\n          if (value === \"\") {\n            value = true;\n          } // Force non-HTML5 browsers to return bool\n\n\n          value = !!value;\n        } else {\n          value = $element.attr(method);\n        }\n\n        this.normalizeAttributeRule(rules, type, method, value);\n      } // 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\n\n      if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {\n        delete rules.maxlength;\n      }\n\n      return rules;\n    },\n    dataRules: function dataRules(element) {\n      var rules = {},\n          $element = $(element),\n          type = element.getAttribute(\"type\"),\n          method,\n          value;\n\n      for (method in $.validator.methods) {\n        value = $element.data(\"rule\" + method.charAt(0).toUpperCase() + method.substring(1).toLowerCase()); // Cast empty attributes like `data-rule-required` to `true`\n\n        if (value === \"\") {\n          value = true;\n        }\n\n        this.normalizeAttributeRule(rules, type, method, value);\n      }\n\n      return rules;\n    },\n    staticRules: function staticRules(element) {\n      var rules = {},\n          validator = $.data(element.form, \"validator\");\n\n      if (validator.settings.rules) {\n        rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};\n      }\n\n      return rules;\n    },\n    normalizeRules: function normalizeRules(rules, element) {\n      // Handle dependency check\n      $.each(rules, function (prop, val) {\n        // Ignore rule when param is explicitly false, eg. required:false\n        if (val === false) {\n          delete rules[prop];\n          return;\n        }\n\n        if (val.param || val.depends) {\n          var keepRule = true;\n\n          switch (_typeof(val.depends)) {\n            case \"string\":\n              keepRule = !!$(val.depends, element.form).length;\n              break;\n\n            case \"function\":\n              keepRule = val.depends.call(element, element);\n              break;\n          }\n\n          if (keepRule) {\n            rules[prop] = val.param !== undefined ? val.param : true;\n          } else {\n            $.data(element.form, \"validator\").resetElements($(element));\n            delete rules[prop];\n          }\n        }\n      }); // Evaluate parameters\n\n      $.each(rules, function (rule, parameter) {\n        rules[rule] = typeof parameter === \"function\" && rule !== \"normalizer\" ? parameter(element) : parameter;\n      }); // Clean number parameters\n\n      $.each([\"minlength\", \"maxlength\"], function () {\n        if (rules[this]) {\n          rules[this] = Number(rules[this]);\n        }\n      });\n      $.each([\"rangelength\", \"range\"], function () {\n        var parts;\n\n        if (rules[this]) {\n          if (Array.isArray(rules[this])) {\n            rules[this] = [Number(rules[this][0]), Number(rules[this][1])];\n          } else if (typeof rules[this] === \"string\") {\n            parts = rules[this].replace(/[\\[\\]]/g, \"\").split(/[\\s,]+/);\n            rules[this] = [Number(parts[0]), Number(parts[1])];\n          }\n        }\n      });\n\n      if ($.validator.autoCreateRanges) {\n        // Auto-create ranges\n        if (rules.min != null && rules.max != null) {\n          rules.range = [rules.min, rules.max];\n          delete rules.min;\n          delete rules.max;\n        }\n\n        if (rules.minlength != null && rules.maxlength != null) {\n          rules.rangelength = [rules.minlength, rules.maxlength];\n          delete rules.minlength;\n          delete rules.maxlength;\n        }\n      }\n\n      return rules;\n    },\n    // Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n    normalizeRule: function normalizeRule(data) {\n      if (typeof data === \"string\") {\n        var transformed = {};\n        $.each(data.split(/\\s/), function () {\n          transformed[this] = true;\n        });\n        data = transformed;\n      }\n\n      return data;\n    },\n    // https://jqueryvalidation.org/jQuery.validator.addMethod/\n    addMethod: function addMethod(name, method, message) {\n      $.validator.methods[name] = method;\n      $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name];\n\n      if (method.length < 3) {\n        $.validator.addClassRules(name, $.validator.normalizeRule(name));\n      }\n    },\n    // https://jqueryvalidation.org/jQuery.validator.methods/\n    methods: {\n      // https://jqueryvalidation.org/required-method/\n      required: function required(value, element, param) {\n        // Check if dependency is met\n        if (!this.depend(param, element)) {\n          return \"dependency-mismatch\";\n        }\n\n        if (element.nodeName.toLowerCase() === \"select\") {\n          // Could be an array for select-multiple or a string, both are fine this way\n          var val = $(element).val();\n          return val && val.length > 0;\n        }\n\n        if (this.checkable(element)) {\n          return this.getLength(value, element) > 0;\n        }\n\n        return value !== undefined && value !== null && value.length > 0;\n      },\n      // https://jqueryvalidation.org/email-method/\n      email: function email(value, element) {\n        // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n        // Retrieved 2014-01-14\n        // If you have a problem with this implementation, report a bug against the above spec\n        // Or use custom methods to implement your own email validation\n        return this.optional(element) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value);\n      },\n      // https://jqueryvalidation.org/url-method/\n      url: function url(value, element) {\n        // Copyright (c) 2010-2013 Diego Perini, MIT licensed\n        // https://gist.github.com/dperini/729294\n        // see also https://mathiasbynens.be/demo/url-regex\n        // modified to allow protocol-relative URLs\n        return this.optional(element) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test(value);\n      },\n      // https://jqueryvalidation.org/date-method/\n      date: function () {\n        var called = false;\n        return function (value, element) {\n          if (!called) {\n            called = true;\n\n            if (this.settings.debug && window.console) {\n              console.warn(\"The `date` method is deprecated and will be removed in version '2.0.0'.\\n\" + \"Please don't use it, since it relies on the Date constructor, which\\n\" + \"behaves very differently across browsers and locales. Use `dateISO`\\n\" + \"instead or one of the locale specific methods in `localizations/`\\n\" + \"and `additional-methods.js`.\");\n            }\n          }\n\n          return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());\n        };\n      }(),\n      // https://jqueryvalidation.org/dateISO-method/\n      dateISO: function dateISO(value, element) {\n        return this.optional(element) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);\n      },\n      // https://jqueryvalidation.org/number-method/\n      number: function number(value, element) {\n        return this.optional(element) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test(value);\n      },\n      // https://jqueryvalidation.org/digits-method/\n      digits: function digits(value, element) {\n        return this.optional(element) || /^\\d+$/.test(value);\n      },\n      // https://jqueryvalidation.org/minlength-method/\n      minlength: function minlength(value, element, param) {\n        var length = Array.isArray(value) ? value.length : this.getLength(value, element);\n        return this.optional(element) || length >= param;\n      },\n      // https://jqueryvalidation.org/maxlength-method/\n      maxlength: function maxlength(value, element, param) {\n        var length = Array.isArray(value) ? value.length : this.getLength(value, element);\n        return this.optional(element) || length <= param;\n      },\n      // https://jqueryvalidation.org/rangelength-method/\n      rangelength: function rangelength(value, element, param) {\n        var length = Array.isArray(value) ? value.length : this.getLength(value, element);\n        return this.optional(element) || length >= param[0] && length <= param[1];\n      },\n      // https://jqueryvalidation.org/min-method/\n      min: function min(value, element, param) {\n        return this.optional(element) || value >= param;\n      },\n      // https://jqueryvalidation.org/max-method/\n      max: function max(value, element, param) {\n        return this.optional(element) || value <= param;\n      },\n      // https://jqueryvalidation.org/range-method/\n      range: function range(value, element, param) {\n        return this.optional(element) || value >= param[0] && value <= param[1];\n      },\n      // https://jqueryvalidation.org/step-method/\n      step: function step(value, element, param) {\n        var type = $(element).attr(\"type\"),\n            errorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n            supportedTypes = [\"text\", \"number\", \"range\"],\n            re = new RegExp(\"\\\\b\" + type + \"\\\\b\"),\n            notSupported = type && !re.test(supportedTypes.join()),\n            decimalPlaces = function decimalPlaces(num) {\n          var match = (\"\" + num).match(/(?:\\.(\\d+))?$/);\n\n          if (!match) {\n            return 0;\n          } // Number of digits right of decimal point.\n\n\n          return match[1] ? match[1].length : 0;\n        },\n            toInt = function toInt(num) {\n          return Math.round(num * Math.pow(10, decimals));\n        },\n            valid = true,\n            decimals; // Works only for text, number and range input types\n        // TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\n\n        if (notSupported) {\n          throw new Error(errorMessage);\n        }\n\n        decimals = decimalPlaces(param); // Value can't have too many decimals\n\n        if (decimalPlaces(value) > decimals || toInt(value) % toInt(param) !== 0) {\n          valid = false;\n        }\n\n        return this.optional(element) || valid;\n      },\n      // https://jqueryvalidation.org/equalTo-method/\n      equalTo: function equalTo(value, element, param) {\n        // Bind to the blur event of the target in order to revalidate whenever the target field is updated\n        var target = $(param);\n\n        if (this.settings.onfocusout && target.not(\".validate-equalTo-blur\").length) {\n          target.addClass(\"validate-equalTo-blur\").on(\"blur.validate-equalTo\", function () {\n            $(element).valid();\n          });\n        }\n\n        return value === target.val();\n      },\n      // https://jqueryvalidation.org/remote-method/\n      remote: function remote(value, element, param, method) {\n        if (this.optional(element)) {\n          return \"dependency-mismatch\";\n        }\n\n        method = typeof method === \"string\" && method || \"remote\";\n        var previous = this.previousValue(element, method),\n            validator,\n            data,\n            optionDataString;\n\n        if (!this.settings.messages[element.name]) {\n          this.settings.messages[element.name] = {};\n        }\n\n        previous.originalMessage = previous.originalMessage || this.settings.messages[element.name][method];\n        this.settings.messages[element.name][method] = previous.message;\n        param = typeof param === \"string\" && {\n          url: param\n        } || param;\n        optionDataString = $.param($.extend({\n          data: value\n        }, param.data));\n\n        if (previous.old === optionDataString) {\n          return previous.valid;\n        }\n\n        previous.old = optionDataString;\n        validator = this;\n        this.startRequest(element);\n        data = {};\n        data[element.name] = value;\n        $.ajax($.extend(true, {\n          mode: \"abort\",\n          port: \"validate\" + element.name,\n          dataType: \"json\",\n          data: data,\n          context: validator.currentForm,\n          success: function success(response) {\n            var valid = response === true || response === \"true\",\n                errors,\n                message,\n                submitted;\n            validator.settings.messages[element.name][method] = previous.originalMessage;\n\n            if (valid) {\n              submitted = validator.formSubmitted;\n              validator.resetInternals();\n              validator.toHide = validator.errorsFor(element);\n              validator.formSubmitted = submitted;\n              validator.successList.push(element);\n              validator.invalid[element.name] = false;\n              validator.showErrors();\n            } else {\n              errors = {};\n              message = response || validator.defaultMessage(element, {\n                method: method,\n                parameters: value\n              });\n              errors[element.name] = previous.message = message;\n              validator.invalid[element.name] = true;\n              validator.showErrors(errors);\n            }\n\n            previous.valid = valid;\n            validator.stopRequest(element, valid);\n          }\n        }, param));\n        return \"pending\";\n      }\n    }\n  }); // Ajax mode: abort\n  // usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n  // if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\n  var pendingRequests = {},\n      ajax; // Use a prefilter if available (1.5+)\n\n  if ($.ajaxPrefilter) {\n    $.ajaxPrefilter(function (settings, _, xhr) {\n      var port = settings.port;\n\n      if (settings.mode === \"abort\") {\n        if (pendingRequests[port]) {\n          pendingRequests[port].abort();\n        }\n\n        pendingRequests[port] = xhr;\n      }\n    });\n  } else {\n    // Proxy ajax\n    ajax = $.ajax;\n\n    $.ajax = function (settings) {\n      var mode = (\"mode\" in settings ? settings : $.ajaxSettings).mode,\n          port = (\"port\" in settings ? settings : $.ajaxSettings).port;\n\n      if (mode === \"abort\") {\n        if (pendingRequests[port]) {\n          pendingRequests[port].abort();\n        }\n\n        pendingRequests[port] = ajax.apply(this, arguments);\n        return pendingRequests[port];\n      }\n\n      return ajax.apply(this, arguments);\n    };\n  }\n\n  return $;\n});\n\n//# sourceURL=webpack://rup/./node_modules/jquery-validation/dist/jquery.validate.js?");

/***/ }),

/***/ "./node_modules/jquery.scrollto/jquery.scrollTo.js":
/*!*********************************************************!*\
  !*** ./node_modules/jquery.scrollto/jquery.scrollTo.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * jQuery.scrollTo\n * Copyright (c) 2007-2015 Ariel Flesler - aflesler<a>gmail<d>com | http://flesler.blogspot.com\n * Licensed under MIT\n * http://flesler.blogspot.com/2007/10/jqueryscrollto.html\n * @projectDescription Lightweight, cross-browser and highly customizable animated scrolling with jQuery\n * @author Ariel Flesler\n * @version 2.1.2\n */\n;\n\n(function (factory) {\n  'use strict';\n\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  'use strict';\n\n  var $scrollTo = $.scrollTo = function (target, duration, settings) {\n    return $(window).scrollTo(target, duration, settings);\n  };\n\n  $scrollTo.defaults = {\n    axis: 'xy',\n    duration: 0,\n    limit: true\n  };\n\n  function isWin(elem) {\n    return !elem.nodeName || $.inArray(elem.nodeName.toLowerCase(), ['iframe', '#document', 'html', 'body']) !== -1;\n  }\n\n  $.fn.scrollTo = function (target, duration, settings) {\n    if (_typeof(duration) === 'object') {\n      settings = duration;\n      duration = 0;\n    }\n\n    if (typeof settings === 'function') {\n      settings = {\n        onAfter: settings\n      };\n    }\n\n    if (target === 'max') {\n      target = 9e9;\n    }\n\n    settings = $.extend({}, $scrollTo.defaults, settings); // Speed is still recognized for backwards compatibility\n\n    duration = duration || settings.duration; // Make sure the settings are given right\n\n    var queue = settings.queue && settings.axis.length > 1;\n\n    if (queue) {\n      // Let's keep the overall duration\n      duration /= 2;\n    }\n\n    settings.offset = both(settings.offset);\n    settings.over = both(settings.over);\n    return this.each(function () {\n      // Null target yields nothing, just like jQuery does\n      if (target === null) return;\n      var win = isWin(this),\n          elem = win ? this.contentWindow || window : this,\n          $elem = $(elem),\n          targ = target,\n          attr = {},\n          toff;\n\n      switch (_typeof(targ)) {\n        // A number will pass the regex\n        case 'number':\n        case 'string':\n          if (/^([+-]=?)?\\d+(\\.\\d+)?(px|%)?$/.test(targ)) {\n            targ = both(targ); // We are done\n\n            break;\n          } // Relative/Absolute selector\n\n\n          targ = win ? $(targ) : $(targ, elem);\n\n        /* falls through */\n\n        case 'object':\n          if (targ.length === 0) return; // DOMElement / jQuery\n\n          if (targ.is || targ.style) {\n            // Get the real position of the target\n            toff = (targ = $(targ)).offset();\n          }\n\n      }\n\n      var offset = $.isFunction(settings.offset) && settings.offset(elem, targ) || settings.offset;\n      $.each(settings.axis.split(''), function (i, axis) {\n        var Pos = axis === 'x' ? 'Left' : 'Top',\n            pos = Pos.toLowerCase(),\n            key = 'scroll' + Pos,\n            prev = $elem[key](),\n            max = $scrollTo.max(elem, axis);\n\n        if (toff) {\n          // jQuery / DOMElement\n          attr[key] = toff[pos] + (win ? 0 : prev - $elem.offset()[pos]); // If it's a dom element, reduce the margin\n\n          if (settings.margin) {\n            attr[key] -= parseInt(targ.css('margin' + Pos), 10) || 0;\n            attr[key] -= parseInt(targ.css('border' + Pos + 'Width'), 10) || 0;\n          }\n\n          attr[key] += offset[pos] || 0;\n\n          if (settings.over[pos]) {\n            // Scroll to a fraction of its width/height\n            attr[key] += targ[axis === 'x' ? 'width' : 'height']() * settings.over[pos];\n          }\n        } else {\n          var val = targ[pos]; // Handle percentage values\n\n          attr[key] = val.slice && val.slice(-1) === '%' ? parseFloat(val) / 100 * max : val;\n        } // Number or 'number'\n\n\n        if (settings.limit && /^\\d+$/.test(attr[key])) {\n          // Check the limits\n          attr[key] = attr[key] <= 0 ? 0 : Math.min(attr[key], max);\n        } // Don't waste time animating, if there's no need.\n\n\n        if (!i && settings.axis.length > 1) {\n          if (prev === attr[key]) {\n            // No animation needed\n            attr = {};\n          } else if (queue) {\n            // Intermediate animation\n            animate(settings.onAfterFirst); // Don't animate this axis again in the next iteration.\n\n            attr = {};\n          }\n        }\n      });\n      animate(settings.onAfter);\n\n      function animate(callback) {\n        var opts = $.extend({}, settings, {\n          // The queue setting conflicts with animate()\n          // Force it to always be true\n          queue: true,\n          duration: duration,\n          complete: callback && function () {\n            callback.call(elem, targ, settings);\n          }\n        });\n        $elem.animate(attr, opts);\n      }\n    });\n  }; // Max scrolling position, works on quirks mode\n  // It only fails (not too badly) on IE, quirks mode.\n\n\n  $scrollTo.max = function (elem, axis) {\n    var Dim = axis === 'x' ? 'Width' : 'Height',\n        scroll = 'scroll' + Dim;\n    if (!isWin(elem)) return elem[scroll] - $(elem)[Dim.toLowerCase()]();\n    var size = 'client' + Dim,\n        doc = elem.ownerDocument || elem.document,\n        html = doc.documentElement,\n        body = doc.body;\n    return Math.max(html[scroll], body[scroll]) - Math.min(html[size], body[size]);\n  };\n\n  function both(val) {\n    return $.isFunction(val) || $.isPlainObject(val) ? val : {\n      top: val,\n      left: val\n    };\n  } // Add special hooks so that window scroll properties can be animated\n\n\n  $.Tween.propHooks.scrollLeft = $.Tween.propHooks.scrollTop = {\n    get: function get(t) {\n      return $(t.elem)[t.prop]();\n    },\n    set: function set(t) {\n      var curr = this.get(t); // If interrupt is true and user scrolled, stop animating\n\n      if (t.options.interrupt && t._last && t._last !== curr) {\n        return $(t.elem).stop();\n      }\n\n      var next = Math.round(t.now); // Don't waste CPU\n      // Browsers don't render floating point scroll\n\n      if (curr !== next) {\n        $(t.elem)[t.prop](next);\n        t._last = this.get(t);\n      }\n    }\n  }; // AMD requirement\n\n  return $scrollTo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/jquery.scrollto/jquery.scrollTo.js?");

/***/ }),

/***/ "./node_modules/jquery/dist/jquery.js":
/*!********************************************!*\
  !*** ./node_modules/jquery/dist/jquery.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n(function (global, factory) {\n  \"use strict\";\n\n  if (( false ? undefined : _typeof(module)) === \"object\" && _typeof(module.exports) === \"object\") {\n    // For CommonJS and CommonJS-like environments where a proper `window`\n    // is present, execute the factory and get jQuery.\n    // For environments that do not have a `window` with a `document`\n    // (such as Node.js), expose a factory as module.exports.\n    // This accentuates the need for the creation of a real `window`.\n    // e.g. var jQuery = require(\"jquery\")(window);\n    // See ticket trac-14549 for more info.\n    module.exports = global.document ? factory(global, true) : function (w) {\n      if (!w.document) {\n        throw new Error(\"jQuery requires a window with a document\");\n      }\n\n      return factory(w);\n    };\n  } else {\n    factory(global);\n  } // Pass this if window is not defined yet\n\n})(typeof window !== \"undefined\" ? window : this, function (window, noGlobal) {\n  // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n  // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n  // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n  // enough that all such attempts are guarded in a try block.\n  \"use strict\";\n\n  var arr = [];\n  var getProto = Object.getPrototypeOf;\n  var _slice = arr.slice;\n  var flat = arr.flat ? function (array) {\n    return arr.flat.call(array);\n  } : function (array) {\n    return arr.concat.apply([], array);\n  };\n  var push = arr.push;\n  var indexOf = arr.indexOf;\n  var class2type = {};\n  var toString = class2type.toString;\n  var hasOwn = class2type.hasOwnProperty;\n  var fnToString = hasOwn.toString;\n  var ObjectFunctionString = fnToString.call(Object);\n  var support = {};\n\n  var isFunction = function isFunction(obj) {\n    // Support: Chrome <=57, Firefox <=52\n    // In some browsers, typeof returns \"function\" for HTML <object> elements\n    // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n    // We don't want to classify *any* DOM node as a function.\n    // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n    // Plus for old WebKit, typeof returns \"function\" for HTML collections\n    // (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n    return typeof obj === \"function\" && typeof obj.nodeType !== \"number\" && typeof obj.item !== \"function\";\n  };\n\n  var isWindow = function isWindow(obj) {\n    return obj != null && obj === obj.window;\n  };\n\n  var document = window.document;\n  var preservedScriptAttributes = {\n    type: true,\n    src: true,\n    nonce: true,\n    noModule: true\n  };\n\n  function DOMEval(code, node, doc) {\n    doc = doc || document;\n    var i,\n        val,\n        script = doc.createElement(\"script\");\n    script.text = code;\n\n    if (node) {\n      for (i in preservedScriptAttributes) {\n        // Support: Firefox 64+, Edge 18+\n        // Some browsers don't support the \"nonce\" property on scripts.\n        // On the other hand, just using `getAttribute` is not enough as\n        // the `nonce` attribute is reset to an empty string whenever it\n        // becomes browsing-context connected.\n        // See https://github.com/whatwg/html/issues/2369\n        // See https://html.spec.whatwg.org/#nonce-attributes\n        // The `node.getAttribute` check was added for the sake of\n        // `jQuery.globalEval` so that it can fake a nonce-containing node\n        // via an object.\n        val = node[i] || node.getAttribute && node.getAttribute(i);\n\n        if (val) {\n          script.setAttribute(i, val);\n        }\n      }\n    }\n\n    doc.head.appendChild(script).parentNode.removeChild(script);\n  }\n\n  function toType(obj) {\n    if (obj == null) {\n      return obj + \"\";\n    } // Support: Android <=2.3 only (functionish RegExp)\n\n\n    return _typeof(obj) === \"object\" || typeof obj === \"function\" ? class2type[toString.call(obj)] || \"object\" : _typeof(obj);\n  }\n  /* global Symbol */\n  // Defining this global in .eslintrc.json would create a danger of using the global\n  // unguarded in another place, it seems safer to define global only for this module\n\n\n  var version = \"3.7.1\",\n      rhtmlSuffix = /HTML$/i,\n      // Define a local copy of jQuery\n  jQuery = function jQuery(selector, context) {\n    // The jQuery object is actually just the init constructor 'enhanced'\n    // Need init if jQuery is called (just allow error to be thrown if not included)\n    return new jQuery.fn.init(selector, context);\n  };\n\n  jQuery.fn = jQuery.prototype = {\n    // The current version of jQuery being used\n    jquery: version,\n    constructor: jQuery,\n    // The default length of a jQuery object is 0\n    length: 0,\n    toArray: function toArray() {\n      return _slice.call(this);\n    },\n    // Get the Nth element in the matched element set OR\n    // Get the whole matched element set as a clean array\n    get: function get(num) {\n      // Return all the elements in a clean array\n      if (num == null) {\n        return _slice.call(this);\n      } // Return just the one element from the set\n\n\n      return num < 0 ? this[num + this.length] : this[num];\n    },\n    // Take an array of elements and push it onto the stack\n    // (returning the new matched element set)\n    pushStack: function pushStack(elems) {\n      // Build a new jQuery matched element set\n      var ret = jQuery.merge(this.constructor(), elems); // Add the old object onto the stack (as a reference)\n\n      ret.prevObject = this; // Return the newly-formed element set\n\n      return ret;\n    },\n    // Execute a callback for every element in the matched set.\n    each: function each(callback) {\n      return jQuery.each(this, callback);\n    },\n    map: function map(callback) {\n      return this.pushStack(jQuery.map(this, function (elem, i) {\n        return callback.call(elem, i, elem);\n      }));\n    },\n    slice: function slice() {\n      return this.pushStack(_slice.apply(this, arguments));\n    },\n    first: function first() {\n      return this.eq(0);\n    },\n    last: function last() {\n      return this.eq(-1);\n    },\n    even: function even() {\n      return this.pushStack(jQuery.grep(this, function (_elem, i) {\n        return (i + 1) % 2;\n      }));\n    },\n    odd: function odd() {\n      return this.pushStack(jQuery.grep(this, function (_elem, i) {\n        return i % 2;\n      }));\n    },\n    eq: function eq(i) {\n      var len = this.length,\n          j = +i + (i < 0 ? len : 0);\n      return this.pushStack(j >= 0 && j < len ? [this[j]] : []);\n    },\n    end: function end() {\n      return this.prevObject || this.constructor();\n    },\n    // For internal use only.\n    // Behaves like an Array's method, not like a jQuery method.\n    push: push,\n    sort: arr.sort,\n    splice: arr.splice\n  };\n\n  jQuery.extend = jQuery.fn.extend = function () {\n    var options,\n        name,\n        src,\n        copy,\n        copyIsArray,\n        clone,\n        target = arguments[0] || {},\n        i = 1,\n        length = arguments.length,\n        deep = false; // Handle a deep copy situation\n\n    if (typeof target === \"boolean\") {\n      deep = target; // Skip the boolean and the target\n\n      target = arguments[i] || {};\n      i++;\n    } // Handle case when target is a string or something (possible in deep copy)\n\n\n    if (_typeof(target) !== \"object\" && !isFunction(target)) {\n      target = {};\n    } // Extend jQuery itself if only one argument is passed\n\n\n    if (i === length) {\n      target = this;\n      i--;\n    }\n\n    for (; i < length; i++) {\n      // Only deal with non-null/undefined values\n      if ((options = arguments[i]) != null) {\n        // Extend the base object\n        for (name in options) {\n          copy = options[name]; // Prevent Object.prototype pollution\n          // Prevent never-ending loop\n\n          if (name === \"__proto__\" || target === copy) {\n            continue;\n          } // Recurse if we're merging plain objects or arrays\n\n\n          if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {\n            src = target[name]; // Ensure proper type for the source value\n\n            if (copyIsArray && !Array.isArray(src)) {\n              clone = [];\n            } else if (!copyIsArray && !jQuery.isPlainObject(src)) {\n              clone = {};\n            } else {\n              clone = src;\n            }\n\n            copyIsArray = false; // Never move original objects, clone them\n\n            target[name] = jQuery.extend(deep, clone, copy); // Don't bring in undefined values\n          } else if (copy !== undefined) {\n            target[name] = copy;\n          }\n        }\n      }\n    } // Return the modified object\n\n\n    return target;\n  };\n\n  jQuery.extend({\n    // Unique for each copy of jQuery on the page\n    expando: \"jQuery\" + (version + Math.random()).replace(/\\D/g, \"\"),\n    // Assume jQuery is ready without the ready module\n    isReady: true,\n    error: function error(msg) {\n      throw new Error(msg);\n    },\n    noop: function noop() {},\n    isPlainObject: function isPlainObject(obj) {\n      var proto, Ctor; // Detect obvious negatives\n      // Use toString instead of jQuery.type to catch host objects\n\n      if (!obj || toString.call(obj) !== \"[object Object]\") {\n        return false;\n      }\n\n      proto = getProto(obj); // Objects with no prototype (e.g., `Object.create( null )`) are plain\n\n      if (!proto) {\n        return true;\n      } // Objects with prototype are plain iff they were constructed by a global Object function\n\n\n      Ctor = hasOwn.call(proto, \"constructor\") && proto.constructor;\n      return typeof Ctor === \"function\" && fnToString.call(Ctor) === ObjectFunctionString;\n    },\n    isEmptyObject: function isEmptyObject(obj) {\n      var name;\n\n      for (name in obj) {\n        return false;\n      }\n\n      return true;\n    },\n    // Evaluates a script in a provided context; falls back to the global one\n    // if not specified.\n    globalEval: function globalEval(code, options, doc) {\n      DOMEval(code, {\n        nonce: options && options.nonce\n      }, doc);\n    },\n    each: function each(obj, callback) {\n      var length,\n          i = 0;\n\n      if (isArrayLike(obj)) {\n        length = obj.length;\n\n        for (; i < length; i++) {\n          if (callback.call(obj[i], i, obj[i]) === false) {\n            break;\n          }\n        }\n      } else {\n        for (i in obj) {\n          if (callback.call(obj[i], i, obj[i]) === false) {\n            break;\n          }\n        }\n      }\n\n      return obj;\n    },\n    // Retrieve the text value of an array of DOM nodes\n    text: function text(elem) {\n      var node,\n          ret = \"\",\n          i = 0,\n          nodeType = elem.nodeType;\n\n      if (!nodeType) {\n        // If no nodeType, this is expected to be an array\n        while (node = elem[i++]) {\n          // Do not traverse comment nodes\n          ret += jQuery.text(node);\n        }\n      }\n\n      if (nodeType === 1 || nodeType === 11) {\n        return elem.textContent;\n      }\n\n      if (nodeType === 9) {\n        return elem.documentElement.textContent;\n      }\n\n      if (nodeType === 3 || nodeType === 4) {\n        return elem.nodeValue;\n      } // Do not include comment or processing instruction nodes\n\n\n      return ret;\n    },\n    // results is for internal usage only\n    makeArray: function makeArray(arr, results) {\n      var ret = results || [];\n\n      if (arr != null) {\n        if (isArrayLike(Object(arr))) {\n          jQuery.merge(ret, typeof arr === \"string\" ? [arr] : arr);\n        } else {\n          push.call(ret, arr);\n        }\n      }\n\n      return ret;\n    },\n    inArray: function inArray(elem, arr, i) {\n      return arr == null ? -1 : indexOf.call(arr, elem, i);\n    },\n    isXMLDoc: function isXMLDoc(elem) {\n      var namespace = elem && elem.namespaceURI,\n          docElem = elem && (elem.ownerDocument || elem).documentElement; // Assume HTML when documentElement doesn't yet exist, such as inside\n      // document fragments.\n\n      return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || \"HTML\");\n    },\n    // Support: Android <=4.0 only, PhantomJS 1 only\n    // push.apply(_, arraylike) throws on ancient WebKit\n    merge: function merge(first, second) {\n      var len = +second.length,\n          j = 0,\n          i = first.length;\n\n      for (; j < len; j++) {\n        first[i++] = second[j];\n      }\n\n      first.length = i;\n      return first;\n    },\n    grep: function grep(elems, callback, invert) {\n      var callbackInverse,\n          matches = [],\n          i = 0,\n          length = elems.length,\n          callbackExpect = !invert; // Go through the array, only saving the items\n      // that pass the validator function\n\n      for (; i < length; i++) {\n        callbackInverse = !callback(elems[i], i);\n\n        if (callbackInverse !== callbackExpect) {\n          matches.push(elems[i]);\n        }\n      }\n\n      return matches;\n    },\n    // arg is for internal usage only\n    map: function map(elems, callback, arg) {\n      var length,\n          value,\n          i = 0,\n          ret = []; // Go through the array, translating each of the items to their new values\n\n      if (isArrayLike(elems)) {\n        length = elems.length;\n\n        for (; i < length; i++) {\n          value = callback(elems[i], i, arg);\n\n          if (value != null) {\n            ret.push(value);\n          }\n        } // Go through every key on the object,\n\n      } else {\n        for (i in elems) {\n          value = callback(elems[i], i, arg);\n\n          if (value != null) {\n            ret.push(value);\n          }\n        }\n      } // Flatten any nested arrays\n\n\n      return flat(ret);\n    },\n    // A global GUID counter for objects\n    guid: 1,\n    // jQuery.support is not used in Core but other projects attach their\n    // properties to it so it needs to exist.\n    support: support\n  });\n\n  if (typeof Symbol === \"function\") {\n    jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];\n  } // Populate the class2type map\n\n\n  jQuery.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"), function (_i, name) {\n    class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n  });\n\n  function isArrayLike(obj) {\n    // Support: real iOS 8.2 only (not reproducible in simulator)\n    // `in` check used to prevent JIT error (gh-2145)\n    // hasOwn isn't used here due to false negatives\n    // regarding Nodelist length in IE\n    var length = !!obj && \"length\" in obj && obj.length,\n        type = toType(obj);\n\n    if (isFunction(obj) || isWindow(obj)) {\n      return false;\n    }\n\n    return type === \"array\" || length === 0 || typeof length === \"number\" && length > 0 && length - 1 in obj;\n  }\n\n  function nodeName(elem, name) {\n    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n  }\n\n  var pop = arr.pop;\n  var sort = arr.sort;\n  var splice = arr.splice;\n  var whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n  var rtrimCSS = new RegExp(\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\"); // Note: an element does not contain itself\n\n  jQuery.contains = function (a, b) {\n    var bup = b && b.parentNode;\n    return a === bup || !!(bup && bup.nodeType === 1 && ( // Support: IE 9 - 11+\n    // IE doesn't have `contains` on SVG.\n    a.contains ? a.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));\n  }; // CSS string/identifier serialization\n  // https://drafts.csswg.org/cssom/#common-serializing-idioms\n\n\n  var rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\n  function fcssescape(ch, asCodePoint) {\n    if (asCodePoint) {\n      // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n      if (ch === \"\\0\") {\n        return \"\\uFFFD\";\n      } // Control characters and (dependent upon position) numbers get escaped as code points\n\n\n      return ch.slice(0, -1) + \"\\\\\" + ch.charCodeAt(ch.length - 1).toString(16) + \" \";\n    } // Other potentially-special ASCII characters get backslash-escaped\n\n\n    return \"\\\\\" + ch;\n  }\n\n  jQuery.escapeSelector = function (sel) {\n    return (sel + \"\").replace(rcssescape, fcssescape);\n  };\n\n  var preferredDoc = document,\n      pushNative = push;\n\n  (function () {\n    var i,\n        Expr,\n        outermostContext,\n        sortInput,\n        hasDuplicate,\n        push = pushNative,\n        // Local document vars\n    document,\n        documentElement,\n        documentIsHTML,\n        rbuggyQSA,\n        matches,\n        // Instance-specific data\n    expando = jQuery.expando,\n        dirruns = 0,\n        done = 0,\n        classCache = createCache(),\n        tokenCache = createCache(),\n        compilerCache = createCache(),\n        nonnativeSelectorCache = createCache(),\n        sortOrder = function sortOrder(a, b) {\n      if (a === b) {\n        hasDuplicate = true;\n      }\n\n      return 0;\n    },\n        booleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" + \"loop|multiple|open|readonly|required|scoped\",\n        // Regular expressions\n    // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n    identifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n        // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n    attributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace + // Operator (capture 2)\n    \"*([*^$|!~]?=)\" + whitespace + // \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n    \"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace + \"*\\\\]\",\n        pseudos = \":(\" + identifier + \")(?:\\\\((\" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n    // 1. quoted (capture 3; capture 4 or capture 5)\n    \"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" + // 2. simple (capture 6)\n    \"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" + // 3. anything else (capture 2)\n    \".*\" + \")\\\\)|)\",\n        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n    rwhitespace = new RegExp(whitespace + \"+\", \"g\"),\n        rcomma = new RegExp(\"^\" + whitespace + \"*,\" + whitespace + \"*\"),\n        rleadingCombinator = new RegExp(\"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\"),\n        rdescend = new RegExp(whitespace + \"|>\"),\n        rpseudo = new RegExp(pseudos),\n        ridentifier = new RegExp(\"^\" + identifier + \"$\"),\n        matchExpr = {\n      ID: new RegExp(\"^#(\" + identifier + \")\"),\n      CLASS: new RegExp(\"^\\\\.(\" + identifier + \")\"),\n      TAG: new RegExp(\"^(\" + identifier + \"|[*])\"),\n      ATTR: new RegExp(\"^\" + attributes),\n      PSEUDO: new RegExp(\"^\" + pseudos),\n      CHILD: new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\"),\n      bool: new RegExp(\"^(?:\" + booleans + \")$\", \"i\"),\n      // For use in libraries implementing .is()\n      // We use this for POS matching in `select`\n      needsContext: new RegExp(\"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\")\n    },\n        rinputs = /^(?:input|select|textarea|button)$/i,\n        rheader = /^h\\d$/i,\n        // Easily-parseable/retrievable ID or TAG or CLASS selectors\n    rquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n        rsibling = /[+~]/,\n        // CSS escapes\n    // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n    runescape = new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\"),\n        funescape = function funescape(escape, nonHex) {\n      var high = \"0x\" + escape.slice(1) - 0x10000;\n\n      if (nonHex) {\n        // Strip the backslash prefix from a non-hex escape sequence\n        return nonHex;\n      } // Replace a hexadecimal escape sequence with the encoded Unicode code point\n      // Support: IE <=11+\n      // For values outside the Basic Multilingual Plane (BMP), manually construct a\n      // surrogate pair\n\n\n      return high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);\n    },\n        // Used for iframes; see `setDocument`.\n    // Support: IE 9 - 11+, Edge 12 - 18+\n    // Removing the function wrapper causes a \"Permission Denied\"\n    // error in IE/Edge.\n    unloadHandler = function unloadHandler() {\n      setDocument();\n    },\n        inDisabledFieldset = addCombinator(function (elem) {\n      return elem.disabled === true && nodeName(elem, \"fieldset\");\n    }, {\n      dir: \"parentNode\",\n      next: \"legend\"\n    }); // Support: IE <=9 only\n    // Accessing document.activeElement can throw unexpectedly\n    // https://bugs.jquery.com/ticket/13393\n\n\n    function safeActiveElement() {\n      try {\n        return document.activeElement;\n      } catch (err) {}\n    } // Optimize for push.apply( _, NodeList )\n\n\n    try {\n      push.apply(arr = _slice.call(preferredDoc.childNodes), preferredDoc.childNodes); // Support: Android <=4.0\n      // Detect silently failing push.apply\n      // eslint-disable-next-line no-unused-expressions\n\n      arr[preferredDoc.childNodes.length].nodeType;\n    } catch (e) {\n      push = {\n        apply: function apply(target, els) {\n          pushNative.apply(target, _slice.call(els));\n        },\n        call: function call(target) {\n          pushNative.apply(target, _slice.call(arguments, 1));\n        }\n      };\n    }\n\n    function find(selector, context, results, seed) {\n      var m,\n          i,\n          elem,\n          nid,\n          match,\n          groups,\n          newSelector,\n          newContext = context && context.ownerDocument,\n          // nodeType defaults to 9, since context defaults to document\n      nodeType = context ? context.nodeType : 9;\n      results = results || []; // Return early from calls with invalid selector or context\n\n      if (typeof selector !== \"string\" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {\n        return results;\n      } // Try to shortcut find operations (as opposed to filters) in HTML documents\n\n\n      if (!seed) {\n        setDocument(context);\n        context = context || document;\n\n        if (documentIsHTML) {\n          // If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n          // (excepting DocumentFragment context, where the methods don't exist)\n          if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {\n            // ID selector\n            if (m = match[1]) {\n              // Document context\n              if (nodeType === 9) {\n                if (elem = context.getElementById(m)) {\n                  // Support: IE 9 only\n                  // getElementById can match elements by name instead of ID\n                  if (elem.id === m) {\n                    push.call(results, elem);\n                    return results;\n                  }\n                } else {\n                  return results;\n                } // Element context\n\n              } else {\n                // Support: IE 9 only\n                // getElementById can match elements by name instead of ID\n                if (newContext && (elem = newContext.getElementById(m)) && find.contains(context, elem) && elem.id === m) {\n                  push.call(results, elem);\n                  return results;\n                }\n              } // Type selector\n\n            } else if (match[2]) {\n              push.apply(results, context.getElementsByTagName(selector));\n              return results; // Class selector\n            } else if ((m = match[3]) && context.getElementsByClassName) {\n              push.apply(results, context.getElementsByClassName(m));\n              return results;\n            }\n          } // Take advantage of querySelectorAll\n\n\n          if (!nonnativeSelectorCache[selector + \" \"] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {\n            newSelector = selector;\n            newContext = context; // qSA considers elements outside a scoping root when evaluating child or\n            // descendant combinators, which is not what we want.\n            // In such cases, we work around the behavior by prefixing every selector in the\n            // list with an ID selector referencing the scope context.\n            // The technique has to be used as well when a leading combinator is used\n            // as such selectors are not recognized by querySelectorAll.\n            // Thanks to Andrew Dupont for this technique.\n\n            if (nodeType === 1 && (rdescend.test(selector) || rleadingCombinator.test(selector))) {\n              // Expand context for sibling selectors\n              newContext = rsibling.test(selector) && testContext(context.parentNode) || context; // We can use :scope instead of the ID hack if the browser\n              // supports it & if we're not changing the context.\n              // Support: IE 11+, Edge 17 - 18+\n              // IE/Edge sometimes throw a \"Permission denied\" error when\n              // strict-comparing two documents; shallow comparisons work.\n              // eslint-disable-next-line eqeqeq\n\n              if (newContext != context || !support.scope) {\n                // Capture the context ID, setting it first if necessary\n                if (nid = context.getAttribute(\"id\")) {\n                  nid = jQuery.escapeSelector(nid);\n                } else {\n                  context.setAttribute(\"id\", nid = expando);\n                }\n              } // Prefix every selector in the list\n\n\n              groups = tokenize(selector);\n              i = groups.length;\n\n              while (i--) {\n                groups[i] = (nid ? \"#\" + nid : \":scope\") + \" \" + toSelector(groups[i]);\n              }\n\n              newSelector = groups.join(\",\");\n            }\n\n            try {\n              push.apply(results, newContext.querySelectorAll(newSelector));\n              return results;\n            } catch (qsaError) {\n              nonnativeSelectorCache(selector, true);\n            } finally {\n              if (nid === expando) {\n                context.removeAttribute(\"id\");\n              }\n            }\n          }\n        }\n      } // All others\n\n\n      return select(selector.replace(rtrimCSS, \"$1\"), context, results, seed);\n    }\n    /**\n     * Create key-value caches of limited size\n     * @returns {function(string, object)} Returns the Object data after storing it on itself with\n     *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n     *\tdeleting the oldest entry\n     */\n\n\n    function createCache() {\n      var keys = [];\n\n      function cache(key, value) {\n        // Use (key + \" \") to avoid collision with native prototype properties\n        // (see https://github.com/jquery/sizzle/issues/157)\n        if (keys.push(key + \" \") > Expr.cacheLength) {\n          // Only keep the most recent entries\n          delete cache[keys.shift()];\n        }\n\n        return cache[key + \" \"] = value;\n      }\n\n      return cache;\n    }\n    /**\n     * Mark a function for special use by jQuery selector module\n     * @param {Function} fn The function to mark\n     */\n\n\n    function markFunction(fn) {\n      fn[expando] = true;\n      return fn;\n    }\n    /**\n     * Support testing using an element\n     * @param {Function} fn Passed the created element and returns a boolean result\n     */\n\n\n    function assert(fn) {\n      var el = document.createElement(\"fieldset\");\n\n      try {\n        return !!fn(el);\n      } catch (e) {\n        return false;\n      } finally {\n        // Remove from its parent by default\n        if (el.parentNode) {\n          el.parentNode.removeChild(el);\n        } // release memory in IE\n\n\n        el = null;\n      }\n    }\n    /**\n     * Returns a function to use in pseudos for input types\n     * @param {String} type\n     */\n\n\n    function createInputPseudo(type) {\n      return function (elem) {\n        return nodeName(elem, \"input\") && elem.type === type;\n      };\n    }\n    /**\n     * Returns a function to use in pseudos for buttons\n     * @param {String} type\n     */\n\n\n    function createButtonPseudo(type) {\n      return function (elem) {\n        return (nodeName(elem, \"input\") || nodeName(elem, \"button\")) && elem.type === type;\n      };\n    }\n    /**\n     * Returns a function to use in pseudos for :enabled/:disabled\n     * @param {Boolean} disabled true for :disabled; false for :enabled\n     */\n\n\n    function createDisabledPseudo(disabled) {\n      // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n      return function (elem) {\n        // Only certain elements can match :enabled or :disabled\n        // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n        // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n        if (\"form\" in elem) {\n          // Check for inherited disabledness on relevant non-disabled elements:\n          // * listed form-associated elements in a disabled fieldset\n          //   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n          //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n          // * option elements in a disabled optgroup\n          //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n          // All such elements have a \"form\" property.\n          if (elem.parentNode && elem.disabled === false) {\n            // Option elements defer to a parent optgroup if present\n            if (\"label\" in elem) {\n              if (\"label\" in elem.parentNode) {\n                return elem.parentNode.disabled === disabled;\n              } else {\n                return elem.disabled === disabled;\n              }\n            } // Support: IE 6 - 11+\n            // Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\n\n            return elem.isDisabled === disabled || // Where there is no isDisabled, check manually\n            elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled;\n          }\n\n          return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property.\n          // Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n          // even exist on them, let alone have a boolean value.\n        } else if (\"label\" in elem) {\n          return elem.disabled === disabled;\n        } // Remaining elements are neither :enabled nor :disabled\n\n\n        return false;\n      };\n    }\n    /**\n     * Returns a function to use in pseudos for positionals\n     * @param {Function} fn\n     */\n\n\n    function createPositionalPseudo(fn) {\n      return markFunction(function (argument) {\n        argument = +argument;\n        return markFunction(function (seed, matches) {\n          var j,\n              matchIndexes = fn([], seed.length, argument),\n              i = matchIndexes.length; // Match elements found at the specified indexes\n\n          while (i--) {\n            if (seed[j = matchIndexes[i]]) {\n              seed[j] = !(matches[j] = seed[j]);\n            }\n          }\n        });\n      });\n    }\n    /**\n     * Checks a node for validity as a jQuery selector context\n     * @param {Element|Object=} context\n     * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n     */\n\n\n    function testContext(context) {\n      return context && typeof context.getElementsByTagName !== \"undefined\" && context;\n    }\n    /**\n     * Sets document-related variables once based on the current document\n     * @param {Element|Object} [node] An element or document object to use to set the document\n     * @returns {Object} Returns the current document\n     */\n\n\n    function setDocument(node) {\n      var subWindow,\n          doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected\n      // Support: IE 11+, Edge 17 - 18+\n      // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n      // two documents; shallow comparisons work.\n      // eslint-disable-next-line eqeqeq\n\n      if (doc == document || doc.nodeType !== 9 || !doc.documentElement) {\n        return document;\n      } // Update global variables\n\n\n      document = doc;\n      documentElement = document.documentElement;\n      documentIsHTML = !jQuery.isXMLDoc(document); // Support: iOS 7 only, IE 9 - 11+\n      // Older browsers didn't support unprefixed `matches`.\n\n      matches = documentElement.matches || documentElement.webkitMatchesSelector || documentElement.msMatchesSelector; // Support: IE 9 - 11+, Edge 12 - 18+\n      // Accessing iframe documents after unload throws \"permission denied\" errors\n      // (see trac-13936).\n      // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n      // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\n      if (documentElement.msMatchesSelector && // Support: IE 11+, Edge 17 - 18+\n      // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n      // two documents; shallow comparisons work.\n      // eslint-disable-next-line eqeqeq\n      preferredDoc != document && (subWindow = document.defaultView) && subWindow.top !== subWindow) {\n        // Support: IE 9 - 11+, Edge 12 - 18+\n        subWindow.addEventListener(\"unload\", unloadHandler);\n      } // Support: IE <10\n      // Check if getElementById returns elements by name\n      // The broken getElementById methods don't pick up programmatically-set names,\n      // so use a roundabout getElementsByName test\n\n\n      support.getById = assert(function (el) {\n        documentElement.appendChild(el).id = jQuery.expando;\n        return !document.getElementsByName || !document.getElementsByName(jQuery.expando).length;\n      }); // Support: IE 9 only\n      // Check to see if it's possible to do matchesSelector\n      // on a disconnected node.\n\n      support.disconnectedMatch = assert(function (el) {\n        return matches.call(el, \"*\");\n      }); // Support: IE 9 - 11+, Edge 12 - 18+\n      // IE/Edge don't support the :scope pseudo-class.\n\n      support.scope = assert(function () {\n        return document.querySelectorAll(\":scope\");\n      }); // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n      // Make sure the `:has()` argument is parsed unforgivingly.\n      // We include `*` in the test to detect buggy implementations that are\n      // _selectively_ forgiving (specifically when the list includes at least\n      // one valid selector).\n      // Note that we treat complete lack of support for `:has()` as if it were\n      // spec-compliant support, which is fine because use of `:has()` in such\n      // environments will fail in the qSA path and fall back to jQuery traversal\n      // anyway.\n\n      support.cssHas = assert(function () {\n        try {\n          document.querySelector(\":has(*,:jqfake)\");\n          return false;\n        } catch (e) {\n          return true;\n        }\n      }); // ID filter and find\n\n      if (support.getById) {\n        Expr.filter.ID = function (id) {\n          var attrId = id.replace(runescape, funescape);\n          return function (elem) {\n            return elem.getAttribute(\"id\") === attrId;\n          };\n        };\n\n        Expr.find.ID = function (id, context) {\n          if (typeof context.getElementById !== \"undefined\" && documentIsHTML) {\n            var elem = context.getElementById(id);\n            return elem ? [elem] : [];\n          }\n        };\n      } else {\n        Expr.filter.ID = function (id) {\n          var attrId = id.replace(runescape, funescape);\n          return function (elem) {\n            var node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n            return node && node.value === attrId;\n          };\n        }; // Support: IE 6 - 7 only\n        // getElementById is not reliable as a find shortcut\n\n\n        Expr.find.ID = function (id, context) {\n          if (typeof context.getElementById !== \"undefined\" && documentIsHTML) {\n            var node,\n                i,\n                elems,\n                elem = context.getElementById(id);\n\n            if (elem) {\n              // Verify the id attribute\n              node = elem.getAttributeNode(\"id\");\n\n              if (node && node.value === id) {\n                return [elem];\n              } // Fall back on getElementsByName\n\n\n              elems = context.getElementsByName(id);\n              i = 0;\n\n              while (elem = elems[i++]) {\n                node = elem.getAttributeNode(\"id\");\n\n                if (node && node.value === id) {\n                  return [elem];\n                }\n              }\n            }\n\n            return [];\n          }\n        };\n      } // Tag\n\n\n      Expr.find.TAG = function (tag, context) {\n        if (typeof context.getElementsByTagName !== \"undefined\") {\n          return context.getElementsByTagName(tag); // DocumentFragment nodes don't have gEBTN\n        } else {\n          return context.querySelectorAll(tag);\n        }\n      }; // Class\n\n\n      Expr.find.CLASS = function (className, context) {\n        if (typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML) {\n          return context.getElementsByClassName(className);\n        }\n      };\n      /* QSA/matchesSelector\n      ---------------------------------------------------------------------- */\n      // QSA and matchesSelector support\n\n\n      rbuggyQSA = []; // Build QSA regex\n      // Regex strategy adopted from Diego Perini\n\n      assert(function (el) {\n        var input;\n        documentElement.appendChild(el).innerHTML = \"<a id='\" + expando + \"' href='' disabled='disabled'></a>\" + \"<select id='\" + expando + \"-\\r\\\\' disabled='disabled'>\" + \"<option selected=''></option></select>\"; // Support: iOS <=7 - 8 only\n        // Boolean attributes and \"value\" are not treated correctly in some XML documents\n\n        if (!el.querySelectorAll(\"[selected]\").length) {\n          rbuggyQSA.push(\"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\");\n        } // Support: iOS <=7 - 8 only\n\n\n        if (!el.querySelectorAll(\"[id~=\" + expando + \"-]\").length) {\n          rbuggyQSA.push(\"~=\");\n        } // Support: iOS 8 only\n        // https://bugs.webkit.org/show_bug.cgi?id=136851\n        // In-page `selector#id sibling-combinator selector` fails\n\n\n        if (!el.querySelectorAll(\"a#\" + expando + \"+*\").length) {\n          rbuggyQSA.push(\".#.+[+~]\");\n        } // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n        // In some of the document kinds, these selectors wouldn't work natively.\n        // This is probably OK but for backwards compatibility we want to maintain\n        // handling them through jQuery traversal in jQuery 3.x.\n\n\n        if (!el.querySelectorAll(\":checked\").length) {\n          rbuggyQSA.push(\":checked\");\n        } // Support: Windows 8 Native Apps\n        // The type and name attributes are restricted during .innerHTML assignment\n\n\n        input = document.createElement(\"input\");\n        input.setAttribute(\"type\", \"hidden\");\n        el.appendChild(input).setAttribute(\"name\", \"D\"); // Support: IE 9 - 11+\n        // IE's :disabled selector does not pick up the children of disabled fieldsets\n        // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n        // In some of the document kinds, these selectors wouldn't work natively.\n        // This is probably OK but for backwards compatibility we want to maintain\n        // handling them through jQuery traversal in jQuery 3.x.\n\n        documentElement.appendChild(el).disabled = true;\n\n        if (el.querySelectorAll(\":disabled\").length !== 2) {\n          rbuggyQSA.push(\":enabled\", \":disabled\");\n        } // Support: IE 11+, Edge 15 - 18+\n        // IE 11/Edge don't find elements on a `[name='']` query in some cases.\n        // Adding a temporary attribute to the document before the selection works\n        // around the issue.\n        // Interestingly, IE 10 & older don't seem to have the issue.\n\n\n        input = document.createElement(\"input\");\n        input.setAttribute(\"name\", \"\");\n        el.appendChild(input);\n\n        if (!el.querySelectorAll(\"[name='']\").length) {\n          rbuggyQSA.push(\"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" + whitespace + \"*(?:''|\\\"\\\")\");\n        }\n      });\n\n      if (!support.cssHas) {\n        // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n        // Our regular `try-catch` mechanism fails to detect natively-unsupported\n        // pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n        // in browsers that parse the `:has()` argument as a forgiving selector list.\n        // https://drafts.csswg.org/selectors/#relational now requires the argument\n        // to be parsed unforgivingly, but browsers have not yet fully adjusted.\n        rbuggyQSA.push(\":has\");\n      }\n\n      rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join(\"|\"));\n      /* Sorting\n      ---------------------------------------------------------------------- */\n      // Document order sorting\n\n      sortOrder = function sortOrder(a, b) {\n        // Flag for duplicate removal\n        if (a === b) {\n          hasDuplicate = true;\n          return 0;\n        } // Sort on method existence if only one input has compareDocumentPosition\n\n\n        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\n        if (compare) {\n          return compare;\n        } // Calculate position if both inputs belong to the same document\n        // Support: IE 11+, Edge 17 - 18+\n        // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n        // two documents; shallow comparisons work.\n        // eslint-disable-next-line eqeqeq\n\n\n        compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) : // Otherwise we know they are disconnected\n        1; // Disconnected nodes\n\n        if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {\n          // Choose the first element that is related to our preferred document\n          // Support: IE 11+, Edge 17 - 18+\n          // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n          // two documents; shallow comparisons work.\n          // eslint-disable-next-line eqeqeq\n          if (a === document || a.ownerDocument == preferredDoc && find.contains(preferredDoc, a)) {\n            return -1;\n          } // Support: IE 11+, Edge 17 - 18+\n          // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n          // two documents; shallow comparisons work.\n          // eslint-disable-next-line eqeqeq\n\n\n          if (b === document || b.ownerDocument == preferredDoc && find.contains(preferredDoc, b)) {\n            return 1;\n          } // Maintain original order\n\n\n          return sortInput ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b) : 0;\n        }\n\n        return compare & 4 ? -1 : 1;\n      };\n\n      return document;\n    }\n\n    find.matches = function (expr, elements) {\n      return find(expr, null, null, elements);\n    };\n\n    find.matchesSelector = function (elem, expr) {\n      setDocument(elem);\n\n      if (documentIsHTML && !nonnativeSelectorCache[expr + \" \"] && (!rbuggyQSA || !rbuggyQSA.test(expr))) {\n        try {\n          var ret = matches.call(elem, expr); // IE 9's matchesSelector returns false on disconnected nodes\n\n          if (ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document\n          // fragment in IE 9\n          elem.document && elem.document.nodeType !== 11) {\n            return ret;\n          }\n        } catch (e) {\n          nonnativeSelectorCache(expr, true);\n        }\n      }\n\n      return find(expr, document, null, [elem]).length > 0;\n    };\n\n    find.contains = function (context, elem) {\n      // Set document vars if needed\n      // Support: IE 11+, Edge 17 - 18+\n      // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n      // two documents; shallow comparisons work.\n      // eslint-disable-next-line eqeqeq\n      if ((context.ownerDocument || context) != document) {\n        setDocument(context);\n      }\n\n      return jQuery.contains(context, elem);\n    };\n\n    find.attr = function (elem, name) {\n      // Set document vars if needed\n      // Support: IE 11+, Edge 17 - 18+\n      // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n      // two documents; shallow comparisons work.\n      // eslint-disable-next-line eqeqeq\n      if ((elem.ownerDocument || elem) != document) {\n        setDocument(elem);\n      }\n\n      var fn = Expr.attrHandle[name.toLowerCase()],\n          // Don't get fooled by Object.prototype properties (see trac-13807)\n      val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;\n\n      if (val !== undefined) {\n        return val;\n      }\n\n      return elem.getAttribute(name);\n    };\n\n    find.error = function (msg) {\n      throw new Error(\"Syntax error, unrecognized expression: \" + msg);\n    };\n    /**\n     * Document sorting and removing duplicates\n     * @param {ArrayLike} results\n     */\n\n\n    jQuery.uniqueSort = function (results) {\n      var elem,\n          duplicates = [],\n          j = 0,\n          i = 0; // Unless we *know* we can detect duplicates, assume their presence\n      //\n      // Support: Android <=4.0+\n      // Testing for detecting duplicates is unpredictable so instead assume we can't\n      // depend on duplicate detection in all browsers without a stable sort.\n\n      hasDuplicate = !support.sortStable;\n      sortInput = !support.sortStable && _slice.call(results, 0);\n      sort.call(results, sortOrder);\n\n      if (hasDuplicate) {\n        while (elem = results[i++]) {\n          if (elem === results[i]) {\n            j = duplicates.push(i);\n          }\n        }\n\n        while (j--) {\n          splice.call(results, duplicates[j], 1);\n        }\n      } // Clear input after sorting to release objects\n      // See https://github.com/jquery/sizzle/pull/225\n\n\n      sortInput = null;\n      return results;\n    };\n\n    jQuery.fn.uniqueSort = function () {\n      return this.pushStack(jQuery.uniqueSort(_slice.apply(this)));\n    };\n\n    Expr = jQuery.expr = {\n      // Can be adjusted by the user\n      cacheLength: 50,\n      createPseudo: markFunction,\n      match: matchExpr,\n      attrHandle: {},\n      find: {},\n      relative: {\n        \">\": {\n          dir: \"parentNode\",\n          first: true\n        },\n        \" \": {\n          dir: \"parentNode\"\n        },\n        \"+\": {\n          dir: \"previousSibling\",\n          first: true\n        },\n        \"~\": {\n          dir: \"previousSibling\"\n        }\n      },\n      preFilter: {\n        ATTR: function ATTR(match) {\n          match[1] = match[1].replace(runescape, funescape); // Move the given value to match[3] whether quoted or unquoted\n\n          match[3] = (match[3] || match[4] || match[5] || \"\").replace(runescape, funescape);\n\n          if (match[2] === \"~=\") {\n            match[3] = \" \" + match[3] + \" \";\n          }\n\n          return match.slice(0, 4);\n        },\n        CHILD: function CHILD(match) {\n          /* matches from matchExpr[\"CHILD\"]\n          \t1 type (only|nth|...)\n          \t2 what (child|of-type)\n          \t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n          \t4 xn-component of xn+y argument ([+-]?\\d*n|)\n          \t5 sign of xn-component\n          \t6 x of xn-component\n          \t7 sign of y-component\n          \t8 y of y-component\n          */\n          match[1] = match[1].toLowerCase();\n\n          if (match[1].slice(0, 3) === \"nth\") {\n            // nth-* requires argument\n            if (!match[3]) {\n              find.error(match[0]);\n            } // numeric x and y parameters for Expr.filter.CHILD\n            // remember that false/true cast respectively to 0/1\n\n\n            match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === \"even\" || match[3] === \"odd\"));\n            match[5] = +(match[7] + match[8] || match[3] === \"odd\"); // other types prohibit arguments\n          } else if (match[3]) {\n            find.error(match[0]);\n          }\n\n          return match;\n        },\n        PSEUDO: function PSEUDO(match) {\n          var excess,\n              unquoted = !match[6] && match[2];\n\n          if (matchExpr.CHILD.test(match[0])) {\n            return null;\n          } // Accept quoted arguments as-is\n\n\n          if (match[3]) {\n            match[2] = match[4] || match[5] || \"\"; // Strip excess characters from unquoted arguments\n          } else if (unquoted && rpseudo.test(unquoted) && ( // Get excess from tokenize (recursively)\n          excess = tokenize(unquoted, true)) && ( // advance to the next closing parenthesis\n          excess = unquoted.indexOf(\")\", unquoted.length - excess) - unquoted.length)) {\n            // excess is a negative index\n            match[0] = match[0].slice(0, excess);\n            match[2] = unquoted.slice(0, excess);\n          } // Return only captures needed by the pseudo filter method (type and argument)\n\n\n          return match.slice(0, 3);\n        }\n      },\n      filter: {\n        TAG: function TAG(nodeNameSelector) {\n          var expectedNodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();\n          return nodeNameSelector === \"*\" ? function () {\n            return true;\n          } : function (elem) {\n            return nodeName(elem, expectedNodeName);\n          };\n        },\n        CLASS: function CLASS(className) {\n          var pattern = classCache[className + \" \"];\n          return pattern || (pattern = new RegExp(\"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\")) && classCache(className, function (elem) {\n            return pattern.test(typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\");\n          });\n        },\n        ATTR: function ATTR(name, operator, check) {\n          return function (elem) {\n            var result = find.attr(elem, name);\n\n            if (result == null) {\n              return operator === \"!=\";\n            }\n\n            if (!operator) {\n              return true;\n            }\n\n            result += \"\";\n\n            if (operator === \"=\") {\n              return result === check;\n            }\n\n            if (operator === \"!=\") {\n              return result !== check;\n            }\n\n            if (operator === \"^=\") {\n              return check && result.indexOf(check) === 0;\n            }\n\n            if (operator === \"*=\") {\n              return check && result.indexOf(check) > -1;\n            }\n\n            if (operator === \"$=\") {\n              return check && result.slice(-check.length) === check;\n            }\n\n            if (operator === \"~=\") {\n              return (\" \" + result.replace(rwhitespace, \" \") + \" \").indexOf(check) > -1;\n            }\n\n            if (operator === \"|=\") {\n              return result === check || result.slice(0, check.length + 1) === check + \"-\";\n            }\n\n            return false;\n          };\n        },\n        CHILD: function CHILD(type, what, _argument, first, last) {\n          var simple = type.slice(0, 3) !== \"nth\",\n              forward = type.slice(-4) !== \"last\",\n              ofType = what === \"of-type\";\n          return first === 1 && last === 0 ? // Shortcut for :nth-*(n)\n          function (elem) {\n            return !!elem.parentNode;\n          } : function (elem, _context, xml) {\n            var cache,\n                outerCache,\n                node,\n                nodeIndex,\n                start,\n                dir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n                parent = elem.parentNode,\n                name = ofType && elem.nodeName.toLowerCase(),\n                useCache = !xml && !ofType,\n                diff = false;\n\n            if (parent) {\n              // :(first|last|only)-(child|of-type)\n              if (simple) {\n                while (dir) {\n                  node = elem;\n\n                  while (node = node[dir]) {\n                    if (ofType ? nodeName(node, name) : node.nodeType === 1) {\n                      return false;\n                    }\n                  } // Reverse direction for :only-* (if we haven't yet done so)\n\n\n                  start = dir = type === \"only\" && !start && \"nextSibling\";\n                }\n\n                return true;\n              }\n\n              start = [forward ? parent.firstChild : parent.lastChild]; // non-xml :nth-child(...) stores cache data on `parent`\n\n              if (forward && useCache) {\n                // Seek `elem` from a previously-cached index\n                outerCache = parent[expando] || (parent[expando] = {});\n                cache = outerCache[type] || [];\n                nodeIndex = cache[0] === dirruns && cache[1];\n                diff = nodeIndex && cache[2];\n                node = nodeIndex && parent.childNodes[nodeIndex];\n\n                while (node = ++nodeIndex && node && node[dir] || ( // Fallback to seeking `elem` from the start\n                diff = nodeIndex = 0) || start.pop()) {\n                  // When found, cache indexes on `parent` and break\n                  if (node.nodeType === 1 && ++diff && node === elem) {\n                    outerCache[type] = [dirruns, nodeIndex, diff];\n                    break;\n                  }\n                }\n              } else {\n                // Use previously-cached element index if available\n                if (useCache) {\n                  outerCache = elem[expando] || (elem[expando] = {});\n                  cache = outerCache[type] || [];\n                  nodeIndex = cache[0] === dirruns && cache[1];\n                  diff = nodeIndex;\n                } // xml :nth-child(...)\n                // or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\n\n                if (diff === false) {\n                  // Use the same loop as above to seek `elem` from the start\n                  while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {\n                    if ((ofType ? nodeName(node, name) : node.nodeType === 1) && ++diff) {\n                      // Cache the index of each encountered element\n                      if (useCache) {\n                        outerCache = node[expando] || (node[expando] = {});\n                        outerCache[type] = [dirruns, diff];\n                      }\n\n                      if (node === elem) {\n                        break;\n                      }\n                    }\n                  }\n                }\n              } // Incorporate the offset, then check against cycle size\n\n\n              diff -= last;\n              return diff === first || diff % first === 0 && diff / first >= 0;\n            }\n          };\n        },\n        PSEUDO: function PSEUDO(pseudo, argument) {\n          // pseudo-class names are case-insensitive\n          // https://www.w3.org/TR/selectors/#pseudo-classes\n          // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n          // Remember that setFilters inherits from pseudos\n          var args,\n              fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || find.error(\"unsupported pseudo: \" + pseudo); // The user may use createPseudo to indicate that\n          // arguments are needed to create the filter function\n          // just as jQuery does\n\n          if (fn[expando]) {\n            return fn(argument);\n          } // But maintain support for old signatures\n\n\n          if (fn.length > 1) {\n            args = [pseudo, pseudo, \"\", argument];\n            return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {\n              var idx,\n                  matched = fn(seed, argument),\n                  i = matched.length;\n\n              while (i--) {\n                idx = indexOf.call(seed, matched[i]);\n                seed[idx] = !(matches[idx] = matched[i]);\n              }\n            }) : function (elem) {\n              return fn(elem, 0, args);\n            };\n          }\n\n          return fn;\n        }\n      },\n      pseudos: {\n        // Potentially complex pseudos\n        not: markFunction(function (selector) {\n          // Trim the selector passed to compile\n          // to avoid treating leading and trailing\n          // spaces as combinators\n          var input = [],\n              results = [],\n              matcher = compile(selector.replace(rtrimCSS, \"$1\"));\n          return matcher[expando] ? markFunction(function (seed, matches, _context, xml) {\n            var elem,\n                unmatched = matcher(seed, null, xml, []),\n                i = seed.length; // Match elements unmatched by `matcher`\n\n            while (i--) {\n              if (elem = unmatched[i]) {\n                seed[i] = !(matches[i] = elem);\n              }\n            }\n          }) : function (elem, _context, xml) {\n            input[0] = elem;\n            matcher(input, null, xml, results); // Don't keep the element\n            // (see https://github.com/jquery/sizzle/issues/299)\n\n            input[0] = null;\n            return !results.pop();\n          };\n        }),\n        has: markFunction(function (selector) {\n          return function (elem) {\n            return find(selector, elem).length > 0;\n          };\n        }),\n        contains: markFunction(function (text) {\n          text = text.replace(runescape, funescape);\n          return function (elem) {\n            return (elem.textContent || jQuery.text(elem)).indexOf(text) > -1;\n          };\n        }),\n        // \"Whether an element is represented by a :lang() selector\n        // is based solely on the element's language value\n        // being equal to the identifier C,\n        // or beginning with the identifier C immediately followed by \"-\".\n        // The matching of C against the element's language value is performed case-insensitively.\n        // The identifier C does not have to be a valid language name.\"\n        // https://www.w3.org/TR/selectors/#lang-pseudo\n        lang: markFunction(function (lang) {\n          // lang value must be a valid identifier\n          if (!ridentifier.test(lang || \"\")) {\n            find.error(\"unsupported lang: \" + lang);\n          }\n\n          lang = lang.replace(runescape, funescape).toLowerCase();\n          return function (elem) {\n            var elemLang;\n\n            do {\n              if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) {\n                elemLang = elemLang.toLowerCase();\n                return elemLang === lang || elemLang.indexOf(lang + \"-\") === 0;\n              }\n            } while ((elem = elem.parentNode) && elem.nodeType === 1);\n\n            return false;\n          };\n        }),\n        // Miscellaneous\n        target: function target(elem) {\n          var hash = window.location && window.location.hash;\n          return hash && hash.slice(1) === elem.id;\n        },\n        root: function root(elem) {\n          return elem === documentElement;\n        },\n        focus: function focus(elem) {\n          return elem === safeActiveElement() && document.hasFocus() && !!(elem.type || elem.href || ~elem.tabIndex);\n        },\n        // Boolean properties\n        enabled: createDisabledPseudo(false),\n        disabled: createDisabledPseudo(true),\n        checked: function checked(elem) {\n          // In CSS3, :checked should return both checked and selected elements\n          // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n          return nodeName(elem, \"input\") && !!elem.checked || nodeName(elem, \"option\") && !!elem.selected;\n        },\n        selected: function selected(elem) {\n          // Support: IE <=11+\n          // Accessing the selectedIndex property\n          // forces the browser to treat the default option as\n          // selected when in an optgroup.\n          if (elem.parentNode) {\n            // eslint-disable-next-line no-unused-expressions\n            elem.parentNode.selectedIndex;\n          }\n\n          return elem.selected === true;\n        },\n        // Contents\n        empty: function empty(elem) {\n          // https://www.w3.org/TR/selectors/#empty-pseudo\n          // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n          //   but not by others (comment: 8; processing instruction: 7; etc.)\n          // nodeType < 6 works because attributes (2) do not appear as children\n          for (elem = elem.firstChild; elem; elem = elem.nextSibling) {\n            if (elem.nodeType < 6) {\n              return false;\n            }\n          }\n\n          return true;\n        },\n        parent: function parent(elem) {\n          return !Expr.pseudos.empty(elem);\n        },\n        // Element/input types\n        header: function header(elem) {\n          return rheader.test(elem.nodeName);\n        },\n        input: function input(elem) {\n          return rinputs.test(elem.nodeName);\n        },\n        button: function button(elem) {\n          return nodeName(elem, \"input\") && elem.type === \"button\" || nodeName(elem, \"button\");\n        },\n        text: function text(elem) {\n          var attr;\n          return nodeName(elem, \"input\") && elem.type === \"text\" && ( // Support: IE <10 only\n          // New HTML5 attribute values (e.g., \"search\") appear\n          // with elem.type === \"text\"\n          (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\");\n        },\n        // Position-in-collection\n        first: createPositionalPseudo(function () {\n          return [0];\n        }),\n        last: createPositionalPseudo(function (_matchIndexes, length) {\n          return [length - 1];\n        }),\n        eq: createPositionalPseudo(function (_matchIndexes, length, argument) {\n          return [argument < 0 ? argument + length : argument];\n        }),\n        even: createPositionalPseudo(function (matchIndexes, length) {\n          var i = 0;\n\n          for (; i < length; i += 2) {\n            matchIndexes.push(i);\n          }\n\n          return matchIndexes;\n        }),\n        odd: createPositionalPseudo(function (matchIndexes, length) {\n          var i = 1;\n\n          for (; i < length; i += 2) {\n            matchIndexes.push(i);\n          }\n\n          return matchIndexes;\n        }),\n        lt: createPositionalPseudo(function (matchIndexes, length, argument) {\n          var i;\n\n          if (argument < 0) {\n            i = argument + length;\n          } else if (argument > length) {\n            i = length;\n          } else {\n            i = argument;\n          }\n\n          for (; --i >= 0;) {\n            matchIndexes.push(i);\n          }\n\n          return matchIndexes;\n        }),\n        gt: createPositionalPseudo(function (matchIndexes, length, argument) {\n          var i = argument < 0 ? argument + length : argument;\n\n          for (; ++i < length;) {\n            matchIndexes.push(i);\n          }\n\n          return matchIndexes;\n        })\n      }\n    };\n    Expr.pseudos.nth = Expr.pseudos.eq; // Add button/input type pseudos\n\n    for (i in {\n      radio: true,\n      checkbox: true,\n      file: true,\n      password: true,\n      image: true\n    }) {\n      Expr.pseudos[i] = createInputPseudo(i);\n    }\n\n    for (i in {\n      submit: true,\n      reset: true\n    }) {\n      Expr.pseudos[i] = createButtonPseudo(i);\n    } // Easy API for creating new setFilters\n\n\n    function setFilters() {}\n\n    setFilters.prototype = Expr.filters = Expr.pseudos;\n    Expr.setFilters = new setFilters();\n\n    function tokenize(selector, parseOnly) {\n      var matched,\n          match,\n          tokens,\n          type,\n          soFar,\n          groups,\n          preFilters,\n          cached = tokenCache[selector + \" \"];\n\n      if (cached) {\n        return parseOnly ? 0 : cached.slice(0);\n      }\n\n      soFar = selector;\n      groups = [];\n      preFilters = Expr.preFilter;\n\n      while (soFar) {\n        // Comma and first run\n        if (!matched || (match = rcomma.exec(soFar))) {\n          if (match) {\n            // Don't consume trailing commas as valid\n            soFar = soFar.slice(match[0].length) || soFar;\n          }\n\n          groups.push(tokens = []);\n        }\n\n        matched = false; // Combinators\n\n        if (match = rleadingCombinator.exec(soFar)) {\n          matched = match.shift();\n          tokens.push({\n            value: matched,\n            // Cast descendant combinators to space\n            type: match[0].replace(rtrimCSS, \" \")\n          });\n          soFar = soFar.slice(matched.length);\n        } // Filters\n\n\n        for (type in Expr.filter) {\n          if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {\n            matched = match.shift();\n            tokens.push({\n              value: matched,\n              type: type,\n              matches: match\n            });\n            soFar = soFar.slice(matched.length);\n          }\n        }\n\n        if (!matched) {\n          break;\n        }\n      } // Return the length of the invalid excess\n      // if we're just parsing\n      // Otherwise, throw an error or return tokens\n\n\n      if (parseOnly) {\n        return soFar.length;\n      }\n\n      return soFar ? find.error(selector) : // Cache the tokens\n      tokenCache(selector, groups).slice(0);\n    }\n\n    function toSelector(tokens) {\n      var i = 0,\n          len = tokens.length,\n          selector = \"\";\n\n      for (; i < len; i++) {\n        selector += tokens[i].value;\n      }\n\n      return selector;\n    }\n\n    function addCombinator(matcher, combinator, base) {\n      var dir = combinator.dir,\n          skip = combinator.next,\n          key = skip || dir,\n          checkNonElements = base && key === \"parentNode\",\n          doneName = done++;\n      return combinator.first ? // Check against closest ancestor/preceding element\n      function (elem, context, xml) {\n        while (elem = elem[dir]) {\n          if (elem.nodeType === 1 || checkNonElements) {\n            return matcher(elem, context, xml);\n          }\n        }\n\n        return false;\n      } : // Check against all ancestor/preceding elements\n      function (elem, context, xml) {\n        var oldCache,\n            outerCache,\n            newCache = [dirruns, doneName]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\n        if (xml) {\n          while (elem = elem[dir]) {\n            if (elem.nodeType === 1 || checkNonElements) {\n              if (matcher(elem, context, xml)) {\n                return true;\n              }\n            }\n          }\n        } else {\n          while (elem = elem[dir]) {\n            if (elem.nodeType === 1 || checkNonElements) {\n              outerCache = elem[expando] || (elem[expando] = {});\n\n              if (skip && nodeName(elem, skip)) {\n                elem = elem[dir] || elem;\n              } else if ((oldCache = outerCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {\n                // Assign to newCache so results back-propagate to previous elements\n                return newCache[2] = oldCache[2];\n              } else {\n                // Reuse newcache so results back-propagate to previous elements\n                outerCache[key] = newCache; // A match means we're done; a fail means we have to keep checking\n\n                if (newCache[2] = matcher(elem, context, xml)) {\n                  return true;\n                }\n              }\n            }\n          }\n        }\n\n        return false;\n      };\n    }\n\n    function elementMatcher(matchers) {\n      return matchers.length > 1 ? function (elem, context, xml) {\n        var i = matchers.length;\n\n        while (i--) {\n          if (!matchers[i](elem, context, xml)) {\n            return false;\n          }\n        }\n\n        return true;\n      } : matchers[0];\n    }\n\n    function multipleContexts(selector, contexts, results) {\n      var i = 0,\n          len = contexts.length;\n\n      for (; i < len; i++) {\n        find(selector, contexts[i], results);\n      }\n\n      return results;\n    }\n\n    function condense(unmatched, map, filter, context, xml) {\n      var elem,\n          newUnmatched = [],\n          i = 0,\n          len = unmatched.length,\n          mapped = map != null;\n\n      for (; i < len; i++) {\n        if (elem = unmatched[i]) {\n          if (!filter || filter(elem, context, xml)) {\n            newUnmatched.push(elem);\n\n            if (mapped) {\n              map.push(i);\n            }\n          }\n        }\n      }\n\n      return newUnmatched;\n    }\n\n    function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {\n      if (postFilter && !postFilter[expando]) {\n        postFilter = setMatcher(postFilter);\n      }\n\n      if (postFinder && !postFinder[expando]) {\n        postFinder = setMatcher(postFinder, postSelector);\n      }\n\n      return markFunction(function (seed, results, context, xml) {\n        var temp,\n            i,\n            elem,\n            matcherOut,\n            preMap = [],\n            postMap = [],\n            preexisting = results.length,\n            // Get initial elements from seed or context\n        elems = seed || multipleContexts(selector || \"*\", context.nodeType ? [context] : context, []),\n            // Prefilter to get matcher input, preserving a map for seed-results synchronization\n        matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems;\n\n        if (matcher) {\n          // If we have a postFinder, or filtered seed, or non-seed postFilter\n          // or preexisting results,\n          matcherOut = postFinder || (seed ? preFilter : preexisting || postFilter) ? // ...intermediate processing is necessary\n          [] : // ...otherwise use results directly\n          results; // Find primary matches\n\n          matcher(matcherIn, matcherOut, context, xml);\n        } else {\n          matcherOut = matcherIn;\n        } // Apply postFilter\n\n\n        if (postFilter) {\n          temp = condense(matcherOut, postMap);\n          postFilter(temp, [], context, xml); // Un-match failing elements by moving them back to matcherIn\n\n          i = temp.length;\n\n          while (i--) {\n            if (elem = temp[i]) {\n              matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);\n            }\n          }\n        }\n\n        if (seed) {\n          if (postFinder || preFilter) {\n            if (postFinder) {\n              // Get the final matcherOut by condensing this intermediate into postFinder contexts\n              temp = [];\n              i = matcherOut.length;\n\n              while (i--) {\n                if (elem = matcherOut[i]) {\n                  // Restore matcherIn since elem is not yet a final match\n                  temp.push(matcherIn[i] = elem);\n                }\n              }\n\n              postFinder(null, matcherOut = [], temp, xml);\n            } // Move matched elements from seed to results to keep them synchronized\n\n\n            i = matcherOut.length;\n\n            while (i--) {\n              if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1) {\n                seed[temp] = !(results[temp] = elem);\n              }\n            }\n          } // Add elements to results, through postFinder if defined\n\n        } else {\n          matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);\n\n          if (postFinder) {\n            postFinder(null, results, matcherOut, xml);\n          } else {\n            push.apply(results, matcherOut);\n          }\n        }\n      });\n    }\n\n    function matcherFromTokens(tokens) {\n      var checkContext,\n          matcher,\n          j,\n          len = tokens.length,\n          leadingRelative = Expr.relative[tokens[0].type],\n          implicitRelative = leadingRelative || Expr.relative[\" \"],\n          i = leadingRelative ? 1 : 0,\n          // The foundational matcher ensures that elements are reachable from top-level context(s)\n      matchContext = addCombinator(function (elem) {\n        return elem === checkContext;\n      }, implicitRelative, true),\n          matchAnyContext = addCombinator(function (elem) {\n        return indexOf.call(checkContext, elem) > -1;\n      }, implicitRelative, true),\n          matchers = [function (elem, context, xml) {\n        // Support: IE 11+, Edge 17 - 18+\n        // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n        // two documents; shallow comparisons work.\n        // eslint-disable-next-line eqeqeq\n        var ret = !leadingRelative && (xml || context != outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml)); // Avoid hanging onto element\n        // (see https://github.com/jquery/sizzle/issues/299)\n\n        checkContext = null;\n        return ret;\n      }];\n\n      for (; i < len; i++) {\n        if (matcher = Expr.relative[tokens[i].type]) {\n          matchers = [addCombinator(elementMatcher(matchers), matcher)];\n        } else {\n          matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); // Return special upon seeing a positional matcher\n\n          if (matcher[expando]) {\n            // Find the next relative operator (if any) for proper handling\n            j = ++i;\n\n            for (; j < len; j++) {\n              if (Expr.relative[tokens[j].type]) {\n                break;\n              }\n            }\n\n            return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*`\n            tokens.slice(0, i - 1).concat({\n              value: tokens[i - 2].type === \" \" ? \"*\" : \"\"\n            })).replace(rtrimCSS, \"$1\"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));\n          }\n\n          matchers.push(matcher);\n        }\n      }\n\n      return elementMatcher(matchers);\n    }\n\n    function matcherFromGroupMatchers(elementMatchers, setMatchers) {\n      var bySet = setMatchers.length > 0,\n          byElement = elementMatchers.length > 0,\n          superMatcher = function superMatcher(seed, context, xml, results, outermost) {\n        var elem,\n            j,\n            matcher,\n            matchedCount = 0,\n            i = \"0\",\n            unmatched = seed && [],\n            setMatched = [],\n            contextBackup = outermostContext,\n            // We must always have either seed elements or outermost context\n        elems = seed || byElement && Expr.find.TAG(\"*\", outermost),\n            // Use integer dirruns iff this is the outermost matcher\n        dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,\n            len = elems.length;\n\n        if (outermost) {\n          // Support: IE 11+, Edge 17 - 18+\n          // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n          // two documents; shallow comparisons work.\n          // eslint-disable-next-line eqeqeq\n          outermostContext = context == document || context || outermost;\n        } // Add elements passing elementMatchers directly to results\n        // Support: iOS <=7 - 9 only\n        // Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching\n        // elements by id. (see trac-14142)\n\n\n        for (; i !== len && (elem = elems[i]) != null; i++) {\n          if (byElement && elem) {\n            j = 0; // Support: IE 11+, Edge 17 - 18+\n            // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n            // two documents; shallow comparisons work.\n            // eslint-disable-next-line eqeqeq\n\n            if (!context && elem.ownerDocument != document) {\n              setDocument(elem);\n              xml = !documentIsHTML;\n            }\n\n            while (matcher = elementMatchers[j++]) {\n              if (matcher(elem, context || document, xml)) {\n                push.call(results, elem);\n                break;\n              }\n            }\n\n            if (outermost) {\n              dirruns = dirrunsUnique;\n            }\n          } // Track unmatched elements for set filters\n\n\n          if (bySet) {\n            // They will have gone through all possible matchers\n            if (elem = !matcher && elem) {\n              matchedCount--;\n            } // Lengthen the array for every element, matched or not\n\n\n            if (seed) {\n              unmatched.push(elem);\n            }\n          }\n        } // `i` is now the count of elements visited above, and adding it to `matchedCount`\n        // makes the latter nonnegative.\n\n\n        matchedCount += i; // Apply set filters to unmatched elements\n        // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n        // equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n        // no element matchers and no seed.\n        // Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n        // case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n        // numerically zero.\n\n        if (bySet && i !== matchedCount) {\n          j = 0;\n\n          while (matcher = setMatchers[j++]) {\n            matcher(unmatched, setMatched, context, xml);\n          }\n\n          if (seed) {\n            // Reintegrate element matches to eliminate the need for sorting\n            if (matchedCount > 0) {\n              while (i--) {\n                if (!(unmatched[i] || setMatched[i])) {\n                  setMatched[i] = pop.call(results);\n                }\n              }\n            } // Discard index placeholder values to get only actual matches\n\n\n            setMatched = condense(setMatched);\n          } // Add matches to results\n\n\n          push.apply(results, setMatched); // Seedless set matches succeeding multiple successful matchers stipulate sorting\n\n          if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {\n            jQuery.uniqueSort(results);\n          }\n        } // Override manipulation of globals by nested matchers\n\n\n        if (outermost) {\n          dirruns = dirrunsUnique;\n          outermostContext = contextBackup;\n        }\n\n        return unmatched;\n      };\n\n      return bySet ? markFunction(superMatcher) : superMatcher;\n    }\n\n    function compile(selector, match\n    /* Internal Use Only */\n    ) {\n      var i,\n          setMatchers = [],\n          elementMatchers = [],\n          cached = compilerCache[selector + \" \"];\n\n      if (!cached) {\n        // Generate a function of recursive functions that can be used to check each element\n        if (!match) {\n          match = tokenize(selector);\n        }\n\n        i = match.length;\n\n        while (i--) {\n          cached = matcherFromTokens(match[i]);\n\n          if (cached[expando]) {\n            setMatchers.push(cached);\n          } else {\n            elementMatchers.push(cached);\n          }\n        } // Cache the compiled function\n\n\n        cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); // Save selector and tokenization\n\n        cached.selector = selector;\n      }\n\n      return cached;\n    }\n    /**\n     * A low-level selection function that works with jQuery's compiled\n     *  selector functions\n     * @param {String|Function} selector A selector or a pre-compiled\n     *  selector function built with jQuery selector compile\n     * @param {Element} context\n     * @param {Array} [results]\n     * @param {Array} [seed] A set of elements to match against\n     */\n\n\n    function select(selector, context, results, seed) {\n      var i,\n          tokens,\n          token,\n          type,\n          find,\n          compiled = typeof selector === \"function\" && selector,\n          match = !seed && tokenize(selector = compiled.selector || selector);\n      results = results || []; // Try to minimize operations if there is only one selector in the list and no seed\n      // (the latter of which guarantees us context)\n\n      if (match.length === 1) {\n        // Reduce context if the leading compound selector is an ID\n        tokens = match[0] = match[0].slice(0);\n\n        if (tokens.length > 2 && (token = tokens[0]).type === \"ID\" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {\n          context = (Expr.find.ID(token.matches[0].replace(runescape, funescape), context) || [])[0];\n\n          if (!context) {\n            return results; // Precompiled matchers will still verify ancestry, so step up a level\n          } else if (compiled) {\n            context = context.parentNode;\n          }\n\n          selector = selector.slice(tokens.shift().value.length);\n        } // Fetch a seed set for right-to-left matching\n\n\n        i = matchExpr.needsContext.test(selector) ? 0 : tokens.length;\n\n        while (i--) {\n          token = tokens[i]; // Abort if we hit a combinator\n\n          if (Expr.relative[type = token.type]) {\n            break;\n          }\n\n          if (find = Expr.find[type]) {\n            // Search, expanding context for leading sibling combinators\n            if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {\n              // If seed is empty or no tokens remain, we can return early\n              tokens.splice(i, 1);\n              selector = seed.length && toSelector(tokens);\n\n              if (!selector) {\n                push.apply(results, seed);\n                return results;\n              }\n\n              break;\n            }\n          }\n        }\n      } // Compile and execute a filtering function if one is not provided\n      // Provide `match` to avoid retokenization if we modified the selector above\n\n\n      (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);\n      return results;\n    } // One-time assignments\n    // Support: Android <=4.0 - 4.1+\n    // Sort stability\n\n\n    support.sortStable = expando.split(\"\").sort(sortOrder).join(\"\") === expando; // Initialize against the default document\n\n    setDocument(); // Support: Android <=4.0 - 4.1+\n    // Detached nodes confoundingly follow *each other*\n\n    support.sortDetached = assert(function (el) {\n      // Should return 1, but returns 4 (following)\n      return el.compareDocumentPosition(document.createElement(\"fieldset\")) & 1;\n    });\n    jQuery.find = find; // Deprecated\n\n    jQuery.expr[\":\"] = jQuery.expr.pseudos;\n    jQuery.unique = jQuery.uniqueSort; // These have always been private, but they used to be documented as part of\n    // Sizzle so let's maintain them for now for backwards compatibility purposes.\n\n    find.compile = compile;\n    find.select = select;\n    find.setDocument = setDocument;\n    find.tokenize = tokenize;\n    find.escape = jQuery.escapeSelector;\n    find.getText = jQuery.text;\n    find.isXML = jQuery.isXMLDoc;\n    find.selectors = jQuery.expr;\n    find.support = jQuery.support;\n    find.uniqueSort = jQuery.uniqueSort;\n    /* eslint-enable */\n  })();\n\n  var dir = function dir(elem, _dir, until) {\n    var matched = [],\n        truncate = until !== undefined;\n\n    while ((elem = elem[_dir]) && elem.nodeType !== 9) {\n      if (elem.nodeType === 1) {\n        if (truncate && jQuery(elem).is(until)) {\n          break;\n        }\n\n        matched.push(elem);\n      }\n    }\n\n    return matched;\n  };\n\n  var _siblings = function siblings(n, elem) {\n    var matched = [];\n\n    for (; n; n = n.nextSibling) {\n      if (n.nodeType === 1 && n !== elem) {\n        matched.push(n);\n      }\n    }\n\n    return matched;\n  };\n\n  var rneedsContext = jQuery.expr.match.needsContext;\n  var rsingleTag = /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i; // Implement the identical functionality for filter and not\n\n  function winnow(elements, qualifier, not) {\n    if (isFunction(qualifier)) {\n      return jQuery.grep(elements, function (elem, i) {\n        return !!qualifier.call(elem, i, elem) !== not;\n      });\n    } // Single element\n\n\n    if (qualifier.nodeType) {\n      return jQuery.grep(elements, function (elem) {\n        return elem === qualifier !== not;\n      });\n    } // Arraylike of elements (jQuery, arguments, Array)\n\n\n    if (typeof qualifier !== \"string\") {\n      return jQuery.grep(elements, function (elem) {\n        return indexOf.call(qualifier, elem) > -1 !== not;\n      });\n    } // Filtered directly for both simple and complex selectors\n\n\n    return jQuery.filter(qualifier, elements, not);\n  }\n\n  jQuery.filter = function (expr, elems, not) {\n    var elem = elems[0];\n\n    if (not) {\n      expr = \":not(\" + expr + \")\";\n    }\n\n    if (elems.length === 1 && elem.nodeType === 1) {\n      return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];\n    }\n\n    return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {\n      return elem.nodeType === 1;\n    }));\n  };\n\n  jQuery.fn.extend({\n    find: function find(selector) {\n      var i,\n          ret,\n          len = this.length,\n          self = this;\n\n      if (typeof selector !== \"string\") {\n        return this.pushStack(jQuery(selector).filter(function () {\n          for (i = 0; i < len; i++) {\n            if (jQuery.contains(self[i], this)) {\n              return true;\n            }\n          }\n        }));\n      }\n\n      ret = this.pushStack([]);\n\n      for (i = 0; i < len; i++) {\n        jQuery.find(selector, self[i], ret);\n      }\n\n      return len > 1 ? jQuery.uniqueSort(ret) : ret;\n    },\n    filter: function filter(selector) {\n      return this.pushStack(winnow(this, selector || [], false));\n    },\n    not: function not(selector) {\n      return this.pushStack(winnow(this, selector || [], true));\n    },\n    is: function is(selector) {\n      return !!winnow(this, // If this is a positional/relative selector, check membership in the returned set\n      // so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n      typeof selector === \"string\" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;\n    }\n  }); // Initialize a jQuery object\n  // A central reference to the root jQuery(document)\n\n  var rootjQuery,\n      // A simple way to check for HTML strings\n  // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n  // Strict HTML recognition (trac-11290: must start with <)\n  // Shortcut simple #id case for speed\n  rquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n      init = jQuery.fn.init = function (selector, context, root) {\n    var match, elem; // HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\n    if (!selector) {\n      return this;\n    } // Method init() accepts an alternate rootjQuery\n    // so migrate can support jQuery.sub (gh-2101)\n\n\n    root = root || rootjQuery; // Handle HTML strings\n\n    if (typeof selector === \"string\") {\n      if (selector[0] === \"<\" && selector[selector.length - 1] === \">\" && selector.length >= 3) {\n        // Assume that strings that start and end with <> are HTML and skip the regex check\n        match = [null, selector, null];\n      } else {\n        match = rquickExpr.exec(selector);\n      } // Match html or make sure no context is specified for #id\n\n\n      if (match && (match[1] || !context)) {\n        // HANDLE: $(html) -> $(array)\n        if (match[1]) {\n          context = context instanceof jQuery ? context[0] : context; // Option to run scripts is true for back-compat\n          // Intentionally let the error be thrown if parseHTML is not present\n\n          jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true)); // HANDLE: $(html, props)\n\n          if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {\n            for (match in context) {\n              // Properties of context are called as methods if possible\n              if (isFunction(this[match])) {\n                this[match](context[match]); // ...and otherwise set as attributes\n              } else {\n                this.attr(match, context[match]);\n              }\n            }\n          }\n\n          return this; // HANDLE: $(#id)\n        } else {\n          elem = document.getElementById(match[2]);\n\n          if (elem) {\n            // Inject the element directly into the jQuery object\n            this[0] = elem;\n            this.length = 1;\n          }\n\n          return this;\n        } // HANDLE: $(expr, $(...))\n\n      } else if (!context || context.jquery) {\n        return (context || root).find(selector); // HANDLE: $(expr, context)\n        // (which is just equivalent to: $(context).find(expr)\n      } else {\n        return this.constructor(context).find(selector);\n      } // HANDLE: $(DOMElement)\n\n    } else if (selector.nodeType) {\n      this[0] = selector;\n      this.length = 1;\n      return this; // HANDLE: $(function)\n      // Shortcut for document ready\n    } else if (isFunction(selector)) {\n      return root.ready !== undefined ? root.ready(selector) : // Execute immediately if ready is not present\n      selector(jQuery);\n    }\n\n    return jQuery.makeArray(selector, this);\n  }; // Give the init function the jQuery prototype for later instantiation\n\n\n  init.prototype = jQuery.fn; // Initialize central reference\n\n  rootjQuery = jQuery(document);\n  var rparentsprev = /^(?:parents|prev(?:Until|All))/,\n      // Methods guaranteed to produce a unique set when starting from a unique set\n  guaranteedUnique = {\n    children: true,\n    contents: true,\n    next: true,\n    prev: true\n  };\n  jQuery.fn.extend({\n    has: function has(target) {\n      var targets = jQuery(target, this),\n          l = targets.length;\n      return this.filter(function () {\n        var i = 0;\n\n        for (; i < l; i++) {\n          if (jQuery.contains(this, targets[i])) {\n            return true;\n          }\n        }\n      });\n    },\n    closest: function closest(selectors, context) {\n      var cur,\n          i = 0,\n          l = this.length,\n          matched = [],\n          targets = typeof selectors !== \"string\" && jQuery(selectors); // Positional selectors never match, since there's no _selection_ context\n\n      if (!rneedsContext.test(selectors)) {\n        for (; i < l; i++) {\n          for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {\n            // Always skip document fragments\n            if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : // Don't pass non-elements to jQuery#find\n            cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {\n              matched.push(cur);\n              break;\n            }\n          }\n        }\n      }\n\n      return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);\n    },\n    // Determine the position of an element within the set\n    index: function index(elem) {\n      // No argument, return index in parent\n      if (!elem) {\n        return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;\n      } // Index in selector\n\n\n      if (typeof elem === \"string\") {\n        return indexOf.call(jQuery(elem), this[0]);\n      } // Locate the position of the desired element\n\n\n      return indexOf.call(this, // If it receives a jQuery object, the first element is used\n      elem.jquery ? elem[0] : elem);\n    },\n    add: function add(selector, context) {\n      return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));\n    },\n    addBack: function addBack(selector) {\n      return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));\n    }\n  });\n\n  function sibling(cur, dir) {\n    while ((cur = cur[dir]) && cur.nodeType !== 1) {}\n\n    return cur;\n  }\n\n  jQuery.each({\n    parent: function parent(elem) {\n      var parent = elem.parentNode;\n      return parent && parent.nodeType !== 11 ? parent : null;\n    },\n    parents: function parents(elem) {\n      return dir(elem, \"parentNode\");\n    },\n    parentsUntil: function parentsUntil(elem, _i, until) {\n      return dir(elem, \"parentNode\", until);\n    },\n    next: function next(elem) {\n      return sibling(elem, \"nextSibling\");\n    },\n    prev: function prev(elem) {\n      return sibling(elem, \"previousSibling\");\n    },\n    nextAll: function nextAll(elem) {\n      return dir(elem, \"nextSibling\");\n    },\n    prevAll: function prevAll(elem) {\n      return dir(elem, \"previousSibling\");\n    },\n    nextUntil: function nextUntil(elem, _i, until) {\n      return dir(elem, \"nextSibling\", until);\n    },\n    prevUntil: function prevUntil(elem, _i, until) {\n      return dir(elem, \"previousSibling\", until);\n    },\n    siblings: function siblings(elem) {\n      return _siblings((elem.parentNode || {}).firstChild, elem);\n    },\n    children: function children(elem) {\n      return _siblings(elem.firstChild);\n    },\n    contents: function contents(elem) {\n      if (elem.contentDocument != null && // Support: IE 11+\n      // <object> elements with no `data` attribute has an object\n      // `contentDocument` with a `null` prototype.\n      getProto(elem.contentDocument)) {\n        return elem.contentDocument;\n      } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n      // Treat the template element as a regular one in browsers that\n      // don't support it.\n\n\n      if (nodeName(elem, \"template\")) {\n        elem = elem.content || elem;\n      }\n\n      return jQuery.merge([], elem.childNodes);\n    }\n  }, function (name, fn) {\n    jQuery.fn[name] = function (until, selector) {\n      var matched = jQuery.map(this, fn, until);\n\n      if (name.slice(-5) !== \"Until\") {\n        selector = until;\n      }\n\n      if (selector && typeof selector === \"string\") {\n        matched = jQuery.filter(selector, matched);\n      }\n\n      if (this.length > 1) {\n        // Remove duplicates\n        if (!guaranteedUnique[name]) {\n          jQuery.uniqueSort(matched);\n        } // Reverse order for parents* and prev-derivatives\n\n\n        if (rparentsprev.test(name)) {\n          matched.reverse();\n        }\n      }\n\n      return this.pushStack(matched);\n    };\n  });\n  var rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g; // Convert String-formatted options into Object-formatted ones\n\n  function createOptions(options) {\n    var object = {};\n    jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) {\n      object[flag] = true;\n    });\n    return object;\n  }\n  /*\n   * Create a callback list using the following parameters:\n   *\n   *\toptions: an optional list of space-separated options that will change how\n   *\t\t\tthe callback list behaves or a more traditional option object\n   *\n   * By default a callback list will act like an event callback list and can be\n   * \"fired\" multiple times.\n   *\n   * Possible options:\n   *\n   *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n   *\n   *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n   *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n   *\t\t\t\t\tvalues (like a Deferred)\n   *\n   *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n   *\n   *\tstopOnFalse:\tinterrupt callings when a callback returns false\n   *\n   */\n\n\n  jQuery.Callbacks = function (options) {\n    // Convert options from String-formatted to Object-formatted if needed\n    // (we check in cache first)\n    options = typeof options === \"string\" ? createOptions(options) : jQuery.extend({}, options);\n\n    var // Flag to know if list is currently firing\n    firing,\n        // Last fire value for non-forgettable lists\n    memory,\n        // Flag to know if list was already fired\n    _fired,\n        // Flag to prevent firing\n    _locked,\n        // Actual callback list\n    list = [],\n        // Queue of execution data for repeatable lists\n    queue = [],\n        // Index of currently firing callback (modified by add/remove as needed)\n    firingIndex = -1,\n        // Fire callbacks\n    fire = function fire() {\n      // Enforce single-firing\n      _locked = _locked || options.once; // Execute callbacks for all pending executions,\n      // respecting firingIndex overrides and runtime changes\n\n      _fired = firing = true;\n\n      for (; queue.length; firingIndex = -1) {\n        memory = queue.shift();\n\n        while (++firingIndex < list.length) {\n          // Run callback and check for early termination\n          if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {\n            // Jump to end and forget the data so .add doesn't re-fire\n            firingIndex = list.length;\n            memory = false;\n          }\n        }\n      } // Forget the data if we're done with it\n\n\n      if (!options.memory) {\n        memory = false;\n      }\n\n      firing = false; // Clean up if we're done firing for good\n\n      if (_locked) {\n        // Keep an empty list if we have data for future add calls\n        if (memory) {\n          list = []; // Otherwise, this object is spent\n        } else {\n          list = \"\";\n        }\n      }\n    },\n        // Actual Callbacks object\n    self = {\n      // Add a callback or a collection of callbacks to the list\n      add: function add() {\n        if (list) {\n          // If we have memory from a past run, we should fire after adding\n          if (memory && !firing) {\n            firingIndex = list.length - 1;\n            queue.push(memory);\n          }\n\n          (function add(args) {\n            jQuery.each(args, function (_, arg) {\n              if (isFunction(arg)) {\n                if (!options.unique || !self.has(arg)) {\n                  list.push(arg);\n                }\n              } else if (arg && arg.length && toType(arg) !== \"string\") {\n                // Inspect recursively\n                add(arg);\n              }\n            });\n          })(arguments);\n\n          if (memory && !firing) {\n            fire();\n          }\n        }\n\n        return this;\n      },\n      // Remove a callback from the list\n      remove: function remove() {\n        jQuery.each(arguments, function (_, arg) {\n          var index;\n\n          while ((index = jQuery.inArray(arg, list, index)) > -1) {\n            list.splice(index, 1); // Handle firing indexes\n\n            if (index <= firingIndex) {\n              firingIndex--;\n            }\n          }\n        });\n        return this;\n      },\n      // Check if a given callback is in the list.\n      // If no argument is given, return whether or not list has callbacks attached.\n      has: function has(fn) {\n        return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;\n      },\n      // Remove all callbacks from the list\n      empty: function empty() {\n        if (list) {\n          list = [];\n        }\n\n        return this;\n      },\n      // Disable .fire and .add\n      // Abort any current/pending executions\n      // Clear all callbacks and values\n      disable: function disable() {\n        _locked = queue = [];\n        list = memory = \"\";\n        return this;\n      },\n      disabled: function disabled() {\n        return !list;\n      },\n      // Disable .fire\n      // Also disable .add unless we have memory (since it would have no effect)\n      // Abort any pending executions\n      lock: function lock() {\n        _locked = queue = [];\n\n        if (!memory && !firing) {\n          list = memory = \"\";\n        }\n\n        return this;\n      },\n      locked: function locked() {\n        return !!_locked;\n      },\n      // Call all callbacks with the given context and arguments\n      fireWith: function fireWith(context, args) {\n        if (!_locked) {\n          args = args || [];\n          args = [context, args.slice ? args.slice() : args];\n          queue.push(args);\n\n          if (!firing) {\n            fire();\n          }\n        }\n\n        return this;\n      },\n      // Call all the callbacks with the given arguments\n      fire: function fire() {\n        self.fireWith(this, arguments);\n        return this;\n      },\n      // To know if the callbacks have already been called at least once\n      fired: function fired() {\n        return !!_fired;\n      }\n    };\n\n    return self;\n  };\n\n  function Identity(v) {\n    return v;\n  }\n\n  function Thrower(ex) {\n    throw ex;\n  }\n\n  function adoptValue(value, resolve, reject, noValue) {\n    var method;\n\n    try {\n      // Check for promise aspect first to privilege synchronous behavior\n      if (value && isFunction(method = value.promise)) {\n        method.call(value).done(resolve).fail(reject); // Other thenables\n      } else if (value && isFunction(method = value.then)) {\n        method.call(value, resolve, reject); // Other non-thenables\n      } else {\n        // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n        // * false: [ value ].slice( 0 ) => resolve( value )\n        // * true: [ value ].slice( 1 ) => resolve()\n        resolve.apply(undefined, [value].slice(noValue));\n      } // For Promises/A+, convert exceptions into rejections\n      // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n      // Deferred#then to conditionally suppress rejection.\n\n    } catch (value) {\n      // Support: Android 4.0 only\n      // Strict mode functions invoked without .call/.apply get global-object context\n      reject.apply(undefined, [value]);\n    }\n  }\n\n  jQuery.extend({\n    Deferred: function Deferred(func) {\n      var tuples = [// action, add listener, callbacks,\n      // ... .then handlers, argument index, [final state]\n      [\"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\"]],\n          _state = \"pending\",\n          _promise = {\n        state: function state() {\n          return _state;\n        },\n        always: function always() {\n          deferred.done(arguments).fail(arguments);\n          return this;\n        },\n        \"catch\": function _catch(fn) {\n          return _promise.then(null, fn);\n        },\n        // Keep pipe for back-compat\n        pipe: function\n          /* fnDone, fnFail, fnProgress */\n        pipe() {\n          var fns = arguments;\n          return jQuery.Deferred(function (newDefer) {\n            jQuery.each(tuples, function (_i, tuple) {\n              // Map tuples (progress, done, fail) to arguments (done, fail, progress)\n              var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]]; // deferred.progress(function() { bind to newDefer or newDefer.notify })\n              // deferred.done(function() { bind to newDefer or newDefer.resolve })\n              // deferred.fail(function() { bind to newDefer or newDefer.reject })\n\n              deferred[tuple[1]](function () {\n                var returned = fn && fn.apply(this, arguments);\n\n                if (returned && isFunction(returned.promise)) {\n                  returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);\n                } else {\n                  newDefer[tuple[0] + \"With\"](this, fn ? [returned] : arguments);\n                }\n              });\n            });\n            fns = null;\n          }).promise();\n        },\n        then: function then(onFulfilled, onRejected, onProgress) {\n          var maxDepth = 0;\n\n          function resolve(depth, deferred, handler, special) {\n            return function () {\n              var that = this,\n                  args = arguments,\n                  mightThrow = function mightThrow() {\n                var returned, then; // Support: Promises/A+ section 2.3.3.3.3\n                // https://promisesaplus.com/#point-59\n                // Ignore double-resolution attempts\n\n                if (depth < maxDepth) {\n                  return;\n                }\n\n                returned = handler.apply(that, args); // Support: Promises/A+ section 2.3.1\n                // https://promisesaplus.com/#point-48\n\n                if (returned === deferred.promise()) {\n                  throw new TypeError(\"Thenable self-resolution\");\n                } // Support: Promises/A+ sections 2.3.3.1, 3.5\n                // https://promisesaplus.com/#point-54\n                // https://promisesaplus.com/#point-75\n                // Retrieve `then` only once\n\n\n                then = returned && ( // Support: Promises/A+ section 2.3.4\n                // https://promisesaplus.com/#point-64\n                // Only check objects and functions for thenability\n                _typeof(returned) === \"object\" || typeof returned === \"function\") && returned.then; // Handle a returned thenable\n\n                if (isFunction(then)) {\n                  // Special processors (notify) just wait for resolution\n                  if (special) {\n                    then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special)); // Normal processors (resolve) also hook into progress\n                  } else {\n                    // ...and disregard older resolution values\n                    maxDepth++;\n                    then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special), resolve(maxDepth, deferred, Identity, deferred.notifyWith));\n                  } // Handle all other returned values\n\n                } else {\n                  // Only substitute handlers pass on context\n                  // and multiple values (non-spec behavior)\n                  if (handler !== Identity) {\n                    that = undefined;\n                    args = [returned];\n                  } // Process the value(s)\n                  // Default process is resolve\n\n\n                  (special || deferred.resolveWith)(that, args);\n                }\n              },\n                  // Only normal processors (resolve) catch and reject exceptions\n              process = special ? mightThrow : function () {\n                try {\n                  mightThrow();\n                } catch (e) {\n                  if (jQuery.Deferred.exceptionHook) {\n                    jQuery.Deferred.exceptionHook(e, process.error);\n                  } // Support: Promises/A+ section 2.3.3.3.4.1\n                  // https://promisesaplus.com/#point-61\n                  // Ignore post-resolution exceptions\n\n\n                  if (depth + 1 >= maxDepth) {\n                    // Only substitute handlers pass on context\n                    // and multiple values (non-spec behavior)\n                    if (handler !== Thrower) {\n                      that = undefined;\n                      args = [e];\n                    }\n\n                    deferred.rejectWith(that, args);\n                  }\n                }\n              }; // Support: Promises/A+ section 2.3.3.3.1\n              // https://promisesaplus.com/#point-57\n              // Re-resolve promises immediately to dodge false rejection from\n              // subsequent errors\n\n\n              if (depth) {\n                process();\n              } else {\n                // Call an optional hook to record the error, in case of exception\n                // since it's otherwise lost when execution goes async\n                if (jQuery.Deferred.getErrorHook) {\n                  process.error = jQuery.Deferred.getErrorHook(); // The deprecated alias of the above. While the name suggests\n                  // returning the stack, not an error instance, jQuery just passes\n                  // it directly to `console.warn` so both will work; an instance\n                  // just better cooperates with source maps.\n                } else if (jQuery.Deferred.getStackHook) {\n                  process.error = jQuery.Deferred.getStackHook();\n                }\n\n                window.setTimeout(process);\n              }\n            };\n          }\n\n          return jQuery.Deferred(function (newDefer) {\n            // progress_handlers.add( ... )\n            tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith)); // fulfilled_handlers.add( ... )\n\n            tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity)); // rejected_handlers.add( ... )\n\n            tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower));\n          }).promise();\n        },\n        // Get a promise for this deferred\n        // If obj is provided, the promise aspect is added to the object\n        promise: function promise(obj) {\n          return obj != null ? jQuery.extend(obj, _promise) : _promise;\n        }\n      },\n          deferred = {}; // Add list-specific methods\n\n      jQuery.each(tuples, function (i, tuple) {\n        var list = tuple[2],\n            stateString = tuple[5]; // promise.progress = list.add\n        // promise.done = list.add\n        // promise.fail = list.add\n\n        _promise[tuple[1]] = list.add; // Handle state\n\n        if (stateString) {\n          list.add(function () {\n            // state = \"resolved\" (i.e., fulfilled)\n            // state = \"rejected\"\n            _state = stateString;\n          }, // rejected_callbacks.disable\n          // fulfilled_callbacks.disable\n          tuples[3 - i][2].disable, // rejected_handlers.disable\n          // fulfilled_handlers.disable\n          tuples[3 - i][3].disable, // progress_callbacks.lock\n          tuples[0][2].lock, // progress_handlers.lock\n          tuples[0][3].lock);\n        } // progress_handlers.fire\n        // fulfilled_handlers.fire\n        // rejected_handlers.fire\n\n\n        list.add(tuple[3].fire); // deferred.notify = function() { deferred.notifyWith(...) }\n        // deferred.resolve = function() { deferred.resolveWith(...) }\n        // deferred.reject = function() { deferred.rejectWith(...) }\n\n        deferred[tuple[0]] = function () {\n          deferred[tuple[0] + \"With\"](this === deferred ? undefined : this, arguments);\n          return this;\n        }; // deferred.notifyWith = list.fireWith\n        // deferred.resolveWith = list.fireWith\n        // deferred.rejectWith = list.fireWith\n\n\n        deferred[tuple[0] + \"With\"] = list.fireWith;\n      }); // Make the deferred a promise\n\n      _promise.promise(deferred); // Call given func if any\n\n\n      if (func) {\n        func.call(deferred, deferred);\n      } // All done!\n\n\n      return deferred;\n    },\n    // Deferred helper\n    when: function when(singleValue) {\n      var // count of uncompleted subordinates\n      remaining = arguments.length,\n          // count of unprocessed arguments\n      i = remaining,\n          // subordinate fulfillment data\n      resolveContexts = Array(i),\n          resolveValues = _slice.call(arguments),\n          // the primary Deferred\n      primary = jQuery.Deferred(),\n          // subordinate callback factory\n      updateFunc = function updateFunc(i) {\n        return function (value) {\n          resolveContexts[i] = this;\n          resolveValues[i] = arguments.length > 1 ? _slice.call(arguments) : value;\n\n          if (! --remaining) {\n            primary.resolveWith(resolveContexts, resolveValues);\n          }\n        };\n      }; // Single- and empty arguments are adopted like Promise.resolve\n\n\n      if (remaining <= 1) {\n        adoptValue(singleValue, primary.done(updateFunc(i)).resolve, primary.reject, !remaining); // Use .then() to unwrap secondary thenables (cf. gh-3000)\n\n        if (primary.state() === \"pending\" || isFunction(resolveValues[i] && resolveValues[i].then)) {\n          return primary.then();\n        }\n      } // Multiple arguments are aggregated like Promise.all array elements\n\n\n      while (i--) {\n        adoptValue(resolveValues[i], updateFunc(i), primary.reject);\n      }\n\n      return primary.promise();\n    }\n  }); // These usually indicate a programmer mistake during development,\n  // warn about them ASAP rather than swallowing them by default.\n\n  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n  // captured before the async barrier to get the original error cause\n  // which may otherwise be hidden.\n\n  jQuery.Deferred.exceptionHook = function (error, asyncError) {\n    // Support: IE 8 - 9 only\n    // Console exists when dev tools are open, which can happen at any time\n    if (window.console && window.console.warn && error && rerrorNames.test(error.name)) {\n      window.console.warn(\"jQuery.Deferred exception: \" + error.message, error.stack, asyncError);\n    }\n  };\n\n  jQuery.readyException = function (error) {\n    window.setTimeout(function () {\n      throw error;\n    });\n  }; // The deferred used on DOM ready\n\n\n  var readyList = jQuery.Deferred();\n\n  jQuery.fn.ready = function (fn) {\n    readyList.then(fn) // Wrap jQuery.readyException in a function so that the lookup\n    // happens at the time of error handling instead of callback\n    // registration.\n    [\"catch\"](function (error) {\n      jQuery.readyException(error);\n    });\n    return this;\n  };\n\n  jQuery.extend({\n    // Is the DOM ready to be used? Set to true once it occurs.\n    isReady: false,\n    // A counter to track how many items to wait for before\n    // the ready event fires. See trac-6781\n    readyWait: 1,\n    // Handle when the DOM is ready\n    ready: function ready(wait) {\n      // Abort if there are pending holds or we're already ready\n      if (wait === true ? --jQuery.readyWait : jQuery.isReady) {\n        return;\n      } // Remember that the DOM is ready\n\n\n      jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be\n\n      if (wait !== true && --jQuery.readyWait > 0) {\n        return;\n      } // If there are functions bound, to execute\n\n\n      readyList.resolveWith(document, [jQuery]);\n    }\n  });\n  jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method\n\n  function completed() {\n    document.removeEventListener(\"DOMContentLoaded\", completed);\n    window.removeEventListener(\"load\", completed);\n    jQuery.ready();\n  } // Catch cases where $(document).ready() is called\n  // after the browser event has already occurred.\n  // Support: IE <=9 - 10 only\n  // Older IE sometimes signals \"interactive\" too soon\n\n\n  if (document.readyState === \"complete\" || document.readyState !== \"loading\" && !document.documentElement.doScroll) {\n    // Handle it asynchronously to allow scripts the opportunity to delay ready\n    window.setTimeout(jQuery.ready);\n  } else {\n    // Use the handy event callback\n    document.addEventListener(\"DOMContentLoaded\", completed); // A fallback to window.onload, that will always work\n\n    window.addEventListener(\"load\", completed);\n  } // Multifunctional method to get and set values of a collection\n  // The value/s can optionally be executed if it's a function\n\n\n  var access = function access(elems, fn, key, value, chainable, emptyGet, raw) {\n    var i = 0,\n        len = elems.length,\n        bulk = key == null; // Sets many values\n\n    if (toType(key) === \"object\") {\n      chainable = true;\n\n      for (i in key) {\n        access(elems, fn, i, key[i], true, emptyGet, raw);\n      } // Sets one value\n\n    } else if (value !== undefined) {\n      chainable = true;\n\n      if (!isFunction(value)) {\n        raw = true;\n      }\n\n      if (bulk) {\n        // Bulk operations run against the entire set\n        if (raw) {\n          fn.call(elems, value);\n          fn = null; // ...except when executing function values\n        } else {\n          bulk = fn;\n\n          fn = function fn(elem, _key, value) {\n            return bulk.call(jQuery(elem), value);\n          };\n        }\n      }\n\n      if (fn) {\n        for (; i < len; i++) {\n          fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));\n        }\n      }\n    }\n\n    if (chainable) {\n      return elems;\n    } // Gets\n\n\n    if (bulk) {\n      return fn.call(elems);\n    }\n\n    return len ? fn(elems[0], key) : emptyGet;\n  }; // Matches dashed string for camelizing\n\n\n  var rmsPrefix = /^-ms-/,\n      rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace()\n\n  function fcamelCase(_all, letter) {\n    return letter.toUpperCase();\n  } // Convert dashed to camelCase; used by the css and data modules\n  // Support: IE <=9 - 11, Edge 12 - 15\n  // Microsoft forgot to hump their vendor prefix (trac-9572)\n\n\n  function camelCase(string) {\n    return string.replace(rmsPrefix, \"ms-\").replace(rdashAlpha, fcamelCase);\n  }\n\n  var acceptData = function acceptData(owner) {\n    // Accepts only:\n    //  - Node\n    //    - Node.ELEMENT_NODE\n    //    - Node.DOCUMENT_NODE\n    //  - Object\n    //    - Any\n    return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;\n  };\n\n  function Data() {\n    this.expando = jQuery.expando + Data.uid++;\n  }\n\n  Data.uid = 1;\n  Data.prototype = {\n    cache: function cache(owner) {\n      // Check if the owner object already has a cache\n      var value = owner[this.expando]; // If not, create one\n\n      if (!value) {\n        value = {}; // We can accept data for non-element nodes in modern browsers,\n        // but we should not, see trac-8335.\n        // Always return an empty object.\n\n        if (acceptData(owner)) {\n          // If it is a node unlikely to be stringify-ed or looped over\n          // use plain assignment\n          if (owner.nodeType) {\n            owner[this.expando] = value; // Otherwise secure it in a non-enumerable property\n            // configurable must be true to allow the property to be\n            // deleted when data is removed\n          } else {\n            Object.defineProperty(owner, this.expando, {\n              value: value,\n              configurable: true\n            });\n          }\n        }\n      }\n\n      return value;\n    },\n    set: function set(owner, data, value) {\n      var prop,\n          cache = this.cache(owner); // Handle: [ owner, key, value ] args\n      // Always use camelCase key (gh-2257)\n\n      if (typeof data === \"string\") {\n        cache[camelCase(data)] = value; // Handle: [ owner, { properties } ] args\n      } else {\n        // Copy the properties one-by-one to the cache object\n        for (prop in data) {\n          cache[camelCase(prop)] = data[prop];\n        }\n      }\n\n      return cache;\n    },\n    get: function get(owner, key) {\n      return key === undefined ? this.cache(owner) : // Always use camelCase key (gh-2257)\n      owner[this.expando] && owner[this.expando][camelCase(key)];\n    },\n    access: function access(owner, key, value) {\n      // In cases where either:\n      //\n      //   1. No key was specified\n      //   2. A string key was specified, but no value provided\n      //\n      // Take the \"read\" path and allow the get method to determine\n      // which value to return, respectively either:\n      //\n      //   1. The entire cache object\n      //   2. The data stored at the key\n      //\n      if (key === undefined || key && typeof key === \"string\" && value === undefined) {\n        return this.get(owner, key);\n      } // When the key is not a string, or both a key and value\n      // are specified, set or extend (existing objects) with either:\n      //\n      //   1. An object of properties\n      //   2. A key and value\n      //\n\n\n      this.set(owner, key, value); // Since the \"set\" path can have two possible entry points\n      // return the expected data based on which path was taken[*]\n\n      return value !== undefined ? value : key;\n    },\n    remove: function remove(owner, key) {\n      var i,\n          cache = owner[this.expando];\n\n      if (cache === undefined) {\n        return;\n      }\n\n      if (key !== undefined) {\n        // Support array or space separated string of keys\n        if (Array.isArray(key)) {\n          // If key is an array of keys...\n          // We always set camelCase keys, so remove that.\n          key = key.map(camelCase);\n        } else {\n          key = camelCase(key); // If a key with the spaces exists, use it.\n          // Otherwise, create an array by matching non-whitespace\n\n          key = key in cache ? [key] : key.match(rnothtmlwhite) || [];\n        }\n\n        i = key.length;\n\n        while (i--) {\n          delete cache[key[i]];\n        }\n      } // Remove the expando if there's no more data\n\n\n      if (key === undefined || jQuery.isEmptyObject(cache)) {\n        // Support: Chrome <=35 - 45\n        // Webkit & Blink performance suffers when deleting properties\n        // from DOM nodes, so set to undefined instead\n        // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n        if (owner.nodeType) {\n          owner[this.expando] = undefined;\n        } else {\n          delete owner[this.expando];\n        }\n      }\n    },\n    hasData: function hasData(owner) {\n      var cache = owner[this.expando];\n      return cache !== undefined && !jQuery.isEmptyObject(cache);\n    }\n  };\n  var dataPriv = new Data();\n  var dataUser = new Data(); //\tImplementation Summary\n  //\n  //\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n  //\t2. Improve the module's maintainability by reducing the storage\n  //\t\tpaths to a single mechanism.\n  //\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n  //\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n  //\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n  //\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\n  var rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n      rmultiDash = /[A-Z]/g;\n\n  function getData(data) {\n    if (data === \"true\") {\n      return true;\n    }\n\n    if (data === \"false\") {\n      return false;\n    }\n\n    if (data === \"null\") {\n      return null;\n    } // Only convert to a number if it doesn't change the string\n\n\n    if (data === +data + \"\") {\n      return +data;\n    }\n\n    if (rbrace.test(data)) {\n      return JSON.parse(data);\n    }\n\n    return data;\n  }\n\n  function dataAttr(elem, key, data) {\n    var name; // If nothing was found internally, try to fetch any\n    // data from the HTML5 data-* attribute\n\n    if (data === undefined && elem.nodeType === 1) {\n      name = \"data-\" + key.replace(rmultiDash, \"-$&\").toLowerCase();\n      data = elem.getAttribute(name);\n\n      if (typeof data === \"string\") {\n        try {\n          data = getData(data);\n        } catch (e) {} // Make sure we set the data so it isn't changed later\n\n\n        dataUser.set(elem, key, data);\n      } else {\n        data = undefined;\n      }\n    }\n\n    return data;\n  }\n\n  jQuery.extend({\n    hasData: function hasData(elem) {\n      return dataUser.hasData(elem) || dataPriv.hasData(elem);\n    },\n    data: function data(elem, name, _data) {\n      return dataUser.access(elem, name, _data);\n    },\n    removeData: function removeData(elem, name) {\n      dataUser.remove(elem, name);\n    },\n    // TODO: Now that all calls to _data and _removeData have been replaced\n    // with direct calls to dataPriv methods, these can be deprecated.\n    _data: function _data(elem, name, data) {\n      return dataPriv.access(elem, name, data);\n    },\n    _removeData: function _removeData(elem, name) {\n      dataPriv.remove(elem, name);\n    }\n  });\n  jQuery.fn.extend({\n    data: function data(key, value) {\n      var i,\n          name,\n          data,\n          elem = this[0],\n          attrs = elem && elem.attributes; // Gets all values\n\n      if (key === undefined) {\n        if (this.length) {\n          data = dataUser.get(elem);\n\n          if (elem.nodeType === 1 && !dataPriv.get(elem, \"hasDataAttrs\")) {\n            i = attrs.length;\n\n            while (i--) {\n              // Support: IE 11 only\n              // The attrs elements can be null (trac-14894)\n              if (attrs[i]) {\n                name = attrs[i].name;\n\n                if (name.indexOf(\"data-\") === 0) {\n                  name = camelCase(name.slice(5));\n                  dataAttr(elem, name, data[name]);\n                }\n              }\n            }\n\n            dataPriv.set(elem, \"hasDataAttrs\", true);\n          }\n        }\n\n        return data;\n      } // Sets multiple values\n\n\n      if (_typeof(key) === \"object\") {\n        return this.each(function () {\n          dataUser.set(this, key);\n        });\n      }\n\n      return access(this, function (value) {\n        var data; // The calling jQuery object (element matches) is not empty\n        // (and therefore has an element appears at this[ 0 ]) and the\n        // `value` parameter was not undefined. An empty jQuery object\n        // will result in `undefined` for elem = this[ 0 ] which will\n        // throw an exception if an attempt to read a data cache is made.\n\n        if (elem && value === undefined) {\n          // Attempt to get data from the cache\n          // The key will always be camelCased in Data\n          data = dataUser.get(elem, key);\n\n          if (data !== undefined) {\n            return data;\n          } // Attempt to \"discover\" the data in\n          // HTML5 custom data-* attrs\n\n\n          data = dataAttr(elem, key);\n\n          if (data !== undefined) {\n            return data;\n          } // We tried really hard, but the data doesn't exist.\n\n\n          return;\n        } // Set the data...\n\n\n        this.each(function () {\n          // We always store the camelCased key\n          dataUser.set(this, key, value);\n        });\n      }, null, value, arguments.length > 1, null, true);\n    },\n    removeData: function removeData(key) {\n      return this.each(function () {\n        dataUser.remove(this, key);\n      });\n    }\n  });\n  jQuery.extend({\n    queue: function queue(elem, type, data) {\n      var queue;\n\n      if (elem) {\n        type = (type || \"fx\") + \"queue\";\n        queue = dataPriv.get(elem, type); // Speed up dequeue by getting out quickly if this is just a lookup\n\n        if (data) {\n          if (!queue || Array.isArray(data)) {\n            queue = dataPriv.access(elem, type, jQuery.makeArray(data));\n          } else {\n            queue.push(data);\n          }\n        }\n\n        return queue || [];\n      }\n    },\n    dequeue: function dequeue(elem, type) {\n      type = type || \"fx\";\n\n      var queue = jQuery.queue(elem, type),\n          startLength = queue.length,\n          fn = queue.shift(),\n          hooks = jQuery._queueHooks(elem, type),\n          next = function next() {\n        jQuery.dequeue(elem, type);\n      }; // If the fx queue is dequeued, always remove the progress sentinel\n\n\n      if (fn === \"inprogress\") {\n        fn = queue.shift();\n        startLength--;\n      }\n\n      if (fn) {\n        // Add a progress sentinel to prevent the fx queue from being\n        // automatically dequeued\n        if (type === \"fx\") {\n          queue.unshift(\"inprogress\");\n        } // Clear up the last queue stop function\n\n\n        delete hooks.stop;\n        fn.call(elem, next, hooks);\n      }\n\n      if (!startLength && hooks) {\n        hooks.empty.fire();\n      }\n    },\n    // Not public - generate a queueHooks object, or return the current one\n    _queueHooks: function _queueHooks(elem, type) {\n      var key = type + \"queueHooks\";\n      return dataPriv.get(elem, key) || dataPriv.access(elem, key, {\n        empty: jQuery.Callbacks(\"once memory\").add(function () {\n          dataPriv.remove(elem, [type + \"queue\", key]);\n        })\n      });\n    }\n  });\n  jQuery.fn.extend({\n    queue: function queue(type, data) {\n      var setter = 2;\n\n      if (typeof type !== \"string\") {\n        data = type;\n        type = \"fx\";\n        setter--;\n      }\n\n      if (arguments.length < setter) {\n        return jQuery.queue(this[0], type);\n      }\n\n      return data === undefined ? this : this.each(function () {\n        var queue = jQuery.queue(this, type, data); // Ensure a hooks for this queue\n\n        jQuery._queueHooks(this, type);\n\n        if (type === \"fx\" && queue[0] !== \"inprogress\") {\n          jQuery.dequeue(this, type);\n        }\n      });\n    },\n    dequeue: function dequeue(type) {\n      return this.each(function () {\n        jQuery.dequeue(this, type);\n      });\n    },\n    clearQueue: function clearQueue(type) {\n      return this.queue(type || \"fx\", []);\n    },\n    // Get a promise resolved when queues of a certain type\n    // are emptied (fx is the type by default)\n    promise: function promise(type, obj) {\n      var tmp,\n          count = 1,\n          defer = jQuery.Deferred(),\n          elements = this,\n          i = this.length,\n          resolve = function resolve() {\n        if (! --count) {\n          defer.resolveWith(elements, [elements]);\n        }\n      };\n\n      if (typeof type !== \"string\") {\n        obj = type;\n        type = undefined;\n      }\n\n      type = type || \"fx\";\n\n      while (i--) {\n        tmp = dataPriv.get(elements[i], type + \"queueHooks\");\n\n        if (tmp && tmp.empty) {\n          count++;\n          tmp.empty.add(resolve);\n        }\n      }\n\n      resolve();\n      return defer.promise(obj);\n    }\n  });\n  var pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n  var rcssNum = new RegExp(\"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\");\n  var cssExpand = [\"Top\", \"Right\", \"Bottom\", \"Left\"];\n  var documentElement = document.documentElement;\n\n  var isAttached = function isAttached(elem) {\n    return jQuery.contains(elem.ownerDocument, elem);\n  },\n      composed = {\n    composed: true\n  }; // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n  // Check attachment across shadow DOM boundaries when possible (gh-3504)\n  // Support: iOS 10.0-10.2 only\n  // Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n  // leading to errors. We need to check for `getRootNode`.\n\n\n  if (documentElement.getRootNode) {\n    isAttached = function isAttached(elem) {\n      return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument;\n    };\n  }\n\n  var isHiddenWithinTree = function isHiddenWithinTree(elem, el) {\n    // isHiddenWithinTree might be called from jQuery#filter function;\n    // in that case, element will be second argument\n    elem = el || elem; // Inline style trumps all\n\n    return elem.style.display === \"none\" || elem.style.display === \"\" && // Otherwise, check computed style\n    // Support: Firefox <=43 - 45\n    // Disconnected elements can have computed display: none, so first confirm that elem is\n    // in the document.\n    isAttached(elem) && jQuery.css(elem, \"display\") === \"none\";\n  };\n\n  function adjustCSS(elem, prop, valueParts, tween) {\n    var adjusted,\n        scale,\n        maxIterations = 20,\n        currentValue = tween ? function () {\n      return tween.cur();\n    } : function () {\n      return jQuery.css(elem, prop, \"\");\n    },\n        initial = currentValue(),\n        unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? \"\" : \"px\"),\n        // Starting value computation is required for potential unit mismatches\n    initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== \"px\" && +initial) && rcssNum.exec(jQuery.css(elem, prop));\n\n    if (initialInUnit && initialInUnit[3] !== unit) {\n      // Support: Firefox <=54\n      // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n      initial = initial / 2; // Trust units reported by jQuery.css\n\n      unit = unit || initialInUnit[3]; // Iteratively approximate from a nonzero starting point\n\n      initialInUnit = +initial || 1;\n\n      while (maxIterations--) {\n        // Evaluate and update our best guess (doubling guesses that zero out).\n        // Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n        jQuery.style(elem, prop, initialInUnit + unit);\n\n        if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {\n          maxIterations = 0;\n        }\n\n        initialInUnit = initialInUnit / scale;\n      }\n\n      initialInUnit = initialInUnit * 2;\n      jQuery.style(elem, prop, initialInUnit + unit); // Make sure we update the tween properties later on\n\n      valueParts = valueParts || [];\n    }\n\n    if (valueParts) {\n      initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified\n\n      adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];\n\n      if (tween) {\n        tween.unit = unit;\n        tween.start = initialInUnit;\n        tween.end = adjusted;\n      }\n    }\n\n    return adjusted;\n  }\n\n  var defaultDisplayMap = {};\n\n  function getDefaultDisplay(elem) {\n    var temp,\n        doc = elem.ownerDocument,\n        nodeName = elem.nodeName,\n        display = defaultDisplayMap[nodeName];\n\n    if (display) {\n      return display;\n    }\n\n    temp = doc.body.appendChild(doc.createElement(nodeName));\n    display = jQuery.css(temp, \"display\");\n    temp.parentNode.removeChild(temp);\n\n    if (display === \"none\") {\n      display = \"block\";\n    }\n\n    defaultDisplayMap[nodeName] = display;\n    return display;\n  }\n\n  function showHide(elements, show) {\n    var display,\n        elem,\n        values = [],\n        index = 0,\n        length = elements.length; // Determine new display value for elements that need to change\n\n    for (; index < length; index++) {\n      elem = elements[index];\n\n      if (!elem.style) {\n        continue;\n      }\n\n      display = elem.style.display;\n\n      if (show) {\n        // Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n        // check is required in this first loop unless we have a nonempty display value (either\n        // inline or about-to-be-restored)\n        if (display === \"none\") {\n          values[index] = dataPriv.get(elem, \"display\") || null;\n\n          if (!values[index]) {\n            elem.style.display = \"\";\n          }\n        }\n\n        if (elem.style.display === \"\" && isHiddenWithinTree(elem)) {\n          values[index] = getDefaultDisplay(elem);\n        }\n      } else {\n        if (display !== \"none\") {\n          values[index] = \"none\"; // Remember what we're overwriting\n\n          dataPriv.set(elem, \"display\", display);\n        }\n      }\n    } // Set the display of the elements in a second loop to avoid constant reflow\n\n\n    for (index = 0; index < length; index++) {\n      if (values[index] != null) {\n        elements[index].style.display = values[index];\n      }\n    }\n\n    return elements;\n  }\n\n  jQuery.fn.extend({\n    show: function show() {\n      return showHide(this, true);\n    },\n    hide: function hide() {\n      return showHide(this);\n    },\n    toggle: function toggle(state) {\n      if (typeof state === \"boolean\") {\n        return state ? this.show() : this.hide();\n      }\n\n      return this.each(function () {\n        if (isHiddenWithinTree(this)) {\n          jQuery(this).show();\n        } else {\n          jQuery(this).hide();\n        }\n      });\n    }\n  });\n  var rcheckableType = /^(?:checkbox|radio)$/i;\n  var rtagName = /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i;\n  var rscriptType = /^$|^module$|\\/(?:java|ecma)script/i;\n\n  (function () {\n    var fragment = document.createDocumentFragment(),\n        div = fragment.appendChild(document.createElement(\"div\")),\n        input = document.createElement(\"input\"); // Support: Android 4.0 - 4.3 only\n    // Check state lost if the name is set (trac-11217)\n    // Support: Windows Web Apps (WWA)\n    // `name` and `type` must use .setAttribute for WWA (trac-14901)\n\n    input.setAttribute(\"type\", \"radio\");\n    input.setAttribute(\"checked\", \"checked\");\n    input.setAttribute(\"name\", \"t\");\n    div.appendChild(input); // Support: Android <=4.1 only\n    // Older WebKit doesn't clone checked state correctly in fragments\n\n    support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; // Support: IE <=11 only\n    // Make sure textarea (and checkbox) defaultValue is properly cloned\n\n    div.innerHTML = \"<textarea>x</textarea>\";\n    support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; // Support: IE <=9 only\n    // IE <=9 replaces <option> tags with their contents when inserted outside of\n    // the select element.\n\n    div.innerHTML = \"<option></option>\";\n    support.option = !!div.lastChild;\n  })(); // We have to close these tags to support XHTML (trac-13200)\n\n\n  var wrapMap = {\n    // XHTML parsers do not magically insert elements in the\n    // same way that tag soup parsers do. So we cannot shorten\n    // this by omitting <tbody> or other required elements.\n    thead: [1, \"<table>\", \"</table>\"],\n    col: [2, \"<table><colgroup>\", \"</colgroup></table>\"],\n    tr: [2, \"<table><tbody>\", \"</tbody></table>\"],\n    td: [3, \"<table><tbody><tr>\", \"</tr></tbody></table>\"],\n    _default: [0, \"\", \"\"]\n  };\n  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n  wrapMap.th = wrapMap.td; // Support: IE <=9 only\n\n  if (!support.option) {\n    wrapMap.optgroup = wrapMap.option = [1, \"<select multiple='multiple'>\", \"</select>\"];\n  }\n\n  function getAll(context, tag) {\n    // Support: IE <=9 - 11 only\n    // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n    var ret;\n\n    if (typeof context.getElementsByTagName !== \"undefined\") {\n      ret = context.getElementsByTagName(tag || \"*\");\n    } else if (typeof context.querySelectorAll !== \"undefined\") {\n      ret = context.querySelectorAll(tag || \"*\");\n    } else {\n      ret = [];\n    }\n\n    if (tag === undefined || tag && nodeName(context, tag)) {\n      return jQuery.merge([context], ret);\n    }\n\n    return ret;\n  } // Mark scripts as having already been evaluated\n\n\n  function setGlobalEval(elems, refElements) {\n    var i = 0,\n        l = elems.length;\n\n    for (; i < l; i++) {\n      dataPriv.set(elems[i], \"globalEval\", !refElements || dataPriv.get(refElements[i], \"globalEval\"));\n    }\n  }\n\n  var rhtml = /<|&#?\\w+;/;\n\n  function buildFragment(elems, context, scripts, selection, ignored) {\n    var elem,\n        tmp,\n        tag,\n        wrap,\n        attached,\n        j,\n        fragment = context.createDocumentFragment(),\n        nodes = [],\n        i = 0,\n        l = elems.length;\n\n    for (; i < l; i++) {\n      elem = elems[i];\n\n      if (elem || elem === 0) {\n        // Add nodes directly\n        if (toType(elem) === \"object\") {\n          // Support: Android <=4.0 only, PhantomJS 1 only\n          // push.apply(_, arraylike) throws on ancient WebKit\n          jQuery.merge(nodes, elem.nodeType ? [elem] : elem); // Convert non-html into a text node\n        } else if (!rhtml.test(elem)) {\n          nodes.push(context.createTextNode(elem)); // Convert html into DOM nodes\n        } else {\n          tmp = tmp || fragment.appendChild(context.createElement(\"div\")); // Deserialize a standard representation\n\n          tag = (rtagName.exec(elem) || [\"\", \"\"])[1].toLowerCase();\n          wrap = wrapMap[tag] || wrapMap._default;\n          tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2]; // Descend through wrappers to the right content\n\n          j = wrap[0];\n\n          while (j--) {\n            tmp = tmp.lastChild;\n          } // Support: Android <=4.0 only, PhantomJS 1 only\n          // push.apply(_, arraylike) throws on ancient WebKit\n\n\n          jQuery.merge(nodes, tmp.childNodes); // Remember the top-level container\n\n          tmp = fragment.firstChild; // Ensure the created nodes are orphaned (trac-12392)\n\n          tmp.textContent = \"\";\n        }\n      }\n    } // Remove wrapper from fragment\n\n\n    fragment.textContent = \"\";\n    i = 0;\n\n    while (elem = nodes[i++]) {\n      // Skip elements already in the context collection (trac-4087)\n      if (selection && jQuery.inArray(elem, selection) > -1) {\n        if (ignored) {\n          ignored.push(elem);\n        }\n\n        continue;\n      }\n\n      attached = isAttached(elem); // Append to fragment\n\n      tmp = getAll(fragment.appendChild(elem), \"script\"); // Preserve script evaluation history\n\n      if (attached) {\n        setGlobalEval(tmp);\n      } // Capture executables\n\n\n      if (scripts) {\n        j = 0;\n\n        while (elem = tmp[j++]) {\n          if (rscriptType.test(elem.type || \"\")) {\n            scripts.push(elem);\n          }\n        }\n      }\n    }\n\n    return fragment;\n  }\n\n  var rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\n  function returnTrue() {\n    return true;\n  }\n\n  function returnFalse() {\n    return false;\n  }\n\n  function _on(elem, types, selector, data, fn, one) {\n    var origFn, type; // Types can be a map of types/handlers\n\n    if (_typeof(types) === \"object\") {\n      // ( types-Object, selector, data )\n      if (typeof selector !== \"string\") {\n        // ( types-Object, data )\n        data = data || selector;\n        selector = undefined;\n      }\n\n      for (type in types) {\n        _on(elem, type, selector, data, types[type], one);\n      }\n\n      return elem;\n    }\n\n    if (data == null && fn == null) {\n      // ( types, fn )\n      fn = selector;\n      data = selector = undefined;\n    } else if (fn == null) {\n      if (typeof selector === \"string\") {\n        // ( types, selector, fn )\n        fn = data;\n        data = undefined;\n      } else {\n        // ( types, data, fn )\n        fn = data;\n        data = selector;\n        selector = undefined;\n      }\n    }\n\n    if (fn === false) {\n      fn = returnFalse;\n    } else if (!fn) {\n      return elem;\n    }\n\n    if (one === 1) {\n      origFn = fn;\n\n      fn = function fn(event) {\n        // Can use an empty set, since event contains the info\n        jQuery().off(event);\n        return origFn.apply(this, arguments);\n      }; // Use same guid so caller can remove using origFn\n\n\n      fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);\n    }\n\n    return elem.each(function () {\n      jQuery.event.add(this, types, fn, data, selector);\n    });\n  }\n  /*\n   * Helper functions for managing events -- not part of the public interface.\n   * Props to Dean Edwards' addEvent library for many of the ideas.\n   */\n\n\n  jQuery.event = {\n    global: {},\n    add: function add(elem, types, handler, data, selector) {\n      var handleObjIn,\n          eventHandle,\n          tmp,\n          events,\n          t,\n          handleObj,\n          special,\n          handlers,\n          type,\n          namespaces,\n          origType,\n          elemData = dataPriv.get(elem); // Only attach events to objects that accept data\n\n      if (!acceptData(elem)) {\n        return;\n      } // Caller can pass in an object of custom data in lieu of the handler\n\n\n      if (handler.handler) {\n        handleObjIn = handler;\n        handler = handleObjIn.handler;\n        selector = handleObjIn.selector;\n      } // Ensure that invalid selectors throw exceptions at attach time\n      // Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\n\n      if (selector) {\n        jQuery.find.matchesSelector(documentElement, selector);\n      } // Make sure that the handler has a unique ID, used to find/remove it later\n\n\n      if (!handler.guid) {\n        handler.guid = jQuery.guid++;\n      } // Init the element's event structure and main handler, if this is the first\n\n\n      if (!(events = elemData.events)) {\n        events = elemData.events = Object.create(null);\n      }\n\n      if (!(eventHandle = elemData.handle)) {\n        eventHandle = elemData.handle = function (e) {\n          // Discard the second event of a jQuery.event.trigger() and\n          // when an event is called after a page has unloaded\n          return typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined;\n        };\n      } // Handle multiple events separated by a space\n\n\n      types = (types || \"\").match(rnothtmlwhite) || [\"\"];\n      t = types.length;\n\n      while (t--) {\n        tmp = rtypenamespace.exec(types[t]) || [];\n        type = origType = tmp[1];\n        namespaces = (tmp[2] || \"\").split(\".\").sort(); // There *must* be a type, no attaching namespace-only handlers\n\n        if (!type) {\n          continue;\n        } // If event changes its type, use the special event handlers for the changed type\n\n\n        special = jQuery.event.special[type] || {}; // If selector defined, determine special event api type, otherwise given type\n\n        type = (selector ? special.delegateType : special.bindType) || type; // Update special based on newly reset type\n\n        special = jQuery.event.special[type] || {}; // handleObj is passed to all event handlers\n\n        handleObj = jQuery.extend({\n          type: type,\n          origType: origType,\n          data: data,\n          handler: handler,\n          guid: handler.guid,\n          selector: selector,\n          needsContext: selector && jQuery.expr.match.needsContext.test(selector),\n          namespace: namespaces.join(\".\")\n        }, handleObjIn); // Init the event handler queue if we're the first\n\n        if (!(handlers = events[type])) {\n          handlers = events[type] = [];\n          handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false\n\n          if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {\n            if (elem.addEventListener) {\n              elem.addEventListener(type, eventHandle);\n            }\n          }\n        }\n\n        if (special.add) {\n          special.add.call(elem, handleObj);\n\n          if (!handleObj.handler.guid) {\n            handleObj.handler.guid = handler.guid;\n          }\n        } // Add to the element's handler list, delegates in front\n\n\n        if (selector) {\n          handlers.splice(handlers.delegateCount++, 0, handleObj);\n        } else {\n          handlers.push(handleObj);\n        } // Keep track of which events have ever been used, for event optimization\n\n\n        jQuery.event.global[type] = true;\n      }\n    },\n    // Detach an event or set of events from an element\n    remove: function remove(elem, types, handler, selector, mappedTypes) {\n      var j,\n          origCount,\n          tmp,\n          events,\n          t,\n          handleObj,\n          special,\n          handlers,\n          type,\n          namespaces,\n          origType,\n          elemData = dataPriv.hasData(elem) && dataPriv.get(elem);\n\n      if (!elemData || !(events = elemData.events)) {\n        return;\n      } // Once for each type.namespace in types; type may be omitted\n\n\n      types = (types || \"\").match(rnothtmlwhite) || [\"\"];\n      t = types.length;\n\n      while (t--) {\n        tmp = rtypenamespace.exec(types[t]) || [];\n        type = origType = tmp[1];\n        namespaces = (tmp[2] || \"\").split(\".\").sort(); // Unbind all events (on this namespace, if provided) for the element\n\n        if (!type) {\n          for (type in events) {\n            jQuery.event.remove(elem, type + types[t], handler, selector, true);\n          }\n\n          continue;\n        }\n\n        special = jQuery.event.special[type] || {};\n        type = (selector ? special.delegateType : special.bindType) || type;\n        handlers = events[type] || [];\n        tmp = tmp[2] && new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\"); // Remove matching events\n\n        origCount = j = handlers.length;\n\n        while (j--) {\n          handleObj = handlers[j];\n\n          if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector)) {\n            handlers.splice(j, 1);\n\n            if (handleObj.selector) {\n              handlers.delegateCount--;\n            }\n\n            if (special.remove) {\n              special.remove.call(elem, handleObj);\n            }\n          }\n        } // Remove generic event handler if we removed something and no more handlers exist\n        // (avoids potential for endless recursion during removal of special event handlers)\n\n\n        if (origCount && !handlers.length) {\n          if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {\n            jQuery.removeEvent(elem, type, elemData.handle);\n          }\n\n          delete events[type];\n        }\n      } // Remove data and the expando if it's no longer used\n\n\n      if (jQuery.isEmptyObject(events)) {\n        dataPriv.remove(elem, \"handle events\");\n      }\n    },\n    dispatch: function dispatch(nativeEvent) {\n      var i,\n          j,\n          ret,\n          matched,\n          handleObj,\n          handlerQueue,\n          args = new Array(arguments.length),\n          // Make a writable jQuery.Event from the native event object\n      event = jQuery.event.fix(nativeEvent),\n          handlers = (dataPriv.get(this, \"events\") || Object.create(null))[event.type] || [],\n          special = jQuery.event.special[event.type] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event\n\n      args[0] = event;\n\n      for (i = 1; i < arguments.length; i++) {\n        args[i] = arguments[i];\n      }\n\n      event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired\n\n      if (special.preDispatch && special.preDispatch.call(this, event) === false) {\n        return;\n      } // Determine handlers\n\n\n      handlerQueue = jQuery.event.handlers.call(this, event, handlers); // Run delegates first; they may want to stop propagation beneath us\n\n      i = 0;\n\n      while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {\n        event.currentTarget = matched.elem;\n        j = 0;\n\n        while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {\n          // If the event is namespaced, then each handler is only invoked if it is\n          // specially universal or its namespaces are a superset of the event's.\n          if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) {\n            event.handleObj = handleObj;\n            event.data = handleObj.data;\n            ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);\n\n            if (ret !== undefined) {\n              if ((event.result = ret) === false) {\n                event.preventDefault();\n                event.stopPropagation();\n              }\n            }\n          }\n        }\n      } // Call the postDispatch hook for the mapped type\n\n\n      if (special.postDispatch) {\n        special.postDispatch.call(this, event);\n      }\n\n      return event.result;\n    },\n    handlers: function handlers(event, _handlers) {\n      var i,\n          handleObj,\n          sel,\n          matchedHandlers,\n          matchedSelectors,\n          handlerQueue = [],\n          delegateCount = _handlers.delegateCount,\n          cur = event.target; // Find delegate handlers\n\n      if (delegateCount && // Support: IE <=9\n      // Black-hole SVG <use> instance trees (trac-13180)\n      cur.nodeType && // Support: Firefox <=42\n      // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n      // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n      // Support: IE 11 only\n      // ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n      !(event.type === \"click\" && event.button >= 1)) {\n        for (; cur !== this; cur = cur.parentNode || this) {\n          // Don't check non-elements (trac-13208)\n          // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n          if (cur.nodeType === 1 && !(event.type === \"click\" && cur.disabled === true)) {\n            matchedHandlers = [];\n            matchedSelectors = {};\n\n            for (i = 0; i < delegateCount; i++) {\n              handleObj = _handlers[i]; // Don't conflict with Object.prototype properties (trac-13203)\n\n              sel = handleObj.selector + \" \";\n\n              if (matchedSelectors[sel] === undefined) {\n                matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;\n              }\n\n              if (matchedSelectors[sel]) {\n                matchedHandlers.push(handleObj);\n              }\n            }\n\n            if (matchedHandlers.length) {\n              handlerQueue.push({\n                elem: cur,\n                handlers: matchedHandlers\n              });\n            }\n          }\n        }\n      } // Add the remaining (directly-bound) handlers\n\n\n      cur = this;\n\n      if (delegateCount < _handlers.length) {\n        handlerQueue.push({\n          elem: cur,\n          handlers: _handlers.slice(delegateCount)\n        });\n      }\n\n      return handlerQueue;\n    },\n    addProp: function addProp(name, hook) {\n      Object.defineProperty(jQuery.Event.prototype, name, {\n        enumerable: true,\n        configurable: true,\n        get: isFunction(hook) ? function () {\n          if (this.originalEvent) {\n            return hook(this.originalEvent);\n          }\n        } : function () {\n          if (this.originalEvent) {\n            return this.originalEvent[name];\n          }\n        },\n        set: function set(value) {\n          Object.defineProperty(this, name, {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: value\n          });\n        }\n      });\n    },\n    fix: function fix(originalEvent) {\n      return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);\n    },\n    special: {\n      load: {\n        // Prevent triggered image.load events from bubbling to window.load\n        noBubble: true\n      },\n      click: {\n        // Utilize native event to ensure correct state for checkable inputs\n        setup: function setup(data) {\n          // For mutual compressibility with _default, replace `this` access with a local var.\n          // `|| data` is dead code meant only to preserve the variable through minification.\n          var el = this || data; // Claim the first handler\n\n          if (rcheckableType.test(el.type) && el.click && nodeName(el, \"input\")) {\n            // dataPriv.set( el, \"click\", ... )\n            leverageNative(el, \"click\", true);\n          } // Return false to allow normal processing in the caller\n\n\n          return false;\n        },\n        trigger: function trigger(data) {\n          // For mutual compressibility with _default, replace `this` access with a local var.\n          // `|| data` is dead code meant only to preserve the variable through minification.\n          var el = this || data; // Force setup before triggering a click\n\n          if (rcheckableType.test(el.type) && el.click && nodeName(el, \"input\")) {\n            leverageNative(el, \"click\");\n          } // Return non-false to allow normal event-path propagation\n\n\n          return true;\n        },\n        // For cross-browser consistency, suppress native .click() on links\n        // Also prevent it if we're currently inside a leveraged native-event stack\n        _default: function _default(event) {\n          var target = event.target;\n          return rcheckableType.test(target.type) && target.click && nodeName(target, \"input\") && dataPriv.get(target, \"click\") || nodeName(target, \"a\");\n        }\n      },\n      beforeunload: {\n        postDispatch: function postDispatch(event) {\n          // Support: Firefox 20+\n          // Firefox doesn't alert if the returnValue field is not set.\n          if (event.result !== undefined && event.originalEvent) {\n            event.originalEvent.returnValue = event.result;\n          }\n        }\n      }\n    }\n  }; // Ensure the presence of an event listener that handles manually-triggered\n  // synthetic events by interrupting progress until reinvoked in response to\n  // *native* events that it fires directly, ensuring that state changes have\n  // already occurred before other listeners are invoked.\n\n  function leverageNative(el, type, isSetup) {\n    // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n    if (!isSetup) {\n      if (dataPriv.get(el, type) === undefined) {\n        jQuery.event.add(el, type, returnTrue);\n      }\n\n      return;\n    } // Register the controller as a special universal handler for all event namespaces\n\n\n    dataPriv.set(el, type, false);\n    jQuery.event.add(el, type, {\n      namespace: false,\n      handler: function handler(event) {\n        var result,\n            saved = dataPriv.get(this, type);\n\n        if (event.isTrigger & 1 && this[type]) {\n          // Interrupt processing of the outer synthetic .trigger()ed event\n          if (!saved) {\n            // Store arguments for use when handling the inner native event\n            // There will always be at least one argument (an event object), so this array\n            // will not be confused with a leftover capture object.\n            saved = _slice.call(arguments);\n            dataPriv.set(this, type, saved); // Trigger the native event and capture its result\n\n            this[type]();\n            result = dataPriv.get(this, type);\n            dataPriv.set(this, type, false);\n\n            if (saved !== result) {\n              // Cancel the outer synthetic event\n              event.stopImmediatePropagation();\n              event.preventDefault();\n              return result;\n            } // If this is an inner synthetic event for an event with a bubbling surrogate\n            // (focus or blur), assume that the surrogate already propagated from triggering\n            // the native event and prevent that from happening again here.\n            // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n            // bubbling surrogate propagates *after* the non-bubbling base), but that seems\n            // less bad than duplication.\n\n          } else if ((jQuery.event.special[type] || {}).delegateType) {\n            event.stopPropagation();\n          } // If this is a native event triggered above, everything is now in order\n          // Fire an inner synthetic event with the original arguments\n\n        } else if (saved) {\n          // ...and capture the result\n          dataPriv.set(this, type, jQuery.event.trigger(saved[0], saved.slice(1), this)); // Abort handling of the native event by all jQuery handlers while allowing\n          // native handlers on the same element to run. On target, this is achieved\n          // by stopping immediate propagation just on the jQuery event. However,\n          // the native event is re-wrapped by a jQuery one on each level of the\n          // propagation so the only way to stop it for jQuery is to stop it for\n          // everyone via native `stopPropagation()`. This is not a problem for\n          // focus/blur which don't bubble, but it does also stop click on checkboxes\n          // and radios. We accept this limitation.\n\n          event.stopPropagation();\n          event.isImmediatePropagationStopped = returnTrue;\n        }\n      }\n    });\n  }\n\n  jQuery.removeEvent = function (elem, type, handle) {\n    // This \"if\" is needed for plain objects\n    if (elem.removeEventListener) {\n      elem.removeEventListener(type, handle);\n    }\n  };\n\n  jQuery.Event = function (src, props) {\n    // Allow instantiation without the 'new' keyword\n    if (!(this instanceof jQuery.Event)) {\n      return new jQuery.Event(src, props);\n    } // Event object\n\n\n    if (src && src.type) {\n      this.originalEvent = src;\n      this.type = src.type; // Events bubbling up the document may have been marked as prevented\n      // by a handler lower down the tree; reflect the correct value.\n\n      this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only\n      src.returnValue === false ? returnTrue : returnFalse; // Create target properties\n      // Support: Safari <=6 - 7 only\n      // Target should not be a text node (trac-504, trac-13143)\n\n      this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;\n      this.currentTarget = src.currentTarget;\n      this.relatedTarget = src.relatedTarget; // Event type\n    } else {\n      this.type = src;\n    } // Put explicitly provided properties onto the event object\n\n\n    if (props) {\n      jQuery.extend(this, props);\n    } // Create a timestamp if incoming event doesn't have one\n\n\n    this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed\n\n    this[jQuery.expando] = true;\n  }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n  // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n\n\n  jQuery.Event.prototype = {\n    constructor: jQuery.Event,\n    isDefaultPrevented: returnFalse,\n    isPropagationStopped: returnFalse,\n    isImmediatePropagationStopped: returnFalse,\n    isSimulated: false,\n    preventDefault: function preventDefault() {\n      var e = this.originalEvent;\n      this.isDefaultPrevented = returnTrue;\n\n      if (e && !this.isSimulated) {\n        e.preventDefault();\n      }\n    },\n    stopPropagation: function stopPropagation() {\n      var e = this.originalEvent;\n      this.isPropagationStopped = returnTrue;\n\n      if (e && !this.isSimulated) {\n        e.stopPropagation();\n      }\n    },\n    stopImmediatePropagation: function stopImmediatePropagation() {\n      var e = this.originalEvent;\n      this.isImmediatePropagationStopped = returnTrue;\n\n      if (e && !this.isSimulated) {\n        e.stopImmediatePropagation();\n      }\n\n      this.stopPropagation();\n    }\n  }; // Includes all common event props including KeyEvent and MouseEvent specific props\n\n  jQuery.each({\n    altKey: true,\n    bubbles: true,\n    cancelable: true,\n    changedTouches: true,\n    ctrlKey: true,\n    detail: true,\n    eventPhase: true,\n    metaKey: true,\n    pageX: true,\n    pageY: true,\n    shiftKey: true,\n    view: true,\n    \"char\": true,\n    code: true,\n    charCode: true,\n    key: true,\n    keyCode: true,\n    button: true,\n    buttons: true,\n    clientX: true,\n    clientY: true,\n    offsetX: true,\n    offsetY: true,\n    pointerId: true,\n    pointerType: true,\n    screenX: true,\n    screenY: true,\n    targetTouches: true,\n    toElement: true,\n    touches: true,\n    which: true\n  }, jQuery.event.addProp);\n  jQuery.each({\n    focus: \"focusin\",\n    blur: \"focusout\"\n  }, function (type, delegateType) {\n    function focusMappedHandler(nativeEvent) {\n      if (document.documentMode) {\n        // Support: IE 11+\n        // Attach a single focusin/focusout handler on the document while someone wants\n        // focus/blur. This is because the former are synchronous in IE while the latter\n        // are async. In other browsers, all those handlers are invoked synchronously.\n        // `handle` from private data would already wrap the event, but we need\n        // to change the `type` here.\n        var handle = dataPriv.get(this, \"handle\"),\n            event = jQuery.event.fix(nativeEvent);\n        event.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n        event.isSimulated = true; // First, handle focusin/focusout\n\n        handle(nativeEvent); // ...then, handle focus/blur\n        //\n        // focus/blur don't bubble while focusin/focusout do; simulate the former by only\n        // invoking the handler at the lower level.\n\n        if (event.target === event.currentTarget) {\n          // The setup part calls `leverageNative`, which, in turn, calls\n          // `jQuery.event.add`, so event handle will already have been set\n          // by this point.\n          handle(event);\n        }\n      } else {\n        // For non-IE browsers, attach a single capturing handler on the document\n        // while someone wants focusin/focusout.\n        jQuery.event.simulate(delegateType, nativeEvent.target, jQuery.event.fix(nativeEvent));\n      }\n    }\n\n    jQuery.event.special[type] = {\n      // Utilize native event if possible so blur/focus sequence is correct\n      setup: function setup() {\n        var attaches; // Claim the first handler\n        // dataPriv.set( this, \"focus\", ... )\n        // dataPriv.set( this, \"blur\", ... )\n\n        leverageNative(this, type, true);\n\n        if (document.documentMode) {\n          // Support: IE 9 - 11+\n          // We use the same native handler for focusin & focus (and focusout & blur)\n          // so we need to coordinate setup & teardown parts between those events.\n          // Use `delegateType` as the key as `type` is already used by `leverageNative`.\n          attaches = dataPriv.get(this, delegateType);\n\n          if (!attaches) {\n            this.addEventListener(delegateType, focusMappedHandler);\n          }\n\n          dataPriv.set(this, delegateType, (attaches || 0) + 1);\n        } else {\n          // Return false to allow normal processing in the caller\n          return false;\n        }\n      },\n      trigger: function trigger() {\n        // Force setup before trigger\n        leverageNative(this, type); // Return non-false to allow normal event-path propagation\n\n        return true;\n      },\n      teardown: function teardown() {\n        var attaches;\n\n        if (document.documentMode) {\n          attaches = dataPriv.get(this, delegateType) - 1;\n\n          if (!attaches) {\n            this.removeEventListener(delegateType, focusMappedHandler);\n            dataPriv.remove(this, delegateType);\n          } else {\n            dataPriv.set(this, delegateType, attaches);\n          }\n        } else {\n          // Return false to indicate standard teardown should be applied\n          return false;\n        }\n      },\n      // Suppress native focus or blur if we're currently inside\n      // a leveraged native-event stack\n      _default: function _default(event) {\n        return dataPriv.get(event.target, type);\n      },\n      delegateType: delegateType\n    }; // Support: Firefox <=44\n    // Firefox doesn't have focus(in | out) events\n    // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n    //\n    // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n    // focus(in | out) events fire after focus & blur events,\n    // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n    // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n    //\n    // Support: IE 9 - 11+\n    // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n    // attach a single handler for both events in IE.\n\n    jQuery.event.special[delegateType] = {\n      setup: function setup() {\n        // Handle: regular nodes (via `this.ownerDocument`), window\n        // (via `this.document`) & document (via `this`).\n        var doc = this.ownerDocument || this.document || this,\n            dataHolder = document.documentMode ? this : doc,\n            attaches = dataPriv.get(dataHolder, delegateType); // Support: IE 9 - 11+\n        // We use the same native handler for focusin & focus (and focusout & blur)\n        // so we need to coordinate setup & teardown parts between those events.\n        // Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\n        if (!attaches) {\n          if (document.documentMode) {\n            this.addEventListener(delegateType, focusMappedHandler);\n          } else {\n            doc.addEventListener(type, focusMappedHandler, true);\n          }\n        }\n\n        dataPriv.set(dataHolder, delegateType, (attaches || 0) + 1);\n      },\n      teardown: function teardown() {\n        var doc = this.ownerDocument || this.document || this,\n            dataHolder = document.documentMode ? this : doc,\n            attaches = dataPriv.get(dataHolder, delegateType) - 1;\n\n        if (!attaches) {\n          if (document.documentMode) {\n            this.removeEventListener(delegateType, focusMappedHandler);\n          } else {\n            doc.removeEventListener(type, focusMappedHandler, true);\n          }\n\n          dataPriv.remove(dataHolder, delegateType);\n        } else {\n          dataPriv.set(dataHolder, delegateType, attaches);\n        }\n      }\n    };\n  }); // Create mouseenter/leave events using mouseover/out and event-time checks\n  // so that event delegation works in jQuery.\n  // Do the same for pointerenter/pointerleave and pointerover/pointerout\n  //\n  // Support: Safari 7 only\n  // Safari sends mouseenter too often; see:\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n  // for the description of the bug (it existed in older Chrome versions as well).\n\n  jQuery.each({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\",\n    pointerenter: \"pointerover\",\n    pointerleave: \"pointerout\"\n  }, function (orig, fix) {\n    jQuery.event.special[orig] = {\n      delegateType: fix,\n      bindType: fix,\n      handle: function handle(event) {\n        var ret,\n            target = this,\n            related = event.relatedTarget,\n            handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target.\n        // NB: No relatedTarget if the mouse left/entered the browser window\n\n        if (!related || related !== target && !jQuery.contains(target, related)) {\n          event.type = handleObj.origType;\n          ret = handleObj.handler.apply(this, arguments);\n          event.type = fix;\n        }\n\n        return ret;\n      }\n    };\n  });\n  jQuery.fn.extend({\n    on: function on(types, selector, data, fn) {\n      return _on(this, types, selector, data, fn);\n    },\n    one: function one(types, selector, data, fn) {\n      return _on(this, types, selector, data, fn, 1);\n    },\n    off: function off(types, selector, fn) {\n      var handleObj, type;\n\n      if (types && types.preventDefault && types.handleObj) {\n        // ( event )  dispatched jQuery.Event\n        handleObj = types.handleObj;\n        jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);\n        return this;\n      }\n\n      if (_typeof(types) === \"object\") {\n        // ( types-object [, selector] )\n        for (type in types) {\n          this.off(type, selector, types[type]);\n        }\n\n        return this;\n      }\n\n      if (selector === false || typeof selector === \"function\") {\n        // ( types [, fn] )\n        fn = selector;\n        selector = undefined;\n      }\n\n      if (fn === false) {\n        fn = returnFalse;\n      }\n\n      return this.each(function () {\n        jQuery.event.remove(this, types, fn, selector);\n      });\n    }\n  });\n  var // Support: IE <=10 - 11, Edge 12 - 13 only\n  // In IE/Edge using regex groups here causes severe slowdowns.\n  // See https://connect.microsoft.com/IE/feedback/details/1736512/\n  rnoInnerhtml = /<script|<style|<link/i,\n      // checked=\"checked\" or checked\n  rchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n      rcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g; // Prefer a tbody over its parent table for containing new rows\n\n  function manipulationTarget(elem, content) {\n    if (nodeName(elem, \"table\") && nodeName(content.nodeType !== 11 ? content : content.firstChild, \"tr\")) {\n      return jQuery(elem).children(\"tbody\")[0] || elem;\n    }\n\n    return elem;\n  } // Replace/restore the type attribute of script elements for safe DOM manipulation\n\n\n  function disableScript(elem) {\n    elem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n    return elem;\n  }\n\n  function restoreScript(elem) {\n    if ((elem.type || \"\").slice(0, 5) === \"true/\") {\n      elem.type = elem.type.slice(5);\n    } else {\n      elem.removeAttribute(\"type\");\n    }\n\n    return elem;\n  }\n\n  function cloneCopyEvent(src, dest) {\n    var i, l, type, pdataOld, udataOld, udataCur, events;\n\n    if (dest.nodeType !== 1) {\n      return;\n    } // 1. Copy private data: events, handlers, etc.\n\n\n    if (dataPriv.hasData(src)) {\n      pdataOld = dataPriv.get(src);\n      events = pdataOld.events;\n\n      if (events) {\n        dataPriv.remove(dest, \"handle events\");\n\n        for (type in events) {\n          for (i = 0, l = events[type].length; i < l; i++) {\n            jQuery.event.add(dest, type, events[type][i]);\n          }\n        }\n      }\n    } // 2. Copy user data\n\n\n    if (dataUser.hasData(src)) {\n      udataOld = dataUser.access(src);\n      udataCur = jQuery.extend({}, udataOld);\n      dataUser.set(dest, udataCur);\n    }\n  } // Fix IE bugs, see support tests\n\n\n  function fixInput(src, dest) {\n    var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button.\n\n    if (nodeName === \"input\" && rcheckableType.test(src.type)) {\n      dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options\n    } else if (nodeName === \"input\" || nodeName === \"textarea\") {\n      dest.defaultValue = src.defaultValue;\n    }\n  }\n\n  function domManip(collection, args, callback, ignored) {\n    // Flatten any nested arrays\n    args = flat(args);\n    var fragment,\n        first,\n        scripts,\n        hasScripts,\n        node,\n        doc,\n        i = 0,\n        l = collection.length,\n        iNoClone = l - 1,\n        value = args[0],\n        valueIsFunction = isFunction(value); // We can't cloneNode fragments that contain checked, in WebKit\n\n    if (valueIsFunction || l > 1 && typeof value === \"string\" && !support.checkClone && rchecked.test(value)) {\n      return collection.each(function (index) {\n        var self = collection.eq(index);\n\n        if (valueIsFunction) {\n          args[0] = value.call(this, index, self.html());\n        }\n\n        domManip(self, args, callback, ignored);\n      });\n    }\n\n    if (l) {\n      fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);\n      first = fragment.firstChild;\n\n      if (fragment.childNodes.length === 1) {\n        fragment = first;\n      } // Require either new content or an interest in ignored elements to invoke the callback\n\n\n      if (first || ignored) {\n        scripts = jQuery.map(getAll(fragment, \"script\"), disableScript);\n        hasScripts = scripts.length; // Use the original fragment for the last item\n        // instead of the first because it can end up\n        // being emptied incorrectly in certain situations (trac-8070).\n\n        for (; i < l; i++) {\n          node = fragment;\n\n          if (i !== iNoClone) {\n            node = jQuery.clone(node, true, true); // Keep references to cloned scripts for later restoration\n\n            if (hasScripts) {\n              // Support: Android <=4.0 only, PhantomJS 1 only\n              // push.apply(_, arraylike) throws on ancient WebKit\n              jQuery.merge(scripts, getAll(node, \"script\"));\n            }\n          }\n\n          callback.call(collection[i], node, i);\n        }\n\n        if (hasScripts) {\n          doc = scripts[scripts.length - 1].ownerDocument; // Re-enable scripts\n\n          jQuery.map(scripts, restoreScript); // Evaluate executable scripts on first document insertion\n\n          for (i = 0; i < hasScripts; i++) {\n            node = scripts[i];\n\n            if (rscriptType.test(node.type || \"\") && !dataPriv.access(node, \"globalEval\") && jQuery.contains(doc, node)) {\n              if (node.src && (node.type || \"\").toLowerCase() !== \"module\") {\n                // Optional AJAX dependency, but won't run scripts if not present\n                if (jQuery._evalUrl && !node.noModule) {\n                  jQuery._evalUrl(node.src, {\n                    nonce: node.nonce || node.getAttribute(\"nonce\")\n                  }, doc);\n                }\n              } else {\n                // Unwrap a CDATA section containing script contents. This shouldn't be\n                // needed as in XML documents they're already not visible when\n                // inspecting element contents and in HTML documents they have no\n                // meaning but we're preserving that logic for backwards compatibility.\n                // This will be removed completely in 4.0. See gh-4904.\n                DOMEval(node.textContent.replace(rcleanScript, \"\"), node, doc);\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return collection;\n  }\n\n  function _remove(elem, selector, keepData) {\n    var node,\n        nodes = selector ? jQuery.filter(selector, elem) : elem,\n        i = 0;\n\n    for (; (node = nodes[i]) != null; i++) {\n      if (!keepData && node.nodeType === 1) {\n        jQuery.cleanData(getAll(node));\n      }\n\n      if (node.parentNode) {\n        if (keepData && isAttached(node)) {\n          setGlobalEval(getAll(node, \"script\"));\n        }\n\n        node.parentNode.removeChild(node);\n      }\n    }\n\n    return elem;\n  }\n\n  jQuery.extend({\n    htmlPrefilter: function htmlPrefilter(html) {\n      return html;\n    },\n    clone: function clone(elem, dataAndEvents, deepDataAndEvents) {\n      var i,\n          l,\n          srcElements,\n          destElements,\n          clone = elem.cloneNode(true),\n          inPage = isAttached(elem); // Fix IE cloning issues\n\n      if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {\n        // We eschew jQuery#find here for performance reasons:\n        // https://jsperf.com/getall-vs-sizzle/2\n        destElements = getAll(clone);\n        srcElements = getAll(elem);\n\n        for (i = 0, l = srcElements.length; i < l; i++) {\n          fixInput(srcElements[i], destElements[i]);\n        }\n      } // Copy the events from the original to the clone\n\n\n      if (dataAndEvents) {\n        if (deepDataAndEvents) {\n          srcElements = srcElements || getAll(elem);\n          destElements = destElements || getAll(clone);\n\n          for (i = 0, l = srcElements.length; i < l; i++) {\n            cloneCopyEvent(srcElements[i], destElements[i]);\n          }\n        } else {\n          cloneCopyEvent(elem, clone);\n        }\n      } // Preserve script evaluation history\n\n\n      destElements = getAll(clone, \"script\");\n\n      if (destElements.length > 0) {\n        setGlobalEval(destElements, !inPage && getAll(elem, \"script\"));\n      } // Return the cloned set\n\n\n      return clone;\n    },\n    cleanData: function cleanData(elems) {\n      var data,\n          elem,\n          type,\n          special = jQuery.event.special,\n          i = 0;\n\n      for (; (elem = elems[i]) !== undefined; i++) {\n        if (acceptData(elem)) {\n          if (data = elem[dataPriv.expando]) {\n            if (data.events) {\n              for (type in data.events) {\n                if (special[type]) {\n                  jQuery.event.remove(elem, type); // This is a shortcut to avoid jQuery.event.remove's overhead\n                } else {\n                  jQuery.removeEvent(elem, type, data.handle);\n                }\n              }\n            } // Support: Chrome <=35 - 45+\n            // Assign undefined instead of using delete, see Data#remove\n\n\n            elem[dataPriv.expando] = undefined;\n          }\n\n          if (elem[dataUser.expando]) {\n            // Support: Chrome <=35 - 45+\n            // Assign undefined instead of using delete, see Data#remove\n            elem[dataUser.expando] = undefined;\n          }\n        }\n      }\n    }\n  });\n  jQuery.fn.extend({\n    detach: function detach(selector) {\n      return _remove(this, selector, true);\n    },\n    remove: function remove(selector) {\n      return _remove(this, selector);\n    },\n    text: function text(value) {\n      return access(this, function (value) {\n        return value === undefined ? jQuery.text(this) : this.empty().each(function () {\n          if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n            this.textContent = value;\n          }\n        });\n      }, null, value, arguments.length);\n    },\n    append: function append() {\n      return domManip(this, arguments, function (elem) {\n        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n          var target = manipulationTarget(this, elem);\n          target.appendChild(elem);\n        }\n      });\n    },\n    prepend: function prepend() {\n      return domManip(this, arguments, function (elem) {\n        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n          var target = manipulationTarget(this, elem);\n          target.insertBefore(elem, target.firstChild);\n        }\n      });\n    },\n    before: function before() {\n      return domManip(this, arguments, function (elem) {\n        if (this.parentNode) {\n          this.parentNode.insertBefore(elem, this);\n        }\n      });\n    },\n    after: function after() {\n      return domManip(this, arguments, function (elem) {\n        if (this.parentNode) {\n          this.parentNode.insertBefore(elem, this.nextSibling);\n        }\n      });\n    },\n    empty: function empty() {\n      var elem,\n          i = 0;\n\n      for (; (elem = this[i]) != null; i++) {\n        if (elem.nodeType === 1) {\n          // Prevent memory leaks\n          jQuery.cleanData(getAll(elem, false)); // Remove any remaining nodes\n\n          elem.textContent = \"\";\n        }\n      }\n\n      return this;\n    },\n    clone: function clone(dataAndEvents, deepDataAndEvents) {\n      dataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n      deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n      return this.map(function () {\n        return jQuery.clone(this, dataAndEvents, deepDataAndEvents);\n      });\n    },\n    html: function html(value) {\n      return access(this, function (value) {\n        var elem = this[0] || {},\n            i = 0,\n            l = this.length;\n\n        if (value === undefined && elem.nodeType === 1) {\n          return elem.innerHTML;\n        } // See if we can take a shortcut and just use innerHTML\n\n\n        if (typeof value === \"string\" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || [\"\", \"\"])[1].toLowerCase()]) {\n          value = jQuery.htmlPrefilter(value);\n\n          try {\n            for (; i < l; i++) {\n              elem = this[i] || {}; // Remove element nodes and prevent memory leaks\n\n              if (elem.nodeType === 1) {\n                jQuery.cleanData(getAll(elem, false));\n                elem.innerHTML = value;\n              }\n            }\n\n            elem = 0; // If using innerHTML throws an exception, use the fallback method\n          } catch (e) {}\n        }\n\n        if (elem) {\n          this.empty().append(value);\n        }\n      }, null, value, arguments.length);\n    },\n    replaceWith: function replaceWith() {\n      var ignored = []; // Make the changes, replacing each non-ignored context element with the new content\n\n      return domManip(this, arguments, function (elem) {\n        var parent = this.parentNode;\n\n        if (jQuery.inArray(this, ignored) < 0) {\n          jQuery.cleanData(getAll(this));\n\n          if (parent) {\n            parent.replaceChild(elem, this);\n          }\n        } // Force callback invocation\n\n      }, ignored);\n    }\n  });\n  jQuery.each({\n    appendTo: \"append\",\n    prependTo: \"prepend\",\n    insertBefore: \"before\",\n    insertAfter: \"after\",\n    replaceAll: \"replaceWith\"\n  }, function (name, original) {\n    jQuery.fn[name] = function (selector) {\n      var elems,\n          ret = [],\n          insert = jQuery(selector),\n          last = insert.length - 1,\n          i = 0;\n\n      for (; i <= last; i++) {\n        elems = i === last ? this : this.clone(true);\n        jQuery(insert[i])[original](elems); // Support: Android <=4.0 only, PhantomJS 1 only\n        // .get() because push.apply(_, arraylike) throws on ancient WebKit\n\n        push.apply(ret, elems.get());\n      }\n\n      return this.pushStack(ret);\n    };\n  });\n  var rnumnonpx = new RegExp(\"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\");\n  var rcustomProp = /^--/;\n\n  var getStyles = function getStyles(elem) {\n    // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n    // IE throws on elements created in popups\n    // FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n    var view = elem.ownerDocument.defaultView;\n\n    if (!view || !view.opener) {\n      view = window;\n    }\n\n    return view.getComputedStyle(elem);\n  };\n\n  var swap = function swap(elem, options, callback) {\n    var ret,\n        name,\n        old = {}; // Remember the old values, and insert the new ones\n\n    for (name in options) {\n      old[name] = elem.style[name];\n      elem.style[name] = options[name];\n    }\n\n    ret = callback.call(elem); // Revert the old values\n\n    for (name in options) {\n      elem.style[name] = old[name];\n    }\n\n    return ret;\n  };\n\n  var rboxStyle = new RegExp(cssExpand.join(\"|\"), \"i\");\n\n  (function () {\n    // Executing both pixelPosition & boxSizingReliable tests require only one layout\n    // so they're executed at the same time to save the second computation.\n    function computeStyleTests() {\n      // This is a singleton, we need to execute it only once\n      if (!div) {\n        return;\n      }\n\n      container.style.cssText = \"position:absolute;left:-11111px;width:60px;\" + \"margin-top:1px;padding:0;border:0\";\n      div.style.cssText = \"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" + \"margin:auto;border:1px;padding:1px;\" + \"width:60%;top:1%\";\n      documentElement.appendChild(container).appendChild(div);\n      var divStyle = window.getComputedStyle(div);\n      pixelPositionVal = divStyle.top !== \"1%\"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\n      reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n      // Some styles come back with percentage values, even though they shouldn't\n\n      div.style.right = \"60%\";\n      pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36; // Support: IE 9 - 11 only\n      // Detect misreporting of content dimensions for box-sizing:border-box elements\n\n      boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36; // Support: IE 9 only\n      // Detect overflow:scroll screwiness (gh-3699)\n      // Support: Chrome <=64\n      // Don't get tricked when zoom affects offsetWidth (gh-4029)\n\n      div.style.position = \"absolute\";\n      scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;\n      documentElement.removeChild(container); // Nullify the div so it wouldn't be stored in the memory and\n      // it will also be a sign that checks already performed\n\n      div = null;\n    }\n\n    function roundPixelMeasures(measure) {\n      return Math.round(parseFloat(measure));\n    }\n\n    var pixelPositionVal,\n        boxSizingReliableVal,\n        scrollboxSizeVal,\n        pixelBoxStylesVal,\n        reliableTrDimensionsVal,\n        reliableMarginLeftVal,\n        container = document.createElement(\"div\"),\n        div = document.createElement(\"div\"); // Finish early in limited (non-browser) environments\n\n    if (!div.style) {\n      return;\n    } // Support: IE <=9 - 11 only\n    // Style of cloned element affects source element cloned (trac-8908)\n\n\n    div.style.backgroundClip = \"content-box\";\n    div.cloneNode(true).style.backgroundClip = \"\";\n    support.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n    jQuery.extend(support, {\n      boxSizingReliable: function boxSizingReliable() {\n        computeStyleTests();\n        return boxSizingReliableVal;\n      },\n      pixelBoxStyles: function pixelBoxStyles() {\n        computeStyleTests();\n        return pixelBoxStylesVal;\n      },\n      pixelPosition: function pixelPosition() {\n        computeStyleTests();\n        return pixelPositionVal;\n      },\n      reliableMarginLeft: function reliableMarginLeft() {\n        computeStyleTests();\n        return reliableMarginLeftVal;\n      },\n      scrollboxSize: function scrollboxSize() {\n        computeStyleTests();\n        return scrollboxSizeVal;\n      },\n      // Support: IE 9 - 11+, Edge 15 - 18+\n      // IE/Edge misreport `getComputedStyle` of table rows with width/height\n      // set in CSS while `offset*` properties report correct values.\n      // Behavior in IE 9 is more subtle than in newer versions & it passes\n      // some versions of this test; make sure not to make it pass there!\n      //\n      // Support: Firefox 70+\n      // Only Firefox includes border widths\n      // in computed dimensions. (gh-4529)\n      reliableTrDimensions: function reliableTrDimensions() {\n        var table, tr, trChild, trStyle;\n\n        if (reliableTrDimensionsVal == null) {\n          table = document.createElement(\"table\");\n          tr = document.createElement(\"tr\");\n          trChild = document.createElement(\"div\");\n          table.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n          tr.style.cssText = \"box-sizing:content-box;border:1px solid\"; // Support: Chrome 86+\n          // Height set through cssText does not get applied.\n          // Computed height then comes back as 0.\n\n          tr.style.height = \"1px\";\n          trChild.style.height = \"9px\"; // Support: Android 8 Chrome 86+\n          // In our bodyBackground.html iframe,\n          // display for all div elements is set to \"inline\",\n          // which causes a problem only in Android 8 Chrome 86.\n          // Ensuring the div is `display: block`\n          // gets around this issue.\n\n          trChild.style.display = \"block\";\n          documentElement.appendChild(table).appendChild(tr).appendChild(trChild);\n          trStyle = window.getComputedStyle(tr);\n          reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight;\n          documentElement.removeChild(table);\n        }\n\n        return reliableTrDimensionsVal;\n      }\n    });\n  })();\n\n  function curCSS(elem, name, computed) {\n    var width,\n        minWidth,\n        maxWidth,\n        ret,\n        isCustomProp = rcustomProp.test(name),\n        // Support: Firefox 51+\n    // Retrieving style before computed somehow\n    // fixes an issue with getting wrong values\n    // on detached elements\n    style = elem.style;\n    computed = computed || getStyles(elem); // getPropertyValue is needed for:\n    //   .css('filter') (IE 9 only, trac-12537)\n    //   .css('--customProperty) (gh-3144)\n\n    if (computed) {\n      // Support: IE <=9 - 11+\n      // IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n      // it's only available as `\"cssFloat\"`. We no longer modify properties\n      // sent to `.css()` apart from camelCasing, so we need to check both.\n      // Normally, this would create difference in behavior: if\n      // `getPropertyValue` returns an empty string, the value returned\n      // by `.css()` would be `undefined`. This is usually the case for\n      // disconnected elements. However, in IE even disconnected elements\n      // with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n      ret = computed.getPropertyValue(name) || computed[name];\n\n      if (isCustomProp && ret) {\n        // Support: Firefox 105+, Chrome <=105+\n        // Spec requires trimming whitespace for custom properties (gh-4926).\n        // Firefox only trims leading whitespace. Chrome just collapses\n        // both leading & trailing whitespace to a single space.\n        //\n        // Fall back to `undefined` if empty string returned.\n        // This collapses a missing definition with property defined\n        // and set to an empty string but there's no standard API\n        // allowing us to differentiate them without a performance penalty\n        // and returning `undefined` aligns with older jQuery.\n        //\n        // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n        // as whitespace while CSS does not, but this is not a problem\n        // because CSS preprocessing replaces them with U+000A LINE FEED\n        // (which *is* CSS whitespace)\n        // https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n        ret = ret.replace(rtrimCSS, \"$1\") || undefined;\n      }\n\n      if (ret === \"\" && !isAttached(elem)) {\n        ret = jQuery.style(elem, name);\n      } // A tribute to the \"awesome hack by Dean Edwards\"\n      // Android Browser returns percentage for some values,\n      // but width seems to be reliably pixels.\n      // This is against the CSSOM draft spec:\n      // https://drafts.csswg.org/cssom/#resolved-values\n\n\n      if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {\n        // Remember the original values\n        width = style.width;\n        minWidth = style.minWidth;\n        maxWidth = style.maxWidth; // Put in the new values to get a computed value out\n\n        style.minWidth = style.maxWidth = style.width = ret;\n        ret = computed.width; // Revert the changed values\n\n        style.width = width;\n        style.minWidth = minWidth;\n        style.maxWidth = maxWidth;\n      }\n    }\n\n    return ret !== undefined ? // Support: IE <=9 - 11 only\n    // IE returns zIndex value as an integer.\n    ret + \"\" : ret;\n  }\n\n  function addGetHookIf(conditionFn, hookFn) {\n    // Define the hook, we'll check on the first run if it's really needed.\n    return {\n      get: function get() {\n        if (conditionFn()) {\n          // Hook not needed (or it's not possible to use it due\n          // to missing dependency), remove it.\n          delete this.get;\n          return;\n        } // Hook needed; redefine it so that the support test is not executed again.\n\n\n        return (this.get = hookFn).apply(this, arguments);\n      }\n    };\n  }\n\n  var cssPrefixes = [\"Webkit\", \"Moz\", \"ms\"],\n      emptyStyle = document.createElement(\"div\").style,\n      vendorProps = {}; // Return a vendor-prefixed property or undefined\n\n  function vendorPropName(name) {\n    // Check for vendor prefixed names\n    var capName = name[0].toUpperCase() + name.slice(1),\n        i = cssPrefixes.length;\n\n    while (i--) {\n      name = cssPrefixes[i] + capName;\n\n      if (name in emptyStyle) {\n        return name;\n      }\n    }\n  } // Return a potentially-mapped jQuery.cssProps or vendor prefixed property\n\n\n  function finalPropName(name) {\n    var _final = jQuery.cssProps[name] || vendorProps[name];\n\n    if (_final) {\n      return _final;\n    }\n\n    if (name in emptyStyle) {\n      return name;\n    }\n\n    return vendorProps[name] = vendorPropName(name) || name;\n  }\n\n  var // Swappable if display is none or starts with table\n  // except \"table\", \"table-cell\", or \"table-caption\"\n  // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n  rdisplayswap = /^(none|table(?!-c[ea]).+)/,\n      cssShow = {\n    position: \"absolute\",\n    visibility: \"hidden\",\n    display: \"block\"\n  },\n      cssNormalTransform = {\n    letterSpacing: \"0\",\n    fontWeight: \"400\"\n  };\n\n  function setPositiveNumber(_elem, value, subtract) {\n    // Any relative (+/-) values have already been\n    // normalized at this point\n    var matches = rcssNum.exec(value);\n    return matches ? // Guard against undefined \"subtract\", e.g., when used as in cssHooks\n    Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || \"px\") : value;\n  }\n\n  function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {\n    var i = dimension === \"width\" ? 1 : 0,\n        extra = 0,\n        delta = 0,\n        marginDelta = 0; // Adjustment may not be necessary\n\n    if (box === (isBorderBox ? \"border\" : \"content\")) {\n      return 0;\n    }\n\n    for (; i < 4; i += 2) {\n      // Both box models exclude margin\n      // Count margin delta separately to only add it after scroll gutter adjustment.\n      // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n      if (box === \"margin\") {\n        marginDelta += jQuery.css(elem, box + cssExpand[i], true, styles);\n      } // If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\n\n      if (!isBorderBox) {\n        // Add padding\n        delta += jQuery.css(elem, \"padding\" + cssExpand[i], true, styles); // For \"border\" or \"margin\", add border\n\n        if (box !== \"padding\") {\n          delta += jQuery.css(elem, \"border\" + cssExpand[i] + \"Width\", true, styles); // But still keep track of it otherwise\n        } else {\n          extra += jQuery.css(elem, \"border\" + cssExpand[i] + \"Width\", true, styles);\n        } // If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n        // \"padding\" or \"margin\"\n\n      } else {\n        // For \"content\", subtract padding\n        if (box === \"content\") {\n          delta -= jQuery.css(elem, \"padding\" + cssExpand[i], true, styles);\n        } // For \"content\" or \"padding\", subtract border\n\n\n        if (box !== \"margin\") {\n          delta -= jQuery.css(elem, \"border\" + cssExpand[i] + \"Width\", true, styles);\n        }\n      }\n    } // Account for positive content-box scroll gutter when requested by providing computedVal\n\n\n    if (!isBorderBox && computedVal >= 0) {\n      // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n      // Assuming integer scroll gutter, subtract the rest and round down\n      delta += Math.max(0, Math.ceil(elem[\"offset\" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n      // Use an explicit zero to avoid NaN (gh-3964)\n      )) || 0;\n    }\n\n    return delta + marginDelta;\n  }\n\n  function getWidthOrHeight(elem, dimension, extra) {\n    // Start with computed style\n    var styles = getStyles(elem),\n        // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n    // Fake content-box until we know it's needed to know the true value.\n    boxSizingNeeded = !support.boxSizingReliable() || extra,\n        isBorderBox = boxSizingNeeded && jQuery.css(elem, \"boxSizing\", false, styles) === \"border-box\",\n        valueIsBorderBox = isBorderBox,\n        val = curCSS(elem, dimension, styles),\n        offsetProp = \"offset\" + dimension[0].toUpperCase() + dimension.slice(1); // Support: Firefox <=54\n    // Return a confounding non-pixel value or feign ignorance, as appropriate.\n\n    if (rnumnonpx.test(val)) {\n      if (!extra) {\n        return val;\n      }\n\n      val = \"auto\";\n    } // Support: IE 9 - 11 only\n    // Use offsetWidth/offsetHeight for when box sizing is unreliable.\n    // In those cases, the computed value can be trusted to be border-box.\n\n\n    if ((!support.boxSizingReliable() && isBorderBox || // Support: IE 10 - 11+, Edge 15 - 18+\n    // IE/Edge misreport `getComputedStyle` of table rows with width/height\n    // set in CSS while `offset*` properties report correct values.\n    // Interestingly, in some cases IE 9 doesn't suffer from this issue.\n    !support.reliableTrDimensions() && nodeName(elem, \"tr\") || // Fall back to offsetWidth/offsetHeight when value is \"auto\"\n    // This happens for inline elements with no explicit setting (gh-3571)\n    val === \"auto\" || // Support: Android <=4.1 - 4.3 only\n    // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n    !parseFloat(val) && jQuery.css(elem, \"display\", false, styles) === \"inline\") && // Make sure the element is visible & connected\n    elem.getClientRects().length) {\n      isBorderBox = jQuery.css(elem, \"boxSizing\", false, styles) === \"border-box\"; // Where available, offsetWidth/offsetHeight approximate border box dimensions.\n      // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n      // retrieved value as a content box dimension.\n\n      valueIsBorderBox = offsetProp in elem;\n\n      if (valueIsBorderBox) {\n        val = elem[offsetProp];\n      }\n    } // Normalize \"\" and auto\n\n\n    val = parseFloat(val) || 0; // Adjust for the element's box model\n\n    return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? \"border\" : \"content\"), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589)\n    val) + \"px\";\n  }\n\n  jQuery.extend({\n    // Add in style property hooks for overriding the default\n    // behavior of getting and setting a style property\n    cssHooks: {\n      opacity: {\n        get: function get(elem, computed) {\n          if (computed) {\n            // We should always get a number back from opacity\n            var ret = curCSS(elem, \"opacity\");\n            return ret === \"\" ? \"1\" : ret;\n          }\n        }\n      }\n    },\n    // Don't automatically add \"px\" to these possibly-unitless properties\n    cssNumber: {\n      animationIterationCount: true,\n      aspectRatio: true,\n      borderImageSlice: true,\n      columnCount: true,\n      flexGrow: true,\n      flexShrink: true,\n      fontWeight: true,\n      gridArea: true,\n      gridColumn: true,\n      gridColumnEnd: true,\n      gridColumnStart: true,\n      gridRow: true,\n      gridRowEnd: true,\n      gridRowStart: true,\n      lineHeight: true,\n      opacity: true,\n      order: true,\n      orphans: true,\n      scale: true,\n      widows: true,\n      zIndex: true,\n      zoom: true,\n      // SVG-related\n      fillOpacity: true,\n      floodOpacity: true,\n      stopOpacity: true,\n      strokeMiterlimit: true,\n      strokeOpacity: true\n    },\n    // Add in properties whose names you wish to fix before\n    // setting or getting the value\n    cssProps: {},\n    // Get and set the style property on a DOM Node\n    style: function style(elem, name, value, extra) {\n      // Don't set styles on text and comment nodes\n      if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {\n        return;\n      } // Make sure that we're working with the right name\n\n\n      var ret,\n          type,\n          hooks,\n          origName = camelCase(name),\n          isCustomProp = rcustomProp.test(name),\n          style = elem.style; // Make sure that we're working with the right name. We don't\n      // want to query the value if it is a CSS custom property\n      // since they are user-defined.\n\n      if (!isCustomProp) {\n        name = finalPropName(origName);\n      } // Gets hook for the prefixed version, then unprefixed version\n\n\n      hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // Check if we're setting a value\n\n      if (value !== undefined) {\n        type = _typeof(value); // Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\n        if (type === \"string\" && (ret = rcssNum.exec(value)) && ret[1]) {\n          value = adjustCSS(elem, name, ret); // Fixes bug trac-9237\n\n          type = \"number\";\n        } // Make sure that null and NaN values aren't set (trac-7116)\n\n\n        if (value == null || value !== value) {\n          return;\n        } // If a number was passed in, add the unit (except for certain CSS properties)\n        // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n        // \"px\" to a few hardcoded values.\n\n\n        if (type === \"number\" && !isCustomProp) {\n          value += ret && ret[3] || (jQuery.cssNumber[origName] ? \"\" : \"px\");\n        } // background-* props affect original clone's values\n\n\n        if (!support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0) {\n          style[name] = \"inherit\";\n        } // If a hook was provided, use that value, otherwise just set the specified value\n\n\n        if (!hooks || !(\"set\" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {\n          if (isCustomProp) {\n            style.setProperty(name, value);\n          } else {\n            style[name] = value;\n          }\n        }\n      } else {\n        // If a hook was provided get the non-computed value from there\n        if (hooks && \"get\" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {\n          return ret;\n        } // Otherwise just get the value from the style object\n\n\n        return style[name];\n      }\n    },\n    css: function css(elem, name, extra, styles) {\n      var val,\n          num,\n          hooks,\n          origName = camelCase(name),\n          isCustomProp = rcustomProp.test(name); // Make sure that we're working with the right name. We don't\n      // want to modify the value if it is a CSS custom property\n      // since they are user-defined.\n\n      if (!isCustomProp) {\n        name = finalPropName(origName);\n      } // Try prefixed name followed by the unprefixed name\n\n\n      hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // If a hook was provided get the computed value from there\n\n      if (hooks && \"get\" in hooks) {\n        val = hooks.get(elem, true, extra);\n      } // Otherwise, if a way to get the computed value exists, use that\n\n\n      if (val === undefined) {\n        val = curCSS(elem, name, styles);\n      } // Convert \"normal\" to computed value\n\n\n      if (val === \"normal\" && name in cssNormalTransform) {\n        val = cssNormalTransform[name];\n      } // Make numeric if forced or a qualifier was provided and val looks numeric\n\n\n      if (extra === \"\" || extra) {\n        num = parseFloat(val);\n        return extra === true || isFinite(num) ? num || 0 : val;\n      }\n\n      return val;\n    }\n  });\n  jQuery.each([\"height\", \"width\"], function (_i, dimension) {\n    jQuery.cssHooks[dimension] = {\n      get: function get(elem, computed, extra) {\n        if (computed) {\n          // Certain elements can have dimension info if we invisibly show them\n          // but it must have a current display style that would benefit\n          return rdisplayswap.test(jQuery.css(elem, \"display\")) && ( // Support: Safari 8+\n          // Table columns in Safari have non-zero offsetWidth & zero\n          // getBoundingClientRect().width unless display is changed.\n          // Support: IE <=11 only\n          // Running getBoundingClientRect on a disconnected node\n          // in IE throws an error.\n          !elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function () {\n            return getWidthOrHeight(elem, dimension, extra);\n          }) : getWidthOrHeight(elem, dimension, extra);\n        }\n      },\n      set: function set(elem, value, extra) {\n        var matches,\n            styles = getStyles(elem),\n            // Only read styles.position if the test has a chance to fail\n        // to avoid forcing a reflow.\n        scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === \"absolute\",\n            // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n        boxSizingNeeded = scrollboxSizeBuggy || extra,\n            isBorderBox = boxSizingNeeded && jQuery.css(elem, \"boxSizing\", false, styles) === \"border-box\",\n            subtract = extra ? boxModelAdjustment(elem, dimension, extra, isBorderBox, styles) : 0; // Account for unreliable border-box dimensions by comparing offset* to computed and\n        // faking a content-box to get border and padding (gh-3699)\n\n        if (isBorderBox && scrollboxSizeBuggy) {\n          subtract -= Math.ceil(elem[\"offset\" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, \"border\", false, styles) - 0.5);\n        } // Convert to pixels if value adjustment is needed\n\n\n        if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || \"px\") !== \"px\") {\n          elem.style[dimension] = value;\n          value = jQuery.css(elem, dimension);\n        }\n\n        return setPositiveNumber(elem, value, subtract);\n      }\n    };\n  });\n  jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {\n    if (computed) {\n      return (parseFloat(curCSS(elem, \"marginLeft\")) || elem.getBoundingClientRect().left - swap(elem, {\n        marginLeft: 0\n      }, function () {\n        return elem.getBoundingClientRect().left;\n      })) + \"px\";\n    }\n  }); // These hooks are used by animate to expand properties\n\n  jQuery.each({\n    margin: \"\",\n    padding: \"\",\n    border: \"Width\"\n  }, function (prefix, suffix) {\n    jQuery.cssHooks[prefix + suffix] = {\n      expand: function expand(value) {\n        var i = 0,\n            expanded = {},\n            // Assumes a single number if not a string\n        parts = typeof value === \"string\" ? value.split(\" \") : [value];\n\n        for (; i < 4; i++) {\n          expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];\n        }\n\n        return expanded;\n      }\n    };\n\n    if (prefix !== \"margin\") {\n      jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;\n    }\n  });\n  jQuery.fn.extend({\n    css: function css(name, value) {\n      return access(this, function (elem, name, value) {\n        var styles,\n            len,\n            map = {},\n            i = 0;\n\n        if (Array.isArray(name)) {\n          styles = getStyles(elem);\n          len = name.length;\n\n          for (; i < len; i++) {\n            map[name[i]] = jQuery.css(elem, name[i], false, styles);\n          }\n\n          return map;\n        }\n\n        return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);\n      }, name, value, arguments.length > 1);\n    }\n  });\n\n  function Tween(elem, options, prop, end, easing) {\n    return new Tween.prototype.init(elem, options, prop, end, easing);\n  }\n\n  jQuery.Tween = Tween;\n  Tween.prototype = {\n    constructor: Tween,\n    init: function init(elem, options, prop, end, easing, unit) {\n      this.elem = elem;\n      this.prop = prop;\n      this.easing = easing || jQuery.easing._default;\n      this.options = options;\n      this.start = this.now = this.cur();\n      this.end = end;\n      this.unit = unit || (jQuery.cssNumber[prop] ? \"\" : \"px\");\n    },\n    cur: function cur() {\n      var hooks = Tween.propHooks[this.prop];\n      return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);\n    },\n    run: function run(percent) {\n      var eased,\n          hooks = Tween.propHooks[this.prop];\n\n      if (this.options.duration) {\n        this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);\n      } else {\n        this.pos = eased = percent;\n      }\n\n      this.now = (this.end - this.start) * eased + this.start;\n\n      if (this.options.step) {\n        this.options.step.call(this.elem, this.now, this);\n      }\n\n      if (hooks && hooks.set) {\n        hooks.set(this);\n      } else {\n        Tween.propHooks._default.set(this);\n      }\n\n      return this;\n    }\n  };\n  Tween.prototype.init.prototype = Tween.prototype;\n  Tween.propHooks = {\n    _default: {\n      get: function get(tween) {\n        var result; // Use a property on the element directly when it is not a DOM element,\n        // or when there is no matching style property that exists.\n\n        if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {\n          return tween.elem[tween.prop];\n        } // Passing an empty string as a 3rd parameter to .css will automatically\n        // attempt a parseFloat and fallback to a string if the parse fails.\n        // Simple values such as \"10px\" are parsed to Float;\n        // complex values such as \"rotate(1rad)\" are returned as-is.\n\n\n        result = jQuery.css(tween.elem, tween.prop, \"\"); // Empty strings, null, undefined and \"auto\" are converted to 0.\n\n        return !result || result === \"auto\" ? 0 : result;\n      },\n      set: function set(tween) {\n        // Use step hook for back compat.\n        // Use cssHook if its there.\n        // Use .style if available and use plain properties where available.\n        if (jQuery.fx.step[tween.prop]) {\n          jQuery.fx.step[tween.prop](tween);\n        } else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) {\n          jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);\n        } else {\n          tween.elem[tween.prop] = tween.now;\n        }\n      }\n    }\n  }; // Support: IE <=9 only\n  // Panic based approach to setting things on disconnected nodes\n\n  Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n    set: function set(tween) {\n      if (tween.elem.nodeType && tween.elem.parentNode) {\n        tween.elem[tween.prop] = tween.now;\n      }\n    }\n  };\n  jQuery.easing = {\n    linear: function linear(p) {\n      return p;\n    },\n    swing: function swing(p) {\n      return 0.5 - Math.cos(p * Math.PI) / 2;\n    },\n    _default: \"swing\"\n  };\n  jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point\n\n  jQuery.fx.step = {};\n  var fxNow,\n      inProgress,\n      rfxtypes = /^(?:toggle|show|hide)$/,\n      rrun = /queueHooks$/;\n\n  function schedule() {\n    if (inProgress) {\n      if (document.hidden === false && window.requestAnimationFrame) {\n        window.requestAnimationFrame(schedule);\n      } else {\n        window.setTimeout(schedule, jQuery.fx.interval);\n      }\n\n      jQuery.fx.tick();\n    }\n  } // Animations created synchronously will run synchronously\n\n\n  function createFxNow() {\n    window.setTimeout(function () {\n      fxNow = undefined;\n    });\n    return fxNow = Date.now();\n  } // Generate parameters to create a standard animation\n\n\n  function genFx(type, includeWidth) {\n    var which,\n        i = 0,\n        attrs = {\n      height: type\n    }; // If we include width, step value is 1 to do all cssExpand values,\n    // otherwise step value is 2 to skip over Left and Right\n\n    includeWidth = includeWidth ? 1 : 0;\n\n    for (; i < 4; i += 2 - includeWidth) {\n      which = cssExpand[i];\n      attrs[\"margin\" + which] = attrs[\"padding\" + which] = type;\n    }\n\n    if (includeWidth) {\n      attrs.opacity = attrs.width = type;\n    }\n\n    return attrs;\n  }\n\n  function createTween(value, prop, animation) {\n    var tween,\n        collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners[\"*\"]),\n        index = 0,\n        length = collection.length;\n\n    for (; index < length; index++) {\n      if (tween = collection[index].call(animation, prop, value)) {\n        // We're done with this property\n        return tween;\n      }\n    }\n  }\n\n  function defaultPrefilter(elem, props, opts) {\n    var prop,\n        value,\n        toggle,\n        hooks,\n        oldfire,\n        propTween,\n        restoreDisplay,\n        display,\n        isBox = \"width\" in props || \"height\" in props,\n        anim = this,\n        orig = {},\n        style = elem.style,\n        hidden = elem.nodeType && isHiddenWithinTree(elem),\n        dataShow = dataPriv.get(elem, \"fxshow\"); // Queue-skipping animations hijack the fx hooks\n\n    if (!opts.queue) {\n      hooks = jQuery._queueHooks(elem, \"fx\");\n\n      if (hooks.unqueued == null) {\n        hooks.unqueued = 0;\n        oldfire = hooks.empty.fire;\n\n        hooks.empty.fire = function () {\n          if (!hooks.unqueued) {\n            oldfire();\n          }\n        };\n      }\n\n      hooks.unqueued++;\n      anim.always(function () {\n        // Ensure the complete handler is called before this completes\n        anim.always(function () {\n          hooks.unqueued--;\n\n          if (!jQuery.queue(elem, \"fx\").length) {\n            hooks.empty.fire();\n          }\n        });\n      });\n    } // Detect show/hide animations\n\n\n    for (prop in props) {\n      value = props[prop];\n\n      if (rfxtypes.test(value)) {\n        delete props[prop];\n        toggle = toggle || value === \"toggle\";\n\n        if (value === (hidden ? \"hide\" : \"show\")) {\n          // Pretend to be hidden if this is a \"show\" and\n          // there is still data from a stopped show/hide\n          if (value === \"show\" && dataShow && dataShow[prop] !== undefined) {\n            hidden = true; // Ignore all other no-op show/hide data\n          } else {\n            continue;\n          }\n        }\n\n        orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);\n      }\n    } // Bail out if this is a no-op like .hide().hide()\n\n\n    propTween = !jQuery.isEmptyObject(props);\n\n    if (!propTween && jQuery.isEmptyObject(orig)) {\n      return;\n    } // Restrict \"overflow\" and \"display\" styles during box animations\n\n\n    if (isBox && elem.nodeType === 1) {\n      // Support: IE <=9 - 11, Edge 12 - 15\n      // Record all 3 overflow attributes because IE does not infer the shorthand\n      // from identically-valued overflowX and overflowY and Edge just mirrors\n      // the overflowX value there.\n      opts.overflow = [style.overflow, style.overflowX, style.overflowY]; // Identify a display type, preferring old show/hide data over the CSS cascade\n\n      restoreDisplay = dataShow && dataShow.display;\n\n      if (restoreDisplay == null) {\n        restoreDisplay = dataPriv.get(elem, \"display\");\n      }\n\n      display = jQuery.css(elem, \"display\");\n\n      if (display === \"none\") {\n        if (restoreDisplay) {\n          display = restoreDisplay;\n        } else {\n          // Get nonempty value(s) by temporarily forcing visibility\n          showHide([elem], true);\n          restoreDisplay = elem.style.display || restoreDisplay;\n          display = jQuery.css(elem, \"display\");\n          showHide([elem]);\n        }\n      } // Animate inline elements as inline-block\n\n\n      if (display === \"inline\" || display === \"inline-block\" && restoreDisplay != null) {\n        if (jQuery.css(elem, \"float\") === \"none\") {\n          // Restore the original display value at the end of pure show/hide animations\n          if (!propTween) {\n            anim.done(function () {\n              style.display = restoreDisplay;\n            });\n\n            if (restoreDisplay == null) {\n              display = style.display;\n              restoreDisplay = display === \"none\" ? \"\" : display;\n            }\n          }\n\n          style.display = \"inline-block\";\n        }\n      }\n    }\n\n    if (opts.overflow) {\n      style.overflow = \"hidden\";\n      anim.always(function () {\n        style.overflow = opts.overflow[0];\n        style.overflowX = opts.overflow[1];\n        style.overflowY = opts.overflow[2];\n      });\n    } // Implement show/hide animations\n\n\n    propTween = false;\n\n    for (prop in orig) {\n      // General show/hide setup for this element animation\n      if (!propTween) {\n        if (dataShow) {\n          if (\"hidden\" in dataShow) {\n            hidden = dataShow.hidden;\n          }\n        } else {\n          dataShow = dataPriv.access(elem, \"fxshow\", {\n            display: restoreDisplay\n          });\n        } // Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\n\n        if (toggle) {\n          dataShow.hidden = !hidden;\n        } // Show elements before animating them\n\n\n        if (hidden) {\n          showHide([elem], true);\n        }\n        /* eslint-disable no-loop-func */\n\n\n        anim.done(function () {\n          /* eslint-enable no-loop-func */\n          // The final step of a \"hide\" animation is actually hiding the element\n          if (!hidden) {\n            showHide([elem]);\n          }\n\n          dataPriv.remove(elem, \"fxshow\");\n\n          for (prop in orig) {\n            jQuery.style(elem, prop, orig[prop]);\n          }\n        });\n      } // Per-property setup\n\n\n      propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);\n\n      if (!(prop in dataShow)) {\n        dataShow[prop] = propTween.start;\n\n        if (hidden) {\n          propTween.end = propTween.start;\n          propTween.start = 0;\n        }\n      }\n    }\n  }\n\n  function propFilter(props, specialEasing) {\n    var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass\n\n    for (index in props) {\n      name = camelCase(index);\n      easing = specialEasing[name];\n      value = props[index];\n\n      if (Array.isArray(value)) {\n        easing = value[1];\n        value = props[index] = value[0];\n      }\n\n      if (index !== name) {\n        props[name] = value;\n        delete props[index];\n      }\n\n      hooks = jQuery.cssHooks[name];\n\n      if (hooks && \"expand\" in hooks) {\n        value = hooks.expand(value);\n        delete props[name]; // Not quite $.extend, this won't overwrite existing keys.\n        // Reusing 'index' because we have the correct \"name\"\n\n        for (index in value) {\n          if (!(index in props)) {\n            props[index] = value[index];\n            specialEasing[index] = easing;\n          }\n        }\n      } else {\n        specialEasing[name] = easing;\n      }\n    }\n  }\n\n  function Animation(elem, properties, options) {\n    var result,\n        stopped,\n        index = 0,\n        length = Animation.prefilters.length,\n        deferred = jQuery.Deferred().always(function () {\n      // Don't match elem in the :animated selector\n      delete tick.elem;\n    }),\n        tick = function tick() {\n      if (stopped) {\n        return false;\n      }\n\n      var currentTime = fxNow || createFxNow(),\n          remaining = Math.max(0, animation.startTime + animation.duration - currentTime),\n          // Support: Android 2.3 only\n      // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n      temp = remaining / animation.duration || 0,\n          percent = 1 - temp,\n          index = 0,\n          length = animation.tweens.length;\n\n      for (; index < length; index++) {\n        animation.tweens[index].run(percent);\n      }\n\n      deferred.notifyWith(elem, [animation, percent, remaining]); // If there's more to do, yield\n\n      if (percent < 1 && length) {\n        return remaining;\n      } // If this was an empty animation, synthesize a final progress notification\n\n\n      if (!length) {\n        deferred.notifyWith(elem, [animation, 1, 0]);\n      } // Resolve the animation and report its conclusion\n\n\n      deferred.resolveWith(elem, [animation]);\n      return false;\n    },\n        animation = deferred.promise({\n      elem: elem,\n      props: jQuery.extend({}, properties),\n      opts: jQuery.extend(true, {\n        specialEasing: {},\n        easing: jQuery.easing._default\n      }, options),\n      originalProperties: properties,\n      originalOptions: options,\n      startTime: fxNow || createFxNow(),\n      duration: options.duration,\n      tweens: [],\n      createTween: function createTween(prop, end) {\n        var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);\n        animation.tweens.push(tween);\n        return tween;\n      },\n      stop: function stop(gotoEnd) {\n        var index = 0,\n            // If we are going to the end, we want to run all the tweens\n        // otherwise we skip this part\n        length = gotoEnd ? animation.tweens.length : 0;\n\n        if (stopped) {\n          return this;\n        }\n\n        stopped = true;\n\n        for (; index < length; index++) {\n          animation.tweens[index].run(1);\n        } // Resolve when we played the last frame; otherwise, reject\n\n\n        if (gotoEnd) {\n          deferred.notifyWith(elem, [animation, 1, 0]);\n          deferred.resolveWith(elem, [animation, gotoEnd]);\n        } else {\n          deferred.rejectWith(elem, [animation, gotoEnd]);\n        }\n\n        return this;\n      }\n    }),\n        props = animation.props;\n\n    propFilter(props, animation.opts.specialEasing);\n\n    for (; index < length; index++) {\n      result = Animation.prefilters[index].call(animation, elem, props, animation.opts);\n\n      if (result) {\n        if (isFunction(result.stop)) {\n          jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);\n        }\n\n        return result;\n      }\n    }\n\n    jQuery.map(props, createTween, animation);\n\n    if (isFunction(animation.opts.start)) {\n      animation.opts.start.call(elem, animation);\n    } // Attach callbacks from options\n\n\n    animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);\n    jQuery.fx.timer(jQuery.extend(tick, {\n      elem: elem,\n      anim: animation,\n      queue: animation.opts.queue\n    }));\n    return animation;\n  }\n\n  jQuery.Animation = jQuery.extend(Animation, {\n    tweeners: {\n      \"*\": [function (prop, value) {\n        var tween = this.createTween(prop, value);\n        adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);\n        return tween;\n      }]\n    },\n    tweener: function tweener(props, callback) {\n      if (isFunction(props)) {\n        callback = props;\n        props = [\"*\"];\n      } else {\n        props = props.match(rnothtmlwhite);\n      }\n\n      var prop,\n          index = 0,\n          length = props.length;\n\n      for (; index < length; index++) {\n        prop = props[index];\n        Animation.tweeners[prop] = Animation.tweeners[prop] || [];\n        Animation.tweeners[prop].unshift(callback);\n      }\n    },\n    prefilters: [defaultPrefilter],\n    prefilter: function prefilter(callback, prepend) {\n      if (prepend) {\n        Animation.prefilters.unshift(callback);\n      } else {\n        Animation.prefilters.push(callback);\n      }\n    }\n  });\n\n  jQuery.speed = function (speed, easing, fn) {\n    var opt = speed && _typeof(speed) === \"object\" ? jQuery.extend({}, speed) : {\n      complete: fn || !fn && easing || isFunction(speed) && speed,\n      duration: speed,\n      easing: fn && easing || easing && !isFunction(easing) && easing\n    }; // Go to the end state if fx are off\n\n    if (jQuery.fx.off) {\n      opt.duration = 0;\n    } else {\n      if (typeof opt.duration !== \"number\") {\n        if (opt.duration in jQuery.fx.speeds) {\n          opt.duration = jQuery.fx.speeds[opt.duration];\n        } else {\n          opt.duration = jQuery.fx.speeds._default;\n        }\n      }\n    } // Normalize opt.queue - true/undefined/null -> \"fx\"\n\n\n    if (opt.queue == null || opt.queue === true) {\n      opt.queue = \"fx\";\n    } // Queueing\n\n\n    opt.old = opt.complete;\n\n    opt.complete = function () {\n      if (isFunction(opt.old)) {\n        opt.old.call(this);\n      }\n\n      if (opt.queue) {\n        jQuery.dequeue(this, opt.queue);\n      }\n    };\n\n    return opt;\n  };\n\n  jQuery.fn.extend({\n    fadeTo: function fadeTo(speed, to, easing, callback) {\n      // Show any hidden elements after setting opacity to 0\n      return this.filter(isHiddenWithinTree).css(\"opacity\", 0).show() // Animate to the value specified\n      .end().animate({\n        opacity: to\n      }, speed, easing, callback);\n    },\n    animate: function animate(prop, speed, easing, callback) {\n      var empty = jQuery.isEmptyObject(prop),\n          optall = jQuery.speed(speed, easing, callback),\n          doAnimation = function doAnimation() {\n        // Operate on a copy of prop so per-property easing won't be lost\n        var anim = Animation(this, jQuery.extend({}, prop), optall); // Empty animations, or finishing resolves immediately\n\n        if (empty || dataPriv.get(this, \"finish\")) {\n          anim.stop(true);\n        }\n      };\n\n      doAnimation.finish = doAnimation;\n      return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);\n    },\n    stop: function stop(type, clearQueue, gotoEnd) {\n      var stopQueue = function stopQueue(hooks) {\n        var stop = hooks.stop;\n        delete hooks.stop;\n        stop(gotoEnd);\n      };\n\n      if (typeof type !== \"string\") {\n        gotoEnd = clearQueue;\n        clearQueue = type;\n        type = undefined;\n      }\n\n      if (clearQueue) {\n        this.queue(type || \"fx\", []);\n      }\n\n      return this.each(function () {\n        var dequeue = true,\n            index = type != null && type + \"queueHooks\",\n            timers = jQuery.timers,\n            data = dataPriv.get(this);\n\n        if (index) {\n          if (data[index] && data[index].stop) {\n            stopQueue(data[index]);\n          }\n        } else {\n          for (index in data) {\n            if (data[index] && data[index].stop && rrun.test(index)) {\n              stopQueue(data[index]);\n            }\n          }\n        }\n\n        for (index = timers.length; index--;) {\n          if (timers[index].elem === this && (type == null || timers[index].queue === type)) {\n            timers[index].anim.stop(gotoEnd);\n            dequeue = false;\n            timers.splice(index, 1);\n          }\n        } // Start the next in the queue if the last step wasn't forced.\n        // Timers currently will call their complete callbacks, which\n        // will dequeue but only if they were gotoEnd.\n\n\n        if (dequeue || !gotoEnd) {\n          jQuery.dequeue(this, type);\n        }\n      });\n    },\n    finish: function finish(type) {\n      if (type !== false) {\n        type = type || \"fx\";\n      }\n\n      return this.each(function () {\n        var index,\n            data = dataPriv.get(this),\n            queue = data[type + \"queue\"],\n            hooks = data[type + \"queueHooks\"],\n            timers = jQuery.timers,\n            length = queue ? queue.length : 0; // Enable finishing flag on private data\n\n        data.finish = true; // Empty the queue first\n\n        jQuery.queue(this, type, []);\n\n        if (hooks && hooks.stop) {\n          hooks.stop.call(this, true);\n        } // Look for any active animations, and finish them\n\n\n        for (index = timers.length; index--;) {\n          if (timers[index].elem === this && timers[index].queue === type) {\n            timers[index].anim.stop(true);\n            timers.splice(index, 1);\n          }\n        } // Look for any animations in the old queue and finish them\n\n\n        for (index = 0; index < length; index++) {\n          if (queue[index] && queue[index].finish) {\n            queue[index].finish.call(this);\n          }\n        } // Turn off finishing flag\n\n\n        delete data.finish;\n      });\n    }\n  });\n  jQuery.each([\"toggle\", \"show\", \"hide\"], function (_i, name) {\n    var cssFn = jQuery.fn[name];\n\n    jQuery.fn[name] = function (speed, easing, callback) {\n      return speed == null || typeof speed === \"boolean\" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);\n    };\n  }); // Generate shortcuts for custom animations\n\n  jQuery.each({\n    slideDown: genFx(\"show\"),\n    slideUp: genFx(\"hide\"),\n    slideToggle: genFx(\"toggle\"),\n    fadeIn: {\n      opacity: \"show\"\n    },\n    fadeOut: {\n      opacity: \"hide\"\n    },\n    fadeToggle: {\n      opacity: \"toggle\"\n    }\n  }, function (name, props) {\n    jQuery.fn[name] = function (speed, easing, callback) {\n      return this.animate(props, speed, easing, callback);\n    };\n  });\n  jQuery.timers = [];\n\n  jQuery.fx.tick = function () {\n    var timer,\n        i = 0,\n        timers = jQuery.timers;\n    fxNow = Date.now();\n\n    for (; i < timers.length; i++) {\n      timer = timers[i]; // Run the timer and safely remove it when done (allowing for external removal)\n\n      if (!timer() && timers[i] === timer) {\n        timers.splice(i--, 1);\n      }\n    }\n\n    if (!timers.length) {\n      jQuery.fx.stop();\n    }\n\n    fxNow = undefined;\n  };\n\n  jQuery.fx.timer = function (timer) {\n    jQuery.timers.push(timer);\n    jQuery.fx.start();\n  };\n\n  jQuery.fx.interval = 13;\n\n  jQuery.fx.start = function () {\n    if (inProgress) {\n      return;\n    }\n\n    inProgress = true;\n    schedule();\n  };\n\n  jQuery.fx.stop = function () {\n    inProgress = null;\n  };\n\n  jQuery.fx.speeds = {\n    slow: 600,\n    fast: 200,\n    // Default speed\n    _default: 400\n  }; // Based off of the plugin by Clint Helfers, with permission.\n\n  jQuery.fn.delay = function (time, type) {\n    time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;\n    type = type || \"fx\";\n    return this.queue(type, function (next, hooks) {\n      var timeout = window.setTimeout(next, time);\n\n      hooks.stop = function () {\n        window.clearTimeout(timeout);\n      };\n    });\n  };\n\n  (function () {\n    var input = document.createElement(\"input\"),\n        select = document.createElement(\"select\"),\n        opt = select.appendChild(document.createElement(\"option\"));\n    input.type = \"checkbox\"; // Support: Android <=4.3 only\n    // Default value for a checkbox should be \"on\"\n\n    support.checkOn = input.value !== \"\"; // Support: IE <=11 only\n    // Must access selectedIndex to make default options select\n\n    support.optSelected = opt.selected; // Support: IE <=11 only\n    // An input loses its value after becoming a radio\n\n    input = document.createElement(\"input\");\n    input.value = \"t\";\n    input.type = \"radio\";\n    support.radioValue = input.value === \"t\";\n  })();\n\n  var boolHook,\n      attrHandle = jQuery.expr.attrHandle;\n  jQuery.fn.extend({\n    attr: function attr(name, value) {\n      return access(this, jQuery.attr, name, value, arguments.length > 1);\n    },\n    removeAttr: function removeAttr(name) {\n      return this.each(function () {\n        jQuery.removeAttr(this, name);\n      });\n    }\n  });\n  jQuery.extend({\n    attr: function attr(elem, name, value) {\n      var ret,\n          hooks,\n          nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes\n\n      if (nType === 3 || nType === 8 || nType === 2) {\n        return;\n      } // Fallback to prop when attributes are not supported\n\n\n      if (typeof elem.getAttribute === \"undefined\") {\n        return jQuery.prop(elem, name, value);\n      } // Attribute hooks are determined by the lowercase version\n      // Grab necessary hook if one is defined\n\n\n      if (nType !== 1 || !jQuery.isXMLDoc(elem)) {\n        hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined);\n      }\n\n      if (value !== undefined) {\n        if (value === null) {\n          jQuery.removeAttr(elem, name);\n          return;\n        }\n\n        if (hooks && \"set\" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {\n          return ret;\n        }\n\n        elem.setAttribute(name, value + \"\");\n        return value;\n      }\n\n      if (hooks && \"get\" in hooks && (ret = hooks.get(elem, name)) !== null) {\n        return ret;\n      }\n\n      ret = jQuery.find.attr(elem, name); // Non-existent attributes return null, we normalize to undefined\n\n      return ret == null ? undefined : ret;\n    },\n    attrHooks: {\n      type: {\n        set: function set(elem, value) {\n          if (!support.radioValue && value === \"radio\" && nodeName(elem, \"input\")) {\n            var val = elem.value;\n            elem.setAttribute(\"type\", value);\n\n            if (val) {\n              elem.value = val;\n            }\n\n            return value;\n          }\n        }\n      }\n    },\n    removeAttr: function removeAttr(elem, value) {\n      var name,\n          i = 0,\n          // Attribute names can contain non-HTML whitespace characters\n      // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n      attrNames = value && value.match(rnothtmlwhite);\n\n      if (attrNames && elem.nodeType === 1) {\n        while (name = attrNames[i++]) {\n          elem.removeAttribute(name);\n        }\n      }\n    }\n  }); // Hooks for boolean attributes\n\n  boolHook = {\n    set: function set(elem, value, name) {\n      if (value === false) {\n        // Remove boolean attributes when set to false\n        jQuery.removeAttr(elem, name);\n      } else {\n        elem.setAttribute(name, name);\n      }\n\n      return name;\n    }\n  };\n  jQuery.each(jQuery.expr.match.bool.source.match(/\\w+/g), function (_i, name) {\n    var getter = attrHandle[name] || jQuery.find.attr;\n\n    attrHandle[name] = function (elem, name, isXML) {\n      var ret,\n          handle,\n          lowercaseName = name.toLowerCase();\n\n      if (!isXML) {\n        // Avoid an infinite loop by temporarily removing this function from the getter\n        handle = attrHandle[lowercaseName];\n        attrHandle[lowercaseName] = ret;\n        ret = getter(elem, name, isXML) != null ? lowercaseName : null;\n        attrHandle[lowercaseName] = handle;\n      }\n\n      return ret;\n    };\n  });\n  var rfocusable = /^(?:input|select|textarea|button)$/i,\n      rclickable = /^(?:a|area)$/i;\n  jQuery.fn.extend({\n    prop: function prop(name, value) {\n      return access(this, jQuery.prop, name, value, arguments.length > 1);\n    },\n    removeProp: function removeProp(name) {\n      return this.each(function () {\n        delete this[jQuery.propFix[name] || name];\n      });\n    }\n  });\n  jQuery.extend({\n    prop: function prop(elem, name, value) {\n      var ret,\n          hooks,\n          nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes\n\n      if (nType === 3 || nType === 8 || nType === 2) {\n        return;\n      }\n\n      if (nType !== 1 || !jQuery.isXMLDoc(elem)) {\n        // Fix name and attach hooks\n        name = jQuery.propFix[name] || name;\n        hooks = jQuery.propHooks[name];\n      }\n\n      if (value !== undefined) {\n        if (hooks && \"set\" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {\n          return ret;\n        }\n\n        return elem[name] = value;\n      }\n\n      if (hooks && \"get\" in hooks && (ret = hooks.get(elem, name)) !== null) {\n        return ret;\n      }\n\n      return elem[name];\n    },\n    propHooks: {\n      tabIndex: {\n        get: function get(elem) {\n          // Support: IE <=9 - 11 only\n          // elem.tabIndex doesn't always return the\n          // correct value when it hasn't been explicitly set\n          // Use proper attribute retrieval (trac-12072)\n          var tabindex = jQuery.find.attr(elem, \"tabindex\");\n\n          if (tabindex) {\n            return parseInt(tabindex, 10);\n          }\n\n          if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {\n            return 0;\n          }\n\n          return -1;\n        }\n      }\n    },\n    propFix: {\n      \"for\": \"htmlFor\",\n      \"class\": \"className\"\n    }\n  }); // Support: IE <=11 only\n  // Accessing the selectedIndex property\n  // forces the browser to respect setting selected\n  // on the option\n  // The getter ensures a default option is selected\n  // when in an optgroup\n  // eslint rule \"no-unused-expressions\" is disabled for this code\n  // since it considers such accessions noop\n\n  if (!support.optSelected) {\n    jQuery.propHooks.selected = {\n      get: function get(elem) {\n        /* eslint no-unused-expressions: \"off\" */\n        var parent = elem.parentNode;\n\n        if (parent && parent.parentNode) {\n          parent.parentNode.selectedIndex;\n        }\n\n        return null;\n      },\n      set: function set(elem) {\n        /* eslint no-unused-expressions: \"off\" */\n        var parent = elem.parentNode;\n\n        if (parent) {\n          parent.selectedIndex;\n\n          if (parent.parentNode) {\n            parent.parentNode.selectedIndex;\n          }\n        }\n      }\n    };\n  }\n\n  jQuery.each([\"tabIndex\", \"readOnly\", \"maxLength\", \"cellSpacing\", \"cellPadding\", \"rowSpan\", \"colSpan\", \"useMap\", \"frameBorder\", \"contentEditable\"], function () {\n    jQuery.propFix[this.toLowerCase()] = this;\n  }); // Strip and collapse whitespace according to HTML spec\n  // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\n  function stripAndCollapse(value) {\n    var tokens = value.match(rnothtmlwhite) || [];\n    return tokens.join(\" \");\n  }\n\n  function getClass(elem) {\n    return elem.getAttribute && elem.getAttribute(\"class\") || \"\";\n  }\n\n  function classesToArray(value) {\n    if (Array.isArray(value)) {\n      return value;\n    }\n\n    if (typeof value === \"string\") {\n      return value.match(rnothtmlwhite) || [];\n    }\n\n    return [];\n  }\n\n  jQuery.fn.extend({\n    addClass: function addClass(value) {\n      var classNames, cur, curValue, className, i, finalValue;\n\n      if (isFunction(value)) {\n        return this.each(function (j) {\n          jQuery(this).addClass(value.call(this, j, getClass(this)));\n        });\n      }\n\n      classNames = classesToArray(value);\n\n      if (classNames.length) {\n        return this.each(function () {\n          curValue = getClass(this);\n          cur = this.nodeType === 1 && \" \" + stripAndCollapse(curValue) + \" \";\n\n          if (cur) {\n            for (i = 0; i < classNames.length; i++) {\n              className = classNames[i];\n\n              if (cur.indexOf(\" \" + className + \" \") < 0) {\n                cur += className + \" \";\n              }\n            } // Only assign if different to avoid unneeded rendering.\n\n\n            finalValue = stripAndCollapse(cur);\n\n            if (curValue !== finalValue) {\n              this.setAttribute(\"class\", finalValue);\n            }\n          }\n        });\n      }\n\n      return this;\n    },\n    removeClass: function removeClass(value) {\n      var classNames, cur, curValue, className, i, finalValue;\n\n      if (isFunction(value)) {\n        return this.each(function (j) {\n          jQuery(this).removeClass(value.call(this, j, getClass(this)));\n        });\n      }\n\n      if (!arguments.length) {\n        return this.attr(\"class\", \"\");\n      }\n\n      classNames = classesToArray(value);\n\n      if (classNames.length) {\n        return this.each(function () {\n          curValue = getClass(this); // This expression is here for better compressibility (see addClass)\n\n          cur = this.nodeType === 1 && \" \" + stripAndCollapse(curValue) + \" \";\n\n          if (cur) {\n            for (i = 0; i < classNames.length; i++) {\n              className = classNames[i]; // Remove *all* instances\n\n              while (cur.indexOf(\" \" + className + \" \") > -1) {\n                cur = cur.replace(\" \" + className + \" \", \" \");\n              }\n            } // Only assign if different to avoid unneeded rendering.\n\n\n            finalValue = stripAndCollapse(cur);\n\n            if (curValue !== finalValue) {\n              this.setAttribute(\"class\", finalValue);\n            }\n          }\n        });\n      }\n\n      return this;\n    },\n    toggleClass: function toggleClass(value, stateVal) {\n      var classNames,\n          className,\n          i,\n          self,\n          type = _typeof(value),\n          isValidValue = type === \"string\" || Array.isArray(value);\n\n      if (isFunction(value)) {\n        return this.each(function (i) {\n          jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);\n        });\n      }\n\n      if (typeof stateVal === \"boolean\" && isValidValue) {\n        return stateVal ? this.addClass(value) : this.removeClass(value);\n      }\n\n      classNames = classesToArray(value);\n      return this.each(function () {\n        if (isValidValue) {\n          // Toggle individual class names\n          self = jQuery(this);\n\n          for (i = 0; i < classNames.length; i++) {\n            className = classNames[i]; // Check each className given, space separated list\n\n            if (self.hasClass(className)) {\n              self.removeClass(className);\n            } else {\n              self.addClass(className);\n            }\n          } // Toggle whole class name\n\n        } else if (value === undefined || type === \"boolean\") {\n          className = getClass(this);\n\n          if (className) {\n            // Store className if set\n            dataPriv.set(this, \"__className__\", className);\n          } // If the element has a class name or if we're passed `false`,\n          // then remove the whole classname (if there was one, the above saved it).\n          // Otherwise bring back whatever was previously saved (if anything),\n          // falling back to the empty string if nothing was stored.\n\n\n          if (this.setAttribute) {\n            this.setAttribute(\"class\", className || value === false ? \"\" : dataPriv.get(this, \"__className__\") || \"\");\n          }\n        }\n      });\n    },\n    hasClass: function hasClass(selector) {\n      var className,\n          elem,\n          i = 0;\n      className = \" \" + selector + \" \";\n\n      while (elem = this[i++]) {\n        if (elem.nodeType === 1 && (\" \" + stripAndCollapse(getClass(elem)) + \" \").indexOf(className) > -1) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n  });\n  var rreturn = /\\r/g;\n  jQuery.fn.extend({\n    val: function val(value) {\n      var hooks,\n          ret,\n          valueIsFunction,\n          elem = this[0];\n\n      if (!arguments.length) {\n        if (elem) {\n          hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];\n\n          if (hooks && \"get\" in hooks && (ret = hooks.get(elem, \"value\")) !== undefined) {\n            return ret;\n          }\n\n          ret = elem.value; // Handle most common string cases\n\n          if (typeof ret === \"string\") {\n            return ret.replace(rreturn, \"\");\n          } // Handle cases where value is null/undef or number\n\n\n          return ret == null ? \"\" : ret;\n        }\n\n        return;\n      }\n\n      valueIsFunction = isFunction(value);\n      return this.each(function (i) {\n        var val;\n\n        if (this.nodeType !== 1) {\n          return;\n        }\n\n        if (valueIsFunction) {\n          val = value.call(this, i, jQuery(this).val());\n        } else {\n          val = value;\n        } // Treat null/undefined as \"\"; convert numbers to string\n\n\n        if (val == null) {\n          val = \"\";\n        } else if (typeof val === \"number\") {\n          val += \"\";\n        } else if (Array.isArray(val)) {\n          val = jQuery.map(val, function (value) {\n            return value == null ? \"\" : value + \"\";\n          });\n        }\n\n        hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; // If set returns undefined, fall back to normal setting\n\n        if (!hooks || !(\"set\" in hooks) || hooks.set(this, val, \"value\") === undefined) {\n          this.value = val;\n        }\n      });\n    }\n  });\n  jQuery.extend({\n    valHooks: {\n      option: {\n        get: function get(elem) {\n          var val = jQuery.find.attr(elem, \"value\");\n          return val != null ? val : // Support: IE <=10 - 11 only\n          // option.text throws exceptions (trac-14686, trac-14858)\n          // Strip and collapse whitespace\n          // https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n          stripAndCollapse(jQuery.text(elem));\n        }\n      },\n      select: {\n        get: function get(elem) {\n          var value,\n              option,\n              i,\n              options = elem.options,\n              index = elem.selectedIndex,\n              one = elem.type === \"select-one\",\n              values = one ? null : [],\n              max = one ? index + 1 : options.length;\n\n          if (index < 0) {\n            i = max;\n          } else {\n            i = one ? index : 0;\n          } // Loop through all the selected options\n\n\n          for (; i < max; i++) {\n            option = options[i]; // Support: IE <=9 only\n            // IE8-9 doesn't update selected after form reset (trac-2551)\n\n            if ((option.selected || i === index) && // Don't return options that are disabled or in a disabled optgroup\n            !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, \"optgroup\"))) {\n              // Get the specific value for the option\n              value = jQuery(option).val(); // We don't need an array for one selects\n\n              if (one) {\n                return value;\n              } // Multi-Selects return an array\n\n\n              values.push(value);\n            }\n          }\n\n          return values;\n        },\n        set: function set(elem, value) {\n          var optionSet,\n              option,\n              options = elem.options,\n              values = jQuery.makeArray(value),\n              i = options.length;\n\n          while (i--) {\n            option = options[i];\n            /* eslint-disable no-cond-assign */\n\n            if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {\n              optionSet = true;\n            }\n            /* eslint-enable no-cond-assign */\n\n          } // Force browsers to behave consistently when non-matching value is set\n\n\n          if (!optionSet) {\n            elem.selectedIndex = -1;\n          }\n\n          return values;\n        }\n      }\n    }\n  }); // Radios and checkboxes getter/setter\n\n  jQuery.each([\"radio\", \"checkbox\"], function () {\n    jQuery.valHooks[this] = {\n      set: function set(elem, value) {\n        if (Array.isArray(value)) {\n          return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;\n        }\n      }\n    };\n\n    if (!support.checkOn) {\n      jQuery.valHooks[this].get = function (elem) {\n        return elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n      };\n    }\n  }); // Return jQuery for attributes-only inclusion\n\n  var location = window.location;\n  var nonce = {\n    guid: Date.now()\n  };\n  var rquery = /\\?/; // Cross-browser xml parsing\n\n  jQuery.parseXML = function (data) {\n    var xml, parserErrorElem;\n\n    if (!data || typeof data !== \"string\") {\n      return null;\n    } // Support: IE 9 - 11 only\n    // IE throws on parseFromString with invalid input.\n\n\n    try {\n      xml = new window.DOMParser().parseFromString(data, \"text/xml\");\n    } catch (e) {}\n\n    parserErrorElem = xml && xml.getElementsByTagName(\"parsererror\")[0];\n\n    if (!xml || parserErrorElem) {\n      jQuery.error(\"Invalid XML: \" + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function (el) {\n        return el.textContent;\n      }).join(\"\\n\") : data));\n    }\n\n    return xml;\n  };\n\n  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n      stopPropagationCallback = function stopPropagationCallback(e) {\n    e.stopPropagation();\n  };\n\n  jQuery.extend(jQuery.event, {\n    trigger: function trigger(event, data, elem, onlyHandlers) {\n      var i,\n          cur,\n          tmp,\n          bubbleType,\n          ontype,\n          handle,\n          special,\n          lastElement,\n          eventPath = [elem || document],\n          type = hasOwn.call(event, \"type\") ? event.type : event,\n          namespaces = hasOwn.call(event, \"namespace\") ? event.namespace.split(\".\") : [];\n      cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes\n\n      if (elem.nodeType === 3 || elem.nodeType === 8) {\n        return;\n      } // focus/blur morphs to focusin/out; ensure we're not firing them right now\n\n\n      if (rfocusMorph.test(type + jQuery.event.triggered)) {\n        return;\n      }\n\n      if (type.indexOf(\".\") > -1) {\n        // Namespaced trigger; create a regexp to match event type in handle()\n        namespaces = type.split(\".\");\n        type = namespaces.shift();\n        namespaces.sort();\n      }\n\n      ontype = type.indexOf(\":\") < 0 && \"on\" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string\n\n      event = event[jQuery.expando] ? event : new jQuery.Event(type, _typeof(event) === \"object\" && event); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\n      event.isTrigger = onlyHandlers ? 2 : 3;\n      event.namespace = namespaces.join(\".\");\n      event.rnamespace = event.namespace ? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null; // Clean up the event in case it is being reused\n\n      event.result = undefined;\n\n      if (!event.target) {\n        event.target = elem;\n      } // Clone any incoming data and prepend the event, creating the handler arg list\n\n\n      data = data == null ? [event] : jQuery.makeArray(data, [event]); // Allow special events to draw outside the lines\n\n      special = jQuery.event.special[type] || {};\n\n      if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {\n        return;\n      } // Determine event propagation path in advance, per W3C events spec (trac-9951)\n      // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\n\n      if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {\n        bubbleType = special.delegateType || type;\n\n        if (!rfocusMorph.test(bubbleType + type)) {\n          cur = cur.parentNode;\n        }\n\n        for (; cur; cur = cur.parentNode) {\n          eventPath.push(cur);\n          tmp = cur;\n        } // Only add window if we got to document (e.g., not plain obj or detached DOM)\n\n\n        if (tmp === (elem.ownerDocument || document)) {\n          eventPath.push(tmp.defaultView || tmp.parentWindow || window);\n        }\n      } // Fire handlers on the event path\n\n\n      i = 0;\n\n      while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {\n        lastElement = cur;\n        event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler\n\n        handle = (dataPriv.get(cur, \"events\") || Object.create(null))[event.type] && dataPriv.get(cur, \"handle\");\n\n        if (handle) {\n          handle.apply(cur, data);\n        } // Native handler\n\n\n        handle = ontype && cur[ontype];\n\n        if (handle && handle.apply && acceptData(cur)) {\n          event.result = handle.apply(cur, data);\n\n          if (event.result === false) {\n            event.preventDefault();\n          }\n        }\n      }\n\n      event.type = type; // If nobody prevented the default action, do it now\n\n      if (!onlyHandlers && !event.isDefaultPrevented()) {\n        if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {\n          // Call a native DOM method on the target with the same name as the event.\n          // Don't do default actions on window, that's where global variables be (trac-6170)\n          if (ontype && isFunction(elem[type]) && !isWindow(elem)) {\n            // Don't re-trigger an onFOO event when we call its FOO() method\n            tmp = elem[ontype];\n\n            if (tmp) {\n              elem[ontype] = null;\n            } // Prevent re-triggering of the same event, since we already bubbled it above\n\n\n            jQuery.event.triggered = type;\n\n            if (event.isPropagationStopped()) {\n              lastElement.addEventListener(type, stopPropagationCallback);\n            }\n\n            elem[type]();\n\n            if (event.isPropagationStopped()) {\n              lastElement.removeEventListener(type, stopPropagationCallback);\n            }\n\n            jQuery.event.triggered = undefined;\n\n            if (tmp) {\n              elem[ontype] = tmp;\n            }\n          }\n        }\n      }\n\n      return event.result;\n    },\n    // Piggyback on a donor event to simulate a different one\n    // Used only for `focus(in | out)` events\n    simulate: function simulate(type, elem, event) {\n      var e = jQuery.extend(new jQuery.Event(), event, {\n        type: type,\n        isSimulated: true\n      });\n      jQuery.event.trigger(e, null, elem);\n    }\n  });\n  jQuery.fn.extend({\n    trigger: function trigger(type, data) {\n      return this.each(function () {\n        jQuery.event.trigger(type, data, this);\n      });\n    },\n    triggerHandler: function triggerHandler(type, data) {\n      var elem = this[0];\n\n      if (elem) {\n        return jQuery.event.trigger(type, data, elem, true);\n      }\n    }\n  });\n  var rbracket = /\\[\\]$/,\n      rCRLF = /\\r?\\n/g,\n      rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n      rsubmittable = /^(?:input|select|textarea|keygen)/i;\n\n  function buildParams(prefix, obj, traditional, add) {\n    var name;\n\n    if (Array.isArray(obj)) {\n      // Serialize array item.\n      jQuery.each(obj, function (i, v) {\n        if (traditional || rbracket.test(prefix)) {\n          // Treat each array item as a scalar.\n          add(prefix, v);\n        } else {\n          // Item is non-scalar (array or object), encode its numeric index.\n          buildParams(prefix + \"[\" + (_typeof(v) === \"object\" && v != null ? i : \"\") + \"]\", v, traditional, add);\n        }\n      });\n    } else if (!traditional && toType(obj) === \"object\") {\n      // Serialize object item.\n      for (name in obj) {\n        buildParams(prefix + \"[\" + name + \"]\", obj[name], traditional, add);\n      }\n    } else {\n      // Serialize scalar item.\n      add(prefix, obj);\n    }\n  } // Serialize an array of form elements or a set of\n  // key/values into a query string\n\n\n  jQuery.param = function (a, traditional) {\n    var prefix,\n        s = [],\n        add = function add(key, valueOrFunction) {\n      // If value is a function, invoke it and use its return value\n      var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;\n      s[s.length] = encodeURIComponent(key) + \"=\" + encodeURIComponent(value == null ? \"\" : value);\n    };\n\n    if (a == null) {\n      return \"\";\n    } // If an array was passed in, assume that it is an array of form elements.\n\n\n    if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {\n      // Serialize the form elements\n      jQuery.each(a, function () {\n        add(this.name, this.value);\n      });\n    } else {\n      // If traditional, encode the \"old\" way (the way 1.3.2 or older\n      // did it), otherwise encode params recursively.\n      for (prefix in a) {\n        buildParams(prefix, a[prefix], traditional, add);\n      }\n    } // Return the resulting serialization\n\n\n    return s.join(\"&\");\n  };\n\n  jQuery.fn.extend({\n    serialize: function serialize() {\n      return jQuery.param(this.serializeArray());\n    },\n    serializeArray: function serializeArray() {\n      return this.map(function () {\n        // Can add propHook for \"elements\" to filter or add form elements\n        var elements = jQuery.prop(this, \"elements\");\n        return elements ? jQuery.makeArray(elements) : this;\n      }).filter(function () {\n        var type = this.type; // Use .is( \":disabled\" ) so that fieldset[disabled] works\n\n        return this.name && !jQuery(this).is(\":disabled\") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));\n      }).map(function (_i, elem) {\n        var val = jQuery(this).val();\n\n        if (val == null) {\n          return null;\n        }\n\n        if (Array.isArray(val)) {\n          return jQuery.map(val, function (val) {\n            return {\n              name: elem.name,\n              value: val.replace(rCRLF, \"\\r\\n\")\n            };\n          });\n        }\n\n        return {\n          name: elem.name,\n          value: val.replace(rCRLF, \"\\r\\n\")\n        };\n      }).get();\n    }\n  });\n  var r20 = /%20/g,\n      rhash = /#.*$/,\n      rantiCache = /([?&])_=[^&]*/,\n      rheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n      // trac-7653, trac-8125, trac-8152: local protocol detection\n  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n      rnoContent = /^(?:GET|HEAD)$/,\n      rprotocol = /^\\/\\//,\n\n  /* Prefilters\n   * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n   * 2) These are called:\n   *    - BEFORE asking for a transport\n   *    - AFTER param serialization (s.data is a string if s.processData is true)\n   * 3) key is the dataType\n   * 4) the catchall symbol \"*\" can be used\n   * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n   */\n  prefilters = {},\n\n  /* Transports bindings\n   * 1) key is the dataType\n   * 2) the catchall symbol \"*\" can be used\n   * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n   */\n  transports = {},\n      // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n  allTypes = \"*/\".concat(\"*\"),\n      // Anchor tag for parsing the document origin\n  originAnchor = document.createElement(\"a\");\n  originAnchor.href = location.href; // Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\n\n  function addToPrefiltersOrTransports(structure) {\n    // dataTypeExpression is optional and defaults to \"*\"\n    return function (dataTypeExpression, func) {\n      if (typeof dataTypeExpression !== \"string\") {\n        func = dataTypeExpression;\n        dataTypeExpression = \"*\";\n      }\n\n      var dataType,\n          i = 0,\n          dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];\n\n      if (isFunction(func)) {\n        // For each dataType in the dataTypeExpression\n        while (dataType = dataTypes[i++]) {\n          // Prepend if requested\n          if (dataType[0] === \"+\") {\n            dataType = dataType.slice(1) || \"*\";\n            (structure[dataType] = structure[dataType] || []).unshift(func); // Otherwise append\n          } else {\n            (structure[dataType] = structure[dataType] || []).push(func);\n          }\n        }\n      }\n    };\n  } // Base inspection function for prefilters and transports\n\n\n  function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {\n    var inspected = {},\n        seekingTransport = structure === transports;\n\n    function inspect(dataType) {\n      var selected;\n      inspected[dataType] = true;\n      jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {\n        var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);\n\n        if (typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[dataTypeOrTransport]) {\n          options.dataTypes.unshift(dataTypeOrTransport);\n          inspect(dataTypeOrTransport);\n          return false;\n        } else if (seekingTransport) {\n          return !(selected = dataTypeOrTransport);\n        }\n      });\n      return selected;\n    }\n\n    return inspect(options.dataTypes[0]) || !inspected[\"*\"] && inspect(\"*\");\n  } // A special extend for ajax options\n  // that takes \"flat\" options (not to be deep extended)\n  // Fixes trac-9887\n\n\n  function ajaxExtend(target, src) {\n    var key,\n        deep,\n        flatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n    for (key in src) {\n      if (src[key] !== undefined) {\n        (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];\n      }\n    }\n\n    if (deep) {\n      jQuery.extend(true, target, deep);\n    }\n\n    return target;\n  }\n  /* Handles responses to an ajax request:\n   * - finds the right dataType (mediates between content-type and expected dataType)\n   * - returns the corresponding response\n   */\n\n\n  function ajaxHandleResponses(s, jqXHR, responses) {\n    var ct,\n        type,\n        finalDataType,\n        firstDataType,\n        contents = s.contents,\n        dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process\n\n    while (dataTypes[0] === \"*\") {\n      dataTypes.shift();\n\n      if (ct === undefined) {\n        ct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n      }\n    } // Check if we're dealing with a known content-type\n\n\n    if (ct) {\n      for (type in contents) {\n        if (contents[type] && contents[type].test(ct)) {\n          dataTypes.unshift(type);\n          break;\n        }\n      }\n    } // Check to see if we have a response for the expected dataType\n\n\n    if (dataTypes[0] in responses) {\n      finalDataType = dataTypes[0];\n    } else {\n      // Try convertible dataTypes\n      for (type in responses) {\n        if (!dataTypes[0] || s.converters[type + \" \" + dataTypes[0]]) {\n          finalDataType = type;\n          break;\n        }\n\n        if (!firstDataType) {\n          firstDataType = type;\n        }\n      } // Or just use first one\n\n\n      finalDataType = finalDataType || firstDataType;\n    } // If we found a dataType\n    // We add the dataType to the list if needed\n    // and return the corresponding response\n\n\n    if (finalDataType) {\n      if (finalDataType !== dataTypes[0]) {\n        dataTypes.unshift(finalDataType);\n      }\n\n      return responses[finalDataType];\n    }\n  }\n  /* Chain conversions given the request and the original response\n   * Also sets the responseXXX fields on the jqXHR instance\n   */\n\n\n  function ajaxConvert(s, response, jqXHR, isSuccess) {\n    var conv2,\n        current,\n        conv,\n        tmp,\n        prev,\n        converters = {},\n        // Work with a copy of dataTypes in case we need to modify it for conversion\n    dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys\n\n    if (dataTypes[1]) {\n      for (conv in s.converters) {\n        converters[conv.toLowerCase()] = s.converters[conv];\n      }\n    }\n\n    current = dataTypes.shift(); // Convert to each sequential dataType\n\n    while (current) {\n      if (s.responseFields[current]) {\n        jqXHR[s.responseFields[current]] = response;\n      } // Apply the dataFilter if provided\n\n\n      if (!prev && isSuccess && s.dataFilter) {\n        response = s.dataFilter(response, s.dataType);\n      }\n\n      prev = current;\n      current = dataTypes.shift();\n\n      if (current) {\n        // There's only work to do if current dataType is non-auto\n        if (current === \"*\") {\n          current = prev; // Convert response if prev dataType is non-auto and differs from current\n        } else if (prev !== \"*\" && prev !== current) {\n          // Seek a direct converter\n          conv = converters[prev + \" \" + current] || converters[\"* \" + current]; // If none found, seek a pair\n\n          if (!conv) {\n            for (conv2 in converters) {\n              // If conv2 outputs current\n              tmp = conv2.split(\" \");\n\n              if (tmp[1] === current) {\n                // If prev can be converted to accepted input\n                conv = converters[prev + \" \" + tmp[0]] || converters[\"* \" + tmp[0]];\n\n                if (conv) {\n                  // Condense equivalence converters\n                  if (conv === true) {\n                    conv = converters[conv2]; // Otherwise, insert the intermediate dataType\n                  } else if (converters[conv2] !== true) {\n                    current = tmp[0];\n                    dataTypes.unshift(tmp[1]);\n                  }\n\n                  break;\n                }\n              }\n            }\n          } // Apply converter (if not an equivalence)\n\n\n          if (conv !== true) {\n            // Unless errors are allowed to bubble, catch and return them\n            if (conv && s[\"throws\"]) {\n              response = conv(response);\n            } else {\n              try {\n                response = conv(response);\n              } catch (e) {\n                return {\n                  state: \"parsererror\",\n                  error: conv ? e : \"No conversion from \" + prev + \" to \" + current\n                };\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return {\n      state: \"success\",\n      data: response\n    };\n  }\n\n  jQuery.extend({\n    // Counter for holding the number of active queries\n    active: 0,\n    // Last-Modified header cache for next request\n    lastModified: {},\n    etag: {},\n    ajaxSettings: {\n      url: location.href,\n      type: \"GET\",\n      isLocal: rlocalProtocol.test(location.protocol),\n      global: true,\n      processData: true,\n      async: true,\n      contentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n      /*\n      timeout: 0,\n      data: null,\n      dataType: null,\n      username: null,\n      password: null,\n      cache: null,\n      throws: false,\n      traditional: false,\n      headers: {},\n      */\n      accepts: {\n        \"*\": allTypes,\n        text: \"text/plain\",\n        html: \"text/html\",\n        xml: \"application/xml, text/xml\",\n        json: \"application/json, text/javascript\"\n      },\n      contents: {\n        xml: /\\bxml\\b/,\n        html: /\\bhtml/,\n        json: /\\bjson\\b/\n      },\n      responseFields: {\n        xml: \"responseXML\",\n        text: \"responseText\",\n        json: \"responseJSON\"\n      },\n      // Data converters\n      // Keys separate source (or catchall \"*\") and destination types with a single space\n      converters: {\n        // Convert anything to text\n        \"* text\": String,\n        // Text to html (true = no transformation)\n        \"text html\": true,\n        // Evaluate text as a json expression\n        \"text json\": JSON.parse,\n        // Parse text as xml\n        \"text xml\": jQuery.parseXML\n      },\n      // For options that shouldn't be deep extended:\n      // you can add your own custom options here if\n      // and when you create one that shouldn't be\n      // deep extended (see ajaxExtend)\n      flatOptions: {\n        url: true,\n        context: true\n      }\n    },\n    // Creates a full fledged settings object into target\n    // with both ajaxSettings and settings fields.\n    // If target is omitted, writes into ajaxSettings.\n    ajaxSetup: function ajaxSetup(target, settings) {\n      return settings ? // Building a settings object\n      ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : // Extending ajaxSettings\n      ajaxExtend(jQuery.ajaxSettings, target);\n    },\n    ajaxPrefilter: addToPrefiltersOrTransports(prefilters),\n    ajaxTransport: addToPrefiltersOrTransports(transports),\n    // Main method\n    ajax: function ajax(url, options) {\n      // If url is an object, simulate pre-1.5 signature\n      if (_typeof(url) === \"object\") {\n        options = url;\n        url = undefined;\n      } // Force options to be an object\n\n\n      options = options || {};\n\n      var transport,\n          // URL without anti-cache param\n      cacheURL,\n          // Response headers\n      responseHeadersString,\n          responseHeaders,\n          // timeout handle\n      timeoutTimer,\n          // Url cleanup var\n      urlAnchor,\n          // Request state (becomes false upon send and true upon completion)\n      completed,\n          // To know if global events are to be dispatched\n      fireGlobals,\n          // Loop variable\n      i,\n          // uncached part of the url\n      uncached,\n          // Create the final options object\n      s = jQuery.ajaxSetup({}, options),\n          // Callbacks context\n      callbackContext = s.context || s,\n          // Context for global events is callbackContext if it is a DOM node or jQuery collection\n      globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,\n          // Deferreds\n      deferred = jQuery.Deferred(),\n          completeDeferred = jQuery.Callbacks(\"once memory\"),\n          // Status-dependent callbacks\n      _statusCode = s.statusCode || {},\n          // Headers (they are sent all at once)\n      requestHeaders = {},\n          requestHeadersNames = {},\n          // Default abort message\n      strAbort = \"canceled\",\n          // Fake xhr\n      jqXHR = {\n        readyState: 0,\n        // Builds headers hashtable if needed\n        getResponseHeader: function getResponseHeader(key) {\n          var match;\n\n          if (completed) {\n            if (!responseHeaders) {\n              responseHeaders = {};\n\n              while (match = rheaders.exec(responseHeadersString)) {\n                responseHeaders[match[1].toLowerCase() + \" \"] = (responseHeaders[match[1].toLowerCase() + \" \"] || []).concat(match[2]);\n              }\n            }\n\n            match = responseHeaders[key.toLowerCase() + \" \"];\n          }\n\n          return match == null ? null : match.join(\", \");\n        },\n        // Raw string\n        getAllResponseHeaders: function getAllResponseHeaders() {\n          return completed ? responseHeadersString : null;\n        },\n        // Caches the header\n        setRequestHeader: function setRequestHeader(name, value) {\n          if (completed == null) {\n            name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;\n            requestHeaders[name] = value;\n          }\n\n          return this;\n        },\n        // Overrides response content-type header\n        overrideMimeType: function overrideMimeType(type) {\n          if (completed == null) {\n            s.mimeType = type;\n          }\n\n          return this;\n        },\n        // Status-dependent callbacks\n        statusCode: function statusCode(map) {\n          var code;\n\n          if (map) {\n            if (completed) {\n              // Execute the appropriate callbacks\n              jqXHR.always(map[jqXHR.status]);\n            } else {\n              // Lazy-add the new callbacks in a way that preserves old ones\n              for (code in map) {\n                _statusCode[code] = [_statusCode[code], map[code]];\n              }\n            }\n          }\n\n          return this;\n        },\n        // Cancel the request\n        abort: function abort(statusText) {\n          var finalText = statusText || strAbort;\n\n          if (transport) {\n            transport.abort(finalText);\n          }\n\n          done(0, finalText);\n          return this;\n        }\n      }; // Attach deferreds\n\n\n      deferred.promise(jqXHR); // Add protocol if not provided (prefilters might expect it)\n      // Handle falsy url in the settings object (trac-10093: consistency with old signature)\n      // We also use the url parameter if available\n\n      s.url = ((url || s.url || location.href) + \"\").replace(rprotocol, location.protocol + \"//\"); // Alias method option to type as per ticket trac-12004\n\n      s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list\n\n      s.dataTypes = (s.dataType || \"*\").toLowerCase().match(rnothtmlwhite) || [\"\"]; // A cross-domain request is in order when the origin doesn't match the current origin.\n\n      if (s.crossDomain == null) {\n        urlAnchor = document.createElement(\"a\"); // Support: IE <=8 - 11, Edge 12 - 15\n        // IE throws exception on accessing the href property if url is malformed,\n        // e.g. http://example.com:80x/\n\n        try {\n          urlAnchor.href = s.url; // Support: IE <=8 - 11 only\n          // Anchor's host property isn't correctly set when s.url is relative\n\n          urlAnchor.href = urlAnchor.href;\n          s.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !== urlAnchor.protocol + \"//\" + urlAnchor.host;\n        } catch (e) {\n          // If there is an error parsing the URL, assume it is crossDomain,\n          // it can be rejected by the transport if it is invalid\n          s.crossDomain = true;\n        }\n      } // Convert data if not already a string\n\n\n      if (s.data && s.processData && typeof s.data !== \"string\") {\n        s.data = jQuery.param(s.data, s.traditional);\n      } // Apply prefilters\n\n\n      inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); // If request was aborted inside a prefilter, stop there\n\n      if (completed) {\n        return jqXHR;\n      } // We can fire global events as of now if asked to\n      // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\n\n      fireGlobals = jQuery.event && s.global; // Watch for a new set of requests\n\n      if (fireGlobals && jQuery.active++ === 0) {\n        jQuery.event.trigger(\"ajaxStart\");\n      } // Uppercase the type\n\n\n      s.type = s.type.toUpperCase(); // Determine if request has content\n\n      s.hasContent = !rnoContent.test(s.type); // Save the URL in case we're toying with the If-Modified-Since\n      // and/or If-None-Match header later on\n      // Remove hash to simplify url manipulation\n\n      cacheURL = s.url.replace(rhash, \"\"); // More options handling for requests with no content\n\n      if (!s.hasContent) {\n        // Remember the hash so we can put it back\n        uncached = s.url.slice(cacheURL.length); // If data is available and should be processed, append data to url\n\n        if (s.data && (s.processData || typeof s.data === \"string\")) {\n          cacheURL += (rquery.test(cacheURL) ? \"&\" : \"?\") + s.data; // trac-9682: remove data so that it's not used in an eventual retry\n\n          delete s.data;\n        } // Add or update anti-cache param if needed\n\n\n        if (s.cache === false) {\n          cacheURL = cacheURL.replace(rantiCache, \"$1\");\n          uncached = (rquery.test(cacheURL) ? \"&\" : \"?\") + \"_=\" + nonce.guid++ + uncached;\n        } // Put hash and anti-cache on the URL that will be requested (gh-1732)\n\n\n        s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658)\n      } else if (s.data && s.processData && (s.contentType || \"\").indexOf(\"application/x-www-form-urlencoded\") === 0) {\n        s.data = s.data.replace(r20, \"+\");\n      } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\n\n      if (s.ifModified) {\n        if (jQuery.lastModified[cacheURL]) {\n          jqXHR.setRequestHeader(\"If-Modified-Since\", jQuery.lastModified[cacheURL]);\n        }\n\n        if (jQuery.etag[cacheURL]) {\n          jqXHR.setRequestHeader(\"If-None-Match\", jQuery.etag[cacheURL]);\n        }\n      } // Set the correct header, if data is being sent\n\n\n      if (s.data && s.hasContent && s.contentType !== false || options.contentType) {\n        jqXHR.setRequestHeader(\"Content-Type\", s.contentType);\n      } // Set the Accepts header for the server, depending on the dataType\n\n\n      jqXHR.setRequestHeader(\"Accept\", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\") : s.accepts[\"*\"]); // Check for headers option\n\n      for (i in s.headers) {\n        jqXHR.setRequestHeader(i, s.headers[i]);\n      } // Allow custom headers/mimetypes and early abort\n\n\n      if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) {\n        // Abort if not done already and return\n        return jqXHR.abort();\n      } // Aborting is no longer a cancellation\n\n\n      strAbort = \"abort\"; // Install callbacks on deferreds\n\n      completeDeferred.add(s.complete);\n      jqXHR.done(s.success);\n      jqXHR.fail(s.error); // Get transport\n\n      transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); // If no transport, we auto-abort\n\n      if (!transport) {\n        done(-1, \"No Transport\");\n      } else {\n        jqXHR.readyState = 1; // Send global event\n\n        if (fireGlobals) {\n          globalEventContext.trigger(\"ajaxSend\", [jqXHR, s]);\n        } // If request was aborted inside ajaxSend, stop there\n\n\n        if (completed) {\n          return jqXHR;\n        } // Timeout\n\n\n        if (s.async && s.timeout > 0) {\n          timeoutTimer = window.setTimeout(function () {\n            jqXHR.abort(\"timeout\");\n          }, s.timeout);\n        }\n\n        try {\n          completed = false;\n          transport.send(requestHeaders, done);\n        } catch (e) {\n          // Rethrow post-completion exceptions\n          if (completed) {\n            throw e;\n          } // Propagate others as results\n\n\n          done(-1, e);\n        }\n      } // Callback for when everything is done\n\n\n      function done(status, nativeStatusText, responses, headers) {\n        var isSuccess,\n            success,\n            error,\n            response,\n            modified,\n            statusText = nativeStatusText; // Ignore repeat invocations\n\n        if (completed) {\n          return;\n        }\n\n        completed = true; // Clear timeout if it exists\n\n        if (timeoutTimer) {\n          window.clearTimeout(timeoutTimer);\n        } // Dereference transport for early garbage collection\n        // (no matter how long the jqXHR object will be used)\n\n\n        transport = undefined; // Cache response headers\n\n        responseHeadersString = headers || \"\"; // Set readyState\n\n        jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful\n\n        isSuccess = status >= 200 && status < 300 || status === 304; // Get response data\n\n        if (responses) {\n          response = ajaxHandleResponses(s, jqXHR, responses);\n        } // Use a noop converter for missing script but not if jsonp\n\n\n        if (!isSuccess && jQuery.inArray(\"script\", s.dataTypes) > -1 && jQuery.inArray(\"json\", s.dataTypes) < 0) {\n          s.converters[\"text script\"] = function () {};\n        } // Convert no matter what (that way responseXXX fields are always set)\n\n\n        response = ajaxConvert(s, response, jqXHR, isSuccess); // If successful, handle type chaining\n\n        if (isSuccess) {\n          // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n          if (s.ifModified) {\n            modified = jqXHR.getResponseHeader(\"Last-Modified\");\n\n            if (modified) {\n              jQuery.lastModified[cacheURL] = modified;\n            }\n\n            modified = jqXHR.getResponseHeader(\"etag\");\n\n            if (modified) {\n              jQuery.etag[cacheURL] = modified;\n            }\n          } // if no content\n\n\n          if (status === 204 || s.type === \"HEAD\") {\n            statusText = \"nocontent\"; // if not modified\n          } else if (status === 304) {\n            statusText = \"notmodified\"; // If we have data, let's convert it\n          } else {\n            statusText = response.state;\n            success = response.data;\n            error = response.error;\n            isSuccess = !error;\n          }\n        } else {\n          // Extract error from statusText and normalize for non-aborts\n          error = statusText;\n\n          if (status || !statusText) {\n            statusText = \"error\";\n\n            if (status < 0) {\n              status = 0;\n            }\n          }\n        } // Set data for the fake xhr object\n\n\n        jqXHR.status = status;\n        jqXHR.statusText = (nativeStatusText || statusText) + \"\"; // Success/Error\n\n        if (isSuccess) {\n          deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);\n        } else {\n          deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);\n        } // Status-dependent callbacks\n\n\n        jqXHR.statusCode(_statusCode);\n        _statusCode = undefined;\n\n        if (fireGlobals) {\n          globalEventContext.trigger(isSuccess ? \"ajaxSuccess\" : \"ajaxError\", [jqXHR, s, isSuccess ? success : error]);\n        } // Complete\n\n\n        completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);\n\n        if (fireGlobals) {\n          globalEventContext.trigger(\"ajaxComplete\", [jqXHR, s]); // Handle the global AJAX counter\n\n          if (! --jQuery.active) {\n            jQuery.event.trigger(\"ajaxStop\");\n          }\n        }\n      }\n\n      return jqXHR;\n    },\n    getJSON: function getJSON(url, data, callback) {\n      return jQuery.get(url, data, callback, \"json\");\n    },\n    getScript: function getScript(url, callback) {\n      return jQuery.get(url, undefined, callback, \"script\");\n    }\n  });\n  jQuery.each([\"get\", \"post\"], function (_i, method) {\n    jQuery[method] = function (url, data, callback, type) {\n      // Shift arguments if data argument was omitted\n      if (isFunction(data)) {\n        type = type || callback;\n        callback = data;\n        data = undefined;\n      } // The url can be an options object (which then must have .url)\n\n\n      return jQuery.ajax(jQuery.extend({\n        url: url,\n        type: method,\n        dataType: type,\n        data: data,\n        success: callback\n      }, jQuery.isPlainObject(url) && url));\n    };\n  });\n  jQuery.ajaxPrefilter(function (s) {\n    var i;\n\n    for (i in s.headers) {\n      if (i.toLowerCase() === \"content-type\") {\n        s.contentType = s.headers[i] || \"\";\n      }\n    }\n  });\n\n  jQuery._evalUrl = function (url, options, doc) {\n    return jQuery.ajax({\n      url: url,\n      // Make this explicit, since user can override this through ajaxSetup (trac-11264)\n      type: \"GET\",\n      dataType: \"script\",\n      cache: true,\n      async: false,\n      global: false,\n      // Only evaluate the response if it is successful (gh-4126)\n      // dataFilter is not invoked for failure responses, so using it instead\n      // of the default converter is kludgy but it works.\n      converters: {\n        \"text script\": function textScript() {}\n      },\n      dataFilter: function dataFilter(response) {\n        jQuery.globalEval(response, options, doc);\n      }\n    });\n  };\n\n  jQuery.fn.extend({\n    wrapAll: function wrapAll(html) {\n      var wrap;\n\n      if (this[0]) {\n        if (isFunction(html)) {\n          html = html.call(this[0]);\n        } // The elements to wrap the target around\n\n\n        wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);\n\n        if (this[0].parentNode) {\n          wrap.insertBefore(this[0]);\n        }\n\n        wrap.map(function () {\n          var elem = this;\n\n          while (elem.firstElementChild) {\n            elem = elem.firstElementChild;\n          }\n\n          return elem;\n        }).append(this);\n      }\n\n      return this;\n    },\n    wrapInner: function wrapInner(html) {\n      if (isFunction(html)) {\n        return this.each(function (i) {\n          jQuery(this).wrapInner(html.call(this, i));\n        });\n      }\n\n      return this.each(function () {\n        var self = jQuery(this),\n            contents = self.contents();\n\n        if (contents.length) {\n          contents.wrapAll(html);\n        } else {\n          self.append(html);\n        }\n      });\n    },\n    wrap: function wrap(html) {\n      var htmlIsFunction = isFunction(html);\n      return this.each(function (i) {\n        jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);\n      });\n    },\n    unwrap: function unwrap(selector) {\n      this.parent(selector).not(\"body\").each(function () {\n        jQuery(this).replaceWith(this.childNodes);\n      });\n      return this;\n    }\n  });\n\n  jQuery.expr.pseudos.hidden = function (elem) {\n    return !jQuery.expr.pseudos.visible(elem);\n  };\n\n  jQuery.expr.pseudos.visible = function (elem) {\n    return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\n  };\n\n  jQuery.ajaxSettings.xhr = function () {\n    try {\n      return new window.XMLHttpRequest();\n    } catch (e) {}\n  };\n\n  var xhrSuccessStatus = {\n    // File protocol always yields status code 0, assume 200\n    0: 200,\n    // Support: IE <=9 only\n    // trac-1450: sometimes IE returns 1223 when it should be 204\n    1223: 204\n  },\n      xhrSupported = jQuery.ajaxSettings.xhr();\n  support.cors = !!xhrSupported && \"withCredentials\" in xhrSupported;\n  support.ajax = xhrSupported = !!xhrSupported;\n  jQuery.ajaxTransport(function (options) {\n    var _callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest\n\n\n    if (support.cors || xhrSupported && !options.crossDomain) {\n      return {\n        send: function send(headers, complete) {\n          var i,\n              xhr = options.xhr();\n          xhr.open(options.type, options.url, options.async, options.username, options.password); // Apply custom fields if provided\n\n          if (options.xhrFields) {\n            for (i in options.xhrFields) {\n              xhr[i] = options.xhrFields[i];\n            }\n          } // Override mime type if needed\n\n\n          if (options.mimeType && xhr.overrideMimeType) {\n            xhr.overrideMimeType(options.mimeType);\n          } // X-Requested-With header\n          // For cross-domain requests, seeing as conditions for a preflight are\n          // akin to a jigsaw puzzle, we simply never set it to be sure.\n          // (it can always be set on a per-request basis or even using ajaxSetup)\n          // For same-domain requests, won't change header if already provided.\n\n\n          if (!options.crossDomain && !headers[\"X-Requested-With\"]) {\n            headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n          } // Set headers\n\n\n          for (i in headers) {\n            xhr.setRequestHeader(i, headers[i]);\n          } // Callback\n\n\n          _callback = function callback(type) {\n            return function () {\n              if (_callback) {\n                _callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;\n\n                if (type === \"abort\") {\n                  xhr.abort();\n                } else if (type === \"error\") {\n                  // Support: IE <=9 only\n                  // On a manual native abort, IE9 throws\n                  // errors on any property access that is not readyState\n                  if (typeof xhr.status !== \"number\") {\n                    complete(0, \"error\");\n                  } else {\n                    complete( // File: protocol always yields status 0; see trac-8605, trac-14207\n                    xhr.status, xhr.statusText);\n                  }\n                } else {\n                  complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText, // Support: IE <=9 only\n                  // IE9 has no XHR2 but throws on binary (trac-11426)\n                  // For XHR2 non-text, let the caller handle it (gh-2498)\n                  (xhr.responseType || \"text\") !== \"text\" || typeof xhr.responseText !== \"string\" ? {\n                    binary: xhr.response\n                  } : {\n                    text: xhr.responseText\n                  }, xhr.getAllResponseHeaders());\n                }\n              }\n            };\n          }; // Listen to events\n\n\n          xhr.onload = _callback();\n          errorCallback = xhr.onerror = xhr.ontimeout = _callback(\"error\"); // Support: IE 9 only\n          // Use onreadystatechange to replace onabort\n          // to handle uncaught aborts\n\n          if (xhr.onabort !== undefined) {\n            xhr.onabort = errorCallback;\n          } else {\n            xhr.onreadystatechange = function () {\n              // Check readyState before timeout as it changes\n              if (xhr.readyState === 4) {\n                // Allow onerror to be called first,\n                // but that will not handle a native abort\n                // Also, save errorCallback to a variable\n                // as xhr.onerror cannot be accessed\n                window.setTimeout(function () {\n                  if (_callback) {\n                    errorCallback();\n                  }\n                });\n              }\n            };\n          } // Create the abort callback\n\n\n          _callback = _callback(\"abort\");\n\n          try {\n            // Do send the request (this may raise an exception)\n            xhr.send(options.hasContent && options.data || null);\n          } catch (e) {\n            // trac-14683: Only rethrow if this hasn't been notified as an error yet\n            if (_callback) {\n              throw e;\n            }\n          }\n        },\n        abort: function abort() {\n          if (_callback) {\n            _callback();\n          }\n        }\n      };\n    }\n  }); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\n\n  jQuery.ajaxPrefilter(function (s) {\n    if (s.crossDomain) {\n      s.contents.script = false;\n    }\n  }); // Install script dataType\n\n  jQuery.ajaxSetup({\n    accepts: {\n      script: \"text/javascript, application/javascript, \" + \"application/ecmascript, application/x-ecmascript\"\n    },\n    contents: {\n      script: /\\b(?:java|ecma)script\\b/\n    },\n    converters: {\n      \"text script\": function textScript(text) {\n        jQuery.globalEval(text);\n        return text;\n      }\n    }\n  }); // Handle cache's special case and crossDomain\n\n  jQuery.ajaxPrefilter(\"script\", function (s) {\n    if (s.cache === undefined) {\n      s.cache = false;\n    }\n\n    if (s.crossDomain) {\n      s.type = \"GET\";\n    }\n  }); // Bind script tag hack transport\n\n  jQuery.ajaxTransport(\"script\", function (s) {\n    // This transport only deals with cross domain or forced-by-attrs requests\n    if (s.crossDomain || s.scriptAttrs) {\n      var script, _callback2;\n\n      return {\n        send: function send(_, complete) {\n          script = jQuery(\"<script>\").attr(s.scriptAttrs || {}).prop({\n            charset: s.scriptCharset,\n            src: s.url\n          }).on(\"load error\", _callback2 = function callback(evt) {\n            script.remove();\n            _callback2 = null;\n\n            if (evt) {\n              complete(evt.type === \"error\" ? 404 : 200, evt.type);\n            }\n          }); // Use native DOM manipulation to avoid our domManip AJAX trickery\n\n          document.head.appendChild(script[0]);\n        },\n        abort: function abort() {\n          if (_callback2) {\n            _callback2();\n          }\n        }\n      };\n    }\n  });\n  var oldCallbacks = [],\n      rjsonp = /(=)\\?(?=&|$)|\\?\\?/; // Default jsonp settings\n\n  jQuery.ajaxSetup({\n    jsonp: \"callback\",\n    jsonpCallback: function jsonpCallback() {\n      var callback = oldCallbacks.pop() || jQuery.expando + \"_\" + nonce.guid++;\n      this[callback] = true;\n      return callback;\n    }\n  }); // Detect, normalize options and install callbacks for jsonp requests\n\n  jQuery.ajaxPrefilter(\"json jsonp\", function (s, originalSettings, jqXHR) {\n    var callbackName,\n        overwritten,\n        responseContainer,\n        jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? \"url\" : typeof s.data === \"string\" && (s.contentType || \"\").indexOf(\"application/x-www-form-urlencoded\") === 0 && rjsonp.test(s.data) && \"data\"); // Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\n    if (jsonProp || s.dataTypes[0] === \"jsonp\") {\n      // Get callback name, remembering preexisting value associated with it\n      callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback; // Insert callback into url or form data\n\n      if (jsonProp) {\n        s[jsonProp] = s[jsonProp].replace(rjsonp, \"$1\" + callbackName);\n      } else if (s.jsonp !== false) {\n        s.url += (rquery.test(s.url) ? \"&\" : \"?\") + s.jsonp + \"=\" + callbackName;\n      } // Use data converter to retrieve json after script execution\n\n\n      s.converters[\"script json\"] = function () {\n        if (!responseContainer) {\n          jQuery.error(callbackName + \" was not called\");\n        }\n\n        return responseContainer[0];\n      }; // Force json dataType\n\n\n      s.dataTypes[0] = \"json\"; // Install callback\n\n      overwritten = window[callbackName];\n\n      window[callbackName] = function () {\n        responseContainer = arguments;\n      }; // Clean-up function (fires after converters)\n\n\n      jqXHR.always(function () {\n        // If previous value didn't exist - remove it\n        if (overwritten === undefined) {\n          jQuery(window).removeProp(callbackName); // Otherwise restore preexisting value\n        } else {\n          window[callbackName] = overwritten;\n        } // Save back as free\n\n\n        if (s[callbackName]) {\n          // Make sure that re-using the options doesn't screw things around\n          s.jsonpCallback = originalSettings.jsonpCallback; // Save the callback name for future use\n\n          oldCallbacks.push(callbackName);\n        } // Call if it was a function and we have a response\n\n\n        if (responseContainer && isFunction(overwritten)) {\n          overwritten(responseContainer[0]);\n        }\n\n        responseContainer = overwritten = undefined;\n      }); // Delegate to script\n\n      return \"script\";\n    }\n  }); // Support: Safari 8 only\n  // In Safari 8 documents created via document.implementation.createHTMLDocument\n  // collapse sibling forms: the second one becomes a child of the first one.\n  // Because of that, this security measure has to be disabled in Safari 8.\n  // https://bugs.webkit.org/show_bug.cgi?id=137337\n\n  support.createHTMLDocument = function () {\n    var body = document.implementation.createHTMLDocument(\"\").body;\n    body.innerHTML = \"<form></form><form></form>\";\n    return body.childNodes.length === 2;\n  }(); // Argument \"data\" should be string of html\n  // context (optional): If specified, the fragment will be created in this context,\n  // defaults to document\n  // keepScripts (optional): If true, will include scripts passed in the html string\n\n\n  jQuery.parseHTML = function (data, context, keepScripts) {\n    if (typeof data !== \"string\") {\n      return [];\n    }\n\n    if (typeof context === \"boolean\") {\n      keepScripts = context;\n      context = false;\n    }\n\n    var base, parsed, scripts;\n\n    if (!context) {\n      // Stop scripts or inline event handlers from being executed immediately\n      // by using document.implementation\n      if (support.createHTMLDocument) {\n        context = document.implementation.createHTMLDocument(\"\"); // Set the base href for the created document\n        // so any parsed elements with URLs\n        // are based on the document's URL (gh-2965)\n\n        base = context.createElement(\"base\");\n        base.href = document.location.href;\n        context.head.appendChild(base);\n      } else {\n        context = document;\n      }\n    }\n\n    parsed = rsingleTag.exec(data);\n    scripts = !keepScripts && []; // Single tag\n\n    if (parsed) {\n      return [context.createElement(parsed[1])];\n    }\n\n    parsed = buildFragment([data], context, scripts);\n\n    if (scripts && scripts.length) {\n      jQuery(scripts).remove();\n    }\n\n    return jQuery.merge([], parsed.childNodes);\n  };\n  /**\n   * Load a url into a page\n   */\n\n\n  jQuery.fn.load = function (url, params, callback) {\n    var selector,\n        type,\n        response,\n        self = this,\n        off = url.indexOf(\" \");\n\n    if (off > -1) {\n      selector = stripAndCollapse(url.slice(off));\n      url = url.slice(0, off);\n    } // If it's a function\n\n\n    if (isFunction(params)) {\n      // We assume that it's the callback\n      callback = params;\n      params = undefined; // Otherwise, build a param string\n    } else if (params && _typeof(params) === \"object\") {\n      type = \"POST\";\n    } // If we have elements to modify, make the request\n\n\n    if (self.length > 0) {\n      jQuery.ajax({\n        url: url,\n        // If \"type\" variable is undefined, then \"GET\" method will be used.\n        // Make value of this field explicit since\n        // user can override it through ajaxSetup method\n        type: type || \"GET\",\n        dataType: \"html\",\n        data: params\n      }).done(function (responseText) {\n        // Save response for use in complete callback\n        response = arguments;\n        self.html(selector ? // If a selector was specified, locate the right elements in a dummy div\n        // Exclude scripts to avoid IE 'Permission Denied' errors\n        jQuery(\"<div>\").append(jQuery.parseHTML(responseText)).find(selector) : // Otherwise use the full result\n        responseText); // If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n        // but they are ignored because response was set above.\n        // If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n      }).always(callback && function (jqXHR, status) {\n        self.each(function () {\n          callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);\n        });\n      });\n    }\n\n    return this;\n  };\n\n  jQuery.expr.pseudos.animated = function (elem) {\n    return jQuery.grep(jQuery.timers, function (fn) {\n      return elem === fn.elem;\n    }).length;\n  };\n\n  jQuery.offset = {\n    setOffset: function setOffset(elem, options, i) {\n      var curPosition,\n          curLeft,\n          curCSSTop,\n          curTop,\n          curOffset,\n          curCSSLeft,\n          calculatePosition,\n          position = jQuery.css(elem, \"position\"),\n          curElem = jQuery(elem),\n          props = {}; // Set position first, in-case top/left are set even on static elem\n\n      if (position === \"static\") {\n        elem.style.position = \"relative\";\n      }\n\n      curOffset = curElem.offset();\n      curCSSTop = jQuery.css(elem, \"top\");\n      curCSSLeft = jQuery.css(elem, \"left\");\n      calculatePosition = (position === \"absolute\" || position === \"fixed\") && (curCSSTop + curCSSLeft).indexOf(\"auto\") > -1; // Need to be able to calculate position if either\n      // top or left is auto and position is either absolute or fixed\n\n      if (calculatePosition) {\n        curPosition = curElem.position();\n        curTop = curPosition.top;\n        curLeft = curPosition.left;\n      } else {\n        curTop = parseFloat(curCSSTop) || 0;\n        curLeft = parseFloat(curCSSLeft) || 0;\n      }\n\n      if (isFunction(options)) {\n        // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n        options = options.call(elem, i, jQuery.extend({}, curOffset));\n      }\n\n      if (options.top != null) {\n        props.top = options.top - curOffset.top + curTop;\n      }\n\n      if (options.left != null) {\n        props.left = options.left - curOffset.left + curLeft;\n      }\n\n      if (\"using\" in options) {\n        options.using.call(elem, props);\n      } else {\n        curElem.css(props);\n      }\n    }\n  };\n  jQuery.fn.extend({\n    // offset() relates an element's border box to the document origin\n    offset: function offset(options) {\n      // Preserve chaining for setter\n      if (arguments.length) {\n        return options === undefined ? this : this.each(function (i) {\n          jQuery.offset.setOffset(this, options, i);\n        });\n      }\n\n      var rect,\n          win,\n          elem = this[0];\n\n      if (!elem) {\n        return;\n      } // Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n      // Support: IE <=11 only\n      // Running getBoundingClientRect on a\n      // disconnected node in IE throws an error\n\n\n      if (!elem.getClientRects().length) {\n        return {\n          top: 0,\n          left: 0\n        };\n      } // Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\n\n      rect = elem.getBoundingClientRect();\n      win = elem.ownerDocument.defaultView;\n      return {\n        top: rect.top + win.pageYOffset,\n        left: rect.left + win.pageXOffset\n      };\n    },\n    // position() relates an element's margin box to its offset parent's padding box\n    // This corresponds to the behavior of CSS absolute positioning\n    position: function position() {\n      if (!this[0]) {\n        return;\n      }\n\n      var offsetParent,\n          offset,\n          doc,\n          elem = this[0],\n          parentOffset = {\n        top: 0,\n        left: 0\n      }; // position:fixed elements are offset from the viewport, which itself always has zero offset\n\n      if (jQuery.css(elem, \"position\") === \"fixed\") {\n        // Assume position:fixed implies availability of getBoundingClientRect\n        offset = elem.getBoundingClientRect();\n      } else {\n        offset = this.offset(); // Account for the *real* offset parent, which can be the document or its root element\n        // when a statically positioned element is identified\n\n        doc = elem.ownerDocument;\n        offsetParent = elem.offsetParent || doc.documentElement;\n\n        while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && jQuery.css(offsetParent, \"position\") === \"static\") {\n          offsetParent = offsetParent.parentNode;\n        }\n\n        if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {\n          // Incorporate borders into its offset, since they are outside its content origin\n          parentOffset = jQuery(offsetParent).offset();\n          parentOffset.top += jQuery.css(offsetParent, \"borderTopWidth\", true);\n          parentOffset.left += jQuery.css(offsetParent, \"borderLeftWidth\", true);\n        }\n      } // Subtract parent offsets and element margins\n\n\n      return {\n        top: offset.top - parentOffset.top - jQuery.css(elem, \"marginTop\", true),\n        left: offset.left - parentOffset.left - jQuery.css(elem, \"marginLeft\", true)\n      };\n    },\n    // This method will return documentElement in the following cases:\n    // 1) For the element inside the iframe without offsetParent, this method will return\n    //    documentElement of the parent window\n    // 2) For the hidden or detached element\n    // 3) For body or html element, i.e. in case of the html node - it will return itself\n    //\n    // but those exceptions were never presented as a real life use-cases\n    // and might be considered as more preferable results.\n    //\n    // This logic, however, is not guaranteed and can change at any point in the future\n    offsetParent: function offsetParent() {\n      return this.map(function () {\n        var offsetParent = this.offsetParent;\n\n        while (offsetParent && jQuery.css(offsetParent, \"position\") === \"static\") {\n          offsetParent = offsetParent.offsetParent;\n        }\n\n        return offsetParent || documentElement;\n      });\n    }\n  }); // Create scrollLeft and scrollTop methods\n\n  jQuery.each({\n    scrollLeft: \"pageXOffset\",\n    scrollTop: \"pageYOffset\"\n  }, function (method, prop) {\n    var top = \"pageYOffset\" === prop;\n\n    jQuery.fn[method] = function (val) {\n      return access(this, function (elem, method, val) {\n        // Coalesce documents and windows\n        var win;\n\n        if (isWindow(elem)) {\n          win = elem;\n        } else if (elem.nodeType === 9) {\n          win = elem.defaultView;\n        }\n\n        if (val === undefined) {\n          return win ? win[prop] : elem[method];\n        }\n\n        if (win) {\n          win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset);\n        } else {\n          elem[method] = val;\n        }\n      }, method, val, arguments.length);\n    };\n  }); // Support: Safari <=7 - 9.1, Chrome <=37 - 49\n  // Add the top/left cssHooks using jQuery.fn.position\n  // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n  // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n  // getComputedStyle returns percent when specified for top/left/bottom/right;\n  // rather than make the css module depend on the offset module, just check for it here\n\n  jQuery.each([\"top\", \"left\"], function (_i, prop) {\n    jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {\n      if (computed) {\n        computed = curCSS(elem, prop); // If curCSS returns percentage, fallback to offset\n\n        return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + \"px\" : computed;\n      }\n    });\n  }); // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\n\n  jQuery.each({\n    Height: \"height\",\n    Width: \"width\"\n  }, function (name, type) {\n    jQuery.each({\n      padding: \"inner\" + name,\n      content: type,\n      \"\": \"outer\" + name\n    }, function (defaultExtra, funcName) {\n      // Margin is only for outerHeight, outerWidth\n      jQuery.fn[funcName] = function (margin, value) {\n        var chainable = arguments.length && (defaultExtra || typeof margin !== \"boolean\"),\n            extra = defaultExtra || (margin === true || value === true ? \"margin\" : \"border\");\n        return access(this, function (elem, type, value) {\n          var doc;\n\n          if (isWindow(elem)) {\n            // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n            return funcName.indexOf(\"outer\") === 0 ? elem[\"inner\" + name] : elem.document.documentElement[\"client\" + name];\n          } // Get document width or height\n\n\n          if (elem.nodeType === 9) {\n            doc = elem.documentElement; // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n            // whichever is greatest\n\n            return Math.max(elem.body[\"scroll\" + name], doc[\"scroll\" + name], elem.body[\"offset\" + name], doc[\"offset\" + name], doc[\"client\" + name]);\n          }\n\n          return value === undefined ? // Get width or height on the element, requesting but not forcing parseFloat\n          jQuery.css(elem, type, extra) : // Set width or height on the element\n          jQuery.style(elem, type, value, extra);\n        }, type, chainable ? margin : undefined, chainable);\n      };\n    });\n  });\n  jQuery.each([\"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\"], function (_i, type) {\n    jQuery.fn[type] = function (fn) {\n      return this.on(type, fn);\n    };\n  });\n  jQuery.fn.extend({\n    bind: function bind(types, data, fn) {\n      return this.on(types, null, data, fn);\n    },\n    unbind: function unbind(types, fn) {\n      return this.off(types, null, fn);\n    },\n    delegate: function delegate(selector, types, data, fn) {\n      return this.on(types, selector, data, fn);\n    },\n    undelegate: function undelegate(selector, types, fn) {\n      // ( namespace ) or ( selector, types [, fn] )\n      return arguments.length === 1 ? this.off(selector, \"**\") : this.off(types, selector || \"**\", fn);\n    },\n    hover: function hover(fnOver, fnOut) {\n      return this.on(\"mouseenter\", fnOver).on(\"mouseleave\", fnOut || fnOver);\n    }\n  });\n  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) {\n    // Handle event binding\n    jQuery.fn[name] = function (data, fn) {\n      return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);\n    };\n  }); // Support: Android <=4.0 only\n  // Make sure we trim BOM and NBSP\n  // Require that the \"whitespace run\" starts from a non-whitespace\n  // to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\n\n  var rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g; // Bind a function to a context, optionally partially applying any\n  // arguments.\n  // jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n  // However, it is not slated for removal any time soon\n\n  jQuery.proxy = function (fn, context) {\n    var tmp, args, proxy;\n\n    if (typeof context === \"string\") {\n      tmp = fn[context];\n      context = fn;\n      fn = tmp;\n    } // Quick check to determine if target is callable, in the spec\n    // this throws a TypeError, but we will just return undefined.\n\n\n    if (!isFunction(fn)) {\n      return undefined;\n    } // Simulated bind\n\n\n    args = _slice.call(arguments, 2);\n\n    proxy = function proxy() {\n      return fn.apply(context || this, args.concat(_slice.call(arguments)));\n    }; // Set the guid of unique handler to the same of original handler, so it can be removed\n\n\n    proxy.guid = fn.guid = fn.guid || jQuery.guid++;\n    return proxy;\n  };\n\n  jQuery.holdReady = function (hold) {\n    if (hold) {\n      jQuery.readyWait++;\n    } else {\n      jQuery.ready(true);\n    }\n  };\n\n  jQuery.isArray = Array.isArray;\n  jQuery.parseJSON = JSON.parse;\n  jQuery.nodeName = nodeName;\n  jQuery.isFunction = isFunction;\n  jQuery.isWindow = isWindow;\n  jQuery.camelCase = camelCase;\n  jQuery.type = toType;\n  jQuery.now = Date.now;\n\n  jQuery.isNumeric = function (obj) {\n    // As of jQuery 3.0, isNumeric is limited to\n    // strings and numbers (primitives or objects)\n    // that can be coerced to finite numbers (gh-2662)\n    var type = jQuery.type(obj);\n    return (type === \"number\" || type === \"string\") && // parseFloat NaNs numeric-cast false positives (\"\")\n    // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n    // subtraction forces infinities to NaN\n    !isNaN(obj - parseFloat(obj));\n  };\n\n  jQuery.trim = function (text) {\n    return text == null ? \"\" : (text + \"\").replace(rtrim, \"$1\");\n  }; // Register as a named AMD module, since jQuery can be concatenated with other\n  // files that may use define, but not via a proper concatenation script that\n  // understands anonymous AMD modules. A named AMD is safest and most robust\n  // way to register. Lowercase jquery is used because AMD module names are\n  // derived from file names, and jQuery is normally delivered in a lowercase\n  // file name. Do this after creating the global so that if an AMD module wants\n  // to call noConflict to hide this version of jQuery, it will work.\n  // Note that for maximum portability, libraries that are not jQuery should\n  // declare themselves as anonymous modules, and avoid setting a global if an\n  // AMD loader is present. jQuery is a special case. For more information, see\n  // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\n\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n      return jQuery;\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n\n  var // Map over jQuery in case of overwrite\n  _jQuery = window.jQuery,\n      // Map over the $ in case of overwrite\n  _$ = window.$;\n\n  jQuery.noConflict = function (deep) {\n    if (window.$ === jQuery) {\n      window.$ = _$;\n    }\n\n    if (deep && window.jQuery === jQuery) {\n      window.jQuery = _jQuery;\n    }\n\n    return jQuery;\n  }; // Expose jQuery and $ identifiers, even in AMD\n  // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n  // and CommonJS for browser emulators (trac-13566)\n\n\n  if (typeof noGlobal === \"undefined\") {\n    window.jQuery = window.$ = jQuery;\n  }\n\n  return jQuery;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://rup/./node_modules/jquery/dist/jquery.js?");

/***/ }),

/***/ "./node_modules/jstree/dist/jstree.js":
/*!********************************************!*\
  !*** ./node_modules/jstree/dist/jstree.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*globals jQuery, define, module, exports, require, window, document, postMessage */\n(function (factory) {\n  \"use strict\";\n\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, undefined) {\n  \"use strict\";\n  /*!\n   * jsTree 3.3.12\n   * http://jstree.com/\n   *\n   * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com)\n   *\n   * Licensed same as jquery - under the terms of the MIT License\n   *   http://www.opensource.org/licenses/mit-license.php\n   */\n\n  /*!\n   * if using jslint please allow for the jQuery global and use following options:\n   * jslint: loopfunc: true, browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true\n   */\n\n  /*jshint -W083 */\n  // prevent another load? maybe there is a better way?\n\n  if ($.jstree) {\n    return;\n  }\n  /**\n   * ### jsTree core functionality\n   */\n  // internal variables\n\n\n  var instance_counter = 0,\n      ccp_node = false,\n      ccp_mode = false,\n      ccp_inst = false,\n      themes_loaded = [],\n      src = $('script:last').attr('src'),\n      document = window.document; // local variable is always faster to access then a global\n\n  var setImmediate = window.setImmediate;\n  var Promise = window.Promise;\n\n  if (!setImmediate && Promise) {\n    // Good enough approximation of setImmediate\n    setImmediate = function setImmediate(cb, arg) {\n      Promise.resolve(arg).then(cb);\n    };\n  }\n  /**\n   * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances.\n   * @name $.jstree\n   */\n\n\n  $.jstree = {\n    /**\n     * specifies the jstree version in use\n     * @name $.jstree.version\n     */\n    version: '3.3.12',\n\n    /**\n     * holds all the default options used when creating new instances\n     * @name $.jstree.defaults\n     */\n    defaults: {\n      /**\n       * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]`\n       * @name $.jstree.defaults.plugins\n       */\n      plugins: []\n    },\n\n    /**\n     * stores all loaded jstree plugins (used internally)\n     * @name $.jstree.plugins\n     */\n    plugins: {},\n    path: src && src.indexOf('/') !== -1 ? src.replace(/\\/[^\\/]+$/, '') : '',\n    idregex: /[\\\\:&!^|()\\[\\]<>@*'+~#\";.,=\\- \\/${}%?`]/g,\n    root: '#'\n  };\n  /**\n   * creates a jstree instance\n   * @name $.jstree.create(el [, options])\n   * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector\n   * @param {Object} options options for this instance (extends `$.jstree.defaults`)\n   * @return {jsTree} the new instance\n   */\n\n  $.jstree.create = function (el, options) {\n    var tmp = new $.jstree.core(++instance_counter),\n        opt = options;\n    options = $.extend(true, {}, $.jstree.defaults, options);\n\n    if (opt && opt.plugins) {\n      options.plugins = opt.plugins;\n    }\n\n    $.each(options.plugins, function (i, k) {\n      if (i !== 'core') {\n        tmp = tmp.plugin(k, options[k]);\n      }\n    });\n    $(el).data('jstree', tmp);\n    tmp.init(el, options);\n    return tmp;\n  };\n  /**\n   * remove all traces of jstree from the DOM and destroy all instances\n   * @name $.jstree.destroy()\n   */\n\n\n  $.jstree.destroy = function () {\n    $('.jstree:jstree').jstree('destroy');\n    $(document).off('.jstree');\n  };\n  /**\n   * the jstree class constructor, used only internally\n   * @private\n   * @name $.jstree.core(id)\n   * @param {Number} id this instance's index\n   */\n\n\n  $.jstree.core = function (id) {\n    this._id = id;\n    this._cnt = 0;\n    this._wrk = null;\n    this._data = {\n      core: {\n        themes: {\n          name: false,\n          dots: false,\n          icons: false,\n          ellipsis: false\n        },\n        selected: [],\n        last_error: {},\n        working: false,\n        worker_queue: [],\n        focused: null\n      }\n    };\n  };\n  /**\n   * get a reference to an existing instance\n   *\n   * __Examples__\n   *\n   *\t// provided a container with an ID of \"tree\", and a nested node with an ID of \"branch\"\n   *\t// all of there will return the same instance\n   *\t$.jstree.reference('tree');\n   *\t$.jstree.reference('#tree');\n   *\t$.jstree.reference($('#tree'));\n   *\t$.jstree.reference(document.getElementByID('tree'));\n   *\t$.jstree.reference('branch');\n   *\t$.jstree.reference('#branch');\n   *\t$.jstree.reference($('#branch'));\n   *\t$.jstree.reference(document.getElementByID('branch'));\n   *\n   * @name $.jstree.reference(needle)\n   * @param {DOMElement|jQuery|String} needle\n   * @return {jsTree|null} the instance or `null` if not found\n   */\n\n\n  $.jstree.reference = function (needle) {\n    var tmp = null,\n        obj = null;\n\n    if (needle && needle.id && (!needle.tagName || !needle.nodeType)) {\n      needle = needle.id;\n    }\n\n    if (!obj || !obj.length) {\n      try {\n        obj = $(needle);\n      } catch (ignore) {}\n    }\n\n    if (!obj || !obj.length) {\n      try {\n        obj = $('#' + needle.replace($.jstree.idregex, '\\\\$&'));\n      } catch (ignore) {}\n    }\n\n    if (obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) {\n      tmp = obj;\n    } else {\n      $('.jstree').each(function () {\n        var inst = $(this).data('jstree');\n\n        if (inst && inst._model.data[needle]) {\n          tmp = inst;\n          return false;\n        }\n      });\n    }\n\n    return tmp;\n  };\n  /**\n   * Create an instance, get an instance or invoke a command on a instance.\n   *\n   * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken).\n   *\n   * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function).\n   *\n   * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`).\n   *\n   * In any other case - nothing is returned and chaining is not broken.\n   *\n   * __Examples__\n   *\n   *\t$('#tree1').jstree(); // creates an instance\n   *\t$('#tree2').jstree({ plugins : [] }); // create an instance with some options\n   *\t$('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments\n   *\t$('#tree2').jstree(); // get an existing instance (or create an instance)\n   *\t$('#tree2').jstree(true); // get an existing instance (will not create new instance)\n   *\t$('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method)\n   *\n   * @name $().jstree([arg])\n   * @param {String|Object} arg\n   * @return {Mixed}\n   */\n\n\n  $.fn.jstree = function (arg) {\n    // check for string argument\n    var is_method = typeof arg === 'string',\n        args = Array.prototype.slice.call(arguments, 1),\n        result = null;\n\n    if (arg === true && !this.length) {\n      return false;\n    }\n\n    this.each(function () {\n      // get the instance (if there is one) and method (if it exists)\n      var instance = $.jstree.reference(this),\n          method = is_method && instance ? instance[arg] : null; // if calling a method, and method is available - execute on the instance\n\n      result = is_method && method ? method.apply(instance, args) : null; // if there is no instance and no method is being called - create one\n\n      if (!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) {\n        $.jstree.create(this, arg);\n      } // if there is an instance and no method is called - return the instance\n\n\n      if (instance && !is_method || arg === true) {\n        result = instance || false;\n      } // if there was a method call which returned a result - break and return the value\n\n\n      if (result !== null && result !== undefined) {\n        return false;\n      }\n    }); // if there was a method call with a valid return value - return that, otherwise continue the chain\n\n    return result !== null && result !== undefined ? result : this;\n  };\n  /**\n   * used to find elements containing an instance\n   *\n   * __Examples__\n   *\n   *\t$('div:jstree').each(function () {\n   *\t\t$(this).jstree('destroy');\n   *\t});\n   *\n   * @name $(':jstree')\n   * @return {jQuery}\n   */\n\n\n  $.expr.pseudos.jstree = $.expr.createPseudo(function (search) {\n    return function (a) {\n      return $(a).hasClass('jstree') && $(a).data('jstree') !== undefined;\n    };\n  });\n  /**\n   * stores all defaults for the core\n   * @name $.jstree.defaults.core\n   */\n\n  $.jstree.defaults.core = {\n    /**\n     * data configuration\n     *\n     * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items).\n     *\n     * You can also pass in a HTML string or a JSON array here.\n     *\n     * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree.\n     * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used.\n     *\n     * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result.\n     *\n     * __Examples__\n     *\n     *\t// AJAX\n     *\t$('#tree').jstree({\n     *\t\t'core' : {\n     *\t\t\t'data' : {\n     *\t\t\t\t'url' : '/get/children/',\n     *\t\t\t\t'data' : function (node) {\n     *\t\t\t\t\treturn { 'id' : node.id };\n     *\t\t\t\t}\n     *\t\t\t}\n     *\t\t});\n     *\n     *\t// direct data\n     *\t$('#tree').jstree({\n     *\t\t'core' : {\n     *\t\t\t'data' : [\n     *\t\t\t\t'Simple root node',\n     *\t\t\t\t{\n     *\t\t\t\t\t'id' : 'node_2',\n     *\t\t\t\t\t'text' : 'Root node with options',\n     *\t\t\t\t\t'state' : { 'opened' : true, 'selected' : true },\n     *\t\t\t\t\t'children' : [ { 'text' : 'Child 1' }, 'Child 2']\n     *\t\t\t\t}\n     *\t\t\t]\n     *\t\t}\n     *\t});\n     *\n     *\t// function\n     *\t$('#tree').jstree({\n     *\t\t'core' : {\n     *\t\t\t'data' : function (obj, callback) {\n     *\t\t\t\tcallback.call(this, ['Root 1', 'Root 2']);\n     *\t\t\t}\n     *\t\t});\n     *\n     * @name $.jstree.defaults.core.data\n     */\n    data: false,\n\n    /**\n     * configure the various strings used throughout the tree\n     *\n     * You can use an object where the key is the string you need to replace and the value is your replacement.\n     * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement.\n     * If left as `false` no replacement is made.\n     *\n     * __Examples__\n     *\n     *\t$('#tree').jstree({\n     *\t\t'core' : {\n     *\t\t\t'strings' : {\n     *\t\t\t\t'Loading ...' : 'Please wait ...'\n     *\t\t\t}\n     *\t\t}\n     *\t});\n     *\n     * @name $.jstree.defaults.core.strings\n     */\n    strings: false,\n\n    /**\n     * determines what happens when a user tries to modify the structure of the tree\n     * If left as `false` all operations like create, rename, delete, move or copy are prevented.\n     * You can set this to `true` to allow all interactions or use a function to have better control.\n     *\n     * __Examples__\n     *\n     *\t$('#tree').jstree({\n     *\t\t'core' : {\n     *\t\t\t'check_callback' : function (operation, node, node_parent, node_position, more) {\n     *\t\t\t\t// operation can be 'create_node', 'rename_node', 'delete_node', 'move_node', 'copy_node' or 'edit'\n     *\t\t\t\t// in case of 'rename_node' node_position is filled with the new node name\n     *\t\t\t\treturn operation === 'rename_node' ? true : false;\n     *\t\t\t}\n     *\t\t}\n     *\t});\n     *\n     * @name $.jstree.defaults.core.check_callback\n     */\n    check_callback: false,\n\n    /**\n     * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc)\n     * @name $.jstree.defaults.core.error\n     */\n    error: $.noop,\n\n    /**\n     * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`)\n     * @name $.jstree.defaults.core.animation\n     */\n    animation: 200,\n\n    /**\n     * a boolean indicating if multiple nodes can be selected\n     * @name $.jstree.defaults.core.multiple\n     */\n    multiple: true,\n\n    /**\n     * theme configuration object\n     * @name $.jstree.defaults.core.themes\n     */\n    themes: {\n      /**\n       * the name of the theme to use (if left as `false` the default theme is used)\n       * @name $.jstree.defaults.core.themes.name\n       */\n      name: false,\n\n      /**\n       * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme.\n       * @name $.jstree.defaults.core.themes.url\n       */\n      url: false,\n\n      /**\n       * the location of all jstree themes - only used if `url` is set to `true`\n       * @name $.jstree.defaults.core.themes.dir\n       */\n      dir: false,\n\n      /**\n       * a boolean indicating if connecting dots are shown\n       * @name $.jstree.defaults.core.themes.dots\n       */\n      dots: true,\n\n      /**\n       * a boolean indicating if node icons are shown\n       * @name $.jstree.defaults.core.themes.icons\n       */\n      icons: true,\n\n      /**\n       * a boolean indicating if node ellipsis should be shown - this only works with a fixed with on the container\n       * @name $.jstree.defaults.core.themes.ellipsis\n       */\n      ellipsis: false,\n\n      /**\n       * a boolean indicating if the tree background is striped\n       * @name $.jstree.defaults.core.themes.stripes\n       */\n      stripes: false,\n\n      /**\n       * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants)\n       * @name $.jstree.defaults.core.themes.variant\n       */\n      variant: false,\n\n      /**\n       * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`.\n       * @name $.jstree.defaults.core.themes.responsive\n       */\n      responsive: false\n    },\n\n    /**\n     * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user)\n     * @name $.jstree.defaults.core.expand_selected_onload\n     */\n    expand_selected_onload: true,\n\n    /**\n     * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true`\n     * @name $.jstree.defaults.core.worker\n     */\n    worker: true,\n\n    /**\n     * Force node text to plain text (and escape HTML). Defaults to `false`\n     * @name $.jstree.defaults.core.force_text\n     */\n    force_text: false,\n\n    /**\n     * Should the node be toggled if the text is double clicked. Defaults to `true`\n     * @name $.jstree.defaults.core.dblclick_toggle\n     */\n    dblclick_toggle: true,\n\n    /**\n     * Should the loaded nodes be part of the state. Defaults to `false`\n     * @name $.jstree.defaults.core.loaded_state\n     */\n    loaded_state: false,\n\n    /**\n     * Should the last active node be focused when the tree container is blurred and the focused again. This helps working with screen readers. Defaults to `true`\n     * @name $.jstree.defaults.core.restore_focus\n     */\n    restore_focus: true,\n\n    /**\n     * Force to compute and set \"aria-setsize\" and \"aria-posinset\" explicitly for each treeitem. \n     * Some browsers may compute incorrect elements position and produce wrong announcements for screen readers. Defaults to `false`\n     * @name $.jstree.defaults.core.compute_elements_positions\n     */\n    compute_elements_positions: false,\n\n    /**\n     * Default keyboard shortcuts (an object where each key is the button name or combo - like 'enter', 'ctrl-space', 'p', etc and the value is the function to execute in the instance's scope)\n     * @name $.jstree.defaults.core.keyboard\n     */\n    keyboard: {\n      'ctrl-space': function ctrlSpace(e) {\n        // aria defines space only with Ctrl\n        e.type = \"click\";\n        $(e.currentTarget).trigger(e);\n      },\n      'enter': function enter(e) {\n        // enter\n        e.type = \"click\";\n        $(e.currentTarget).trigger(e);\n      },\n      'left': function left(e) {\n        // left\n        e.preventDefault();\n\n        if (this.is_open(e.currentTarget)) {\n          this.close_node(e.currentTarget);\n        } else {\n          var o = this.get_parent(e.currentTarget);\n\n          if (o && o.id !== $.jstree.root) {\n            this.get_node(o, true).children('.jstree-anchor').trigger('focus');\n          }\n        }\n      },\n      'up': function up(e) {\n        // up\n        e.preventDefault();\n        var o = this.get_prev_dom(e.currentTarget);\n\n        if (o && o.length) {\n          o.children('.jstree-anchor').trigger('focus');\n        }\n      },\n      'right': function right(e) {\n        // right\n        e.preventDefault();\n\n        if (this.is_closed(e.currentTarget)) {\n          this.open_node(e.currentTarget, function (o) {\n            this.get_node(o, true).children('.jstree-anchor').trigger('focus');\n          });\n        } else if (this.is_open(e.currentTarget)) {\n          var o = this.get_node(e.currentTarget, true).children('.jstree-children')[0];\n\n          if (o) {\n            $(this._firstChild(o)).children('.jstree-anchor').trigger('focus');\n          }\n        }\n      },\n      'down': function down(e) {\n        // down\n        e.preventDefault();\n        var o = this.get_next_dom(e.currentTarget);\n\n        if (o && o.length) {\n          o.children('.jstree-anchor').trigger('focus');\n        }\n      },\n      '*': function _(e) {\n        // aria defines * on numpad as open_all - not very common\n        this.open_all();\n      },\n      'home': function home(e) {\n        // home\n        e.preventDefault();\n\n        var o = this._firstChild(this.get_container_ul()[0]);\n\n        if (o) {\n          $(o).children('.jstree-anchor').filter(':visible').trigger('focus');\n        }\n      },\n      'end': function end(e) {\n        // end\n        e.preventDefault();\n        this.element.find('.jstree-anchor').filter(':visible').last().trigger('focus');\n      },\n      'f2': function f2(e) {\n        // f2 - safe to include - if check_callback is false it will fail\n        e.preventDefault();\n        this.edit(e.currentTarget);\n      }\n    }\n  };\n  $.jstree.core.prototype = {\n    /**\n     * used to decorate an instance with a plugin. Used internally.\n     * @private\n     * @name plugin(deco [, opts])\n     * @param  {String} deco the plugin to decorate with\n     * @param  {Object} opts options for the plugin\n     * @return {jsTree}\n     */\n    plugin: function plugin(deco, opts) {\n      var Child = $.jstree.plugins[deco];\n\n      if (Child) {\n        this._data[deco] = {};\n        Child.prototype = this;\n        return new Child(opts, this);\n      }\n\n      return this;\n    },\n\n    /**\n     * initialize the instance. Used internally.\n     * @private\n     * @name init(el, optons)\n     * @param {DOMElement|jQuery|String} el the element we are transforming\n     * @param {Object} options options for this instance\n     * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree\n     */\n    init: function init(el, options) {\n      this._model = {\n        data: {},\n        changed: [],\n        force_full_redraw: false,\n        redraw_timeout: false,\n        default_state: {\n          loaded: true,\n          opened: false,\n          selected: false,\n          disabled: false\n        }\n      };\n      this._model.data[$.jstree.root] = {\n        id: $.jstree.root,\n        parent: null,\n        parents: [],\n        children: [],\n        children_d: [],\n        state: {\n          loaded: false\n        }\n      };\n      this.element = $(el).addClass('jstree jstree-' + this._id);\n      this.settings = options;\n      this._data.core.ready = false;\n      this._data.core.loaded = false;\n      this._data.core.rtl = this.element.css(\"direction\") === \"rtl\";\n      this.element[this._data.core.rtl ? 'addClass' : 'removeClass'](\"jstree-rtl\");\n      this.element.attr('role', 'tree');\n\n      if (this.settings.core.multiple) {\n        this.element.attr('aria-multiselectable', true);\n      }\n\n      if (!this.element.attr('tabindex')) {\n        this.element.attr('tabindex', '0');\n      }\n\n      this.bind();\n      /**\n       * triggered after all events are bound\n       * @event\n       * @name init.jstree\n       */\n\n      this.trigger(\"init\");\n      this._data.core.original_container_html = this.element.find(\" > ul > li\").clone(true);\n\n      this._data.core.original_container_html.find(\"li\").addBack().contents().filter(function () {\n        return this.nodeType === 3 && (!this.nodeValue || /^\\s+$/.test(this.nodeValue));\n      }).remove();\n\n      this.element.html(\"<\" + \"ul class='jstree-container-ul jstree-children' role='group'><\" + \"li id='j\" + this._id + \"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none'><i class='jstree-icon jstree-ocl'></i><\" + \"a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>\" + this.get_string(\"Loading ...\") + \"</a></li></ul>\");\n      this.element.attr('aria-activedescendant', 'j' + this._id + '_loading');\n      this._data.core.li_height = this.get_container_ul().children(\"li\").first().outerHeight() || 24;\n      this._data.core.node = this._create_prototype_node();\n      /**\n       * triggered after the loading text is shown and before loading starts\n       * @event\n       * @name loading.jstree\n       */\n\n      this.trigger(\"loading\");\n      this.load_node($.jstree.root);\n    },\n\n    /**\n     * destroy an instance\n     * @name destroy()\n     * @param  {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact\n     */\n    destroy: function destroy(keep_html) {\n      /**\n       * triggered before the tree is destroyed\n       * @event\n       * @name destroy.jstree\n       */\n      this.trigger(\"destroy\");\n\n      if (this._wrk) {\n        try {\n          window.URL.revokeObjectURL(this._wrk);\n          this._wrk = null;\n        } catch (ignore) {}\n      }\n\n      if (!keep_html) {\n        this.element.empty();\n      }\n\n      this.teardown();\n    },\n\n    /**\n     * Create a prototype node\n     * @name _create_prototype_node()\n     * @return {DOMElement}\n     */\n    _create_prototype_node: function _create_prototype_node() {\n      var _node = document.createElement('LI'),\n          _temp1,\n          _temp2;\n\n      _node.setAttribute('role', 'none');\n\n      _temp1 = document.createElement('I');\n      _temp1.className = 'jstree-icon jstree-ocl';\n\n      _temp1.setAttribute('role', 'presentation');\n\n      _node.appendChild(_temp1);\n\n      _temp1 = document.createElement('A');\n      _temp1.className = 'jstree-anchor';\n\n      _temp1.setAttribute('href', '#');\n\n      _temp1.setAttribute('tabindex', '-1');\n\n      _temp1.setAttribute('role', 'treeitem');\n\n      _temp2 = document.createElement('I');\n      _temp2.className = 'jstree-icon jstree-themeicon';\n\n      _temp2.setAttribute('role', 'presentation');\n\n      _temp1.appendChild(_temp2);\n\n      _node.appendChild(_temp1);\n\n      _temp1 = _temp2 = null;\n      return _node;\n    },\n    _kbevent_to_func: function _kbevent_to_func(e) {\n      var keys = {\n        8: \"Backspace\",\n        9: \"Tab\",\n        13: \"Enter\",\n        19: \"Pause\",\n        27: \"Esc\",\n        32: \"Space\",\n        33: \"PageUp\",\n        34: \"PageDown\",\n        35: \"End\",\n        36: \"Home\",\n        37: \"Left\",\n        38: \"Up\",\n        39: \"Right\",\n        40: \"Down\",\n        44: \"Print\",\n        45: \"Insert\",\n        46: \"Delete\",\n        96: \"Numpad0\",\n        97: \"Numpad1\",\n        98: \"Numpad2\",\n        99: \"Numpad3\",\n        100: \"Numpad4\",\n        101: \"Numpad5\",\n        102: \"Numpad6\",\n        103: \"Numpad7\",\n        104: \"Numpad8\",\n        105: \"Numpad9\",\n        '-13': \"NumpadEnter\",\n        112: \"F1\",\n        113: \"F2\",\n        114: \"F3\",\n        115: \"F4\",\n        116: \"F5\",\n        117: \"F6\",\n        118: \"F7\",\n        119: \"F8\",\n        120: \"F9\",\n        121: \"F10\",\n        122: \"F11\",\n        123: \"F12\",\n        144: \"Numlock\",\n        145: \"Scrolllock\",\n        16: 'Shift',\n        17: 'Ctrl',\n        18: 'Alt',\n        48: '0',\n        49: '1',\n        50: '2',\n        51: '3',\n        52: '4',\n        53: '5',\n        54: '6',\n        55: '7',\n        56: '8',\n        57: '9',\n        59: ';',\n        61: '=',\n        65: 'a',\n        66: 'b',\n        67: 'c',\n        68: 'd',\n        69: 'e',\n        70: 'f',\n        71: 'g',\n        72: 'h',\n        73: 'i',\n        74: 'j',\n        75: 'k',\n        76: 'l',\n        77: 'm',\n        78: 'n',\n        79: 'o',\n        80: 'p',\n        81: 'q',\n        82: 'r',\n        83: 's',\n        84: 't',\n        85: 'u',\n        86: 'v',\n        87: 'w',\n        88: 'x',\n        89: 'y',\n        90: 'z',\n        107: '+',\n        109: '-',\n        110: '.',\n        186: ';',\n        187: '=',\n        188: ',',\n        189: '-',\n        190: '.',\n        191: '/',\n        192: '`',\n        219: '[',\n        220: '\\\\',\n        221: ']',\n        222: \"'\",\n        111: '/',\n        106: '*',\n        173: '-'\n      };\n      var parts = [];\n\n      if (e.ctrlKey) {\n        parts.push('ctrl');\n      }\n\n      if (e.altKey) {\n        parts.push('alt');\n      }\n\n      if (e.shiftKey) {\n        parts.push('shift');\n      }\n\n      parts.push(keys[e.which] || e.which);\n      parts = parts.sort().join('-').toLowerCase();\n\n      if (parts === 'shift-shift' || parts === 'ctrl-ctrl' || parts === 'alt-alt') {\n        return null;\n      }\n\n      var kb = this.settings.core.keyboard,\n          i,\n          tmp;\n\n      for (i in kb) {\n        if (kb.hasOwnProperty(i)) {\n          tmp = i;\n\n          if (tmp !== '-' && tmp !== '+') {\n            tmp = tmp.replace('--', '-MINUS').replace('+-', '-MINUS').replace('++', '-PLUS').replace('-+', '-PLUS');\n            tmp = tmp.split(/-|\\+/).sort().join('-').replace('MINUS', '-').replace('PLUS', '+').toLowerCase();\n          }\n\n          if (tmp === parts) {\n            return kb[i];\n          }\n        }\n      }\n\n      return null;\n    },\n\n    /**\n     * part of the destroying of an instance. Used internally.\n     * @private\n     * @name teardown()\n     */\n    teardown: function teardown() {\n      this.unbind();\n      this.element.removeClass('jstree').removeData('jstree').find(\"[class^='jstree']\").addBack().attr(\"class\", function () {\n        return this.className.replace(/jstree[^ ]*|$/ig, '');\n      });\n      this.element = null;\n    },\n\n    /**\n     * bind all events. Used internally.\n     * @private\n     * @name bind()\n     */\n    bind: function bind() {\n      var word = '',\n          tout = null,\n          was_click = 0;\n      this.element.on(\"dblclick.jstree\", function (e) {\n        if (e.target.tagName && e.target.tagName.toLowerCase() === \"input\") {\n          return true;\n        }\n\n        if (document.selection && document.selection.empty) {\n          document.selection.empty();\n        } else {\n          if (window.getSelection) {\n            var sel = window.getSelection();\n\n            try {\n              sel.removeAllRanges();\n              sel.collapse();\n            } catch (ignore) {}\n          }\n        }\n      }).on(\"mousedown.jstree\", function (e) {\n        if (e.target === this.element[0]) {\n          e.preventDefault(); // prevent losing focus when clicking scroll arrows (FF, Chrome)\n\n          was_click = +new Date(); // ie does not allow to prevent losing focus\n        }\n      }.bind(this)).on(\"mousedown.jstree\", \".jstree-ocl\", function (e) {\n        e.preventDefault(); // prevent any node inside from losing focus when clicking the open/close icon\n      }).on(\"click.jstree\", \".jstree-ocl\", function (e) {\n        this.toggle_node(e.target);\n      }.bind(this)).on(\"dblclick.jstree\", \".jstree-anchor\", function (e) {\n        if (e.target.tagName && e.target.tagName.toLowerCase() === \"input\") {\n          return true;\n        }\n\n        if (this.settings.core.dblclick_toggle) {\n          this.toggle_node(e.target);\n        }\n      }.bind(this)).on(\"click.jstree\", \".jstree-anchor\", function (e) {\n        e.preventDefault();\n\n        if (e.currentTarget !== document.activeElement) {\n          $(e.currentTarget).trigger('focus');\n        }\n\n        this.activate_node(e.currentTarget, e);\n      }.bind(this)).on('keydown.jstree', '.jstree-anchor', function (e) {\n        if (e.target.tagName && e.target.tagName.toLowerCase() === \"input\") {\n          return true;\n        }\n\n        if (this._data.core.rtl) {\n          if (e.which === 37) {\n            e.which = 39;\n          } else if (e.which === 39) {\n            e.which = 37;\n          }\n        }\n\n        var f = this._kbevent_to_func(e);\n\n        if (f) {\n          var r = f.call(this, e);\n\n          if (r === false || r === true) {\n            return r;\n          }\n        }\n      }.bind(this)).on(\"load_node.jstree\", function (e, data) {\n        if (data.status) {\n          if (data.node.id === $.jstree.root && !this._data.core.loaded) {\n            this._data.core.loaded = true;\n\n            if (this._firstChild(this.get_container_ul()[0])) {\n              this.element.attr('aria-activedescendant', this._firstChild(this.get_container_ul()[0]).id);\n            }\n            /**\n             * triggered after the root node is loaded for the first time\n             * @event\n             * @name loaded.jstree\n             */\n\n\n            this.trigger(\"loaded\");\n          }\n\n          if (!this._data.core.ready) {\n            setTimeout(function () {\n              if (this.element && !this.get_container_ul().find('.jstree-loading').length) {\n                this._data.core.ready = true;\n\n                if (this._data.core.selected.length) {\n                  if (this.settings.core.expand_selected_onload) {\n                    var tmp = [],\n                        i,\n                        j;\n\n                    for (i = 0, j = this._data.core.selected.length; i < j; i++) {\n                      tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents);\n                    }\n\n                    tmp = $.vakata.array_unique(tmp);\n\n                    for (i = 0, j = tmp.length; i < j; i++) {\n                      this.open_node(tmp[i], false, 0);\n                    }\n                  }\n\n                  this.trigger('changed', {\n                    'action': 'ready',\n                    'selected': this._data.core.selected\n                  });\n                }\n                /**\n                 * triggered after all nodes are finished loading\n                 * @event\n                 * @name ready.jstree\n                 */\n\n\n                this.trigger(\"ready\");\n              }\n            }.bind(this), 0);\n          }\n        }\n      }.bind(this)) // quick searching when the tree is focused\n      .on('keypress.jstree', function (e) {\n        if (e.target.tagName && e.target.tagName.toLowerCase() === \"input\") {\n          return true;\n        }\n\n        if (tout) {\n          clearTimeout(tout);\n        }\n\n        tout = setTimeout(function () {\n          word = '';\n        }, 500);\n        var chr = String.fromCharCode(e.which).toLowerCase(),\n            col = this.element.find('.jstree-anchor').filter(':visible'),\n            ind = col.index(document.activeElement) || 0,\n            end = false;\n        word += chr; // match for whole word from current node down (including the current node)\n\n        if (word.length > 1) {\n          col.slice(ind).each(function (i, v) {\n            if ($(v).text().toLowerCase().indexOf(word) === 0) {\n              $(v).trigger('focus');\n              end = true;\n              return false;\n            }\n          }.bind(this));\n\n          if (end) {\n            return;\n          } // match for whole word from the beginning of the tree\n\n\n          col.slice(0, ind).each(function (i, v) {\n            if ($(v).text().toLowerCase().indexOf(word) === 0) {\n              $(v).trigger('focus');\n              end = true;\n              return false;\n            }\n          }.bind(this));\n\n          if (end) {\n            return;\n          }\n        } // list nodes that start with that letter (only if word consists of a single char)\n\n\n        if (new RegExp('^' + chr.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '+$').test(word)) {\n          // search for the next node starting with that letter\n          col.slice(ind + 1).each(function (i, v) {\n            if ($(v).text().toLowerCase().charAt(0) === chr) {\n              $(v).trigger('focus');\n              end = true;\n              return false;\n            }\n          }.bind(this));\n\n          if (end) {\n            return;\n          } // search from the beginning\n\n\n          col.slice(0, ind + 1).each(function (i, v) {\n            if ($(v).text().toLowerCase().charAt(0) === chr) {\n              $(v).trigger('focus');\n              end = true;\n              return false;\n            }\n          }.bind(this));\n\n          if (end) {\n            return;\n          }\n        }\n      }.bind(this)) // THEME RELATED\n      .on(\"init.jstree\", function () {\n        var s = this.settings.core.themes;\n        this._data.core.themes.dots = s.dots;\n        this._data.core.themes.stripes = s.stripes;\n        this._data.core.themes.icons = s.icons;\n        this._data.core.themes.ellipsis = s.ellipsis;\n        this.set_theme(s.name || \"default\", s.url);\n        this.set_theme_variant(s.variant);\n      }.bind(this)).on(\"loading.jstree\", function () {\n        this[this._data.core.themes.dots ? \"show_dots\" : \"hide_dots\"]();\n        this[this._data.core.themes.icons ? \"show_icons\" : \"hide_icons\"]();\n        this[this._data.core.themes.stripes ? \"show_stripes\" : \"hide_stripes\"]();\n        this[this._data.core.themes.ellipsis ? \"show_ellipsis\" : \"hide_ellipsis\"]();\n      }.bind(this)).on('blur.jstree', '.jstree-anchor', function (e) {\n        this._data.core.focused = null;\n        $(e.currentTarget).filter('.jstree-hovered').trigger('mouseleave');\n        this.element.attr('tabindex', '0');\n      }.bind(this)).on('focus.jstree', '.jstree-anchor', function (e) {\n        var tmp = this.get_node(e.currentTarget);\n\n        if (tmp && tmp.id) {\n          this._data.core.focused = tmp.id;\n        }\n\n        this.element.find('.jstree-hovered').not(e.currentTarget).trigger('mouseleave');\n        $(e.currentTarget).trigger('mouseenter');\n        this.element.attr('tabindex', '-1');\n      }.bind(this)).on('focus.jstree', function () {\n        if (+new Date() - was_click > 500 && !this._data.core.focused && this.settings.core.restore_focus) {\n          was_click = 0;\n          var act = this.get_node(this.element.attr('aria-activedescendant'), true);\n\n          if (act) {\n            act.find('> .jstree-anchor').trigger('focus');\n          }\n        }\n      }.bind(this)).on('mouseenter.jstree', '.jstree-anchor', function (e) {\n        this.hover_node(e.currentTarget);\n      }.bind(this)).on('mouseleave.jstree', '.jstree-anchor', function (e) {\n        this.dehover_node(e.currentTarget);\n      }.bind(this));\n    },\n\n    /**\n     * part of the destroying of an instance. Used internally.\n     * @private\n     * @name unbind()\n     */\n    unbind: function unbind() {\n      this.element.off('.jstree');\n      $(document).off('.jstree-' + this._id);\n    },\n\n    /**\n     * trigger an event. Used internally.\n     * @private\n     * @name trigger(ev [, data])\n     * @param  {String} ev the name of the event to trigger\n     * @param  {Object} data additional data to pass with the event\n     */\n    trigger: function trigger(ev, data) {\n      if (!data) {\n        data = {};\n      }\n\n      data.instance = this;\n      this.element.triggerHandler(ev.replace('.jstree', '') + '.jstree', data);\n    },\n\n    /**\n     * returns the jQuery extended instance container\n     * @name get_container()\n     * @return {jQuery}\n     */\n    get_container: function get_container() {\n      return this.element;\n    },\n\n    /**\n     * returns the jQuery extended main UL node inside the instance container. Used internally.\n     * @private\n     * @name get_container_ul()\n     * @return {jQuery}\n     */\n    get_container_ul: function get_container_ul() {\n      return this.element.children(\".jstree-children\").first();\n    },\n\n    /**\n     * gets string replacements (localization). Used internally.\n     * @private\n     * @name get_string(key)\n     * @param  {String} key\n     * @return {String}\n     */\n    get_string: function get_string(key) {\n      var a = this.settings.core.strings;\n\n      if ($.vakata.is_function(a)) {\n        return a.call(this, key);\n      }\n\n      if (a && a[key]) {\n        return a[key];\n      }\n\n      return key;\n    },\n\n    /**\n     * gets the first child of a DOM node. Used internally.\n     * @private\n     * @name _firstChild(dom)\n     * @param  {DOMElement} dom\n     * @return {DOMElement}\n     */\n    _firstChild: function _firstChild(dom) {\n      dom = dom ? dom.firstChild : null;\n\n      while (dom !== null && dom.nodeType !== 1) {\n        dom = dom.nextSibling;\n      }\n\n      return dom;\n    },\n\n    /**\n     * gets the next sibling of a DOM node. Used internally.\n     * @private\n     * @name _nextSibling(dom)\n     * @param  {DOMElement} dom\n     * @return {DOMElement}\n     */\n    _nextSibling: function _nextSibling(dom) {\n      dom = dom ? dom.nextSibling : null;\n\n      while (dom !== null && dom.nodeType !== 1) {\n        dom = dom.nextSibling;\n      }\n\n      return dom;\n    },\n\n    /**\n     * gets the previous sibling of a DOM node. Used internally.\n     * @private\n     * @name _previousSibling(dom)\n     * @param  {DOMElement} dom\n     * @return {DOMElement}\n     */\n    _previousSibling: function _previousSibling(dom) {\n      dom = dom ? dom.previousSibling : null;\n\n      while (dom !== null && dom.nodeType !== 1) {\n        dom = dom.previousSibling;\n      }\n\n      return dom;\n    },\n\n    /**\n     * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc)\n     * @name get_node(obj [, as_dom])\n     * @param  {mixed} obj\n     * @param  {Boolean} as_dom\n     * @return {Object|jQuery}\n     */\n    get_node: function get_node(obj, as_dom) {\n      if (obj && obj.id) {\n        obj = obj.id;\n      }\n\n      if (obj instanceof $ && obj.length && obj[0].id) {\n        obj = obj[0].id;\n      }\n\n      var dom;\n\n      try {\n        if (this._model.data[obj]) {\n          obj = this._model.data[obj];\n        } else if (typeof obj === \"string\" && this._model.data[obj.replace(/^#/, '')]) {\n          obj = this._model.data[obj.replace(/^#/, '')];\n        } else if (typeof obj === \"string\" && (dom = $('#' + obj.replace($.jstree.idregex, '\\\\$&'), this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {\n          obj = this._model.data[dom.closest('.jstree-node').attr('id')];\n        } else if ((dom = this.element.find(obj)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {\n          obj = this._model.data[dom.closest('.jstree-node').attr('id')];\n        } else if ((dom = this.element.find(obj)).length && dom.hasClass('jstree')) {\n          obj = this._model.data[$.jstree.root];\n        } else {\n          return false;\n        }\n\n        if (as_dom) {\n          obj = obj.id === $.jstree.root ? this.element : $('#' + obj.id.replace($.jstree.idregex, '\\\\$&'), this.element);\n        }\n\n        return obj;\n      } catch (ex) {\n        return false;\n      }\n    },\n\n    /**\n     * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array)\n     * @name get_path(obj [, glue, ids])\n     * @param  {mixed} obj the node\n     * @param  {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned\n     * @param  {Boolean} ids if set to true build the path using ID, otherwise node text is used\n     * @return {mixed}\n     */\n    get_path: function get_path(obj, glue, ids) {\n      obj = obj.parents ? obj : this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root || !obj.parents) {\n        return false;\n      }\n\n      var i,\n          j,\n          p = [];\n      p.push(ids ? obj.id : obj.text);\n\n      for (i = 0, j = obj.parents.length; i < j; i++) {\n        p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i]));\n      }\n\n      p = p.reverse().slice(1);\n      return glue ? p.join(glue) : p;\n    },\n\n    /**\n     * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned.\n     * @name get_next_dom(obj [, strict])\n     * @param  {mixed} obj\n     * @param  {Boolean} strict\n     * @return {jQuery}\n     */\n    get_next_dom: function get_next_dom(obj, strict) {\n      var tmp;\n      obj = this.get_node(obj, true);\n\n      if (obj[0] === this.element[0]) {\n        tmp = this._firstChild(this.get_container_ul()[0]);\n\n        while (tmp && tmp.offsetHeight === 0) {\n          tmp = this._nextSibling(tmp);\n        }\n\n        return tmp ? $(tmp) : false;\n      }\n\n      if (!obj || !obj.length) {\n        return false;\n      }\n\n      if (strict) {\n        tmp = obj[0];\n\n        do {\n          tmp = this._nextSibling(tmp);\n        } while (tmp && tmp.offsetHeight === 0);\n\n        return tmp ? $(tmp) : false;\n      }\n\n      if (obj.hasClass(\"jstree-open\")) {\n        tmp = this._firstChild(obj.children('.jstree-children')[0]);\n\n        while (tmp && tmp.offsetHeight === 0) {\n          tmp = this._nextSibling(tmp);\n        }\n\n        if (tmp !== null) {\n          return $(tmp);\n        }\n      }\n\n      tmp = obj[0];\n\n      do {\n        tmp = this._nextSibling(tmp);\n      } while (tmp && tmp.offsetHeight === 0);\n\n      if (tmp !== null) {\n        return $(tmp);\n      }\n\n      return obj.parentsUntil(\".jstree\", \".jstree-node\").nextAll(\".jstree-node:visible\").first();\n    },\n\n    /**\n     * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned.\n     * @name get_prev_dom(obj [, strict])\n     * @param  {mixed} obj\n     * @param  {Boolean} strict\n     * @return {jQuery}\n     */\n    get_prev_dom: function get_prev_dom(obj, strict) {\n      var tmp;\n      obj = this.get_node(obj, true);\n\n      if (obj[0] === this.element[0]) {\n        tmp = this.get_container_ul()[0].lastChild;\n\n        while (tmp && tmp.offsetHeight === 0) {\n          tmp = this._previousSibling(tmp);\n        }\n\n        return tmp ? $(tmp) : false;\n      }\n\n      if (!obj || !obj.length) {\n        return false;\n      }\n\n      if (strict) {\n        tmp = obj[0];\n\n        do {\n          tmp = this._previousSibling(tmp);\n        } while (tmp && tmp.offsetHeight === 0);\n\n        return tmp ? $(tmp) : false;\n      }\n\n      tmp = obj[0];\n\n      do {\n        tmp = this._previousSibling(tmp);\n      } while (tmp && tmp.offsetHeight === 0);\n\n      if (tmp !== null) {\n        obj = $(tmp);\n\n        while (obj.hasClass(\"jstree-open\")) {\n          obj = obj.children(\".jstree-children\").first().children(\".jstree-node:visible:last\");\n        }\n\n        return obj;\n      }\n\n      tmp = obj[0].parentNode.parentNode;\n      return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false;\n    },\n\n    /**\n     * get the parent ID of a node\n     * @name get_parent(obj)\n     * @param  {mixed} obj\n     * @return {String}\n     */\n    get_parent: function get_parent(obj) {\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      return obj.parent;\n    },\n\n    /**\n     * get a jQuery collection of all the children of a node (node must be rendered), returns false on error\n     * @name get_children_dom(obj)\n     * @param  {mixed} obj\n     * @return {jQuery}\n     */\n    get_children_dom: function get_children_dom(obj) {\n      obj = this.get_node(obj, true);\n\n      if (obj[0] === this.element[0]) {\n        return this.get_container_ul().children(\".jstree-node\");\n      }\n\n      if (!obj || !obj.length) {\n        return false;\n      }\n\n      return obj.children(\".jstree-children\").children(\".jstree-node\");\n    },\n\n    /**\n     * checks if a node has children\n     * @name is_parent(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n    is_parent: function is_parent(obj) {\n      obj = this.get_node(obj);\n      return obj && (obj.state.loaded === false || obj.children.length > 0);\n    },\n\n    /**\n     * checks if a node is loaded (its children are available)\n     * @name is_loaded(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n    is_loaded: function is_loaded(obj) {\n      obj = this.get_node(obj);\n      return obj && obj.state.loaded;\n    },\n\n    /**\n     * check if a node is currently loading (fetching children)\n     * @name is_loading(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n    is_loading: function is_loading(obj) {\n      obj = this.get_node(obj);\n      return obj && obj.state && obj.state.loading;\n    },\n\n    /**\n     * check if a node is opened\n     * @name is_open(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n    is_open: function is_open(obj) {\n      obj = this.get_node(obj);\n      return obj && obj.state.opened;\n    },\n\n    /**\n     * check if a node is in a closed state\n     * @name is_closed(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n    is_closed: function is_closed(obj) {\n      obj = this.get_node(obj);\n      return obj && this.is_parent(obj) && !obj.state.opened;\n    },\n\n    /**\n     * check if a node has no children\n     * @name is_leaf(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n    is_leaf: function is_leaf(obj) {\n      return !this.is_parent(obj);\n    },\n\n    /**\n     * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array.\n     * @name load_node(obj [, callback])\n     * @param  {mixed} obj\n     * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status\n     * @return {Boolean}\n     * @trigger load_node.jstree\n     */\n    load_node: function load_node(obj, callback) {\n      var k, l, i, j, c;\n\n      if ($.vakata.is_array(obj)) {\n        this._load_nodes(obj.slice(), callback);\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj) {\n        if (callback) {\n          callback.call(this, obj, false);\n        }\n\n        return false;\n      } // if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again?\n\n\n      if (obj.state.loaded) {\n        obj.state.loaded = false;\n\n        for (i = 0, j = obj.parents.length; i < j; i++) {\n          this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) {\n            return $.inArray(v, obj.children_d) === -1;\n          });\n        }\n\n        for (k = 0, l = obj.children_d.length; k < l; k++) {\n          if (this._model.data[obj.children_d[k]].state.selected) {\n            c = true;\n          }\n\n          delete this._model.data[obj.children_d[k]];\n        }\n\n        if (c) {\n          this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) {\n            return $.inArray(v, obj.children_d) === -1;\n          });\n        }\n\n        obj.children = [];\n        obj.children_d = [];\n\n        if (c) {\n          this.trigger('changed', {\n            'action': 'load_node',\n            'node': obj,\n            'selected': this._data.core.selected\n          });\n        }\n      }\n\n      obj.state.failed = false;\n      obj.state.loading = true;\n      this.get_node(obj, true).addClass(\"jstree-loading\").attr('aria-busy', true);\n\n      this._load_node(obj, function (status) {\n        obj = this._model.data[obj.id];\n        obj.state.loading = false;\n        obj.state.loaded = status;\n        obj.state.failed = !obj.state.loaded;\n        var dom = this.get_node(obj, true),\n            i = 0,\n            j = 0,\n            m = this._model.data,\n            has_children = false;\n\n        for (i = 0, j = obj.children.length; i < j; i++) {\n          if (m[obj.children[i]] && !m[obj.children[i]].state.hidden) {\n            has_children = true;\n            break;\n          }\n        }\n\n        if (obj.state.loaded && dom && dom.length) {\n          dom.removeClass('jstree-closed jstree-open jstree-leaf');\n\n          if (!has_children) {\n            dom.addClass('jstree-leaf');\n          } else {\n            if (obj.id !== '#') {\n              dom.addClass(obj.state.opened ? 'jstree-open' : 'jstree-closed');\n            }\n          }\n        }\n\n        dom.removeClass(\"jstree-loading\").attr('aria-busy', false);\n        /**\n         * triggered after a node is loaded\n         * @event\n         * @name load_node.jstree\n         * @param {Object} node the node that was loading\n         * @param {Boolean} status was the node loaded successfully\n         */\n\n        this.trigger('load_node', {\n          \"node\": obj,\n          \"status\": status\n        });\n\n        if (callback) {\n          callback.call(this, obj, status);\n        }\n      }.bind(this));\n\n      return true;\n    },\n\n    /**\n     * load an array of nodes (will also load unavailable nodes as soon as they appear in the structure). Used internally.\n     * @private\n     * @name _load_nodes(nodes [, callback])\n     * @param  {array} nodes\n     * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes\n     */\n    _load_nodes: function _load_nodes(nodes, callback, is_callback, force_reload) {\n      var r = true,\n          c = function c() {\n        this._load_nodes(nodes, callback, true);\n      },\n          m = this._model.data,\n          i,\n          j,\n          tmp = [];\n\n      for (i = 0, j = nodes.length; i < j; i++) {\n        if (m[nodes[i]] && (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed || !is_callback && force_reload)) {\n          if (!this.is_loading(nodes[i])) {\n            this.load_node(nodes[i], c);\n          }\n\n          r = false;\n        }\n      }\n\n      if (r) {\n        for (i = 0, j = nodes.length; i < j; i++) {\n          if (m[nodes[i]] && m[nodes[i]].state.loaded) {\n            tmp.push(nodes[i]);\n          }\n        }\n\n        if (callback && !callback.done) {\n          callback.call(this, tmp);\n          callback.done = true;\n        }\n      }\n    },\n\n    /**\n     * loads all unloaded nodes\n     * @name load_all([obj, callback])\n     * @param {mixed} obj the node to load recursively, omit to load all nodes in the tree\n     * @param {function} callback a function to be executed once loading all the nodes is complete,\n     * @trigger load_all.jstree\n     */\n    load_all: function load_all(obj, callback) {\n      if (!obj) {\n        obj = $.jstree.root;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj) {\n        return false;\n      }\n\n      var to_load = [],\n          m = this._model.data,\n          c = m[obj.id].children_d,\n          i,\n          j;\n\n      if (obj.state && !obj.state.loaded) {\n        to_load.push(obj.id);\n      }\n\n      for (i = 0, j = c.length; i < j; i++) {\n        if (m[c[i]] && m[c[i]].state && !m[c[i]].state.loaded) {\n          to_load.push(c[i]);\n        }\n      }\n\n      if (to_load.length) {\n        this._load_nodes(to_load, function () {\n          this.load_all(obj, callback);\n        });\n      } else {\n        /**\n         * triggered after a load_all call completes\n         * @event\n         * @name load_all.jstree\n         * @param {Object} node the recursively loaded node\n         */\n        if (callback) {\n          callback.call(this, obj);\n        }\n\n        this.trigger('load_all', {\n          \"node\": obj\n        });\n      }\n    },\n\n    /**\n     * handles the actual loading of a node. Used only internally.\n     * @private\n     * @name _load_node(obj [, callback])\n     * @param  {mixed} obj\n     * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status\n     * @return {Boolean}\n     */\n    _load_node: function _load_node(obj, callback) {\n      var s = this.settings.core.data,\n          t;\n\n      var notTextOrCommentNode = function notTextOrCommentNode() {\n        return this.nodeType !== 3 && this.nodeType !== 8;\n      }; // use original HTML\n\n\n      if (!s) {\n        if (obj.id === $.jstree.root) {\n          return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) {\n            callback.call(this, status);\n          });\n        } else {\n          return callback.call(this, false);\n        } // return callback.call(this, obj.id === $.jstree.root ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false);\n\n      }\n\n      if ($.vakata.is_function(s)) {\n        return s.call(this, obj, function (d) {\n          if (d === false) {\n            callback.call(this, false);\n          } else {\n            this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $($.parseHTML(d)).filter(notTextOrCommentNode) : d, function (status) {\n              callback.call(this, status);\n            });\n          } // return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d));\n\n        }.bind(this));\n      }\n\n      if (_typeof(s) === 'object') {\n        if (s.url) {\n          s = $.extend(true, {}, s);\n\n          if ($.vakata.is_function(s.url)) {\n            s.url = s.url.call(this, obj);\n          }\n\n          if ($.vakata.is_function(s.data)) {\n            s.data = s.data.call(this, obj);\n          }\n\n          return $.ajax(s).done(function (d, t, x) {\n            var type = x.getResponseHeader('Content-Type');\n\n            if (type && type.indexOf('json') !== -1 || _typeof(d) === \"object\") {\n              return this._append_json_data(obj, d, function (status) {\n                callback.call(this, status);\n              }); //return callback.call(this, this._append_json_data(obj, d));\n            }\n\n            if (type && type.indexOf('html') !== -1 || typeof d === \"string\") {\n              return this._append_html_data(obj, $($.parseHTML(d)).filter(notTextOrCommentNode), function (status) {\n                callback.call(this, status);\n              }); // return callback.call(this, this._append_html_data(obj, $(d)));\n            }\n\n            this._data.core.last_error = {\n              'error': 'ajax',\n              'plugin': 'core',\n              'id': 'core_04',\n              'reason': 'Could not load node',\n              'data': JSON.stringify({\n                'id': obj.id,\n                'xhr': x\n              })\n            };\n            this.settings.core.error.call(this, this._data.core.last_error);\n            return callback.call(this, false);\n          }.bind(this)).fail(function (f) {\n            this._data.core.last_error = {\n              'error': 'ajax',\n              'plugin': 'core',\n              'id': 'core_04',\n              'reason': 'Could not load node',\n              'data': JSON.stringify({\n                'id': obj.id,\n                'xhr': f\n              })\n            };\n            callback.call(this, false);\n            this.settings.core.error.call(this, this._data.core.last_error);\n          }.bind(this));\n        }\n\n        if ($.vakata.is_array(s)) {\n          t = $.extend(true, [], s);\n        } else if ($.isPlainObject(s)) {\n          t = $.extend(true, {}, s);\n        } else {\n          t = s;\n        }\n\n        if (obj.id === $.jstree.root) {\n          return this._append_json_data(obj, t, function (status) {\n            callback.call(this, status);\n          });\n        } else {\n          this._data.core.last_error = {\n            'error': 'nodata',\n            'plugin': 'core',\n            'id': 'core_05',\n            'reason': 'Could not load node',\n            'data': JSON.stringify({\n              'id': obj.id\n            })\n          };\n          this.settings.core.error.call(this, this._data.core.last_error);\n          return callback.call(this, false);\n        } //return callback.call(this, (obj.id === $.jstree.root ? this._append_json_data(obj, t) : false) );\n\n      }\n\n      if (typeof s === 'string') {\n        if (obj.id === $.jstree.root) {\n          return this._append_html_data(obj, $($.parseHTML(s)).filter(notTextOrCommentNode), function (status) {\n            callback.call(this, status);\n          });\n        } else {\n          this._data.core.last_error = {\n            'error': 'nodata',\n            'plugin': 'core',\n            'id': 'core_06',\n            'reason': 'Could not load node',\n            'data': JSON.stringify({\n              'id': obj.id\n            })\n          };\n          this.settings.core.error.call(this, this._data.core.last_error);\n          return callback.call(this, false);\n        } //return callback.call(this, (obj.id === $.jstree.root ? this._append_html_data(obj, $(s)) : false) );\n\n      }\n\n      return callback.call(this, false);\n    },\n\n    /**\n     * adds a node to the list of nodes to redraw. Used only internally.\n     * @private\n     * @name _node_changed(obj [, callback])\n     * @param  {mixed} obj\n     */\n    _node_changed: function _node_changed(obj) {\n      obj = this.get_node(obj);\n\n      if (obj && $.inArray(obj.id, this._model.changed) === -1) {\n        this._model.changed.push(obj.id);\n      }\n    },\n\n    /**\n     * appends HTML content to the tree. Used internally.\n     * @private\n     * @name _append_html_data(obj, data)\n     * @param  {mixed} obj the node to append to\n     * @param  {String} data the HTML string to parse and append\n     * @trigger model.jstree, changed.jstree\n     */\n    _append_html_data: function _append_html_data(dom, data, cb) {\n      dom = this.get_node(dom);\n      dom.children = [];\n      dom.children_d = [];\n      var dat = data.is('ul') ? data.children() : data,\n          par = dom.id,\n          chd = [],\n          dpc = [],\n          m = this._model.data,\n          p = m[par],\n          s = this._data.core.selected.length,\n          tmp,\n          i,\n          j;\n      dat.each(function (i, v) {\n        tmp = this._parse_model_from_html($(v), par, p.parents.concat());\n\n        if (tmp) {\n          chd.push(tmp);\n          dpc.push(tmp);\n\n          if (m[tmp].children_d.length) {\n            dpc = dpc.concat(m[tmp].children_d);\n          }\n        }\n      }.bind(this));\n      p.children = chd;\n      p.children_d = dpc;\n\n      for (i = 0, j = p.parents.length; i < j; i++) {\n        m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);\n      }\n      /**\n       * triggered when new data is inserted to the tree model\n       * @event\n       * @name model.jstree\n       * @param {Array} nodes an array of node IDs\n       * @param {String} parent the parent ID of the nodes\n       */\n\n\n      this.trigger('model', {\n        \"nodes\": dpc,\n        'parent': par\n      });\n\n      if (par !== $.jstree.root) {\n        this._node_changed(par);\n\n        this.redraw();\n      } else {\n        this.get_container_ul().children('.jstree-initial-node').remove();\n        this.redraw(true);\n      }\n\n      if (this._data.core.selected.length !== s) {\n        this.trigger('changed', {\n          'action': 'model',\n          'selected': this._data.core.selected\n        });\n      }\n\n      cb.call(this, true);\n    },\n\n    /**\n     * appends JSON content to the tree. Used internally.\n     * @private\n     * @name _append_json_data(obj, data)\n     * @param  {mixed} obj the node to append to\n     * @param  {String} data the JSON object to parse and append\n     * @param  {Boolean} force_processing internal param - do not set\n     * @trigger model.jstree, changed.jstree\n     */\n    _append_json_data: function _append_json_data(dom, data, cb, force_processing) {\n      if (this.element === null) {\n        return;\n      }\n\n      dom = this.get_node(dom);\n      dom.children = [];\n      dom.children_d = []; // *%$@!!!\n\n      if (data.d) {\n        data = data.d;\n\n        if (typeof data === \"string\") {\n          data = JSON.parse(data);\n        }\n      }\n\n      if (!$.vakata.is_array(data)) {\n        data = [data];\n      }\n\n      var w = null,\n          args = {\n        'df': this._model.default_state,\n        'dat': data,\n        'par': dom.id,\n        'm': this._model.data,\n        't_id': this._id,\n        't_cnt': this._cnt,\n        'sel': this._data.core.selected\n      },\n          inst = this,\n          func = function func(data, undefined) {\n        if (data.data) {\n          data = data.data;\n        }\n\n        var dat = data.dat,\n            par = data.par,\n            chd = [],\n            dpc = [],\n            add = [],\n            df = data.df,\n            t_id = data.t_id,\n            t_cnt = data.t_cnt,\n            m = data.m,\n            p = m[par],\n            sel = data.sel,\n            tmp,\n            i,\n            j,\n            rslt,\n            parse_flat = function parse_flat(d, p, ps) {\n          if (!ps) {\n            ps = [];\n          } else {\n            ps = ps.concat();\n          }\n\n          if (p) {\n            ps.unshift(p);\n          }\n\n          var tid = d.id.toString(),\n              i,\n              j,\n              c,\n              e,\n              tmp = {\n            id: tid,\n            text: d.text || '',\n            icon: d.icon !== undefined ? d.icon : true,\n            parent: p,\n            parents: ps,\n            children: d.children || [],\n            children_d: d.children_d || [],\n            data: d.data,\n            state: {},\n            li_attr: {\n              id: false\n            },\n            a_attr: {\n              href: '#'\n            },\n            original: false\n          };\n\n          for (i in df) {\n            if (df.hasOwnProperty(i)) {\n              tmp.state[i] = df[i];\n            }\n          }\n\n          if (d && d.data && d.data.jstree && d.data.jstree.icon) {\n            tmp.icon = d.data.jstree.icon;\n          }\n\n          if (tmp.icon === undefined || tmp.icon === null || tmp.icon === \"\") {\n            tmp.icon = true;\n          }\n\n          if (d && d.data) {\n            tmp.data = d.data;\n\n            if (d.data.jstree) {\n              for (i in d.data.jstree) {\n                if (d.data.jstree.hasOwnProperty(i)) {\n                  tmp.state[i] = d.data.jstree[i];\n                }\n              }\n            }\n          }\n\n          if (d && _typeof(d.state) === 'object') {\n            for (i in d.state) {\n              if (d.state.hasOwnProperty(i)) {\n                tmp.state[i] = d.state[i];\n              }\n            }\n          }\n\n          if (d && _typeof(d.li_attr) === 'object') {\n            for (i in d.li_attr) {\n              if (d.li_attr.hasOwnProperty(i)) {\n                tmp.li_attr[i] = d.li_attr[i];\n              }\n            }\n          }\n\n          if (!tmp.li_attr.id) {\n            tmp.li_attr.id = tid;\n          }\n\n          if (d && _typeof(d.a_attr) === 'object') {\n            for (i in d.a_attr) {\n              if (d.a_attr.hasOwnProperty(i)) {\n                tmp.a_attr[i] = d.a_attr[i];\n              }\n            }\n          }\n\n          if (d && d.children && d.children === true) {\n            tmp.state.loaded = false;\n            tmp.children = [];\n            tmp.children_d = [];\n          }\n\n          m[tmp.id] = tmp;\n\n          for (i = 0, j = tmp.children.length; i < j; i++) {\n            c = parse_flat(m[tmp.children[i]], tmp.id, ps);\n            e = m[c];\n            tmp.children_d.push(c);\n\n            if (e.children_d.length) {\n              tmp.children_d = tmp.children_d.concat(e.children_d);\n            }\n          }\n\n          delete d.data;\n          delete d.children;\n          m[tmp.id].original = d;\n\n          if (tmp.state.selected) {\n            add.push(tmp.id);\n          }\n\n          return tmp.id;\n        },\n            parse_nest = function parse_nest(d, p, ps) {\n          if (!ps) {\n            ps = [];\n          } else {\n            ps = ps.concat();\n          }\n\n          if (p) {\n            ps.unshift(p);\n          }\n\n          var tid = false,\n              i,\n              j,\n              c,\n              e,\n              tmp;\n\n          do {\n            tid = 'j' + t_id + '_' + ++t_cnt;\n          } while (m[tid]);\n\n          tmp = {\n            id: false,\n            text: typeof d === 'string' ? d : '',\n            icon: _typeof(d) === 'object' && d.icon !== undefined ? d.icon : true,\n            parent: p,\n            parents: ps,\n            children: [],\n            children_d: [],\n            data: null,\n            state: {},\n            li_attr: {\n              id: false\n            },\n            a_attr: {\n              href: '#'\n            },\n            original: false\n          };\n\n          for (i in df) {\n            if (df.hasOwnProperty(i)) {\n              tmp.state[i] = df[i];\n            }\n          }\n\n          if (d && d.id) {\n            tmp.id = d.id.toString();\n          }\n\n          if (d && d.text) {\n            tmp.text = d.text;\n          }\n\n          if (d && d.data && d.data.jstree && d.data.jstree.icon) {\n            tmp.icon = d.data.jstree.icon;\n          }\n\n          if (tmp.icon === undefined || tmp.icon === null || tmp.icon === \"\") {\n            tmp.icon = true;\n          }\n\n          if (d && d.data) {\n            tmp.data = d.data;\n\n            if (d.data.jstree) {\n              for (i in d.data.jstree) {\n                if (d.data.jstree.hasOwnProperty(i)) {\n                  tmp.state[i] = d.data.jstree[i];\n                }\n              }\n            }\n          }\n\n          if (d && _typeof(d.state) === 'object') {\n            for (i in d.state) {\n              if (d.state.hasOwnProperty(i)) {\n                tmp.state[i] = d.state[i];\n              }\n            }\n          }\n\n          if (d && _typeof(d.li_attr) === 'object') {\n            for (i in d.li_attr) {\n              if (d.li_attr.hasOwnProperty(i)) {\n                tmp.li_attr[i] = d.li_attr[i];\n              }\n            }\n          }\n\n          if (tmp.li_attr.id && !tmp.id) {\n            tmp.id = tmp.li_attr.id.toString();\n          }\n\n          if (!tmp.id) {\n            tmp.id = tid;\n          }\n\n          if (!tmp.li_attr.id) {\n            tmp.li_attr.id = tmp.id;\n          }\n\n          if (d && _typeof(d.a_attr) === 'object') {\n            for (i in d.a_attr) {\n              if (d.a_attr.hasOwnProperty(i)) {\n                tmp.a_attr[i] = d.a_attr[i];\n              }\n            }\n          }\n\n          if (d && d.children && d.children.length) {\n            for (i = 0, j = d.children.length; i < j; i++) {\n              c = parse_nest(d.children[i], tmp.id, ps);\n              e = m[c];\n              tmp.children.push(c);\n\n              if (e.children_d.length) {\n                tmp.children_d = tmp.children_d.concat(e.children_d);\n              }\n            }\n\n            tmp.children_d = tmp.children_d.concat(tmp.children);\n          }\n\n          if (d && d.children && d.children === true) {\n            tmp.state.loaded = false;\n            tmp.children = [];\n            tmp.children_d = [];\n          }\n\n          delete d.data;\n          delete d.children;\n          tmp.original = d;\n          m[tmp.id] = tmp;\n\n          if (tmp.state.selected) {\n            add.push(tmp.id);\n          }\n\n          return tmp.id;\n        };\n\n        if (dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) {\n          // Flat JSON support (for easy import from DB):\n          // 1) convert to object (foreach)\n          for (i = 0, j = dat.length; i < j; i++) {\n            if (!dat[i].children) {\n              dat[i].children = [];\n            }\n\n            if (!dat[i].state) {\n              dat[i].state = {};\n            }\n\n            m[dat[i].id.toString()] = dat[i];\n          } // 2) populate children (foreach)\n\n\n          for (i = 0, j = dat.length; i < j; i++) {\n            if (!m[dat[i].parent.toString()]) {\n              if (typeof inst !== \"undefined\") {\n                inst._data.core.last_error = {\n                  'error': 'parse',\n                  'plugin': 'core',\n                  'id': 'core_07',\n                  'reason': 'Node with invalid parent',\n                  'data': JSON.stringify({\n                    'id': dat[i].id.toString(),\n                    'parent': dat[i].parent.toString()\n                  })\n                };\n                inst.settings.core.error.call(inst, inst._data.core.last_error);\n              }\n\n              continue;\n            }\n\n            m[dat[i].parent.toString()].children.push(dat[i].id.toString()); // populate parent.children_d\n\n            p.children_d.push(dat[i].id.toString());\n          } // 3) normalize && populate parents and children_d with recursion\n\n\n          for (i = 0, j = p.children.length; i < j; i++) {\n            tmp = parse_flat(m[p.children[i]], par, p.parents.concat());\n            dpc.push(tmp);\n\n            if (m[tmp].children_d.length) {\n              dpc = dpc.concat(m[tmp].children_d);\n            }\n          }\n\n          for (i = 0, j = p.parents.length; i < j; i++) {\n            m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);\n          } // ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true;\n\n\n          rslt = {\n            'cnt': t_cnt,\n            'mod': m,\n            'sel': sel,\n            'par': par,\n            'dpc': dpc,\n            'add': add\n          };\n        } else {\n          for (i = 0, j = dat.length; i < j; i++) {\n            tmp = parse_nest(dat[i], par, p.parents.concat());\n\n            if (tmp) {\n              chd.push(tmp);\n              dpc.push(tmp);\n\n              if (m[tmp].children_d.length) {\n                dpc = dpc.concat(m[tmp].children_d);\n              }\n            }\n          }\n\n          p.children = chd;\n          p.children_d = dpc;\n\n          for (i = 0, j = p.parents.length; i < j; i++) {\n            m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);\n          }\n\n          rslt = {\n            'cnt': t_cnt,\n            'mod': m,\n            'sel': sel,\n            'par': par,\n            'dpc': dpc,\n            'add': add\n          };\n        }\n\n        if (typeof window === 'undefined' || typeof window.document === 'undefined') {\n          postMessage(rslt);\n        } else {\n          return rslt;\n        }\n      },\n          rslt = function rslt(_rslt, worker) {\n        if (this.element === null) {\n          return;\n        }\n\n        this._cnt = _rslt.cnt;\n        var i,\n            m = this._model.data;\n\n        for (i in m) {\n          if (m.hasOwnProperty(i) && m[i].state && m[i].state.loading && _rslt.mod[i]) {\n            _rslt.mod[i].state.loading = true;\n          }\n        }\n\n        this._model.data = _rslt.mod; // breaks the reference in load_node - careful\n\n        if (worker) {\n          var j,\n              a = _rslt.add,\n              r = _rslt.sel,\n              s = this._data.core.selected.slice();\n\n          m = this._model.data; // if selection was changed while calculating in worker\n\n          if (r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) {\n            // deselect nodes that are no longer selected\n            for (i = 0, j = r.length; i < j; i++) {\n              if ($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) {\n                m[r[i]].state.selected = false;\n              }\n            } // select nodes that were selected in the mean time\n\n\n            for (i = 0, j = s.length; i < j; i++) {\n              if ($.inArray(s[i], r) === -1) {\n                m[s[i]].state.selected = true;\n              }\n            }\n          }\n        }\n\n        if (_rslt.add.length) {\n          this._data.core.selected = this._data.core.selected.concat(_rslt.add);\n        }\n\n        this.trigger('model', {\n          \"nodes\": _rslt.dpc,\n          'parent': _rslt.par\n        });\n\n        if (_rslt.par !== $.jstree.root) {\n          this._node_changed(_rslt.par);\n\n          this.redraw();\n        } else {\n          // this.get_container_ul().children('.jstree-initial-node').remove();\n          this.redraw(true);\n        }\n\n        if (_rslt.add.length) {\n          this.trigger('changed', {\n            'action': 'model',\n            'selected': this._data.core.selected\n          });\n        } // If no worker, try to mimic worker behavioour, by invoking cb asynchronously\n\n\n        if (!worker && setImmediate) {\n          setImmediate(function () {\n            cb.call(inst, true);\n          });\n        } else {\n          cb.call(inst, true);\n        }\n      };\n\n      if (this.settings.core.worker && window.Blob && window.URL && window.Worker) {\n        try {\n          if (this._wrk === null) {\n            this._wrk = window.URL.createObjectURL(new window.Blob(['self.onmessage = ' + func.toString()], {\n              type: \"text/javascript\"\n            }));\n          }\n\n          if (!this._data.core.working || force_processing) {\n            this._data.core.working = true;\n            w = new window.Worker(this._wrk);\n\n            w.onmessage = function (e) {\n              rslt.call(this, e.data, true);\n\n              try {\n                w.terminate();\n                w = null;\n              } catch (ignore) {}\n\n              if (this._data.core.worker_queue.length) {\n                this._append_json_data.apply(this, this._data.core.worker_queue.shift());\n              } else {\n                this._data.core.working = false;\n              }\n            }.bind(this);\n\n            if (!args.par) {\n              if (this._data.core.worker_queue.length) {\n                this._append_json_data.apply(this, this._data.core.worker_queue.shift());\n              } else {\n                this._data.core.working = false;\n              }\n            } else {\n              w.postMessage(args);\n            }\n          } else {\n            this._data.core.worker_queue.push([dom, data, cb, true]);\n          }\n        } catch (e) {\n          rslt.call(this, func(args), false);\n\n          if (this._data.core.worker_queue.length) {\n            this._append_json_data.apply(this, this._data.core.worker_queue.shift());\n          } else {\n            this._data.core.working = false;\n          }\n        }\n      } else {\n        rslt.call(this, func(args), false);\n      }\n    },\n\n    /**\n     * parses a node from a jQuery object and appends them to the in memory tree model. Used internally.\n     * @private\n     * @name _parse_model_from_html(d [, p, ps])\n     * @param  {jQuery} d the jQuery object to parse\n     * @param  {String} p the parent ID\n     * @param  {Array} ps list of all parents\n     * @return {String} the ID of the object added to the model\n     */\n    _parse_model_from_html: function _parse_model_from_html(d, p, ps) {\n      if (!ps) {\n        ps = [];\n      } else {\n        ps = [].concat(ps);\n      }\n\n      if (p) {\n        ps.unshift(p);\n      }\n\n      var c,\n          e,\n          m = this._model.data,\n          data = {\n        id: false,\n        text: false,\n        icon: true,\n        parent: p,\n        parents: ps,\n        children: [],\n        children_d: [],\n        data: null,\n        state: {},\n        li_attr: {\n          id: false\n        },\n        a_attr: {\n          href: '#'\n        },\n        original: false\n      },\n          i,\n          tmp,\n          tid;\n\n      for (i in this._model.default_state) {\n        if (this._model.default_state.hasOwnProperty(i)) {\n          data.state[i] = this._model.default_state[i];\n        }\n      }\n\n      tmp = $.vakata.attributes(d, true);\n      $.each(tmp, function (i, v) {\n        v = $.vakata.trim(v);\n\n        if (!v.length) {\n          return true;\n        }\n\n        data.li_attr[i] = v;\n\n        if (i === 'id') {\n          data.id = v.toString();\n        }\n      });\n      tmp = d.children('a').first();\n\n      if (tmp.length) {\n        tmp = $.vakata.attributes(tmp, true);\n        $.each(tmp, function (i, v) {\n          v = $.vakata.trim(v);\n\n          if (v.length) {\n            data.a_attr[i] = v;\n          }\n        });\n      }\n\n      tmp = d.children(\"a\").first().length ? d.children(\"a\").first().clone() : d.clone();\n      tmp.children(\"ins, i, ul\").remove();\n      tmp = tmp.html();\n      tmp = $('<div></div>').html(tmp);\n      data.text = this.settings.core.force_text ? tmp.text() : tmp.html();\n      tmp = d.data();\n      data.data = tmp ? $.extend(true, {}, tmp) : null;\n      data.state.opened = d.hasClass('jstree-open');\n      data.state.selected = d.children('a').hasClass('jstree-clicked');\n      data.state.disabled = d.children('a').hasClass('jstree-disabled');\n\n      if (data.data && data.data.jstree) {\n        for (i in data.data.jstree) {\n          if (data.data.jstree.hasOwnProperty(i)) {\n            data.state[i] = data.data.jstree[i];\n          }\n        }\n      }\n\n      tmp = d.children(\"a\").children(\".jstree-themeicon\");\n\n      if (tmp.length) {\n        data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel');\n      }\n\n      if (data.state.icon !== undefined) {\n        data.icon = data.state.icon;\n      }\n\n      if (data.icon === undefined || data.icon === null || data.icon === \"\") {\n        data.icon = true;\n      }\n\n      tmp = d.children(\"ul\").children(\"li\");\n\n      do {\n        tid = 'j' + this._id + '_' + ++this._cnt;\n      } while (m[tid]);\n\n      data.id = data.li_attr.id ? data.li_attr.id.toString() : tid;\n\n      if (tmp.length) {\n        tmp.each(function (i, v) {\n          c = this._parse_model_from_html($(v), data.id, ps);\n          e = this._model.data[c];\n          data.children.push(c);\n\n          if (e.children_d.length) {\n            data.children_d = data.children_d.concat(e.children_d);\n          }\n        }.bind(this));\n        data.children_d = data.children_d.concat(data.children);\n      } else {\n        if (d.hasClass('jstree-closed')) {\n          data.state.loaded = false;\n        }\n      }\n\n      if (data.li_attr['class']) {\n        data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed', '').replace('jstree-open', '');\n      }\n\n      if (data.a_attr['class']) {\n        data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked', '').replace('jstree-disabled', '');\n      }\n\n      m[data.id] = data;\n\n      if (data.state.selected) {\n        this._data.core.selected.push(data.id);\n      }\n\n      return data.id;\n    },\n\n    /**\n     * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally.\n     * @private\n     * @name _parse_model_from_flat_json(d [, p, ps])\n     * @param  {Object} d the JSON object to parse\n     * @param  {String} p the parent ID\n     * @param  {Array} ps list of all parents\n     * @return {String} the ID of the object added to the model\n     */\n    _parse_model_from_flat_json: function _parse_model_from_flat_json(d, p, ps) {\n      if (!ps) {\n        ps = [];\n      } else {\n        ps = ps.concat();\n      }\n\n      if (p) {\n        ps.unshift(p);\n      }\n\n      var tid = d.id.toString(),\n          m = this._model.data,\n          df = this._model.default_state,\n          i,\n          j,\n          c,\n          e,\n          tmp = {\n        id: tid,\n        text: d.text || '',\n        icon: d.icon !== undefined ? d.icon : true,\n        parent: p,\n        parents: ps,\n        children: d.children || [],\n        children_d: d.children_d || [],\n        data: d.data,\n        state: {},\n        li_attr: {\n          id: false\n        },\n        a_attr: {\n          href: '#'\n        },\n        original: false\n      };\n\n      for (i in df) {\n        if (df.hasOwnProperty(i)) {\n          tmp.state[i] = df[i];\n        }\n      }\n\n      if (d && d.data && d.data.jstree && d.data.jstree.icon) {\n        tmp.icon = d.data.jstree.icon;\n      }\n\n      if (tmp.icon === undefined || tmp.icon === null || tmp.icon === \"\") {\n        tmp.icon = true;\n      }\n\n      if (d && d.data) {\n        tmp.data = d.data;\n\n        if (d.data.jstree) {\n          for (i in d.data.jstree) {\n            if (d.data.jstree.hasOwnProperty(i)) {\n              tmp.state[i] = d.data.jstree[i];\n            }\n          }\n        }\n      }\n\n      if (d && _typeof(d.state) === 'object') {\n        for (i in d.state) {\n          if (d.state.hasOwnProperty(i)) {\n            tmp.state[i] = d.state[i];\n          }\n        }\n      }\n\n      if (d && _typeof(d.li_attr) === 'object') {\n        for (i in d.li_attr) {\n          if (d.li_attr.hasOwnProperty(i)) {\n            tmp.li_attr[i] = d.li_attr[i];\n          }\n        }\n      }\n\n      if (!tmp.li_attr.id) {\n        tmp.li_attr.id = tid;\n      }\n\n      if (d && _typeof(d.a_attr) === 'object') {\n        for (i in d.a_attr) {\n          if (d.a_attr.hasOwnProperty(i)) {\n            tmp.a_attr[i] = d.a_attr[i];\n          }\n        }\n      }\n\n      if (d && d.children && d.children === true) {\n        tmp.state.loaded = false;\n        tmp.children = [];\n        tmp.children_d = [];\n      }\n\n      m[tmp.id] = tmp;\n\n      for (i = 0, j = tmp.children.length; i < j; i++) {\n        c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps);\n        e = m[c];\n        tmp.children_d.push(c);\n\n        if (e.children_d.length) {\n          tmp.children_d = tmp.children_d.concat(e.children_d);\n        }\n      }\n\n      delete d.data;\n      delete d.children;\n      m[tmp.id].original = d;\n\n      if (tmp.state.selected) {\n        this._data.core.selected.push(tmp.id);\n      }\n\n      return tmp.id;\n    },\n\n    /**\n     * parses a node from a JSON object and appends it to the in memory tree model. Used internally.\n     * @private\n     * @name _parse_model_from_json(d [, p, ps])\n     * @param  {Object} d the JSON object to parse\n     * @param  {String} p the parent ID\n     * @param  {Array} ps list of all parents\n     * @return {String} the ID of the object added to the model\n     */\n    _parse_model_from_json: function _parse_model_from_json(d, p, ps) {\n      if (!ps) {\n        ps = [];\n      } else {\n        ps = ps.concat();\n      }\n\n      if (p) {\n        ps.unshift(p);\n      }\n\n      var tid = false,\n          i,\n          j,\n          c,\n          e,\n          m = this._model.data,\n          df = this._model.default_state,\n          tmp;\n\n      do {\n        tid = 'j' + this._id + '_' + ++this._cnt;\n      } while (m[tid]);\n\n      tmp = {\n        id: false,\n        text: typeof d === 'string' ? d : '',\n        icon: _typeof(d) === 'object' && d.icon !== undefined ? d.icon : true,\n        parent: p,\n        parents: ps,\n        children: [],\n        children_d: [],\n        data: null,\n        state: {},\n        li_attr: {\n          id: false\n        },\n        a_attr: {\n          href: '#'\n        },\n        original: false\n      };\n\n      for (i in df) {\n        if (df.hasOwnProperty(i)) {\n          tmp.state[i] = df[i];\n        }\n      }\n\n      if (d && d.id) {\n        tmp.id = d.id.toString();\n      }\n\n      if (d && d.text) {\n        tmp.text = d.text;\n      }\n\n      if (d && d.data && d.data.jstree && d.data.jstree.icon) {\n        tmp.icon = d.data.jstree.icon;\n      }\n\n      if (tmp.icon === undefined || tmp.icon === null || tmp.icon === \"\") {\n        tmp.icon = true;\n      }\n\n      if (d && d.data) {\n        tmp.data = d.data;\n\n        if (d.data.jstree) {\n          for (i in d.data.jstree) {\n            if (d.data.jstree.hasOwnProperty(i)) {\n              tmp.state[i] = d.data.jstree[i];\n            }\n          }\n        }\n      }\n\n      if (d && _typeof(d.state) === 'object') {\n        for (i in d.state) {\n          if (d.state.hasOwnProperty(i)) {\n            tmp.state[i] = d.state[i];\n          }\n        }\n      }\n\n      if (d && _typeof(d.li_attr) === 'object') {\n        for (i in d.li_attr) {\n          if (d.li_attr.hasOwnProperty(i)) {\n            tmp.li_attr[i] = d.li_attr[i];\n          }\n        }\n      }\n\n      if (tmp.li_attr.id && !tmp.id) {\n        tmp.id = tmp.li_attr.id.toString();\n      }\n\n      if (!tmp.id) {\n        tmp.id = tid;\n      }\n\n      if (!tmp.li_attr.id) {\n        tmp.li_attr.id = tmp.id;\n      }\n\n      if (d && _typeof(d.a_attr) === 'object') {\n        for (i in d.a_attr) {\n          if (d.a_attr.hasOwnProperty(i)) {\n            tmp.a_attr[i] = d.a_attr[i];\n          }\n        }\n      }\n\n      if (d && d.children && d.children.length) {\n        for (i = 0, j = d.children.length; i < j; i++) {\n          c = this._parse_model_from_json(d.children[i], tmp.id, ps);\n          e = m[c];\n          tmp.children.push(c);\n\n          if (e.children_d.length) {\n            tmp.children_d = tmp.children_d.concat(e.children_d);\n          }\n        }\n\n        tmp.children_d = tmp.children.concat(tmp.children_d);\n      }\n\n      if (d && d.children && d.children === true) {\n        tmp.state.loaded = false;\n        tmp.children = [];\n        tmp.children_d = [];\n      }\n\n      delete d.data;\n      delete d.children;\n      tmp.original = d;\n      m[tmp.id] = tmp;\n\n      if (tmp.state.selected) {\n        this._data.core.selected.push(tmp.id);\n      }\n\n      return tmp.id;\n    },\n\n    /**\n     * redraws all nodes that need to be redrawn. Used internally.\n     * @private\n     * @name _redraw()\n     * @trigger redraw.jstree\n     */\n    _redraw: function _redraw() {\n      var nodes = this._model.force_full_redraw ? this._model.data[$.jstree.root].children.concat([]) : this._model.changed.concat([]),\n          f = document.createElement('UL'),\n          tmp,\n          i,\n          j,\n          fe = this._data.core.focused;\n\n      for (i = 0, j = nodes.length; i < j; i++) {\n        tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw);\n\n        if (tmp && this._model.force_full_redraw) {\n          f.appendChild(tmp);\n        }\n      }\n\n      if (this._model.force_full_redraw) {\n        f.className = this.get_container_ul()[0].className;\n        f.setAttribute('role', 'group');\n        this.element.empty().append(f); //this.get_container_ul()[0].appendChild(f);\n      }\n\n      if (fe !== null && this.settings.core.restore_focus) {\n        tmp = this.get_node(fe, true);\n\n        if (tmp && tmp.length && tmp.children('.jstree-anchor')[0] !== document.activeElement) {\n          tmp.children('.jstree-anchor').trigger('focus');\n        } else {\n          this._data.core.focused = null;\n        }\n      }\n\n      this._model.force_full_redraw = false;\n      this._model.changed = [];\n      /**\n       * triggered after nodes are redrawn\n       * @event\n       * @name redraw.jstree\n       * @param {array} nodes the redrawn nodes\n       */\n\n      this.trigger('redraw', {\n        \"nodes\": nodes\n      });\n    },\n\n    /**\n     * redraws all nodes that need to be redrawn or optionally - the whole tree\n     * @name redraw([full])\n     * @param {Boolean} full if set to `true` all nodes are redrawn.\n     */\n    redraw: function redraw(full) {\n      if (full) {\n        this._model.force_full_redraw = true;\n      } //if(this._model.redraw_timeout) {\n      //\tclearTimeout(this._model.redraw_timeout);\n      //}\n      //this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0);\n\n\n      this._redraw();\n    },\n\n    /**\n     * redraws a single node's children. Used internally.\n     * @private\n     * @name draw_children(node)\n     * @param {mixed} node the node whose children will be redrawn\n     */\n    draw_children: function draw_children(node) {\n      var obj = this.get_node(node),\n          i = false,\n          j = false,\n          k = false,\n          d = document;\n\n      if (!obj) {\n        return false;\n      }\n\n      if (obj.id === $.jstree.root) {\n        return this.redraw(true);\n      }\n\n      node = this.get_node(node, true);\n\n      if (!node || !node.length) {\n        return false;\n      } // TODO: quick toggle\n\n\n      node.children('.jstree-children').remove();\n      node = node[0];\n\n      if (obj.children.length && obj.state.loaded) {\n        k = d.createElement('UL');\n        k.setAttribute('role', 'group');\n        k.className = 'jstree-children';\n\n        for (i = 0, j = obj.children.length; i < j; i++) {\n          k.appendChild(this.redraw_node(obj.children[i], true, true));\n        }\n\n        node.appendChild(k);\n      }\n    },\n\n    /**\n     * redraws a single node. Used internally.\n     * @private\n     * @name redraw_node(node, deep, is_callback, force_render)\n     * @param {mixed} node the node to redraw\n     * @param {Boolean} deep should child nodes be redrawn too\n     * @param {Boolean} is_callback is this a recursion call\n     * @param {Boolean} force_render should children of closed parents be drawn anyway\n     */\n    redraw_node: function redraw_node(node, deep, is_callback, force_render) {\n      var obj = this.get_node(node),\n          par = false,\n          ind = false,\n          old = false,\n          i = false,\n          j = false,\n          k = false,\n          c = '',\n          d = document,\n          m = this._model.data,\n          f = false,\n          s = false,\n          tmp = null,\n          t = 0,\n          l = 0,\n          has_children = false,\n          last_sibling = false;\n\n      if (!obj) {\n        return false;\n      }\n\n      if (obj.id === $.jstree.root) {\n        return this.redraw(true);\n      }\n\n      deep = deep || obj.children.length === 0;\n      node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + (\"0123456789\".indexOf(obj.id[0]) !== -1 ? '\\\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex, '\\\\$&') : obj.id.replace($.jstree.idregex, '\\\\$&'))); //, this.element);\n\n      if (!node) {\n        deep = true; //node = d.createElement('LI');\n\n        if (!is_callback) {\n          par = obj.parent !== $.jstree.root ? $('#' + obj.parent.replace($.jstree.idregex, '\\\\$&'), this.element)[0] : null;\n\n          if (par !== null && (!par || !m[obj.parent].state.opened)) {\n            return false;\n          }\n\n          ind = $.inArray(obj.id, par === null ? m[$.jstree.root].children : m[obj.parent].children);\n        }\n      } else {\n        node = $(node);\n\n        if (!is_callback) {\n          par = node.parent().parent()[0];\n\n          if (par === this.element[0]) {\n            par = null;\n          }\n\n          ind = node.index();\n        } // m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage\n\n\n        if (!deep && obj.children.length && !node.children('.jstree-children').length) {\n          deep = true;\n        }\n\n        if (!deep) {\n          old = node.children('.jstree-children')[0];\n        }\n\n        f = node.children('.jstree-anchor')[0] === document.activeElement;\n        node.remove(); //node = d.createElement('LI');\n        //node = node[0];\n      }\n\n      node = this._data.core.node.cloneNode(true); // node is DOM, deep is boolean\n\n      c = 'jstree-node ';\n\n      for (i in obj.li_attr) {\n        if (obj.li_attr.hasOwnProperty(i)) {\n          if (i === 'id') {\n            continue;\n          }\n\n          if (i !== 'class') {\n            node.setAttribute(i, obj.li_attr[i]);\n          } else {\n            c += obj.li_attr[i];\n          }\n        }\n      }\n\n      if (!obj.a_attr.id) {\n        obj.a_attr.id = obj.id + '_anchor';\n      }\n\n      node.childNodes[1].setAttribute('aria-selected', !!obj.state.selected);\n      node.childNodes[1].setAttribute('aria-level', obj.parents.length);\n\n      if (this.settings.core.compute_elements_positions) {\n        node.childNodes[1].setAttribute('aria-setsize', m[obj.parent].children.length);\n        node.childNodes[1].setAttribute('aria-posinset', m[obj.parent].children.indexOf(obj.id) + 1);\n      }\n\n      if (obj.state.disabled) {\n        node.childNodes[1].setAttribute('aria-disabled', true);\n      }\n\n      for (i = 0, j = obj.children.length; i < j; i++) {\n        if (!m[obj.children[i]].state.hidden) {\n          has_children = true;\n          break;\n        }\n      }\n\n      if (obj.parent !== null && m[obj.parent] && !obj.state.hidden) {\n        i = $.inArray(obj.id, m[obj.parent].children);\n        last_sibling = obj.id;\n\n        if (i !== -1) {\n          i++;\n\n          for (j = m[obj.parent].children.length; i < j; i++) {\n            if (!m[m[obj.parent].children[i]].state.hidden) {\n              last_sibling = m[obj.parent].children[i];\n            }\n\n            if (last_sibling !== obj.id) {\n              break;\n            }\n          }\n        }\n      }\n\n      if (obj.state.hidden) {\n        c += ' jstree-hidden';\n      }\n\n      if (obj.state.loading) {\n        c += ' jstree-loading';\n      }\n\n      if (obj.state.loaded && !has_children) {\n        c += ' jstree-leaf';\n      } else {\n        c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed';\n        node.childNodes[1].setAttribute('aria-expanded', obj.state.opened && obj.state.loaded);\n      }\n\n      if (last_sibling === obj.id) {\n        c += ' jstree-last';\n      }\n\n      node.id = obj.id;\n      node.className = c;\n      c = (obj.state.selected ? ' jstree-clicked' : '') + (obj.state.disabled ? ' jstree-disabled' : '');\n\n      for (j in obj.a_attr) {\n        if (obj.a_attr.hasOwnProperty(j)) {\n          if (j === 'href' && obj.a_attr[j] === '#') {\n            continue;\n          }\n\n          if (j !== 'class') {\n            node.childNodes[1].setAttribute(j, obj.a_attr[j]);\n          } else {\n            c += ' ' + obj.a_attr[j];\n          }\n        }\n      }\n\n      if (c.length) {\n        node.childNodes[1].className = 'jstree-anchor ' + c;\n      }\n\n      if (obj.icon && obj.icon !== true || obj.icon === false) {\n        if (obj.icon === false) {\n          node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden';\n        } else if (obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) {\n          node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom';\n        } else {\n          node.childNodes[1].childNodes[0].style.backgroundImage = 'url(\"' + obj.icon + '\")';\n          node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center';\n          node.childNodes[1].childNodes[0].style.backgroundSize = 'auto';\n          node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom';\n        }\n      }\n\n      if (this.settings.core.force_text) {\n        node.childNodes[1].appendChild(d.createTextNode(obj.text));\n      } else {\n        node.childNodes[1].innerHTML += obj.text;\n      }\n\n      if (deep && obj.children.length && (obj.state.opened || force_render) && obj.state.loaded) {\n        k = d.createElement('UL');\n        k.setAttribute('role', 'group');\n        k.className = 'jstree-children';\n\n        for (i = 0, j = obj.children.length; i < j; i++) {\n          k.appendChild(this.redraw_node(obj.children[i], deep, true));\n        }\n\n        node.appendChild(k);\n      }\n\n      if (old) {\n        node.appendChild(old);\n      }\n\n      if (!is_callback) {\n        // append back using par / ind\n        if (!par) {\n          par = this.element[0];\n        }\n\n        for (i = 0, j = par.childNodes.length; i < j; i++) {\n          if (par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) {\n            tmp = par.childNodes[i];\n            break;\n          }\n        }\n\n        if (!tmp) {\n          tmp = d.createElement('UL');\n          tmp.setAttribute('role', 'group');\n          tmp.className = 'jstree-children';\n          par.appendChild(tmp);\n        }\n\n        par = tmp;\n\n        if (ind < par.childNodes.length) {\n          par.insertBefore(node, par.childNodes[ind]);\n        } else {\n          par.appendChild(node);\n        }\n\n        if (f) {\n          t = this.element[0].scrollTop;\n          l = this.element[0].scrollLeft;\n          node.childNodes[1].focus();\n          this.element[0].scrollTop = t;\n          this.element[0].scrollLeft = l;\n        }\n      }\n\n      if (obj.state.opened && !obj.state.loaded) {\n        obj.state.opened = false;\n        setTimeout(function () {\n          this.open_node(obj.id, false, 0);\n        }.bind(this), 0);\n      }\n\n      return node;\n    },\n\n    /**\n     * opens a node, revealing its children. If the node is not loaded it will be loaded and opened once ready.\n     * @name open_node(obj [, callback, animation])\n     * @param {mixed} obj the node to open\n     * @param {Function} callback a function to execute once the node is opened\n     * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation.\n     * @trigger open_node.jstree, after_open.jstree, before_open.jstree\n     */\n    open_node: function open_node(obj, callback, animation) {\n      var t1, t2, d, t;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.open_node(obj[t1], callback, animation);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      animation = animation === undefined ? this.settings.core.animation : animation;\n\n      if (!this.is_closed(obj)) {\n        if (callback) {\n          callback.call(this, obj, false);\n        }\n\n        return false;\n      }\n\n      if (!this.is_loaded(obj)) {\n        if (this.is_loading(obj)) {\n          return setTimeout(function () {\n            this.open_node(obj, callback, animation);\n          }.bind(this), 500);\n        }\n\n        this.load_node(obj, function (o, ok) {\n          return ok ? this.open_node(o, callback, animation) : callback ? callback.call(this, o, false) : false;\n        });\n      } else {\n        d = this.get_node(obj, true);\n        t = this;\n\n        if (d.length) {\n          if (animation && d.children(\".jstree-children\").length) {\n            d.children(\".jstree-children\").stop(true, true);\n          }\n\n          if (obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) {\n            this.draw_children(obj); //d = this.get_node(obj, true);\n          }\n\n          if (!animation) {\n            this.trigger('before_open', {\n              \"node\": obj\n            });\n            d[0].className = d[0].className.replace('jstree-closed', 'jstree-open');\n            d[0].childNodes[1].setAttribute(\"aria-expanded\", true);\n          } else {\n            this.trigger('before_open', {\n              \"node\": obj\n            });\n            d.children(\".jstree-children\").css(\"display\", \"none\").end().removeClass(\"jstree-closed\").addClass(\"jstree-open\").children('.jstree-anchor').attr(\"aria-expanded\", true).end().children(\".jstree-children\").stop(true, true).slideDown(animation, function () {\n              this.style.display = \"\";\n\n              if (t.element) {\n                t.trigger(\"after_open\", {\n                  \"node\": obj\n                });\n              }\n            });\n          }\n        }\n\n        obj.state.opened = true;\n\n        if (callback) {\n          callback.call(this, obj, true);\n        }\n\n        if (!d.length) {\n          /**\n           * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet)\n           * @event\n           * @name before_open.jstree\n           * @param {Object} node the opened node\n           */\n          this.trigger('before_open', {\n            \"node\": obj\n          });\n        }\n        /**\n         * triggered when a node is opened (if there is an animation it will not be completed yet)\n         * @event\n         * @name open_node.jstree\n         * @param {Object} node the opened node\n         */\n\n\n        this.trigger('open_node', {\n          \"node\": obj\n        });\n\n        if (!animation || !d.length) {\n          /**\n           * triggered when a node is opened and the animation is complete\n           * @event\n           * @name after_open.jstree\n           * @param {Object} node the opened node\n           */\n          this.trigger(\"after_open\", {\n            \"node\": obj\n          });\n        }\n\n        return true;\n      }\n    },\n\n    /**\n     * opens every parent of a node (node should be loaded)\n     * @name _open_to(obj)\n     * @param {mixed} obj the node to reveal\n     * @private\n     */\n    _open_to: function _open_to(obj) {\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      var i,\n          j,\n          p = obj.parents;\n\n      for (i = 0, j = p.length; i < j; i += 1) {\n        if (i !== $.jstree.root) {\n          this.open_node(p[i], false, 0);\n        }\n      }\n\n      return $('#' + obj.id.replace($.jstree.idregex, '\\\\$&'), this.element);\n    },\n\n    /**\n     * closes a node, hiding its children\n     * @name close_node(obj [, animation])\n     * @param {mixed} obj the node to close\n     * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation.\n     * @trigger close_node.jstree, after_close.jstree\n     */\n    close_node: function close_node(obj, animation) {\n      var t1, t2, t, d;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.close_node(obj[t1], animation);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      if (this.is_closed(obj)) {\n        return false;\n      }\n\n      animation = animation === undefined ? this.settings.core.animation : animation;\n      t = this;\n      d = this.get_node(obj, true);\n      obj.state.opened = false;\n      /**\n       * triggered when a node is closed (if there is an animation it will not be complete yet)\n       * @event\n       * @name close_node.jstree\n       * @param {Object} node the closed node\n       */\n\n      this.trigger('close_node', {\n        \"node\": obj\n      });\n\n      if (!d.length) {\n        /**\n         * triggered when a node is closed and the animation is complete\n         * @event\n         * @name after_close.jstree\n         * @param {Object} node the closed node\n         */\n        this.trigger(\"after_close\", {\n          \"node\": obj\n        });\n      } else {\n        if (!animation) {\n          d[0].className = d[0].className.replace('jstree-open', 'jstree-closed');\n          d.children('.jstree-anchor').attr(\"aria-expanded\", false);\n          d.children('.jstree-children').remove();\n          this.trigger(\"after_close\", {\n            \"node\": obj\n          });\n        } else {\n          d.children(\".jstree-children\").attr(\"style\", \"display:block !important\").end().removeClass(\"jstree-open\").addClass(\"jstree-closed\").children('.jstree-anchor').attr(\"aria-expanded\", false).end().children(\".jstree-children\").stop(true, true).slideUp(animation, function () {\n            this.style.display = \"\";\n            d.children('.jstree-children').remove();\n\n            if (t.element) {\n              t.trigger(\"after_close\", {\n                \"node\": obj\n              });\n            }\n          });\n        }\n      }\n    },\n\n    /**\n     * toggles a node - closing it if it is open, opening it if it is closed\n     * @name toggle_node(obj)\n     * @param {mixed} obj the node to toggle\n     */\n    toggle_node: function toggle_node(obj) {\n      var t1, t2;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.toggle_node(obj[t1]);\n        }\n\n        return true;\n      }\n\n      if (this.is_closed(obj)) {\n        return this.open_node(obj);\n      }\n\n      if (this.is_open(obj)) {\n        return this.close_node(obj);\n      }\n    },\n\n    /**\n     * opens all nodes within a node (or the tree), revealing their children. If the node is not loaded it will be loaded and opened once ready.\n     * @name open_all([obj, animation, original_obj])\n     * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree\n     * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation\n     * @param {jQuery} reference to the node that started the process (internal use)\n     * @trigger open_all.jstree\n     */\n    open_all: function open_all(obj, animation, original_obj) {\n      if (!obj) {\n        obj = $.jstree.root;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj) {\n        return false;\n      }\n\n      var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true),\n          i,\n          j,\n          _this;\n\n      if (!dom.length) {\n        for (i = 0, j = obj.children_d.length; i < j; i++) {\n          if (this.is_closed(this._model.data[obj.children_d[i]])) {\n            this._model.data[obj.children_d[i]].state.opened = true;\n          }\n        }\n\n        return this.trigger('open_all', {\n          \"node\": obj\n        });\n      }\n\n      original_obj = original_obj || dom;\n      _this = this;\n      dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed');\n      dom.each(function () {\n        _this.open_node(this, function (node, status) {\n          if (status && this.is_parent(node)) {\n            this.open_all(node, animation, original_obj);\n          }\n        }, animation || 0);\n      });\n\n      if (original_obj.find('.jstree-closed').length === 0) {\n        /**\n         * triggered when an `open_all` call completes\n         * @event\n         * @name open_all.jstree\n         * @param {Object} node the opened node\n         */\n        this.trigger('open_all', {\n          \"node\": this.get_node(original_obj)\n        });\n      }\n    },\n\n    /**\n     * closes all nodes within a node (or the tree), revealing their children\n     * @name close_all([obj, animation])\n     * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree\n     * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation\n     * @trigger close_all.jstree\n     */\n    close_all: function close_all(obj, animation) {\n      if (!obj) {\n        obj = $.jstree.root;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj) {\n        return false;\n      }\n\n      var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true),\n          _this = this,\n          i,\n          j;\n\n      if (dom.length) {\n        dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open');\n        $(dom.get().reverse()).each(function () {\n          _this.close_node(this, animation || 0);\n        });\n      }\n\n      for (i = 0, j = obj.children_d.length; i < j; i++) {\n        this._model.data[obj.children_d[i]].state.opened = false;\n      }\n      /**\n       * triggered when an `close_all` call completes\n       * @event\n       * @name close_all.jstree\n       * @param {Object} node the closed node\n       */\n\n\n      this.trigger('close_all', {\n        \"node\": obj\n      });\n    },\n\n    /**\n     * checks if a node is disabled (not selectable)\n     * @name is_disabled(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n    is_disabled: function is_disabled(obj) {\n      obj = this.get_node(obj);\n      return obj && obj.state && obj.state.disabled;\n    },\n\n    /**\n     * enables a node - so that it can be selected\n     * @name enable_node(obj)\n     * @param {mixed} obj the node to enable\n     * @trigger enable_node.jstree\n     */\n    enable_node: function enable_node(obj) {\n      var t1, t2;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.enable_node(obj[t1]);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      obj.state.disabled = false;\n      this.get_node(obj, true).children('.jstree-anchor').removeClass('jstree-disabled').attr('aria-disabled', false);\n      /**\n       * triggered when an node is enabled\n       * @event\n       * @name enable_node.jstree\n       * @param {Object} node the enabled node\n       */\n\n      this.trigger('enable_node', {\n        'node': obj\n      });\n    },\n\n    /**\n     * disables a node - so that it can not be selected\n     * @name disable_node(obj)\n     * @param {mixed} obj the node to disable\n     * @trigger disable_node.jstree\n     */\n    disable_node: function disable_node(obj) {\n      var t1, t2;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.disable_node(obj[t1]);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      obj.state.disabled = true;\n      this.get_node(obj, true).children('.jstree-anchor').addClass('jstree-disabled').attr('aria-disabled', true);\n      /**\n       * triggered when an node is disabled\n       * @event\n       * @name disable_node.jstree\n       * @param {Object} node the disabled node\n       */\n\n      this.trigger('disable_node', {\n        'node': obj\n      });\n    },\n\n    /**\n     * determines if a node is hidden\n     * @name is_hidden(obj)\n     * @param {mixed} obj the node\n     */\n    is_hidden: function is_hidden(obj) {\n      obj = this.get_node(obj);\n      return obj.state.hidden === true;\n    },\n\n    /**\n     * hides a node - it is still in the structure but will not be visible\n     * @name hide_node(obj)\n     * @param {mixed} obj the node to hide\n     * @param {Boolean} skip_redraw internal parameter controlling if redraw is called\n     * @trigger hide_node.jstree\n     */\n    hide_node: function hide_node(obj, skip_redraw) {\n      var t1, t2;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.hide_node(obj[t1], true);\n        }\n\n        if (!skip_redraw) {\n          this.redraw();\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      if (!obj.state.hidden) {\n        obj.state.hidden = true;\n\n        this._node_changed(obj.parent);\n\n        if (!skip_redraw) {\n          this.redraw();\n        }\n        /**\n         * triggered when an node is hidden\n         * @event\n         * @name hide_node.jstree\n         * @param {Object} node the hidden node\n         */\n\n\n        this.trigger('hide_node', {\n          'node': obj\n        });\n      }\n    },\n\n    /**\n     * shows a node\n     * @name show_node(obj)\n     * @param {mixed} obj the node to show\n     * @param {Boolean} skip_redraw internal parameter controlling if redraw is called\n     * @trigger show_node.jstree\n     */\n    show_node: function show_node(obj, skip_redraw) {\n      var t1, t2;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.show_node(obj[t1], true);\n        }\n\n        if (!skip_redraw) {\n          this.redraw();\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      if (obj.state.hidden) {\n        obj.state.hidden = false;\n\n        this._node_changed(obj.parent);\n\n        if (!skip_redraw) {\n          this.redraw();\n        }\n        /**\n         * triggered when an node is shown\n         * @event\n         * @name show_node.jstree\n         * @param {Object} node the shown node\n         */\n\n\n        this.trigger('show_node', {\n          'node': obj\n        });\n      }\n    },\n\n    /**\n     * hides all nodes\n     * @name hide_all()\n     * @trigger hide_all.jstree\n     */\n    hide_all: function hide_all(skip_redraw) {\n      var i,\n          m = this._model.data,\n          ids = [];\n\n      for (i in m) {\n        if (m.hasOwnProperty(i) && i !== $.jstree.root && !m[i].state.hidden) {\n          m[i].state.hidden = true;\n          ids.push(i);\n        }\n      }\n\n      this._model.force_full_redraw = true;\n\n      if (!skip_redraw) {\n        this.redraw();\n      }\n      /**\n       * triggered when all nodes are hidden\n       * @event\n       * @name hide_all.jstree\n       * @param {Array} nodes the IDs of all hidden nodes\n       */\n\n\n      this.trigger('hide_all', {\n        'nodes': ids\n      });\n      return ids;\n    },\n\n    /**\n     * shows all nodes\n     * @name show_all()\n     * @trigger show_all.jstree\n     */\n    show_all: function show_all(skip_redraw) {\n      var i,\n          m = this._model.data,\n          ids = [];\n\n      for (i in m) {\n        if (m.hasOwnProperty(i) && i !== $.jstree.root && m[i].state.hidden) {\n          m[i].state.hidden = false;\n          ids.push(i);\n        }\n      }\n\n      this._model.force_full_redraw = true;\n\n      if (!skip_redraw) {\n        this.redraw();\n      }\n      /**\n       * triggered when all nodes are shown\n       * @event\n       * @name show_all.jstree\n       * @param {Array} nodes the IDs of all shown nodes\n       */\n\n\n      this.trigger('show_all', {\n        'nodes': ids\n      });\n      return ids;\n    },\n\n    /**\n     * called when a node is selected by the user. Used internally.\n     * @private\n     * @name activate_node(obj, e)\n     * @param {mixed} obj the node\n     * @param {Object} e the related event\n     * @trigger activate_node.jstree, changed.jstree\n     */\n    activate_node: function activate_node(obj, e) {\n      if (this.is_disabled(obj)) {\n        return false;\n      }\n\n      if (!e || _typeof(e) !== 'object') {\n        e = {};\n      } // ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node\n\n\n      this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null;\n\n      if (this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) {\n        this._data.core.last_clicked = null;\n      }\n\n      if (!this._data.core.last_clicked && this._data.core.selected.length) {\n        this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]);\n      }\n\n      if (!this.settings.core.multiple || !e.metaKey && !e.ctrlKey && !e.shiftKey || e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent)) {\n        if (!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) {\n          this.deselect_node(obj, false, e);\n        } else {\n          this.deselect_all(true);\n          this.select_node(obj, false, false, e);\n          this._data.core.last_clicked = this.get_node(obj);\n        }\n      } else {\n        if (e.shiftKey) {\n          var o = this.get_node(obj).id,\n              l = this._data.core.last_clicked.id,\n              p = this.get_node(this._data.core.last_clicked.parent).children,\n              c = false,\n              i,\n              j;\n\n          for (i = 0, j = p.length; i < j; i += 1) {\n            // separate IFs work whem o and l are the same\n            if (p[i] === o) {\n              c = !c;\n            }\n\n            if (p[i] === l) {\n              c = !c;\n            }\n\n            if (!this.is_disabled(p[i]) && (c || p[i] === o || p[i] === l)) {\n              if (!this.is_hidden(p[i])) {\n                this.select_node(p[i], true, false, e);\n              }\n            } else {\n              this.deselect_node(p[i], true, e);\n            }\n          }\n\n          this.trigger('changed', {\n            'action': 'select_node',\n            'node': this.get_node(obj),\n            'selected': this._data.core.selected,\n            'event': e\n          });\n        } else {\n          if (!this.is_selected(obj)) {\n            this.select_node(obj, false, false, e);\n          } else {\n            this.deselect_node(obj, false, e);\n          }\n        }\n      }\n      /**\n       * triggered when an node is clicked or intercated with by the user\n       * @event\n       * @name activate_node.jstree\n       * @param {Object} node\n       * @param {Object} event the ooriginal event (if any) which triggered the call (may be an empty object)\n       */\n\n\n      this.trigger('activate_node', {\n        'node': this.get_node(obj),\n        'event': e\n      });\n    },\n\n    /**\n     * applies the hover state on a node, called when a node is hovered by the user. Used internally.\n     * @private\n     * @name hover_node(obj)\n     * @param {mixed} obj\n     * @trigger hover_node.jstree\n     */\n    hover_node: function hover_node(obj) {\n      obj = this.get_node(obj, true);\n\n      if (!obj || !obj.length || obj.children('.jstree-hovered').length) {\n        return false;\n      }\n\n      var o = this.element.find('.jstree-hovered'),\n          t = this.element;\n\n      if (o && o.length) {\n        this.dehover_node(o);\n      }\n\n      obj.children('.jstree-anchor').addClass('jstree-hovered');\n      /**\n       * triggered when an node is hovered\n       * @event\n       * @name hover_node.jstree\n       * @param {Object} node\n       */\n\n      this.trigger('hover_node', {\n        'node': this.get_node(obj)\n      });\n      setTimeout(function () {\n        t.attr('aria-activedescendant', obj[0].id);\n      }, 0);\n    },\n\n    /**\n     * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally.\n     * @private\n     * @name dehover_node(obj)\n     * @param {mixed} obj\n     * @trigger dehover_node.jstree\n     */\n    dehover_node: function dehover_node(obj) {\n      obj = this.get_node(obj, true);\n\n      if (!obj || !obj.length || !obj.children('.jstree-hovered').length) {\n        return false;\n      }\n\n      obj.children('.jstree-anchor').removeClass('jstree-hovered');\n      /**\n       * triggered when an node is no longer hovered\n       * @event\n       * @name dehover_node.jstree\n       * @param {Object} node\n       */\n\n      this.trigger('dehover_node', {\n        'node': this.get_node(obj)\n      });\n    },\n\n    /**\n     * select a node\n     * @name select_node(obj [, supress_event, prevent_open])\n     * @param {mixed} obj an array can be used to select multiple nodes\n     * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered\n     * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened\n     * @trigger select_node.jstree, changed.jstree\n     */\n    select_node: function select_node(obj, supress_event, prevent_open, e) {\n      var dom, t1, t2, th;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.select_node(obj[t1], supress_event, prevent_open, e);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      dom = this.get_node(obj, true);\n\n      if (!obj.state.selected) {\n        obj.state.selected = true;\n\n        this._data.core.selected.push(obj.id);\n\n        if (!prevent_open) {\n          dom = this._open_to(obj);\n        }\n\n        if (dom && dom.length) {\n          dom.children('.jstree-anchor').addClass('jstree-clicked').attr('aria-selected', true);\n        }\n        /**\n         * triggered when an node is selected\n         * @event\n         * @name select_node.jstree\n         * @param {Object} node\n         * @param {Array} selected the current selection\n         * @param {Object} event the event (if any) that triggered this select_node\n         */\n\n\n        this.trigger('select_node', {\n          'node': obj,\n          'selected': this._data.core.selected,\n          'event': e\n        });\n\n        if (!supress_event) {\n          /**\n           * triggered when selection changes\n           * @event\n           * @name changed.jstree\n           * @param {Object} node\n           * @param {Object} action the action that caused the selection to change\n           * @param {Array} selected the current selection\n           * @param {Object} event the event (if any) that triggered this changed event\n           */\n          this.trigger('changed', {\n            'action': 'select_node',\n            'node': obj,\n            'selected': this._data.core.selected,\n            'event': e\n          });\n        }\n      }\n    },\n\n    /**\n     * deselect a node\n     * @name deselect_node(obj [, supress_event])\n     * @param {mixed} obj an array can be used to deselect multiple nodes\n     * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered\n     * @trigger deselect_node.jstree, changed.jstree\n     */\n    deselect_node: function deselect_node(obj, supress_event, e) {\n      var t1, t2, dom;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.deselect_node(obj[t1], supress_event, e);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      dom = this.get_node(obj, true);\n\n      if (obj.state.selected) {\n        obj.state.selected = false;\n        this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id);\n\n        if (dom.length) {\n          dom.children('.jstree-anchor').removeClass('jstree-clicked').attr('aria-selected', false);\n        }\n        /**\n         * triggered when an node is deselected\n         * @event\n         * @name deselect_node.jstree\n         * @param {Object} node\n         * @param {Array} selected the current selection\n         * @param {Object} event the event (if any) that triggered this deselect_node\n         */\n\n\n        this.trigger('deselect_node', {\n          'node': obj,\n          'selected': this._data.core.selected,\n          'event': e\n        });\n\n        if (!supress_event) {\n          this.trigger('changed', {\n            'action': 'deselect_node',\n            'node': obj,\n            'selected': this._data.core.selected,\n            'event': e\n          });\n        }\n      }\n    },\n\n    /**\n     * select all nodes in the tree\n     * @name select_all([supress_event])\n     * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered\n     * @trigger select_all.jstree, changed.jstree\n     */\n    select_all: function select_all(supress_event) {\n      var tmp = this._data.core.selected.concat([]),\n          i,\n          j;\n\n      this._data.core.selected = this._model.data[$.jstree.root].children_d.concat();\n\n      for (i = 0, j = this._data.core.selected.length; i < j; i++) {\n        if (this._model.data[this._data.core.selected[i]]) {\n          this._model.data[this._data.core.selected[i]].state.selected = true;\n        }\n      }\n\n      this.redraw(true);\n      /**\n       * triggered when all nodes are selected\n       * @event\n       * @name select_all.jstree\n       * @param {Array} selected the current selection\n       */\n\n      this.trigger('select_all', {\n        'selected': this._data.core.selected\n      });\n\n      if (!supress_event) {\n        this.trigger('changed', {\n          'action': 'select_all',\n          'selected': this._data.core.selected,\n          'old_selection': tmp\n        });\n      }\n    },\n\n    /**\n     * deselect all selected nodes\n     * @name deselect_all([supress_event])\n     * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered\n     * @trigger deselect_all.jstree, changed.jstree\n     */\n    deselect_all: function deselect_all(supress_event) {\n      var tmp = this._data.core.selected.concat([]),\n          i,\n          j;\n\n      for (i = 0, j = this._data.core.selected.length; i < j; i++) {\n        if (this._model.data[this._data.core.selected[i]]) {\n          this._model.data[this._data.core.selected[i]].state.selected = false;\n        }\n      }\n\n      this._data.core.selected = [];\n      this.element.find('.jstree-clicked').removeClass('jstree-clicked').attr('aria-selected', false);\n      /**\n       * triggered when all nodes are deselected\n       * @event\n       * @name deselect_all.jstree\n       * @param {Object} node the previous selection\n       * @param {Array} selected the current selection\n       */\n\n      this.trigger('deselect_all', {\n        'selected': this._data.core.selected,\n        'node': tmp\n      });\n\n      if (!supress_event) {\n        this.trigger('changed', {\n          'action': 'deselect_all',\n          'selected': this._data.core.selected,\n          'old_selection': tmp\n        });\n      }\n    },\n\n    /**\n     * checks if a node is selected\n     * @name is_selected(obj)\n     * @param  {mixed}  obj\n     * @return {Boolean}\n     */\n    is_selected: function is_selected(obj) {\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      return obj.state.selected;\n    },\n\n    /**\n     * get an array of all selected nodes\n     * @name get_selected([full])\n     * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned\n     * @return {Array}\n     */\n    get_selected: function get_selected(full) {\n      return full ? $.map(this._data.core.selected, function (i) {\n        return this.get_node(i);\n      }.bind(this)) : this._data.core.selected.slice();\n    },\n\n    /**\n     * get an array of all top level selected nodes (ignoring children of selected nodes)\n     * @name get_top_selected([full])\n     * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned\n     * @return {Array}\n     */\n    get_top_selected: function get_top_selected(full) {\n      var tmp = this.get_selected(true),\n          obj = {},\n          i,\n          j,\n          k,\n          l;\n\n      for (i = 0, j = tmp.length; i < j; i++) {\n        obj[tmp[i].id] = tmp[i];\n      }\n\n      for (i = 0, j = tmp.length; i < j; i++) {\n        for (k = 0, l = tmp[i].children_d.length; k < l; k++) {\n          if (obj[tmp[i].children_d[k]]) {\n            delete obj[tmp[i].children_d[k]];\n          }\n        }\n      }\n\n      tmp = [];\n\n      for (i in obj) {\n        if (obj.hasOwnProperty(i)) {\n          tmp.push(i);\n        }\n      }\n\n      return full ? $.map(tmp, function (i) {\n        return this.get_node(i);\n      }.bind(this)) : tmp;\n    },\n\n    /**\n     * get an array of all bottom level selected nodes (ignoring selected parents)\n     * @name get_bottom_selected([full])\n     * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned\n     * @return {Array}\n     */\n    get_bottom_selected: function get_bottom_selected(full) {\n      var tmp = this.get_selected(true),\n          obj = [],\n          i,\n          j;\n\n      for (i = 0, j = tmp.length; i < j; i++) {\n        if (!tmp[i].children.length) {\n          obj.push(tmp[i].id);\n        }\n      }\n\n      return full ? $.map(obj, function (i) {\n        return this.get_node(i);\n      }.bind(this)) : obj;\n    },\n\n    /**\n     * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally.\n     * @name get_state()\n     * @private\n     * @return {Object}\n     */\n    get_state: function get_state() {\n      var state = {\n        'core': {\n          'open': [],\n          'loaded': [],\n          'scroll': {\n            'left': this.element.scrollLeft(),\n            'top': this.element.scrollTop()\n          },\n\n          /*!\n          'themes' : {\n          \t'name' : this.get_theme(),\n          \t'icons' : this._data.core.themes.icons,\n          \t'dots' : this._data.core.themes.dots\n          },\n          */\n          'selected': []\n        }\n      },\n          i;\n\n      for (i in this._model.data) {\n        if (this._model.data.hasOwnProperty(i)) {\n          if (i !== $.jstree.root) {\n            if (this._model.data[i].state.loaded && this.settings.core.loaded_state) {\n              state.core.loaded.push(i);\n            }\n\n            if (this._model.data[i].state.opened) {\n              state.core.open.push(i);\n            }\n\n            if (this._model.data[i].state.selected) {\n              state.core.selected.push(i);\n            }\n          }\n        }\n      }\n\n      return state;\n    },\n\n    /**\n     * sets the state of the tree. Used internally.\n     * @name set_state(state [, callback])\n     * @private\n     * @param {Object} state the state to restore. Keep in mind this object is passed by reference and jstree will modify it.\n     * @param {Function} callback an optional function to execute once the state is restored.\n     * @trigger set_state.jstree\n     */\n    set_state: function set_state(state, callback) {\n      if (state) {\n        if (state.core && state.core.selected && state.core.initial_selection === undefined) {\n          state.core.initial_selection = this._data.core.selected.concat([]).sort().join(',');\n        }\n\n        if (state.core) {\n          var res, n, t, _this, i;\n\n          if (state.core.loaded) {\n            if (!this.settings.core.loaded_state || !$.vakata.is_array(state.core.loaded) || !state.core.loaded.length) {\n              delete state.core.loaded;\n              this.set_state(state, callback);\n            } else {\n              this._load_nodes(state.core.loaded, function (nodes) {\n                delete state.core.loaded;\n                this.set_state(state, callback);\n              });\n            }\n\n            return false;\n          }\n\n          if (state.core.open) {\n            if (!$.vakata.is_array(state.core.open) || !state.core.open.length) {\n              delete state.core.open;\n              this.set_state(state, callback);\n            } else {\n              this._load_nodes(state.core.open, function (nodes) {\n                this.open_node(nodes, false, 0);\n                delete state.core.open;\n                this.set_state(state, callback);\n              });\n            }\n\n            return false;\n          }\n\n          if (state.core.scroll) {\n            if (state.core.scroll && state.core.scroll.left !== undefined) {\n              this.element.scrollLeft(state.core.scroll.left);\n            }\n\n            if (state.core.scroll && state.core.scroll.top !== undefined) {\n              this.element.scrollTop(state.core.scroll.top);\n            }\n\n            delete state.core.scroll;\n            this.set_state(state, callback);\n            return false;\n          }\n\n          if (state.core.selected) {\n            _this = this;\n\n            if (state.core.initial_selection === undefined || state.core.initial_selection === this._data.core.selected.concat([]).sort().join(',')) {\n              this.deselect_all();\n              $.each(state.core.selected, function (i, v) {\n                _this.select_node(v, false, true);\n              });\n            }\n\n            delete state.core.initial_selection;\n            delete state.core.selected;\n            this.set_state(state, callback);\n            return false;\n          }\n\n          for (i in state) {\n            if (state.hasOwnProperty(i) && i !== \"core\" && $.inArray(i, this.settings.plugins) === -1) {\n              delete state[i];\n            }\n          }\n\n          if ($.isEmptyObject(state.core)) {\n            delete state.core;\n            this.set_state(state, callback);\n            return false;\n          }\n        }\n\n        if ($.isEmptyObject(state)) {\n          state = null;\n\n          if (callback) {\n            callback.call(this);\n          }\n          /**\n           * triggered when a `set_state` call completes\n           * @event\n           * @name set_state.jstree\n           */\n\n\n          this.trigger('set_state');\n          return false;\n        }\n\n        return true;\n      }\n\n      return false;\n    },\n\n    /**\n     * refreshes the tree - all nodes are reloaded with calls to `load_node`.\n     * @name refresh()\n     * @param {Boolean} skip_loading an option to skip showing the loading indicator\n     * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state\n     * @trigger refresh.jstree\n     */\n    refresh: function refresh(skip_loading, forget_state) {\n      this._data.core.state = forget_state === true ? {} : this.get_state();\n\n      if (forget_state && $.vakata.is_function(forget_state)) {\n        this._data.core.state = forget_state.call(this, this._data.core.state);\n      }\n\n      this._cnt = 0;\n      this._model.data = {};\n      this._model.data[$.jstree.root] = {\n        id: $.jstree.root,\n        parent: null,\n        parents: [],\n        children: [],\n        children_d: [],\n        state: {\n          loaded: false\n        }\n      };\n      this._data.core.selected = [];\n      this._data.core.last_clicked = null;\n      this._data.core.focused = null;\n      var c = this.get_container_ul()[0].className;\n\n      if (!skip_loading) {\n        this.element.html(\"<\" + \"ul class='\" + c + \"' role='group'><\" + \"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none' id='j\" + this._id + \"_loading'><i class='jstree-icon jstree-ocl'></i><\" + \"a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>\" + this.get_string(\"Loading ...\") + \"</a></li></ul>\");\n        this.element.attr('aria-activedescendant', 'j' + this._id + '_loading');\n      }\n\n      this.load_node($.jstree.root, function (o, s) {\n        if (s) {\n          this.get_container_ul()[0].className = c;\n\n          if (this._firstChild(this.get_container_ul()[0])) {\n            this.element.attr('aria-activedescendant', this._firstChild(this.get_container_ul()[0]).id);\n          }\n\n          this.set_state($.extend(true, {}, this._data.core.state), function () {\n            /**\n             * triggered when a `refresh` call completes\n             * @event\n             * @name refresh.jstree\n             */\n            this.trigger('refresh');\n          });\n        }\n\n        this._data.core.state = null;\n      });\n    },\n\n    /**\n     * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`.\n     * @name refresh_node(obj)\n     * @param  {mixed} obj the node\n     * @trigger refresh_node.jstree\n     */\n    refresh_node: function refresh_node(obj) {\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      var opened = [],\n          to_load = [],\n          s = this._data.core.selected.concat([]);\n\n      to_load.push(obj.id);\n\n      if (obj.state.opened === true) {\n        opened.push(obj.id);\n      }\n\n      this.get_node(obj, true).find('.jstree-open').each(function () {\n        to_load.push(this.id);\n        opened.push(this.id);\n      });\n\n      this._load_nodes(to_load, function (nodes) {\n        this.open_node(opened, false, 0);\n        this.select_node(s);\n        /**\n         * triggered when a node is refreshed\n         * @event\n         * @name refresh_node.jstree\n         * @param {Object} node - the refreshed node\n         * @param {Array} nodes - an array of the IDs of the nodes that were reloaded\n         */\n\n        this.trigger('refresh_node', {\n          'node': obj,\n          'nodes': nodes\n        });\n      }.bind(this), false, true);\n    },\n\n    /**\n     * set (change) the ID of a node\n     * @name set_id(obj, id)\n     * @param  {mixed} obj the node\n     * @param  {String} id the new ID\n     * @return {Boolean}\n     * @trigger set_id.jstree\n     */\n    set_id: function set_id(obj, id) {\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      var i,\n          j,\n          m = this._model.data,\n          old = obj.id;\n      id = id.toString(); // update parents (replace current ID with new one in children and children_d)\n\n      m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id;\n\n      for (i = 0, j = obj.parents.length; i < j; i++) {\n        m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id;\n      } // update children (replace current ID with new one in parent and parents)\n\n\n      for (i = 0, j = obj.children.length; i < j; i++) {\n        m[obj.children[i]].parent = id;\n      }\n\n      for (i = 0, j = obj.children_d.length; i < j; i++) {\n        m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id;\n      }\n\n      i = $.inArray(obj.id, this._data.core.selected);\n\n      if (i !== -1) {\n        this._data.core.selected[i] = id;\n      } // update model and obj itself (obj.id, this._model.data[KEY])\n\n\n      i = this.get_node(obj.id, true);\n\n      if (i) {\n        i.attr('id', id); //.children('.jstree-anchor').attr('id', id + '_anchor').end().attr('aria-labelledby', id + '_anchor');\n\n        if (this.element.attr('aria-activedescendant') === obj.id) {\n          this.element.attr('aria-activedescendant', id);\n        }\n      }\n\n      delete m[obj.id];\n      obj.id = id;\n      obj.li_attr.id = id;\n      m[id] = obj;\n      /**\n       * triggered when a node id value is changed\n       * @event\n       * @name set_id.jstree\n       * @param {Object} node\n       * @param {String} old the old id\n       */\n\n      this.trigger('set_id', {\n        \"node\": obj,\n        \"new\": obj.id,\n        \"old\": old\n      });\n      return true;\n    },\n\n    /**\n     * get the text value of a node\n     * @name get_text(obj)\n     * @param  {mixed} obj the node\n     * @return {String}\n     */\n    get_text: function get_text(obj) {\n      obj = this.get_node(obj);\n      return !obj || obj.id === $.jstree.root ? false : obj.text;\n    },\n\n    /**\n     * set the text value of a node. Used internally, please use `rename_node(obj, val)`.\n     * @private\n     * @name set_text(obj, val)\n     * @param  {mixed} obj the node, you can pass an array to set the text on multiple nodes\n     * @param  {String} val the new text value\n     * @return {Boolean}\n     * @trigger set_text.jstree\n     */\n    set_text: function set_text(obj, val) {\n      var t1, t2;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.set_text(obj[t1], val);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      obj.text = val;\n\n      if (this.get_node(obj, true).length) {\n        this.redraw_node(obj.id);\n      }\n      /**\n       * triggered when a node text value is changed\n       * @event\n       * @name set_text.jstree\n       * @param {Object} obj\n       * @param {String} text the new value\n       */\n\n\n      this.trigger('set_text', {\n        \"obj\": obj,\n        \"text\": val\n      });\n      return true;\n    },\n\n    /**\n     * gets a JSON representation of a node (or the whole tree)\n     * @name get_json([obj, options])\n     * @param  {mixed} obj\n     * @param  {Object} options\n     * @param  {Boolean} options.no_state do not return state information\n     * @param  {Boolean} options.no_id do not return ID\n     * @param  {Boolean} options.no_children do not include children\n     * @param  {Boolean} options.no_data do not include node data\n     * @param  {Boolean} options.no_li_attr do not include LI attributes\n     * @param  {Boolean} options.no_a_attr do not include A attributes\n     * @param  {Boolean} options.flat return flat JSON instead of nested\n     * @return {Object}\n     */\n    get_json: function get_json(obj, options, flat) {\n      obj = this.get_node(obj || $.jstree.root);\n\n      if (!obj) {\n        return false;\n      }\n\n      if (options && options.flat && !flat) {\n        flat = [];\n      }\n\n      var tmp = {\n        'id': obj.id,\n        'text': obj.text,\n        'icon': this.get_icon(obj),\n        'li_attr': $.extend(true, {}, obj.li_attr),\n        'a_attr': $.extend(true, {}, obj.a_attr),\n        'state': {},\n        'data': options && options.no_data ? false : $.extend(true, $.vakata.is_array(obj.data) ? [] : {}, obj.data) //( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ),\n\n      },\n          i,\n          j;\n\n      if (options && options.flat) {\n        tmp.parent = obj.parent;\n      } else {\n        tmp.children = [];\n      }\n\n      if (!options || !options.no_state) {\n        for (i in obj.state) {\n          if (obj.state.hasOwnProperty(i)) {\n            tmp.state[i] = obj.state[i];\n          }\n        }\n      } else {\n        delete tmp.state;\n      }\n\n      if (options && options.no_li_attr) {\n        delete tmp.li_attr;\n      }\n\n      if (options && options.no_a_attr) {\n        delete tmp.a_attr;\n      }\n\n      if (options && options.no_id) {\n        delete tmp.id;\n\n        if (tmp.li_attr && tmp.li_attr.id) {\n          delete tmp.li_attr.id;\n        }\n\n        if (tmp.a_attr && tmp.a_attr.id) {\n          delete tmp.a_attr.id;\n        }\n      }\n\n      if (options && options.flat && obj.id !== $.jstree.root) {\n        flat.push(tmp);\n      }\n\n      if (!options || !options.no_children) {\n        for (i = 0, j = obj.children.length; i < j; i++) {\n          if (options && options.flat) {\n            this.get_json(obj.children[i], options, flat);\n          } else {\n            tmp.children.push(this.get_json(obj.children[i], options));\n          }\n        }\n      }\n\n      return options && options.flat ? flat : obj.id === $.jstree.root ? tmp.children : tmp;\n    },\n\n    /**\n     * create a new node (do not confuse with load_node)\n     * @name create_node([par, node, pos, callback, is_loaded])\n     * @param  {mixed}   par       the parent node (to create a root node use either \"#\" (string) or `null`)\n     * @param  {mixed}   node      the data for the new node (a valid JSON object, or a simple string with the name)\n     * @param  {mixed}   pos       the index at which to insert the node, \"first\" and \"last\" are also supported, default is \"last\"\n     * @param  {Function} callback a function to be called once the node is created\n     * @param  {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded\n     * @return {String}            the ID of the newly create node\n     * @trigger model.jstree, create_node.jstree\n     */\n    create_node: function create_node(par, node, pos, callback, is_loaded) {\n      if (par === null) {\n        par = $.jstree.root;\n      }\n\n      par = this.get_node(par);\n\n      if (!par) {\n        return false;\n      }\n\n      pos = pos === undefined ? \"last\" : pos;\n\n      if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {\n        return this.load_node(par, function () {\n          this.create_node(par, node, pos, callback, true);\n        });\n      }\n\n      if (!node) {\n        node = {\n          \"text\": this.get_string('New node')\n        };\n      }\n\n      if (typeof node === \"string\") {\n        node = {\n          \"text\": node\n        };\n      } else {\n        node = $.extend(true, {}, node);\n      }\n\n      if (node.text === undefined) {\n        node.text = this.get_string('New node');\n      }\n\n      var tmp, dpc, i, j;\n\n      if (par.id === $.jstree.root) {\n        if (pos === \"before\") {\n          pos = \"first\";\n        }\n\n        if (pos === \"after\") {\n          pos = \"last\";\n        }\n      }\n\n      switch (pos) {\n        case \"before\":\n          tmp = this.get_node(par.parent);\n          pos = $.inArray(par.id, tmp.children);\n          par = tmp;\n          break;\n\n        case \"after\":\n          tmp = this.get_node(par.parent);\n          pos = $.inArray(par.id, tmp.children) + 1;\n          par = tmp;\n          break;\n\n        case \"inside\":\n        case \"first\":\n          pos = 0;\n          break;\n\n        case \"last\":\n          pos = par.children.length;\n          break;\n\n        default:\n          if (!pos) {\n            pos = 0;\n          }\n\n          break;\n      }\n\n      if (pos > par.children.length) {\n        pos = par.children.length;\n      }\n\n      if (!node.id) {\n        node.id = true;\n      }\n\n      if (!this.check(\"create_node\", node, par, pos)) {\n        this.settings.core.error.call(this, this._data.core.last_error);\n        return false;\n      }\n\n      if (node.id === true) {\n        delete node.id;\n      }\n\n      node = this._parse_model_from_json(node, par.id, par.parents.concat());\n\n      if (!node) {\n        return false;\n      }\n\n      tmp = this.get_node(node);\n      dpc = [];\n      dpc.push(node);\n      dpc = dpc.concat(tmp.children_d);\n      this.trigger('model', {\n        \"nodes\": dpc,\n        \"parent\": par.id\n      });\n      par.children_d = par.children_d.concat(dpc);\n\n      for (i = 0, j = par.parents.length; i < j; i++) {\n        this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc);\n      }\n\n      node = tmp;\n      tmp = [];\n\n      for (i = 0, j = par.children.length; i < j; i++) {\n        tmp[i >= pos ? i + 1 : i] = par.children[i];\n      }\n\n      tmp[pos] = node.id;\n      par.children = tmp;\n      this.redraw_node(par, true);\n      /**\n       * triggered when a node is created\n       * @event\n       * @name create_node.jstree\n       * @param {Object} node\n       * @param {String} parent the parent's ID\n       * @param {Number} position the position of the new node among the parent's children\n       */\n\n      this.trigger('create_node', {\n        \"node\": this.get_node(node),\n        \"parent\": par.id,\n        \"position\": pos\n      });\n\n      if (callback) {\n        callback.call(this, this.get_node(node));\n      }\n\n      return node.id;\n    },\n\n    /**\n     * set the text value of a node\n     * @name rename_node(obj, val)\n     * @param  {mixed} obj the node, you can pass an array to rename multiple nodes to the same name\n     * @param  {String} val the new text value\n     * @return {Boolean}\n     * @trigger rename_node.jstree\n     */\n    rename_node: function rename_node(obj, val) {\n      var t1, t2, old;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.rename_node(obj[t1], val);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      old = obj.text;\n\n      if (!this.check(\"rename_node\", obj, this.get_parent(obj), val)) {\n        this.settings.core.error.call(this, this._data.core.last_error);\n        return false;\n      }\n\n      this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments))\n\n      /**\n       * triggered when a node is renamed\n       * @event\n       * @name rename_node.jstree\n       * @param {Object} node\n       * @param {String} text the new value\n       * @param {String} old the old value\n       */\n\n      this.trigger('rename_node', {\n        \"node\": obj,\n        \"text\": val,\n        \"old\": old\n      });\n      return true;\n    },\n\n    /**\n     * remove a node\n     * @name delete_node(obj)\n     * @param  {mixed} obj the node, you can pass an array to delete multiple nodes\n     * @return {Boolean}\n     * @trigger delete_node.jstree, changed.jstree\n     */\n    delete_node: function delete_node(obj) {\n      var t1, t2, par, pos, tmp, i, j, k, l, c, top, lft;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.delete_node(obj[t1]);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      par = this.get_node(obj.parent);\n      pos = $.inArray(obj.id, par.children);\n      c = false;\n\n      if (!this.check(\"delete_node\", obj, par, pos)) {\n        this.settings.core.error.call(this, this._data.core.last_error);\n        return false;\n      }\n\n      if (pos !== -1) {\n        par.children = $.vakata.array_remove(par.children, pos);\n      }\n\n      tmp = obj.children_d.concat([]);\n      tmp.push(obj.id);\n\n      for (i = 0, j = obj.parents.length; i < j; i++) {\n        this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) {\n          return $.inArray(v, tmp) === -1;\n        });\n      }\n\n      for (k = 0, l = tmp.length; k < l; k++) {\n        if (this._model.data[tmp[k]].state.selected) {\n          c = true;\n          break;\n        }\n      }\n\n      if (c) {\n        this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) {\n          return $.inArray(v, tmp) === -1;\n        });\n      }\n      /**\n       * triggered when a node is deleted\n       * @event\n       * @name delete_node.jstree\n       * @param {Object} node\n       * @param {String} parent the parent's ID\n       */\n\n\n      this.trigger('delete_node', {\n        \"node\": obj,\n        \"parent\": par.id\n      });\n\n      if (c) {\n        this.trigger('changed', {\n          'action': 'delete_node',\n          'node': obj,\n          'selected': this._data.core.selected,\n          'parent': par.id\n        });\n      }\n\n      for (k = 0, l = tmp.length; k < l; k++) {\n        delete this._model.data[tmp[k]];\n      }\n\n      if ($.inArray(this._data.core.focused, tmp) !== -1) {\n        this._data.core.focused = null;\n        top = this.element[0].scrollTop;\n        lft = this.element[0].scrollLeft;\n\n        if (par.id === $.jstree.root) {\n          if (this._model.data[$.jstree.root].children[0]) {\n            this.get_node(this._model.data[$.jstree.root].children[0], true).children('.jstree-anchor').triger('focus');\n          }\n        } else {\n          this.get_node(par, true).children('.jstree-anchor').trigger('focus');\n        }\n\n        this.element[0].scrollTop = top;\n        this.element[0].scrollLeft = lft;\n      }\n\n      this.redraw_node(par, true);\n      return true;\n    },\n\n    /**\n     * check if an operation is premitted on the tree. Used internally.\n     * @private\n     * @name check(chk, obj, par, pos)\n     * @param  {String} chk the operation to check, can be \"create_node\", \"rename_node\", \"delete_node\", \"copy_node\" or \"move_node\"\n     * @param  {mixed} obj the node\n     * @param  {mixed} par the parent\n     * @param  {mixed} pos the position to insert at, or if \"rename_node\" - the new name\n     * @param  {mixed} more some various additional information, for example if a \"move_node\" operations is triggered by DND this will be the hovered node\n     * @return {Boolean}\n     */\n    check: function check(chk, obj, par, pos, more) {\n      obj = obj && obj.id ? obj : this.get_node(obj);\n      par = par && par.id ? par : this.get_node(par);\n      var tmp = chk.match(/^move_node|copy_node|create_node$/i) ? par : obj,\n          chc = this.settings.core.check_callback;\n\n      if (chk === \"move_node\" || chk === \"copy_node\") {\n        if ((!more || !more.is_multi) && chk === \"move_node\" && $.inArray(obj.id, par.children) === pos) {\n          this._data.core.last_error = {\n            'error': 'check',\n            'plugin': 'core',\n            'id': 'core_08',\n            'reason': 'Moving node to its current position',\n            'data': JSON.stringify({\n              'chk': chk,\n              'pos': pos,\n              'obj': obj && obj.id ? obj.id : false,\n              'par': par && par.id ? par.id : false\n            })\n          };\n          return false;\n        }\n\n        if ((!more || !more.is_multi) && (obj.id === par.id || chk === \"move_node\" && $.inArray(obj.id, par.children) === pos || $.inArray(par.id, obj.children_d) !== -1)) {\n          this._data.core.last_error = {\n            'error': 'check',\n            'plugin': 'core',\n            'id': 'core_01',\n            'reason': 'Moving parent inside child',\n            'data': JSON.stringify({\n              'chk': chk,\n              'pos': pos,\n              'obj': obj && obj.id ? obj.id : false,\n              'par': par && par.id ? par.id : false\n            })\n          };\n          return false;\n        }\n      }\n\n      if (tmp && tmp.data) {\n        tmp = tmp.data;\n      }\n\n      if (tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) {\n        if (tmp.functions[chk] === false) {\n          this._data.core.last_error = {\n            'error': 'check',\n            'plugin': 'core',\n            'id': 'core_02',\n            'reason': 'Node data prevents function: ' + chk,\n            'data': JSON.stringify({\n              'chk': chk,\n              'pos': pos,\n              'obj': obj && obj.id ? obj.id : false,\n              'par': par && par.id ? par.id : false\n            })\n          };\n        }\n\n        return tmp.functions[chk];\n      }\n\n      if (chc === false || $.vakata.is_function(chc) && chc.call(this, chk, obj, par, pos, more) === false || chc && chc[chk] === false) {\n        this._data.core.last_error = {\n          'error': 'check',\n          'plugin': 'core',\n          'id': 'core_03',\n          'reason': 'User config for core.check_callback prevents function: ' + chk,\n          'data': JSON.stringify({\n            'chk': chk,\n            'pos': pos,\n            'obj': obj && obj.id ? obj.id : false,\n            'par': par && par.id ? par.id : false\n          })\n        };\n        return false;\n      }\n\n      return true;\n    },\n\n    /**\n     * get the last error\n     * @name last_error()\n     * @return {Object}\n     */\n    last_error: function last_error() {\n      return this._data.core.last_error;\n    },\n\n    /**\n     * move a node to a new parent\n     * @name move_node(obj, par [, pos, callback, is_loaded])\n     * @param  {mixed} obj the node to move, pass an array to move multiple nodes\n     * @param  {mixed} par the new parent\n     * @param  {mixed} pos the position to insert at (besides integer values, \"first\" and \"last\" are supported, as well as \"before\" and \"after\"), defaults to integer `0`\n     * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position\n     * @param  {Boolean} is_loaded internal parameter indicating if the parent node has been loaded\n     * @param  {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn\n     * @param  {Boolean} instance internal parameter indicating if the node comes from another instance\n     * @trigger move_node.jstree\n     */\n    move_node: function move_node(obj, par, pos, callback, is_loaded, skip_redraw, origin) {\n      var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p;\n      par = this.get_node(par);\n      pos = pos === undefined ? 0 : pos;\n\n      if (!par) {\n        return false;\n      }\n\n      if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {\n        return this.load_node(par, function () {\n          this.move_node(obj, par, pos, callback, true, false, origin);\n        });\n      }\n\n      if ($.vakata.is_array(obj)) {\n        if (obj.length === 1) {\n          obj = obj[0];\n        } else {\n          //obj = obj.slice();\n          for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n            if (tmp = this.move_node(obj[t1], par, pos, callback, is_loaded, false, origin)) {\n              par = tmp;\n              pos = \"after\";\n            }\n          }\n\n          this.redraw();\n          return true;\n        }\n      }\n\n      obj = obj && obj.id ? obj : this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      old_par = (obj.parent || $.jstree.root).toString();\n      new_par = !pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root ? par : this.get_node(par.parent);\n      old_ins = origin ? origin : this._model.data[obj.id] ? this : $.jstree.reference(obj.id);\n      is_multi = !old_ins || !old_ins._id || this._id !== old_ins._id;\n      old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1;\n\n      if (old_ins && old_ins._id) {\n        obj = old_ins._model.data[obj.id];\n      }\n\n      if (is_multi) {\n        if (tmp = this.copy_node(obj, par, pos, callback, is_loaded, false, origin)) {\n          if (old_ins) {\n            old_ins.delete_node(obj);\n          }\n\n          return tmp;\n        }\n\n        return false;\n      } //var m = this._model.data;\n\n\n      if (par.id === $.jstree.root) {\n        if (pos === \"before\") {\n          pos = \"first\";\n        }\n\n        if (pos === \"after\") {\n          pos = \"last\";\n        }\n      }\n\n      switch (pos) {\n        case \"before\":\n          pos = $.inArray(par.id, new_par.children);\n          break;\n\n        case \"after\":\n          pos = $.inArray(par.id, new_par.children) + 1;\n          break;\n\n        case \"inside\":\n        case \"first\":\n          pos = 0;\n          break;\n\n        case \"last\":\n          pos = new_par.children.length;\n          break;\n\n        default:\n          if (!pos) {\n            pos = 0;\n          }\n\n          break;\n      }\n\n      if (pos > new_par.children.length) {\n        pos = new_par.children.length;\n      }\n\n      if (!this.check(\"move_node\", obj, new_par, pos, {\n        'core': true,\n        'origin': origin,\n        'is_multi': old_ins && old_ins._id && old_ins._id !== this._id,\n        'is_foreign': !old_ins || !old_ins._id\n      })) {\n        this.settings.core.error.call(this, this._data.core.last_error);\n        return false;\n      }\n\n      if (obj.parent === new_par.id) {\n        dpc = new_par.children.concat();\n        tmp = $.inArray(obj.id, dpc);\n\n        if (tmp !== -1) {\n          dpc = $.vakata.array_remove(dpc, tmp);\n\n          if (pos > tmp) {\n            pos--;\n          }\n        }\n\n        tmp = [];\n\n        for (i = 0, j = dpc.length; i < j; i++) {\n          tmp[i >= pos ? i + 1 : i] = dpc[i];\n        }\n\n        tmp[pos] = obj.id;\n        new_par.children = tmp;\n\n        this._node_changed(new_par.id);\n\n        this.redraw(new_par.id === $.jstree.root);\n      } else {\n        // clean old parent and up\n        tmp = obj.children_d.concat();\n        tmp.push(obj.id);\n\n        for (i = 0, j = obj.parents.length; i < j; i++) {\n          dpc = [];\n          p = old_ins._model.data[obj.parents[i]].children_d;\n\n          for (k = 0, l = p.length; k < l; k++) {\n            if ($.inArray(p[k], tmp) === -1) {\n              dpc.push(p[k]);\n            }\n          }\n\n          old_ins._model.data[obj.parents[i]].children_d = dpc;\n        }\n\n        old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id); // insert into new parent and up\n\n        for (i = 0, j = new_par.parents.length; i < j; i++) {\n          this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp);\n        }\n\n        dpc = [];\n\n        for (i = 0, j = new_par.children.length; i < j; i++) {\n          dpc[i >= pos ? i + 1 : i] = new_par.children[i];\n        }\n\n        dpc[pos] = obj.id;\n        new_par.children = dpc;\n        new_par.children_d.push(obj.id);\n        new_par.children_d = new_par.children_d.concat(obj.children_d); // update object\n\n        obj.parent = new_par.id;\n        tmp = new_par.parents.concat();\n        tmp.unshift(new_par.id);\n        p = obj.parents.length;\n        obj.parents = tmp; // update object children\n\n        tmp = tmp.concat();\n\n        for (i = 0, j = obj.children_d.length; i < j; i++) {\n          this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0, p * -1);\n          Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp);\n        }\n\n        if (old_par === $.jstree.root || new_par.id === $.jstree.root) {\n          this._model.force_full_redraw = true;\n        }\n\n        if (!this._model.force_full_redraw) {\n          this._node_changed(old_par);\n\n          this._node_changed(new_par.id);\n        }\n\n        if (!skip_redraw) {\n          this.redraw();\n        }\n      }\n\n      if (callback) {\n        callback.call(this, obj, new_par, pos);\n      }\n      /**\n       * triggered when a node is moved\n       * @event\n       * @name move_node.jstree\n       * @param {Object} node\n       * @param {String} parent the parent's ID\n       * @param {Number} position the position of the node among the parent's children\n       * @param {String} old_parent the old parent of the node\n       * @param {Number} old_position the old position of the node\n       * @param {Boolean} is_multi do the node and new parent belong to different instances\n       * @param {jsTree} old_instance the instance the node came from\n       * @param {jsTree} new_instance the instance of the new parent\n       */\n\n\n      this.trigger('move_node', {\n        \"node\": obj,\n        \"parent\": new_par.id,\n        \"position\": pos,\n        \"old_parent\": old_par,\n        \"old_position\": old_pos,\n        'is_multi': old_ins && old_ins._id && old_ins._id !== this._id,\n        'is_foreign': !old_ins || !old_ins._id,\n        'old_instance': old_ins,\n        'new_instance': this\n      });\n      return obj.id;\n    },\n\n    /**\n     * copy a node to a new parent\n     * @name copy_node(obj, par [, pos, callback, is_loaded])\n     * @param  {mixed} obj the node to copy, pass an array to copy multiple nodes\n     * @param  {mixed} par the new parent\n     * @param  {mixed} pos the position to insert at (besides integer values, \"first\" and \"last\" are supported, as well as \"before\" and \"after\"), defaults to integer `0`\n     * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position\n     * @param  {Boolean} is_loaded internal parameter indicating if the parent node has been loaded\n     * @param  {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn\n     * @param  {Boolean} instance internal parameter indicating if the node comes from another instance\n     * @trigger model.jstree copy_node.jstree\n     */\n    copy_node: function copy_node(obj, par, pos, callback, is_loaded, skip_redraw, origin) {\n      var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi;\n      par = this.get_node(par);\n      pos = pos === undefined ? 0 : pos;\n\n      if (!par) {\n        return false;\n      }\n\n      if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {\n        return this.load_node(par, function () {\n          this.copy_node(obj, par, pos, callback, true, false, origin);\n        });\n      }\n\n      if ($.vakata.is_array(obj)) {\n        if (obj.length === 1) {\n          obj = obj[0];\n        } else {\n          //obj = obj.slice();\n          for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n            if (tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true, origin)) {\n              par = tmp;\n              pos = \"after\";\n            }\n          }\n\n          this.redraw();\n          return true;\n        }\n      }\n\n      obj = obj && obj.id ? obj : this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      old_par = (obj.parent || $.jstree.root).toString();\n      new_par = !pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root ? par : this.get_node(par.parent);\n      old_ins = origin ? origin : this._model.data[obj.id] ? this : $.jstree.reference(obj.id);\n      is_multi = !old_ins || !old_ins._id || this._id !== old_ins._id;\n\n      if (old_ins && old_ins._id) {\n        obj = old_ins._model.data[obj.id];\n      }\n\n      if (par.id === $.jstree.root) {\n        if (pos === \"before\") {\n          pos = \"first\";\n        }\n\n        if (pos === \"after\") {\n          pos = \"last\";\n        }\n      }\n\n      switch (pos) {\n        case \"before\":\n          pos = $.inArray(par.id, new_par.children);\n          break;\n\n        case \"after\":\n          pos = $.inArray(par.id, new_par.children) + 1;\n          break;\n\n        case \"inside\":\n        case \"first\":\n          pos = 0;\n          break;\n\n        case \"last\":\n          pos = new_par.children.length;\n          break;\n\n        default:\n          if (!pos) {\n            pos = 0;\n          }\n\n          break;\n      }\n\n      if (pos > new_par.children.length) {\n        pos = new_par.children.length;\n      }\n\n      if (!this.check(\"copy_node\", obj, new_par, pos, {\n        'core': true,\n        'origin': origin,\n        'is_multi': old_ins && old_ins._id && old_ins._id !== this._id,\n        'is_foreign': !old_ins || !old_ins._id\n      })) {\n        this.settings.core.error.call(this, this._data.core.last_error);\n        return false;\n      }\n\n      node = old_ins ? old_ins.get_json(obj, {\n        no_id: true,\n        no_data: true,\n        no_state: true\n      }) : obj;\n\n      if (!node) {\n        return false;\n      }\n\n      if (node.id === true) {\n        delete node.id;\n      }\n\n      node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat());\n\n      if (!node) {\n        return false;\n      }\n\n      tmp = this.get_node(node);\n\n      if (obj && obj.state && obj.state.loaded === false) {\n        tmp.state.loaded = false;\n      }\n\n      dpc = [];\n      dpc.push(node);\n      dpc = dpc.concat(tmp.children_d);\n      this.trigger('model', {\n        \"nodes\": dpc,\n        \"parent\": new_par.id\n      }); // insert into new parent and up\n\n      for (i = 0, j = new_par.parents.length; i < j; i++) {\n        this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc);\n      }\n\n      dpc = [];\n\n      for (i = 0, j = new_par.children.length; i < j; i++) {\n        dpc[i >= pos ? i + 1 : i] = new_par.children[i];\n      }\n\n      dpc[pos] = tmp.id;\n      new_par.children = dpc;\n      new_par.children_d.push(tmp.id);\n      new_par.children_d = new_par.children_d.concat(tmp.children_d);\n\n      if (new_par.id === $.jstree.root) {\n        this._model.force_full_redraw = true;\n      }\n\n      if (!this._model.force_full_redraw) {\n        this._node_changed(new_par.id);\n      }\n\n      if (!skip_redraw) {\n        this.redraw(new_par.id === $.jstree.root);\n      }\n\n      if (callback) {\n        callback.call(this, tmp, new_par, pos);\n      }\n      /**\n       * triggered when a node is copied\n       * @event\n       * @name copy_node.jstree\n       * @param {Object} node the copied node\n       * @param {Object} original the original node\n       * @param {String} parent the parent's ID\n       * @param {Number} position the position of the node among the parent's children\n       * @param {String} old_parent the old parent of the node\n       * @param {Number} old_position the position of the original node\n       * @param {Boolean} is_multi do the node and new parent belong to different instances\n       * @param {jsTree} old_instance the instance the node came from\n       * @param {jsTree} new_instance the instance of the new parent\n       */\n\n\n      this.trigger('copy_node', {\n        \"node\": tmp,\n        \"original\": obj,\n        \"parent\": new_par.id,\n        \"position\": pos,\n        \"old_parent\": old_par,\n        \"old_position\": old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,\n        'is_multi': old_ins && old_ins._id && old_ins._id !== this._id,\n        'is_foreign': !old_ins || !old_ins._id,\n        'old_instance': old_ins,\n        'new_instance': this\n      });\n      return tmp.id;\n    },\n\n    /**\n     * cut a node (a later call to `paste(obj)` would move the node)\n     * @name cut(obj)\n     * @param  {mixed} obj multiple objects can be passed using an array\n     * @trigger cut.jstree\n     */\n    cut: function cut(obj) {\n      if (!obj) {\n        obj = this._data.core.selected.concat();\n      }\n\n      if (!$.vakata.is_array(obj)) {\n        obj = [obj];\n      }\n\n      if (!obj.length) {\n        return false;\n      }\n\n      var tmp = [],\n          o,\n          t1,\n          t2;\n\n      for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n        o = this.get_node(obj[t1]);\n\n        if (o && o.id && o.id !== $.jstree.root) {\n          tmp.push(o);\n        }\n      }\n\n      if (!tmp.length) {\n        return false;\n      }\n\n      ccp_node = tmp;\n      ccp_inst = this;\n      ccp_mode = 'move_node';\n      /**\n       * triggered when nodes are added to the buffer for moving\n       * @event\n       * @name cut.jstree\n       * @param {Array} node\n       */\n\n      this.trigger('cut', {\n        \"node\": obj\n      });\n    },\n\n    /**\n     * copy a node (a later call to `paste(obj)` would copy the node)\n     * @name copy(obj)\n     * @param  {mixed} obj multiple objects can be passed using an array\n     * @trigger copy.jstree\n     */\n    copy: function copy(obj) {\n      if (!obj) {\n        obj = this._data.core.selected.concat();\n      }\n\n      if (!$.vakata.is_array(obj)) {\n        obj = [obj];\n      }\n\n      if (!obj.length) {\n        return false;\n      }\n\n      var tmp = [],\n          o,\n          t1,\n          t2;\n\n      for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n        o = this.get_node(obj[t1]);\n\n        if (o && o.id && o.id !== $.jstree.root) {\n          tmp.push(o);\n        }\n      }\n\n      if (!tmp.length) {\n        return false;\n      }\n\n      ccp_node = tmp;\n      ccp_inst = this;\n      ccp_mode = 'copy_node';\n      /**\n       * triggered when nodes are added to the buffer for copying\n       * @event\n       * @name copy.jstree\n       * @param {Array} node\n       */\n\n      this.trigger('copy', {\n        \"node\": obj\n      });\n    },\n\n    /**\n     * get the current buffer (any nodes that are waiting for a paste operation)\n     * @name get_buffer()\n     * @return {Object} an object consisting of `mode` (\"copy_node\" or \"move_node\"), `node` (an array of objects) and `inst` (the instance)\n     */\n    get_buffer: function get_buffer() {\n      return {\n        'mode': ccp_mode,\n        'node': ccp_node,\n        'inst': ccp_inst\n      };\n    },\n\n    /**\n     * check if there is something in the buffer to paste\n     * @name can_paste()\n     * @return {Boolean}\n     */\n    can_paste: function can_paste() {\n      return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node];\n    },\n\n    /**\n     * copy or move the previously cut or copied nodes to a new parent\n     * @name paste(obj [, pos])\n     * @param  {mixed} obj the new parent\n     * @param  {mixed} pos the position to insert at (besides integer, \"first\" and \"last\" are supported), defaults to integer `0`\n     * @trigger paste.jstree\n     */\n    paste: function paste(obj, pos) {\n      obj = this.get_node(obj);\n\n      if (!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) {\n        return false;\n      }\n\n      if (this[ccp_mode](ccp_node, obj, pos, false, false, false, ccp_inst)) {\n        /**\n         * triggered when paste is invoked\n         * @event\n         * @name paste.jstree\n         * @param {String} parent the ID of the receiving node\n         * @param {Array} node the nodes in the buffer\n         * @param {String} mode the performed operation - \"copy_node\" or \"move_node\"\n         */\n        this.trigger('paste', {\n          \"parent\": obj.id,\n          \"node\": ccp_node,\n          \"mode\": ccp_mode\n        });\n      }\n\n      ccp_node = false;\n      ccp_mode = false;\n      ccp_inst = false;\n    },\n\n    /**\n     * clear the buffer of previously copied or cut nodes\n     * @name clear_buffer()\n     * @trigger clear_buffer.jstree\n     */\n    clear_buffer: function clear_buffer() {\n      ccp_node = false;\n      ccp_mode = false;\n      ccp_inst = false;\n      /**\n       * triggered when the copy / cut buffer is cleared\n       * @event\n       * @name clear_buffer.jstree\n       */\n\n      this.trigger('clear_buffer');\n    },\n\n    /**\n     * put a node in edit mode (input field to rename the node)\n     * @name edit(obj [, default_text, callback])\n     * @param  {mixed} obj\n     * @param  {String} default_text the text to populate the input with (if omitted or set to a non-string value the node's text value is used)\n     * @param  {Function} callback a function to be called once the text box is blurred, it is called in the instance's scope and receives the node, a status parameter (true if the rename is successful, false otherwise), a boolean indicating if the user cancelled the edit and the original unescaped value provided by the user. You can also access the node's title using .text\n     */\n    edit: function edit(obj, default_text, callback) {\n      var rtl,\n          w,\n          a,\n          s,\n          t,\n          h1,\n          h2,\n          fn,\n          tmp,\n          cancel = false;\n      obj = this.get_node(obj);\n\n      if (!obj) {\n        return false;\n      }\n\n      if (!this.check(\"edit\", obj, this.get_parent(obj))) {\n        this.settings.core.error.call(this, this._data.core.last_error);\n        return false;\n      }\n\n      tmp = obj;\n      default_text = typeof default_text === 'string' ? default_text : obj.text;\n      this.set_text(obj, \"\");\n      obj = this._open_to(obj);\n      tmp.text = default_text;\n      rtl = this._data.core.rtl;\n      w = this.element.width();\n      this._data.core.focused = tmp.id;\n      a = obj.children('.jstree-anchor').trigger('focus');\n      s = $('<span></span>');\n      /*!\n      oi = obj.children(\"i:visible\"),\n      ai = a.children(\"i:visible\"),\n      w1 = oi.width() * oi.length,\n      w2 = ai.width() * ai.length,\n      */\n\n      t = default_text;\n      h1 = $(\"<\" + \"div></div>\", {\n        css: {\n          \"position\": \"absolute\",\n          \"top\": \"-200px\",\n          \"left\": rtl ? \"0px\" : \"-1000px\",\n          \"visibility\": \"hidden\"\n        }\n      }).appendTo(document.body);\n      h2 = $(\"<\" + \"input />\", {\n        \"value\": t,\n        \"class\": \"jstree-rename-input\",\n        // \"size\" : t.length,\n        \"css\": {\n          \"padding\": \"0\",\n          \"border\": \"1px solid silver\",\n          \"box-sizing\": \"border-box\",\n          \"display\": \"inline-block\",\n          \"height\": this._data.core.li_height + \"px\",\n          \"lineHeight\": this._data.core.li_height + \"px\",\n          \"width\": \"150px\" // will be set a bit further down\n\n        },\n        \"blur\": function (e) {\n          e.stopImmediatePropagation();\n          e.preventDefault();\n          var i = s.children(\".jstree-rename-input\"),\n              v = i.val(),\n              f = this.settings.core.force_text,\n              nv;\n\n          if (v === \"\") {\n            v = t;\n          }\n\n          h1.remove();\n          s.replaceWith(a);\n          s.remove();\n          t = f ? t : $('<div></div>').append($.parseHTML(t)).html();\n          obj = this.get_node(obj);\n          this.set_text(obj, t);\n          nv = !!this.rename_node(obj, f ? $('<div></div>').text(v).text() : $('<div></div>').append($.parseHTML(v)).html());\n\n          if (!nv) {\n            this.set_text(obj, t); // move this up? and fix #483\n          }\n\n          this._data.core.focused = tmp.id;\n          setTimeout(function () {\n            var node = this.get_node(tmp.id, true);\n\n            if (node.length) {\n              this._data.core.focused = tmp.id;\n              node.children('.jstree-anchor').trigger('focus');\n            }\n          }.bind(this), 0);\n\n          if (callback) {\n            callback.call(this, tmp, nv, cancel, v);\n          }\n\n          h2 = null;\n        }.bind(this),\n        \"keydown\": function keydown(e) {\n          var key = e.which;\n\n          if (key === 27) {\n            cancel = true;\n            this.value = t;\n          }\n\n          if (key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) {\n            e.stopImmediatePropagation();\n          }\n\n          if (key === 27 || key === 13) {\n            e.preventDefault();\n            this.blur();\n          }\n        },\n        \"click\": function click(e) {\n          e.stopImmediatePropagation();\n        },\n        \"mousedown\": function mousedown(e) {\n          e.stopImmediatePropagation();\n        },\n        \"keyup\": function keyup(e) {\n          h2.width(Math.min(h1.text(\"pW\" + this.value).width(), w));\n        },\n        \"keypress\": function keypress(e) {\n          if (e.which === 13) {\n            return false;\n          }\n        }\n      });\n      fn = {\n        fontFamily: a.css('fontFamily') || '',\n        fontSize: a.css('fontSize') || '',\n        fontWeight: a.css('fontWeight') || '',\n        fontStyle: a.css('fontStyle') || '',\n        fontStretch: a.css('fontStretch') || '',\n        fontVariant: a.css('fontVariant') || '',\n        letterSpacing: a.css('letterSpacing') || '',\n        wordSpacing: a.css('wordSpacing') || ''\n      };\n      s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2);\n      a.replaceWith(s);\n      h1.css(fn);\n      h2.css(fn).width(Math.min(h1.text(\"pW\" + h2[0].value).width(), w))[0].select();\n      $(document).one('mousedown.jstree touchstart.jstree dnd_start.vakata', function (e) {\n        if (h2 && e.target !== h2) {\n          $(h2).trigger('blur');\n        }\n      });\n    },\n\n    /**\n     * changes the theme\n     * @name set_theme(theme_name [, theme_url])\n     * @param {String} theme_name the name of the new theme to apply\n     * @param {mixed} theme_url  the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory.\n     * @trigger set_theme.jstree\n     */\n    set_theme: function set_theme(theme_name, theme_url) {\n      if (!theme_name) {\n        return false;\n      }\n\n      if (theme_url === true) {\n        var dir = this.settings.core.themes.dir;\n\n        if (!dir) {\n          dir = $.jstree.path + '/themes';\n        }\n\n        theme_url = dir + '/' + theme_name + '/style.css';\n      }\n\n      if (theme_url && $.inArray(theme_url, themes_loaded) === -1) {\n        $('head').append('<' + 'link rel=\"stylesheet\" href=\"' + theme_url + '\" type=\"text/css\" />');\n        themes_loaded.push(theme_url);\n      }\n\n      if (this._data.core.themes.name) {\n        this.element.removeClass('jstree-' + this._data.core.themes.name);\n      }\n\n      this._data.core.themes.name = theme_name;\n      this.element.addClass('jstree-' + theme_name);\n      this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass']('jstree-' + theme_name + '-responsive');\n      /**\n       * triggered when a theme is set\n       * @event\n       * @name set_theme.jstree\n       * @param {String} theme the new theme\n       */\n\n      this.trigger('set_theme', {\n        'theme': theme_name\n      });\n    },\n\n    /**\n     * gets the name of the currently applied theme name\n     * @name get_theme()\n     * @return {String}\n     */\n    get_theme: function get_theme() {\n      return this._data.core.themes.name;\n    },\n\n    /**\n     * changes the theme variant (if the theme has variants)\n     * @name set_theme_variant(variant_name)\n     * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed)\n     */\n    set_theme_variant: function set_theme_variant(variant_name) {\n      if (this._data.core.themes.variant) {\n        this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);\n      }\n\n      this._data.core.themes.variant = variant_name;\n\n      if (variant_name) {\n        this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);\n      }\n    },\n\n    /**\n     * gets the name of the currently applied theme variant\n     * @name get_theme()\n     * @return {String}\n     */\n    get_theme_variant: function get_theme_variant() {\n      return this._data.core.themes.variant;\n    },\n\n    /**\n     * shows a striped background on the container (if the theme supports it)\n     * @name show_stripes()\n     */\n    show_stripes: function show_stripes() {\n      this._data.core.themes.stripes = true;\n      this.get_container_ul().addClass(\"jstree-striped\");\n      /**\n       * triggered when stripes are shown\n       * @event\n       * @name show_stripes.jstree\n       */\n\n      this.trigger('show_stripes');\n    },\n\n    /**\n     * hides the striped background on the container\n     * @name hide_stripes()\n     */\n    hide_stripes: function hide_stripes() {\n      this._data.core.themes.stripes = false;\n      this.get_container_ul().removeClass(\"jstree-striped\");\n      /**\n       * triggered when stripes are hidden\n       * @event\n       * @name hide_stripes.jstree\n       */\n\n      this.trigger('hide_stripes');\n    },\n\n    /**\n     * toggles the striped background on the container\n     * @name toggle_stripes()\n     */\n    toggle_stripes: function toggle_stripes() {\n      if (this._data.core.themes.stripes) {\n        this.hide_stripes();\n      } else {\n        this.show_stripes();\n      }\n    },\n\n    /**\n     * shows the connecting dots (if the theme supports it)\n     * @name show_dots()\n     */\n    show_dots: function show_dots() {\n      this._data.core.themes.dots = true;\n      this.get_container_ul().removeClass(\"jstree-no-dots\");\n      /**\n       * triggered when dots are shown\n       * @event\n       * @name show_dots.jstree\n       */\n\n      this.trigger('show_dots');\n    },\n\n    /**\n     * hides the connecting dots\n     * @name hide_dots()\n     */\n    hide_dots: function hide_dots() {\n      this._data.core.themes.dots = false;\n      this.get_container_ul().addClass(\"jstree-no-dots\");\n      /**\n       * triggered when dots are hidden\n       * @event\n       * @name hide_dots.jstree\n       */\n\n      this.trigger('hide_dots');\n    },\n\n    /**\n     * toggles the connecting dots\n     * @name toggle_dots()\n     */\n    toggle_dots: function toggle_dots() {\n      if (this._data.core.themes.dots) {\n        this.hide_dots();\n      } else {\n        this.show_dots();\n      }\n    },\n\n    /**\n     * show the node icons\n     * @name show_icons()\n     */\n    show_icons: function show_icons() {\n      this._data.core.themes.icons = true;\n      this.get_container_ul().removeClass(\"jstree-no-icons\");\n      /**\n       * triggered when icons are shown\n       * @event\n       * @name show_icons.jstree\n       */\n\n      this.trigger('show_icons');\n    },\n\n    /**\n     * hide the node icons\n     * @name hide_icons()\n     */\n    hide_icons: function hide_icons() {\n      this._data.core.themes.icons = false;\n      this.get_container_ul().addClass(\"jstree-no-icons\");\n      /**\n       * triggered when icons are hidden\n       * @event\n       * @name hide_icons.jstree\n       */\n\n      this.trigger('hide_icons');\n    },\n\n    /**\n     * toggle the node icons\n     * @name toggle_icons()\n     */\n    toggle_icons: function toggle_icons() {\n      if (this._data.core.themes.icons) {\n        this.hide_icons();\n      } else {\n        this.show_icons();\n      }\n    },\n\n    /**\n     * show the node ellipsis\n     * @name show_icons()\n     */\n    show_ellipsis: function show_ellipsis() {\n      this._data.core.themes.ellipsis = true;\n      this.get_container_ul().addClass(\"jstree-ellipsis\");\n      /**\n       * triggered when ellisis is shown\n       * @event\n       * @name show_ellipsis.jstree\n       */\n\n      this.trigger('show_ellipsis');\n    },\n\n    /**\n     * hide the node ellipsis\n     * @name hide_ellipsis()\n     */\n    hide_ellipsis: function hide_ellipsis() {\n      this._data.core.themes.ellipsis = false;\n      this.get_container_ul().removeClass(\"jstree-ellipsis\");\n      /**\n       * triggered when ellisis is hidden\n       * @event\n       * @name hide_ellipsis.jstree\n       */\n\n      this.trigger('hide_ellipsis');\n    },\n\n    /**\n     * toggle the node ellipsis\n     * @name toggle_icons()\n     */\n    toggle_ellipsis: function toggle_ellipsis() {\n      if (this._data.core.themes.ellipsis) {\n        this.hide_ellipsis();\n      } else {\n        this.show_ellipsis();\n      }\n    },\n\n    /**\n     * set the node icon for a node\n     * @name set_icon(obj, icon)\n     * @param {mixed} obj\n     * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class\n     */\n    set_icon: function set_icon(obj, icon) {\n      var t1, t2, dom, old;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.set_icon(obj[t1], icon);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      old = obj.icon;\n      obj.icon = icon === true || icon === null || icon === undefined || icon === '' ? true : icon;\n      dom = this.get_node(obj, true).children(\".jstree-anchor\").children(\".jstree-themeicon\");\n\n      if (icon === false) {\n        dom.removeClass('jstree-themeicon-custom ' + old).css(\"background\", \"\").removeAttr(\"rel\");\n        this.hide_icon(obj);\n      } else if (icon === true || icon === null || icon === undefined || icon === '') {\n        dom.removeClass('jstree-themeicon-custom ' + old).css(\"background\", \"\").removeAttr(\"rel\");\n\n        if (old === false) {\n          this.show_icon(obj);\n        }\n      } else if (icon.indexOf(\"/\") === -1 && icon.indexOf(\".\") === -1) {\n        dom.removeClass(old).css(\"background\", \"\");\n        dom.addClass(icon + ' jstree-themeicon-custom').attr(\"rel\", icon);\n\n        if (old === false) {\n          this.show_icon(obj);\n        }\n      } else {\n        dom.removeClass(old).css(\"background\", \"\");\n        dom.addClass('jstree-themeicon-custom').css(\"background\", \"url('\" + icon + \"') center center no-repeat\").attr(\"rel\", icon);\n\n        if (old === false) {\n          this.show_icon(obj);\n        }\n      }\n\n      return true;\n    },\n\n    /**\n     * get the node icon for a node\n     * @name get_icon(obj)\n     * @param {mixed} obj\n     * @return {String}\n     */\n    get_icon: function get_icon(obj) {\n      obj = this.get_node(obj);\n      return !obj || obj.id === $.jstree.root ? false : obj.icon;\n    },\n\n    /**\n     * hide the icon on an individual node\n     * @name hide_icon(obj)\n     * @param {mixed} obj\n     */\n    hide_icon: function hide_icon(obj) {\n      var t1, t2;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.hide_icon(obj[t1]);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj === $.jstree.root) {\n        return false;\n      }\n\n      obj.icon = false;\n      this.get_node(obj, true).children(\".jstree-anchor\").children(\".jstree-themeicon\").addClass('jstree-themeicon-hidden');\n      return true;\n    },\n\n    /**\n     * show the icon on an individual node\n     * @name show_icon(obj)\n     * @param {mixed} obj\n     */\n    show_icon: function show_icon(obj) {\n      var t1, t2, dom;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.show_icon(obj[t1]);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj === $.jstree.root) {\n        return false;\n      }\n\n      dom = this.get_node(obj, true);\n      obj.icon = dom.length ? dom.children(\".jstree-anchor\").children(\".jstree-themeicon\").attr('rel') : true;\n\n      if (!obj.icon) {\n        obj.icon = true;\n      }\n\n      dom.children(\".jstree-anchor\").children(\".jstree-themeicon\").removeClass('jstree-themeicon-hidden');\n      return true;\n    }\n  }; // helpers\n\n  $.vakata = {}; // collect attributes\n\n  $.vakata.attributes = function (node, with_values) {\n    node = $(node)[0];\n    var attr = with_values ? {} : [];\n\n    if (node && node.attributes) {\n      $.each(node.attributes, function (i, v) {\n        if ($.inArray(v.name.toLowerCase(), ['style', 'contenteditable', 'hasfocus', 'tabindex']) !== -1) {\n          return;\n        }\n\n        if (v.value !== null && $.vakata.trim(v.value) !== '') {\n          if (with_values) {\n            attr[v.name] = v.value;\n          } else {\n            attr.push(v.name);\n          }\n        }\n      });\n    }\n\n    return attr;\n  };\n\n  $.vakata.array_unique = function (array) {\n    var a = [],\n        i,\n        j,\n        l,\n        o = {};\n\n    for (i = 0, l = array.length; i < l; i++) {\n      if (o[array[i]] === undefined) {\n        a.push(array[i]);\n        o[array[i]] = true;\n      }\n    }\n\n    return a;\n  }; // remove item from array\n\n\n  $.vakata.array_remove = function (array, from) {\n    array.splice(from, 1);\n    return array; //var rest = array.slice((to || from) + 1 || array.length);\n    //array.length = from < 0 ? array.length + from : from;\n    //array.push.apply(array, rest);\n    //return array;\n  }; // remove item from array\n\n\n  $.vakata.array_remove_item = function (array, item) {\n    var tmp = $.inArray(item, array);\n    return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array;\n  };\n\n  $.vakata.array_filter = function (c, a, b, d, e) {\n    if (c.filter) {\n      return c.filter(a, b);\n    }\n\n    d = [];\n\n    for (e in c) {\n      if (~~e + '' === e + '' && e >= 0 && a.call(b, c[e], +e, c)) {\n        d.push(c[e]);\n      }\n    }\n\n    return d;\n  };\n\n  $.vakata.trim = function (text) {\n    return String.prototype.trim ? String.prototype.trim.call(text.toString()) : text.toString().replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n  };\n\n  $.vakata.is_function = function (obj) {\n    return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n  $.vakata.is_array = Array.isArray || function (obj) {\n    return Object.prototype.toString.call(obj) === \"[object Array]\";\n  }; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind#polyfill\n\n\n  if (!Function.prototype.bind) {\n    Function.prototype.bind = function () {\n      var thatFunc = this,\n          thatArg = arguments[0];\n      var args = Array.prototype.slice.call(arguments, 1);\n\n      if (typeof thatFunc !== 'function') {\n        // closest thing possible to the ECMAScript 5\n        // internal IsCallable function\n        throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n      }\n\n      return function () {\n        var funcArgs = args.concat(Array.prototype.slice.call(arguments));\n        return thatFunc.apply(thatArg, funcArgs);\n      };\n    };\n  }\n  /**\n   * ### Changed plugin\n   *\n   * This plugin adds more information to the `changed.jstree` event. The new data is contained in the `changed` event data property, and contains a lists of `selected` and `deselected` nodes.\n   */\n\n\n  $.jstree.plugins.changed = function (options, parent) {\n    var last = [];\n\n    this.trigger = function (ev, data) {\n      var i, j;\n\n      if (!data) {\n        data = {};\n      }\n\n      if (ev.replace('.jstree', '') === 'changed') {\n        data.changed = {\n          selected: [],\n          deselected: []\n        };\n        var tmp = {};\n\n        for (i = 0, j = last.length; i < j; i++) {\n          tmp[last[i]] = 1;\n        }\n\n        for (i = 0, j = data.selected.length; i < j; i++) {\n          if (!tmp[data.selected[i]]) {\n            data.changed.selected.push(data.selected[i]);\n          } else {\n            tmp[data.selected[i]] = 2;\n          }\n        }\n\n        for (i = 0, j = last.length; i < j; i++) {\n          if (tmp[last[i]] === 1) {\n            data.changed.deselected.push(last[i]);\n          }\n        }\n\n        last = data.selected.slice();\n      }\n      /**\n       * triggered when selection changes (the \"changed\" plugin enhances the original event with more data)\n       * @event\n       * @name changed.jstree\n       * @param {Object} node\n       * @param {Object} action the action that caused the selection to change\n       * @param {Array} selected the current selection\n       * @param {Object} changed an object containing two properties `selected` and `deselected` - both arrays of node IDs, which were selected or deselected since the last changed event\n       * @param {Object} event the event (if any) that triggered this changed event\n       * @plugin changed\n       */\n\n\n      parent.trigger.call(this, ev, data);\n    };\n\n    this.refresh = function (skip_loading, forget_state) {\n      last = [];\n      return parent.refresh.apply(this, arguments);\n    };\n  };\n  /**\n   * ### Checkbox plugin\n   *\n   * This plugin renders checkbox icons in front of each node, making multiple selection much easier.\n   * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up.\n   */\n\n\n  var _i = document.createElement('I');\n\n  _i.className = 'jstree-icon jstree-checkbox';\n\n  _i.setAttribute('role', 'presentation');\n  /**\n   * stores all defaults for the checkbox plugin\n   * @name $.jstree.defaults.checkbox\n   * @plugin checkbox\n   */\n\n\n  $.jstree.defaults.checkbox = {\n    /**\n     * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`.\n     * @name $.jstree.defaults.checkbox.visible\n     * @plugin checkbox\n     */\n    visible: true,\n\n    /**\n     * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`.\n     * @name $.jstree.defaults.checkbox.three_state\n     * @plugin checkbox\n     */\n    three_state: true,\n\n    /**\n     * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`.\n     * @name $.jstree.defaults.checkbox.whole_node\n     * @plugin checkbox\n     */\n    whole_node: true,\n\n    /**\n     * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`.\n     * @name $.jstree.defaults.checkbox.keep_selected_style\n     * @plugin checkbox\n     */\n    keep_selected_style: true,\n\n    /**\n     * This setting controls how cascading and undetermined nodes are applied.\n     * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used.\n     * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''.\n     * @name $.jstree.defaults.checkbox.cascade\n     * @plugin checkbox\n     */\n    cascade: '',\n\n    /**\n     * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing.\n     * @name $.jstree.defaults.checkbox.tie_selection\n     * @plugin checkbox\n     */\n    tie_selection: true,\n\n    /**\n     * This setting controls if cascading down affects disabled checkboxes\n     * @name $.jstree.defaults.checkbox.cascade_to_disabled\n     * @plugin checkbox\n     */\n    cascade_to_disabled: true,\n\n    /**\n     * This setting controls if cascading down affects hidden checkboxes\n     * @name $.jstree.defaults.checkbox.cascade_to_hidden\n     * @plugin checkbox\n     */\n    cascade_to_hidden: true\n  };\n\n  $.jstree.plugins.checkbox = function (options, parent) {\n    this.bind = function () {\n      parent.bind.call(this);\n      this._data.checkbox.uto = false;\n      this._data.checkbox.selected = [];\n\n      if (this.settings.checkbox.three_state) {\n        this.settings.checkbox.cascade = 'up+down+undetermined';\n      }\n\n      this.element.on(\"init.jstree\", function () {\n        this._data.checkbox.visible = this.settings.checkbox.visible;\n\n        if (!this.settings.checkbox.keep_selected_style) {\n          this.element.addClass('jstree-checkbox-no-clicked');\n        }\n\n        if (this.settings.checkbox.tie_selection) {\n          this.element.addClass('jstree-checkbox-selection');\n        }\n      }.bind(this)).on(\"loading.jstree\", function () {\n        this[this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes']();\n      }.bind(this));\n\n      if (this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {\n        this.element.on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', function () {\n          // only if undetermined is in setting\n          if (this._data.checkbox.uto) {\n            clearTimeout(this._data.checkbox.uto);\n          }\n\n          this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50);\n        }.bind(this));\n      }\n\n      if (!this.settings.checkbox.tie_selection) {\n        this.element.on('model.jstree', function (e, data) {\n          var m = this._model.data,\n              p = m[data.parent],\n              dpc = data.nodes,\n              i,\n              j;\n\n          for (i = 0, j = dpc.length; i < j; i++) {\n            m[dpc[i]].state.checked = m[dpc[i]].state.checked || m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked;\n\n            if (m[dpc[i]].state.checked) {\n              this._data.checkbox.selected.push(dpc[i]);\n            }\n          }\n        }.bind(this));\n      }\n\n      if (this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) {\n        this.element.on('model.jstree', function (e, data) {\n          var m = this._model.data,\n              p = m[data.parent],\n              dpc = data.nodes,\n              chd = [],\n              c,\n              i,\n              j,\n              k,\n              l,\n              tmp,\n              s = this.settings.checkbox.cascade,\n              t = this.settings.checkbox.tie_selection;\n\n          if (s.indexOf('down') !== -1) {\n            // apply down\n            if (p.state[t ? 'selected' : 'checked']) {\n              for (i = 0, j = dpc.length; i < j; i++) {\n                m[dpc[i]].state[t ? 'selected' : 'checked'] = true;\n              }\n\n              this._data[t ? 'core' : 'checkbox'].selected = this._data[t ? 'core' : 'checkbox'].selected.concat(dpc);\n            } else {\n              for (i = 0, j = dpc.length; i < j; i++) {\n                if (m[dpc[i]].state[t ? 'selected' : 'checked']) {\n                  for (k = 0, l = m[dpc[i]].children_d.length; k < l; k++) {\n                    m[m[dpc[i]].children_d[k]].state[t ? 'selected' : 'checked'] = true;\n                  }\n\n                  this._data[t ? 'core' : 'checkbox'].selected = this._data[t ? 'core' : 'checkbox'].selected.concat(m[dpc[i]].children_d);\n                }\n              }\n            }\n          }\n\n          if (s.indexOf('up') !== -1) {\n            // apply up\n            for (i = 0, j = p.children_d.length; i < j; i++) {\n              if (!m[p.children_d[i]].children.length) {\n                chd.push(m[p.children_d[i]].parent);\n              }\n            }\n\n            chd = $.vakata.array_unique(chd);\n\n            for (k = 0, l = chd.length; k < l; k++) {\n              p = m[chd[k]];\n\n              while (p && p.id !== $.jstree.root) {\n                c = 0;\n\n                for (i = 0, j = p.children.length; i < j; i++) {\n                  c += m[p.children[i]].state[t ? 'selected' : 'checked'];\n                }\n\n                if (c === j) {\n                  p.state[t ? 'selected' : 'checked'] = true;\n\n                  this._data[t ? 'core' : 'checkbox'].selected.push(p.id);\n\n                  tmp = this.get_node(p, true);\n\n                  if (tmp && tmp.length) {\n                    tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');\n                  }\n                } else {\n                  break;\n                }\n\n                p = this.get_node(p.parent);\n              }\n            }\n          }\n\n          this._data[t ? 'core' : 'checkbox'].selected = $.vakata.array_unique(this._data[t ? 'core' : 'checkbox'].selected);\n        }.bind(this)).on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', function (e, data) {\n          var self = this,\n              obj = data.node,\n              m = this._model.data,\n              par = this.get_node(obj.parent),\n              i,\n              j,\n              c,\n              tmp,\n              s = this.settings.checkbox.cascade,\n              t = this.settings.checkbox.tie_selection,\n              sel = {},\n              cur = this._data[t ? 'core' : 'checkbox'].selected;\n\n          for (i = 0, j = cur.length; i < j; i++) {\n            sel[cur[i]] = true;\n          } // apply down\n\n\n          if (s.indexOf('down') !== -1) {\n            //this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d));\n            var selectedIds = this._cascade_new_checked_state(obj.id, true);\n\n            var temp = obj.children_d.concat(obj.id);\n\n            for (i = 0, j = temp.length; i < j; i++) {\n              if (selectedIds.indexOf(temp[i]) > -1) {\n                sel[temp[i]] = true;\n              } else {\n                delete sel[temp[i]];\n              }\n            }\n          } // apply up\n\n\n          if (s.indexOf('up') !== -1) {\n            while (par && par.id !== $.jstree.root) {\n              c = 0;\n\n              for (i = 0, j = par.children.length; i < j; i++) {\n                c += m[par.children[i]].state[t ? 'selected' : 'checked'];\n              }\n\n              if (c === j) {\n                par.state[t ? 'selected' : 'checked'] = true;\n                sel[par.id] = true; //this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id);\n\n                tmp = this.get_node(par, true);\n\n                if (tmp && tmp.length) {\n                  tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');\n                }\n              } else {\n                break;\n              }\n\n              par = this.get_node(par.parent);\n            }\n          }\n\n          cur = [];\n\n          for (i in sel) {\n            if (sel.hasOwnProperty(i)) {\n              cur.push(i);\n            }\n          }\n\n          this._data[t ? 'core' : 'checkbox'].selected = cur;\n        }.bind(this)).on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', function (e, data) {\n          var obj = this.get_node($.jstree.root),\n              m = this._model.data,\n              i,\n              j,\n              tmp;\n\n          for (i = 0, j = obj.children_d.length; i < j; i++) {\n            tmp = m[obj.children_d[i]];\n\n            if (tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {\n              tmp.original.state.undetermined = false;\n            }\n          }\n        }.bind(this)).on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', function (e, data) {\n          var self = this,\n              obj = data.node,\n              dom = this.get_node(obj, true),\n              i,\n              j,\n              tmp,\n              s = this.settings.checkbox.cascade,\n              t = this.settings.checkbox.tie_selection,\n              cur = this._data[t ? 'core' : 'checkbox'].selected,\n              sel = {},\n              stillSelectedIds = [],\n              allIds = obj.children_d.concat(obj.id); // apply down\n\n          if (s.indexOf('down') !== -1) {\n            var selectedIds = this._cascade_new_checked_state(obj.id, false);\n\n            cur = $.vakata.array_filter(cur, function (id) {\n              return allIds.indexOf(id) === -1 || selectedIds.indexOf(id) > -1;\n            });\n          } // only apply up if cascade up is enabled and if this node is not selected\n          // (if all child nodes are disabled and cascade_to_disabled === false then this node will till be selected).\n\n\n          if (s.indexOf('up') !== -1 && cur.indexOf(obj.id) === -1) {\n            for (i = 0, j = obj.parents.length; i < j; i++) {\n              tmp = this._model.data[obj.parents[i]];\n              tmp.state[t ? 'selected' : 'checked'] = false;\n\n              if (tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {\n                tmp.original.state.undetermined = false;\n              }\n\n              tmp = this.get_node(obj.parents[i], true);\n\n              if (tmp && tmp.length) {\n                tmp.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');\n              }\n            }\n\n            cur = $.vakata.array_filter(cur, function (id) {\n              return obj.parents.indexOf(id) === -1;\n            });\n          }\n\n          this._data[t ? 'core' : 'checkbox'].selected = cur;\n        }.bind(this));\n      }\n\n      if (this.settings.checkbox.cascade.indexOf('up') !== -1) {\n        this.element.on('delete_node.jstree', function (e, data) {\n          // apply up (whole handler)\n          var p = this.get_node(data.parent),\n              m = this._model.data,\n              i,\n              j,\n              c,\n              tmp,\n              t = this.settings.checkbox.tie_selection;\n\n          while (p && p.id !== $.jstree.root && !p.state[t ? 'selected' : 'checked']) {\n            c = 0;\n\n            for (i = 0, j = p.children.length; i < j; i++) {\n              c += m[p.children[i]].state[t ? 'selected' : 'checked'];\n            }\n\n            if (j > 0 && c === j) {\n              p.state[t ? 'selected' : 'checked'] = true;\n\n              this._data[t ? 'core' : 'checkbox'].selected.push(p.id);\n\n              tmp = this.get_node(p, true);\n\n              if (tmp && tmp.length) {\n                tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');\n              }\n            } else {\n              break;\n            }\n\n            p = this.get_node(p.parent);\n          }\n        }.bind(this)).on('move_node.jstree', function (e, data) {\n          // apply up (whole handler)\n          var is_multi = data.is_multi,\n              old_par = data.old_parent,\n              new_par = this.get_node(data.parent),\n              m = this._model.data,\n              p,\n              c,\n              i,\n              j,\n              tmp,\n              t = this.settings.checkbox.tie_selection;\n\n          if (!is_multi) {\n            p = this.get_node(old_par);\n\n            while (p && p.id !== $.jstree.root && !p.state[t ? 'selected' : 'checked']) {\n              c = 0;\n\n              for (i = 0, j = p.children.length; i < j; i++) {\n                c += m[p.children[i]].state[t ? 'selected' : 'checked'];\n              }\n\n              if (j > 0 && c === j) {\n                p.state[t ? 'selected' : 'checked'] = true;\n\n                this._data[t ? 'core' : 'checkbox'].selected.push(p.id);\n\n                tmp = this.get_node(p, true);\n\n                if (tmp && tmp.length) {\n                  tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');\n                }\n              } else {\n                break;\n              }\n\n              p = this.get_node(p.parent);\n            }\n          }\n\n          p = new_par;\n\n          while (p && p.id !== $.jstree.root) {\n            c = 0;\n\n            for (i = 0, j = p.children.length; i < j; i++) {\n              c += m[p.children[i]].state[t ? 'selected' : 'checked'];\n            }\n\n            if (c === j) {\n              if (!p.state[t ? 'selected' : 'checked']) {\n                p.state[t ? 'selected' : 'checked'] = true;\n\n                this._data[t ? 'core' : 'checkbox'].selected.push(p.id);\n\n                tmp = this.get_node(p, true);\n\n                if (tmp && tmp.length) {\n                  tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');\n                }\n              }\n            } else {\n              if (p.state[t ? 'selected' : 'checked']) {\n                p.state[t ? 'selected' : 'checked'] = false;\n                this._data[t ? 'core' : 'checkbox'].selected = $.vakata.array_remove_item(this._data[t ? 'core' : 'checkbox'].selected, p.id);\n                tmp = this.get_node(p, true);\n\n                if (tmp && tmp.length) {\n                  tmp.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');\n                }\n              } else {\n                break;\n              }\n            }\n\n            p = this.get_node(p.parent);\n          }\n        }.bind(this));\n      }\n    };\n    /**\n     * get an array of all nodes whose state is \"undetermined\"\n     * @name get_undetermined([full])\n     * @param  {boolean} full: if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned\n     * @return {Array}\n     * @plugin checkbox\n     */\n\n\n    this.get_undetermined = function (full) {\n      if (this.settings.checkbox.cascade.indexOf('undetermined') === -1) {\n        return [];\n      }\n\n      var i,\n          j,\n          k,\n          l,\n          o = {},\n          m = this._model.data,\n          t = this.settings.checkbox.tie_selection,\n          s = this._data[t ? 'core' : 'checkbox'].selected,\n          p = [],\n          tt = this,\n          r = [];\n\n      for (i = 0, j = s.length; i < j; i++) {\n        if (m[s[i]] && m[s[i]].parents) {\n          for (k = 0, l = m[s[i]].parents.length; k < l; k++) {\n            if (o[m[s[i]].parents[k]] !== undefined) {\n              break;\n            }\n\n            if (m[s[i]].parents[k] !== $.jstree.root) {\n              o[m[s[i]].parents[k]] = true;\n              p.push(m[s[i]].parents[k]);\n            }\n          }\n        }\n      } // attempt for server side undetermined state\n\n\n      this.element.find('.jstree-closed').not(':has(.jstree-children)').each(function () {\n        var tmp = tt.get_node(this),\n            tmp2;\n\n        if (!tmp) {\n          return;\n        }\n\n        if (!tmp.state.loaded) {\n          if (tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) {\n            if (o[tmp.id] === undefined && tmp.id !== $.jstree.root) {\n              o[tmp.id] = true;\n              p.push(tmp.id);\n            }\n\n            for (k = 0, l = tmp.parents.length; k < l; k++) {\n              if (o[tmp.parents[k]] === undefined && tmp.parents[k] !== $.jstree.root) {\n                o[tmp.parents[k]] = true;\n                p.push(tmp.parents[k]);\n              }\n            }\n          }\n        } else {\n          for (i = 0, j = tmp.children_d.length; i < j; i++) {\n            tmp2 = m[tmp.children_d[i]];\n\n            if (!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) {\n              if (o[tmp2.id] === undefined && tmp2.id !== $.jstree.root) {\n                o[tmp2.id] = true;\n                p.push(tmp2.id);\n              }\n\n              for (k = 0, l = tmp2.parents.length; k < l; k++) {\n                if (o[tmp2.parents[k]] === undefined && tmp2.parents[k] !== $.jstree.root) {\n                  o[tmp2.parents[k]] = true;\n                  p.push(tmp2.parents[k]);\n                }\n              }\n            }\n          }\n        }\n      });\n\n      for (i = 0, j = p.length; i < j; i++) {\n        if (!m[p[i]].state[t ? 'selected' : 'checked']) {\n          r.push(full ? m[p[i]] : p[i]);\n        }\n      }\n\n      return r;\n    };\n    /**\n     * set the undetermined state where and if necessary. Used internally.\n     * @private\n     * @name _undetermined()\n     * @plugin checkbox\n     */\n\n\n    this._undetermined = function () {\n      if (this.element === null) {\n        return;\n      }\n\n      var p = this.get_undetermined(false),\n          i,\n          j,\n          s;\n      this.element.find('.jstree-undetermined').removeClass('jstree-undetermined');\n\n      for (i = 0, j = p.length; i < j; i++) {\n        s = this.get_node(p[i], true);\n\n        if (s && s.length) {\n          s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined');\n        }\n      }\n    };\n\n    this.redraw_node = function (obj, deep, is_callback, force_render) {\n      obj = parent.redraw_node.apply(this, arguments);\n\n      if (obj) {\n        var i,\n            j,\n            tmp = null,\n            icon = null;\n\n        for (i = 0, j = obj.childNodes.length; i < j; i++) {\n          if (obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf(\"jstree-anchor\") !== -1) {\n            tmp = obj.childNodes[i];\n            break;\n          }\n        }\n\n        if (tmp) {\n          if (!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) {\n            tmp.className += ' jstree-checked';\n          }\n\n          icon = _i.cloneNode(false);\n\n          if (this._model.data[obj.id].state.checkbox_disabled) {\n            icon.className += ' jstree-checkbox-disabled';\n          }\n\n          tmp.insertBefore(icon, tmp.childNodes[0]);\n        }\n      }\n\n      if (!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {\n        if (this._data.checkbox.uto) {\n          clearTimeout(this._data.checkbox.uto);\n        }\n\n        this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50);\n      }\n\n      return obj;\n    };\n    /**\n     * show the node checkbox icons\n     * @name show_checkboxes()\n     * @plugin checkbox\n     */\n\n\n    this.show_checkboxes = function () {\n      this._data.core.themes.checkboxes = true;\n      this.get_container_ul().removeClass(\"jstree-no-checkboxes\");\n    };\n    /**\n     * hide the node checkbox icons\n     * @name hide_checkboxes()\n     * @plugin checkbox\n     */\n\n\n    this.hide_checkboxes = function () {\n      this._data.core.themes.checkboxes = false;\n      this.get_container_ul().addClass(\"jstree-no-checkboxes\");\n    };\n    /**\n     * toggle the node icons\n     * @name toggle_checkboxes()\n     * @plugin checkbox\n     */\n\n\n    this.toggle_checkboxes = function () {\n      if (this._data.core.themes.checkboxes) {\n        this.hide_checkboxes();\n      } else {\n        this.show_checkboxes();\n      }\n    };\n    /**\n     * checks if a node is in an undetermined state\n     * @name is_undetermined(obj)\n     * @param  {mixed} obj\n     * @return {Boolean}\n     */\n\n\n    this.is_undetermined = function (obj) {\n      obj = this.get_node(obj);\n      var s = this.settings.checkbox.cascade,\n          i,\n          j,\n          t = this.settings.checkbox.tie_selection,\n          d = this._data[t ? 'core' : 'checkbox'].selected,\n          m = this._model.data;\n\n      if (!obj || obj.state[t ? 'selected' : 'checked'] === true || s.indexOf('undetermined') === -1 || s.indexOf('down') === -1 && s.indexOf('up') === -1) {\n        return false;\n      }\n\n      if (!obj.state.loaded && obj.original.state.undetermined === true) {\n        return true;\n      }\n\n      for (i = 0, j = obj.children_d.length; i < j; i++) {\n        if ($.inArray(obj.children_d[i], d) !== -1 || !m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n    /**\n     * disable a node's checkbox\n     * @name disable_checkbox(obj)\n     * @param {mixed} obj an array can be used too\n     * @trigger disable_checkbox.jstree\n     * @plugin checkbox\n     */\n\n\n    this.disable_checkbox = function (obj) {\n      var t1, t2, dom;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.disable_checkbox(obj[t1]);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      dom = this.get_node(obj, true);\n\n      if (!obj.state.checkbox_disabled) {\n        obj.state.checkbox_disabled = true;\n\n        if (dom && dom.length) {\n          dom.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-checkbox-disabled');\n        }\n        /**\n         * triggered when an node's checkbox is disabled\n         * @event\n         * @name disable_checkbox.jstree\n         * @param {Object} node\n         * @plugin checkbox\n         */\n\n\n        this.trigger('disable_checkbox', {\n          'node': obj\n        });\n      }\n    };\n    /**\n     * enable a node's checkbox\n     * @name enable_checkbox(obj)\n     * @param {mixed} obj an array can be used too\n     * @trigger enable_checkbox.jstree\n     * @plugin checkbox\n     */\n\n\n    this.enable_checkbox = function (obj) {\n      var t1, t2, dom;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.enable_checkbox(obj[t1]);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      dom = this.get_node(obj, true);\n\n      if (obj.state.checkbox_disabled) {\n        obj.state.checkbox_disabled = false;\n\n        if (dom && dom.length) {\n          dom.children('.jstree-anchor').children('.jstree-checkbox').removeClass('jstree-checkbox-disabled');\n        }\n        /**\n         * triggered when an node's checkbox is enabled\n         * @event\n         * @name enable_checkbox.jstree\n         * @param {Object} node\n         * @plugin checkbox\n         */\n\n\n        this.trigger('enable_checkbox', {\n          'node': obj\n        });\n      }\n    };\n\n    this.activate_node = function (obj, e) {\n      if ($(e.target).hasClass('jstree-checkbox-disabled')) {\n        return false;\n      }\n\n      if (this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) {\n        e.ctrlKey = true;\n      }\n\n      if (this.settings.checkbox.tie_selection || !this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox')) {\n        return parent.activate_node.call(this, obj, e);\n      }\n\n      if (this.is_disabled(obj)) {\n        return false;\n      }\n\n      if (this.is_checked(obj)) {\n        this.uncheck_node(obj, e);\n      } else {\n        this.check_node(obj, e);\n      }\n\n      this.trigger('activate_node', {\n        'node': this.get_node(obj)\n      });\n    };\n    /**\n     * Cascades checked state to a node and all its descendants. This function does NOT affect hidden and disabled nodes (or their descendants).\n     * However if these unaffected nodes are already selected their ids will be included in the returned array.\n     * @private\n     * @name _cascade_new_checked_state(id, checkedState)\n     * @param {string} id the node ID\n     * @param {bool} checkedState should the nodes be checked or not\n     * @returns {Array} Array of all node id's (in this tree branch) that are checked.\n     */\n\n\n    this._cascade_new_checked_state = function (id, checkedState) {\n      var self = this;\n      var t = this.settings.checkbox.tie_selection;\n      var node = this._model.data[id];\n      var selectedNodeIds = [];\n      var selectedChildrenIds = [],\n          i,\n          j,\n          selectedChildIds;\n\n      if ((this.settings.checkbox.cascade_to_disabled || !node.state.disabled) && (this.settings.checkbox.cascade_to_hidden || !node.state.hidden)) {\n        //First try and check/uncheck the children\n        if (node.children) {\n          for (i = 0, j = node.children.length; i < j; i++) {\n            var childId = node.children[i];\n            selectedChildIds = self._cascade_new_checked_state(childId, checkedState);\n            selectedNodeIds = selectedNodeIds.concat(selectedChildIds);\n\n            if (selectedChildIds.indexOf(childId) > -1) {\n              selectedChildrenIds.push(childId);\n            }\n          }\n        }\n\n        var dom = self.get_node(node, true); //A node's state is undetermined if some but not all of it's children are checked/selected .\n\n        var undetermined = selectedChildrenIds.length > 0 && selectedChildrenIds.length < node.children.length;\n\n        if (node.original && node.original.state && node.original.state.undetermined) {\n          node.original.state.undetermined = undetermined;\n        } //If a node is undetermined then remove selected class\n\n\n        if (undetermined) {\n          node.state[t ? 'selected' : 'checked'] = false;\n          dom.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');\n        } //Otherwise, if the checkedState === true (i.e. the node is being checked now) and all of the node's children are checked (if it has any children),\n        //check the node and style it correctly.\n        else if (checkedState && selectedChildrenIds.length === node.children.length) {\n          node.state[t ? 'selected' : 'checked'] = checkedState;\n          selectedNodeIds.push(node.id);\n          dom.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');\n        } else {\n          node.state[t ? 'selected' : 'checked'] = false;\n          dom.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');\n        }\n      } else {\n        selectedChildIds = this.get_checked_descendants(id);\n\n        if (node.state[t ? 'selected' : 'checked']) {\n          selectedChildIds.push(node.id);\n        }\n\n        selectedNodeIds = selectedNodeIds.concat(selectedChildIds);\n      }\n\n      return selectedNodeIds;\n    };\n    /**\n     * Gets ids of nodes selected in branch (of tree) specified by id (does not include the node specified by id)\n     * @name get_checked_descendants(obj)\n     * @param {string} id the node ID\n     * @return {Array} array of IDs\n     * @plugin checkbox\n     */\n\n\n    this.get_checked_descendants = function (id) {\n      var self = this;\n      var t = self.settings.checkbox.tie_selection;\n      var node = self._model.data[id];\n      return $.vakata.array_filter(node.children_d, function (_id) {\n        return self._model.data[_id].state[t ? 'selected' : 'checked'];\n      });\n    };\n    /**\n     * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally)\n     * @name check_node(obj)\n     * @param {mixed} obj an array can be used to check multiple nodes\n     * @trigger check_node.jstree\n     * @plugin checkbox\n     */\n\n\n    this.check_node = function (obj, e) {\n      if (this.settings.checkbox.tie_selection) {\n        return this.select_node(obj, false, true, e);\n      }\n\n      var dom, t1, t2, th;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.check_node(obj[t1], e);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      dom = this.get_node(obj, true);\n\n      if (!obj.state.checked) {\n        obj.state.checked = true;\n\n        this._data.checkbox.selected.push(obj.id);\n\n        if (dom && dom.length) {\n          dom.children('.jstree-anchor').addClass('jstree-checked');\n        }\n        /**\n         * triggered when an node is checked (only if tie_selection in checkbox settings is false)\n         * @event\n         * @name check_node.jstree\n         * @param {Object} node\n         * @param {Array} selected the current selection\n         * @param {Object} event the event (if any) that triggered this check_node\n         * @plugin checkbox\n         */\n\n\n        this.trigger('check_node', {\n          'node': obj,\n          'selected': this._data.checkbox.selected,\n          'event': e\n        });\n      }\n    };\n    /**\n     * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally)\n     * @name uncheck_node(obj)\n     * @param {mixed} obj an array can be used to uncheck multiple nodes\n     * @trigger uncheck_node.jstree\n     * @plugin checkbox\n     */\n\n\n    this.uncheck_node = function (obj, e) {\n      if (this.settings.checkbox.tie_selection) {\n        return this.deselect_node(obj, false, e);\n      }\n\n      var t1, t2, dom;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.uncheck_node(obj[t1], e);\n        }\n\n        return true;\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      dom = this.get_node(obj, true);\n\n      if (obj.state.checked) {\n        obj.state.checked = false;\n        this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id);\n\n        if (dom.length) {\n          dom.children('.jstree-anchor').removeClass('jstree-checked');\n        }\n        /**\n         * triggered when an node is unchecked (only if tie_selection in checkbox settings is false)\n         * @event\n         * @name uncheck_node.jstree\n         * @param {Object} node\n         * @param {Array} selected the current selection\n         * @param {Object} event the event (if any) that triggered this uncheck_node\n         * @plugin checkbox\n         */\n\n\n        this.trigger('uncheck_node', {\n          'node': obj,\n          'selected': this._data.checkbox.selected,\n          'event': e\n        });\n      }\n    };\n    /**\n     * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally)\n     * @name check_all()\n     * @trigger check_all.jstree, changed.jstree\n     * @plugin checkbox\n     */\n\n\n    this.check_all = function () {\n      if (this.settings.checkbox.tie_selection) {\n        return this.select_all();\n      }\n\n      var tmp = this._data.checkbox.selected.concat([]),\n          i,\n          j;\n\n      this._data.checkbox.selected = this._model.data[$.jstree.root].children_d.concat();\n\n      for (i = 0, j = this._data.checkbox.selected.length; i < j; i++) {\n        if (this._model.data[this._data.checkbox.selected[i]]) {\n          this._model.data[this._data.checkbox.selected[i]].state.checked = true;\n        }\n      }\n\n      this.redraw(true);\n      /**\n       * triggered when all nodes are checked (only if tie_selection in checkbox settings is false)\n       * @event\n       * @name check_all.jstree\n       * @param {Array} selected the current selection\n       * @plugin checkbox\n       */\n\n      this.trigger('check_all', {\n        'selected': this._data.checkbox.selected\n      });\n    };\n    /**\n     * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally)\n     * @name uncheck_all()\n     * @trigger uncheck_all.jstree\n     * @plugin checkbox\n     */\n\n\n    this.uncheck_all = function () {\n      if (this.settings.checkbox.tie_selection) {\n        return this.deselect_all();\n      }\n\n      var tmp = this._data.checkbox.selected.concat([]),\n          i,\n          j;\n\n      for (i = 0, j = this._data.checkbox.selected.length; i < j; i++) {\n        if (this._model.data[this._data.checkbox.selected[i]]) {\n          this._model.data[this._data.checkbox.selected[i]].state.checked = false;\n        }\n      }\n\n      this._data.checkbox.selected = [];\n      this.element.find('.jstree-checked').removeClass('jstree-checked');\n      /**\n       * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false)\n       * @event\n       * @name uncheck_all.jstree\n       * @param {Object} node the previous selection\n       * @param {Array} selected the current selection\n       * @plugin checkbox\n       */\n\n      this.trigger('uncheck_all', {\n        'selected': this._data.checkbox.selected,\n        'node': tmp\n      });\n    };\n    /**\n     * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected)\n     * @name is_checked(obj)\n     * @param  {mixed}  obj\n     * @return {Boolean}\n     * @plugin checkbox\n     */\n\n\n    this.is_checked = function (obj) {\n      if (this.settings.checkbox.tie_selection) {\n        return this.is_selected(obj);\n      }\n\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      return obj.state.checked;\n    };\n    /**\n     * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected)\n     * @name get_checked([full])\n     * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned\n     * @return {Array}\n     * @plugin checkbox\n     */\n\n\n    this.get_checked = function (full) {\n      if (this.settings.checkbox.tie_selection) {\n        return this.get_selected(full);\n      }\n\n      return full ? $.map(this._data.checkbox.selected, function (i) {\n        return this.get_node(i);\n      }.bind(this)) : this._data.checkbox.selected.slice();\n    };\n    /**\n     * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected)\n     * @name get_top_checked([full])\n     * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned\n     * @return {Array}\n     * @plugin checkbox\n     */\n\n\n    this.get_top_checked = function (full) {\n      if (this.settings.checkbox.tie_selection) {\n        return this.get_top_selected(full);\n      }\n\n      var tmp = this.get_checked(true),\n          obj = {},\n          i,\n          j,\n          k,\n          l;\n\n      for (i = 0, j = tmp.length; i < j; i++) {\n        obj[tmp[i].id] = tmp[i];\n      }\n\n      for (i = 0, j = tmp.length; i < j; i++) {\n        for (k = 0, l = tmp[i].children_d.length; k < l; k++) {\n          if (obj[tmp[i].children_d[k]]) {\n            delete obj[tmp[i].children_d[k]];\n          }\n        }\n      }\n\n      tmp = [];\n\n      for (i in obj) {\n        if (obj.hasOwnProperty(i)) {\n          tmp.push(i);\n        }\n      }\n\n      return full ? $.map(tmp, function (i) {\n        return this.get_node(i);\n      }.bind(this)) : tmp;\n    };\n    /**\n     * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected)\n     * @name get_bottom_checked([full])\n     * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned\n     * @return {Array}\n     * @plugin checkbox\n     */\n\n\n    this.get_bottom_checked = function (full) {\n      if (this.settings.checkbox.tie_selection) {\n        return this.get_bottom_selected(full);\n      }\n\n      var tmp = this.get_checked(true),\n          obj = [],\n          i,\n          j;\n\n      for (i = 0, j = tmp.length; i < j; i++) {\n        if (!tmp[i].children.length) {\n          obj.push(tmp[i].id);\n        }\n      }\n\n      return full ? $.map(obj, function (i) {\n        return this.get_node(i);\n      }.bind(this)) : obj;\n    };\n\n    this.load_node = function (obj, callback) {\n      var k, l, i, j, c, tmp;\n\n      if (!$.vakata.is_array(obj) && !this.settings.checkbox.tie_selection) {\n        tmp = this.get_node(obj);\n\n        if (tmp && tmp.state.loaded) {\n          for (k = 0, l = tmp.children_d.length; k < l; k++) {\n            if (this._model.data[tmp.children_d[k]].state.checked) {\n              c = true;\n              this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, tmp.children_d[k]);\n            }\n          }\n        }\n      }\n\n      return parent.load_node.apply(this, arguments);\n    };\n\n    this.get_state = function () {\n      var state = parent.get_state.apply(this, arguments);\n\n      if (this.settings.checkbox.tie_selection) {\n        return state;\n      }\n\n      state.checkbox = this._data.checkbox.selected.slice();\n      return state;\n    };\n\n    this.set_state = function (state, callback) {\n      var res = parent.set_state.apply(this, arguments);\n\n      if (res && state.checkbox) {\n        if (!this.settings.checkbox.tie_selection) {\n          this.uncheck_all();\n\n          var _this = this;\n\n          $.each(state.checkbox, function (i, v) {\n            _this.check_node(v);\n          });\n        }\n\n        delete state.checkbox;\n        this.set_state(state, callback);\n        return false;\n      }\n\n      return res;\n    };\n\n    this.refresh = function (skip_loading, forget_state) {\n      if (this.settings.checkbox.tie_selection) {\n        this._data.checkbox.selected = [];\n      }\n\n      return parent.refresh.apply(this, arguments);\n    };\n  }; // include the checkbox plugin by default\n  // $.jstree.defaults.plugins.push(\"checkbox\");\n\n  /**\n   * ### Conditionalselect plugin\n   *\n   * This plugin allows defining a callback to allow or deny node selection by user input (activate node method).\n   */\n\n  /**\n   * a callback (function) which is invoked in the instance's scope and receives two arguments - the node and the event that triggered the `activate_node` call. Returning false prevents working with the node, returning true allows invoking activate_node. Defaults to returning `true`.\n   * @name $.jstree.defaults.checkbox.visible\n   * @plugin checkbox\n   */\n\n\n  $.jstree.defaults.conditionalselect = function () {\n    return true;\n  };\n\n  $.jstree.plugins.conditionalselect = function (options, parent) {\n    // own function\n    this.activate_node = function (obj, e) {\n      if (this.settings.conditionalselect.call(this, this.get_node(obj), e)) {\n        return parent.activate_node.call(this, obj, e);\n      }\n    };\n  };\n  /**\n   * ### Contextmenu plugin\n   *\n   * Shows a context menu when a node is right-clicked.\n   */\n\n  /**\n   * stores all defaults for the contextmenu plugin\n   * @name $.jstree.defaults.contextmenu\n   * @plugin contextmenu\n   */\n\n\n  $.jstree.defaults.contextmenu = {\n    /**\n     * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`.\n     * @name $.jstree.defaults.contextmenu.select_node\n     * @plugin contextmenu\n     */\n    select_node: true,\n\n    /**\n     * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used.\n     * @name $.jstree.defaults.contextmenu.show_at_node\n     * @plugin contextmenu\n     */\n    show_at_node: true,\n\n    /**\n     * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too).\n     *\n     * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required). Once a menu item is activated the `action` function will be invoked with an object containing the following keys: item - the contextmenu item definition as seen below, reference - the DOM node that was used (the tree node), element - the contextmenu DOM element, position - an object with x/y properties indicating the position of the menu.\n     *\n     * * `separator_before` - a boolean indicating if there should be a separator before this item\n     * * `separator_after` - a boolean indicating if there should be a separator after this item\n     * * `_disabled` - a boolean indicating if this action should be disabled\n     * * `label` - a string - the name of the action (could be a function returning a string)\n     * * `title` - a string - an optional tooltip for the item\n     * * `action` - a function to be executed if this item is chosen, the function will receive \n     * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class\n     * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2)\n     * * `shortcut_label` - shortcut label (like for example `F2` for rename)\n     * * `submenu` - an object with the same structure as $.jstree.defaults.contextmenu.items which can be used to create a submenu - each key will be rendered as a separate option in a submenu that will appear once the current item is hovered\n     *\n     * @name $.jstree.defaults.contextmenu.items\n     * @plugin contextmenu\n     */\n    items: function items(o, cb) {\n      // Could be an object directly\n      return {\n        \"create\": {\n          \"separator_before\": false,\n          \"separator_after\": true,\n          \"_disabled\": false,\n          //(this.check(\"create_node\", data.reference, {}, \"last\")),\n          \"label\": \"Create\",\n          \"action\": function action(data) {\n            var inst = $.jstree.reference(data.reference),\n                obj = inst.get_node(data.reference);\n            inst.create_node(obj, {}, \"last\", function (new_node) {\n              try {\n                inst.edit(new_node);\n              } catch (ex) {\n                setTimeout(function () {\n                  inst.edit(new_node);\n                }, 0);\n              }\n            });\n          }\n        },\n        \"rename\": {\n          \"separator_before\": false,\n          \"separator_after\": false,\n          \"_disabled\": false,\n          //(this.check(\"rename_node\", data.reference, this.get_parent(data.reference), \"\")),\n          \"label\": \"Rename\",\n\n          /*!\n          \"shortcut\"\t\t\t: 113,\n          \"shortcut_label\"\t: 'F2',\n          \"icon\"\t\t\t\t: \"glyphicon glyphicon-leaf\",\n          */\n          \"action\": function action(data) {\n            var inst = $.jstree.reference(data.reference),\n                obj = inst.get_node(data.reference);\n            inst.edit(obj);\n          }\n        },\n        \"remove\": {\n          \"separator_before\": false,\n          \"icon\": false,\n          \"separator_after\": false,\n          \"_disabled\": false,\n          //(this.check(\"delete_node\", data.reference, this.get_parent(data.reference), \"\")),\n          \"label\": \"Delete\",\n          \"action\": function action(data) {\n            var inst = $.jstree.reference(data.reference),\n                obj = inst.get_node(data.reference);\n\n            if (inst.is_selected(obj)) {\n              inst.delete_node(inst.get_selected());\n            } else {\n              inst.delete_node(obj);\n            }\n          }\n        },\n        \"ccp\": {\n          \"separator_before\": true,\n          \"icon\": false,\n          \"separator_after\": false,\n          \"label\": \"Edit\",\n          \"action\": false,\n          \"submenu\": {\n            \"cut\": {\n              \"separator_before\": false,\n              \"separator_after\": false,\n              \"label\": \"Cut\",\n              \"action\": function action(data) {\n                var inst = $.jstree.reference(data.reference),\n                    obj = inst.get_node(data.reference);\n\n                if (inst.is_selected(obj)) {\n                  inst.cut(inst.get_top_selected());\n                } else {\n                  inst.cut(obj);\n                }\n              }\n            },\n            \"copy\": {\n              \"separator_before\": false,\n              \"icon\": false,\n              \"separator_after\": false,\n              \"label\": \"Copy\",\n              \"action\": function action(data) {\n                var inst = $.jstree.reference(data.reference),\n                    obj = inst.get_node(data.reference);\n\n                if (inst.is_selected(obj)) {\n                  inst.copy(inst.get_top_selected());\n                } else {\n                  inst.copy(obj);\n                }\n              }\n            },\n            \"paste\": {\n              \"separator_before\": false,\n              \"icon\": false,\n              \"_disabled\": function _disabled(data) {\n                return !$.jstree.reference(data.reference).can_paste();\n              },\n              \"separator_after\": false,\n              \"label\": \"Paste\",\n              \"action\": function action(data) {\n                var inst = $.jstree.reference(data.reference),\n                    obj = inst.get_node(data.reference);\n                inst.paste(obj);\n              }\n            }\n          }\n        }\n      };\n    }\n  };\n\n  $.jstree.plugins.contextmenu = function (options, parent) {\n    this.bind = function () {\n      parent.bind.call(this);\n      var last_ts = 0,\n          cto = null,\n          ex,\n          ey;\n      this.element.on(\"init.jstree loading.jstree ready.jstree\", function () {\n        this.get_container_ul().addClass('jstree-contextmenu');\n      }.bind(this)).on(\"contextmenu.jstree\", \".jstree-anchor\", function (e, data) {\n        if (e.target.tagName.toLowerCase() === 'input') {\n          return;\n        }\n\n        e.preventDefault();\n        last_ts = e.ctrlKey ? +new Date() : 0;\n\n        if (data || cto) {\n          last_ts = +new Date() + 10000;\n        }\n\n        if (cto) {\n          clearTimeout(cto);\n        }\n\n        if (!this.is_loading(e.currentTarget)) {\n          this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e);\n        }\n      }.bind(this)).on(\"click.jstree\", \".jstree-anchor\", function (e) {\n        if (this._data.contextmenu.visible && (!last_ts || +new Date() - last_ts > 250)) {\n          // work around safari & macOS ctrl+click\n          $.vakata.context.hide();\n        }\n\n        last_ts = 0;\n      }.bind(this)).on(\"touchstart.jstree\", \".jstree-anchor\", function (e) {\n        if (!e.originalEvent || !e.originalEvent.changedTouches || !e.originalEvent.changedTouches[0]) {\n          return;\n        }\n\n        ex = e.originalEvent.changedTouches[0].clientX;\n        ey = e.originalEvent.changedTouches[0].clientY;\n        cto = setTimeout(function () {\n          $(e.currentTarget).trigger('contextmenu', true);\n        }, 750);\n      }).on('touchmove.vakata.jstree', function (e) {\n        if (cto && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0] && (Math.abs(ex - e.originalEvent.changedTouches[0].clientX) > 10 || Math.abs(ey - e.originalEvent.changedTouches[0].clientY) > 10)) {\n          clearTimeout(cto);\n          $.vakata.context.hide();\n        }\n      }).on('touchend.vakata.jstree', function (e) {\n        if (cto) {\n          clearTimeout(cto);\n        }\n      });\n      /*!\n      if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) {\n      \tvar el = null, tm = null;\n      \tthis.element\n      \t\t.on(\"touchstart\", \".jstree-anchor\", function (e) {\n      \t\t\tel = e.currentTarget;\n      \t\t\ttm = +new Date();\n      \t\t\t$(document).one(\"touchend\", function (e) {\n      \t\t\t\te.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset);\n      \t\t\t\te.currentTarget = e.target;\n      \t\t\t\ttm = ((+(new Date())) - tm);\n      \t\t\t\tif(e.target === el && tm > 600 && tm < 1000) {\n      \t\t\t\t\te.preventDefault();\n      \t\t\t\t\t$(el).trigger('contextmenu', e);\n      \t\t\t\t}\n      \t\t\t\tel = null;\n      \t\t\t\ttm = null;\n      \t\t\t});\n      \t\t});\n      }\n      */\n\n      $(document).on(\"context_hide.vakata.jstree\", function (e, data) {\n        this._data.contextmenu.visible = false;\n        $(data.reference).removeClass('jstree-context');\n      }.bind(this));\n    };\n\n    this.teardown = function () {\n      if (this._data.contextmenu.visible) {\n        $.vakata.context.hide();\n      }\n\n      $(document).off(\"context_hide.vakata.jstree\");\n      parent.teardown.call(this);\n    };\n    /**\n     * prepare and show the context menu for a node\n     * @name show_contextmenu(obj [, x, y])\n     * @param {mixed} obj the node\n     * @param {Number} x the x-coordinate relative to the document to show the menu at\n     * @param {Number} y the y-coordinate relative to the document to show the menu at\n     * @param {Object} e the event if available that triggered the contextmenu\n     * @plugin contextmenu\n     * @trigger show_contextmenu.jstree\n     */\n\n\n    this.show_contextmenu = function (obj, x, y, e) {\n      obj = this.get_node(obj);\n\n      if (!obj || obj.id === $.jstree.root) {\n        return false;\n      }\n\n      var s = this.settings.contextmenu,\n          d = this.get_node(obj, true),\n          a = d.children(\".jstree-anchor\"),\n          o = false,\n          i = false;\n\n      if (s.show_at_node || x === undefined || y === undefined) {\n        o = a.offset();\n        x = o.left;\n        y = o.top + this._data.core.li_height;\n      }\n\n      if (this.settings.contextmenu.select_node && !this.is_selected(obj)) {\n        this.activate_node(obj, e);\n      }\n\n      i = s.items;\n\n      if ($.vakata.is_function(i)) {\n        i = i.call(this, obj, function (i) {\n          this._show_contextmenu(obj, x, y, i);\n        }.bind(this));\n      }\n\n      if ($.isPlainObject(i)) {\n        this._show_contextmenu(obj, x, y, i);\n      }\n    };\n    /**\n     * show the prepared context menu for a node\n     * @name _show_contextmenu(obj, x, y, i)\n     * @param {mixed} obj the node\n     * @param {Number} x the x-coordinate relative to the document to show the menu at\n     * @param {Number} y the y-coordinate relative to the document to show the menu at\n     * @param {Number} i the object of items to show\n     * @plugin contextmenu\n     * @trigger show_contextmenu.jstree\n     * @private\n     */\n\n\n    this._show_contextmenu = function (obj, x, y, i) {\n      var d = this.get_node(obj, true),\n          a = d.children(\".jstree-anchor\");\n      $(document).one(\"context_show.vakata.jstree\", function (e, data) {\n        var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu';\n        $(data.element).addClass(cls);\n        a.addClass('jstree-context');\n      }.bind(this));\n      this._data.contextmenu.visible = true;\n      $.vakata.context.show(a, {\n        'x': x,\n        'y': y\n      }, i);\n      /**\n       * triggered when the contextmenu is shown for a node\n       * @event\n       * @name show_contextmenu.jstree\n       * @param {Object} node the node\n       * @param {Number} x the x-coordinate of the menu relative to the document\n       * @param {Number} y the y-coordinate of the menu relative to the document\n       * @plugin contextmenu\n       */\n\n      this.trigger('show_contextmenu', {\n        \"node\": obj,\n        \"x\": x,\n        \"y\": y\n      });\n    };\n  }; // contextmenu helper\n\n\n  (function ($) {\n    var right_to_left = false,\n        vakata_context = {\n      element: false,\n      reference: false,\n      position_x: 0,\n      position_y: 0,\n      items: [],\n      html: \"\",\n      is_visible: false\n    };\n    $.vakata.context = {\n      settings: {\n        hide_onmouseleave: 0,\n        icons: true\n      },\n      _trigger: function _trigger(event_name) {\n        $(document).triggerHandler(\"context_\" + event_name + \".vakata\", {\n          \"reference\": vakata_context.reference,\n          \"element\": vakata_context.element,\n          \"position\": {\n            \"x\": vakata_context.position_x,\n            \"y\": vakata_context.position_y\n          }\n        });\n      },\n      _execute: function _execute(i) {\n        i = vakata_context.items[i];\n        return i && (!i._disabled || $.vakata.is_function(i._disabled) && !i._disabled({\n          \"item\": i,\n          \"reference\": vakata_context.reference,\n          \"element\": vakata_context.element\n        })) && i.action ? i.action.call(null, {\n          \"item\": i,\n          \"reference\": vakata_context.reference,\n          \"element\": vakata_context.element,\n          \"position\": {\n            \"x\": vakata_context.position_x,\n            \"y\": vakata_context.position_y\n          }\n        }) : false;\n      },\n      _parse: function _parse(o, is_callback) {\n        if (!o) {\n          return false;\n        }\n\n        if (!is_callback) {\n          vakata_context.html = \"\";\n          vakata_context.items = [];\n        }\n\n        var str = \"\",\n            sep = false,\n            tmp;\n\n        if (is_callback) {\n          str += \"<\" + \"ul>\";\n        }\n\n        $.each(o, function (i, val) {\n          if (!val) {\n            return true;\n          }\n\n          vakata_context.items.push(val);\n\n          if (!sep && val.separator_before) {\n            str += \"<\" + \"li class='vakata-context-separator'><\" + \"a href='#' \" + ($.vakata.context.settings.icons ? '' : 'class=\"vakata-context-no-icons\"') + \">&#160;<\" + \"/a><\" + \"/li>\";\n          }\n\n          sep = false;\n          str += \"<\" + \"li class='\" + (val._class || \"\") + (val._disabled === true || $.vakata.is_function(val._disabled) && val._disabled({\n            \"item\": val,\n            \"reference\": vakata_context.reference,\n            \"element\": vakata_context.element\n          }) ? \" vakata-contextmenu-disabled \" : \"\") + \"' \" + (val.shortcut ? \" data-shortcut='\" + val.shortcut + \"' \" : '') + \">\";\n          str += \"<\" + \"a href='#' rel='\" + (vakata_context.items.length - 1) + \"' \" + (val.title ? \"title='\" + val.title + \"'\" : \"\") + \">\";\n\n          if ($.vakata.context.settings.icons) {\n            str += \"<\" + \"i \";\n\n            if (val.icon) {\n              if (val.icon.indexOf(\"/\") !== -1 || val.icon.indexOf(\".\") !== -1) {\n                str += \" style='background:url(\\\"\" + val.icon + \"\\\") center center no-repeat' \";\n              } else {\n                str += \" class='\" + val.icon + \"' \";\n              }\n            }\n\n            str += \"><\" + \"/i><\" + \"span class='vakata-contextmenu-sep'>&#160;<\" + \"/span>\";\n          }\n\n          str += ($.vakata.is_function(val.label) ? val.label({\n            \"item\": i,\n            \"reference\": vakata_context.reference,\n            \"element\": vakata_context.element\n          }) : val.label) + (val.shortcut ? ' <span class=\"vakata-contextmenu-shortcut vakata-contextmenu-shortcut-' + val.shortcut + '\">' + (val.shortcut_label || '') + '</span>' : '') + \"<\" + \"/a>\";\n\n          if (val.submenu) {\n            tmp = $.vakata.context._parse(val.submenu, true);\n\n            if (tmp) {\n              str += tmp;\n            }\n          }\n\n          str += \"<\" + \"/li>\";\n\n          if (val.separator_after) {\n            str += \"<\" + \"li class='vakata-context-separator'><\" + \"a href='#' \" + ($.vakata.context.settings.icons ? '' : 'class=\"vakata-context-no-icons\"') + \">&#160;<\" + \"/a><\" + \"/li>\";\n            sep = true;\n          }\n        });\n        str = str.replace(/<li class\\='vakata-context-separator'\\><\\/li\\>$/, \"\");\n\n        if (is_callback) {\n          str += \"</ul>\";\n        }\n        /**\n         * triggered on the document when the contextmenu is parsed (HTML is built)\n         * @event\n         * @plugin contextmenu\n         * @name context_parse.vakata\n         * @param {jQuery} reference the element that was right clicked\n         * @param {jQuery} element the DOM element of the menu itself\n         * @param {Object} position the x & y coordinates of the menu\n         */\n\n\n        if (!is_callback) {\n          vakata_context.html = str;\n\n          $.vakata.context._trigger(\"parse\");\n        }\n\n        return str.length > 10 ? str : false;\n      },\n      _show_submenu: function _show_submenu(o) {\n        o = $(o);\n\n        if (!o.length || !o.children(\"ul\").length) {\n          return;\n        }\n\n        var e = o.children(\"ul\"),\n            xl = o.offset().left,\n            x = xl + o.outerWidth(),\n            y = o.offset().top,\n            w = e.width(),\n            h = e.height(),\n            dw = $(window).width() + $(window).scrollLeft(),\n            dh = $(window).height() + $(window).scrollTop(); // може да се спести е една проверка - дали няма някой от класовете вече нагоре\n\n        if (right_to_left) {\n          o[x - (w + 10 + o.outerWidth()) < 0 ? \"addClass\" : \"removeClass\"](\"vakata-context-left\");\n        } else {\n          o[x + w > dw && xl > dw - x ? \"addClass\" : \"removeClass\"](\"vakata-context-right\");\n        }\n\n        if (y + h + 10 > dh) {\n          e.css(\"bottom\", \"-1px\");\n        } //if does not fit - stick it to the side\n\n\n        if (o.hasClass('vakata-context-right')) {\n          if (xl < w) {\n            e.css(\"margin-right\", xl - w);\n          }\n        } else {\n          if (dw - x < w) {\n            e.css(\"margin-left\", dw - x - w);\n          }\n        }\n\n        e.show();\n      },\n      show: function show(reference, position, data) {\n        var o,\n            e,\n            x,\n            y,\n            w,\n            h,\n            dw,\n            dh,\n            cond = true;\n\n        if (vakata_context.element && vakata_context.element.length) {\n          vakata_context.element.width('');\n        }\n\n        switch (cond) {\n          case !position && !reference:\n            return false;\n\n          case !!position && !!reference:\n            vakata_context.reference = reference;\n            vakata_context.position_x = position.x;\n            vakata_context.position_y = position.y;\n            break;\n\n          case !position && !!reference:\n            vakata_context.reference = reference;\n            o = reference.offset();\n            vakata_context.position_x = o.left + reference.outerHeight();\n            vakata_context.position_y = o.top;\n            break;\n\n          case !!position && !reference:\n            vakata_context.position_x = position.x;\n            vakata_context.position_y = position.y;\n            break;\n        }\n\n        if (!!reference && !data && $(reference).data('vakata_contextmenu')) {\n          data = $(reference).data('vakata_contextmenu');\n        }\n\n        if ($.vakata.context._parse(data)) {\n          vakata_context.element.html(vakata_context.html);\n        }\n\n        if (vakata_context.items.length) {\n          vakata_context.element.appendTo(document.body);\n          e = vakata_context.element;\n          x = vakata_context.position_x;\n          y = vakata_context.position_y;\n          w = e.width();\n          h = e.height();\n          dw = $(window).width() + $(window).scrollLeft();\n          dh = $(window).height() + $(window).scrollTop();\n\n          if (right_to_left) {\n            x -= e.outerWidth() - $(reference).outerWidth();\n\n            if (x < $(window).scrollLeft() + 20) {\n              x = $(window).scrollLeft() + 20;\n            }\n          }\n\n          if (x + w + 20 > dw) {\n            x = dw - (w + 20);\n          }\n\n          if (y + h + 20 > dh) {\n            y = dh - (h + 20);\n          }\n\n          vakata_context.element.css({\n            \"left\": x,\n            \"top\": y\n          }).show().find('a').first().trigger('focus').parent().addClass(\"vakata-context-hover\");\n          vakata_context.is_visible = true;\n          /**\n           * triggered on the document when the contextmenu is shown\n           * @event\n           * @plugin contextmenu\n           * @name context_show.vakata\n           * @param {jQuery} reference the element that was right clicked\n           * @param {jQuery} element the DOM element of the menu itself\n           * @param {Object} position the x & y coordinates of the menu\n           */\n\n          $.vakata.context._trigger(\"show\");\n        }\n      },\n      hide: function hide() {\n        if (vakata_context.is_visible) {\n          vakata_context.element.hide().find(\"ul\").hide().end().find(':focus').trigger('blur').end().detach();\n          vakata_context.is_visible = false;\n          /**\n           * triggered on the document when the contextmenu is hidden\n           * @event\n           * @plugin contextmenu\n           * @name context_hide.vakata\n           * @param {jQuery} reference the element that was right clicked\n           * @param {jQuery} element the DOM element of the menu itself\n           * @param {Object} position the x & y coordinates of the menu\n           */\n\n          $.vakata.context._trigger(\"hide\");\n        }\n      }\n    };\n    $(function () {\n      right_to_left = $(document.body).css(\"direction\") === \"rtl\";\n      var to = false;\n      vakata_context.element = $(\"<ul class='vakata-context'></ul>\");\n      vakata_context.element.on(\"mouseenter\", \"li\", function (e) {\n        e.stopImmediatePropagation();\n\n        if ($.contains(this, e.relatedTarget)) {\n          // премахнато заради delegate mouseleave по-долу\n          // $(this).find(\".vakata-context-hover\").removeClass(\"vakata-context-hover\");\n          return;\n        }\n\n        if (to) {\n          clearTimeout(to);\n        }\n\n        vakata_context.element.find(\".vakata-context-hover\").removeClass(\"vakata-context-hover\").end();\n        $(this).siblings().find(\"ul\").hide().end().end().parentsUntil(\".vakata-context\", \"li\").addBack().addClass(\"vakata-context-hover\");\n\n        $.vakata.context._show_submenu(this);\n      }) // тестово - дали не натоварва?\n      .on(\"mouseleave\", \"li\", function (e) {\n        if ($.contains(this, e.relatedTarget)) {\n          return;\n        }\n\n        $(this).find(\".vakata-context-hover\").addBack().removeClass(\"vakata-context-hover\");\n      }).on(\"mouseleave\", function (e) {\n        $(this).find(\".vakata-context-hover\").removeClass(\"vakata-context-hover\");\n\n        if ($.vakata.context.settings.hide_onmouseleave) {\n          to = setTimeout(function (t) {\n            return function () {\n              $.vakata.context.hide();\n            };\n          }(this), $.vakata.context.settings.hide_onmouseleave);\n        }\n      }).on(\"click\", \"a\", function (e) {\n        e.preventDefault(); //})\n        //.on(\"mouseup\", \"a\", function (e) {\n\n        if (!$(this).trigger('blur').parent().hasClass(\"vakata-context-disabled\") && $.vakata.context._execute($(this).attr(\"rel\")) !== false) {\n          $.vakata.context.hide();\n        }\n      }).on('keydown', 'a', function (e) {\n        var o = null;\n\n        switch (e.which) {\n          case 13:\n          case 32:\n            e.type = \"click\";\n            e.preventDefault();\n            $(e.currentTarget).trigger(e);\n            break;\n\n          case 37:\n            if (vakata_context.is_visible) {\n              vakata_context.element.find(\".vakata-context-hover\").last().closest(\"li\").first().find(\"ul\").hide().find(\".vakata-context-hover\").removeClass(\"vakata-context-hover\").end().end().children('a').trigger('focus');\n              e.stopImmediatePropagation();\n              e.preventDefault();\n            }\n\n            break;\n\n          case 38:\n            if (vakata_context.is_visible) {\n              o = vakata_context.element.find(\"ul:visible\").addBack().last().children(\".vakata-context-hover\").removeClass(\"vakata-context-hover\").prevAll(\"li:not(.vakata-context-separator)\").first();\n\n              if (!o.length) {\n                o = vakata_context.element.find(\"ul:visible\").addBack().last().children(\"li:not(.vakata-context-separator)\").last();\n              }\n\n              o.addClass(\"vakata-context-hover\").children('a').trigger('focus');\n              e.stopImmediatePropagation();\n              e.preventDefault();\n            }\n\n            break;\n\n          case 39:\n            if (vakata_context.is_visible) {\n              vakata_context.element.find(\".vakata-context-hover\").last().children(\"ul\").show().children(\"li:not(.vakata-context-separator)\").removeClass(\"vakata-context-hover\").first().addClass(\"vakata-context-hover\").children('a').trigger('focus');\n              e.stopImmediatePropagation();\n              e.preventDefault();\n            }\n\n            break;\n\n          case 40:\n            if (vakata_context.is_visible) {\n              o = vakata_context.element.find(\"ul:visible\").addBack().last().children(\".vakata-context-hover\").removeClass(\"vakata-context-hover\").nextAll(\"li:not(.vakata-context-separator)\").first();\n\n              if (!o.length) {\n                o = vakata_context.element.find(\"ul:visible\").addBack().last().children(\"li:not(.vakata-context-separator)\").first();\n              }\n\n              o.addClass(\"vakata-context-hover\").children('a').trigger('focus');\n              e.stopImmediatePropagation();\n              e.preventDefault();\n            }\n\n            break;\n\n          case 27:\n            $.vakata.context.hide();\n            e.preventDefault();\n            break;\n\n          default:\n            //console.log(e.which);\n            break;\n        }\n      }).on('keydown', function (e) {\n        e.preventDefault();\n        var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent();\n\n        if (a.parent().not('.vakata-context-disabled')) {\n          a.trigger('click');\n        }\n      });\n      $(document).on(\"mousedown.vakata.jstree\", function (e) {\n        if (vakata_context.is_visible && vakata_context.element[0] !== e.target && !$.contains(vakata_context.element[0], e.target)) {\n          $.vakata.context.hide();\n        }\n      }).on(\"context_show.vakata.jstree\", function (e, data) {\n        vakata_context.element.find(\"li:has(ul)\").children(\"a\").addClass(\"vakata-context-parent\");\n\n        if (right_to_left) {\n          vakata_context.element.addClass(\"vakata-context-rtl\").css(\"direction\", \"rtl\");\n        } // also apply a RTL class?\n\n\n        vakata_context.element.find(\"ul\").hide().end();\n      });\n    });\n  })($); // $.jstree.defaults.plugins.push(\"contextmenu\");\n\n  /**\n   * ### Drag'n'drop plugin\n   *\n   * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations.\n   */\n\n  /**\n   * stores all defaults for the drag'n'drop plugin\n   * @name $.jstree.defaults.dnd\n   * @plugin dnd\n   */\n\n\n  $.jstree.defaults.dnd = {\n    /**\n     * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`.\n     * @name $.jstree.defaults.dnd.copy\n     * @plugin dnd\n     */\n    copy: true,\n\n    /**\n     * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`.\n     * @name $.jstree.defaults.dnd.open_timeout\n     * @plugin dnd\n     */\n    open_timeout: 500,\n\n    /**\n     * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging\n     * @name $.jstree.defaults.dnd.is_draggable\n     * @plugin dnd\n     */\n    is_draggable: true,\n\n    /**\n     * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true`\n     * @name $.jstree.defaults.dnd.check_while_dragging\n     * @plugin dnd\n     */\n    check_while_dragging: true,\n\n    /**\n     * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false`\n     * @name $.jstree.defaults.dnd.always_copy\n     * @plugin dnd\n     */\n    always_copy: false,\n\n    /**\n     * when dropping a node \"inside\", this setting indicates the position the node should go to - it can be an integer or a string: \"first\" (same as 0) or \"last\", default is `0`\n     * @name $.jstree.defaults.dnd.inside_pos\n     * @plugin dnd\n     */\n    inside_pos: 0,\n\n    /**\n     * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node\n     * @name $.jstree.defaults.dnd.drag_selection\n     * @plugin dnd\n     */\n    drag_selection: true,\n\n    /**\n     * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string \"selected\" which means only selected nodes can be dragged on touch devices.\n     * @name $.jstree.defaults.dnd.touch\n     * @plugin dnd\n     */\n    touch: true,\n\n    /**\n     * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target.\n     * @name $.jstree.defaults.dnd.large_drop_target\n     * @plugin dnd\n     */\n    large_drop_target: false,\n\n    /**\n     * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to \"selected\".\n     * @name $.jstree.defaults.dnd.large_drag_target\n     * @plugin dnd\n     */\n    large_drag_target: false,\n\n    /**\n     * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls.\n     * @reference http://caniuse.com/#feat=dragndrop\n     * @name $.jstree.defaults.dnd.use_html5\n     * @plugin dnd\n     */\n    use_html5: false\n  };\n  var drg, elm; // TODO: now check works by checking for each node individually, how about max_children, unique, etc?\n\n  $.jstree.plugins.dnd = function (options, parent) {\n    this.init = function (el, options) {\n      parent.init.call(this, el, options);\n      this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && 'draggable' in document.createElement('span');\n    };\n\n    this.bind = function () {\n      parent.bind.call(this);\n      this.element.on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', function (e) {\n        if (this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) {\n          return true;\n        }\n\n        if (e.type === \"touchstart\" && (!this.settings.dnd.touch || this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked'))) {\n          return true;\n        }\n\n        var obj = this.get_node(e.target),\n            mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1,\n            txt = mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget);\n\n        if (this.settings.core.force_text) {\n          txt = $.vakata.html.escape(txt);\n        }\n\n        if (obj && obj.id && obj.id !== $.jstree.root && (e.which === 1 || e.type === \"touchstart\" || e.type === \"dragstart\") && (this.settings.dnd.is_draggable === true || $.vakata.is_function(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, mlt > 1 ? this.get_top_selected(true) : [obj], e))) {\n          drg = {\n            'jstree': true,\n            'origin': this,\n            'obj': this.get_node(obj, true),\n            'nodes': mlt > 1 ? this.get_top_selected() : [obj.id]\n          };\n          elm = e.currentTarget;\n\n          if (this.settings.dnd.use_html5) {\n            $.vakata.dnd._trigger('start', e, {\n              'helper': $(),\n              'element': elm,\n              'data': drg\n            });\n          } else {\n            this.element.trigger('mousedown.jstree');\n            return $.vakata.dnd.start(e, drg, '<div id=\"jstree-dnd\" class=\"jstree-' + this.get_theme() + ' jstree-' + this.get_theme() + '-' + this.get_theme_variant() + ' ' + (this.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '') + '\"><i class=\"jstree-icon jstree-er\"></i>' + txt + '<ins class=\"jstree-copy\">+</ins></div>');\n          }\n        }\n      }.bind(this));\n\n      if (this.settings.dnd.use_html5) {\n        this.element.on('dragover.jstree', function (e) {\n          e.preventDefault();\n\n          $.vakata.dnd._trigger('move', e, {\n            'helper': $(),\n            'element': elm,\n            'data': drg\n          });\n\n          return false;\n        }) //.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) {\n        //\t\te.preventDefault();\n        //\t\t$.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });\n        //\t\treturn false;\n        //\t}, this))\n        .on('drop.jstree', function (e) {\n          e.preventDefault();\n\n          $.vakata.dnd._trigger('stop', e, {\n            'helper': $(),\n            'element': elm,\n            'data': drg\n          });\n\n          return false;\n        }.bind(this));\n      }\n    };\n\n    this.redraw_node = function (obj, deep, callback, force_render) {\n      obj = parent.redraw_node.apply(this, arguments);\n\n      if (obj && this.settings.dnd.use_html5) {\n        if (this.settings.dnd.large_drag_target) {\n          obj.setAttribute('draggable', true);\n        } else {\n          var i,\n              j,\n              tmp = null;\n\n          for (i = 0, j = obj.childNodes.length; i < j; i++) {\n            if (obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf(\"jstree-anchor\") !== -1) {\n              tmp = obj.childNodes[i];\n              break;\n            }\n          }\n\n          if (tmp) {\n            tmp.setAttribute('draggable', true);\n          }\n        }\n      }\n\n      return obj;\n    };\n  };\n\n  $(function () {\n    // bind only once for all instances\n    var lastmv = false,\n        laster = false,\n        lastev = false,\n        opento = false,\n        marker = $('<div id=\"jstree-marker\">&#160;</div>').hide(); //.appendTo('body');\n\n    $(document).on('dragover.vakata.jstree', function (e) {\n      if (elm) {\n        $.vakata.dnd._trigger('move', e, {\n          'helper': $(),\n          'element': elm,\n          'data': drg\n        });\n      }\n    }).on('drop.vakata.jstree', function (e) {\n      if (elm) {\n        $.vakata.dnd._trigger('stop', e, {\n          'helper': $(),\n          'element': elm,\n          'data': drg\n        });\n\n        elm = null;\n        drg = null;\n      }\n    }).on('dnd_start.vakata.jstree', function (e, data) {\n      lastmv = false;\n      lastev = false;\n\n      if (!data || !data.data || !data.data.jstree) {\n        return;\n      }\n\n      marker.appendTo(document.body); //.show();\n    }).on('dnd_move.vakata.jstree', function (e, data) {\n      var isDifferentNode = data.event.target !== lastev.target;\n\n      if (opento) {\n        if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {\n          clearTimeout(opento);\n        }\n      }\n\n      if (!data || !data.data || !data.data.jstree) {\n        return;\n      } // if we are hovering the marker image do nothing (can happen on \"inside\" drags)\n\n\n      if (data.event.target.id && data.event.target.id === 'jstree-marker') {\n        return;\n      }\n\n      lastev = data.event;\n      var ins = $.jstree.reference(data.event.target),\n          ref = false,\n          off = false,\n          rel = false,\n          tmp,\n          l,\n          t,\n          h,\n          p,\n          i,\n          o,\n          ok,\n          t1,\n          t2,\n          op,\n          ps,\n          pr,\n          ip,\n          tm,\n          is_copy,\n          pn,\n          c; // if we are over an instance\n\n      if (ins && ins._data && ins._data.dnd) {\n        marker.attr('class', 'jstree-' + ins.get_theme() + (ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : ''));\n        is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey));\n        data.helper.children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + (ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '')).find('.jstree-copy').first()[is_copy ? 'show' : 'hide'](); // if are hovering the container itself add a new root node\n        //console.log(data.event);\n\n        if ((data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && ins.get_container_ul().children().length === 0) {\n          ok = true;\n\n          for (t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {\n            ok = ok && ins.check(data.data.origin && (data.data.origin.settings.dnd.always_copy || data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ? \"copy_node\" : \"move_node\", data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1], $.jstree.root, 'last', {\n              'dnd': true,\n              'ref': ins.get_node($.jstree.root),\n              'pos': 'i',\n              'origin': data.data.origin,\n              'is_multi': data.data.origin && data.data.origin !== ins,\n              'is_foreign': !data.data.origin\n            });\n\n            if (!ok) {\n              break;\n            }\n          }\n\n          if (ok) {\n            lastmv = {\n              'ins': ins,\n              'par': $.jstree.root,\n              'pos': 'last'\n            };\n            marker.hide();\n            data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');\n\n            if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {\n              data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';\n            }\n\n            return;\n          }\n        } else {\n          // if we are hovering a tree node\n          ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor');\n\n          if (ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {\n            off = ref.offset();\n            rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top;\n            h = ref.outerHeight();\n\n            if (rel < h / 3) {\n              o = ['b', 'i', 'a'];\n            } else if (rel > h - h / 3) {\n              o = ['a', 'i', 'b'];\n            } else {\n              o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a'];\n            }\n\n            $.each(o, function (j, v) {\n              switch (v) {\n                case 'b':\n                  l = off.left - 6;\n                  t = off.top;\n                  p = ins.get_parent(ref);\n                  i = ref.parent().index();\n                  c = 'jstree-below';\n                  break;\n\n                case 'i':\n                  ip = ins.settings.dnd.inside_pos;\n                  tm = ins.get_node(ref.parent());\n                  l = off.left - 2;\n                  t = off.top + h / 2 + 1;\n                  p = tm.id;\n                  i = ip === 'first' ? 0 : ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length);\n                  c = 'jstree-inside';\n                  break;\n\n                case 'a':\n                  l = off.left - 6;\n                  t = off.top + h;\n                  p = ins.get_parent(ref);\n                  i = ref.parent().index() + 1;\n                  c = 'jstree-above';\n                  break;\n              }\n\n              ok = true;\n\n              for (t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {\n                op = data.data.origin && (data.data.origin.settings.dnd.always_copy || data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ? \"copy_node\" : \"move_node\";\n                ps = i;\n\n                if (op === \"move_node\" && v === 'a' && data.data.origin && data.data.origin === ins && p === ins.get_parent(data.data.nodes[t1])) {\n                  pr = ins.get_node(p);\n\n                  if (ps > $.inArray(data.data.nodes[t1], pr.children)) {\n                    ps -= 1;\n                  }\n                }\n\n                ok = ok && (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false || ins.check(op, data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1], p, ps, {\n                  'dnd': true,\n                  'ref': ins.get_node(ref.parent()),\n                  'pos': v,\n                  'origin': data.data.origin,\n                  'is_multi': data.data.origin && data.data.origin !== ins,\n                  'is_foreign': !data.data.origin\n                }));\n\n                if (!ok) {\n                  if (ins && ins.last_error) {\n                    laster = ins.last_error();\n                  }\n\n                  break;\n                }\n              }\n\n              if (v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) {\n                if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {\n                  if (opento) {\n                    clearTimeout(opento);\n                  }\n\n                  opento = setTimeout(function (x, z) {\n                    return function () {\n                      x.open_node(z);\n                    };\n                  }(ins, ref), ins.settings.dnd.open_timeout);\n                }\n              }\n\n              if (ok) {\n                pn = ins.get_node(p, true);\n\n                if (!pn.hasClass('.jstree-dnd-parent')) {\n                  $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');\n                  pn.addClass('jstree-dnd-parent');\n                }\n\n                lastmv = {\n                  'ins': ins,\n                  'par': p,\n                  'pos': v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i\n                };\n                marker.css({\n                  'left': l + 'px',\n                  'top': t + 'px'\n                }).show();\n                marker.removeClass('jstree-above jstree-inside jstree-below').addClass(c);\n                data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');\n\n                if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {\n                  data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';\n                }\n\n                laster = {};\n                o = true;\n                return false;\n              }\n            });\n\n            if (o === true) {\n              return;\n            }\n          }\n        }\n      }\n\n      $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');\n      lastmv = false;\n      data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');\n\n      if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {//data.event.originalEvent.dataTransfer.dropEffect = 'none';\n      }\n\n      marker.hide();\n    }).on('dnd_scroll.vakata.jstree', function (e, data) {\n      if (!data || !data.data || !data.data.jstree) {\n        return;\n      }\n\n      marker.hide();\n      lastmv = false;\n      lastev = false;\n      data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er');\n    }).on('dnd_stop.vakata.jstree', function (e, data) {\n      $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');\n\n      if (opento) {\n        clearTimeout(opento);\n      }\n\n      if (!data || !data.data || !data.data.jstree) {\n        return;\n      }\n\n      marker.hide().detach();\n      var i,\n          j,\n          nodes = [];\n\n      if (lastmv) {\n        for (i = 0, j = data.data.nodes.length; i < j; i++) {\n          nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i];\n        }\n\n        lastmv.ins[data.data.origin && (data.data.origin.settings.dnd.always_copy || data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ? 'copy_node' : 'move_node'](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin);\n      } else {\n        i = $(data.event.target).closest('.jstree');\n\n        if (i.length && laster && laster.error && laster.error === 'check') {\n          i = i.jstree(true);\n\n          if (i) {\n            i.settings.core.error.call(this, laster);\n          }\n        }\n      }\n\n      lastev = false;\n      lastmv = false;\n    }).on('keyup.jstree keydown.jstree', function (e, data) {\n      data = $.vakata.dnd._get();\n\n      if (data && data.data && data.data.jstree) {\n        if (e.type === \"keyup\" && e.which === 27) {\n          if (opento) {\n            clearTimeout(opento);\n          }\n\n          lastmv = false;\n          laster = false;\n          lastev = false;\n          opento = false;\n          marker.hide().detach();\n\n          $.vakata.dnd._clean();\n        } else {\n          data.helper.find('.jstree-copy').first()[data.data.origin && (data.data.origin.settings.dnd.always_copy || data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey)) ? 'show' : 'hide']();\n\n          if (lastev) {\n            lastev.metaKey = e.metaKey;\n            lastev.ctrlKey = e.ctrlKey;\n\n            $.vakata.dnd._trigger('move', lastev);\n          }\n        }\n      }\n    });\n  }); // helpers\n\n  (function ($) {\n    $.vakata.html = {\n      div: $('<div></div>'),\n      escape: function escape(str) {\n        return $.vakata.html.div.text(str).html();\n      },\n      strip: function strip(str) {\n        return $.vakata.html.div.empty().append($.parseHTML(str)).text();\n      }\n    }; // private variable\n\n    var vakata_dnd = {\n      element: false,\n      target: false,\n      is_down: false,\n      is_drag: false,\n      helper: false,\n      helper_w: 0,\n      data: false,\n      init_x: 0,\n      init_y: 0,\n      scroll_l: 0,\n      scroll_t: 0,\n      scroll_e: false,\n      scroll_i: false,\n      is_touch: false\n    };\n    $.vakata.dnd = {\n      settings: {\n        scroll_speed: 10,\n        scroll_proximity: 20,\n        helper_left: 5,\n        helper_top: 10,\n        threshold: 5,\n        threshold_touch: 10\n      },\n      _trigger: function _trigger(event_name, e, data) {\n        if (data === undefined) {\n          data = $.vakata.dnd._get();\n        }\n\n        data.event = e;\n        $(document).triggerHandler(\"dnd_\" + event_name + \".vakata\", data);\n      },\n      _get: function _get() {\n        return {\n          \"data\": vakata_dnd.data,\n          \"element\": vakata_dnd.element,\n          \"helper\": vakata_dnd.helper\n        };\n      },\n      _clean: function _clean() {\n        if (vakata_dnd.helper) {\n          vakata_dnd.helper.remove();\n        }\n\n        if (vakata_dnd.scroll_i) {\n          clearInterval(vakata_dnd.scroll_i);\n          vakata_dnd.scroll_i = false;\n        }\n\n        vakata_dnd = {\n          element: false,\n          target: false,\n          is_down: false,\n          is_drag: false,\n          helper: false,\n          helper_w: 0,\n          data: false,\n          init_x: 0,\n          init_y: 0,\n          scroll_l: 0,\n          scroll_t: 0,\n          scroll_e: false,\n          scroll_i: false,\n          is_touch: false\n        };\n        elm = null;\n        $(document).off(\"mousemove.vakata.jstree touchmove.vakata.jstree\", $.vakata.dnd.drag);\n        $(document).off(\"mouseup.vakata.jstree touchend.vakata.jstree\", $.vakata.dnd.stop);\n      },\n      _scroll: function _scroll(init_only) {\n        if (!vakata_dnd.scroll_e || !vakata_dnd.scroll_l && !vakata_dnd.scroll_t) {\n          if (vakata_dnd.scroll_i) {\n            clearInterval(vakata_dnd.scroll_i);\n            vakata_dnd.scroll_i = false;\n          }\n\n          return false;\n        }\n\n        if (!vakata_dnd.scroll_i) {\n          vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100);\n          return false;\n        }\n\n        if (init_only === true) {\n          return false;\n        }\n\n        var i = vakata_dnd.scroll_e.scrollTop(),\n            j = vakata_dnd.scroll_e.scrollLeft();\n        vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed);\n        vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed);\n\n        if (i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) {\n          /**\n           * triggered on the document when a drag causes an element to scroll\n           * @event\n           * @plugin dnd\n           * @name dnd_scroll.vakata\n           * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start\n           * @param {DOM} element the DOM element being dragged\n           * @param {jQuery} helper the helper shown next to the mouse\n           * @param {jQuery} event the element that is scrolling\n           */\n          $.vakata.dnd._trigger(\"scroll\", vakata_dnd.scroll_e);\n        }\n      },\n      start: function start(e, data, html) {\n        if (e.type === \"touchstart\" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {\n          e.pageX = e.originalEvent.changedTouches[0].pageX;\n          e.pageY = e.originalEvent.changedTouches[0].pageY;\n          e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);\n        }\n\n        if (vakata_dnd.is_drag) {\n          $.vakata.dnd.stop({});\n        }\n\n        try {\n          e.currentTarget.unselectable = \"on\";\n\n          e.currentTarget.onselectstart = function () {\n            return false;\n          };\n\n          if (e.currentTarget.style) {\n            e.currentTarget.style.touchAction = \"none\";\n            e.currentTarget.style.msTouchAction = \"none\";\n            e.currentTarget.style.MozUserSelect = \"none\";\n          }\n        } catch (ignore) {}\n\n        vakata_dnd.init_x = e.pageX;\n        vakata_dnd.init_y = e.pageY;\n        vakata_dnd.data = data;\n        vakata_dnd.is_down = true;\n        vakata_dnd.element = e.currentTarget;\n        vakata_dnd.target = e.target;\n        vakata_dnd.is_touch = e.type === \"touchstart\";\n\n        if (html !== false) {\n          vakata_dnd.helper = $(\"<div id='vakata-dnd'></div>\").html(html).css({\n            \"display\": \"block\",\n            \"margin\": \"0\",\n            \"padding\": \"0\",\n            \"position\": \"absolute\",\n            \"top\": \"-2000px\",\n            \"lineHeight\": \"16px\",\n            \"zIndex\": \"10000\"\n          });\n        }\n\n        $(document).on(\"mousemove.vakata.jstree touchmove.vakata.jstree\", $.vakata.dnd.drag);\n        $(document).on(\"mouseup.vakata.jstree touchend.vakata.jstree\", $.vakata.dnd.stop);\n        return false;\n      },\n      drag: function drag(e) {\n        if (e.type === \"touchmove\" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {\n          e.pageX = e.originalEvent.changedTouches[0].pageX;\n          e.pageY = e.originalEvent.changedTouches[0].pageY;\n          e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);\n        }\n\n        if (!vakata_dnd.is_down) {\n          return;\n        }\n\n        if (!vakata_dnd.is_drag) {\n          if (Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) || Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold)) {\n            if (vakata_dnd.helper) {\n              vakata_dnd.helper.appendTo(document.body);\n              vakata_dnd.helper_w = vakata_dnd.helper.outerWidth();\n            }\n\n            vakata_dnd.is_drag = true;\n            $(vakata_dnd.target).one('click.vakata', false);\n            /**\n             * triggered on the document when a drag starts\n             * @event\n             * @plugin dnd\n             * @name dnd_start.vakata\n             * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start\n             * @param {DOM} element the DOM element being dragged\n             * @param {jQuery} helper the helper shown next to the mouse\n             * @param {Object} event the event that caused the start (probably mousemove)\n             */\n\n            $.vakata.dnd._trigger(\"start\", e);\n          } else {\n            return;\n          }\n        }\n\n        var d = false,\n            w = false,\n            dh = false,\n            wh = false,\n            dw = false,\n            ww = false,\n            dt = false,\n            dl = false,\n            ht = false,\n            hl = false;\n        vakata_dnd.scroll_t = 0;\n        vakata_dnd.scroll_l = 0;\n        vakata_dnd.scroll_e = false;\n        $($(e.target).parentsUntil(\"body\").addBack().get().reverse()).filter(function () {\n          return /^auto|scroll$/.test($(this).css(\"overflow\")) && (this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth);\n        }).each(function () {\n          var t = $(this),\n              o = t.offset();\n\n          if (this.scrollHeight > this.offsetHeight) {\n            if (o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity) {\n              vakata_dnd.scroll_t = 1;\n            }\n\n            if (e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity) {\n              vakata_dnd.scroll_t = -1;\n            }\n          }\n\n          if (this.scrollWidth > this.offsetWidth) {\n            if (o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity) {\n              vakata_dnd.scroll_l = 1;\n            }\n\n            if (e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity) {\n              vakata_dnd.scroll_l = -1;\n            }\n          }\n\n          if (vakata_dnd.scroll_t || vakata_dnd.scroll_l) {\n            vakata_dnd.scroll_e = $(this);\n            return false;\n          }\n        });\n\n        if (!vakata_dnd.scroll_e) {\n          d = $(document);\n          w = $(window);\n          dh = d.height();\n          wh = w.height();\n          dw = d.width();\n          ww = w.width();\n          dt = d.scrollTop();\n          dl = d.scrollLeft();\n\n          if (dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity) {\n            vakata_dnd.scroll_t = -1;\n          }\n\n          if (dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity) {\n            vakata_dnd.scroll_t = 1;\n          }\n\n          if (dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity) {\n            vakata_dnd.scroll_l = -1;\n          }\n\n          if (dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity) {\n            vakata_dnd.scroll_l = 1;\n          }\n\n          if (vakata_dnd.scroll_t || vakata_dnd.scroll_l) {\n            vakata_dnd.scroll_e = d;\n          }\n        }\n\n        if (vakata_dnd.scroll_e) {\n          $.vakata.dnd._scroll(true);\n        }\n\n        if (vakata_dnd.helper) {\n          ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10);\n          hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10);\n\n          if (dh && ht + 25 > dh) {\n            ht = dh - 50;\n          }\n\n          if (dw && hl + vakata_dnd.helper_w > dw) {\n            hl = dw - (vakata_dnd.helper_w + 2);\n          }\n\n          vakata_dnd.helper.css({\n            left: hl + \"px\",\n            top: ht + \"px\"\n          });\n        }\n        /**\n         * triggered on the document when a drag is in progress\n         * @event\n         * @plugin dnd\n         * @name dnd_move.vakata\n         * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start\n         * @param {DOM} element the DOM element being dragged\n         * @param {jQuery} helper the helper shown next to the mouse\n         * @param {Object} event the event that caused this to trigger (most likely mousemove)\n         */\n\n\n        $.vakata.dnd._trigger(\"move\", e);\n\n        return false;\n      },\n      stop: function stop(e) {\n        if (e.type === \"touchend\" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {\n          e.pageX = e.originalEvent.changedTouches[0].pageX;\n          e.pageY = e.originalEvent.changedTouches[0].pageY;\n          e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);\n        }\n\n        if (vakata_dnd.is_drag) {\n          /**\n           * triggered on the document when a drag stops (the dragged element is dropped)\n           * @event\n           * @plugin dnd\n           * @name dnd_stop.vakata\n           * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start\n           * @param {DOM} element the DOM element being dragged\n           * @param {jQuery} helper the helper shown next to the mouse\n           * @param {Object} event the event that caused the stop\n           */\n          if (e.target !== vakata_dnd.target) {\n            $(vakata_dnd.target).off('click.vakata');\n          }\n\n          $.vakata.dnd._trigger(\"stop\", e);\n        } else {\n          if (e.type === \"touchend\" && e.target === vakata_dnd.target) {\n            var to = setTimeout(function () {\n              $(e.target).trigger('click');\n            }, 100);\n            $(e.target).one('click', function () {\n              if (to) {\n                clearTimeout(to);\n              }\n            });\n          }\n        }\n\n        $.vakata.dnd._clean();\n\n        return false;\n      }\n    };\n  })($); // include the dnd plugin by default\n  // $.jstree.defaults.plugins.push(\"dnd\");\n\n  /**\n   * ### Massload plugin\n   *\n   * Adds massload functionality to jsTree, so that multiple nodes can be loaded in a single request (only useful with lazy loading).\n   */\n\n  /**\n   * massload configuration\n   *\n   * It is possible to set this to a standard jQuery-like AJAX config.\n   * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node IDs need to be loaded, the return value of those functions will be used.\n   *\n   * You can also set this to a function, that function will receive the node IDs being loaded as argument and a second param which is a function (callback) which should be called with the result.\n   *\n   * Both the AJAX and the function approach rely on the same return value - an object where the keys are the node IDs, and the value is the children of that node as an array.\n   *\n   *\t{\n   *\t\t\"id1\" : [{ \"text\" : \"Child of ID1\", \"id\" : \"c1\" }, { \"text\" : \"Another child of ID1\", \"id\" : \"c2\" }],\n   *\t\t\"id2\" : [{ \"text\" : \"Child of ID2\", \"id\" : \"c3\" }]\n   *\t}\n   * \n   * @name $.jstree.defaults.massload\n   * @plugin massload\n   */\n\n\n  $.jstree.defaults.massload = null;\n\n  $.jstree.plugins.massload = function (options, parent) {\n    this.init = function (el, options) {\n      this._data.massload = {};\n      parent.init.call(this, el, options);\n    };\n\n    this._load_nodes = function (nodes, callback, is_callback, force_reload) {\n      var s = this.settings.massload,\n          toLoad = [],\n          m = this._model.data,\n          i,\n          j,\n          dom;\n\n      if (!is_callback) {\n        for (i = 0, j = nodes.length; i < j; i++) {\n          if (!m[nodes[i]] || !m[nodes[i]].state.loaded && !m[nodes[i]].state.failed || force_reload) {\n            toLoad.push(nodes[i]);\n            dom = this.get_node(nodes[i], true);\n\n            if (dom && dom.length) {\n              dom.addClass(\"jstree-loading\").attr('aria-busy', true);\n            }\n          }\n        }\n\n        this._data.massload = {};\n\n        if (toLoad.length) {\n          if ($.vakata.is_function(s)) {\n            return s.call(this, toLoad, function (data) {\n              var i, j;\n\n              if (data) {\n                for (i in data) {\n                  if (data.hasOwnProperty(i)) {\n                    this._data.massload[i] = data[i];\n                  }\n                }\n              }\n\n              for (i = 0, j = nodes.length; i < j; i++) {\n                dom = this.get_node(nodes[i], true);\n\n                if (dom && dom.length) {\n                  dom.removeClass(\"jstree-loading\").attr('aria-busy', false);\n                }\n              }\n\n              parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);\n            }.bind(this));\n          }\n\n          if (_typeof(s) === 'object' && s && s.url) {\n            s = $.extend(true, {}, s);\n\n            if ($.vakata.is_function(s.url)) {\n              s.url = s.url.call(this, toLoad);\n            }\n\n            if ($.vakata.is_function(s.data)) {\n              s.data = s.data.call(this, toLoad);\n            }\n\n            return $.ajax(s).done(function (data, t, x) {\n              var i, j;\n\n              if (data) {\n                for (i in data) {\n                  if (data.hasOwnProperty(i)) {\n                    this._data.massload[i] = data[i];\n                  }\n                }\n              }\n\n              for (i = 0, j = nodes.length; i < j; i++) {\n                dom = this.get_node(nodes[i], true);\n\n                if (dom && dom.length) {\n                  dom.removeClass(\"jstree-loading\").attr('aria-busy', false);\n                }\n              }\n\n              parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);\n            }.bind(this)).fail(function (f) {\n              parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);\n            }.bind(this));\n          }\n        }\n      }\n\n      return parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);\n    };\n\n    this._load_node = function (obj, callback) {\n      var data = this._data.massload[obj.id],\n          rslt = null,\n          dom;\n\n      if (data) {\n        rslt = this[typeof data === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof data === 'string' ? $($.parseHTML(data)).filter(function () {\n          return this.nodeType !== 3;\n        }) : data, function (status) {\n          callback.call(this, status);\n        });\n        dom = this.get_node(obj.id, true);\n\n        if (dom && dom.length) {\n          dom.removeClass(\"jstree-loading\").attr('aria-busy', false);\n        }\n\n        delete this._data.massload[obj.id];\n        return rslt;\n      }\n\n      return parent._load_node.call(this, obj, callback);\n    };\n  };\n  /**\n   * ### Search plugin\n   *\n   * Adds search functionality to jsTree.\n   */\n\n  /**\n   * stores all defaults for the search plugin\n   * @name $.jstree.defaults.search\n   * @plugin search\n   */\n\n\n  $.jstree.defaults.search = {\n    /**\n     * a jQuery-like AJAX config, which jstree uses if a server should be queried for results.\n     *\n     * A `str` (which is the search string) parameter will be added with the request, an optional `inside` parameter will be added if the search is limited to a node id. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed.\n     * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 3 parameters - the search string, the callback to call with the array of nodes to load, and the optional node ID to limit the search to\n     * @name $.jstree.defaults.search.ajax\n     * @plugin search\n     */\n    ajax: false,\n\n    /**\n     * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`.\n     * @name $.jstree.defaults.search.fuzzy\n     * @plugin search\n     */\n    fuzzy: false,\n\n    /**\n     * Indicates if the search should be case sensitive. Default is `false`.\n     * @name $.jstree.defaults.search.case_sensitive\n     * @plugin search\n     */\n    case_sensitive: false,\n\n    /**\n     * Indicates if the tree should be filtered (by default) to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers).\n     * This setting can be changed at runtime when calling the search method. Default is `false`.\n     * @name $.jstree.defaults.search.show_only_matches\n     * @plugin search\n     */\n    show_only_matches: false,\n\n    /**\n     * Indicates if the children of matched element are shown (when show_only_matches is true)\n     * This setting can be changed at runtime when calling the search method. Default is `false`.\n     * @name $.jstree.defaults.search.show_only_matches_children\n     * @plugin search\n     */\n    show_only_matches_children: false,\n\n    /**\n     * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`.\n     * @name $.jstree.defaults.search.close_opened_onclear\n     * @plugin search\n     */\n    close_opened_onclear: true,\n\n    /**\n     * Indicates if only leaf nodes should be included in search results. Default is `false`.\n     * @name $.jstree.defaults.search.search_leaves_only\n     * @plugin search\n     */\n    search_leaves_only: false,\n\n    /**\n     * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution).\n     * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`.\n     * @name $.jstree.defaults.search.search_callback\n     * @plugin search\n     */\n    search_callback: false\n  };\n\n  $.jstree.plugins.search = function (options, parent) {\n    this.bind = function () {\n      parent.bind.call(this);\n      this._data.search.str = \"\";\n      this._data.search.dom = $();\n      this._data.search.res = [];\n      this._data.search.opn = [];\n      this._data.search.som = false;\n      this._data.search.smc = false;\n      this._data.search.hdn = [];\n      this.element.on(\"search.jstree\", function (e, data) {\n        if (this._data.search.som && data.res.length) {\n          var m = this._model.data,\n              i,\n              j,\n              p = [],\n              k,\n              l;\n\n          for (i = 0, j = data.res.length; i < j; i++) {\n            if (m[data.res[i]] && !m[data.res[i]].state.hidden) {\n              p.push(data.res[i]);\n              p = p.concat(m[data.res[i]].parents);\n\n              if (this._data.search.smc) {\n                for (k = 0, l = m[data.res[i]].children_d.length; k < l; k++) {\n                  if (m[m[data.res[i]].children_d[k]] && !m[m[data.res[i]].children_d[k]].state.hidden) {\n                    p.push(m[data.res[i]].children_d[k]);\n                  }\n                }\n              }\n            }\n          }\n\n          p = $.vakata.array_remove_item($.vakata.array_unique(p), $.jstree.root);\n          this._data.search.hdn = this.hide_all(true);\n          this.show_node(p, true);\n          this.redraw(true);\n        }\n      }.bind(this)).on(\"clear_search.jstree\", function (e, data) {\n        if (this._data.search.som && data.res.length) {\n          this.show_node(this._data.search.hdn, true);\n          this.redraw(true);\n        }\n      }.bind(this));\n    };\n    /**\n     * used to search the tree nodes for a given string\n     * @name search(str [, skip_async])\n     * @param {String} str the search string\n     * @param {Boolean} skip_async if set to true server will not be queried even if configured\n     * @param {Boolean} show_only_matches if set to true only matching nodes will be shown (keep in mind this can be very slow on large trees or old browsers)\n     * @param {mixed} inside an optional node to whose children to limit the search\n     * @param {Boolean} append if set to true the results of this search are appended to the previous search\n     * @plugin search\n     * @trigger search.jstree\n     */\n\n\n    this.search = function (str, skip_async, show_only_matches, inside, append, show_only_matches_children) {\n      if (str === false || $.vakata.trim(str.toString()) === \"\") {\n        return this.clear_search();\n      }\n\n      inside = this.get_node(inside);\n      inside = inside && inside.id ? inside.id : null;\n      str = str.toString();\n      var s = this.settings.search,\n          a = s.ajax ? s.ajax : false,\n          m = this._model.data,\n          f = null,\n          r = [],\n          p = [],\n          i,\n          j;\n\n      if (this._data.search.res.length && !append) {\n        this.clear_search();\n      }\n\n      if (show_only_matches === undefined) {\n        show_only_matches = s.show_only_matches;\n      }\n\n      if (show_only_matches_children === undefined) {\n        show_only_matches_children = s.show_only_matches_children;\n      }\n\n      if (!skip_async && a !== false) {\n        if ($.vakata.is_function(a)) {\n          return a.call(this, str, function (d) {\n            if (d && d.d) {\n              d = d.d;\n            }\n\n            this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () {\n              this.search(str, true, show_only_matches, inside, append, show_only_matches_children);\n            });\n          }.bind(this), inside);\n        } else {\n          a = $.extend({}, a);\n\n          if (!a.data) {\n            a.data = {};\n          }\n\n          a.data.str = str;\n\n          if (inside) {\n            a.data.inside = inside;\n          }\n\n          if (this._data.search.lastRequest) {\n            this._data.search.lastRequest.abort();\n          }\n\n          this._data.search.lastRequest = $.ajax(a).fail(function () {\n            this._data.core.last_error = {\n              'error': 'ajax',\n              'plugin': 'search',\n              'id': 'search_01',\n              'reason': 'Could not load search parents',\n              'data': JSON.stringify(a)\n            };\n            this.settings.core.error.call(this, this._data.core.last_error);\n          }.bind(this)).done(function (d) {\n            if (d && d.d) {\n              d = d.d;\n            }\n\n            this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () {\n              this.search(str, true, show_only_matches, inside, append, show_only_matches_children);\n            });\n          }.bind(this));\n          return this._data.search.lastRequest;\n        }\n      }\n\n      if (!append) {\n        this._data.search.str = str;\n        this._data.search.dom = $();\n        this._data.search.res = [];\n        this._data.search.opn = [];\n        this._data.search.som = show_only_matches;\n        this._data.search.smc = show_only_matches_children;\n      }\n\n      f = new $.vakata.search(str, true, {\n        caseSensitive: s.case_sensitive,\n        fuzzy: s.fuzzy\n      });\n      $.each(m[inside ? inside : $.jstree.root].children_d, function (ii, i) {\n        var v = m[i];\n\n        if (v.text && !v.state.hidden && (!s.search_leaves_only || v.state.loaded && v.children.length === 0) && (s.search_callback && s.search_callback.call(this, str, v) || !s.search_callback && f.search(v.text).isMatch)) {\n          r.push(i);\n          p = p.concat(v.parents);\n        }\n      });\n\n      if (r.length) {\n        p = $.vakata.array_unique(p);\n\n        for (i = 0, j = p.length; i < j; i++) {\n          if (p[i] !== $.jstree.root && m[p[i]] && this.open_node(p[i], null, 0) === true) {\n            this._data.search.opn.push(p[i]);\n          }\n        }\n\n        if (!append) {\n          this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) {\n            return \"0123456789\".indexOf(v[0]) !== -1 ? '\\\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex, '\\\\$&') : v.replace($.jstree.idregex, '\\\\$&');\n          }).join(', #')));\n          this._data.search.res = r;\n        } else {\n          this._data.search.dom = this._data.search.dom.add($(this.element[0].querySelectorAll('#' + $.map(r, function (v) {\n            return \"0123456789\".indexOf(v[0]) !== -1 ? '\\\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex, '\\\\$&') : v.replace($.jstree.idregex, '\\\\$&');\n          }).join(', #'))));\n          this._data.search.res = $.vakata.array_unique(this._data.search.res.concat(r));\n        }\n\n        this._data.search.dom.children(\".jstree-anchor\").addClass('jstree-search');\n      }\n      /**\n       * triggered after search is complete\n       * @event\n       * @name search.jstree\n       * @param {jQuery} nodes a jQuery collection of matching nodes\n       * @param {String} str the search string\n       * @param {Array} res a collection of objects represeing the matching nodes\n       * @plugin search\n       */\n\n\n      this.trigger('search', {\n        nodes: this._data.search.dom,\n        str: str,\n        res: this._data.search.res,\n        show_only_matches: show_only_matches\n      });\n    };\n    /**\n     * used to clear the last search (removes classes and shows all nodes if filtering is on)\n     * @name clear_search()\n     * @plugin search\n     * @trigger clear_search.jstree\n     */\n\n\n    this.clear_search = function () {\n      if (this.settings.search.close_opened_onclear) {\n        this.close_node(this._data.search.opn, 0);\n      }\n      /**\n       * triggered after search is complete\n       * @event\n       * @name clear_search.jstree\n       * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search)\n       * @param {String} str the search string (the last search string)\n       * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search)\n       * @plugin search\n       */\n\n\n      this.trigger('clear_search', {\n        'nodes': this._data.search.dom,\n        str: this._data.search.str,\n        res: this._data.search.res\n      });\n\n      if (this._data.search.res.length) {\n        this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(this._data.search.res, function (v) {\n          return \"0123456789\".indexOf(v[0]) !== -1 ? '\\\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex, '\\\\$&') : v.replace($.jstree.idregex, '\\\\$&');\n        }).join(', #')));\n\n        this._data.search.dom.children(\".jstree-anchor\").removeClass(\"jstree-search\");\n      }\n\n      this._data.search.str = \"\";\n      this._data.search.res = [];\n      this._data.search.opn = [];\n      this._data.search.dom = $();\n    };\n\n    this.redraw_node = function (obj, deep, callback, force_render) {\n      obj = parent.redraw_node.apply(this, arguments);\n\n      if (obj) {\n        if ($.inArray(obj.id, this._data.search.res) !== -1) {\n          var i,\n              j,\n              tmp = null;\n\n          for (i = 0, j = obj.childNodes.length; i < j; i++) {\n            if (obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf(\"jstree-anchor\") !== -1) {\n              tmp = obj.childNodes[i];\n              break;\n            }\n          }\n\n          if (tmp) {\n            tmp.className += ' jstree-search';\n          }\n        }\n      }\n\n      return obj;\n    };\n  }; // helpers\n\n\n  (function ($) {\n    // from http://kiro.me/projects/fuse.html\n    $.vakata.search = function (pattern, txt, options) {\n      options = options || {};\n      options = $.extend({}, $.vakata.search.defaults, options);\n\n      if (options.fuzzy !== false) {\n        options.fuzzy = true;\n      }\n\n      pattern = options.caseSensitive ? pattern : pattern.toLowerCase();\n      var MATCH_LOCATION = options.location,\n          MATCH_DISTANCE = options.distance,\n          MATCH_THRESHOLD = options.threshold,\n          patternLen = pattern.length,\n          matchmask,\n          pattern_alphabet,\n          match_bitapScore,\n          search;\n\n      if (patternLen > 32) {\n        options.fuzzy = false;\n      }\n\n      if (options.fuzzy) {\n        matchmask = 1 << patternLen - 1;\n\n        pattern_alphabet = function () {\n          var mask = {},\n              i = 0;\n\n          for (i = 0; i < patternLen; i++) {\n            mask[pattern.charAt(i)] = 0;\n          }\n\n          for (i = 0; i < patternLen; i++) {\n            mask[pattern.charAt(i)] |= 1 << patternLen - i - 1;\n          }\n\n          return mask;\n        }();\n\n        match_bitapScore = function match_bitapScore(e, x) {\n          var accuracy = e / patternLen,\n              proximity = Math.abs(MATCH_LOCATION - x);\n\n          if (!MATCH_DISTANCE) {\n            return proximity ? 1.0 : accuracy;\n          }\n\n          return accuracy + proximity / MATCH_DISTANCE;\n        };\n      }\n\n      search = function search(text) {\n        text = options.caseSensitive ? text : text.toLowerCase();\n\n        if (pattern === text || text.indexOf(pattern) !== -1) {\n          return {\n            isMatch: true,\n            score: 0\n          };\n        }\n\n        if (!options.fuzzy) {\n          return {\n            isMatch: false,\n            score: 1\n          };\n        }\n\n        var i,\n            j,\n            textLen = text.length,\n            scoreThreshold = MATCH_THRESHOLD,\n            bestLoc = text.indexOf(pattern, MATCH_LOCATION),\n            binMin,\n            binMid,\n            binMax = patternLen + textLen,\n            lastRd,\n            start,\n            finish,\n            rd,\n            charMatch,\n            score = 1,\n            locations = [];\n\n        if (bestLoc !== -1) {\n          scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);\n          bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen);\n\n          if (bestLoc !== -1) {\n            scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);\n          }\n        }\n\n        bestLoc = -1;\n\n        for (i = 0; i < patternLen; i++) {\n          binMin = 0;\n          binMid = binMax;\n\n          while (binMin < binMid) {\n            if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) {\n              binMin = binMid;\n            } else {\n              binMax = binMid;\n            }\n\n            binMid = Math.floor((binMax - binMin) / 2 + binMin);\n          }\n\n          binMax = binMid;\n          start = Math.max(1, MATCH_LOCATION - binMid + 1);\n          finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen;\n          rd = new Array(finish + 2);\n          rd[finish + 1] = (1 << i) - 1;\n\n          for (j = finish; j >= start; j--) {\n            charMatch = pattern_alphabet[text.charAt(j - 1)];\n\n            if (i === 0) {\n              rd[j] = (rd[j + 1] << 1 | 1) & charMatch;\n            } else {\n              rd[j] = (rd[j + 1] << 1 | 1) & charMatch | ((lastRd[j + 1] | lastRd[j]) << 1 | 1) | lastRd[j + 1];\n            }\n\n            if (rd[j] & matchmask) {\n              score = match_bitapScore(i, j - 1);\n\n              if (score <= scoreThreshold) {\n                scoreThreshold = score;\n                bestLoc = j - 1;\n                locations.push(bestLoc);\n\n                if (bestLoc > MATCH_LOCATION) {\n                  start = Math.max(1, 2 * MATCH_LOCATION - bestLoc);\n                } else {\n                  break;\n                }\n              }\n            }\n          }\n\n          if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) {\n            break;\n          }\n\n          lastRd = rd;\n        }\n\n        return {\n          isMatch: bestLoc >= 0,\n          score: score\n        };\n      };\n\n      return txt === true ? {\n        'search': search\n      } : search(txt);\n    };\n\n    $.vakata.search.defaults = {\n      location: 0,\n      distance: 100,\n      threshold: 0.6,\n      fuzzy: false,\n      caseSensitive: false\n    };\n  })($); // include the search plugin by default\n  // $.jstree.defaults.plugins.push(\"search\");\n\n  /**\n   * ### Sort plugin\n   *\n   * Automatically sorts all siblings in the tree according to a sorting function.\n   */\n\n  /**\n   * the settings function used to sort the nodes.\n   * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`.\n   * @name $.jstree.defaults.sort\n   * @plugin sort\n   */\n\n\n  $.jstree.defaults.sort = function (a, b) {\n    //return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b);\n    return this.get_text(a) > this.get_text(b) ? 1 : -1;\n  };\n\n  $.jstree.plugins.sort = function (options, parent) {\n    this.bind = function () {\n      parent.bind.call(this);\n      this.element.on(\"model.jstree\", function (e, data) {\n        this.sort(data.parent, true);\n      }.bind(this)).on(\"rename_node.jstree create_node.jstree\", function (e, data) {\n        this.sort(data.parent || data.node.parent, false);\n        this.redraw_node(data.parent || data.node.parent, true);\n      }.bind(this)).on(\"move_node.jstree copy_node.jstree\", function (e, data) {\n        this.sort(data.parent, false);\n        this.redraw_node(data.parent, true);\n      }.bind(this));\n    };\n    /**\n     * used to sort a node's children\n     * @private\n     * @name sort(obj [, deep])\n     * @param  {mixed} obj the node\n     * @param {Boolean} deep if set to `true` nodes are sorted recursively.\n     * @plugin sort\n     * @trigger search.jstree\n     */\n\n\n    this.sort = function (obj, deep) {\n      var i, j;\n      obj = this.get_node(obj);\n\n      if (obj && obj.children && obj.children.length) {\n        obj.children.sort(this.settings.sort.bind(this));\n\n        if (deep) {\n          for (i = 0, j = obj.children_d.length; i < j; i++) {\n            this.sort(obj.children_d[i], false);\n          }\n        }\n      }\n    };\n  }; // include the sort plugin by default\n  // $.jstree.defaults.plugins.push(\"sort\");\n\n  /**\n   * ### State plugin\n   *\n   * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)\n   */\n\n\n  var to = false;\n  /**\n   * stores all defaults for the state plugin\n   * @name $.jstree.defaults.state\n   * @plugin state\n   */\n\n  $.jstree.defaults.state = {\n    /**\n     * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.\n     * @name $.jstree.defaults.state.key\n     * @plugin state\n     */\n    key: 'jstree',\n\n    /**\n     * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.\n     * @name $.jstree.defaults.state.events\n     * @plugin state\n     */\n    events: 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',\n\n    /**\n     * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.\n     * @name $.jstree.defaults.state.ttl\n     * @plugin state\n     */\n    ttl: false,\n\n    /**\n     * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state.\n     * @name $.jstree.defaults.state.filter\n     * @plugin state\n     */\n    filter: false,\n\n    /**\n     * Should loaded nodes be restored (setting this to true means that it is possible that the whole tree will be loaded for some users - use with caution). Defaults to `false`\n     * @name $.jstree.defaults.state.preserve_loaded\n     * @plugin state\n     */\n    preserve_loaded: false\n  };\n\n  $.jstree.plugins.state = function (options, parent) {\n    this.bind = function () {\n      parent.bind.call(this);\n\n      var bind = function () {\n        this.element.on(this.settings.state.events, function () {\n          if (to) {\n            clearTimeout(to);\n          }\n\n          to = setTimeout(function () {\n            this.save_state();\n          }.bind(this), 100);\n        }.bind(this));\n        /**\n         * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore).\n         * @event\n         * @name state_ready.jstree\n         * @plugin state\n         */\n\n        this.trigger('state_ready');\n      }.bind(this);\n\n      this.element.on(\"ready.jstree\", function (e, data) {\n        this.element.one(\"restore_state.jstree\", bind);\n\n        if (!this.restore_state()) {\n          bind();\n        }\n      }.bind(this));\n    };\n    /**\n     * save the state\n     * @name save_state()\n     * @plugin state\n     */\n\n\n    this.save_state = function () {\n      var tm = this.get_state();\n\n      if (!this.settings.state.preserve_loaded) {\n        delete tm.core.loaded;\n      }\n\n      var st = {\n        'state': tm,\n        'ttl': this.settings.state.ttl,\n        'sec': +new Date()\n      };\n      $.vakata.storage.set(this.settings.state.key, JSON.stringify(st));\n    };\n    /**\n     * restore the state from the user's computer\n     * @name restore_state()\n     * @plugin state\n     */\n\n\n    this.restore_state = function () {\n      var k = $.vakata.storage.get(this.settings.state.key);\n\n      if (!!k) {\n        try {\n          k = JSON.parse(k);\n        } catch (ex) {\n          return false;\n        }\n      }\n\n      if (!!k && k.ttl && k.sec && +new Date() - k.sec > k.ttl) {\n        return false;\n      }\n\n      if (!!k && k.state) {\n        k = k.state;\n      }\n\n      if (!!k && $.vakata.is_function(this.settings.state.filter)) {\n        k = this.settings.state.filter.call(this, k);\n      }\n\n      if (!!k) {\n        if (!this.settings.state.preserve_loaded) {\n          delete k.core.loaded;\n        }\n\n        this.element.one(\"set_state.jstree\", function (e, data) {\n          data.instance.trigger('restore_state', {\n            'state': $.extend(true, {}, k)\n          });\n        });\n        this.set_state(k);\n        return true;\n      }\n\n      return false;\n    };\n    /**\n     * clear the state on the user's computer\n     * @name clear_state()\n     * @plugin state\n     */\n\n\n    this.clear_state = function () {\n      return $.vakata.storage.del(this.settings.state.key);\n    };\n  };\n\n  (function ($, undefined) {\n    $.vakata.storage = {\n      // simply specifying the functions in FF throws an error\n      set: function set(key, val) {\n        return window.localStorage.setItem(key, val);\n      },\n      get: function get(key) {\n        return window.localStorage.getItem(key);\n      },\n      del: function del(key) {\n        return window.localStorage.removeItem(key);\n      }\n    };\n  })($); // include the state plugin by default\n  // $.jstree.defaults.plugins.push(\"state\");\n\n  /**\n   * ### Types plugin\n   *\n   * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group.\n   */\n\n  /**\n   * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional).\n   *\n   * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited.\n   * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited.\n   * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits.\n   * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme.\n   * * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data)\n   * * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data)\n   *\n   * There are two predefined types:\n   *\n   * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes.\n   * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified.\n   *\n   * @name $.jstree.defaults.types\n   * @plugin types\n   */\n\n\n  $.jstree.defaults.types = {\n    'default': {}\n  };\n  $.jstree.defaults.types[$.jstree.root] = {};\n\n  $.jstree.plugins.types = function (options, parent) {\n    this.init = function (el, options) {\n      var i, j;\n\n      if (options && options.types && options.types['default']) {\n        for (i in options.types) {\n          if (i !== \"default\" && i !== $.jstree.root && options.types.hasOwnProperty(i)) {\n            for (j in options.types['default']) {\n              if (options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) {\n                options.types[i][j] = options.types['default'][j];\n              }\n            }\n          }\n        }\n      }\n\n      parent.init.call(this, el, options);\n      this._model.data[$.jstree.root].type = $.jstree.root;\n    };\n\n    this.refresh = function (skip_loading, forget_state) {\n      parent.refresh.call(this, skip_loading, forget_state);\n      this._model.data[$.jstree.root].type = $.jstree.root;\n    };\n\n    this.bind = function () {\n      this.element.on('model.jstree', function (e, data) {\n        var m = this._model.data,\n            dpc = data.nodes,\n            t = this.settings.types,\n            i,\n            j,\n            c = 'default',\n            k;\n\n        for (i = 0, j = dpc.length; i < j; i++) {\n          c = 'default';\n\n          if (m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) {\n            c = m[dpc[i]].original.type;\n          }\n\n          if (m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) {\n            c = m[dpc[i]].data.jstree.type;\n          }\n\n          m[dpc[i]].type = c;\n\n          if (m[dpc[i]].icon === true && t[c].icon !== undefined) {\n            m[dpc[i]].icon = t[c].icon;\n          }\n\n          if (t[c].li_attr !== undefined && _typeof(t[c].li_attr) === 'object') {\n            for (k in t[c].li_attr) {\n              if (t[c].li_attr.hasOwnProperty(k)) {\n                if (k === 'id') {\n                  continue;\n                } else if (m[dpc[i]].li_attr[k] === undefined) {\n                  m[dpc[i]].li_attr[k] = t[c].li_attr[k];\n                } else if (k === 'class') {\n                  m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class'];\n                }\n              }\n            }\n          }\n\n          if (t[c].a_attr !== undefined && _typeof(t[c].a_attr) === 'object') {\n            for (k in t[c].a_attr) {\n              if (t[c].a_attr.hasOwnProperty(k)) {\n                if (k === 'id') {\n                  continue;\n                } else if (m[dpc[i]].a_attr[k] === undefined) {\n                  m[dpc[i]].a_attr[k] = t[c].a_attr[k];\n                } else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') {\n                  m[dpc[i]].a_attr['href'] = t[c].a_attr['href'];\n                } else if (k === 'class') {\n                  m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class'];\n                }\n              }\n            }\n          }\n        }\n\n        m[$.jstree.root].type = $.jstree.root;\n      }.bind(this));\n      parent.bind.call(this);\n    };\n\n    this.get_json = function (obj, options, flat) {\n      var i,\n          j,\n          m = this._model.data,\n          opt = options ? $.extend(true, {}, options, {\n        no_id: false\n      }) : {},\n          tmp = parent.get_json.call(this, obj, opt, flat);\n\n      if (tmp === false) {\n        return false;\n      }\n\n      if ($.vakata.is_array(tmp)) {\n        for (i = 0, j = tmp.length; i < j; i++) {\n          tmp[i].type = tmp[i].id && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : \"default\";\n\n          if (options && options.no_id) {\n            delete tmp[i].id;\n\n            if (tmp[i].li_attr && tmp[i].li_attr.id) {\n              delete tmp[i].li_attr.id;\n            }\n\n            if (tmp[i].a_attr && tmp[i].a_attr.id) {\n              delete tmp[i].a_attr.id;\n            }\n          }\n        }\n      } else {\n        tmp.type = tmp.id && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : \"default\";\n\n        if (options && options.no_id) {\n          tmp = this._delete_ids(tmp);\n        }\n      }\n\n      return tmp;\n    };\n\n    this._delete_ids = function (tmp) {\n      if ($.vakata.is_array(tmp)) {\n        for (var i = 0, j = tmp.length; i < j; i++) {\n          tmp[i] = this._delete_ids(tmp[i]);\n        }\n\n        return tmp;\n      }\n\n      delete tmp.id;\n\n      if (tmp.li_attr && tmp.li_attr.id) {\n        delete tmp.li_attr.id;\n      }\n\n      if (tmp.a_attr && tmp.a_attr.id) {\n        delete tmp.a_attr.id;\n      }\n\n      if (tmp.children && $.vakata.is_array(tmp.children)) {\n        tmp.children = this._delete_ids(tmp.children);\n      }\n\n      return tmp;\n    };\n\n    this.check = function (chk, obj, par, pos, more) {\n      if (parent.check.call(this, chk, obj, par, pos, more) === false) {\n        return false;\n      }\n\n      obj = obj && obj.id ? obj : this.get_node(obj);\n      par = par && par.id ? par : this.get_node(par);\n      var m = obj && obj.id ? more && more.origin ? more.origin : $.jstree.reference(obj.id) : null,\n          tmp,\n          d,\n          i,\n          j;\n      m = m && m._model && m._model.data ? m._model.data : null;\n\n      switch (chk) {\n        case \"create_node\":\n        case \"move_node\":\n        case \"copy_node\":\n          if (chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) {\n            tmp = this.get_rules(par);\n\n            if (tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) {\n              this._data.core.last_error = {\n                'error': 'check',\n                'plugin': 'types',\n                'id': 'types_01',\n                'reason': 'max_children prevents function: ' + chk,\n                'data': JSON.stringify({\n                  'chk': chk,\n                  'pos': pos,\n                  'obj': obj && obj.id ? obj.id : false,\n                  'par': par && par.id ? par.id : false\n                })\n              };\n              return false;\n            }\n\n            if (tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray(obj.type || 'default', tmp.valid_children) === -1) {\n              this._data.core.last_error = {\n                'error': 'check',\n                'plugin': 'types',\n                'id': 'types_02',\n                'reason': 'valid_children prevents function: ' + chk,\n                'data': JSON.stringify({\n                  'chk': chk,\n                  'pos': pos,\n                  'obj': obj && obj.id ? obj.id : false,\n                  'par': par && par.id ? par.id : false\n                })\n              };\n              return false;\n            }\n\n            if (m && obj.children_d && obj.parents) {\n              d = 0;\n\n              for (i = 0, j = obj.children_d.length; i < j; i++) {\n                d = Math.max(d, m[obj.children_d[i]].parents.length);\n              }\n\n              d = d - obj.parents.length + 1;\n            }\n\n            if (d <= 0 || d === undefined) {\n              d = 1;\n            }\n\n            do {\n              if (tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) {\n                this._data.core.last_error = {\n                  'error': 'check',\n                  'plugin': 'types',\n                  'id': 'types_03',\n                  'reason': 'max_depth prevents function: ' + chk,\n                  'data': JSON.stringify({\n                    'chk': chk,\n                    'pos': pos,\n                    'obj': obj && obj.id ? obj.id : false,\n                    'par': par && par.id ? par.id : false\n                  })\n                };\n                return false;\n              }\n\n              par = this.get_node(par.parent);\n              tmp = this.get_rules(par);\n              d++;\n            } while (par);\n          }\n\n          break;\n      }\n\n      return true;\n    };\n    /**\n     * used to retrieve the type settings object for a node\n     * @name get_rules(obj)\n     * @param {mixed} obj the node to find the rules for\n     * @return {Object}\n     * @plugin types\n     */\n\n\n    this.get_rules = function (obj) {\n      obj = this.get_node(obj);\n\n      if (!obj) {\n        return false;\n      }\n\n      var tmp = this.get_type(obj, true);\n\n      if (tmp.max_depth === undefined) {\n        tmp.max_depth = -1;\n      }\n\n      if (tmp.max_children === undefined) {\n        tmp.max_children = -1;\n      }\n\n      if (tmp.valid_children === undefined) {\n        tmp.valid_children = -1;\n      }\n\n      return tmp;\n    };\n    /**\n     * used to retrieve the type string or settings object for a node\n     * @name get_type(obj [, rules])\n     * @param {mixed} obj the node to find the rules for\n     * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned\n     * @return {String|Object}\n     * @plugin types\n     */\n\n\n    this.get_type = function (obj, rules) {\n      obj = this.get_node(obj);\n      return !obj ? false : rules ? $.extend({\n        'type': obj.type\n      }, this.settings.types[obj.type]) : obj.type;\n    };\n    /**\n     * used to change a node's type\n     * @name set_type(obj, type)\n     * @param {mixed} obj the node to change\n     * @param {String} type the new type\n     * @plugin types\n     */\n\n\n    this.set_type = function (obj, type) {\n      var m = this._model.data,\n          t,\n          t1,\n          t2,\n          old_type,\n          old_icon,\n          k,\n          d,\n          a;\n\n      if ($.vakata.is_array(obj)) {\n        obj = obj.slice();\n\n        for (t1 = 0, t2 = obj.length; t1 < t2; t1++) {\n          this.set_type(obj[t1], type);\n        }\n\n        return true;\n      }\n\n      t = this.settings.types;\n      obj = this.get_node(obj);\n\n      if (!t[type] || !obj) {\n        return false;\n      }\n\n      d = this.get_node(obj, true);\n\n      if (d && d.length) {\n        a = d.children('.jstree-anchor');\n      }\n\n      old_type = obj.type;\n      old_icon = this.get_icon(obj);\n      obj.type = type;\n\n      if (old_icon === true || !t[old_type] || t[old_type].icon !== undefined && old_icon === t[old_type].icon) {\n        this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true);\n      } // remove old type props\n\n\n      if (t[old_type] && t[old_type].li_attr !== undefined && _typeof(t[old_type].li_attr) === 'object') {\n        for (k in t[old_type].li_attr) {\n          if (t[old_type].li_attr.hasOwnProperty(k)) {\n            if (k === 'id') {\n              continue;\n            } else if (k === 'class') {\n              m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], '');\n\n              if (d) {\n                d.removeClass(t[old_type].li_attr[k]);\n              }\n            } else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) {\n              m[obj.id].li_attr[k] = null;\n\n              if (d) {\n                d.removeAttr(k);\n              }\n            }\n          }\n        }\n      }\n\n      if (t[old_type] && t[old_type].a_attr !== undefined && _typeof(t[old_type].a_attr) === 'object') {\n        for (k in t[old_type].a_attr) {\n          if (t[old_type].a_attr.hasOwnProperty(k)) {\n            if (k === 'id') {\n              continue;\n            } else if (k === 'class') {\n              m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], '');\n\n              if (a) {\n                a.removeClass(t[old_type].a_attr[k]);\n              }\n            } else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) {\n              if (k === 'href') {\n                m[obj.id].a_attr[k] = '#';\n\n                if (a) {\n                  a.attr('href', '#');\n                }\n              } else {\n                delete m[obj.id].a_attr[k];\n\n                if (a) {\n                  a.removeAttr(k);\n                }\n              }\n            }\n          }\n        }\n      } // add new props\n\n\n      if (t[type].li_attr !== undefined && _typeof(t[type].li_attr) === 'object') {\n        for (k in t[type].li_attr) {\n          if (t[type].li_attr.hasOwnProperty(k)) {\n            if (k === 'id') {\n              continue;\n            } else if (m[obj.id].li_attr[k] === undefined) {\n              m[obj.id].li_attr[k] = t[type].li_attr[k];\n\n              if (d) {\n                if (k === 'class') {\n                  d.addClass(t[type].li_attr[k]);\n                } else {\n                  d.attr(k, t[type].li_attr[k]);\n                }\n              }\n            } else if (k === 'class') {\n              m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class'];\n\n              if (d) {\n                d.addClass(t[type].li_attr[k]);\n              }\n            }\n          }\n        }\n      }\n\n      if (t[type].a_attr !== undefined && _typeof(t[type].a_attr) === 'object') {\n        for (k in t[type].a_attr) {\n          if (t[type].a_attr.hasOwnProperty(k)) {\n            if (k === 'id') {\n              continue;\n            } else if (m[obj.id].a_attr[k] === undefined) {\n              m[obj.id].a_attr[k] = t[type].a_attr[k];\n\n              if (a) {\n                if (k === 'class') {\n                  a.addClass(t[type].a_attr[k]);\n                } else {\n                  a.attr(k, t[type].a_attr[k]);\n                }\n              }\n            } else if (k === 'href' && m[obj.id].a_attr[k] === '#') {\n              m[obj.id].a_attr['href'] = t[type].a_attr['href'];\n\n              if (a) {\n                a.attr('href', t[type].a_attr['href']);\n              }\n            } else if (k === 'class') {\n              m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class'];\n\n              if (a) {\n                a.addClass(t[type].a_attr[k]);\n              }\n            }\n          }\n        }\n      }\n\n      return true;\n    };\n  }; // include the types plugin by default\n  // $.jstree.defaults.plugins.push(\"types\");\n\n  /**\n   * ### Unique plugin\n   *\n   * Enforces that no nodes with the same name can coexist as siblings.\n   */\n\n  /**\n   * stores all defaults for the unique plugin\n   * @name $.jstree.defaults.unique\n   * @plugin unique\n   */\n\n\n  $.jstree.defaults.unique = {\n    /**\n     * Indicates if the comparison should be case sensitive. Default is `false`.\n     * @name $.jstree.defaults.unique.case_sensitive\n     * @plugin unique\n     */\n    case_sensitive: false,\n\n    /**\n     * Indicates if white space should be trimmed before the comparison. Default is `false`.\n     * @name $.jstree.defaults.unique.trim_whitespace\n     * @plugin unique\n     */\n    trim_whitespace: false,\n\n    /**\n     * A callback executed in the instance's scope when a new node is created and the name is already taken, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`.\n     * @name $.jstree.defaults.unique.duplicate\n     * @plugin unique\n     */\n    duplicate: function duplicate(name, counter) {\n      return name + ' (' + counter + ')';\n    }\n  };\n\n  $.jstree.plugins.unique = function (options, parent) {\n    this.check = function (chk, obj, par, pos, more) {\n      if (parent.check.call(this, chk, obj, par, pos, more) === false) {\n        return false;\n      }\n\n      obj = obj && obj.id ? obj : this.get_node(obj);\n      par = par && par.id ? par : this.get_node(par);\n\n      if (!par || !par.children) {\n        return true;\n      }\n\n      var n = chk === \"rename_node\" ? pos : obj.text,\n          c = [],\n          s = this.settings.unique.case_sensitive,\n          w = this.settings.unique.trim_whitespace,\n          m = this._model.data,\n          i,\n          j,\n          t;\n\n      for (i = 0, j = par.children.length; i < j; i++) {\n        t = m[par.children[i]].text;\n\n        if (!s) {\n          t = t.toLowerCase();\n        }\n\n        if (w) {\n          t = t.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n\n        c.push(t);\n      }\n\n      if (!s) {\n        n = n.toLowerCase();\n      }\n\n      if (w) {\n        n = n.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n      }\n\n      switch (chk) {\n        case \"delete_node\":\n          return true;\n\n        case \"rename_node\":\n          t = obj.text || '';\n\n          if (!s) {\n            t = t.toLowerCase();\n          }\n\n          if (w) {\n            t = t.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n          }\n\n          i = $.inArray(n, c) === -1 || obj.text && t === n;\n\n          if (!i) {\n            this._data.core.last_error = {\n              'error': 'check',\n              'plugin': 'unique',\n              'id': 'unique_01',\n              'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk,\n              'data': JSON.stringify({\n                'chk': chk,\n                'pos': pos,\n                'obj': obj && obj.id ? obj.id : false,\n                'par': par && par.id ? par.id : false\n              })\n            };\n          }\n\n          return i;\n\n        case \"create_node\":\n          i = $.inArray(n, c) === -1;\n\n          if (!i) {\n            this._data.core.last_error = {\n              'error': 'check',\n              'plugin': 'unique',\n              'id': 'unique_04',\n              'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk,\n              'data': JSON.stringify({\n                'chk': chk,\n                'pos': pos,\n                'obj': obj && obj.id ? obj.id : false,\n                'par': par && par.id ? par.id : false\n              })\n            };\n          }\n\n          return i;\n\n        case \"copy_node\":\n          i = $.inArray(n, c) === -1;\n\n          if (!i) {\n            this._data.core.last_error = {\n              'error': 'check',\n              'plugin': 'unique',\n              'id': 'unique_02',\n              'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk,\n              'data': JSON.stringify({\n                'chk': chk,\n                'pos': pos,\n                'obj': obj && obj.id ? obj.id : false,\n                'par': par && par.id ? par.id : false\n              })\n            };\n          }\n\n          return i;\n\n        case \"move_node\":\n          i = obj.parent === par.id && (!more || !more.is_multi) || $.inArray(n, c) === -1;\n\n          if (!i) {\n            this._data.core.last_error = {\n              'error': 'check',\n              'plugin': 'unique',\n              'id': 'unique_03',\n              'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk,\n              'data': JSON.stringify({\n                'chk': chk,\n                'pos': pos,\n                'obj': obj && obj.id ? obj.id : false,\n                'par': par && par.id ? par.id : false\n              })\n            };\n          }\n\n          return i;\n      }\n\n      return true;\n    };\n\n    this.create_node = function (par, node, pos, callback, is_loaded) {\n      if (!node || node.text === undefined) {\n        if (par === null) {\n          par = $.jstree.root;\n        }\n\n        par = this.get_node(par);\n\n        if (!par) {\n          return parent.create_node.call(this, par, node, pos, callback, is_loaded);\n        }\n\n        pos = pos === undefined ? \"last\" : pos;\n\n        if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {\n          return parent.create_node.call(this, par, node, pos, callback, is_loaded);\n        }\n\n        if (!node) {\n          node = {};\n        }\n\n        var tmp,\n            n,\n            dpc,\n            i,\n            j,\n            m = this._model.data,\n            s = this.settings.unique.case_sensitive,\n            w = this.settings.unique.trim_whitespace,\n            cb = this.settings.unique.duplicate,\n            t;\n        n = tmp = this.get_string('New node');\n        dpc = [];\n\n        for (i = 0, j = par.children.length; i < j; i++) {\n          t = m[par.children[i]].text;\n\n          if (!s) {\n            t = t.toLowerCase();\n          }\n\n          if (w) {\n            t = t.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n          }\n\n          dpc.push(t);\n        }\n\n        i = 1;\n        t = n;\n\n        if (!s) {\n          t = t.toLowerCase();\n        }\n\n        if (w) {\n          t = t.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n\n        while ($.inArray(t, dpc) !== -1) {\n          n = cb.call(this, tmp, ++i).toString();\n          t = n;\n\n          if (!s) {\n            t = t.toLowerCase();\n          }\n\n          if (w) {\n            t = t.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n          }\n        }\n\n        node.text = n;\n      }\n\n      return parent.create_node.call(this, par, node, pos, callback, is_loaded);\n    };\n  }; // include the unique plugin by default\n  // $.jstree.defaults.plugins.push(\"unique\");\n\n  /**\n   * ### Wholerow plugin\n   *\n   * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers.\n   */\n\n\n  var div = document.createElement('DIV');\n  div.setAttribute('unselectable', 'on');\n  div.setAttribute('role', 'presentation');\n  div.className = 'jstree-wholerow';\n  div.innerHTML = '&#160;';\n\n  $.jstree.plugins.wholerow = function (options, parent) {\n    this.bind = function () {\n      parent.bind.call(this);\n      this.element.on('ready.jstree set_state.jstree', function () {\n        this.hide_dots();\n      }.bind(this)).on(\"init.jstree loading.jstree ready.jstree\", function () {\n        //div.style.height = this._data.core.li_height + 'px';\n        this.get_container_ul().addClass('jstree-wholerow-ul');\n      }.bind(this)).on(\"deselect_all.jstree\", function (e, data) {\n        this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');\n      }.bind(this)).on(\"changed.jstree\", function (e, data) {\n        this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');\n        var tmp = false,\n            i,\n            j;\n\n        for (i = 0, j = data.selected.length; i < j; i++) {\n          tmp = this.get_node(data.selected[i], true);\n\n          if (tmp && tmp.length) {\n            tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked');\n          }\n        }\n      }.bind(this)).on(\"open_node.jstree\", function (e, data) {\n        this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked');\n      }.bind(this)).on(\"hover_node.jstree dehover_node.jstree\", function (e, data) {\n        if (e.type === \"hover_node\" && this.is_disabled(data.node)) {\n          return;\n        }\n\n        this.get_node(data.node, true).children('.jstree-wholerow')[e.type === \"hover_node\" ? \"addClass\" : \"removeClass\"]('jstree-wholerow-hovered');\n      }.bind(this)).on(\"contextmenu.jstree\", \".jstree-wholerow\", function (e) {\n        if (this._data.contextmenu) {\n          e.preventDefault();\n          var tmp = $.Event('contextmenu', {\n            metaKey: e.metaKey,\n            ctrlKey: e.ctrlKey,\n            altKey: e.altKey,\n            shiftKey: e.shiftKey,\n            pageX: e.pageX,\n            pageY: e.pageY\n          });\n          $(e.currentTarget).closest(\".jstree-node\").children(\".jstree-anchor\").first().trigger(tmp);\n        }\n      }.bind(this))\n      /*!\n      .on(\"mousedown.jstree touchstart.jstree\", \".jstree-wholerow\", function (e) {\n      \t\tif(e.target === e.currentTarget) {\n      \t\t\tvar a = $(e.currentTarget).closest(\".jstree-node\").children(\".jstree-anchor\");\n      \t\t\te.target = a[0];\n      \t\t\ta.trigger(e);\n      \t\t}\n      \t})\n      */\n      .on(\"click.jstree\", \".jstree-wholerow\", function (e) {\n        e.stopImmediatePropagation();\n        var tmp = $.Event('click', {\n          metaKey: e.metaKey,\n          ctrlKey: e.ctrlKey,\n          altKey: e.altKey,\n          shiftKey: e.shiftKey\n        });\n        $(e.currentTarget).closest(\".jstree-node\").children(\".jstree-anchor\").first().trigger(tmp).trigger('focus');\n      }).on(\"dblclick.jstree\", \".jstree-wholerow\", function (e) {\n        e.stopImmediatePropagation();\n        var tmp = $.Event('dblclick', {\n          metaKey: e.metaKey,\n          ctrlKey: e.ctrlKey,\n          altKey: e.altKey,\n          shiftKey: e.shiftKey\n        });\n        $(e.currentTarget).closest(\".jstree-node\").children(\".jstree-anchor\").first().trigger(tmp).trigger('focus');\n      }).on(\"click.jstree\", \".jstree-leaf > .jstree-ocl\", function (e) {\n        e.stopImmediatePropagation();\n        var tmp = $.Event('click', {\n          metaKey: e.metaKey,\n          ctrlKey: e.ctrlKey,\n          altKey: e.altKey,\n          shiftKey: e.shiftKey\n        });\n        $(e.currentTarget).closest(\".jstree-node\").children(\".jstree-anchor\").first().trigger(tmp).trigger('focus');\n      }.bind(this)).on(\"mouseover.jstree\", \".jstree-wholerow, .jstree-icon\", function (e) {\n        e.stopImmediatePropagation();\n\n        if (!this.is_disabled(e.currentTarget)) {\n          this.hover_node(e.currentTarget);\n        }\n\n        return false;\n      }.bind(this)).on(\"mouseleave.jstree\", \".jstree-node\", function (e) {\n        this.dehover_node(e.currentTarget);\n      }.bind(this));\n    };\n\n    this.teardown = function () {\n      if (this.settings.wholerow) {\n        this.element.find(\".jstree-wholerow\").remove();\n      }\n\n      parent.teardown.call(this);\n    };\n\n    this.redraw_node = function (obj, deep, callback, force_render) {\n      obj = parent.redraw_node.apply(this, arguments);\n\n      if (obj) {\n        var tmp = div.cloneNode(true); //tmp.style.height = this._data.core.li_height + 'px';\n\n        if ($.inArray(obj.id, this._data.core.selected) !== -1) {\n          tmp.className += ' jstree-wholerow-clicked';\n        }\n\n        if (this._data.core.focused && this._data.core.focused === obj.id) {\n          tmp.className += ' jstree-wholerow-hovered';\n        }\n\n        obj.insertBefore(tmp, obj.childNodes[0]);\n      }\n\n      return obj;\n    };\n  }; // include the wholerow plugin by default\n  // $.jstree.defaults.plugins.push(\"wholerow\");\n\n\n  if (window.customElements && Object && Object.create) {\n    var proto = Object.create(HTMLElement.prototype);\n\n    proto.createdCallback = function () {\n      var c = {\n        core: {},\n        plugins: []\n      },\n          i;\n\n      for (i in $.jstree.plugins) {\n        if ($.jstree.plugins.hasOwnProperty(i) && this.attributes[i]) {\n          c.plugins.push(i);\n\n          if (this.getAttribute(i) && JSON.parse(this.getAttribute(i))) {\n            c[i] = JSON.parse(this.getAttribute(i));\n          }\n        }\n      }\n\n      for (i in $.jstree.defaults.core) {\n        if ($.jstree.defaults.core.hasOwnProperty(i) && this.attributes[i]) {\n          c.core[i] = JSON.parse(this.getAttribute(i)) || this.getAttribute(i);\n        }\n      }\n\n      $(this).jstree(c);\n    }; // proto.attributeChangedCallback = function (name, previous, value) { };\n\n\n    try {\n      window.customElements.define(\"vakata-jstree\", function () {}, {\n        prototype: proto\n      });\n    } catch (ignore) {}\n  }\n});\n\n//# sourceURL=webpack://rup/./node_modules/jstree/dist/jstree.js?");

/***/ }),

/***/ "./node_modules/moment/locale sync recursive ^\\.\\/.*$":
/*!**************************************************!*\
  !*** ./node_modules/moment/locale sync ^\.\/.*$ ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var map = {\n\t\"./af\": \"./node_modules/moment/locale/af.js\",\n\t\"./af.js\": \"./node_modules/moment/locale/af.js\",\n\t\"./ar\": \"./node_modules/moment/locale/ar.js\",\n\t\"./ar-dz\": \"./node_modules/moment/locale/ar-dz.js\",\n\t\"./ar-dz.js\": \"./node_modules/moment/locale/ar-dz.js\",\n\t\"./ar-kw\": \"./node_modules/moment/locale/ar-kw.js\",\n\t\"./ar-kw.js\": \"./node_modules/moment/locale/ar-kw.js\",\n\t\"./ar-ly\": \"./node_modules/moment/locale/ar-ly.js\",\n\t\"./ar-ly.js\": \"./node_modules/moment/locale/ar-ly.js\",\n\t\"./ar-ma\": \"./node_modules/moment/locale/ar-ma.js\",\n\t\"./ar-ma.js\": \"./node_modules/moment/locale/ar-ma.js\",\n\t\"./ar-sa\": \"./node_modules/moment/locale/ar-sa.js\",\n\t\"./ar-sa.js\": \"./node_modules/moment/locale/ar-sa.js\",\n\t\"./ar-tn\": \"./node_modules/moment/locale/ar-tn.js\",\n\t\"./ar-tn.js\": \"./node_modules/moment/locale/ar-tn.js\",\n\t\"./ar.js\": \"./node_modules/moment/locale/ar.js\",\n\t\"./az\": \"./node_modules/moment/locale/az.js\",\n\t\"./az.js\": \"./node_modules/moment/locale/az.js\",\n\t\"./be\": \"./node_modules/moment/locale/be.js\",\n\t\"./be.js\": \"./node_modules/moment/locale/be.js\",\n\t\"./bg\": \"./node_modules/moment/locale/bg.js\",\n\t\"./bg.js\": \"./node_modules/moment/locale/bg.js\",\n\t\"./bm\": \"./node_modules/moment/locale/bm.js\",\n\t\"./bm.js\": \"./node_modules/moment/locale/bm.js\",\n\t\"./bn\": \"./node_modules/moment/locale/bn.js\",\n\t\"./bn-bd\": \"./node_modules/moment/locale/bn-bd.js\",\n\t\"./bn-bd.js\": \"./node_modules/moment/locale/bn-bd.js\",\n\t\"./bn.js\": \"./node_modules/moment/locale/bn.js\",\n\t\"./bo\": \"./node_modules/moment/locale/bo.js\",\n\t\"./bo.js\": \"./node_modules/moment/locale/bo.js\",\n\t\"./br\": \"./node_modules/moment/locale/br.js\",\n\t\"./br.js\": \"./node_modules/moment/locale/br.js\",\n\t\"./bs\": \"./node_modules/moment/locale/bs.js\",\n\t\"./bs.js\": \"./node_modules/moment/locale/bs.js\",\n\t\"./ca\": \"./node_modules/moment/locale/ca.js\",\n\t\"./ca.js\": \"./node_modules/moment/locale/ca.js\",\n\t\"./cs\": \"./node_modules/moment/locale/cs.js\",\n\t\"./cs.js\": \"./node_modules/moment/locale/cs.js\",\n\t\"./cv\": \"./node_modules/moment/locale/cv.js\",\n\t\"./cv.js\": \"./node_modules/moment/locale/cv.js\",\n\t\"./cy\": \"./node_modules/moment/locale/cy.js\",\n\t\"./cy.js\": \"./node_modules/moment/locale/cy.js\",\n\t\"./da\": \"./node_modules/moment/locale/da.js\",\n\t\"./da.js\": \"./node_modules/moment/locale/da.js\",\n\t\"./de\": \"./node_modules/moment/locale/de.js\",\n\t\"./de-at\": \"./node_modules/moment/locale/de-at.js\",\n\t\"./de-at.js\": \"./node_modules/moment/locale/de-at.js\",\n\t\"./de-ch\": \"./node_modules/moment/locale/de-ch.js\",\n\t\"./de-ch.js\": \"./node_modules/moment/locale/de-ch.js\",\n\t\"./de.js\": \"./node_modules/moment/locale/de.js\",\n\t\"./dv\": \"./node_modules/moment/locale/dv.js\",\n\t\"./dv.js\": \"./node_modules/moment/locale/dv.js\",\n\t\"./el\": \"./node_modules/moment/locale/el.js\",\n\t\"./el.js\": \"./node_modules/moment/locale/el.js\",\n\t\"./en-au\": \"./node_modules/moment/locale/en-au.js\",\n\t\"./en-au.js\": \"./node_modules/moment/locale/en-au.js\",\n\t\"./en-ca\": \"./node_modules/moment/locale/en-ca.js\",\n\t\"./en-ca.js\": \"./node_modules/moment/locale/en-ca.js\",\n\t\"./en-gb\": \"./node_modules/moment/locale/en-gb.js\",\n\t\"./en-gb.js\": \"./node_modules/moment/locale/en-gb.js\",\n\t\"./en-ie\": \"./node_modules/moment/locale/en-ie.js\",\n\t\"./en-ie.js\": \"./node_modules/moment/locale/en-ie.js\",\n\t\"./en-il\": \"./node_modules/moment/locale/en-il.js\",\n\t\"./en-il.js\": \"./node_modules/moment/locale/en-il.js\",\n\t\"./en-in\": \"./node_modules/moment/locale/en-in.js\",\n\t\"./en-in.js\": \"./node_modules/moment/locale/en-in.js\",\n\t\"./en-nz\": \"./node_modules/moment/locale/en-nz.js\",\n\t\"./en-nz.js\": \"./node_modules/moment/locale/en-nz.js\",\n\t\"./en-sg\": \"./node_modules/moment/locale/en-sg.js\",\n\t\"./en-sg.js\": \"./node_modules/moment/locale/en-sg.js\",\n\t\"./eo\": \"./node_modules/moment/locale/eo.js\",\n\t\"./eo.js\": \"./node_modules/moment/locale/eo.js\",\n\t\"./es\": \"./node_modules/moment/locale/es.js\",\n\t\"./es-do\": \"./node_modules/moment/locale/es-do.js\",\n\t\"./es-do.js\": \"./node_modules/moment/locale/es-do.js\",\n\t\"./es-mx\": \"./node_modules/moment/locale/es-mx.js\",\n\t\"./es-mx.js\": \"./node_modules/moment/locale/es-mx.js\",\n\t\"./es-us\": \"./node_modules/moment/locale/es-us.js\",\n\t\"./es-us.js\": \"./node_modules/moment/locale/es-us.js\",\n\t\"./es.js\": \"./node_modules/moment/locale/es.js\",\n\t\"./et\": \"./node_modules/moment/locale/et.js\",\n\t\"./et.js\": \"./node_modules/moment/locale/et.js\",\n\t\"./eu\": \"./node_modules/moment/locale/eu.js\",\n\t\"./eu.js\": \"./node_modules/moment/locale/eu.js\",\n\t\"./fa\": \"./node_modules/moment/locale/fa.js\",\n\t\"./fa.js\": \"./node_modules/moment/locale/fa.js\",\n\t\"./fi\": \"./node_modules/moment/locale/fi.js\",\n\t\"./fi.js\": \"./node_modules/moment/locale/fi.js\",\n\t\"./fil\": \"./node_modules/moment/locale/fil.js\",\n\t\"./fil.js\": \"./node_modules/moment/locale/fil.js\",\n\t\"./fo\": \"./node_modules/moment/locale/fo.js\",\n\t\"./fo.js\": \"./node_modules/moment/locale/fo.js\",\n\t\"./fr\": \"./node_modules/moment/locale/fr.js\",\n\t\"./fr-ca\": \"./node_modules/moment/locale/fr-ca.js\",\n\t\"./fr-ca.js\": \"./node_modules/moment/locale/fr-ca.js\",\n\t\"./fr-ch\": \"./node_modules/moment/locale/fr-ch.js\",\n\t\"./fr-ch.js\": \"./node_modules/moment/locale/fr-ch.js\",\n\t\"./fr.js\": \"./node_modules/moment/locale/fr.js\",\n\t\"./fy\": \"./node_modules/moment/locale/fy.js\",\n\t\"./fy.js\": \"./node_modules/moment/locale/fy.js\",\n\t\"./ga\": \"./node_modules/moment/locale/ga.js\",\n\t\"./ga.js\": \"./node_modules/moment/locale/ga.js\",\n\t\"./gd\": \"./node_modules/moment/locale/gd.js\",\n\t\"./gd.js\": \"./node_modules/moment/locale/gd.js\",\n\t\"./gl\": \"./node_modules/moment/locale/gl.js\",\n\t\"./gl.js\": \"./node_modules/moment/locale/gl.js\",\n\t\"./gom-deva\": \"./node_modules/moment/locale/gom-deva.js\",\n\t\"./gom-deva.js\": \"./node_modules/moment/locale/gom-deva.js\",\n\t\"./gom-latn\": \"./node_modules/moment/locale/gom-latn.js\",\n\t\"./gom-latn.js\": \"./node_modules/moment/locale/gom-latn.js\",\n\t\"./gu\": \"./node_modules/moment/locale/gu.js\",\n\t\"./gu.js\": \"./node_modules/moment/locale/gu.js\",\n\t\"./he\": \"./node_modules/moment/locale/he.js\",\n\t\"./he.js\": \"./node_modules/moment/locale/he.js\",\n\t\"./hi\": \"./node_modules/moment/locale/hi.js\",\n\t\"./hi.js\": \"./node_modules/moment/locale/hi.js\",\n\t\"./hr\": \"./node_modules/moment/locale/hr.js\",\n\t\"./hr.js\": \"./node_modules/moment/locale/hr.js\",\n\t\"./hu\": \"./node_modules/moment/locale/hu.js\",\n\t\"./hu.js\": \"./node_modules/moment/locale/hu.js\",\n\t\"./hy-am\": \"./node_modules/moment/locale/hy-am.js\",\n\t\"./hy-am.js\": \"./node_modules/moment/locale/hy-am.js\",\n\t\"./id\": \"./node_modules/moment/locale/id.js\",\n\t\"./id.js\": \"./node_modules/moment/locale/id.js\",\n\t\"./is\": \"./node_modules/moment/locale/is.js\",\n\t\"./is.js\": \"./node_modules/moment/locale/is.js\",\n\t\"./it\": \"./node_modules/moment/locale/it.js\",\n\t\"./it-ch\": \"./node_modules/moment/locale/it-ch.js\",\n\t\"./it-ch.js\": \"./node_modules/moment/locale/it-ch.js\",\n\t\"./it.js\": \"./node_modules/moment/locale/it.js\",\n\t\"./ja\": \"./node_modules/moment/locale/ja.js\",\n\t\"./ja.js\": \"./node_modules/moment/locale/ja.js\",\n\t\"./jv\": \"./node_modules/moment/locale/jv.js\",\n\t\"./jv.js\": \"./node_modules/moment/locale/jv.js\",\n\t\"./ka\": \"./node_modules/moment/locale/ka.js\",\n\t\"./ka.js\": \"./node_modules/moment/locale/ka.js\",\n\t\"./kk\": \"./node_modules/moment/locale/kk.js\",\n\t\"./kk.js\": \"./node_modules/moment/locale/kk.js\",\n\t\"./km\": \"./node_modules/moment/locale/km.js\",\n\t\"./km.js\": \"./node_modules/moment/locale/km.js\",\n\t\"./kn\": \"./node_modules/moment/locale/kn.js\",\n\t\"./kn.js\": \"./node_modules/moment/locale/kn.js\",\n\t\"./ko\": \"./node_modules/moment/locale/ko.js\",\n\t\"./ko.js\": \"./node_modules/moment/locale/ko.js\",\n\t\"./ku\": \"./node_modules/moment/locale/ku.js\",\n\t\"./ku.js\": \"./node_modules/moment/locale/ku.js\",\n\t\"./ky\": \"./node_modules/moment/locale/ky.js\",\n\t\"./ky.js\": \"./node_modules/moment/locale/ky.js\",\n\t\"./lb\": \"./node_modules/moment/locale/lb.js\",\n\t\"./lb.js\": \"./node_modules/moment/locale/lb.js\",\n\t\"./lo\": \"./node_modules/moment/locale/lo.js\",\n\t\"./lo.js\": \"./node_modules/moment/locale/lo.js\",\n\t\"./lt\": \"./node_modules/moment/locale/lt.js\",\n\t\"./lt.js\": \"./node_modules/moment/locale/lt.js\",\n\t\"./lv\": \"./node_modules/moment/locale/lv.js\",\n\t\"./lv.js\": \"./node_modules/moment/locale/lv.js\",\n\t\"./me\": \"./node_modules/moment/locale/me.js\",\n\t\"./me.js\": \"./node_modules/moment/locale/me.js\",\n\t\"./mi\": \"./node_modules/moment/locale/mi.js\",\n\t\"./mi.js\": \"./node_modules/moment/locale/mi.js\",\n\t\"./mk\": \"./node_modules/moment/locale/mk.js\",\n\t\"./mk.js\": \"./node_modules/moment/locale/mk.js\",\n\t\"./ml\": \"./node_modules/moment/locale/ml.js\",\n\t\"./ml.js\": \"./node_modules/moment/locale/ml.js\",\n\t\"./mn\": \"./node_modules/moment/locale/mn.js\",\n\t\"./mn.js\": \"./node_modules/moment/locale/mn.js\",\n\t\"./mr\": \"./node_modules/moment/locale/mr.js\",\n\t\"./mr.js\": \"./node_modules/moment/locale/mr.js\",\n\t\"./ms\": \"./node_modules/moment/locale/ms.js\",\n\t\"./ms-my\": \"./node_modules/moment/locale/ms-my.js\",\n\t\"./ms-my.js\": \"./node_modules/moment/locale/ms-my.js\",\n\t\"./ms.js\": \"./node_modules/moment/locale/ms.js\",\n\t\"./mt\": \"./node_modules/moment/locale/mt.js\",\n\t\"./mt.js\": \"./node_modules/moment/locale/mt.js\",\n\t\"./my\": \"./node_modules/moment/locale/my.js\",\n\t\"./my.js\": \"./node_modules/moment/locale/my.js\",\n\t\"./nb\": \"./node_modules/moment/locale/nb.js\",\n\t\"./nb.js\": \"./node_modules/moment/locale/nb.js\",\n\t\"./ne\": \"./node_modules/moment/locale/ne.js\",\n\t\"./ne.js\": \"./node_modules/moment/locale/ne.js\",\n\t\"./nl\": \"./node_modules/moment/locale/nl.js\",\n\t\"./nl-be\": \"./node_modules/moment/locale/nl-be.js\",\n\t\"./nl-be.js\": \"./node_modules/moment/locale/nl-be.js\",\n\t\"./nl.js\": \"./node_modules/moment/locale/nl.js\",\n\t\"./nn\": \"./node_modules/moment/locale/nn.js\",\n\t\"./nn.js\": \"./node_modules/moment/locale/nn.js\",\n\t\"./oc-lnc\": \"./node_modules/moment/locale/oc-lnc.js\",\n\t\"./oc-lnc.js\": \"./node_modules/moment/locale/oc-lnc.js\",\n\t\"./pa-in\": \"./node_modules/moment/locale/pa-in.js\",\n\t\"./pa-in.js\": \"./node_modules/moment/locale/pa-in.js\",\n\t\"./pl\": \"./node_modules/moment/locale/pl.js\",\n\t\"./pl.js\": \"./node_modules/moment/locale/pl.js\",\n\t\"./pt\": \"./node_modules/moment/locale/pt.js\",\n\t\"./pt-br\": \"./node_modules/moment/locale/pt-br.js\",\n\t\"./pt-br.js\": \"./node_modules/moment/locale/pt-br.js\",\n\t\"./pt.js\": \"./node_modules/moment/locale/pt.js\",\n\t\"./ro\": \"./node_modules/moment/locale/ro.js\",\n\t\"./ro.js\": \"./node_modules/moment/locale/ro.js\",\n\t\"./ru\": \"./node_modules/moment/locale/ru.js\",\n\t\"./ru.js\": \"./node_modules/moment/locale/ru.js\",\n\t\"./sd\": \"./node_modules/moment/locale/sd.js\",\n\t\"./sd.js\": \"./node_modules/moment/locale/sd.js\",\n\t\"./se\": \"./node_modules/moment/locale/se.js\",\n\t\"./se.js\": \"./node_modules/moment/locale/se.js\",\n\t\"./si\": \"./node_modules/moment/locale/si.js\",\n\t\"./si.js\": \"./node_modules/moment/locale/si.js\",\n\t\"./sk\": \"./node_modules/moment/locale/sk.js\",\n\t\"./sk.js\": \"./node_modules/moment/locale/sk.js\",\n\t\"./sl\": \"./node_modules/moment/locale/sl.js\",\n\t\"./sl.js\": \"./node_modules/moment/locale/sl.js\",\n\t\"./sq\": \"./node_modules/moment/locale/sq.js\",\n\t\"./sq.js\": \"./node_modules/moment/locale/sq.js\",\n\t\"./sr\": \"./node_modules/moment/locale/sr.js\",\n\t\"./sr-cyrl\": \"./node_modules/moment/locale/sr-cyrl.js\",\n\t\"./sr-cyrl.js\": \"./node_modules/moment/locale/sr-cyrl.js\",\n\t\"./sr.js\": \"./node_modules/moment/locale/sr.js\",\n\t\"./ss\": \"./node_modules/moment/locale/ss.js\",\n\t\"./ss.js\": \"./node_modules/moment/locale/ss.js\",\n\t\"./sv\": \"./node_modules/moment/locale/sv.js\",\n\t\"./sv.js\": \"./node_modules/moment/locale/sv.js\",\n\t\"./sw\": \"./node_modules/moment/locale/sw.js\",\n\t\"./sw.js\": \"./node_modules/moment/locale/sw.js\",\n\t\"./ta\": \"./node_modules/moment/locale/ta.js\",\n\t\"./ta.js\": \"./node_modules/moment/locale/ta.js\",\n\t\"./te\": \"./node_modules/moment/locale/te.js\",\n\t\"./te.js\": \"./node_modules/moment/locale/te.js\",\n\t\"./tet\": \"./node_modules/moment/locale/tet.js\",\n\t\"./tet.js\": \"./node_modules/moment/locale/tet.js\",\n\t\"./tg\": \"./node_modules/moment/locale/tg.js\",\n\t\"./tg.js\": \"./node_modules/moment/locale/tg.js\",\n\t\"./th\": \"./node_modules/moment/locale/th.js\",\n\t\"./th.js\": \"./node_modules/moment/locale/th.js\",\n\t\"./tk\": \"./node_modules/moment/locale/tk.js\",\n\t\"./tk.js\": \"./node_modules/moment/locale/tk.js\",\n\t\"./tl-ph\": \"./node_modules/moment/locale/tl-ph.js\",\n\t\"./tl-ph.js\": \"./node_modules/moment/locale/tl-ph.js\",\n\t\"./tlh\": \"./node_modules/moment/locale/tlh.js\",\n\t\"./tlh.js\": \"./node_modules/moment/locale/tlh.js\",\n\t\"./tr\": \"./node_modules/moment/locale/tr.js\",\n\t\"./tr.js\": \"./node_modules/moment/locale/tr.js\",\n\t\"./tzl\": \"./node_modules/moment/locale/tzl.js\",\n\t\"./tzl.js\": \"./node_modules/moment/locale/tzl.js\",\n\t\"./tzm\": \"./node_modules/moment/locale/tzm.js\",\n\t\"./tzm-latn\": \"./node_modules/moment/locale/tzm-latn.js\",\n\t\"./tzm-latn.js\": \"./node_modules/moment/locale/tzm-latn.js\",\n\t\"./tzm.js\": \"./node_modules/moment/locale/tzm.js\",\n\t\"./ug-cn\": \"./node_modules/moment/locale/ug-cn.js\",\n\t\"./ug-cn.js\": \"./node_modules/moment/locale/ug-cn.js\",\n\t\"./uk\": \"./node_modules/moment/locale/uk.js\",\n\t\"./uk.js\": \"./node_modules/moment/locale/uk.js\",\n\t\"./ur\": \"./node_modules/moment/locale/ur.js\",\n\t\"./ur.js\": \"./node_modules/moment/locale/ur.js\",\n\t\"./uz\": \"./node_modules/moment/locale/uz.js\",\n\t\"./uz-latn\": \"./node_modules/moment/locale/uz-latn.js\",\n\t\"./uz-latn.js\": \"./node_modules/moment/locale/uz-latn.js\",\n\t\"./uz.js\": \"./node_modules/moment/locale/uz.js\",\n\t\"./vi\": \"./node_modules/moment/locale/vi.js\",\n\t\"./vi.js\": \"./node_modules/moment/locale/vi.js\",\n\t\"./x-pseudo\": \"./node_modules/moment/locale/x-pseudo.js\",\n\t\"./x-pseudo.js\": \"./node_modules/moment/locale/x-pseudo.js\",\n\t\"./yo\": \"./node_modules/moment/locale/yo.js\",\n\t\"./yo.js\": \"./node_modules/moment/locale/yo.js\",\n\t\"./zh-cn\": \"./node_modules/moment/locale/zh-cn.js\",\n\t\"./zh-cn.js\": \"./node_modules/moment/locale/zh-cn.js\",\n\t\"./zh-hk\": \"./node_modules/moment/locale/zh-hk.js\",\n\t\"./zh-hk.js\": \"./node_modules/moment/locale/zh-hk.js\",\n\t\"./zh-mo\": \"./node_modules/moment/locale/zh-mo.js\",\n\t\"./zh-mo.js\": \"./node_modules/moment/locale/zh-mo.js\",\n\t\"./zh-tw\": \"./node_modules/moment/locale/zh-tw.js\",\n\t\"./zh-tw.js\": \"./node_modules/moment/locale/zh-tw.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./node_modules/moment/locale sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale_sync_^\\.\\/.*$?");

/***/ }),

/***/ "./node_modules/moment/locale/af.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/af.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Afrikaans [af]\n//! author : Werner Mollentze : https://github.com/wernerm\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var af = moment.defineLocale('af', {\n    months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),\n    monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),\n    weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),\n    weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),\n    weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),\n    meridiemParse: /vm|nm/i,\n    isPM: function isPM(input) {\n      return /^nm$/i.test(input);\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 12) {\n        return isLower ? 'vm' : 'VM';\n      } else {\n        return isLower ? 'nm' : 'NM';\n      }\n    },\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Vandag om] LT',\n      nextDay: '[Môre om] LT',\n      nextWeek: 'dddd [om] LT',\n      lastDay: '[Gister om] LT',\n      lastWeek: '[Laas] dddd [om] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'oor %s',\n      past: '%s gelede',\n      s: \"'n paar sekondes\",\n      ss: '%d sekondes',\n      m: \"'n minuut\",\n      mm: '%d minute',\n      h: \"'n uur\",\n      hh: '%d ure',\n      d: \"'n dag\",\n      dd: '%d dae',\n      M: \"'n maand\",\n      MM: '%d maande',\n      y: \"'n jaar\",\n      yy: '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal: function ordinal(number) {\n      return number + (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter\n    },\n    week: {\n      dow: 1,\n      // Maandag is die eerste dag van die week.\n      doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.\n\n    }\n  });\n  return af;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/af.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ar-dz.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ar-dz.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Arabic (Algeria) [ar-dz]\n//! author : Amine Roukh: https://github.com/Amine27\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var pluralForm = function pluralForm(n) {\n    return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;\n  },\n      plurals = {\n    s: ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],\n    m: ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],\n    h: ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],\n    d: ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],\n    M: ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],\n    y: ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']\n  },\n      pluralize = function pluralize(u) {\n    return function (number, withoutSuffix, string, isFuture) {\n      var f = pluralForm(number),\n          str = plurals[u][pluralForm(number)];\n\n      if (f === 2) {\n        str = str[withoutSuffix ? 0 : 1];\n      }\n\n      return str.replace(/%d/i, number);\n    };\n  },\n      months = ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'];\n\n  var arDz = moment.defineLocale('ar-dz', {\n    months: months,\n    monthsShort: months,\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: \"D/\\u200FM/\\u200FYYYY\",\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM: function isPM(input) {\n      return 'م' === input;\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ص';\n      } else {\n        return 'م';\n      }\n    },\n    calendar: {\n      sameDay: '[اليوم عند الساعة] LT',\n      nextDay: '[غدًا عند الساعة] LT',\n      nextWeek: 'dddd [عند الساعة] LT',\n      lastDay: '[أمس عند الساعة] LT',\n      lastWeek: 'dddd [عند الساعة] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'بعد %s',\n      past: 'منذ %s',\n      s: pluralize('s'),\n      ss: pluralize('s'),\n      m: pluralize('m'),\n      mm: pluralize('m'),\n      h: pluralize('h'),\n      hh: pluralize('h'),\n      d: pluralize('d'),\n      dd: pluralize('d'),\n      M: pluralize('M'),\n      MM: pluralize('M'),\n      y: pluralize('y'),\n      yy: pluralize('y')\n    },\n    postformat: function postformat(string) {\n      return string.replace(/,/g, '،');\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return arDz;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ar-dz.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ar-kw.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ar-kw.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Arabic (Kuwait) [ar-kw]\n//! author : Nusret Parlak: https://github.com/nusretparlak\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var arKw = moment.defineLocale('ar-kw', {\n    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[اليوم على الساعة] LT',\n      nextDay: '[غدا على الساعة] LT',\n      nextWeek: 'dddd [على الساعة] LT',\n      lastDay: '[أمس على الساعة] LT',\n      lastWeek: 'dddd [على الساعة] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'في %s',\n      past: 'منذ %s',\n      s: 'ثوان',\n      ss: '%d ثانية',\n      m: 'دقيقة',\n      mm: '%d دقائق',\n      h: 'ساعة',\n      hh: '%d ساعات',\n      d: 'يوم',\n      dd: '%d أيام',\n      M: 'شهر',\n      MM: '%d أشهر',\n      y: 'سنة',\n      yy: '%d سنوات'\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return arKw;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ar-kw.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ar-ly.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ar-ly.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Arabic (Libya) [ar-ly]\n//! author : Ali Hmer: https://github.com/kikoanis\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '1',\n    2: '2',\n    3: '3',\n    4: '4',\n    5: '5',\n    6: '6',\n    7: '7',\n    8: '8',\n    9: '9',\n    0: '0'\n  },\n      pluralForm = function pluralForm(n) {\n    return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;\n  },\n      plurals = {\n    s: ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],\n    m: ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],\n    h: ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],\n    d: ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],\n    M: ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],\n    y: ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']\n  },\n      pluralize = function pluralize(u) {\n    return function (number, withoutSuffix, string, isFuture) {\n      var f = pluralForm(number),\n          str = plurals[u][pluralForm(number)];\n\n      if (f === 2) {\n        str = str[withoutSuffix ? 0 : 1];\n      }\n\n      return str.replace(/%d/i, number);\n    };\n  },\n      months = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'];\n\n  var arLy = moment.defineLocale('ar-ly', {\n    months: months,\n    monthsShort: months,\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: \"D/\\u200FM/\\u200FYYYY\",\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM: function isPM(input) {\n      return 'م' === input;\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ص';\n      } else {\n        return 'م';\n      }\n    },\n    calendar: {\n      sameDay: '[اليوم عند الساعة] LT',\n      nextDay: '[غدًا عند الساعة] LT',\n      nextWeek: 'dddd [عند الساعة] LT',\n      lastDay: '[أمس عند الساعة] LT',\n      lastWeek: 'dddd [عند الساعة] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'بعد %s',\n      past: 'منذ %s',\n      s: pluralize('s'),\n      ss: pluralize('s'),\n      m: pluralize('m'),\n      mm: pluralize('m'),\n      h: pluralize('h'),\n      hh: pluralize('h'),\n      d: pluralize('d'),\n      dd: pluralize('d'),\n      M: pluralize('M'),\n      MM: pluralize('M'),\n      y: pluralize('y'),\n      yy: pluralize('y')\n    },\n    preparse: function preparse(string) {\n      return string.replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      }).replace(/,/g, '،');\n    },\n    week: {\n      dow: 6,\n      // Saturday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return arLy;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ar-ly.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ar-ma.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ar-ma.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Arabic (Morocco) [ar-ma]\n//! author : ElFadili Yassine : https://github.com/ElFadiliY\n//! author : Abdel Said : https://github.com/abdelsaid\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var arMa = moment.defineLocale('ar-ma', {\n    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[اليوم على الساعة] LT',\n      nextDay: '[غدا على الساعة] LT',\n      nextWeek: 'dddd [على الساعة] LT',\n      lastDay: '[أمس على الساعة] LT',\n      lastWeek: 'dddd [على الساعة] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'في %s',\n      past: 'منذ %s',\n      s: 'ثوان',\n      ss: '%d ثانية',\n      m: 'دقيقة',\n      mm: '%d دقائق',\n      h: 'ساعة',\n      hh: '%d ساعات',\n      d: 'يوم',\n      dd: '%d أيام',\n      M: 'شهر',\n      MM: '%d أشهر',\n      y: 'سنة',\n      yy: '%d سنوات'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return arMa;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ar-ma.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ar-sa.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ar-sa.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Arabic (Saudi Arabia) [ar-sa]\n//! author : Suhail Alkowaileet : https://github.com/xsoh\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '١',\n    2: '٢',\n    3: '٣',\n    4: '٤',\n    5: '٥',\n    6: '٦',\n    7: '٧',\n    8: '٨',\n    9: '٩',\n    0: '٠'\n  },\n      numberMap = {\n    '١': '1',\n    '٢': '2',\n    '٣': '3',\n    '٤': '4',\n    '٥': '5',\n    '٦': '6',\n    '٧': '7',\n    '٨': '8',\n    '٩': '9',\n    '٠': '0'\n  };\n  var arSa = moment.defineLocale('ar-sa', {\n    months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM: function isPM(input) {\n      return 'م' === input;\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ص';\n      } else {\n        return 'م';\n      }\n    },\n    calendar: {\n      sameDay: '[اليوم على الساعة] LT',\n      nextDay: '[غدا على الساعة] LT',\n      nextWeek: 'dddd [على الساعة] LT',\n      lastDay: '[أمس على الساعة] LT',\n      lastWeek: 'dddd [على الساعة] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'في %s',\n      past: 'منذ %s',\n      s: 'ثوان',\n      ss: '%d ثانية',\n      m: 'دقيقة',\n      mm: '%d دقائق',\n      h: 'ساعة',\n      hh: '%d ساعات',\n      d: 'يوم',\n      dd: '%d أيام',\n      M: 'شهر',\n      MM: '%d أشهر',\n      y: 'سنة',\n      yy: '%d سنوات'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n        return numberMap[match];\n      }).replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      }).replace(/,/g, '،');\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return arSa;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ar-sa.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ar-tn.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ar-tn.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale  :  Arabic (Tunisia) [ar-tn]\n//! author : Nader Toukabri : https://github.com/naderio\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var arTn = moment.defineLocale('ar-tn', {\n    months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[اليوم على الساعة] LT',\n      nextDay: '[غدا على الساعة] LT',\n      nextWeek: 'dddd [على الساعة] LT',\n      lastDay: '[أمس على الساعة] LT',\n      lastWeek: 'dddd [على الساعة] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'في %s',\n      past: 'منذ %s',\n      s: 'ثوان',\n      ss: '%d ثانية',\n      m: 'دقيقة',\n      mm: '%d دقائق',\n      h: 'ساعة',\n      hh: '%d ساعات',\n      d: 'يوم',\n      dd: '%d أيام',\n      M: 'شهر',\n      MM: '%d أشهر',\n      y: 'سنة',\n      yy: '%d سنوات'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return arTn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ar-tn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ar.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ar.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Arabic [ar]\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '١',\n    2: '٢',\n    3: '٣',\n    4: '٤',\n    5: '٥',\n    6: '٦',\n    7: '٧',\n    8: '٨',\n    9: '٩',\n    0: '٠'\n  },\n      numberMap = {\n    '١': '1',\n    '٢': '2',\n    '٣': '3',\n    '٤': '4',\n    '٥': '5',\n    '٦': '6',\n    '٧': '7',\n    '٨': '8',\n    '٩': '9',\n    '٠': '0'\n  },\n      pluralForm = function pluralForm(n) {\n    return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;\n  },\n      plurals = {\n    s: ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],\n    m: ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],\n    h: ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],\n    d: ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],\n    M: ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],\n    y: ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']\n  },\n      pluralize = function pluralize(u) {\n    return function (number, withoutSuffix, string, isFuture) {\n      var f = pluralForm(number),\n          str = plurals[u][pluralForm(number)];\n\n      if (f === 2) {\n        str = str[withoutSuffix ? 0 : 1];\n      }\n\n      return str.replace(/%d/i, number);\n    };\n  },\n      months = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'];\n\n  var ar = moment.defineLocale('ar', {\n    months: months,\n    monthsShort: months,\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: \"D/\\u200FM/\\u200FYYYY\",\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM: function isPM(input) {\n      return 'م' === input;\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ص';\n      } else {\n        return 'م';\n      }\n    },\n    calendar: {\n      sameDay: '[اليوم عند الساعة] LT',\n      nextDay: '[غدًا عند الساعة] LT',\n      nextWeek: 'dddd [عند الساعة] LT',\n      lastDay: '[أمس عند الساعة] LT',\n      lastWeek: 'dddd [عند الساعة] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'بعد %s',\n      past: 'منذ %s',\n      s: pluralize('s'),\n      ss: pluralize('s'),\n      m: pluralize('m'),\n      mm: pluralize('m'),\n      h: pluralize('h'),\n      hh: pluralize('h'),\n      d: pluralize('d'),\n      dd: pluralize('d'),\n      M: pluralize('M'),\n      MM: pluralize('M'),\n      y: pluralize('y'),\n      yy: pluralize('y')\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n        return numberMap[match];\n      }).replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      }).replace(/,/g, '،');\n    },\n    week: {\n      dow: 6,\n      // Saturday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return ar;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ar.js?");

/***/ }),

/***/ "./node_modules/moment/locale/az.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/az.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Azerbaijani [az]\n//! author : topchiyev : https://github.com/topchiyev\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var suffixes = {\n    1: '-inci',\n    5: '-inci',\n    8: '-inci',\n    70: '-inci',\n    80: '-inci',\n    2: '-nci',\n    7: '-nci',\n    20: '-nci',\n    50: '-nci',\n    3: '-üncü',\n    4: '-üncü',\n    100: '-üncü',\n    6: '-ncı',\n    9: '-uncu',\n    10: '-uncu',\n    30: '-uncu',\n    60: '-ıncı',\n    90: '-ıncı'\n  };\n  var az = moment.defineLocale('az', {\n    months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),\n    monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),\n    weekdays: 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),\n    weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),\n    weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[bugün saat] LT',\n      nextDay: '[sabah saat] LT',\n      nextWeek: '[gələn həftə] dddd [saat] LT',\n      lastDay: '[dünən] LT',\n      lastWeek: '[keçən həftə] dddd [saat] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s sonra',\n      past: '%s əvvəl',\n      s: 'bir neçə saniyə',\n      ss: '%d saniyə',\n      m: 'bir dəqiqə',\n      mm: '%d dəqiqə',\n      h: 'bir saat',\n      hh: '%d saat',\n      d: 'bir gün',\n      dd: '%d gün',\n      M: 'bir ay',\n      MM: '%d ay',\n      y: 'bir il',\n      yy: '%d il'\n    },\n    meridiemParse: /gecə|səhər|gündüz|axşam/,\n    isPM: function isPM(input) {\n      return /^(gündüz|axşam)$/.test(input);\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'gecə';\n      } else if (hour < 12) {\n        return 'səhər';\n      } else if (hour < 17) {\n        return 'gündüz';\n      } else {\n        return 'axşam';\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,\n    ordinal: function ordinal(number) {\n      if (number === 0) {\n        // special case for zero\n        return number + '-ıncı';\n      }\n\n      var a = number % 10,\n          b = number % 100 - a,\n          c = number >= 100 ? 100 : null;\n      return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return az;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/az.js?");

/***/ }),

/***/ "./node_modules/moment/locale/be.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/be.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Belarusian [be]\n//! author : Dmitry Demidov : https://github.com/demidov91\n//! author: Praleska: http://praleska.pro/\n//! Author : Menelion Elensúle : https://github.com/Oire\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2];\n  }\n\n  function relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n      ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n      mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',\n      hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',\n      dd: 'дзень_дні_дзён',\n      MM: 'месяц_месяцы_месяцаў',\n      yy: 'год_гады_гадоў'\n    };\n\n    if (key === 'm') {\n      return withoutSuffix ? 'хвіліна' : 'хвіліну';\n    } else if (key === 'h') {\n      return withoutSuffix ? 'гадзіна' : 'гадзіну';\n    } else {\n      return number + ' ' + plural(format[key], +number);\n    }\n  }\n\n  var be = moment.defineLocale('be', {\n    months: {\n      format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),\n      standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')\n    },\n    monthsShort: 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),\n    weekdays: {\n      format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),\n      standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),\n      isFormat: /\\[ ?[Ууў] ?(?:мінулую|наступную)? ?\\] ?dddd/\n    },\n    weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n    weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY г.',\n      LLL: 'D MMMM YYYY г., HH:mm',\n      LLLL: 'dddd, D MMMM YYYY г., HH:mm'\n    },\n    calendar: {\n      sameDay: '[Сёння ў] LT',\n      nextDay: '[Заўтра ў] LT',\n      lastDay: '[Учора ў] LT',\n      nextWeek: function nextWeek() {\n        return '[У] dddd [ў] LT';\n      },\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n          case 3:\n          case 5:\n          case 6:\n            return '[У мінулую] dddd [ў] LT';\n\n          case 1:\n          case 2:\n          case 4:\n            return '[У мінулы] dddd [ў] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'праз %s',\n      past: '%s таму',\n      s: 'некалькі секунд',\n      m: relativeTimeWithPlural,\n      mm: relativeTimeWithPlural,\n      h: relativeTimeWithPlural,\n      hh: relativeTimeWithPlural,\n      d: 'дзень',\n      dd: relativeTimeWithPlural,\n      M: 'месяц',\n      MM: relativeTimeWithPlural,\n      y: 'год',\n      yy: relativeTimeWithPlural\n    },\n    meridiemParse: /ночы|раніцы|дня|вечара/,\n    isPM: function isPM(input) {\n      return /^(дня|вечара)$/.test(input);\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'ночы';\n      } else if (hour < 12) {\n        return 'раніцы';\n      } else if (hour < 17) {\n        return 'дня';\n      } else {\n        return 'вечара';\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(і|ы|га)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'M':\n        case 'd':\n        case 'DDD':\n        case 'w':\n        case 'W':\n          return (number % 10 === 2 || number % 10 === 3) && number % 100 !== 12 && number % 100 !== 13 ? number + '-і' : number + '-ы';\n\n        case 'D':\n          return number + '-га';\n\n        default:\n          return number;\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return be;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/be.js?");

/***/ }),

/***/ "./node_modules/moment/locale/bg.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/bg.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Bulgarian [bg]\n//! author : Krasen Borisov : https://github.com/kraz\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var bg = moment.defineLocale('bg', {\n    months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),\n    monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),\n    weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),\n    weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),\n    weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'D.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY H:mm',\n      LLLL: 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[Днес в] LT',\n      nextDay: '[Утре в] LT',\n      nextWeek: 'dddd [в] LT',\n      lastDay: '[Вчера в] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n          case 3:\n          case 6:\n            return '[Миналата] dddd [в] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[Миналия] dddd [в] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'след %s',\n      past: 'преди %s',\n      s: 'няколко секунди',\n      ss: '%d секунди',\n      m: 'минута',\n      mm: '%d минути',\n      h: 'час',\n      hh: '%d часа',\n      d: 'ден',\n      dd: '%d дена',\n      w: 'седмица',\n      ww: '%d седмици',\n      M: 'месец',\n      MM: '%d месеца',\n      y: 'година',\n      yy: '%d години'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n    ordinal: function ordinal(number) {\n      var lastDigit = number % 10,\n          last2Digits = number % 100;\n\n      if (number === 0) {\n        return number + '-ев';\n      } else if (last2Digits === 0) {\n        return number + '-ен';\n      } else if (last2Digits > 10 && last2Digits < 20) {\n        return number + '-ти';\n      } else if (lastDigit === 1) {\n        return number + '-ви';\n      } else if (lastDigit === 2) {\n        return number + '-ри';\n      } else if (lastDigit === 7 || lastDigit === 8) {\n        return number + '-ми';\n      } else {\n        return number + '-ти';\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return bg;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/bg.js?");

/***/ }),

/***/ "./node_modules/moment/locale/bm.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/bm.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Bambara [bm]\n//! author : Estelle Comment : https://github.com/estellecomment\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var bm = moment.defineLocale('bm', {\n    months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'),\n    monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),\n    weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),\n    weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),\n    weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'MMMM [tile] D [san] YYYY',\n      LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n      LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm'\n    },\n    calendar: {\n      sameDay: '[Bi lɛrɛ] LT',\n      nextDay: '[Sini lɛrɛ] LT',\n      nextWeek: 'dddd [don lɛrɛ] LT',\n      lastDay: '[Kunu lɛrɛ] LT',\n      lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s kɔnɔ',\n      past: 'a bɛ %s bɔ',\n      s: 'sanga dama dama',\n      ss: 'sekondi %d',\n      m: 'miniti kelen',\n      mm: 'miniti %d',\n      h: 'lɛrɛ kelen',\n      hh: 'lɛrɛ %d',\n      d: 'tile kelen',\n      dd: 'tile %d',\n      M: 'kalo kelen',\n      MM: 'kalo %d',\n      y: 'san kelen',\n      yy: 'san %d'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return bm;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/bm.js?");

/***/ }),

/***/ "./node_modules/moment/locale/bn-bd.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/bn-bd.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Bengali (Bangladesh) [bn-bd]\n//! author : Asraf Hossain Patoary : https://github.com/ashwoolford\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '১',\n    2: '২',\n    3: '৩',\n    4: '৪',\n    5: '৫',\n    6: '৬',\n    7: '৭',\n    8: '৮',\n    9: '৯',\n    0: '০'\n  },\n      numberMap = {\n    '১': '1',\n    '২': '2',\n    '৩': '3',\n    '৪': '4',\n    '৫': '5',\n    '৬': '6',\n    '৭': '7',\n    '৮': '8',\n    '৯': '9',\n    '০': '0'\n  };\n  var bnBd = moment.defineLocale('bn-bd', {\n    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),\n    monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),\n    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),\n    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm সময়',\n      LTS: 'A h:mm:ss সময়',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm সময়',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm সময়'\n    },\n    calendar: {\n      sameDay: '[আজ] LT',\n      nextDay: '[আগামীকাল] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[গতকাল] LT',\n      lastWeek: '[গত] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s পরে',\n      past: '%s আগে',\n      s: 'কয়েক সেকেন্ড',\n      ss: '%d সেকেন্ড',\n      m: 'এক মিনিট',\n      mm: '%d মিনিট',\n      h: 'এক ঘন্টা',\n      hh: '%d ঘন্টা',\n      d: 'এক দিন',\n      dd: '%d দিন',\n      M: 'এক মাস',\n      MM: '%d মাস',\n      y: 'এক বছর',\n      yy: '%d বছর'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'রাত') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'ভোর') {\n        return hour;\n      } else if (meridiem === 'সকাল') {\n        return hour;\n      } else if (meridiem === 'দুপুর') {\n        return hour >= 3 ? hour : hour + 12;\n      } else if (meridiem === 'বিকাল') {\n        return hour + 12;\n      } else if (meridiem === 'সন্ধ্যা') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'রাত';\n      } else if (hour < 6) {\n        return 'ভোর';\n      } else if (hour < 12) {\n        return 'সকাল';\n      } else if (hour < 15) {\n        return 'দুপুর';\n      } else if (hour < 18) {\n        return 'বিকাল';\n      } else if (hour < 20) {\n        return 'সন্ধ্যা';\n      } else {\n        return 'রাত';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return bnBd;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/bn-bd.js?");

/***/ }),

/***/ "./node_modules/moment/locale/bn.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/bn.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Bengali [bn]\n//! author : Kaushik Gandhi : https://github.com/kaushikgandhi\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '১',\n    2: '২',\n    3: '৩',\n    4: '৪',\n    5: '৫',\n    6: '৬',\n    7: '৭',\n    8: '৮',\n    9: '৯',\n    0: '০'\n  },\n      numberMap = {\n    '১': '1',\n    '২': '2',\n    '৩': '3',\n    '৪': '4',\n    '৫': '5',\n    '৬': '6',\n    '৭': '7',\n    '৮': '8',\n    '৯': '9',\n    '০': '0'\n  };\n  var bn = moment.defineLocale('bn', {\n    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),\n    monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),\n    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),\n    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm সময়',\n      LTS: 'A h:mm:ss সময়',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm সময়',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm সময়'\n    },\n    calendar: {\n      sameDay: '[আজ] LT',\n      nextDay: '[আগামীকাল] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[গতকাল] LT',\n      lastWeek: '[গত] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s পরে',\n      past: '%s আগে',\n      s: 'কয়েক সেকেন্ড',\n      ss: '%d সেকেন্ড',\n      m: 'এক মিনিট',\n      mm: '%d মিনিট',\n      h: 'এক ঘন্টা',\n      hh: '%d ঘন্টা',\n      d: 'এক দিন',\n      dd: '%d দিন',\n      M: 'এক মাস',\n      MM: '%d মাস',\n      y: 'এক বছর',\n      yy: '%d বছর'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'রাত' && hour >= 4 || meridiem === 'দুপুর' && hour < 5 || meridiem === 'বিকাল') {\n        return hour + 12;\n      } else {\n        return hour;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'রাত';\n      } else if (hour < 10) {\n        return 'সকাল';\n      } else if (hour < 17) {\n        return 'দুপুর';\n      } else if (hour < 20) {\n        return 'বিকাল';\n      } else {\n        return 'রাত';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return bn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/bn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/bo.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/bo.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Tibetan [bo]\n//! author : Thupten N. Chakrishar : https://github.com/vajradog\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '༡',\n    2: '༢',\n    3: '༣',\n    4: '༤',\n    5: '༥',\n    6: '༦',\n    7: '༧',\n    8: '༨',\n    9: '༩',\n    0: '༠'\n  },\n      numberMap = {\n    '༡': '1',\n    '༢': '2',\n    '༣': '3',\n    '༤': '4',\n    '༥': '5',\n    '༦': '6',\n    '༧': '7',\n    '༨': '8',\n    '༩': '9',\n    '༠': '0'\n  };\n  var bo = moment.defineLocale('bo', {\n    months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),\n    monthsShort: 'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split('_'),\n    monthsShortRegex: /^(ཟླ་\\d{1,2})/,\n    monthsParseExact: true,\n    weekdays: 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),\n    weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),\n    weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm',\n      LTS: 'A h:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar: {\n      sameDay: '[དི་རིང] LT',\n      nextDay: '[སང་ཉིན] LT',\n      nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',\n      lastDay: '[ཁ་སང] LT',\n      lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s ལ་',\n      past: '%s སྔན་ལ',\n      s: 'ལམ་སང',\n      ss: '%d སྐར་ཆ།',\n      m: 'སྐར་མ་གཅིག',\n      mm: '%d སྐར་མ',\n      h: 'ཆུ་ཚོད་གཅིག',\n      hh: '%d ཆུ་ཚོད',\n      d: 'ཉིན་གཅིག',\n      dd: '%d ཉིན་',\n      M: 'ཟླ་བ་གཅིག',\n      MM: '%d ཟླ་བ',\n      y: 'ལོ་གཅིག',\n      yy: '%d ལོ'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'མཚན་མོ' && hour >= 4 || meridiem === 'ཉིན་གུང' && hour < 5 || meridiem === 'དགོང་དག') {\n        return hour + 12;\n      } else {\n        return hour;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'མཚན་མོ';\n      } else if (hour < 10) {\n        return 'ཞོགས་ཀས';\n      } else if (hour < 17) {\n        return 'ཉིན་གུང';\n      } else if (hour < 20) {\n        return 'དགོང་དག';\n      } else {\n        return 'མཚན་མོ';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return bo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/bo.js?");

/***/ }),

/***/ "./node_modules/moment/locale/br.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/br.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Breton [br]\n//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function relativeTimeWithMutation(number, withoutSuffix, key) {\n    var format = {\n      mm: 'munutenn',\n      MM: 'miz',\n      dd: 'devezh'\n    };\n    return number + ' ' + mutation(format[key], number);\n  }\n\n  function specialMutationForYears(number) {\n    switch (lastNumber(number)) {\n      case 1:\n      case 3:\n      case 4:\n      case 5:\n      case 9:\n        return number + ' bloaz';\n\n      default:\n        return number + ' vloaz';\n    }\n  }\n\n  function lastNumber(number) {\n    if (number > 9) {\n      return lastNumber(number % 10);\n    }\n\n    return number;\n  }\n\n  function mutation(text, number) {\n    if (number === 2) {\n      return softMutation(text);\n    }\n\n    return text;\n  }\n\n  function softMutation(text) {\n    var mutationTable = {\n      m: 'v',\n      b: 'v',\n      d: 'z'\n    };\n\n    if (mutationTable[text.charAt(0)] === undefined) {\n      return text;\n    }\n\n    return mutationTable[text.charAt(0)] + text.substring(1);\n  }\n\n  var monthsParse = [/^gen/i, /^c[ʼ\\']hwe/i, /^meu/i, /^ebr/i, /^mae/i, /^(mez|eve)/i, /^gou/i, /^eos/i, /^gwe/i, /^her/i, /^du/i, /^ker/i],\n      monthsRegex = /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n      monthsStrictRegex = /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,\n      monthsShortStrictRegex = /^(gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n      fullWeekdaysParse = [/^sul/i, /^lun/i, /^meurzh/i, /^merc[ʼ\\']her/i, /^yaou/i, /^gwener/i, /^sadorn/i],\n      shortWeekdaysParse = [/^Sul/i, /^Lun/i, /^Meu/i, /^Mer/i, /^Yao/i, /^Gwe/i, /^Sad/i],\n      minWeekdaysParse = [/^Su/i, /^Lu/i, /^Me([^r]|$)/i, /^Mer/i, /^Ya/i, /^Gw/i, /^Sa/i];\n  var br = moment.defineLocale('br', {\n    months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),\n    monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),\n    weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),\n    weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),\n    weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),\n    weekdaysParse: minWeekdaysParse,\n    fullWeekdaysParse: fullWeekdaysParse,\n    shortWeekdaysParse: shortWeekdaysParse,\n    minWeekdaysParse: minWeekdaysParse,\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: monthsStrictRegex,\n    monthsShortStrictRegex: monthsShortStrictRegex,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D [a viz] MMMM YYYY',\n      LLL: 'D [a viz] MMMM YYYY HH:mm',\n      LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Hiziv da] LT',\n      nextDay: '[Warcʼhoazh da] LT',\n      nextWeek: 'dddd [da] LT',\n      lastDay: '[Decʼh da] LT',\n      lastWeek: 'dddd [paset da] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'a-benn %s',\n      past: '%s ʼzo',\n      s: 'un nebeud segondennoù',\n      ss: '%d eilenn',\n      m: 'ur vunutenn',\n      mm: relativeTimeWithMutation,\n      h: 'un eur',\n      hh: '%d eur',\n      d: 'un devezh',\n      dd: relativeTimeWithMutation,\n      M: 'ur miz',\n      MM: relativeTimeWithMutation,\n      y: 'ur bloaz',\n      yy: specialMutationForYears\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(añ|vet)/,\n    ordinal: function ordinal(number) {\n      var output = number === 1 ? 'añ' : 'vet';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    },\n    meridiemParse: /a.m.|g.m./,\n    // goude merenn | a-raok merenn\n    isPM: function isPM(token) {\n      return token === 'g.m.';\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      return hour < 12 ? 'a.m.' : 'g.m.';\n    }\n  });\n  return br;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/br.js?");

/***/ }),

/***/ "./node_modules/moment/locale/bs.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/bs.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Bosnian [bs]\n//! author : Nedim Cholich : https://github.com/frontyard\n//! based on (hr) translation by Bojan Marković\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n\n    switch (key) {\n      case 'ss':\n        if (number === 1) {\n          result += 'sekunda';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'sekunde';\n        } else {\n          result += 'sekundi';\n        }\n\n        return result;\n\n      case 'm':\n        return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n\n      case 'mm':\n        if (number === 1) {\n          result += 'minuta';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'minute';\n        } else {\n          result += 'minuta';\n        }\n\n        return result;\n\n      case 'h':\n        return withoutSuffix ? 'jedan sat' : 'jednog sata';\n\n      case 'hh':\n        if (number === 1) {\n          result += 'sat';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'sata';\n        } else {\n          result += 'sati';\n        }\n\n        return result;\n\n      case 'dd':\n        if (number === 1) {\n          result += 'dan';\n        } else {\n          result += 'dana';\n        }\n\n        return result;\n\n      case 'MM':\n        if (number === 1) {\n          result += 'mjesec';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'mjeseca';\n        } else {\n          result += 'mjeseci';\n        }\n\n        return result;\n\n      case 'yy':\n        if (number === 1) {\n          result += 'godina';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'godine';\n        } else {\n          result += 'godina';\n        }\n\n        return result;\n    }\n  }\n\n  var bs = moment.defineLocale('bs', {\n    months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY H:mm',\n      LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[danas u] LT',\n      nextDay: '[sutra u] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[u] [nedjelju] [u] LT';\n\n          case 3:\n            return '[u] [srijedu] [u] LT';\n\n          case 6:\n            return '[u] [subotu] [u] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[u] dddd [u] LT';\n        }\n      },\n      lastDay: '[jučer u] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n          case 3:\n            return '[prošlu] dddd [u] LT';\n\n          case 6:\n            return '[prošle] [subote] [u] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[prošli] dddd [u] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'za %s',\n      past: 'prije %s',\n      s: 'par sekundi',\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: 'dan',\n      dd: translate,\n      M: 'mjesec',\n      MM: translate,\n      y: 'godinu',\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return bs;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/bs.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ca.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ca.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Catalan [ca]\n//! author : Juan G. Hurtado : https://github.com/juanghurtado\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ca = moment.defineLocale('ca', {\n    months: {\n      standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),\n      format: \"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre\".split('_'),\n      isFormat: /D[oD]?(\\s)+MMMM/\n    },\n    monthsShort: 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),\n    weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),\n    weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM [de] YYYY',\n      ll: 'D MMM YYYY',\n      LLL: 'D MMMM [de] YYYY [a les] H:mm',\n      lll: 'D MMM YYYY, H:mm',\n      LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',\n      llll: 'ddd D MMM YYYY, H:mm'\n    },\n    calendar: {\n      sameDay: function sameDay() {\n        return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n      },\n      nextDay: function nextDay() {\n        return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n      },\n      nextWeek: function nextWeek() {\n        return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n      },\n      lastDay: function lastDay() {\n        return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n      },\n      lastWeek: function lastWeek() {\n        return '[el] dddd [passat a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: \"d'aquí %s\",\n      past: 'fa %s',\n      s: 'uns segons',\n      ss: '%d segons',\n      m: 'un minut',\n      mm: '%d minuts',\n      h: 'una hora',\n      hh: '%d hores',\n      d: 'un dia',\n      dd: '%d dies',\n      M: 'un mes',\n      MM: '%d mesos',\n      y: 'un any',\n      yy: '%d anys'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n    ordinal: function ordinal(number, period) {\n      var output = number === 1 ? 'r' : number === 2 ? 'n' : number === 3 ? 'r' : number === 4 ? 't' : 'è';\n\n      if (period === 'w' || period === 'W') {\n        output = 'a';\n      }\n\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return ca;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ca.js?");

/***/ }),

/***/ "./node_modules/moment/locale/cs.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/cs.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Czech [cs]\n//! author : petrbela : https://github.com/petrbela\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var months = {\n    format: 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),\n    standalone: 'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split('_')\n  },\n      monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),\n      monthsParse = [/^led/i, /^úno/i, /^bře/i, /^dub/i, /^kvě/i, /^(čvn|červen$|června)/i, /^(čvc|červenec|července)/i, /^srp/i, /^zář/i, /^říj/i, /^lis/i, /^pro/i],\n      // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n  // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n  monthsRegex = /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;\n\n  function plural(n) {\n    return n > 1 && n < 5 && ~~(n / 10) !== 1;\n  }\n\n  function translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n\n    switch (key) {\n      case 's':\n        // a few seconds / in a few seconds / a few seconds ago\n        return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';\n\n      case 'ss':\n        // 9 seconds / in 9 seconds / 9 seconds ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'sekundy' : 'sekund');\n        } else {\n          return result + 'sekundami';\n        }\n\n      case 'm':\n        // a minute / in a minute / a minute ago\n        return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';\n\n      case 'mm':\n        // 9 minutes / in 9 minutes / 9 minutes ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'minuty' : 'minut');\n        } else {\n          return result + 'minutami';\n        }\n\n      case 'h':\n        // an hour / in an hour / an hour ago\n        return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n\n      case 'hh':\n        // 9 hours / in 9 hours / 9 hours ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'hodiny' : 'hodin');\n        } else {\n          return result + 'hodinami';\n        }\n\n      case 'd':\n        // a day / in a day / a day ago\n        return withoutSuffix || isFuture ? 'den' : 'dnem';\n\n      case 'dd':\n        // 9 days / in 9 days / 9 days ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'dny' : 'dní');\n        } else {\n          return result + 'dny';\n        }\n\n      case 'M':\n        // a month / in a month / a month ago\n        return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';\n\n      case 'MM':\n        // 9 months / in 9 months / 9 months ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'měsíce' : 'měsíců');\n        } else {\n          return result + 'měsíci';\n        }\n\n      case 'y':\n        // a year / in a year / a year ago\n        return withoutSuffix || isFuture ? 'rok' : 'rokem';\n\n      case 'yy':\n        // 9 years / in 9 years / 9 years ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'roky' : 'let');\n        } else {\n          return result + 'lety';\n        }\n\n    }\n  }\n\n  var cs = moment.defineLocale('cs', {\n    months: months,\n    monthsShort: monthsShort,\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n    // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n    monthsStrictRegex: /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,\n    monthsShortStrictRegex: /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),\n    weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),\n    weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY H:mm',\n      LLLL: 'dddd D. MMMM YYYY H:mm',\n      l: 'D. M. YYYY'\n    },\n    calendar: {\n      sameDay: '[dnes v] LT',\n      nextDay: '[zítra v] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[v neděli v] LT';\n\n          case 1:\n          case 2:\n            return '[v] dddd [v] LT';\n\n          case 3:\n            return '[ve středu v] LT';\n\n          case 4:\n            return '[ve čtvrtek v] LT';\n\n          case 5:\n            return '[v pátek v] LT';\n\n          case 6:\n            return '[v sobotu v] LT';\n        }\n      },\n      lastDay: '[včera v] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[minulou neděli v] LT';\n\n          case 1:\n          case 2:\n            return '[minulé] dddd [v] LT';\n\n          case 3:\n            return '[minulou středu v] LT';\n\n          case 4:\n          case 5:\n            return '[minulý] dddd [v] LT';\n\n          case 6:\n            return '[minulou sobotu v] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'za %s',\n      past: 'před %s',\n      s: translate,\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: translate,\n      dd: translate,\n      M: translate,\n      MM: translate,\n      y: translate,\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return cs;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/cs.js?");

/***/ }),

/***/ "./node_modules/moment/locale/cv.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/cv.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Chuvash [cv]\n//! author : Anatoly Mironov : https://github.com/mirontoli\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var cv = moment.defineLocale('cv', {\n    months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),\n    monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),\n    weekdays: 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),\n    weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),\n    weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD-MM-YYYY',\n      LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',\n      LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',\n      LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'\n    },\n    calendar: {\n      sameDay: '[Паян] LT [сехетре]',\n      nextDay: '[Ыран] LT [сехетре]',\n      lastDay: '[Ӗнер] LT [сехетре]',\n      nextWeek: '[Ҫитес] dddd LT [сехетре]',\n      lastWeek: '[Иртнӗ] dddd LT [сехетре]',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: function future(output) {\n        var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';\n        return output + affix;\n      },\n      past: '%s каялла',\n      s: 'пӗр-ик ҫеккунт',\n      ss: '%d ҫеккунт',\n      m: 'пӗр минут',\n      mm: '%d минут',\n      h: 'пӗр сехет',\n      hh: '%d сехет',\n      d: 'пӗр кун',\n      dd: '%d кун',\n      M: 'пӗр уйӑх',\n      MM: '%d уйӑх',\n      y: 'пӗр ҫул',\n      yy: '%d ҫул'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-мӗш/,\n    ordinal: '%d-мӗш',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return cv;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/cv.js?");

/***/ }),

/***/ "./node_modules/moment/locale/cy.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/cy.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Welsh [cy]\n//! author : Robert Allen : https://github.com/robgallen\n//! author : https://github.com/ryangreaves\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var cy = moment.defineLocale('cy', {\n    months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),\n    monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),\n    weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),\n    weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),\n    weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),\n    weekdaysParseExact: true,\n    // time formats are the same as en-gb\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Heddiw am] LT',\n      nextDay: '[Yfory am] LT',\n      nextWeek: 'dddd [am] LT',\n      lastDay: '[Ddoe am] LT',\n      lastWeek: 'dddd [diwethaf am] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'mewn %s',\n      past: '%s yn ôl',\n      s: 'ychydig eiliadau',\n      ss: '%d eiliad',\n      m: 'munud',\n      mm: '%d munud',\n      h: 'awr',\n      hh: '%d awr',\n      d: 'diwrnod',\n      dd: '%d diwrnod',\n      M: 'mis',\n      MM: '%d mis',\n      y: 'blwyddyn',\n      yy: '%d flynedd'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,\n    // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh\n    ordinal: function ordinal(number) {\n      var b = number,\n          output = '',\n          lookup = ['', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed\n      'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed\n      ];\n\n      if (b > 20) {\n        if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {\n          output = 'fed'; // not 30ain, 70ain or 90ain\n        } else {\n          output = 'ain';\n        }\n      } else if (b > 0) {\n        output = lookup[b];\n      }\n\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return cy;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/cy.js?");

/***/ }),

/***/ "./node_modules/moment/locale/da.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/da.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Danish [da]\n//! author : Ulrik Nielsen : https://github.com/mrbase\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var da = moment.defineLocale('da', {\n    months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),\n    monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n    weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n    weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),\n    weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY HH:mm',\n      LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar: {\n      sameDay: '[i dag kl.] LT',\n      nextDay: '[i morgen kl.] LT',\n      nextWeek: 'på dddd [kl.] LT',\n      lastDay: '[i går kl.] LT',\n      lastWeek: '[i] dddd[s kl.] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'om %s',\n      past: '%s siden',\n      s: 'få sekunder',\n      ss: '%d sekunder',\n      m: 'et minut',\n      mm: '%d minutter',\n      h: 'en time',\n      hh: '%d timer',\n      d: 'en dag',\n      dd: '%d dage',\n      M: 'en måned',\n      MM: '%d måneder',\n      y: 'et år',\n      yy: '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return da;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/da.js?");

/***/ }),

/***/ "./node_modules/moment/locale/de-at.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/de-at.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : German (Austria) [de-at]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elensúle: https://github.com/Oire\n//! author : Martin Groller : https://github.com/MadMG\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      m: ['eine Minute', 'einer Minute'],\n      h: ['eine Stunde', 'einer Stunde'],\n      d: ['ein Tag', 'einem Tag'],\n      dd: [number + ' Tage', number + ' Tagen'],\n      w: ['eine Woche', 'einer Woche'],\n      M: ['ein Monat', 'einem Monat'],\n      MM: [number + ' Monate', number + ' Monaten'],\n      y: ['ein Jahr', 'einem Jahr'],\n      yy: [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n  }\n\n  var deAt = moment.defineLocale('de-at', {\n    months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort: 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY HH:mm',\n      LLLL: 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[heute um] LT [Uhr]',\n      sameElse: 'L',\n      nextDay: '[morgen um] LT [Uhr]',\n      nextWeek: 'dddd [um] LT [Uhr]',\n      lastDay: '[gestern um] LT [Uhr]',\n      lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: 'vor %s',\n      s: 'ein paar Sekunden',\n      ss: '%d Sekunden',\n      m: processRelativeTime,\n      mm: '%d Minuten',\n      h: processRelativeTime,\n      hh: '%d Stunden',\n      d: processRelativeTime,\n      dd: processRelativeTime,\n      w: processRelativeTime,\n      ww: '%d Wochen',\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return deAt;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/de-at.js?");

/***/ }),

/***/ "./node_modules/moment/locale/de-ch.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/de-ch.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : German (Switzerland) [de-ch]\n//! author : sschueller : https://github.com/sschueller\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      m: ['eine Minute', 'einer Minute'],\n      h: ['eine Stunde', 'einer Stunde'],\n      d: ['ein Tag', 'einem Tag'],\n      dd: [number + ' Tage', number + ' Tagen'],\n      w: ['eine Woche', 'einer Woche'],\n      M: ['ein Monat', 'einem Monat'],\n      MM: [number + ' Monate', number + ' Monaten'],\n      y: ['ein Jahr', 'einem Jahr'],\n      yy: [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n  }\n\n  var deCh = moment.defineLocale('de-ch', {\n    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY HH:mm',\n      LLLL: 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[heute um] LT [Uhr]',\n      sameElse: 'L',\n      nextDay: '[morgen um] LT [Uhr]',\n      nextWeek: 'dddd [um] LT [Uhr]',\n      lastDay: '[gestern um] LT [Uhr]',\n      lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: 'vor %s',\n      s: 'ein paar Sekunden',\n      ss: '%d Sekunden',\n      m: processRelativeTime,\n      mm: '%d Minuten',\n      h: processRelativeTime,\n      hh: '%d Stunden',\n      d: processRelativeTime,\n      dd: processRelativeTime,\n      w: processRelativeTime,\n      ww: '%d Wochen',\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return deCh;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/de-ch.js?");

/***/ }),

/***/ "./node_modules/moment/locale/de.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/de.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : German [de]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elensúle: https://github.com/Oire\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      m: ['eine Minute', 'einer Minute'],\n      h: ['eine Stunde', 'einer Stunde'],\n      d: ['ein Tag', 'einem Tag'],\n      dd: [number + ' Tage', number + ' Tagen'],\n      w: ['eine Woche', 'einer Woche'],\n      M: ['ein Monat', 'einem Monat'],\n      MM: [number + ' Monate', number + ' Monaten'],\n      y: ['ein Jahr', 'einem Jahr'],\n      yy: [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n  }\n\n  var de = moment.defineLocale('de', {\n    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY HH:mm',\n      LLLL: 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[heute um] LT [Uhr]',\n      sameElse: 'L',\n      nextDay: '[morgen um] LT [Uhr]',\n      nextWeek: 'dddd [um] LT [Uhr]',\n      lastDay: '[gestern um] LT [Uhr]',\n      lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: 'vor %s',\n      s: 'ein paar Sekunden',\n      ss: '%d Sekunden',\n      m: processRelativeTime,\n      mm: '%d Minuten',\n      h: processRelativeTime,\n      hh: '%d Stunden',\n      d: processRelativeTime,\n      dd: processRelativeTime,\n      w: processRelativeTime,\n      ww: '%d Wochen',\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return de;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/de.js?");

/***/ }),

/***/ "./node_modules/moment/locale/dv.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/dv.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Maldivian [dv]\n//! author : Jawish Hameed : https://github.com/jawish\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var months = ['ޖެނުއަރީ', 'ފެބްރުއަރީ', 'މާރިޗު', 'އޭޕްރީލު', 'މޭ', 'ޖޫން', 'ޖުލައި', 'އޯގަސްޓު', 'ސެޕްޓެމްބަރު', 'އޮކްޓޯބަރު', 'ނޮވެމްބަރު', 'ޑިސެމްބަރު'],\n      weekdays = ['އާދިއްތަ', 'ހޯމަ', 'އަންގާރަ', 'ބުދަ', 'ބުރާސްފަތި', 'ހުކުރު', 'ހޮނިހިރު'];\n  var dv = moment.defineLocale('dv', {\n    months: months,\n    monthsShort: months,\n    weekdays: weekdays,\n    weekdaysShort: weekdays,\n    weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'D/M/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /މކ|މފ/,\n    isPM: function isPM(input) {\n      return 'މފ' === input;\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'މކ';\n      } else {\n        return 'މފ';\n      }\n    },\n    calendar: {\n      sameDay: '[މިއަދު] LT',\n      nextDay: '[މާދަމާ] LT',\n      nextWeek: 'dddd LT',\n      lastDay: '[އިއްޔެ] LT',\n      lastWeek: '[ފާއިތުވި] dddd LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'ތެރޭގައި %s',\n      past: 'ކުރިން %s',\n      s: 'ސިކުންތުކޮޅެއް',\n      ss: 'd% ސިކުންތު',\n      m: 'މިނިޓެއް',\n      mm: 'މިނިޓު %d',\n      h: 'ގަޑިއިރެއް',\n      hh: 'ގަޑިއިރު %d',\n      d: 'ދުވަހެއް',\n      dd: 'ދުވަސް %d',\n      M: 'މަހެއް',\n      MM: 'މަސް %d',\n      y: 'އަހަރެއް',\n      yy: 'އަހަރު %d'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/,/g, '،');\n    },\n    week: {\n      dow: 7,\n      // Sunday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return dv;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/dv.js?");

/***/ }),

/***/ "./node_modules/moment/locale/el.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/el.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Greek [el]\n//! author : Aggelos Karalias : https://github.com/mehiel\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function isFunction(input) {\n    return typeof Function !== 'undefined' && input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n  }\n\n  var el = moment.defineLocale('el', {\n    monthsNominativeEl: 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),\n    monthsGenitiveEl: 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),\n    months: function months(momentToFormat, format) {\n      if (!momentToFormat) {\n        return this._monthsNominativeEl;\n      } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) {\n        // if there is a day number before 'MMMM'\n        return this._monthsGenitiveEl[momentToFormat.month()];\n      } else {\n        return this._monthsNominativeEl[momentToFormat.month()];\n      }\n    },\n    monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),\n    weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),\n    weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),\n    weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours > 11) {\n        return isLower ? 'μμ' : 'ΜΜ';\n      } else {\n        return isLower ? 'πμ' : 'ΠΜ';\n      }\n    },\n    isPM: function isPM(input) {\n      return (input + '').toLowerCase()[0] === 'μ';\n    },\n    meridiemParse: /[ΠΜ]\\.?Μ?\\.?/i,\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY h:mm A',\n      LLLL: 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendarEl: {\n      sameDay: '[Σήμερα {}] LT',\n      nextDay: '[Αύριο {}] LT',\n      nextWeek: 'dddd [{}] LT',\n      lastDay: '[Χθες {}] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 6:\n            return '[το προηγούμενο] dddd [{}] LT';\n\n          default:\n            return '[την προηγούμενη] dddd [{}] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    calendar: function calendar(key, mom) {\n      var output = this._calendarEl[key],\n          hours = mom && mom.hours();\n\n      if (isFunction(output)) {\n        output = output.apply(mom);\n      }\n\n      return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');\n    },\n    relativeTime: {\n      future: 'σε %s',\n      past: '%s πριν',\n      s: 'λίγα δευτερόλεπτα',\n      ss: '%d δευτερόλεπτα',\n      m: 'ένα λεπτό',\n      mm: '%d λεπτά',\n      h: 'μία ώρα',\n      hh: '%d ώρες',\n      d: 'μία μέρα',\n      dd: '%d μέρες',\n      M: 'ένας μήνας',\n      MM: '%d μήνες',\n      y: 'ένας χρόνος',\n      yy: '%d χρόνια'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}η/,\n    ordinal: '%dη',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4st is the first week of the year.\n\n    }\n  });\n  return el;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/el.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-au.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-au.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (Australia) [en-au]\n//! author : Jared Morse : https://github.com/jarcoal\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enAu = moment.defineLocale('en-au', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY h:mm A',\n      LLLL: 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return enAu;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-au.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-ca.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-ca.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (Canada) [en-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enCa = moment.defineLocale('en-ca', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'YYYY-MM-DD',\n      LL: 'MMMM D, YYYY',\n      LLL: 'MMMM D, YYYY h:mm A',\n      LLLL: 'dddd, MMMM D, YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    }\n  });\n  return enCa;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-ca.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-gb.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-gb.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (United Kingdom) [en-gb]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enGb = moment.defineLocale('en-gb', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return enGb;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-gb.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-ie.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-ie.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (Ireland) [en-ie]\n//! author : Chris Cartlidge : https://github.com/chriscartlidge\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enIe = moment.defineLocale('en-ie', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return enIe;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-ie.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-il.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-il.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (Israel) [en-il]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enIl = moment.defineLocale('en-il', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    }\n  });\n  return enIl;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-il.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-in.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-in.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (India) [en-in]\n//! author : Jatin Agrawal : https://github.com/jatinag22\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enIn = moment.defineLocale('en-in', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY h:mm A',\n      LLLL: 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 1st is the first week of the year.\n\n    }\n  });\n  return enIn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-in.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-nz.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-nz.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (New Zealand) [en-nz]\n//! author : Luke McGregor : https://github.com/lukemcgregor\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enNz = moment.defineLocale('en-nz', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY h:mm A',\n      LLLL: 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return enNz;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-nz.js?");

/***/ }),

/***/ "./node_modules/moment/locale/en-sg.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/en-sg.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : English (Singapore) [en-sg]\n//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var enSg = moment.defineLocale('en-sg', {\n    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Today at] LT',\n      nextDay: '[Tomorrow at] LT',\n      nextWeek: 'dddd [at] LT',\n      lastDay: '[Yesterday at] LT',\n      lastWeek: '[Last] dddd [at] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'in %s',\n      past: '%s ago',\n      s: 'a few seconds',\n      ss: '%d seconds',\n      m: 'a minute',\n      mm: '%d minutes',\n      h: 'an hour',\n      hh: '%d hours',\n      d: 'a day',\n      dd: '%d days',\n      M: 'a month',\n      MM: '%d months',\n      y: 'a year',\n      yy: '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return enSg;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/en-sg.js?");

/***/ }),

/***/ "./node_modules/moment/locale/eo.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/eo.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Esperanto [eo]\n//! author : Colin Dean : https://github.com/colindean\n//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia\n//! comment : miestasmia corrected the translation by colindean\n//! comment : Vivakvo corrected the translation by colindean and miestasmia\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var eo = moment.defineLocale('eo', {\n    months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),\n    monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),\n    weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),\n    weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),\n    weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY-MM-DD',\n      LL: '[la] D[-an de] MMMM, YYYY',\n      LLL: '[la] D[-an de] MMMM, YYYY HH:mm',\n      LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',\n      llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm'\n    },\n    meridiemParse: /[ap]\\.t\\.m/i,\n    isPM: function isPM(input) {\n      return input.charAt(0).toLowerCase() === 'p';\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours > 11) {\n        return isLower ? 'p.t.m.' : 'P.T.M.';\n      } else {\n        return isLower ? 'a.t.m.' : 'A.T.M.';\n      }\n    },\n    calendar: {\n      sameDay: '[Hodiaŭ je] LT',\n      nextDay: '[Morgaŭ je] LT',\n      nextWeek: 'dddd[n je] LT',\n      lastDay: '[Hieraŭ je] LT',\n      lastWeek: '[pasintan] dddd[n je] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'post %s',\n      past: 'antaŭ %s',\n      s: 'kelkaj sekundoj',\n      ss: '%d sekundoj',\n      m: 'unu minuto',\n      mm: '%d minutoj',\n      h: 'unu horo',\n      hh: '%d horoj',\n      d: 'unu tago',\n      //ne 'diurno', ĉar estas uzita por proksimumo\n      dd: '%d tagoj',\n      M: 'unu monato',\n      MM: '%d monatoj',\n      y: 'unu jaro',\n      yy: '%d jaroj'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}a/,\n    ordinal: '%da',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return eo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/eo.js?");

/***/ }),

/***/ "./node_modules/moment/locale/es-do.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/es-do.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Spanish (Dominican Republic) [es-do]\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n      _monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n      monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i],\n      monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n  var esDo = moment.defineLocale('es-do', {\n    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort: function monthsShort(m, format) {\n      if (!m) {\n        return monthsShortDot;\n      } else if (/-MMM-/.test(format)) {\n        return _monthsShort[m.month()];\n      } else {\n        return monthsShortDot[m.month()];\n      }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex: /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'DD/MM/YYYY',\n      LL: 'D [de] MMMM [de] YYYY',\n      LLL: 'D [de] MMMM [de] YYYY h:mm A',\n      LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: function sameDay() {\n        return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextDay: function nextDay() {\n        return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextWeek: function nextWeek() {\n        return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastDay: function lastDay() {\n        return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastWeek: function lastWeek() {\n        return '[el] dddd [pasado a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'en %s',\n      past: 'hace %s',\n      s: 'unos segundos',\n      ss: '%d segundos',\n      m: 'un minuto',\n      mm: '%d minutos',\n      h: 'una hora',\n      hh: '%d horas',\n      d: 'un día',\n      dd: '%d días',\n      w: 'una semana',\n      ww: '%d semanas',\n      M: 'un mes',\n      MM: '%d meses',\n      y: 'un año',\n      yy: '%d años'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return esDo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/es-do.js?");

/***/ }),

/***/ "./node_modules/moment/locale/es-mx.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/es-mx.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Spanish (Mexico) [es-mx]\n//! author : JC Franco : https://github.com/jcfranco\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n      _monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n      monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i],\n      monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n  var esMx = moment.defineLocale('es-mx', {\n    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort: function monthsShort(m, format) {\n      if (!m) {\n        return monthsShortDot;\n      } else if (/-MMM-/.test(format)) {\n        return _monthsShort[m.month()];\n      } else {\n        return monthsShortDot[m.month()];\n      }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex: /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D [de] MMMM [de] YYYY',\n      LLL: 'D [de] MMMM [de] YYYY H:mm',\n      LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm'\n    },\n    calendar: {\n      sameDay: function sameDay() {\n        return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextDay: function nextDay() {\n        return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextWeek: function nextWeek() {\n        return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastDay: function lastDay() {\n        return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastWeek: function lastWeek() {\n        return '[el] dddd [pasado a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'en %s',\n      past: 'hace %s',\n      s: 'unos segundos',\n      ss: '%d segundos',\n      m: 'un minuto',\n      mm: '%d minutos',\n      h: 'una hora',\n      hh: '%d horas',\n      d: 'un día',\n      dd: '%d días',\n      w: 'una semana',\n      ww: '%d semanas',\n      M: 'un mes',\n      MM: '%d meses',\n      y: 'un año',\n      yy: '%d años'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    },\n    invalidDate: 'Fecha inválida'\n  });\n  return esMx;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/es-mx.js?");

/***/ }),

/***/ "./node_modules/moment/locale/es-us.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/es-us.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Spanish (United States) [es-us]\n//! author : bustta : https://github.com/bustta\n//! author : chrisrodz : https://github.com/chrisrodz\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n      _monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n      monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i],\n      monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n  var esUs = moment.defineLocale('es-us', {\n    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort: function monthsShort(m, format) {\n      if (!m) {\n        return monthsShortDot;\n      } else if (/-MMM-/.test(format)) {\n        return _monthsShort[m.month()];\n      } else {\n        return monthsShortDot[m.month()];\n      }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex: /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'MM/DD/YYYY',\n      LL: 'D [de] MMMM [de] YYYY',\n      LLL: 'D [de] MMMM [de] YYYY h:mm A',\n      LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: function sameDay() {\n        return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextDay: function nextDay() {\n        return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextWeek: function nextWeek() {\n        return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastDay: function lastDay() {\n        return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastWeek: function lastWeek() {\n        return '[el] dddd [pasado a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'en %s',\n      past: 'hace %s',\n      s: 'unos segundos',\n      ss: '%d segundos',\n      m: 'un minuto',\n      mm: '%d minutos',\n      h: 'una hora',\n      hh: '%d horas',\n      d: 'un día',\n      dd: '%d días',\n      w: 'una semana',\n      ww: '%d semanas',\n      M: 'un mes',\n      MM: '%d meses',\n      y: 'un año',\n      yy: '%d años'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return esUs;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/es-us.js?");

/***/ }),

/***/ "./node_modules/moment/locale/es.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/es.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Spanish [es]\n//! author : Julio Napurí : https://github.com/julionc\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n      _monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n      monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i],\n      monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n  var es = moment.defineLocale('es', {\n    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort: function monthsShort(m, format) {\n      if (!m) {\n        return monthsShortDot;\n      } else if (/-MMM-/.test(format)) {\n        return _monthsShort[m.month()];\n      } else {\n        return monthsShortDot[m.month()];\n      }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex: /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D [de] MMMM [de] YYYY',\n      LLL: 'D [de] MMMM [de] YYYY H:mm',\n      LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm'\n    },\n    calendar: {\n      sameDay: function sameDay() {\n        return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextDay: function nextDay() {\n        return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      nextWeek: function nextWeek() {\n        return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastDay: function lastDay() {\n        return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      lastWeek: function lastWeek() {\n        return '[el] dddd [pasado a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'en %s',\n      past: 'hace %s',\n      s: 'unos segundos',\n      ss: '%d segundos',\n      m: 'un minuto',\n      mm: '%d minutos',\n      h: 'una hora',\n      hh: '%d horas',\n      d: 'un día',\n      dd: '%d días',\n      w: 'una semana',\n      ww: '%d semanas',\n      M: 'un mes',\n      MM: '%d meses',\n      y: 'un año',\n      yy: '%d años'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    },\n    invalidDate: 'Fecha inválida'\n  });\n  return es;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/es.js?");

/***/ }),

/***/ "./node_modules/moment/locale/et.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/et.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Estonian [et]\n//! author : Henry Kehlmann : https://github.com/madhenry\n//! improvements : Illimar Tambek : https://github.com/ragulka\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],\n      ss: [number + 'sekundi', number + 'sekundit'],\n      m: ['ühe minuti', 'üks minut'],\n      mm: [number + ' minuti', number + ' minutit'],\n      h: ['ühe tunni', 'tund aega', 'üks tund'],\n      hh: [number + ' tunni', number + ' tundi'],\n      d: ['ühe päeva', 'üks päev'],\n      M: ['kuu aja', 'kuu aega', 'üks kuu'],\n      MM: [number + ' kuu', number + ' kuud'],\n      y: ['ühe aasta', 'aasta', 'üks aasta'],\n      yy: [number + ' aasta', number + ' aastat']\n    };\n\n    if (withoutSuffix) {\n      return format[key][2] ? format[key][2] : format[key][1];\n    }\n\n    return isFuture ? format[key][0] : format[key][1];\n  }\n\n  var et = moment.defineLocale('et', {\n    months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),\n    monthsShort: 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),\n    weekdays: 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),\n    weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),\n    weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY H:mm',\n      LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[Täna,] LT',\n      nextDay: '[Homme,] LT',\n      nextWeek: '[Järgmine] dddd LT',\n      lastDay: '[Eile,] LT',\n      lastWeek: '[Eelmine] dddd LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s pärast',\n      past: '%s tagasi',\n      s: processRelativeTime,\n      ss: processRelativeTime,\n      m: processRelativeTime,\n      mm: processRelativeTime,\n      h: processRelativeTime,\n      hh: processRelativeTime,\n      d: processRelativeTime,\n      dd: '%d päeva',\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return et;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/et.js?");

/***/ }),

/***/ "./node_modules/moment/locale/eu.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/eu.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Basque [eu]\n//! author : Eneko Illarramendi : https://github.com/eillarra\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var eu = moment.defineLocale('eu', {\n    months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),\n    monthsShort: 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),\n    weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),\n    weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY-MM-DD',\n      LL: 'YYYY[ko] MMMM[ren] D[a]',\n      LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',\n      LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',\n      l: 'YYYY-M-D',\n      ll: 'YYYY[ko] MMM D[a]',\n      lll: 'YYYY[ko] MMM D[a] HH:mm',\n      llll: 'ddd, YYYY[ko] MMM D[a] HH:mm'\n    },\n    calendar: {\n      sameDay: '[gaur] LT[etan]',\n      nextDay: '[bihar] LT[etan]',\n      nextWeek: 'dddd LT[etan]',\n      lastDay: '[atzo] LT[etan]',\n      lastWeek: '[aurreko] dddd LT[etan]',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s barru',\n      past: 'duela %s',\n      s: 'segundo batzuk',\n      ss: '%d segundo',\n      m: 'minutu bat',\n      mm: '%d minutu',\n      h: 'ordu bat',\n      hh: '%d ordu',\n      d: 'egun bat',\n      dd: '%d egun',\n      M: 'hilabete bat',\n      MM: '%d hilabete',\n      y: 'urte bat',\n      yy: '%d urte'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return eu;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/eu.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fa.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/fa.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Persian [fa]\n//! author : Ebrahim Byagowi : https://github.com/ebraminio\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '۱',\n    2: '۲',\n    3: '۳',\n    4: '۴',\n    5: '۵',\n    6: '۶',\n    7: '۷',\n    8: '۸',\n    9: '۹',\n    0: '۰'\n  },\n      numberMap = {\n    '۱': '1',\n    '۲': '2',\n    '۳': '3',\n    '۴': '4',\n    '۵': '5',\n    '۶': '6',\n    '۷': '7',\n    '۸': '8',\n    '۹': '9',\n    '۰': '0'\n  };\n  var fa = moment.defineLocale('fa', {\n    months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),\n    monthsShort: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),\n    weekdays: \"\\u06CC\\u06A9\\u200C\\u0634\\u0646\\u0628\\u0647_\\u062F\\u0648\\u0634\\u0646\\u0628\\u0647_\\u0633\\u0647\\u200C\\u0634\\u0646\\u0628\\u0647_\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647_\\u067E\\u0646\\u062C\\u200C\\u0634\\u0646\\u0628\\u0647_\\u062C\\u0645\\u0639\\u0647_\\u0634\\u0646\\u0628\\u0647\".split('_'),\n    weekdaysShort: \"\\u06CC\\u06A9\\u200C\\u0634\\u0646\\u0628\\u0647_\\u062F\\u0648\\u0634\\u0646\\u0628\\u0647_\\u0633\\u0647\\u200C\\u0634\\u0646\\u0628\\u0647_\\u0686\\u0647\\u0627\\u0631\\u0634\\u0646\\u0628\\u0647_\\u067E\\u0646\\u062C\\u200C\\u0634\\u0646\\u0628\\u0647_\\u062C\\u0645\\u0639\\u0647_\\u0634\\u0646\\u0628\\u0647\".split('_'),\n    weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /قبل از ظهر|بعد از ظهر/,\n    isPM: function isPM(input) {\n      return /بعد از ظهر/.test(input);\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'قبل از ظهر';\n      } else {\n        return 'بعد از ظهر';\n      }\n    },\n    calendar: {\n      sameDay: '[امروز ساعت] LT',\n      nextDay: '[فردا ساعت] LT',\n      nextWeek: 'dddd [ساعت] LT',\n      lastDay: '[دیروز ساعت] LT',\n      lastWeek: 'dddd [پیش] [ساعت] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'در %s',\n      past: '%s پیش',\n      s: 'چند ثانیه',\n      ss: '%d ثانیه',\n      m: 'یک دقیقه',\n      mm: '%d دقیقه',\n      h: 'یک ساعت',\n      hh: '%d ساعت',\n      d: 'یک روز',\n      dd: '%d روز',\n      M: 'یک ماه',\n      MM: '%d ماه',\n      y: 'یک سال',\n      yy: '%d سال'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[۰-۹]/g, function (match) {\n        return numberMap[match];\n      }).replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      }).replace(/,/g, '،');\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}م/,\n    ordinal: '%dم',\n    week: {\n      dow: 6,\n      // Saturday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return fa;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fa.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fi.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/fi.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Finnish [fi]\n//! author : Tarmo Aidantausta : https://github.com/bleadof\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),\n      numbersFuture = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', numbersPast[7], numbersPast[8], numbersPast[9]];\n\n  function translate(number, withoutSuffix, key, isFuture) {\n    var result = '';\n\n    switch (key) {\n      case 's':\n        return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';\n\n      case 'ss':\n        result = isFuture ? 'sekunnin' : 'sekuntia';\n        break;\n\n      case 'm':\n        return isFuture ? 'minuutin' : 'minuutti';\n\n      case 'mm':\n        result = isFuture ? 'minuutin' : 'minuuttia';\n        break;\n\n      case 'h':\n        return isFuture ? 'tunnin' : 'tunti';\n\n      case 'hh':\n        result = isFuture ? 'tunnin' : 'tuntia';\n        break;\n\n      case 'd':\n        return isFuture ? 'päivän' : 'päivä';\n\n      case 'dd':\n        result = isFuture ? 'päivän' : 'päivää';\n        break;\n\n      case 'M':\n        return isFuture ? 'kuukauden' : 'kuukausi';\n\n      case 'MM':\n        result = isFuture ? 'kuukauden' : 'kuukautta';\n        break;\n\n      case 'y':\n        return isFuture ? 'vuoden' : 'vuosi';\n\n      case 'yy':\n        result = isFuture ? 'vuoden' : 'vuotta';\n        break;\n    }\n\n    result = verbalNumber(number, isFuture) + ' ' + result;\n    return result;\n  }\n\n  function verbalNumber(number, isFuture) {\n    return number < 10 ? isFuture ? numbersFuture[number] : numbersPast[number] : number;\n  }\n\n  var fi = moment.defineLocale('fi', {\n    months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),\n    monthsShort: 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),\n    weekdays: 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),\n    weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),\n    weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),\n    longDateFormat: {\n      LT: 'HH.mm',\n      LTS: 'HH.mm.ss',\n      L: 'DD.MM.YYYY',\n      LL: 'Do MMMM[ta] YYYY',\n      LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',\n      LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',\n      l: 'D.M.YYYY',\n      ll: 'Do MMM YYYY',\n      lll: 'Do MMM YYYY, [klo] HH.mm',\n      llll: 'ddd, Do MMM YYYY, [klo] HH.mm'\n    },\n    calendar: {\n      sameDay: '[tänään] [klo] LT',\n      nextDay: '[huomenna] [klo] LT',\n      nextWeek: 'dddd [klo] LT',\n      lastDay: '[eilen] [klo] LT',\n      lastWeek: '[viime] dddd[na] [klo] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s päästä',\n      past: '%s sitten',\n      s: translate,\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: translate,\n      dd: translate,\n      M: translate,\n      MM: translate,\n      y: translate,\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return fi;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fi.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fil.js":
/*!*******************************************!*\
  !*** ./node_modules/moment/locale/fil.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Filipino [fil]\n//! author : Dan Hagman : https://github.com/hagmandan\n//! author : Matthew Co : https://github.com/matthewdeeco\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var fil = moment.defineLocale('fil', {\n    months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),\n    monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n    weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),\n    weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n    weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'MM/D/YYYY',\n      LL: 'MMMM D, YYYY',\n      LLL: 'MMMM D, YYYY HH:mm',\n      LLLL: 'dddd, MMMM DD, YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: 'LT [ngayong araw]',\n      nextDay: '[Bukas ng] LT',\n      nextWeek: 'LT [sa susunod na] dddd',\n      lastDay: 'LT [kahapon]',\n      lastWeek: 'LT [noong nakaraang] dddd',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'sa loob ng %s',\n      past: '%s ang nakalipas',\n      s: 'ilang segundo',\n      ss: '%d segundo',\n      m: 'isang minuto',\n      mm: '%d minuto',\n      h: 'isang oras',\n      hh: '%d oras',\n      d: 'isang araw',\n      dd: '%d araw',\n      M: 'isang buwan',\n      MM: '%d buwan',\n      y: 'isang taon',\n      yy: '%d taon'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal: function ordinal(number) {\n      return number;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return fil;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fil.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fo.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/fo.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Faroese [fo]\n//! author : Ragnar Johannesen : https://github.com/ragnar123\n//! author : Kristian Sakarisson : https://github.com/sakarisson\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var fo = moment.defineLocale('fo', {\n    months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n    weekdays: 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),\n    weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),\n    weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D. MMMM, YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Í dag kl.] LT',\n      nextDay: '[Í morgin kl.] LT',\n      nextWeek: 'dddd [kl.] LT',\n      lastDay: '[Í gjár kl.] LT',\n      lastWeek: '[síðstu] dddd [kl] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'um %s',\n      past: '%s síðani',\n      s: 'fá sekund',\n      ss: '%d sekundir',\n      m: 'ein minuttur',\n      mm: '%d minuttir',\n      h: 'ein tími',\n      hh: '%d tímar',\n      d: 'ein dagur',\n      dd: '%d dagar',\n      M: 'ein mánaður',\n      MM: '%d mánaðir',\n      y: 'eitt ár',\n      yy: '%d ár'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return fo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fo.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fr-ca.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/fr-ca.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : French (Canada) [fr-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var frCa = moment.defineLocale('fr-ca', {\n    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY-MM-DD',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Aujourd’hui à] LT',\n      nextDay: '[Demain à] LT',\n      nextWeek: 'dddd [à] LT',\n      lastDay: '[Hier à] LT',\n      lastWeek: 'dddd [dernier à] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'dans %s',\n      past: 'il y a %s',\n      s: 'quelques secondes',\n      ss: '%d secondes',\n      m: 'une minute',\n      mm: '%d minutes',\n      h: 'une heure',\n      hh: '%d heures',\n      d: 'un jour',\n      dd: '%d jours',\n      M: 'un mois',\n      MM: '%d mois',\n      y: 'un an',\n      yy: '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        // Words with masculine grammatical gender: mois, trimestre, jour\n        default:\n        case 'M':\n        case 'Q':\n        case 'D':\n        case 'DDD':\n        case 'd':\n          return number + (number === 1 ? 'er' : 'e');\n        // Words with feminine grammatical gender: semaine\n\n        case 'w':\n        case 'W':\n          return number + (number === 1 ? 're' : 'e');\n      }\n    }\n  });\n  return frCa;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fr-ca.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fr-ch.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/fr-ch.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : French (Switzerland) [fr-ch]\n//! author : Gaspard Bucher : https://github.com/gaspard\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var frCh = moment.defineLocale('fr-ch', {\n    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Aujourd’hui à] LT',\n      nextDay: '[Demain à] LT',\n      nextWeek: 'dddd [à] LT',\n      lastDay: '[Hier à] LT',\n      lastWeek: 'dddd [dernier à] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'dans %s',\n      past: 'il y a %s',\n      s: 'quelques secondes',\n      ss: '%d secondes',\n      m: 'une minute',\n      mm: '%d minutes',\n      h: 'une heure',\n      hh: '%d heures',\n      d: 'un jour',\n      dd: '%d jours',\n      M: 'un mois',\n      MM: '%d mois',\n      y: 'un an',\n      yy: '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        // Words with masculine grammatical gender: mois, trimestre, jour\n        default:\n        case 'M':\n        case 'Q':\n        case 'D':\n        case 'DDD':\n        case 'd':\n          return number + (number === 1 ? 'er' : 'e');\n        // Words with feminine grammatical gender: semaine\n\n        case 'w':\n        case 'W':\n          return number + (number === 1 ? 're' : 'e');\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return frCh;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fr-ch.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fr.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/fr.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : French [fr]\n//! author : John Fischer : https://github.com/jfroffice\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsStrictRegex = /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n      monthsShortStrictRegex = /(janv\\.?|févr\\.?|mars|avr\\.?|mai|juin|juil\\.?|août|sept\\.?|oct\\.?|nov\\.?|déc\\.?)/i,\n      monthsRegex = /(janv\\.?|févr\\.?|mars|avr\\.?|mai|juin|juil\\.?|août|sept\\.?|oct\\.?|nov\\.?|déc\\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n      monthsParse = [/^janv/i, /^févr/i, /^mars/i, /^avr/i, /^mai/i, /^juin/i, /^juil/i, /^août/i, /^sept/i, /^oct/i, /^nov/i, /^déc/i];\n  var fr = moment.defineLocale('fr', {\n    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: monthsStrictRegex,\n    monthsShortStrictRegex: monthsShortStrictRegex,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Aujourd’hui à] LT',\n      nextDay: '[Demain à] LT',\n      nextWeek: 'dddd [à] LT',\n      lastDay: '[Hier à] LT',\n      lastWeek: 'dddd [dernier à] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'dans %s',\n      past: 'il y a %s',\n      s: 'quelques secondes',\n      ss: '%d secondes',\n      m: 'une minute',\n      mm: '%d minutes',\n      h: 'une heure',\n      hh: '%d heures',\n      d: 'un jour',\n      dd: '%d jours',\n      w: 'une semaine',\n      ww: '%d semaines',\n      M: 'un mois',\n      MM: '%d mois',\n      y: 'un an',\n      yy: '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        // TODO: Return 'e' when day of month > 1. Move this case inside\n        // block for masculine words below.\n        // See https://github.com/moment/moment/issues/3375\n        case 'D':\n          return number + (number === 1 ? 'er' : '');\n        // Words with masculine grammatical gender: mois, trimestre, jour\n\n        default:\n        case 'M':\n        case 'Q':\n        case 'DDD':\n        case 'd':\n          return number + (number === 1 ? 'er' : 'e');\n        // Words with feminine grammatical gender: semaine\n\n        case 'w':\n        case 'W':\n          return number + (number === 1 ? 're' : 'e');\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return fr;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fr.js?");

/***/ }),

/***/ "./node_modules/moment/locale/fy.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/fy.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Frisian [fy]\n//! author : Robin van der Vliet : https://github.com/robin0van0der0v\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),\n      monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');\n  var fy = moment.defineLocale('fy', {\n    months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),\n    monthsShort: function monthsShort(m, format) {\n      if (!m) {\n        return monthsShortWithDots;\n      } else if (/-MMM-/.test(format)) {\n        return monthsShortWithoutDots[m.month()];\n      } else {\n        return monthsShortWithDots[m.month()];\n      }\n    },\n    monthsParseExact: true,\n    weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),\n    weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),\n    weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD-MM-YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[hjoed om] LT',\n      nextDay: '[moarn om] LT',\n      nextWeek: 'dddd [om] LT',\n      lastDay: '[juster om] LT',\n      lastWeek: '[ôfrûne] dddd [om] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'oer %s',\n      past: '%s lyn',\n      s: 'in pear sekonden',\n      ss: '%d sekonden',\n      m: 'ien minút',\n      mm: '%d minuten',\n      h: 'ien oere',\n      hh: '%d oeren',\n      d: 'ien dei',\n      dd: '%d dagen',\n      M: 'ien moanne',\n      MM: '%d moannen',\n      y: 'ien jier',\n      yy: '%d jierren'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal: function ordinal(number) {\n      return number + (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de');\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return fy;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/fy.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ga.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ga.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Irish or Irish Gaelic [ga]\n//! author : André Silva : https://github.com/askpt\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var months = ['Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Meitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deireadh Fómhair', 'Samhain', 'Nollaig'],\n      monthsShort = ['Ean', 'Feabh', 'Márt', 'Aib', 'Beal', 'Meith', 'Iúil', 'Lún', 'M.F.', 'D.F.', 'Samh', 'Noll'],\n      weekdays = ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Sathairn'],\n      weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],\n      weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];\n  var ga = moment.defineLocale('ga', {\n    months: months,\n    monthsShort: monthsShort,\n    monthsParseExact: true,\n    weekdays: weekdays,\n    weekdaysShort: weekdaysShort,\n    weekdaysMin: weekdaysMin,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Inniu ag] LT',\n      nextDay: '[Amárach ag] LT',\n      nextWeek: 'dddd [ag] LT',\n      lastDay: '[Inné ag] LT',\n      lastWeek: 'dddd [seo caite] [ag] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'i %s',\n      past: '%s ó shin',\n      s: 'cúpla soicind',\n      ss: '%d soicind',\n      m: 'nóiméad',\n      mm: '%d nóiméad',\n      h: 'uair an chloig',\n      hh: '%d uair an chloig',\n      d: 'lá',\n      dd: '%d lá',\n      M: 'mí',\n      MM: '%d míonna',\n      y: 'bliain',\n      yy: '%d bliain'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n    ordinal: function ordinal(number) {\n      var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return ga;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ga.js?");

/***/ }),

/***/ "./node_modules/moment/locale/gd.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/gd.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Scottish Gaelic [gd]\n//! author : Jon Ashdown : https://github.com/jonashdown\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var months = ['Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'],\n      monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'],\n      weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'],\n      weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],\n      weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];\n  var gd = moment.defineLocale('gd', {\n    months: months,\n    monthsShort: monthsShort,\n    monthsParseExact: true,\n    weekdays: weekdays,\n    weekdaysShort: weekdaysShort,\n    weekdaysMin: weekdaysMin,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[An-diugh aig] LT',\n      nextDay: '[A-màireach aig] LT',\n      nextWeek: 'dddd [aig] LT',\n      lastDay: '[An-dè aig] LT',\n      lastWeek: 'dddd [seo chaidh] [aig] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'ann an %s',\n      past: 'bho chionn %s',\n      s: 'beagan diogan',\n      ss: '%d diogan',\n      m: 'mionaid',\n      mm: '%d mionaidean',\n      h: 'uair',\n      hh: '%d uairean',\n      d: 'latha',\n      dd: '%d latha',\n      M: 'mìos',\n      MM: '%d mìosan',\n      y: 'bliadhna',\n      yy: '%d bliadhna'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n    ordinal: function ordinal(number) {\n      var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return gd;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/gd.js?");

/***/ }),

/***/ "./node_modules/moment/locale/gl.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/gl.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Galician [gl]\n//! author : Juan G. Hurtado : https://github.com/juanghurtado\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var gl = moment.defineLocale('gl', {\n    months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),\n    monthsShort: 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),\n    weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),\n    weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D [de] MMMM [de] YYYY',\n      LLL: 'D [de] MMMM [de] YYYY H:mm',\n      LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm'\n    },\n    calendar: {\n      sameDay: function sameDay() {\n        return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';\n      },\n      nextDay: function nextDay() {\n        return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';\n      },\n      nextWeek: function nextWeek() {\n        return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';\n      },\n      lastDay: function lastDay() {\n        return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';\n      },\n      lastWeek: function lastWeek() {\n        return '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: function future(str) {\n        if (str.indexOf('un') === 0) {\n          return 'n' + str;\n        }\n\n        return 'en ' + str;\n      },\n      past: 'hai %s',\n      s: 'uns segundos',\n      ss: '%d segundos',\n      m: 'un minuto',\n      mm: '%d minutos',\n      h: 'unha hora',\n      hh: '%d horas',\n      d: 'un día',\n      dd: '%d días',\n      M: 'un mes',\n      MM: '%d meses',\n      y: 'un ano',\n      yy: '%d anos'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return gl;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/gl.js?");

/***/ }),

/***/ "./node_modules/moment/locale/gom-deva.js":
/*!************************************************!*\
  !*** ./node_modules/moment/locale/gom-deva.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Konkani Devanagari script [gom-deva]\n//! author : The Discoverer : https://github.com/WikiDiscoverer\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],\n      ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],\n      m: ['एका मिणटान', 'एक मिनूट'],\n      mm: [number + ' मिणटांनी', number + ' मिणटां'],\n      h: ['एका वरान', 'एक वर'],\n      hh: [number + ' वरांनी', number + ' वरां'],\n      d: ['एका दिसान', 'एक दीस'],\n      dd: [number + ' दिसांनी', number + ' दीस'],\n      M: ['एका म्हयन्यान', 'एक म्हयनो'],\n      MM: [number + ' म्हयन्यानी', number + ' म्हयने'],\n      y: ['एका वर्सान', 'एक वर्स'],\n      yy: [number + ' वर्सांनी', number + ' वर्सां']\n    };\n    return isFuture ? format[key][0] : format[key][1];\n  }\n\n  var gomDeva = moment.defineLocale('gom-deva', {\n    months: {\n      standalone: 'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),\n      format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split('_'),\n      isFormat: /MMMM(\\s)+D[oD]?/\n    },\n    monthsShort: 'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),\n    weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),\n    weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'A h:mm [वाजतां]',\n      LTS: 'A h:mm:ss [वाजतां]',\n      L: 'DD-MM-YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY A h:mm [वाजतां]',\n      LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',\n      llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]'\n    },\n    calendar: {\n      sameDay: '[आयज] LT',\n      nextDay: '[फाल्यां] LT',\n      nextWeek: '[फुडलो] dddd[,] LT',\n      lastDay: '[काल] LT',\n      lastWeek: '[फाटलो] dddd[,] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s',\n      past: '%s आदीं',\n      s: processRelativeTime,\n      ss: processRelativeTime,\n      m: processRelativeTime,\n      mm: processRelativeTime,\n      h: processRelativeTime,\n      hh: processRelativeTime,\n      d: processRelativeTime,\n      dd: processRelativeTime,\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(वेर)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        // the ordinal 'वेर' only applies to day of the month\n        case 'D':\n          return number + 'वेर';\n\n        default:\n        case 'M':\n        case 'Q':\n        case 'DDD':\n        case 'd':\n        case 'w':\n        case 'W':\n          return number;\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week\n      doy: 3 // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)\n\n    },\n    meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'राती') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'सकाळीं') {\n        return hour;\n      } else if (meridiem === 'दनपारां') {\n        return hour > 12 ? hour : hour + 12;\n      } else if (meridiem === 'सांजे') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'राती';\n      } else if (hour < 12) {\n        return 'सकाळीं';\n      } else if (hour < 16) {\n        return 'दनपारां';\n      } else if (hour < 20) {\n        return 'सांजे';\n      } else {\n        return 'राती';\n      }\n    }\n  });\n  return gomDeva;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/gom-deva.js?");

/***/ }),

/***/ "./node_modules/moment/locale/gom-latn.js":
/*!************************************************!*\
  !*** ./node_modules/moment/locale/gom-latn.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Konkani Latin script [gom-latn]\n//! author : The Discoverer : https://github.com/WikiDiscoverer\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      s: ['thoddea sekondamni', 'thodde sekond'],\n      ss: [number + ' sekondamni', number + ' sekond'],\n      m: ['eka mintan', 'ek minut'],\n      mm: [number + ' mintamni', number + ' mintam'],\n      h: ['eka voran', 'ek vor'],\n      hh: [number + ' voramni', number + ' voram'],\n      d: ['eka disan', 'ek dis'],\n      dd: [number + ' disamni', number + ' dis'],\n      M: ['eka mhoinean', 'ek mhoino'],\n      MM: [number + ' mhoineamni', number + ' mhoine'],\n      y: ['eka vorsan', 'ek voros'],\n      yy: [number + ' vorsamni', number + ' vorsam']\n    };\n    return isFuture ? format[key][0] : format[key][1];\n  }\n\n  var gomLatn = moment.defineLocale('gom-latn', {\n    months: {\n      standalone: 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'),\n      format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split('_'),\n      isFormat: /MMMM(\\s)+D[oD]?/\n    },\n    monthsShort: 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),\n    monthsParseExact: true,\n    weekdays: \"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var\".split('_'),\n    weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),\n    weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'A h:mm [vazta]',\n      LTS: 'A h:mm:ss [vazta]',\n      L: 'DD-MM-YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY A h:mm [vazta]',\n      LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',\n      llll: 'ddd, D MMM YYYY, A h:mm [vazta]'\n    },\n    calendar: {\n      sameDay: '[Aiz] LT',\n      nextDay: '[Faleam] LT',\n      nextWeek: '[Fuddlo] dddd[,] LT',\n      lastDay: '[Kal] LT',\n      lastWeek: '[Fattlo] dddd[,] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s',\n      past: '%s adim',\n      s: processRelativeTime,\n      ss: processRelativeTime,\n      m: processRelativeTime,\n      mm: processRelativeTime,\n      h: processRelativeTime,\n      hh: processRelativeTime,\n      d: processRelativeTime,\n      dd: processRelativeTime,\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        // the ordinal 'er' only applies to day of the month\n        case 'D':\n          return number + 'er';\n\n        default:\n        case 'M':\n        case 'Q':\n        case 'DDD':\n        case 'd':\n        case 'w':\n        case 'W':\n          return number;\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week\n      doy: 3 // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)\n\n    },\n    meridiemParse: /rati|sokallim|donparam|sanje/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'rati') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'sokallim') {\n        return hour;\n      } else if (meridiem === 'donparam') {\n        return hour > 12 ? hour : hour + 12;\n      } else if (meridiem === 'sanje') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'rati';\n      } else if (hour < 12) {\n        return 'sokallim';\n      } else if (hour < 16) {\n        return 'donparam';\n      } else if (hour < 20) {\n        return 'sanje';\n      } else {\n        return 'rati';\n      }\n    }\n  });\n  return gomLatn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/gom-latn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/gu.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/gu.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Gujarati [gu]\n//! author : Kaushik Thanki : https://github.com/Kaushik1987\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '૧',\n    2: '૨',\n    3: '૩',\n    4: '૪',\n    5: '૫',\n    6: '૬',\n    7: '૭',\n    8: '૮',\n    9: '૯',\n    0: '૦'\n  },\n      numberMap = {\n    '૧': '1',\n    '૨': '2',\n    '૩': '3',\n    '૪': '4',\n    '૫': '5',\n    '૬': '6',\n    '૭': '7',\n    '૮': '8',\n    '૯': '9',\n    '૦': '0'\n  };\n  var gu = moment.defineLocale('gu', {\n    months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'),\n    monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'),\n    weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),\n    weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm વાગ્યે',\n      LTS: 'A h:mm:ss વાગ્યે',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm વાગ્યે',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે'\n    },\n    calendar: {\n      sameDay: '[આજ] LT',\n      nextDay: '[કાલે] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[ગઇકાલે] LT',\n      lastWeek: '[પાછલા] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s મા',\n      past: '%s પહેલા',\n      s: 'અમુક પળો',\n      ss: '%d સેકંડ',\n      m: 'એક મિનિટ',\n      mm: '%d મિનિટ',\n      h: 'એક કલાક',\n      hh: '%d કલાક',\n      d: 'એક દિવસ',\n      dd: '%d દિવસ',\n      M: 'એક મહિનો',\n      MM: '%d મહિનો',\n      y: 'એક વર્ષ',\n      yy: '%d વર્ષ'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    // Gujarati notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.\n    meridiemParse: /રાત|બપોર|સવાર|સાંજ/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'રાત') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'સવાર') {\n        return hour;\n      } else if (meridiem === 'બપોર') {\n        return hour >= 10 ? hour : hour + 12;\n      } else if (meridiem === 'સાંજ') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'રાત';\n      } else if (hour < 10) {\n        return 'સવાર';\n      } else if (hour < 17) {\n        return 'બપોર';\n      } else if (hour < 20) {\n        return 'સાંજ';\n      } else {\n        return 'રાત';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return gu;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/gu.js?");

/***/ }),

/***/ "./node_modules/moment/locale/he.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/he.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Hebrew [he]\n//! author : Tomer Cohen : https://github.com/tomer\n//! author : Moshe Simantov : https://github.com/DevelopmentIL\n//! author : Tal Ater : https://github.com/TalAter\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var he = moment.defineLocale('he', {\n    months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),\n    monthsShort: 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),\n    weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),\n    weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),\n    weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D [ב]MMMM YYYY',\n      LLL: 'D [ב]MMMM YYYY HH:mm',\n      LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',\n      l: 'D/M/YYYY',\n      ll: 'D MMM YYYY',\n      lll: 'D MMM YYYY HH:mm',\n      llll: 'ddd, D MMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[היום ב־]LT',\n      nextDay: '[מחר ב־]LT',\n      nextWeek: 'dddd [בשעה] LT',\n      lastDay: '[אתמול ב־]LT',\n      lastWeek: '[ביום] dddd [האחרון בשעה] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'בעוד %s',\n      past: 'לפני %s',\n      s: 'מספר שניות',\n      ss: '%d שניות',\n      m: 'דקה',\n      mm: '%d דקות',\n      h: 'שעה',\n      hh: function hh(number) {\n        if (number === 2) {\n          return 'שעתיים';\n        }\n\n        return number + ' שעות';\n      },\n      d: 'יום',\n      dd: function dd(number) {\n        if (number === 2) {\n          return 'יומיים';\n        }\n\n        return number + ' ימים';\n      },\n      M: 'חודש',\n      MM: function MM(number) {\n        if (number === 2) {\n          return 'חודשיים';\n        }\n\n        return number + ' חודשים';\n      },\n      y: 'שנה',\n      yy: function yy(number) {\n        if (number === 2) {\n          return 'שנתיים';\n        } else if (number % 10 === 0 && number !== 10) {\n          return number + ' שנה';\n        }\n\n        return number + ' שנים';\n      }\n    },\n    meridiemParse: /אחה\"צ|לפנה\"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,\n    isPM: function isPM(input) {\n      return /^(אחה\"צ|אחרי הצהריים|בערב)$/.test(input);\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 5) {\n        return 'לפנות בוקר';\n      } else if (hour < 10) {\n        return 'בבוקר';\n      } else if (hour < 12) {\n        return isLower ? 'לפנה\"צ' : 'לפני הצהריים';\n      } else if (hour < 18) {\n        return isLower ? 'אחה\"צ' : 'אחרי הצהריים';\n      } else {\n        return 'בערב';\n      }\n    }\n  });\n  return he;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/he.js?");

/***/ }),

/***/ "./node_modules/moment/locale/hi.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/hi.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Hindi [hi]\n//! author : Mayank Singhal : https://github.com/mayanksinghal\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '१',\n    2: '२',\n    3: '३',\n    4: '४',\n    5: '५',\n    6: '६',\n    7: '७',\n    8: '८',\n    9: '९',\n    0: '०'\n  },\n      numberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n  },\n      monthsParse = [/^जन/i, /^फ़र|फर/i, /^मार्च/i, /^अप्रै/i, /^मई/i, /^जून/i, /^जुल/i, /^अग/i, /^सितं|सित/i, /^अक्टू/i, /^नव|नवं/i, /^दिसं|दिस/i],\n      shortMonthsParse = [/^जन/i, /^फ़र/i, /^मार्च/i, /^अप्रै/i, /^मई/i, /^जून/i, /^जुल/i, /^अग/i, /^सित/i, /^अक्टू/i, /^नव/i, /^दिस/i];\n  var hi = moment.defineLocale('hi', {\n    months: {\n      format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),\n      standalone: 'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split('_')\n    },\n    monthsShort: 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),\n    weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n    weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),\n    weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm बजे',\n      LTS: 'A h:mm:ss बजे',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm बजे',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm बजे'\n    },\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: shortMonthsParse,\n    monthsRegex: /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n    monthsShortRegex: /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n    monthsStrictRegex: /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,\n    monthsShortStrictRegex: /^(जन\\.?|फ़र\\.?|मार्च?|अप्रै\\.?|मई?|जून?|जुल\\.?|अग\\.?|सित\\.?|अक्टू\\.?|नव\\.?|दिस\\.?)/i,\n    calendar: {\n      sameDay: '[आज] LT',\n      nextDay: '[कल] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[कल] LT',\n      lastWeek: '[पिछले] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s में',\n      past: '%s पहले',\n      s: 'कुछ ही क्षण',\n      ss: '%d सेकंड',\n      m: 'एक मिनट',\n      mm: '%d मिनट',\n      h: 'एक घंटा',\n      hh: '%d घंटे',\n      d: 'एक दिन',\n      dd: '%d दिन',\n      M: 'एक महीने',\n      MM: '%d महीने',\n      y: 'एक वर्ष',\n      yy: '%d वर्ष'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[१२३४५६७८९०]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n    meridiemParse: /रात|सुबह|दोपहर|शाम/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'रात') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'सुबह') {\n        return hour;\n      } else if (meridiem === 'दोपहर') {\n        return hour >= 10 ? hour : hour + 12;\n      } else if (meridiem === 'शाम') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'रात';\n      } else if (hour < 10) {\n        return 'सुबह';\n      } else if (hour < 17) {\n        return 'दोपहर';\n      } else if (hour < 20) {\n        return 'शाम';\n      } else {\n        return 'रात';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return hi;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/hi.js?");

/***/ }),

/***/ "./node_modules/moment/locale/hr.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/hr.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Croatian [hr]\n//! author : Bojan Marković : https://github.com/bmarkovic\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n\n    switch (key) {\n      case 'ss':\n        if (number === 1) {\n          result += 'sekunda';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'sekunde';\n        } else {\n          result += 'sekundi';\n        }\n\n        return result;\n\n      case 'm':\n        return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n\n      case 'mm':\n        if (number === 1) {\n          result += 'minuta';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'minute';\n        } else {\n          result += 'minuta';\n        }\n\n        return result;\n\n      case 'h':\n        return withoutSuffix ? 'jedan sat' : 'jednog sata';\n\n      case 'hh':\n        if (number === 1) {\n          result += 'sat';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'sata';\n        } else {\n          result += 'sati';\n        }\n\n        return result;\n\n      case 'dd':\n        if (number === 1) {\n          result += 'dan';\n        } else {\n          result += 'dana';\n        }\n\n        return result;\n\n      case 'MM':\n        if (number === 1) {\n          result += 'mjesec';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'mjeseca';\n        } else {\n          result += 'mjeseci';\n        }\n\n        return result;\n\n      case 'yy':\n        if (number === 1) {\n          result += 'godina';\n        } else if (number === 2 || number === 3 || number === 4) {\n          result += 'godine';\n        } else {\n          result += 'godina';\n        }\n\n        return result;\n    }\n  }\n\n  var hr = moment.defineLocale('hr', {\n    months: {\n      format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),\n      standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')\n    },\n    monthsShort: 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'Do MMMM YYYY',\n      LLL: 'Do MMMM YYYY H:mm',\n      LLLL: 'dddd, Do MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[danas u] LT',\n      nextDay: '[sutra u] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[u] [nedjelju] [u] LT';\n\n          case 3:\n            return '[u] [srijedu] [u] LT';\n\n          case 6:\n            return '[u] [subotu] [u] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[u] dddd [u] LT';\n        }\n      },\n      lastDay: '[jučer u] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[prošlu] [nedjelju] [u] LT';\n\n          case 3:\n            return '[prošlu] [srijedu] [u] LT';\n\n          case 6:\n            return '[prošle] [subote] [u] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[prošli] dddd [u] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'za %s',\n      past: 'prije %s',\n      s: 'par sekundi',\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: 'dan',\n      dd: translate,\n      M: 'mjesec',\n      MM: translate,\n      y: 'godinu',\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return hr;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/hr.js?");

/***/ }),

/***/ "./node_modules/moment/locale/hu.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/hu.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Hungarian [hu]\n//! author : Adam Brunner : https://github.com/adambrunner\n//! author : Peter Viszt  : https://github.com/passatgt\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');\n\n  function translate(number, withoutSuffix, key, isFuture) {\n    var num = number;\n\n    switch (key) {\n      case 's':\n        return isFuture || withoutSuffix ? 'néhány másodperc' : 'néhány másodperce';\n\n      case 'ss':\n        return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce';\n\n      case 'm':\n        return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');\n\n      case 'mm':\n        return num + (isFuture || withoutSuffix ? ' perc' : ' perce');\n\n      case 'h':\n        return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');\n\n      case 'hh':\n        return num + (isFuture || withoutSuffix ? ' óra' : ' órája');\n\n      case 'd':\n        return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');\n\n      case 'dd':\n        return num + (isFuture || withoutSuffix ? ' nap' : ' napja');\n\n      case 'M':\n        return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n\n      case 'MM':\n        return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n\n      case 'y':\n        return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');\n\n      case 'yy':\n        return num + (isFuture || withoutSuffix ? ' év' : ' éve');\n    }\n\n    return '';\n  }\n\n  function week(isFuture) {\n    return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';\n  }\n\n  var hu = moment.defineLocale('hu', {\n    months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),\n    monthsShort: 'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),\n    weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),\n    weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'YYYY.MM.DD.',\n      LL: 'YYYY. MMMM D.',\n      LLL: 'YYYY. MMMM D. H:mm',\n      LLLL: 'YYYY. MMMM D., dddd H:mm'\n    },\n    meridiemParse: /de|du/i,\n    isPM: function isPM(input) {\n      return input.charAt(1).toLowerCase() === 'u';\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 12) {\n        return isLower === true ? 'de' : 'DE';\n      } else {\n        return isLower === true ? 'du' : 'DU';\n      }\n    },\n    calendar: {\n      sameDay: '[ma] LT[-kor]',\n      nextDay: '[holnap] LT[-kor]',\n      nextWeek: function nextWeek() {\n        return week.call(this, true);\n      },\n      lastDay: '[tegnap] LT[-kor]',\n      lastWeek: function lastWeek() {\n        return week.call(this, false);\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s múlva',\n      past: '%s',\n      s: translate,\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: translate,\n      dd: translate,\n      M: translate,\n      MM: translate,\n      y: translate,\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return hu;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/hu.js?");

/***/ }),

/***/ "./node_modules/moment/locale/hy-am.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/hy-am.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Armenian [hy-am]\n//! author : Armendarabyan : https://github.com/armendarabyan\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var hyAm = moment.defineLocale('hy-am', {\n    months: {\n      format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),\n      standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')\n    },\n    monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),\n    weekdays: 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),\n    weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n    weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY թ.',\n      LLL: 'D MMMM YYYY թ., HH:mm',\n      LLLL: 'dddd, D MMMM YYYY թ., HH:mm'\n    },\n    calendar: {\n      sameDay: '[այսօր] LT',\n      nextDay: '[վաղը] LT',\n      lastDay: '[երեկ] LT',\n      nextWeek: function nextWeek() {\n        return 'dddd [օրը ժամը] LT';\n      },\n      lastWeek: function lastWeek() {\n        return '[անցած] dddd [օրը ժամը] LT';\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s հետո',\n      past: '%s առաջ',\n      s: 'մի քանի վայրկյան',\n      ss: '%d վայրկյան',\n      m: 'րոպե',\n      mm: '%d րոպե',\n      h: 'ժամ',\n      hh: '%d ժամ',\n      d: 'օր',\n      dd: '%d օր',\n      M: 'ամիս',\n      MM: '%d ամիս',\n      y: 'տարի',\n      yy: '%d տարի'\n    },\n    meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,\n    isPM: function isPM(input) {\n      return /^(ցերեկվա|երեկոյան)$/.test(input);\n    },\n    meridiem: function meridiem(hour) {\n      if (hour < 4) {\n        return 'գիշերվա';\n      } else if (hour < 12) {\n        return 'առավոտվա';\n      } else if (hour < 17) {\n        return 'ցերեկվա';\n      } else {\n        return 'երեկոյան';\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}|\\d{1,2}-(ին|րդ)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'DDD':\n        case 'w':\n        case 'W':\n        case 'DDDo':\n          if (number === 1) {\n            return number + '-ին';\n          }\n\n          return number + '-րդ';\n\n        default:\n          return number;\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return hyAm;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/hy-am.js?");

/***/ }),

/***/ "./node_modules/moment/locale/id.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/id.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Indonesian [id]\n//! author : Mohammad Satrio Utomo : https://github.com/tyok\n//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var id = moment.defineLocale('id', {\n    months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),\n    weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),\n    weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),\n    weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat: {\n      LT: 'HH.mm',\n      LTS: 'HH.mm.ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY [pukul] HH.mm',\n      LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|siang|sore|malam/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'pagi') {\n        return hour;\n      } else if (meridiem === 'siang') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === 'sore' || meridiem === 'malam') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 11) {\n        return 'pagi';\n      } else if (hours < 15) {\n        return 'siang';\n      } else if (hours < 19) {\n        return 'sore';\n      } else {\n        return 'malam';\n      }\n    },\n    calendar: {\n      sameDay: '[Hari ini pukul] LT',\n      nextDay: '[Besok pukul] LT',\n      nextWeek: 'dddd [pukul] LT',\n      lastDay: '[Kemarin pukul] LT',\n      lastWeek: 'dddd [lalu pukul] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'dalam %s',\n      past: '%s yang lalu',\n      s: 'beberapa detik',\n      ss: '%d detik',\n      m: 'semenit',\n      mm: '%d menit',\n      h: 'sejam',\n      hh: '%d jam',\n      d: 'sehari',\n      dd: '%d hari',\n      M: 'sebulan',\n      MM: '%d bulan',\n      y: 'setahun',\n      yy: '%d tahun'\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return id;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/id.js?");

/***/ }),

/***/ "./node_modules/moment/locale/is.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/is.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Icelandic [is]\n//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function plural(n) {\n    if (n % 100 === 11) {\n      return true;\n    } else if (n % 10 === 1) {\n      return false;\n    }\n\n    return true;\n  }\n\n  function translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n\n    switch (key) {\n      case 's':\n        return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';\n\n      case 'ss':\n        if (plural(number)) {\n          return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum');\n        }\n\n        return result + 'sekúnda';\n\n      case 'm':\n        return withoutSuffix ? 'mínúta' : 'mínútu';\n\n      case 'mm':\n        if (plural(number)) {\n          return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');\n        } else if (withoutSuffix) {\n          return result + 'mínúta';\n        }\n\n        return result + 'mínútu';\n\n      case 'hh':\n        if (plural(number)) {\n          return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');\n        }\n\n        return result + 'klukkustund';\n\n      case 'd':\n        if (withoutSuffix) {\n          return 'dagur';\n        }\n\n        return isFuture ? 'dag' : 'degi';\n\n      case 'dd':\n        if (plural(number)) {\n          if (withoutSuffix) {\n            return result + 'dagar';\n          }\n\n          return result + (isFuture ? 'daga' : 'dögum');\n        } else if (withoutSuffix) {\n          return result + 'dagur';\n        }\n\n        return result + (isFuture ? 'dag' : 'degi');\n\n      case 'M':\n        if (withoutSuffix) {\n          return 'mánuður';\n        }\n\n        return isFuture ? 'mánuð' : 'mánuði';\n\n      case 'MM':\n        if (plural(number)) {\n          if (withoutSuffix) {\n            return result + 'mánuðir';\n          }\n\n          return result + (isFuture ? 'mánuði' : 'mánuðum');\n        } else if (withoutSuffix) {\n          return result + 'mánuður';\n        }\n\n        return result + (isFuture ? 'mánuð' : 'mánuði');\n\n      case 'y':\n        return withoutSuffix || isFuture ? 'ár' : 'ári';\n\n      case 'yy':\n        if (plural(number)) {\n          return result + (withoutSuffix || isFuture ? 'ár' : 'árum');\n        }\n\n        return result + (withoutSuffix || isFuture ? 'ár' : 'ári');\n    }\n  }\n\n  var is = moment.defineLocale('is', {\n    months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),\n    monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),\n    weekdays: 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),\n    weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),\n    weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY [kl.] H:mm',\n      LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm'\n    },\n    calendar: {\n      sameDay: '[í dag kl.] LT',\n      nextDay: '[á morgun kl.] LT',\n      nextWeek: 'dddd [kl.] LT',\n      lastDay: '[í gær kl.] LT',\n      lastWeek: '[síðasta] dddd [kl.] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'eftir %s',\n      past: 'fyrir %s síðan',\n      s: translate,\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: 'klukkustund',\n      hh: translate,\n      d: translate,\n      dd: translate,\n      M: translate,\n      MM: translate,\n      y: translate,\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return is;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/is.js?");

/***/ }),

/***/ "./node_modules/moment/locale/it-ch.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/it-ch.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Italian (Switzerland) [it-ch]\n//! author : xfh : https://github.com/xfh\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var itCh = moment.defineLocale('it-ch', {\n    months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),\n    monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n    weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'),\n    weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n    weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Oggi alle] LT',\n      nextDay: '[Domani alle] LT',\n      nextWeek: 'dddd [alle] LT',\n      lastDay: '[Ieri alle] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[la scorsa] dddd [alle] LT';\n\n          default:\n            return '[lo scorso] dddd [alle] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: function future(s) {\n        return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;\n      },\n      past: '%s fa',\n      s: 'alcuni secondi',\n      ss: '%d secondi',\n      m: 'un minuto',\n      mm: '%d minuti',\n      h: \"un'ora\",\n      hh: '%d ore',\n      d: 'un giorno',\n      dd: '%d giorni',\n      M: 'un mese',\n      MM: '%d mesi',\n      y: 'un anno',\n      yy: '%d anni'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return itCh;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/it-ch.js?");

/***/ }),

/***/ "./node_modules/moment/locale/it.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/it.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Italian [it]\n//! author : Lorenzo : https://github.com/aliem\n//! author: Mattia Larentis: https://github.com/nostalgiaz\n//! author: Marco : https://github.com/Manfre98\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var it = moment.defineLocale('it', {\n    months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),\n    monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n    weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'),\n    weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n    weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: function sameDay() {\n        return '[Oggi a' + (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") + ']LT';\n      },\n      nextDay: function nextDay() {\n        return '[Domani a' + (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") + ']LT';\n      },\n      nextWeek: function nextWeek() {\n        return 'dddd [a' + (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") + ']LT';\n      },\n      lastDay: function lastDay() {\n        return '[Ieri a' + (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") + ']LT';\n      },\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[La scorsa] dddd [a' + (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") + ']LT';\n\n          default:\n            return '[Lo scorso] dddd [a' + (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") + ']LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'tra %s',\n      past: '%s fa',\n      s: 'alcuni secondi',\n      ss: '%d secondi',\n      m: 'un minuto',\n      mm: '%d minuti',\n      h: \"un'ora\",\n      hh: '%d ore',\n      d: 'un giorno',\n      dd: '%d giorni',\n      w: 'una settimana',\n      ww: '%d settimane',\n      M: 'un mese',\n      MM: '%d mesi',\n      y: 'un anno',\n      yy: '%d anni'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return it;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/it.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ja.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ja.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Japanese [ja]\n//! author : LI Long : https://github.com/baryon\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ja = moment.defineLocale('ja', {\n    eras: [{\n      since: '2019-05-01',\n      offset: 1,\n      name: '令和',\n      narrow: '㋿',\n      abbr: 'R'\n    }, {\n      since: '1989-01-08',\n      until: '2019-04-30',\n      offset: 1,\n      name: '平成',\n      narrow: '㍻',\n      abbr: 'H'\n    }, {\n      since: '1926-12-25',\n      until: '1989-01-07',\n      offset: 1,\n      name: '昭和',\n      narrow: '㍼',\n      abbr: 'S'\n    }, {\n      since: '1912-07-30',\n      until: '1926-12-24',\n      offset: 1,\n      name: '大正',\n      narrow: '㍽',\n      abbr: 'T'\n    }, {\n      since: '1873-01-01',\n      until: '1912-07-29',\n      offset: 6,\n      name: '明治',\n      narrow: '㍾',\n      abbr: 'M'\n    }, {\n      since: '0001-01-01',\n      until: '1873-12-31',\n      offset: 1,\n      name: '西暦',\n      narrow: 'AD',\n      abbr: 'AD'\n    }, {\n      since: '0000-12-31',\n      until: -Infinity,\n      offset: 1,\n      name: '紀元前',\n      narrow: 'BC',\n      abbr: 'BC'\n    }],\n    eraYearOrdinalRegex: /(元|\\d+)年/,\n    eraYearOrdinalParse: function eraYearOrdinalParse(input, match) {\n      return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);\n    },\n    months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),\n    weekdaysShort: '日_月_火_水_木_金_土'.split('_'),\n    weekdaysMin: '日_月_火_水_木_金_土'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY/MM/DD',\n      LL: 'YYYY年M月D日',\n      LLL: 'YYYY年M月D日 HH:mm',\n      LLLL: 'YYYY年M月D日 dddd HH:mm',\n      l: 'YYYY/MM/DD',\n      ll: 'YYYY年M月D日',\n      lll: 'YYYY年M月D日 HH:mm',\n      llll: 'YYYY年M月D日(ddd) HH:mm'\n    },\n    meridiemParse: /午前|午後/i,\n    isPM: function isPM(input) {\n      return input === '午後';\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return '午前';\n      } else {\n        return '午後';\n      }\n    },\n    calendar: {\n      sameDay: '[今日] LT',\n      nextDay: '[明日] LT',\n      nextWeek: function nextWeek(now) {\n        if (now.week() !== this.week()) {\n          return '[来週]dddd LT';\n        } else {\n          return 'dddd LT';\n        }\n      },\n      lastDay: '[昨日] LT',\n      lastWeek: function lastWeek(now) {\n        if (this.week() !== now.week()) {\n          return '[先週]dddd LT';\n        } else {\n          return 'dddd LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}日/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'y':\n          return number === 1 ? '元年' : number + '年';\n\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + '日';\n\n        default:\n          return number;\n      }\n    },\n    relativeTime: {\n      future: '%s後',\n      past: '%s前',\n      s: '数秒',\n      ss: '%d秒',\n      m: '1分',\n      mm: '%d分',\n      h: '1時間',\n      hh: '%d時間',\n      d: '1日',\n      dd: '%d日',\n      M: '1ヶ月',\n      MM: '%dヶ月',\n      y: '1年',\n      yy: '%d年'\n    }\n  });\n  return ja;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ja.js?");

/***/ }),

/***/ "./node_modules/moment/locale/jv.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/jv.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Javanese [jv]\n//! author : Rony Lantip : https://github.com/lantip\n//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var jv = moment.defineLocale('jv', {\n    months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),\n    monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),\n    weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),\n    weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),\n    weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),\n    longDateFormat: {\n      LT: 'HH.mm',\n      LTS: 'HH.mm.ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY [pukul] HH.mm',\n      LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /enjing|siyang|sonten|ndalu/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'enjing') {\n        return hour;\n      } else if (meridiem === 'siyang') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === 'sonten' || meridiem === 'ndalu') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 11) {\n        return 'enjing';\n      } else if (hours < 15) {\n        return 'siyang';\n      } else if (hours < 19) {\n        return 'sonten';\n      } else {\n        return 'ndalu';\n      }\n    },\n    calendar: {\n      sameDay: '[Dinten puniko pukul] LT',\n      nextDay: '[Mbenjang pukul] LT',\n      nextWeek: 'dddd [pukul] LT',\n      lastDay: '[Kala wingi pukul] LT',\n      lastWeek: 'dddd [kepengker pukul] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'wonten ing %s',\n      past: '%s ingkang kepengker',\n      s: 'sawetawis detik',\n      ss: '%d detik',\n      m: 'setunggal menit',\n      mm: '%d menit',\n      h: 'setunggal jam',\n      hh: '%d jam',\n      d: 'sedinten',\n      dd: '%d dinten',\n      M: 'sewulan',\n      MM: '%d wulan',\n      y: 'setaun',\n      yy: '%d taun'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return jv;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/jv.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ka.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ka.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Georgian [ka]\n//! author : Irakli Janiashvili : https://github.com/IrakliJani\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ka = moment.defineLocale('ka', {\n    months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),\n    monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),\n    weekdays: {\n      standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),\n      format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),\n      isFormat: /(წინა|შემდეგ)/\n    },\n    weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),\n    weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[დღეს] LT[-ზე]',\n      nextDay: '[ხვალ] LT[-ზე]',\n      lastDay: '[გუშინ] LT[-ზე]',\n      nextWeek: '[შემდეგ] dddd LT[-ზე]',\n      lastWeek: '[წინა] dddd LT-ზე',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: function future(s) {\n        return s.replace(/(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/, function ($0, $1, $2) {\n          return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';\n        });\n      },\n      past: function past(s) {\n        if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {\n          return s.replace(/(ი|ე)$/, 'ის წინ');\n        }\n\n        if (/წელი/.test(s)) {\n          return s.replace(/წელი$/, 'წლის წინ');\n        }\n\n        return s;\n      },\n      s: 'რამდენიმე წამი',\n      ss: '%d წამი',\n      m: 'წუთი',\n      mm: '%d წუთი',\n      h: 'საათი',\n      hh: '%d საათი',\n      d: 'დღე',\n      dd: '%d დღე',\n      M: 'თვე',\n      MM: '%d თვე',\n      y: 'წელი',\n      yy: '%d წელი'\n    },\n    dayOfMonthOrdinalParse: /0|1-ლი|მე-\\d{1,2}|\\d{1,2}-ე/,\n    ordinal: function ordinal(number) {\n      if (number === 0) {\n        return number;\n      }\n\n      if (number === 1) {\n        return number + '-ლი';\n      }\n\n      if (number < 20 || number <= 100 && number % 20 === 0 || number % 100 === 0) {\n        return 'მე-' + number;\n      }\n\n      return number + '-ე';\n    },\n    week: {\n      dow: 1,\n      doy: 7\n    }\n  });\n  return ka;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ka.js?");

/***/ }),

/***/ "./node_modules/moment/locale/kk.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/kk.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Kazakh [kk]\n//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var suffixes = {\n    0: '-ші',\n    1: '-ші',\n    2: '-ші',\n    3: '-ші',\n    4: '-ші',\n    5: '-ші',\n    6: '-шы',\n    7: '-ші',\n    8: '-ші',\n    9: '-шы',\n    10: '-шы',\n    20: '-шы',\n    30: '-шы',\n    40: '-шы',\n    50: '-ші',\n    60: '-шы',\n    70: '-ші',\n    80: '-ші',\n    90: '-шы',\n    100: '-ші'\n  };\n  var kk = moment.defineLocale('kk', {\n    months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),\n    monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),\n    weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),\n    weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),\n    weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Бүгін сағат] LT',\n      nextDay: '[Ертең сағат] LT',\n      nextWeek: 'dddd [сағат] LT',\n      lastDay: '[Кеше сағат] LT',\n      lastWeek: '[Өткен аптаның] dddd [сағат] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s ішінде',\n      past: '%s бұрын',\n      s: 'бірнеше секунд',\n      ss: '%d секунд',\n      m: 'бір минут',\n      mm: '%d минут',\n      h: 'бір сағат',\n      hh: '%d сағат',\n      d: 'бір күн',\n      dd: '%d күн',\n      M: 'бір ай',\n      MM: '%d ай',\n      y: 'бір жыл',\n      yy: '%d жыл'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ші|шы)/,\n    ordinal: function ordinal(number) {\n      var a = number % 10,\n          b = number >= 100 ? 100 : null;\n      return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return kk;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/kk.js?");

/***/ }),

/***/ "./node_modules/moment/locale/km.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/km.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Cambodian [km]\n//! author : Kruy Vanna : https://github.com/kruyvanna\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '១',\n    2: '២',\n    3: '៣',\n    4: '៤',\n    5: '៥',\n    6: '៦',\n    7: '៧',\n    8: '៨',\n    9: '៩',\n    0: '០'\n  },\n      numberMap = {\n    '១': '1',\n    '២': '2',\n    '៣': '3',\n    '៤': '4',\n    '៥': '5',\n    '៦': '6',\n    '៧': '7',\n    '៨': '8',\n    '៩': '9',\n    '០': '0'\n  };\n  var km = moment.defineLocale('km', {\n    months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),\n    monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),\n    weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n    weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),\n    weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ព្រឹក|ល្ងាច/,\n    isPM: function isPM(input) {\n      return input === 'ល្ងាច';\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ព្រឹក';\n      } else {\n        return 'ល្ងាច';\n      }\n    },\n    calendar: {\n      sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',\n      nextDay: '[ស្អែក ម៉ោង] LT',\n      nextWeek: 'dddd [ម៉ោង] LT',\n      lastDay: '[ម្សិលមិញ ម៉ោង] LT',\n      lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%sទៀត',\n      past: '%sមុន',\n      s: 'ប៉ុន្មានវិនាទី',\n      ss: '%d វិនាទី',\n      m: 'មួយនាទី',\n      mm: '%d នាទី',\n      h: 'មួយម៉ោង',\n      hh: '%d ម៉ោង',\n      d: 'មួយថ្ងៃ',\n      dd: '%d ថ្ងៃ',\n      M: 'មួយខែ',\n      MM: '%d ខែ',\n      y: 'មួយឆ្នាំ',\n      yy: '%d ឆ្នាំ'\n    },\n    dayOfMonthOrdinalParse: /ទី\\d{1,2}/,\n    ordinal: 'ទី%d',\n    preparse: function preparse(string) {\n      return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return km;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/km.js?");

/***/ }),

/***/ "./node_modules/moment/locale/kn.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/kn.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Kannada [kn]\n//! author : Rajeev Naik : https://github.com/rajeevnaikte\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '೧',\n    2: '೨',\n    3: '೩',\n    4: '೪',\n    5: '೫',\n    6: '೬',\n    7: '೭',\n    8: '೮',\n    9: '೯',\n    0: '೦'\n  },\n      numberMap = {\n    '೧': '1',\n    '೨': '2',\n    '೩': '3',\n    '೪': '4',\n    '೫': '5',\n    '೬': '6',\n    '೭': '7',\n    '೮': '8',\n    '೯': '9',\n    '೦': '0'\n  };\n  var kn = moment.defineLocale('kn', {\n    months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'),\n    monthsShort: 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'),\n    weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),\n    weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm',\n      LTS: 'A h:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar: {\n      sameDay: '[ಇಂದು] LT',\n      nextDay: '[ನಾಳೆ] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[ನಿನ್ನೆ] LT',\n      lastWeek: '[ಕೊನೆಯ] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s ನಂತರ',\n      past: '%s ಹಿಂದೆ',\n      s: 'ಕೆಲವು ಕ್ಷಣಗಳು',\n      ss: '%d ಸೆಕೆಂಡುಗಳು',\n      m: 'ಒಂದು ನಿಮಿಷ',\n      mm: '%d ನಿಮಿಷ',\n      h: 'ಒಂದು ಗಂಟೆ',\n      hh: '%d ಗಂಟೆ',\n      d: 'ಒಂದು ದಿನ',\n      dd: '%d ದಿನ',\n      M: 'ಒಂದು ತಿಂಗಳು',\n      MM: '%d ತಿಂಗಳು',\n      y: 'ಒಂದು ವರ್ಷ',\n      yy: '%d ವರ್ಷ'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'ರಾತ್ರಿ') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {\n        return hour;\n      } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {\n        return hour >= 10 ? hour : hour + 12;\n      } else if (meridiem === 'ಸಂಜೆ') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'ರಾತ್ರಿ';\n      } else if (hour < 10) {\n        return 'ಬೆಳಿಗ್ಗೆ';\n      } else if (hour < 17) {\n        return 'ಮಧ್ಯಾಹ್ನ';\n      } else if (hour < 20) {\n        return 'ಸಂಜೆ';\n      } else {\n        return 'ರಾತ್ರಿ';\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ನೇ)/,\n    ordinal: function ordinal(number) {\n      return number + 'ನೇ';\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return kn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/kn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ko.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ko.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Korean [ko]\n//! author : Kyungwook, Park : https://github.com/kyungw00k\n//! author : Jeeeyul Lee <jeeeyul@gmail.com>\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ko = moment.defineLocale('ko', {\n    months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n    monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n    weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),\n    weekdaysShort: '일_월_화_수_목_금_토'.split('_'),\n    weekdaysMin: '일_월_화_수_목_금_토'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm',\n      LTS: 'A h:mm:ss',\n      L: 'YYYY.MM.DD.',\n      LL: 'YYYY년 MMMM D일',\n      LLL: 'YYYY년 MMMM D일 A h:mm',\n      LLLL: 'YYYY년 MMMM D일 dddd A h:mm',\n      l: 'YYYY.MM.DD.',\n      ll: 'YYYY년 MMMM D일',\n      lll: 'YYYY년 MMMM D일 A h:mm',\n      llll: 'YYYY년 MMMM D일 dddd A h:mm'\n    },\n    calendar: {\n      sameDay: '오늘 LT',\n      nextDay: '내일 LT',\n      nextWeek: 'dddd LT',\n      lastDay: '어제 LT',\n      lastWeek: '지난주 dddd LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s 후',\n      past: '%s 전',\n      s: '몇 초',\n      ss: '%d초',\n      m: '1분',\n      mm: '%d분',\n      h: '한 시간',\n      hh: '%d시간',\n      d: '하루',\n      dd: '%d일',\n      M: '한 달',\n      MM: '%d달',\n      y: '일 년',\n      yy: '%d년'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(일|월|주)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + '일';\n\n        case 'M':\n          return number + '월';\n\n        case 'w':\n        case 'W':\n          return number + '주';\n\n        default:\n          return number;\n      }\n    },\n    meridiemParse: /오전|오후/,\n    isPM: function isPM(token) {\n      return token === '오후';\n    },\n    meridiem: function meridiem(hour, minute, isUpper) {\n      return hour < 12 ? '오전' : '오후';\n    }\n  });\n  return ko;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ko.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ku.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ku.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Kurdish [ku]\n//! author : Shahram Mebashar : https://github.com/ShahramMebashar\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '١',\n    2: '٢',\n    3: '٣',\n    4: '٤',\n    5: '٥',\n    6: '٦',\n    7: '٧',\n    8: '٨',\n    9: '٩',\n    0: '٠'\n  },\n      numberMap = {\n    '١': '1',\n    '٢': '2',\n    '٣': '3',\n    '٤': '4',\n    '٥': '5',\n    '٦': '6',\n    '٧': '7',\n    '٨': '8',\n    '٩': '9',\n    '٠': '0'\n  },\n      months = ['کانونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمموز', 'ئاب', 'ئەیلوول', 'تشرینی یەكەم', 'تشرینی دووەم', 'كانونی یەکەم'];\n  var ku = moment.defineLocale('ku', {\n    months: months,\n    monthsShort: months,\n    weekdays: 'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split('_'),\n    weekdaysShort: 'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),\n    weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ئێواره‌|به‌یانی/,\n    isPM: function isPM(input) {\n      return /ئێواره‌/.test(input);\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'به‌یانی';\n      } else {\n        return 'ئێواره‌';\n      }\n    },\n    calendar: {\n      sameDay: '[ئه‌مرۆ كاتژمێر] LT',\n      nextDay: '[به‌یانی كاتژمێر] LT',\n      nextWeek: 'dddd [كاتژمێر] LT',\n      lastDay: '[دوێنێ كاتژمێر] LT',\n      lastWeek: 'dddd [كاتژمێر] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'له‌ %s',\n      past: '%s',\n      s: 'چه‌ند چركه‌یه‌ك',\n      ss: 'چركه‌ %d',\n      m: 'یه‌ك خوله‌ك',\n      mm: '%d خوله‌ك',\n      h: 'یه‌ك كاتژمێر',\n      hh: '%d كاتژمێر',\n      d: 'یه‌ك ڕۆژ',\n      dd: '%d ڕۆژ',\n      M: 'یه‌ك مانگ',\n      MM: '%d مانگ',\n      y: 'یه‌ك ساڵ',\n      yy: '%d ساڵ'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n        return numberMap[match];\n      }).replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      }).replace(/,/g, '،');\n    },\n    week: {\n      dow: 6,\n      // Saturday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return ku;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ku.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ky.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ky.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Kyrgyz [ky]\n//! author : Chyngyz Arystan uulu : https://github.com/chyngyz\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var suffixes = {\n    0: '-чү',\n    1: '-чи',\n    2: '-чи',\n    3: '-чү',\n    4: '-чү',\n    5: '-чи',\n    6: '-чы',\n    7: '-чи',\n    8: '-чи',\n    9: '-чу',\n    10: '-чу',\n    20: '-чы',\n    30: '-чу',\n    40: '-чы',\n    50: '-чү',\n    60: '-чы',\n    70: '-чи',\n    80: '-чи',\n    90: '-чу',\n    100: '-чү'\n  };\n  var ky = moment.defineLocale('ky', {\n    months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),\n    monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),\n    weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),\n    weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Бүгүн саат] LT',\n      nextDay: '[Эртең саат] LT',\n      nextWeek: 'dddd [саат] LT',\n      lastDay: '[Кечээ саат] LT',\n      lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s ичинде',\n      past: '%s мурун',\n      s: 'бирнече секунд',\n      ss: '%d секунд',\n      m: 'бир мүнөт',\n      mm: '%d мүнөт',\n      h: 'бир саат',\n      hh: '%d саат',\n      d: 'бир күн',\n      dd: '%d күн',\n      M: 'бир ай',\n      MM: '%d ай',\n      y: 'бир жыл',\n      yy: '%d жыл'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(чи|чы|чү|чу)/,\n    ordinal: function ordinal(number) {\n      var a = number % 10,\n          b = number >= 100 ? 100 : null;\n      return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return ky;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ky.js?");

/***/ }),

/***/ "./node_modules/moment/locale/lb.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/lb.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Luxembourgish [lb]\n//! author : mweimerskirch : https://github.com/mweimerskirch\n//! author : David Raison : https://github.com/kwisatz\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      m: ['eng Minutt', 'enger Minutt'],\n      h: ['eng Stonn', 'enger Stonn'],\n      d: ['een Dag', 'engem Dag'],\n      M: ['ee Mount', 'engem Mount'],\n      y: ['ee Joer', 'engem Joer']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n  }\n\n  function processFutureTime(string) {\n    var number = string.substr(0, string.indexOf(' '));\n\n    if (eifelerRegelAppliesToNumber(number)) {\n      return 'a ' + string;\n    }\n\n    return 'an ' + string;\n  }\n\n  function processPastTime(string) {\n    var number = string.substr(0, string.indexOf(' '));\n\n    if (eifelerRegelAppliesToNumber(number)) {\n      return 'viru ' + string;\n    }\n\n    return 'virun ' + string;\n  }\n  /**\n   * Returns true if the word before the given number loses the '-n' ending.\n   * e.g. 'an 10 Deeg' but 'a 5 Deeg'\n   *\n   * @param number {integer}\n   * @returns {boolean}\n   */\n\n\n  function eifelerRegelAppliesToNumber(number) {\n    number = parseInt(number, 10);\n\n    if (isNaN(number)) {\n      return false;\n    }\n\n    if (number < 0) {\n      // Negative Number --> always true\n      return true;\n    } else if (number < 10) {\n      // Only 1 digit\n      if (4 <= number && number <= 7) {\n        return true;\n      }\n\n      return false;\n    } else if (number < 100) {\n      // 2 digits\n      var lastDigit = number % 10,\n          firstDigit = number / 10;\n\n      if (lastDigit === 0) {\n        return eifelerRegelAppliesToNumber(firstDigit);\n      }\n\n      return eifelerRegelAppliesToNumber(lastDigit);\n    } else if (number < 10000) {\n      // 3 or 4 digits --> recursively check first digit\n      while (number >= 10) {\n        number = number / 10;\n      }\n\n      return eifelerRegelAppliesToNumber(number);\n    } else {\n      // Anything larger than 4 digits: recursively check first n-3 digits\n      number = number / 1000;\n      return eifelerRegelAppliesToNumber(number);\n    }\n  }\n\n  var lb = moment.defineLocale('lb', {\n    months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),\n    weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),\n    weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm [Auer]',\n      LTS: 'H:mm:ss [Auer]',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY H:mm [Auer]',\n      LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'\n    },\n    calendar: {\n      sameDay: '[Haut um] LT',\n      sameElse: 'L',\n      nextDay: '[Muer um] LT',\n      nextWeek: 'dddd [um] LT',\n      lastDay: '[Gëschter um] LT',\n      lastWeek: function lastWeek() {\n        // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule\n        switch (this.day()) {\n          case 2:\n          case 4:\n            return '[Leschten] dddd [um] LT';\n\n          default:\n            return '[Leschte] dddd [um] LT';\n        }\n      }\n    },\n    relativeTime: {\n      future: processFutureTime,\n      past: processPastTime,\n      s: 'e puer Sekonnen',\n      ss: '%d Sekonnen',\n      m: processRelativeTime,\n      mm: '%d Minutten',\n      h: processRelativeTime,\n      hh: '%d Stonnen',\n      d: processRelativeTime,\n      dd: '%d Deeg',\n      M: processRelativeTime,\n      MM: '%d Méint',\n      y: processRelativeTime,\n      yy: '%d Joer'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return lb;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/lb.js?");

/***/ }),

/***/ "./node_modules/moment/locale/lo.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/lo.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Lao [lo]\n//! author : Ryan Hart : https://github.com/ryanhart2\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var lo = moment.defineLocale('lo', {\n    months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),\n    monthsShort: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),\n    weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n    weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n    weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'ວັນdddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,\n    isPM: function isPM(input) {\n      return input === 'ຕອນແລງ';\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ຕອນເຊົ້າ';\n      } else {\n        return 'ຕອນແລງ';\n      }\n    },\n    calendar: {\n      sameDay: '[ມື້ນີ້ເວລາ] LT',\n      nextDay: '[ມື້ອື່ນເວລາ] LT',\n      nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',\n      lastDay: '[ມື້ວານນີ້ເວລາ] LT',\n      lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'ອີກ %s',\n      past: '%sຜ່ານມາ',\n      s: 'ບໍ່ເທົ່າໃດວິນາທີ',\n      ss: '%d ວິນາທີ',\n      m: '1 ນາທີ',\n      mm: '%d ນາທີ',\n      h: '1 ຊົ່ວໂມງ',\n      hh: '%d ຊົ່ວໂມງ',\n      d: '1 ມື້',\n      dd: '%d ມື້',\n      M: '1 ເດືອນ',\n      MM: '%d ເດືອນ',\n      y: '1 ປີ',\n      yy: '%d ປີ'\n    },\n    dayOfMonthOrdinalParse: /(ທີ່)\\d{1,2}/,\n    ordinal: function ordinal(number) {\n      return 'ທີ່' + number;\n    }\n  });\n  return lo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/lo.js?");

/***/ }),

/***/ "./node_modules/moment/locale/lt.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/lt.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Lithuanian [lt]\n//! author : Mindaugas Mozūras : https://github.com/mmozuras\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var units = {\n    ss: 'sekundė_sekundžių_sekundes',\n    m: 'minutė_minutės_minutę',\n    mm: 'minutės_minučių_minutes',\n    h: 'valanda_valandos_valandą',\n    hh: 'valandos_valandų_valandas',\n    d: 'diena_dienos_dieną',\n    dd: 'dienos_dienų_dienas',\n    M: 'mėnuo_mėnesio_mėnesį',\n    MM: 'mėnesiai_mėnesių_mėnesius',\n    y: 'metai_metų_metus',\n    yy: 'metai_metų_metus'\n  };\n\n  function translateSeconds(number, withoutSuffix, key, isFuture) {\n    if (withoutSuffix) {\n      return 'kelios sekundės';\n    } else {\n      return isFuture ? 'kelių sekundžių' : 'kelias sekundes';\n    }\n  }\n\n  function translateSingular(number, withoutSuffix, key, isFuture) {\n    return withoutSuffix ? forms(key)[0] : isFuture ? forms(key)[1] : forms(key)[2];\n  }\n\n  function special(number) {\n    return number % 10 === 0 || number > 10 && number < 20;\n  }\n\n  function forms(key) {\n    return units[key].split('_');\n  }\n\n  function translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n\n    if (number === 1) {\n      return result + translateSingular(number, withoutSuffix, key[0], isFuture);\n    } else if (withoutSuffix) {\n      return result + (special(number) ? forms(key)[1] : forms(key)[0]);\n    } else {\n      if (isFuture) {\n        return result + forms(key)[1];\n      } else {\n        return result + (special(number) ? forms(key)[1] : forms(key)[2]);\n      }\n    }\n  }\n\n  var lt = moment.defineLocale('lt', {\n    months: {\n      format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),\n      standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),\n      isFormat: /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?|MMMM?(\\[[^\\[\\]]*\\]|\\s)+D[oD]?/\n    },\n    monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),\n    weekdays: {\n      format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),\n      standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),\n      isFormat: /dddd HH:mm/\n    },\n    weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),\n    weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY-MM-DD',\n      LL: 'YYYY [m.] MMMM D [d.]',\n      LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n      LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',\n      l: 'YYYY-MM-DD',\n      ll: 'YYYY [m.] MMMM D [d.]',\n      lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n      llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'\n    },\n    calendar: {\n      sameDay: '[Šiandien] LT',\n      nextDay: '[Rytoj] LT',\n      nextWeek: 'dddd LT',\n      lastDay: '[Vakar] LT',\n      lastWeek: '[Praėjusį] dddd LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'po %s',\n      past: 'prieš %s',\n      s: translateSeconds,\n      ss: translate,\n      m: translateSingular,\n      mm: translate,\n      h: translateSingular,\n      hh: translate,\n      d: translateSingular,\n      dd: translate,\n      M: translateSingular,\n      MM: translate,\n      y: translateSingular,\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-oji/,\n    ordinal: function ordinal(number) {\n      return number + '-oji';\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return lt;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/lt.js?");

/***/ }),

/***/ "./node_modules/moment/locale/lv.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/lv.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Latvian [lv]\n//! author : Kristaps Karlsons : https://github.com/skakri\n//! author : Jānis Elmeris : https://github.com/JanisE\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var units = {\n    ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),\n    m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n    mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n    h: 'stundas_stundām_stunda_stundas'.split('_'),\n    hh: 'stundas_stundām_stunda_stundas'.split('_'),\n    d: 'dienas_dienām_diena_dienas'.split('_'),\n    dd: 'dienas_dienām_diena_dienas'.split('_'),\n    M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n    MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n    y: 'gada_gadiem_gads_gadi'.split('_'),\n    yy: 'gada_gadiem_gads_gadi'.split('_')\n  };\n  /**\n   * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.\n   */\n\n  function format(forms, number, withoutSuffix) {\n    if (withoutSuffix) {\n      // E.g. \"21 minūte\", \"3 minūtes\".\n      return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];\n    } else {\n      // E.g. \"21 minūtes\" as in \"pēc 21 minūtes\".\n      // E.g. \"3 minūtēm\" as in \"pēc 3 minūtēm\".\n      return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];\n    }\n  }\n\n  function relativeTimeWithPlural(number, withoutSuffix, key) {\n    return number + ' ' + format(units[key], number, withoutSuffix);\n  }\n\n  function relativeTimeWithSingular(number, withoutSuffix, key) {\n    return format(units[key], number, withoutSuffix);\n  }\n\n  function relativeSeconds(number, withoutSuffix) {\n    return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';\n  }\n\n  var lv = moment.defineLocale('lv', {\n    months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),\n    monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),\n    weekdays: 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),\n    weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),\n    weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY.',\n      LL: 'YYYY. [gada] D. MMMM',\n      LLL: 'YYYY. [gada] D. MMMM, HH:mm',\n      LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm'\n    },\n    calendar: {\n      sameDay: '[Šodien pulksten] LT',\n      nextDay: '[Rīt pulksten] LT',\n      nextWeek: 'dddd [pulksten] LT',\n      lastDay: '[Vakar pulksten] LT',\n      lastWeek: '[Pagājušā] dddd [pulksten] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'pēc %s',\n      past: 'pirms %s',\n      s: relativeSeconds,\n      ss: relativeTimeWithPlural,\n      m: relativeTimeWithSingular,\n      mm: relativeTimeWithPlural,\n      h: relativeTimeWithSingular,\n      hh: relativeTimeWithPlural,\n      d: relativeTimeWithSingular,\n      dd: relativeTimeWithPlural,\n      M: relativeTimeWithSingular,\n      MM: relativeTimeWithPlural,\n      y: relativeTimeWithSingular,\n      yy: relativeTimeWithPlural\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return lv;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/lv.js?");

/***/ }),

/***/ "./node_modules/moment/locale/me.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/me.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Montenegrin [me]\n//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var translator = {\n    words: {\n      //Different grammatical cases\n      ss: ['sekund', 'sekunda', 'sekundi'],\n      m: ['jedan minut', 'jednog minuta'],\n      mm: ['minut', 'minuta', 'minuta'],\n      h: ['jedan sat', 'jednog sata'],\n      hh: ['sat', 'sata', 'sati'],\n      dd: ['dan', 'dana', 'dana'],\n      MM: ['mjesec', 'mjeseca', 'mjeseci'],\n      yy: ['godina', 'godine', 'godina']\n    },\n    correctGrammaticalCase: function correctGrammaticalCase(number, wordKey) {\n      return number === 1 ? wordKey[0] : number >= 2 && number <= 4 ? wordKey[1] : wordKey[2];\n    },\n    translate: function translate(number, withoutSuffix, key) {\n      var wordKey = translator.words[key];\n\n      if (key.length === 1) {\n        return withoutSuffix ? wordKey[0] : wordKey[1];\n      } else {\n        return number + ' ' + translator.correctGrammaticalCase(number, wordKey);\n      }\n    }\n  };\n  var me = moment.defineLocale('me', {\n    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY H:mm',\n      LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[danas u] LT',\n      nextDay: '[sjutra u] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[u] [nedjelju] [u] LT';\n\n          case 3:\n            return '[u] [srijedu] [u] LT';\n\n          case 6:\n            return '[u] [subotu] [u] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[u] dddd [u] LT';\n        }\n      },\n      lastDay: '[juče u] LT',\n      lastWeek: function lastWeek() {\n        var lastWeekDays = ['[prošle] [nedjelje] [u] LT', '[prošlog] [ponedjeljka] [u] LT', '[prošlog] [utorka] [u] LT', '[prošle] [srijede] [u] LT', '[prošlog] [četvrtka] [u] LT', '[prošlog] [petka] [u] LT', '[prošle] [subote] [u] LT'];\n        return lastWeekDays[this.day()];\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'za %s',\n      past: 'prije %s',\n      s: 'nekoliko sekundi',\n      ss: translator.translate,\n      m: translator.translate,\n      mm: translator.translate,\n      h: translator.translate,\n      hh: translator.translate,\n      d: 'dan',\n      dd: translator.translate,\n      M: 'mjesec',\n      MM: translator.translate,\n      y: 'godinu',\n      yy: translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return me;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/me.js?");

/***/ }),

/***/ "./node_modules/moment/locale/mi.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/mi.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Maori [mi]\n//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var mi = moment.defineLocale('mi', {\n    months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),\n    monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),\n    monthsRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsShortRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsShortStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,2}/i,\n    weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),\n    weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n    weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY [i] HH:mm',\n      LLLL: 'dddd, D MMMM YYYY [i] HH:mm'\n    },\n    calendar: {\n      sameDay: '[i teie mahana, i] LT',\n      nextDay: '[apopo i] LT',\n      nextWeek: 'dddd [i] LT',\n      lastDay: '[inanahi i] LT',\n      lastWeek: 'dddd [whakamutunga i] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'i roto i %s',\n      past: '%s i mua',\n      s: 'te hēkona ruarua',\n      ss: '%d hēkona',\n      m: 'he meneti',\n      mm: '%d meneti',\n      h: 'te haora',\n      hh: '%d haora',\n      d: 'he ra',\n      dd: '%d ra',\n      M: 'he marama',\n      MM: '%d marama',\n      y: 'he tau',\n      yy: '%d tau'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return mi;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/mi.js?");

/***/ }),

/***/ "./node_modules/moment/locale/mk.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/mk.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Macedonian [mk]\n//! author : Borislav Mickov : https://github.com/B0k0\n//! author : Sashko Todorov : https://github.com/bkyceh\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var mk = moment.defineLocale('mk', {\n    months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),\n    monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),\n    weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),\n    weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),\n    weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'D.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY H:mm',\n      LLLL: 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[Денес во] LT',\n      nextDay: '[Утре во] LT',\n      nextWeek: '[Во] dddd [во] LT',\n      lastDay: '[Вчера во] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n          case 3:\n          case 6:\n            return '[Изминатата] dddd [во] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[Изминатиот] dddd [во] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'за %s',\n      past: 'пред %s',\n      s: 'неколку секунди',\n      ss: '%d секунди',\n      m: 'една минута',\n      mm: '%d минути',\n      h: 'еден час',\n      hh: '%d часа',\n      d: 'еден ден',\n      dd: '%d дена',\n      M: 'еден месец',\n      MM: '%d месеци',\n      y: 'една година',\n      yy: '%d години'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n    ordinal: function ordinal(number) {\n      var lastDigit = number % 10,\n          last2Digits = number % 100;\n\n      if (number === 0) {\n        return number + '-ев';\n      } else if (last2Digits === 0) {\n        return number + '-ен';\n      } else if (last2Digits > 10 && last2Digits < 20) {\n        return number + '-ти';\n      } else if (lastDigit === 1) {\n        return number + '-ви';\n      } else if (lastDigit === 2) {\n        return number + '-ри';\n      } else if (lastDigit === 7 || lastDigit === 8) {\n        return number + '-ми';\n      } else {\n        return number + '-ти';\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return mk;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/mk.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ml.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ml.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Malayalam [ml]\n//! author : Floyd Pink : https://github.com/floydpink\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ml = moment.defineLocale('ml', {\n    months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),\n    monthsShort: 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),\n    weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),\n    weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm -നു',\n      LTS: 'A h:mm:ss -നു',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm -നു',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm -നു'\n    },\n    calendar: {\n      sameDay: '[ഇന്ന്] LT',\n      nextDay: '[നാളെ] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[ഇന്നലെ] LT',\n      lastWeek: '[കഴിഞ്ഞ] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s കഴിഞ്ഞ്',\n      past: '%s മുൻപ്',\n      s: 'അൽപ നിമിഷങ്ങൾ',\n      ss: '%d സെക്കൻഡ്',\n      m: 'ഒരു മിനിറ്റ്',\n      mm: '%d മിനിറ്റ്',\n      h: 'ഒരു മണിക്കൂർ',\n      hh: '%d മണിക്കൂർ',\n      d: 'ഒരു ദിവസം',\n      dd: '%d ദിവസം',\n      M: 'ഒരു മാസം',\n      MM: '%d മാസം',\n      y: 'ഒരു വർഷം',\n      yy: '%d വർഷം'\n    },\n    meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'രാത്രി' && hour >= 4 || meridiem === 'ഉച്ച കഴിഞ്ഞ്' || meridiem === 'വൈകുന്നേരം') {\n        return hour + 12;\n      } else {\n        return hour;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'രാത്രി';\n      } else if (hour < 12) {\n        return 'രാവിലെ';\n      } else if (hour < 17) {\n        return 'ഉച്ച കഴിഞ്ഞ്';\n      } else if (hour < 20) {\n        return 'വൈകുന്നേരം';\n      } else {\n        return 'രാത്രി';\n      }\n    }\n  });\n  return ml;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ml.js?");

/***/ }),

/***/ "./node_modules/moment/locale/mn.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/mn.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Mongolian [mn]\n//! author : Javkhlantugs Nyamdorj : https://github.com/javkhaanj7\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function translate(number, withoutSuffix, key, isFuture) {\n    switch (key) {\n      case 's':\n        return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';\n\n      case 'ss':\n        return number + (withoutSuffix ? ' секунд' : ' секундын');\n\n      case 'm':\n      case 'mm':\n        return number + (withoutSuffix ? ' минут' : ' минутын');\n\n      case 'h':\n      case 'hh':\n        return number + (withoutSuffix ? ' цаг' : ' цагийн');\n\n      case 'd':\n      case 'dd':\n        return number + (withoutSuffix ? ' өдөр' : ' өдрийн');\n\n      case 'M':\n      case 'MM':\n        return number + (withoutSuffix ? ' сар' : ' сарын');\n\n      case 'y':\n      case 'yy':\n        return number + (withoutSuffix ? ' жил' : ' жилийн');\n\n      default:\n        return number;\n    }\n  }\n\n  var mn = moment.defineLocale('mn', {\n    months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'),\n    monthsShort: '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),\n    weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),\n    weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY-MM-DD',\n      LL: 'YYYY оны MMMMын D',\n      LLL: 'YYYY оны MMMMын D HH:mm',\n      LLLL: 'dddd, YYYY оны MMMMын D HH:mm'\n    },\n    meridiemParse: /ҮӨ|ҮХ/i,\n    isPM: function isPM(input) {\n      return input === 'ҮХ';\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ҮӨ';\n      } else {\n        return 'ҮХ';\n      }\n    },\n    calendar: {\n      sameDay: '[Өнөөдөр] LT',\n      nextDay: '[Маргааш] LT',\n      nextWeek: '[Ирэх] dddd LT',\n      lastDay: '[Өчигдөр] LT',\n      lastWeek: '[Өнгөрсөн] dddd LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s дараа',\n      past: '%s өмнө',\n      s: translate,\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: translate,\n      dd: translate,\n      M: translate,\n      MM: translate,\n      y: translate,\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2} өдөр/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + ' өдөр';\n\n        default:\n          return number;\n      }\n    }\n  });\n  return mn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/mn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/mr.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/mr.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Marathi [mr]\n//! author : Harshad Kale : https://github.com/kalehv\n//! author : Vivek Athalye : https://github.com/vnathalye\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '१',\n    2: '२',\n    3: '३',\n    4: '४',\n    5: '५',\n    6: '६',\n    7: '७',\n    8: '८',\n    9: '९',\n    0: '०'\n  },\n      numberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n  };\n\n  function relativeTimeMr(number, withoutSuffix, string, isFuture) {\n    var output = '';\n\n    if (withoutSuffix) {\n      switch (string) {\n        case 's':\n          output = 'काही सेकंद';\n          break;\n\n        case 'ss':\n          output = '%d सेकंद';\n          break;\n\n        case 'm':\n          output = 'एक मिनिट';\n          break;\n\n        case 'mm':\n          output = '%d मिनिटे';\n          break;\n\n        case 'h':\n          output = 'एक तास';\n          break;\n\n        case 'hh':\n          output = '%d तास';\n          break;\n\n        case 'd':\n          output = 'एक दिवस';\n          break;\n\n        case 'dd':\n          output = '%d दिवस';\n          break;\n\n        case 'M':\n          output = 'एक महिना';\n          break;\n\n        case 'MM':\n          output = '%d महिने';\n          break;\n\n        case 'y':\n          output = 'एक वर्ष';\n          break;\n\n        case 'yy':\n          output = '%d वर्षे';\n          break;\n      }\n    } else {\n      switch (string) {\n        case 's':\n          output = 'काही सेकंदां';\n          break;\n\n        case 'ss':\n          output = '%d सेकंदां';\n          break;\n\n        case 'm':\n          output = 'एका मिनिटा';\n          break;\n\n        case 'mm':\n          output = '%d मिनिटां';\n          break;\n\n        case 'h':\n          output = 'एका तासा';\n          break;\n\n        case 'hh':\n          output = '%d तासां';\n          break;\n\n        case 'd':\n          output = 'एका दिवसा';\n          break;\n\n        case 'dd':\n          output = '%d दिवसां';\n          break;\n\n        case 'M':\n          output = 'एका महिन्या';\n          break;\n\n        case 'MM':\n          output = '%d महिन्यां';\n          break;\n\n        case 'y':\n          output = 'एका वर्षा';\n          break;\n\n        case 'yy':\n          output = '%d वर्षां';\n          break;\n      }\n    }\n\n    return output.replace(/%d/i, number);\n  }\n\n  var mr = moment.defineLocale('mr', {\n    months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),\n    monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n    weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),\n    weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm वाजता',\n      LTS: 'A h:mm:ss वाजता',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm वाजता',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता'\n    },\n    calendar: {\n      sameDay: '[आज] LT',\n      nextDay: '[उद्या] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[काल] LT',\n      lastWeek: '[मागील] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%sमध्ये',\n      past: '%sपूर्वी',\n      s: relativeTimeMr,\n      ss: relativeTimeMr,\n      m: relativeTimeMr,\n      mm: relativeTimeMr,\n      h: relativeTimeMr,\n      hh: relativeTimeMr,\n      d: relativeTimeMr,\n      dd: relativeTimeMr,\n      M: relativeTimeMr,\n      MM: relativeTimeMr,\n      y: relativeTimeMr,\n      yy: relativeTimeMr\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[१२३४५६७८९०]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {\n        return hour;\n      } else if (meridiem === 'दुपारी' || meridiem === 'सायंकाळी' || meridiem === 'रात्री') {\n        return hour >= 12 ? hour : hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour >= 0 && hour < 6) {\n        return 'पहाटे';\n      } else if (hour < 12) {\n        return 'सकाळी';\n      } else if (hour < 17) {\n        return 'दुपारी';\n      } else if (hour < 20) {\n        return 'सायंकाळी';\n      } else {\n        return 'रात्री';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return mr;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/mr.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ms-my.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ms-my.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Malay [ms-my]\n//! note : DEPRECATED, the correct one is [ms]\n//! author : Weldan Jamili : https://github.com/weldan\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var msMy = moment.defineLocale('ms-my', {\n    months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),\n    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n    weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n    weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n    weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat: {\n      LT: 'HH.mm',\n      LTS: 'HH.mm.ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY [pukul] HH.mm',\n      LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|tengahari|petang|malam/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'pagi') {\n        return hour;\n      } else if (meridiem === 'tengahari') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === 'petang' || meridiem === 'malam') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 11) {\n        return 'pagi';\n      } else if (hours < 15) {\n        return 'tengahari';\n      } else if (hours < 19) {\n        return 'petang';\n      } else {\n        return 'malam';\n      }\n    },\n    calendar: {\n      sameDay: '[Hari ini pukul] LT',\n      nextDay: '[Esok pukul] LT',\n      nextWeek: 'dddd [pukul] LT',\n      lastDay: '[Kelmarin pukul] LT',\n      lastWeek: 'dddd [lepas pukul] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'dalam %s',\n      past: '%s yang lepas',\n      s: 'beberapa saat',\n      ss: '%d saat',\n      m: 'seminit',\n      mm: '%d minit',\n      h: 'sejam',\n      hh: '%d jam',\n      d: 'sehari',\n      dd: '%d hari',\n      M: 'sebulan',\n      MM: '%d bulan',\n      y: 'setahun',\n      yy: '%d tahun'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return msMy;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ms-my.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ms.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ms.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Malay [ms]\n//! author : Weldan Jamili : https://github.com/weldan\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ms = moment.defineLocale('ms', {\n    months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),\n    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n    weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n    weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n    weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat: {\n      LT: 'HH.mm',\n      LTS: 'HH.mm.ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY [pukul] HH.mm',\n      LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|tengahari|petang|malam/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'pagi') {\n        return hour;\n      } else if (meridiem === 'tengahari') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === 'petang' || meridiem === 'malam') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 11) {\n        return 'pagi';\n      } else if (hours < 15) {\n        return 'tengahari';\n      } else if (hours < 19) {\n        return 'petang';\n      } else {\n        return 'malam';\n      }\n    },\n    calendar: {\n      sameDay: '[Hari ini pukul] LT',\n      nextDay: '[Esok pukul] LT',\n      nextWeek: 'dddd [pukul] LT',\n      lastDay: '[Kelmarin pukul] LT',\n      lastWeek: 'dddd [lepas pukul] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'dalam %s',\n      past: '%s yang lepas',\n      s: 'beberapa saat',\n      ss: '%d saat',\n      m: 'seminit',\n      mm: '%d minit',\n      h: 'sejam',\n      hh: '%d jam',\n      d: 'sehari',\n      dd: '%d hari',\n      M: 'sebulan',\n      MM: '%d bulan',\n      y: 'setahun',\n      yy: '%d tahun'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return ms;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ms.js?");

/***/ }),

/***/ "./node_modules/moment/locale/mt.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/mt.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Maltese (Malta) [mt]\n//! author : Alessandro Maruccia : https://github.com/alesma\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var mt = moment.defineLocale('mt', {\n    months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'),\n    monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),\n    weekdays: 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'),\n    weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),\n    weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Illum fil-]LT',\n      nextDay: '[Għada fil-]LT',\n      nextWeek: 'dddd [fil-]LT',\n      lastDay: '[Il-bieraħ fil-]LT',\n      lastWeek: 'dddd [li għadda] [fil-]LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'f’ %s',\n      past: '%s ilu',\n      s: 'ftit sekondi',\n      ss: '%d sekondi',\n      m: 'minuta',\n      mm: '%d minuti',\n      h: 'siegħa',\n      hh: '%d siegħat',\n      d: 'ġurnata',\n      dd: '%d ġranet',\n      M: 'xahar',\n      MM: '%d xhur',\n      y: 'sena',\n      yy: '%d sni'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return mt;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/mt.js?");

/***/ }),

/***/ "./node_modules/moment/locale/my.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/my.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Burmese [my]\n//! author : Squar team, mysquar.com\n//! author : David Rossellat : https://github.com/gholadr\n//! author : Tin Aung Lin : https://github.com/thanyawzinmin\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '၁',\n    2: '၂',\n    3: '၃',\n    4: '၄',\n    5: '၅',\n    6: '၆',\n    7: '၇',\n    8: '၈',\n    9: '၉',\n    0: '၀'\n  },\n      numberMap = {\n    '၁': '1',\n    '၂': '2',\n    '၃': '3',\n    '၄': '4',\n    '၅': '5',\n    '၆': '6',\n    '၇': '7',\n    '၈': '8',\n    '၉': '9',\n    '၀': '0'\n  };\n  var my = moment.defineLocale('my', {\n    months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),\n    monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),\n    weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),\n    weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n    weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[ယနေ.] LT [မှာ]',\n      nextDay: '[မနက်ဖြန်] LT [မှာ]',\n      nextWeek: 'dddd LT [မှာ]',\n      lastDay: '[မနေ.က] LT [မှာ]',\n      lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'လာမည့် %s မှာ',\n      past: 'လွန်ခဲ့သော %s က',\n      s: 'စက္ကန်.အနည်းငယ်',\n      ss: '%d စက္ကန့်',\n      m: 'တစ်မိနစ်',\n      mm: '%d မိနစ်',\n      h: 'တစ်နာရီ',\n      hh: '%d နာရီ',\n      d: 'တစ်ရက်',\n      dd: '%d ရက်',\n      M: 'တစ်လ',\n      MM: '%d လ',\n      y: 'တစ်နှစ်',\n      yy: '%d နှစ်'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return my;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/my.js?");

/***/ }),

/***/ "./node_modules/moment/locale/nb.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/nb.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Norwegian Bokmål [nb]\n//! authors : Espen Hovlandsdal : https://github.com/rexxars\n//!           Sigurd Gartmann : https://github.com/sigurdga\n//!           Stephen Ramthun : https://github.com/stephenramthun\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var nb = moment.defineLocale('nb', {\n    months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort: 'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n    weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),\n    weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY [kl.] HH:mm',\n      LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar: {\n      sameDay: '[i dag kl.] LT',\n      nextDay: '[i morgen kl.] LT',\n      nextWeek: 'dddd [kl.] LT',\n      lastDay: '[i går kl.] LT',\n      lastWeek: '[forrige] dddd [kl.] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'om %s',\n      past: '%s siden',\n      s: 'noen sekunder',\n      ss: '%d sekunder',\n      m: 'ett minutt',\n      mm: '%d minutter',\n      h: 'en time',\n      hh: '%d timer',\n      d: 'en dag',\n      dd: '%d dager',\n      w: 'en uke',\n      ww: '%d uker',\n      M: 'en måned',\n      MM: '%d måneder',\n      y: 'ett år',\n      yy: '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return nb;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/nb.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ne.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ne.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Nepalese [ne]\n//! author : suvash : https://github.com/suvash\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '१',\n    2: '२',\n    3: '३',\n    4: '४',\n    5: '५',\n    6: '६',\n    7: '७',\n    8: '८',\n    9: '९',\n    0: '०'\n  },\n      numberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n  };\n  var ne = moment.defineLocale('ne', {\n    months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),\n    monthsShort: 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),\n    weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),\n    weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'Aको h:mm बजे',\n      LTS: 'Aको h:mm:ss बजे',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, Aको h:mm बजे',\n      LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[१२३४५६७८९०]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    meridiemParse: /राति|बिहान|दिउँसो|साँझ/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'राति') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'बिहान') {\n        return hour;\n      } else if (meridiem === 'दिउँसो') {\n        return hour >= 10 ? hour : hour + 12;\n      } else if (meridiem === 'साँझ') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 3) {\n        return 'राति';\n      } else if (hour < 12) {\n        return 'बिहान';\n      } else if (hour < 16) {\n        return 'दिउँसो';\n      } else if (hour < 20) {\n        return 'साँझ';\n      } else {\n        return 'राति';\n      }\n    },\n    calendar: {\n      sameDay: '[आज] LT',\n      nextDay: '[भोलि] LT',\n      nextWeek: '[आउँदो] dddd[,] LT',\n      lastDay: '[हिजो] LT',\n      lastWeek: '[गएको] dddd[,] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%sमा',\n      past: '%s अगाडि',\n      s: 'केही क्षण',\n      ss: '%d सेकेण्ड',\n      m: 'एक मिनेट',\n      mm: '%d मिनेट',\n      h: 'एक घण्टा',\n      hh: '%d घण्टा',\n      d: 'एक दिन',\n      dd: '%d दिन',\n      M: 'एक महिना',\n      MM: '%d महिना',\n      y: 'एक बर्ष',\n      yy: '%d बर्ष'\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return ne;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ne.js?");

/***/ }),

/***/ "./node_modules/moment/locale/nl-be.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/nl-be.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Dutch (Belgium) [nl-be]\n//! author : Joris Röling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n      monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n      monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i],\n      monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n  var nlBe = moment.defineLocale('nl-be', {\n    months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),\n    monthsShort: function monthsShort(m, format) {\n      if (!m) {\n        return monthsShortWithDots;\n      } else if (/-MMM-/.test(format)) {\n        return monthsShortWithoutDots[m.month()];\n      } else {\n        return monthsShortWithDots[m.month()];\n      }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n    monthsShortStrictRegex: /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n    weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n    weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[vandaag om] LT',\n      nextDay: '[morgen om] LT',\n      nextWeek: 'dddd [om] LT',\n      lastDay: '[gisteren om] LT',\n      lastWeek: '[afgelopen] dddd [om] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'over %s',\n      past: '%s geleden',\n      s: 'een paar seconden',\n      ss: '%d seconden',\n      m: 'één minuut',\n      mm: '%d minuten',\n      h: 'één uur',\n      hh: '%d uur',\n      d: 'één dag',\n      dd: '%d dagen',\n      M: 'één maand',\n      MM: '%d maanden',\n      y: 'één jaar',\n      yy: '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal: function ordinal(number) {\n      return number + (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de');\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return nlBe;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/nl-be.js?");

/***/ }),

/***/ "./node_modules/moment/locale/nl.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/nl.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Dutch [nl]\n//! author : Joris Röling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n      monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n      monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i],\n      monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n  var nl = moment.defineLocale('nl', {\n    months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),\n    monthsShort: function monthsShort(m, format) {\n      if (!m) {\n        return monthsShortWithDots;\n      } else if (/-MMM-/.test(format)) {\n        return monthsShortWithoutDots[m.month()];\n      } else {\n        return monthsShortWithDots[m.month()];\n      }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n    monthsShortStrictRegex: /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n    weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n    weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD-MM-YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[vandaag om] LT',\n      nextDay: '[morgen om] LT',\n      nextWeek: 'dddd [om] LT',\n      lastDay: '[gisteren om] LT',\n      lastWeek: '[afgelopen] dddd [om] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'over %s',\n      past: '%s geleden',\n      s: 'een paar seconden',\n      ss: '%d seconden',\n      m: 'één minuut',\n      mm: '%d minuten',\n      h: 'één uur',\n      hh: '%d uur',\n      d: 'één dag',\n      dd: '%d dagen',\n      w: 'één week',\n      ww: '%d weken',\n      M: 'één maand',\n      MM: '%d maanden',\n      y: 'één jaar',\n      yy: '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal: function ordinal(number) {\n      return number + (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de');\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return nl;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/nl.js?");

/***/ }),

/***/ "./node_modules/moment/locale/nn.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/nn.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Nynorsk [nn]\n//! authors : https://github.com/mechuwind\n//!           Stephen Ramthun : https://github.com/stephenramthun\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var nn = moment.defineLocale('nn', {\n    months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort: 'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),\n    weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),\n    weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY [kl.] H:mm',\n      LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar: {\n      sameDay: '[I dag klokka] LT',\n      nextDay: '[I morgon klokka] LT',\n      nextWeek: 'dddd [klokka] LT',\n      lastDay: '[I går klokka] LT',\n      lastWeek: '[Føregåande] dddd [klokka] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'om %s',\n      past: '%s sidan',\n      s: 'nokre sekund',\n      ss: '%d sekund',\n      m: 'eit minutt',\n      mm: '%d minutt',\n      h: 'ein time',\n      hh: '%d timar',\n      d: 'ein dag',\n      dd: '%d dagar',\n      w: 'ei veke',\n      ww: '%d veker',\n      M: 'ein månad',\n      MM: '%d månader',\n      y: 'eit år',\n      yy: '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return nn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/nn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/oc-lnc.js":
/*!**********************************************!*\
  !*** ./node_modules/moment/locale/oc-lnc.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Occitan, lengadocian dialecte [oc-lnc]\n//! author : Quentin PAGÈS : https://github.com/Quenty31\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ocLnc = moment.defineLocale('oc-lnc', {\n    months: {\n      standalone: 'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split('_'),\n      format: \"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre\".split('_'),\n      isFormat: /D[oD]?(\\s)+MMMM/\n    },\n    monthsShort: 'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split('_'),\n    weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),\n    weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM [de] YYYY',\n      ll: 'D MMM YYYY',\n      LLL: 'D MMMM [de] YYYY [a] H:mm',\n      lll: 'D MMM YYYY, H:mm',\n      LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',\n      llll: 'ddd D MMM YYYY, H:mm'\n    },\n    calendar: {\n      sameDay: '[uèi a] LT',\n      nextDay: '[deman a] LT',\n      nextWeek: 'dddd [a] LT',\n      lastDay: '[ièr a] LT',\n      lastWeek: 'dddd [passat a] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: \"d'aquí %s\",\n      past: 'fa %s',\n      s: 'unas segondas',\n      ss: '%d segondas',\n      m: 'una minuta',\n      mm: '%d minutas',\n      h: 'una ora',\n      hh: '%d oras',\n      d: 'un jorn',\n      dd: '%d jorns',\n      M: 'un mes',\n      MM: '%d meses',\n      y: 'un an',\n      yy: '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n    ordinal: function ordinal(number, period) {\n      var output = number === 1 ? 'r' : number === 2 ? 'n' : number === 3 ? 'r' : number === 4 ? 't' : 'è';\n\n      if (period === 'w' || period === 'W') {\n        output = 'a';\n      }\n\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4\n    }\n  });\n  return ocLnc;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/oc-lnc.js?");

/***/ }),

/***/ "./node_modules/moment/locale/pa-in.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/pa-in.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Punjabi (India) [pa-in]\n//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '੧',\n    2: '੨',\n    3: '੩',\n    4: '੪',\n    5: '੫',\n    6: '੬',\n    7: '੭',\n    8: '੮',\n    9: '੯',\n    0: '੦'\n  },\n      numberMap = {\n    '੧': '1',\n    '੨': '2',\n    '੩': '3',\n    '੪': '4',\n    '੫': '5',\n    '੬': '6',\n    '੭': '7',\n    '੮': '8',\n    '੯': '9',\n    '੦': '0'\n  };\n  var paIn = moment.defineLocale('pa-in', {\n    // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.\n    months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),\n    monthsShort: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),\n    weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),\n    weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n    weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm ਵਜੇ',\n      LTS: 'A h:mm:ss ਵਜੇ',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'\n    },\n    calendar: {\n      sameDay: '[ਅਜ] LT',\n      nextDay: '[ਕਲ] LT',\n      nextWeek: '[ਅਗਲਾ] dddd, LT',\n      lastDay: '[ਕਲ] LT',\n      lastWeek: '[ਪਿਛਲੇ] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s ਵਿੱਚ',\n      past: '%s ਪਿਛਲੇ',\n      s: 'ਕੁਝ ਸਕਿੰਟ',\n      ss: '%d ਸਕਿੰਟ',\n      m: 'ਇਕ ਮਿੰਟ',\n      mm: '%d ਮਿੰਟ',\n      h: 'ਇੱਕ ਘੰਟਾ',\n      hh: '%d ਘੰਟੇ',\n      d: 'ਇੱਕ ਦਿਨ',\n      dd: '%d ਦਿਨ',\n      M: 'ਇੱਕ ਮਹੀਨਾ',\n      MM: '%d ਮਹੀਨੇ',\n      y: 'ਇੱਕ ਸਾਲ',\n      yy: '%d ਸਾਲ'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    // Punjabi notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.\n    meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'ਰਾਤ') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'ਸਵੇਰ') {\n        return hour;\n      } else if (meridiem === 'ਦੁਪਹਿਰ') {\n        return hour >= 10 ? hour : hour + 12;\n      } else if (meridiem === 'ਸ਼ਾਮ') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'ਰਾਤ';\n      } else if (hour < 10) {\n        return 'ਸਵੇਰ';\n      } else if (hour < 17) {\n        return 'ਦੁਪਹਿਰ';\n      } else if (hour < 20) {\n        return 'ਸ਼ਾਮ';\n      } else {\n        return 'ਰਾਤ';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return paIn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/pa-in.js?");

/***/ }),

/***/ "./node_modules/moment/locale/pl.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/pl.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Polish [pl]\n//! author : Rafal Hirsz : https://github.com/evoL\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),\n      monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'),\n      monthsParse = [/^sty/i, /^lut/i, /^mar/i, /^kwi/i, /^maj/i, /^cze/i, /^lip/i, /^sie/i, /^wrz/i, /^paź/i, /^lis/i, /^gru/i];\n\n  function plural(n) {\n    return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;\n  }\n\n  function translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n\n    switch (key) {\n      case 'ss':\n        return result + (plural(number) ? 'sekundy' : 'sekund');\n\n      case 'm':\n        return withoutSuffix ? 'minuta' : 'minutę';\n\n      case 'mm':\n        return result + (plural(number) ? 'minuty' : 'minut');\n\n      case 'h':\n        return withoutSuffix ? 'godzina' : 'godzinę';\n\n      case 'hh':\n        return result + (plural(number) ? 'godziny' : 'godzin');\n\n      case 'ww':\n        return result + (plural(number) ? 'tygodnie' : 'tygodni');\n\n      case 'MM':\n        return result + (plural(number) ? 'miesiące' : 'miesięcy');\n\n      case 'yy':\n        return result + (plural(number) ? 'lata' : 'lat');\n    }\n  }\n\n  var pl = moment.defineLocale('pl', {\n    months: function months(momentToFormat, format) {\n      if (!momentToFormat) {\n        return monthsNominative;\n      } else if (/D MMMM/.test(format)) {\n        return monthsSubjective[momentToFormat.month()];\n      } else {\n        return monthsNominative[momentToFormat.month()];\n      }\n    },\n    monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays: 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),\n    weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),\n    weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Dziś o] LT',\n      nextDay: '[Jutro o] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[W niedzielę o] LT';\n\n          case 2:\n            return '[We wtorek o] LT';\n\n          case 3:\n            return '[W środę o] LT';\n\n          case 6:\n            return '[W sobotę o] LT';\n\n          default:\n            return '[W] dddd [o] LT';\n        }\n      },\n      lastDay: '[Wczoraj o] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[W zeszłą niedzielę o] LT';\n\n          case 3:\n            return '[W zeszłą środę o] LT';\n\n          case 6:\n            return '[W zeszłą sobotę o] LT';\n\n          default:\n            return '[W zeszły] dddd [o] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'za %s',\n      past: '%s temu',\n      s: 'kilka sekund',\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: '1 dzień',\n      dd: '%d dni',\n      w: 'tydzień',\n      ww: translate,\n      M: 'miesiąc',\n      MM: translate,\n      y: 'rok',\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return pl;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/pl.js?");

/***/ }),

/***/ "./node_modules/moment/locale/pt-br.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/pt-br.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Portuguese (Brazil) [pt-br]\n//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ptBr = moment.defineLocale('pt-br', {\n    months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),\n    monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n    weekdays: 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),\n    weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),\n    weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D [de] MMMM [de] YYYY',\n      LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',\n      LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'\n    },\n    calendar: {\n      sameDay: '[Hoje às] LT',\n      nextDay: '[Amanhã às] LT',\n      nextWeek: 'dddd [às] LT',\n      lastDay: '[Ontem às] LT',\n      lastWeek: function lastWeek() {\n        return this.day() === 0 || this.day() === 6 ? '[Último] dddd [às] LT' // Saturday + Sunday\n        : '[Última] dddd [às] LT'; // Monday - Friday\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'em %s',\n      past: 'há %s',\n      s: 'poucos segundos',\n      ss: '%d segundos',\n      m: 'um minuto',\n      mm: '%d minutos',\n      h: 'uma hora',\n      hh: '%d horas',\n      d: 'um dia',\n      dd: '%d dias',\n      M: 'um mês',\n      MM: '%d meses',\n      y: 'um ano',\n      yy: '%d anos'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    invalidDate: 'Data inválida'\n  });\n  return ptBr;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/pt-br.js?");

/***/ }),

/***/ "./node_modules/moment/locale/pt.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/pt.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Portuguese [pt]\n//! author : Jefferson : https://github.com/jalex79\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var pt = moment.defineLocale('pt', {\n    months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),\n    monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n    weekdays: 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),\n    weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),\n    weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D [de] MMMM [de] YYYY',\n      LLL: 'D [de] MMMM [de] YYYY HH:mm',\n      LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Hoje às] LT',\n      nextDay: '[Amanhã às] LT',\n      nextWeek: 'dddd [às] LT',\n      lastDay: '[Ontem às] LT',\n      lastWeek: function lastWeek() {\n        return this.day() === 0 || this.day() === 6 ? '[Último] dddd [às] LT' // Saturday + Sunday\n        : '[Última] dddd [às] LT'; // Monday - Friday\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'em %s',\n      past: 'há %s',\n      s: 'segundos',\n      ss: '%d segundos',\n      m: 'um minuto',\n      mm: '%d minutos',\n      h: 'uma hora',\n      hh: '%d horas',\n      d: 'um dia',\n      dd: '%d dias',\n      w: 'uma semana',\n      ww: '%d semanas',\n      M: 'um mês',\n      MM: '%d meses',\n      y: 'um ano',\n      yy: '%d anos'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return pt;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/pt.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ro.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ro.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Romanian [ro]\n//! author : Vlad Gurdiga : https://github.com/gurdiga\n//! author : Valentin Agachi : https://github.com/avaly\n//! author : Emanuel Cepoi : https://github.com/cepem\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n      ss: 'secunde',\n      mm: 'minute',\n      hh: 'ore',\n      dd: 'zile',\n      ww: 'săptămâni',\n      MM: 'luni',\n      yy: 'ani'\n    },\n        separator = ' ';\n\n    if (number % 100 >= 20 || number >= 100 && number % 100 === 0) {\n      separator = ' de ';\n    }\n\n    return number + separator + format[key];\n  }\n\n  var ro = moment.defineLocale('ro', {\n    months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),\n    monthsShort: 'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),\n    weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),\n    weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY H:mm',\n      LLLL: 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[azi la] LT',\n      nextDay: '[mâine la] LT',\n      nextWeek: 'dddd [la] LT',\n      lastDay: '[ieri la] LT',\n      lastWeek: '[fosta] dddd [la] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'peste %s',\n      past: '%s în urmă',\n      s: 'câteva secunde',\n      ss: relativeTimeWithPlural,\n      m: 'un minut',\n      mm: relativeTimeWithPlural,\n      h: 'o oră',\n      hh: relativeTimeWithPlural,\n      d: 'o zi',\n      dd: relativeTimeWithPlural,\n      w: 'o săptămână',\n      ww: relativeTimeWithPlural,\n      M: 'o lună',\n      MM: relativeTimeWithPlural,\n      y: 'un an',\n      yy: relativeTimeWithPlural\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return ro;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ro.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ru.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ru.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Russian [ru]\n//! author : Viktorminator : https://github.com/Viktorminator\n//! author : Menelion Elensúle : https://github.com/Oire\n//! author : Коренберг Марк : https://github.com/socketpair\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2];\n  }\n\n  function relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n      ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n      mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',\n      hh: 'час_часа_часов',\n      dd: 'день_дня_дней',\n      ww: 'неделя_недели_недель',\n      MM: 'месяц_месяца_месяцев',\n      yy: 'год_года_лет'\n    };\n\n    if (key === 'm') {\n      return withoutSuffix ? 'минута' : 'минуту';\n    } else {\n      return number + ' ' + plural(format[key], +number);\n    }\n  }\n\n  var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; // http://new.gramota.ru/spravka/rules/139-prop : § 103\n  // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637\n  // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753\n\n  var ru = moment.defineLocale('ru', {\n    months: {\n      format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),\n      standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')\n    },\n    monthsShort: {\n      // по CLDR именно \"июл.\" и \"июн.\", но какой смысл менять букву на точку?\n      format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),\n      standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')\n    },\n    weekdays: {\n      standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),\n      format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),\n      isFormat: /\\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/\n    },\n    weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n    weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки\n    monthsRegex: /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n    // копия предыдущего\n    monthsShortRegex: /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n    // полные названия с падежами\n    monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,\n    // Выражение, которое соответствует только сокращённым формам\n    monthsShortStrictRegex: /^(янв\\.|февр?\\.|мар[т.]|апр\\.|ма[яй]|июн[ья.]|июл[ья.]|авг\\.|сент?\\.|окт\\.|нояб?\\.|дек\\.)/i,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY г.',\n      LLL: 'D MMMM YYYY г., H:mm',\n      LLLL: 'dddd, D MMMM YYYY г., H:mm'\n    },\n    calendar: {\n      sameDay: '[Сегодня, в] LT',\n      nextDay: '[Завтра, в] LT',\n      lastDay: '[Вчера, в] LT',\n      nextWeek: function nextWeek(now) {\n        if (now.week() !== this.week()) {\n          switch (this.day()) {\n            case 0:\n              return '[В следующее] dddd, [в] LT';\n\n            case 1:\n            case 2:\n            case 4:\n              return '[В следующий] dddd, [в] LT';\n\n            case 3:\n            case 5:\n            case 6:\n              return '[В следующую] dddd, [в] LT';\n          }\n        } else {\n          if (this.day() === 2) {\n            return '[Во] dddd, [в] LT';\n          } else {\n            return '[В] dddd, [в] LT';\n          }\n        }\n      },\n      lastWeek: function lastWeek(now) {\n        if (now.week() !== this.week()) {\n          switch (this.day()) {\n            case 0:\n              return '[В прошлое] dddd, [в] LT';\n\n            case 1:\n            case 2:\n            case 4:\n              return '[В прошлый] dddd, [в] LT';\n\n            case 3:\n            case 5:\n            case 6:\n              return '[В прошлую] dddd, [в] LT';\n          }\n        } else {\n          if (this.day() === 2) {\n            return '[Во] dddd, [в] LT';\n          } else {\n            return '[В] dddd, [в] LT';\n          }\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'через %s',\n      past: '%s назад',\n      s: 'несколько секунд',\n      ss: relativeTimeWithPlural,\n      m: relativeTimeWithPlural,\n      mm: relativeTimeWithPlural,\n      h: 'час',\n      hh: relativeTimeWithPlural,\n      d: 'день',\n      dd: relativeTimeWithPlural,\n      w: 'неделя',\n      ww: relativeTimeWithPlural,\n      M: 'месяц',\n      MM: relativeTimeWithPlural,\n      y: 'год',\n      yy: relativeTimeWithPlural\n    },\n    meridiemParse: /ночи|утра|дня|вечера/i,\n    isPM: function isPM(input) {\n      return /^(дня|вечера)$/.test(input);\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'ночи';\n      } else if (hour < 12) {\n        return 'утра';\n      } else if (hour < 17) {\n        return 'дня';\n      } else {\n        return 'вечера';\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(й|го|я)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'M':\n        case 'd':\n        case 'DDD':\n          return number + '-й';\n\n        case 'D':\n          return number + '-го';\n\n        case 'w':\n        case 'W':\n          return number + '-я';\n\n        default:\n          return number;\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return ru;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ru.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sd.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/sd.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Sindhi [sd]\n//! author : Narain Sagar : https://github.com/narainsagar\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var months = ['جنوري', 'فيبروري', 'مارچ', 'اپريل', 'مئي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'],\n      days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];\n  var sd = moment.defineLocale('sd', {\n    months: months,\n    monthsShort: months,\n    weekdays: days,\n    weekdaysShort: days,\n    weekdaysMin: days,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd، D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /صبح|شام/,\n    isPM: function isPM(input) {\n      return 'شام' === input;\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'صبح';\n      }\n\n      return 'شام';\n    },\n    calendar: {\n      sameDay: '[اڄ] LT',\n      nextDay: '[سڀاڻي] LT',\n      nextWeek: 'dddd [اڳين هفتي تي] LT',\n      lastDay: '[ڪالهه] LT',\n      lastWeek: '[گزريل هفتي] dddd [تي] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s پوء',\n      past: '%s اڳ',\n      s: 'چند سيڪنڊ',\n      ss: '%d سيڪنڊ',\n      m: 'هڪ منٽ',\n      mm: '%d منٽ',\n      h: 'هڪ ڪلاڪ',\n      hh: '%d ڪلاڪ',\n      d: 'هڪ ڏينهن',\n      dd: '%d ڏينهن',\n      M: 'هڪ مهينو',\n      MM: '%d مهينا',\n      y: 'هڪ سال',\n      yy: '%d سال'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/,/g, '،');\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return sd;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sd.js?");

/***/ }),

/***/ "./node_modules/moment/locale/se.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/se.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Northern Sami [se]\n//! authors : Bård Rolstad Henriksen : https://github.com/karamell\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var se = moment.defineLocale('se', {\n    months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),\n    monthsShort: 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),\n    weekdays: 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),\n    weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),\n    weekdaysMin: 's_v_m_g_d_b_L'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'MMMM D. [b.] YYYY',\n      LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',\n      LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'\n    },\n    calendar: {\n      sameDay: '[otne ti] LT',\n      nextDay: '[ihttin ti] LT',\n      nextWeek: 'dddd [ti] LT',\n      lastDay: '[ikte ti] LT',\n      lastWeek: '[ovddit] dddd [ti] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s geažes',\n      past: 'maŋit %s',\n      s: 'moadde sekunddat',\n      ss: '%d sekunddat',\n      m: 'okta minuhta',\n      mm: '%d minuhtat',\n      h: 'okta diimmu',\n      hh: '%d diimmut',\n      d: 'okta beaivi',\n      dd: '%d beaivvit',\n      M: 'okta mánnu',\n      MM: '%d mánut',\n      y: 'okta jahki',\n      yy: '%d jagit'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return se;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/se.js?");

/***/ }),

/***/ "./node_modules/moment/locale/si.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/si.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Sinhalese [si]\n//! author : Sampath Sitinamaluwa : https://github.com/sampathsris\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  /*jshint -W100*/\n\n  var si = moment.defineLocale('si', {\n    months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),\n    monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),\n    weekdays: 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),\n    weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),\n    weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'a h:mm',\n      LTS: 'a h:mm:ss',\n      L: 'YYYY/MM/DD',\n      LL: 'YYYY MMMM D',\n      LLL: 'YYYY MMMM D, a h:mm',\n      LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'\n    },\n    calendar: {\n      sameDay: '[අද] LT[ට]',\n      nextDay: '[හෙට] LT[ට]',\n      nextWeek: 'dddd LT[ට]',\n      lastDay: '[ඊයේ] LT[ට]',\n      lastWeek: '[පසුගිය] dddd LT[ට]',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%sකින්',\n      past: '%sකට පෙර',\n      s: 'තත්පර කිහිපය',\n      ss: 'තත්පර %d',\n      m: 'මිනිත්තුව',\n      mm: 'මිනිත්තු %d',\n      h: 'පැය',\n      hh: 'පැය %d',\n      d: 'දිනය',\n      dd: 'දින %d',\n      M: 'මාසය',\n      MM: 'මාස %d',\n      y: 'වසර',\n      yy: 'වසර %d'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2} වැනි/,\n    ordinal: function ordinal(number) {\n      return number + ' වැනි';\n    },\n    meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,\n    isPM: function isPM(input) {\n      return input === 'ප.ව.' || input === 'පස් වරු';\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours > 11) {\n        return isLower ? 'ප.ව.' : 'පස් වරු';\n      } else {\n        return isLower ? 'පෙ.ව.' : 'පෙර වරු';\n      }\n    }\n  });\n  return si;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/si.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sk.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/sk.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Slovak [sk]\n//! author : Martin Minka : https://github.com/k2s\n//! based on work of petrbela : https://github.com/petrbela\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),\n      monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');\n\n  function plural(n) {\n    return n > 1 && n < 5;\n  }\n\n  function translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n\n    switch (key) {\n      case 's':\n        // a few seconds / in a few seconds / a few seconds ago\n        return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';\n\n      case 'ss':\n        // 9 seconds / in 9 seconds / 9 seconds ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'sekundy' : 'sekúnd');\n        } else {\n          return result + 'sekundami';\n        }\n\n      case 'm':\n        // a minute / in a minute / a minute ago\n        return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';\n\n      case 'mm':\n        // 9 minutes / in 9 minutes / 9 minutes ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'minúty' : 'minút');\n        } else {\n          return result + 'minútami';\n        }\n\n      case 'h':\n        // an hour / in an hour / an hour ago\n        return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n\n      case 'hh':\n        // 9 hours / in 9 hours / 9 hours ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'hodiny' : 'hodín');\n        } else {\n          return result + 'hodinami';\n        }\n\n      case 'd':\n        // a day / in a day / a day ago\n        return withoutSuffix || isFuture ? 'deň' : 'dňom';\n\n      case 'dd':\n        // 9 days / in 9 days / 9 days ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'dni' : 'dní');\n        } else {\n          return result + 'dňami';\n        }\n\n      case 'M':\n        // a month / in a month / a month ago\n        return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';\n\n      case 'MM':\n        // 9 months / in 9 months / 9 months ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'mesiace' : 'mesiacov');\n        } else {\n          return result + 'mesiacmi';\n        }\n\n      case 'y':\n        // a year / in a year / a year ago\n        return withoutSuffix || isFuture ? 'rok' : 'rokom';\n\n      case 'yy':\n        // 9 years / in 9 years / 9 years ago\n        if (withoutSuffix || isFuture) {\n          return result + (plural(number) ? 'roky' : 'rokov');\n        } else {\n          return result + 'rokmi';\n        }\n\n    }\n  }\n\n  var sk = moment.defineLocale('sk', {\n    months: months,\n    monthsShort: monthsShort,\n    weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),\n    weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),\n    weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY H:mm',\n      LLLL: 'dddd D. MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[dnes o] LT',\n      nextDay: '[zajtra o] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[v nedeľu o] LT';\n\n          case 1:\n          case 2:\n            return '[v] dddd [o] LT';\n\n          case 3:\n            return '[v stredu o] LT';\n\n          case 4:\n            return '[vo štvrtok o] LT';\n\n          case 5:\n            return '[v piatok o] LT';\n\n          case 6:\n            return '[v sobotu o] LT';\n        }\n      },\n      lastDay: '[včera o] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[minulú nedeľu o] LT';\n\n          case 1:\n          case 2:\n            return '[minulý] dddd [o] LT';\n\n          case 3:\n            return '[minulú stredu o] LT';\n\n          case 4:\n          case 5:\n            return '[minulý] dddd [o] LT';\n\n          case 6:\n            return '[minulú sobotu o] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'za %s',\n      past: 'pred %s',\n      s: translate,\n      ss: translate,\n      m: translate,\n      mm: translate,\n      h: translate,\n      hh: translate,\n      d: translate,\n      dd: translate,\n      M: translate,\n      MM: translate,\n      y: translate,\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return sk;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sk.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sl.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/sl.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Slovenian [sl]\n//! author : Robert Sedovšek : https://github.com/sedovsek\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n\n    switch (key) {\n      case 's':\n        return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';\n\n      case 'ss':\n        if (number === 1) {\n          result += withoutSuffix ? 'sekundo' : 'sekundi';\n        } else if (number === 2) {\n          result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';\n        } else if (number < 5) {\n          result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';\n        } else {\n          result += 'sekund';\n        }\n\n        return result;\n\n      case 'm':\n        return withoutSuffix ? 'ena minuta' : 'eno minuto';\n\n      case 'mm':\n        if (number === 1) {\n          result += withoutSuffix ? 'minuta' : 'minuto';\n        } else if (number === 2) {\n          result += withoutSuffix || isFuture ? 'minuti' : 'minutama';\n        } else if (number < 5) {\n          result += withoutSuffix || isFuture ? 'minute' : 'minutami';\n        } else {\n          result += withoutSuffix || isFuture ? 'minut' : 'minutami';\n        }\n\n        return result;\n\n      case 'h':\n        return withoutSuffix ? 'ena ura' : 'eno uro';\n\n      case 'hh':\n        if (number === 1) {\n          result += withoutSuffix ? 'ura' : 'uro';\n        } else if (number === 2) {\n          result += withoutSuffix || isFuture ? 'uri' : 'urama';\n        } else if (number < 5) {\n          result += withoutSuffix || isFuture ? 'ure' : 'urami';\n        } else {\n          result += withoutSuffix || isFuture ? 'ur' : 'urami';\n        }\n\n        return result;\n\n      case 'd':\n        return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';\n\n      case 'dd':\n        if (number === 1) {\n          result += withoutSuffix || isFuture ? 'dan' : 'dnem';\n        } else if (number === 2) {\n          result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';\n        } else {\n          result += withoutSuffix || isFuture ? 'dni' : 'dnevi';\n        }\n\n        return result;\n\n      case 'M':\n        return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';\n\n      case 'MM':\n        if (number === 1) {\n          result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';\n        } else if (number === 2) {\n          result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';\n        } else if (number < 5) {\n          result += withoutSuffix || isFuture ? 'mesece' : 'meseci';\n        } else {\n          result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';\n        }\n\n        return result;\n\n      case 'y':\n        return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';\n\n      case 'yy':\n        if (number === 1) {\n          result += withoutSuffix || isFuture ? 'leto' : 'letom';\n        } else if (number === 2) {\n          result += withoutSuffix || isFuture ? 'leti' : 'letoma';\n        } else if (number < 5) {\n          result += withoutSuffix || isFuture ? 'leta' : 'leti';\n        } else {\n          result += withoutSuffix || isFuture ? 'let' : 'leti';\n        }\n\n        return result;\n    }\n  }\n\n  var sl = moment.defineLocale('sl', {\n    months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),\n    weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),\n    weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD. MM. YYYY',\n      LL: 'D. MMMM YYYY',\n      LLL: 'D. MMMM YYYY H:mm',\n      LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n      sameDay: '[danes ob] LT',\n      nextDay: '[jutri ob] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[v] [nedeljo] [ob] LT';\n\n          case 3:\n            return '[v] [sredo] [ob] LT';\n\n          case 6:\n            return '[v] [soboto] [ob] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[v] dddd [ob] LT';\n        }\n      },\n      lastDay: '[včeraj ob] LT',\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[prejšnjo] [nedeljo] [ob] LT';\n\n          case 3:\n            return '[prejšnjo] [sredo] [ob] LT';\n\n          case 6:\n            return '[prejšnjo] [soboto] [ob] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[prejšnji] dddd [ob] LT';\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'čez %s',\n      past: 'pred %s',\n      s: processRelativeTime,\n      ss: processRelativeTime,\n      m: processRelativeTime,\n      mm: processRelativeTime,\n      h: processRelativeTime,\n      hh: processRelativeTime,\n      d: processRelativeTime,\n      dd: processRelativeTime,\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return sl;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sl.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sq.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/sq.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Albanian [sq]\n//! author : Flakërim Ismani : https://github.com/flakerimi\n//! author : Menelion Elensúle : https://github.com/Oire\n//! author : Oerd Cukalla : https://github.com/oerd\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var sq = moment.defineLocale('sq', {\n    months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),\n    monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),\n    weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),\n    weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),\n    weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),\n    weekdaysParseExact: true,\n    meridiemParse: /PD|MD/,\n    isPM: function isPM(input) {\n      return input.charAt(0) === 'M';\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      return hours < 12 ? 'PD' : 'MD';\n    },\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Sot në] LT',\n      nextDay: '[Nesër në] LT',\n      nextWeek: 'dddd [në] LT',\n      lastDay: '[Dje në] LT',\n      lastWeek: 'dddd [e kaluar në] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'në %s',\n      past: '%s më parë',\n      s: 'disa sekonda',\n      ss: '%d sekonda',\n      m: 'një minutë',\n      mm: '%d minuta',\n      h: 'një orë',\n      hh: '%d orë',\n      d: 'një ditë',\n      dd: '%d ditë',\n      M: 'një muaj',\n      MM: '%d muaj',\n      y: 'një vit',\n      yy: '%d vite'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return sq;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sq.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sr-cyrl.js":
/*!***********************************************!*\
  !*** ./node_modules/moment/locale/sr-cyrl.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Serbian Cyrillic [sr-cyrl]\n//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j\n//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var translator = {\n    words: {\n      //Different grammatical cases\n      ss: ['секунда', 'секунде', 'секунди'],\n      m: ['један минут', 'једног минута'],\n      mm: ['минут', 'минута', 'минута'],\n      h: ['један сат', 'једног сата'],\n      hh: ['сат', 'сата', 'сати'],\n      d: ['један дан', 'једног дана'],\n      dd: ['дан', 'дана', 'дана'],\n      M: ['један месец', 'једног месеца'],\n      MM: ['месец', 'месеца', 'месеци'],\n      y: ['једну годину', 'једне године'],\n      yy: ['годину', 'године', 'година']\n    },\n    correctGrammaticalCase: function correctGrammaticalCase(number, wordKey) {\n      if (number % 10 >= 1 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)) {\n        return number % 10 === 1 ? wordKey[0] : wordKey[1];\n      }\n\n      return wordKey[2];\n    },\n    translate: function translate(number, withoutSuffix, key, isFuture) {\n      var wordKey = translator.words[key],\n          word;\n\n      if (key.length === 1) {\n        // Nominativ\n        if (key === 'y' && withoutSuffix) return 'једна година';\n        return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n      }\n\n      word = translator.correctGrammaticalCase(number, wordKey); // Nominativ\n\n      if (key === 'yy' && withoutSuffix && word === 'годину') {\n        return number + ' година';\n      }\n\n      return number + ' ' + word;\n    }\n  };\n  var srCyrl = moment.defineLocale('sr-cyrl', {\n    months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),\n    monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),\n    weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),\n    weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'D. M. YYYY.',\n      LL: 'D. MMMM YYYY.',\n      LLL: 'D. MMMM YYYY. H:mm',\n      LLLL: 'dddd, D. MMMM YYYY. H:mm'\n    },\n    calendar: {\n      sameDay: '[данас у] LT',\n      nextDay: '[сутра у] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[у] [недељу] [у] LT';\n\n          case 3:\n            return '[у] [среду] [у] LT';\n\n          case 6:\n            return '[у] [суботу] [у] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[у] dddd [у] LT';\n        }\n      },\n      lastDay: '[јуче у] LT',\n      lastWeek: function lastWeek() {\n        var lastWeekDays = ['[прошле] [недеље] [у] LT', '[прошлог] [понедељка] [у] LT', '[прошлог] [уторка] [у] LT', '[прошле] [среде] [у] LT', '[прошлог] [четвртка] [у] LT', '[прошлог] [петка] [у] LT', '[прошле] [суботе] [у] LT'];\n        return lastWeekDays[this.day()];\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'за %s',\n      past: 'пре %s',\n      s: 'неколико секунди',\n      ss: translator.translate,\n      m: translator.translate,\n      mm: translator.translate,\n      h: translator.translate,\n      hh: translator.translate,\n      d: translator.translate,\n      dd: translator.translate,\n      M: translator.translate,\n      MM: translator.translate,\n      y: translator.translate,\n      yy: translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 1st is the first week of the year.\n\n    }\n  });\n  return srCyrl;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sr-cyrl.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sr.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/sr.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Serbian [sr]\n//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j\n//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var translator = {\n    words: {\n      //Different grammatical cases\n      ss: ['sekunda', 'sekunde', 'sekundi'],\n      m: ['jedan minut', 'jednog minuta'],\n      mm: ['minut', 'minuta', 'minuta'],\n      h: ['jedan sat', 'jednog sata'],\n      hh: ['sat', 'sata', 'sati'],\n      d: ['jedan dan', 'jednog dana'],\n      dd: ['dan', 'dana', 'dana'],\n      M: ['jedan mesec', 'jednog meseca'],\n      MM: ['mesec', 'meseca', 'meseci'],\n      y: ['jednu godinu', 'jedne godine'],\n      yy: ['godinu', 'godine', 'godina']\n    },\n    correctGrammaticalCase: function correctGrammaticalCase(number, wordKey) {\n      if (number % 10 >= 1 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)) {\n        return number % 10 === 1 ? wordKey[0] : wordKey[1];\n      }\n\n      return wordKey[2];\n    },\n    translate: function translate(number, withoutSuffix, key, isFuture) {\n      var wordKey = translator.words[key],\n          word;\n\n      if (key.length === 1) {\n        // Nominativ\n        if (key === 'y' && withoutSuffix) return 'jedna godina';\n        return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n      }\n\n      word = translator.correctGrammaticalCase(number, wordKey); // Nominativ\n\n      if (key === 'yy' && withoutSuffix && word === 'godinu') {\n        return number + ' godina';\n      }\n\n      return number + ' ' + word;\n    }\n  };\n  var sr = moment.defineLocale('sr', {\n    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'D. M. YYYY.',\n      LL: 'D. MMMM YYYY.',\n      LLL: 'D. MMMM YYYY. H:mm',\n      LLLL: 'dddd, D. MMMM YYYY. H:mm'\n    },\n    calendar: {\n      sameDay: '[danas u] LT',\n      nextDay: '[sutra u] LT',\n      nextWeek: function nextWeek() {\n        switch (this.day()) {\n          case 0:\n            return '[u] [nedelju] [u] LT';\n\n          case 3:\n            return '[u] [sredu] [u] LT';\n\n          case 6:\n            return '[u] [subotu] [u] LT';\n\n          case 1:\n          case 2:\n          case 4:\n          case 5:\n            return '[u] dddd [u] LT';\n        }\n      },\n      lastDay: '[juče u] LT',\n      lastWeek: function lastWeek() {\n        var lastWeekDays = ['[prošle] [nedelje] [u] LT', '[prošlog] [ponedeljka] [u] LT', '[prošlog] [utorka] [u] LT', '[prošle] [srede] [u] LT', '[prošlog] [četvrtka] [u] LT', '[prošlog] [petka] [u] LT', '[prošle] [subote] [u] LT'];\n        return lastWeekDays[this.day()];\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'za %s',\n      past: 'pre %s',\n      s: 'nekoliko sekundi',\n      ss: translator.translate,\n      m: translator.translate,\n      mm: translator.translate,\n      h: translator.translate,\n      hh: translator.translate,\n      d: translator.translate,\n      dd: translator.translate,\n      M: translator.translate,\n      MM: translator.translate,\n      y: translator.translate,\n      yy: translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return sr;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sr.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ss.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ss.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : siSwati [ss]\n//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ss = moment.defineLocale('ss', {\n    months: \"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni\".split('_'),\n    monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),\n    weekdays: 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),\n    weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),\n    weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY h:mm A',\n      LLLL: 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: '[Namuhla nga] LT',\n      nextDay: '[Kusasa nga] LT',\n      nextWeek: 'dddd [nga] LT',\n      lastDay: '[Itolo nga] LT',\n      lastWeek: 'dddd [leliphelile] [nga] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'nga %s',\n      past: 'wenteka nga %s',\n      s: 'emizuzwana lomcane',\n      ss: '%d mzuzwana',\n      m: 'umzuzu',\n      mm: '%d emizuzu',\n      h: 'lihora',\n      hh: '%d emahora',\n      d: 'lilanga',\n      dd: '%d emalanga',\n      M: 'inyanga',\n      MM: '%d tinyanga',\n      y: 'umnyaka',\n      yy: '%d iminyaka'\n    },\n    meridiemParse: /ekuseni|emini|entsambama|ebusuku/,\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 11) {\n        return 'ekuseni';\n      } else if (hours < 15) {\n        return 'emini';\n      } else if (hours < 19) {\n        return 'entsambama';\n      } else {\n        return 'ebusuku';\n      }\n    },\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'ekuseni') {\n        return hour;\n      } else if (meridiem === 'emini') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {\n        if (hour === 0) {\n          return 0;\n        }\n\n        return hour + 12;\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal: '%d',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return ss;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ss.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sv.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/sv.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Swedish [sv]\n//! author : Jens Alm : https://github.com/ulmus\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var sv = moment.defineLocale('sv', {\n    months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),\n    monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n    weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),\n    weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),\n    weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY-MM-DD',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY [kl.] HH:mm',\n      LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',\n      lll: 'D MMM YYYY HH:mm',\n      llll: 'ddd D MMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Idag] LT',\n      nextDay: '[Imorgon] LT',\n      lastDay: '[Igår] LT',\n      nextWeek: '[På] dddd LT',\n      lastWeek: '[I] dddd[s] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'om %s',\n      past: 'för %s sedan',\n      s: 'några sekunder',\n      ss: '%d sekunder',\n      m: 'en minut',\n      mm: '%d minuter',\n      h: 'en timme',\n      hh: '%d timmar',\n      d: 'en dag',\n      dd: '%d dagar',\n      M: 'en månad',\n      MM: '%d månader',\n      y: 'ett år',\n      yy: '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(\\:e|\\:a)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? ':e' : b === 1 ? ':a' : b === 2 ? ':a' : b === 3 ? ':e' : ':e';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return sv;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sv.js?");

/***/ }),

/***/ "./node_modules/moment/locale/sw.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/sw.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Swahili [sw]\n//! author : Fahad Kassim : https://github.com/fadsel\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var sw = moment.defineLocale('sw', {\n    months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),\n    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),\n    weekdays: 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),\n    weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),\n    weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'hh:mm A',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[leo saa] LT',\n      nextDay: '[kesho saa] LT',\n      nextWeek: '[wiki ijayo] dddd [saat] LT',\n      lastDay: '[jana] LT',\n      lastWeek: '[wiki iliyopita] dddd [saat] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s baadaye',\n      past: 'tokea %s',\n      s: 'hivi punde',\n      ss: 'sekunde %d',\n      m: 'dakika moja',\n      mm: 'dakika %d',\n      h: 'saa limoja',\n      hh: 'masaa %d',\n      d: 'siku moja',\n      dd: 'siku %d',\n      M: 'mwezi mmoja',\n      MM: 'miezi %d',\n      y: 'mwaka mmoja',\n      yy: 'miaka %d'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return sw;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/sw.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ta.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ta.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Tamil [ta]\n//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var symbolMap = {\n    1: '௧',\n    2: '௨',\n    3: '௩',\n    4: '௪',\n    5: '௫',\n    6: '௬',\n    7: '௭',\n    8: '௮',\n    9: '௯',\n    0: '௦'\n  },\n      numberMap = {\n    '௧': '1',\n    '௨': '2',\n    '௩': '3',\n    '௪': '4',\n    '௫': '5',\n    '௬': '6',\n    '௭': '7',\n    '௮': '8',\n    '௯': '9',\n    '௦': '0'\n  };\n  var ta = moment.defineLocale('ta', {\n    months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),\n    monthsShort: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),\n    weekdays: 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),\n    weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),\n    weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, HH:mm',\n      LLLL: 'dddd, D MMMM YYYY, HH:mm'\n    },\n    calendar: {\n      sameDay: '[இன்று] LT',\n      nextDay: '[நாளை] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[நேற்று] LT',\n      lastWeek: '[கடந்த வாரம்] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s இல்',\n      past: '%s முன்',\n      s: 'ஒரு சில விநாடிகள்',\n      ss: '%d விநாடிகள்',\n      m: 'ஒரு நிமிடம்',\n      mm: '%d நிமிடங்கள்',\n      h: 'ஒரு மணி நேரம்',\n      hh: '%d மணி நேரம்',\n      d: 'ஒரு நாள்',\n      dd: '%d நாட்கள்',\n      M: 'ஒரு மாதம்',\n      MM: '%d மாதங்கள்',\n      y: 'ஒரு வருடம்',\n      yy: '%d ஆண்டுகள்'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}வது/,\n    ordinal: function ordinal(number) {\n      return number + 'வது';\n    },\n    preparse: function preparse(string) {\n      return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {\n        return numberMap[match];\n      });\n    },\n    postformat: function postformat(string) {\n      return string.replace(/\\d/g, function (match) {\n        return symbolMap[match];\n      });\n    },\n    // refer http://ta.wikipedia.org/s/1er1\n    meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 2) {\n        return ' யாமம்';\n      } else if (hour < 6) {\n        return ' வைகறை'; // வைகறை\n      } else if (hour < 10) {\n        return ' காலை'; // காலை\n      } else if (hour < 14) {\n        return ' நண்பகல்'; // நண்பகல்\n      } else if (hour < 18) {\n        return ' எற்பாடு'; // எற்பாடு\n      } else if (hour < 22) {\n        return ' மாலை'; // மாலை\n      } else {\n        return ' யாமம்';\n      }\n    },\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'யாமம்') {\n        return hour < 2 ? hour : hour + 12;\n      } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {\n        return hour;\n      } else if (meridiem === 'நண்பகல்') {\n        return hour >= 10 ? hour : hour + 12;\n      } else {\n        return hour + 12;\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return ta;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ta.js?");

/***/ }),

/***/ "./node_modules/moment/locale/te.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/te.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Telugu [te]\n//! author : Krishna Chaitanya Thota : https://github.com/kcthota\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var te = moment.defineLocale('te', {\n    months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),\n    monthsShort: 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),\n    weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),\n    weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),\n    longDateFormat: {\n      LT: 'A h:mm',\n      LTS: 'A h:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY, A h:mm',\n      LLLL: 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar: {\n      sameDay: '[నేడు] LT',\n      nextDay: '[రేపు] LT',\n      nextWeek: 'dddd, LT',\n      lastDay: '[నిన్న] LT',\n      lastWeek: '[గత] dddd, LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s లో',\n      past: '%s క్రితం',\n      s: 'కొన్ని క్షణాలు',\n      ss: '%d సెకన్లు',\n      m: 'ఒక నిమిషం',\n      mm: '%d నిమిషాలు',\n      h: 'ఒక గంట',\n      hh: '%d గంటలు',\n      d: 'ఒక రోజు',\n      dd: '%d రోజులు',\n      M: 'ఒక నెల',\n      MM: '%d నెలలు',\n      y: 'ఒక సంవత్సరం',\n      yy: '%d సంవత్సరాలు'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}వ/,\n    ordinal: '%dవ',\n    meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'రాత్రి') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'ఉదయం') {\n        return hour;\n      } else if (meridiem === 'మధ్యాహ్నం') {\n        return hour >= 10 ? hour : hour + 12;\n      } else if (meridiem === 'సాయంత్రం') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'రాత్రి';\n      } else if (hour < 10) {\n        return 'ఉదయం';\n      } else if (hour < 17) {\n        return 'మధ్యాహ్నం';\n      } else if (hour < 20) {\n        return 'సాయంత్రం';\n      } else {\n        return 'రాత్రి';\n      }\n    },\n    week: {\n      dow: 0,\n      // Sunday is the first day of the week.\n      doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n    }\n  });\n  return te;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/te.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tet.js":
/*!*******************************************!*\
  !*** ./node_modules/moment/locale/tet.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Tetun Dili (East Timor) [tet]\n//! author : Joshua Brooks : https://github.com/joshbrooks\n//! author : Onorio De J. Afonso : https://github.com/marobo\n//! author : Sonia Simoes : https://github.com/soniasimoes\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var tet = moment.defineLocale('tet', {\n    months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),\n    monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),\n    weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),\n    weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),\n    weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Ohin iha] LT',\n      nextDay: '[Aban iha] LT',\n      nextWeek: 'dddd [iha] LT',\n      lastDay: '[Horiseik iha] LT',\n      lastWeek: 'dddd [semana kotuk] [iha] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'iha %s',\n      past: '%s liuba',\n      s: 'segundu balun',\n      ss: 'segundu %d',\n      m: 'minutu ida',\n      mm: 'minutu %d',\n      h: 'oras ida',\n      hh: 'oras %d',\n      d: 'loron ida',\n      dd: 'loron %d',\n      M: 'fulan ida',\n      MM: 'fulan %d',\n      y: 'tinan ida',\n      yy: 'tinan %d'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return tet;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tet.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tg.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/tg.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Tajik [tg]\n//! author : Orif N. Jr. : https://github.com/orif-jr\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var suffixes = {\n    0: '-ум',\n    1: '-ум',\n    2: '-юм',\n    3: '-юм',\n    4: '-ум',\n    5: '-ум',\n    6: '-ум',\n    7: '-ум',\n    8: '-ум',\n    9: '-ум',\n    10: '-ум',\n    12: '-ум',\n    13: '-ум',\n    20: '-ум',\n    30: '-юм',\n    40: '-ум',\n    50: '-ум',\n    60: '-ум',\n    70: '-ум',\n    80: '-ум',\n    90: '-ум',\n    100: '-ум'\n  };\n  var tg = moment.defineLocale('tg', {\n    months: {\n      format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split('_'),\n      standalone: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_')\n    },\n    monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'),\n    weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),\n    weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Имрӯз соати] LT',\n      nextDay: '[Фардо соати] LT',\n      lastDay: '[Дирӯз соати] LT',\n      nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',\n      lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'баъди %s',\n      past: '%s пеш',\n      s: 'якчанд сония',\n      m: 'як дақиқа',\n      mm: '%d дақиқа',\n      h: 'як соат',\n      hh: '%d соат',\n      d: 'як рӯз',\n      dd: '%d рӯз',\n      M: 'як моҳ',\n      MM: '%d моҳ',\n      y: 'як сол',\n      yy: '%d сол'\n    },\n    meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'шаб') {\n        return hour < 4 ? hour : hour + 12;\n      } else if (meridiem === 'субҳ') {\n        return hour;\n      } else if (meridiem === 'рӯз') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === 'бегоҳ') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'шаб';\n      } else if (hour < 11) {\n        return 'субҳ';\n      } else if (hour < 16) {\n        return 'рӯз';\n      } else if (hour < 19) {\n        return 'бегоҳ';\n      } else {\n        return 'шаб';\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ум|юм)/,\n    ordinal: function ordinal(number) {\n      var a = number % 10,\n          b = number >= 100 ? 100 : null;\n      return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 1th is the first week of the year.\n\n    }\n  });\n  return tg;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tg.js?");

/***/ }),

/***/ "./node_modules/moment/locale/th.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/th.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Thai [th]\n//! author : Kridsada Thanabulpong : https://github.com/sirn\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var th = moment.defineLocale('th', {\n    months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),\n    monthsShort: 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),\n    weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'),\n    // yes, three characters difference\n    weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'H:mm',\n      LTS: 'H:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY เวลา H:mm',\n      LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm'\n    },\n    meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,\n    isPM: function isPM(input) {\n      return input === 'หลังเที่ยง';\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'ก่อนเที่ยง';\n      } else {\n        return 'หลังเที่ยง';\n      }\n    },\n    calendar: {\n      sameDay: '[วันนี้ เวลา] LT',\n      nextDay: '[พรุ่งนี้ เวลา] LT',\n      nextWeek: 'dddd[หน้า เวลา] LT',\n      lastDay: '[เมื่อวานนี้ เวลา] LT',\n      lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'อีก %s',\n      past: '%sที่แล้ว',\n      s: 'ไม่กี่วินาที',\n      ss: '%d วินาที',\n      m: '1 นาที',\n      mm: '%d นาที',\n      h: '1 ชั่วโมง',\n      hh: '%d ชั่วโมง',\n      d: '1 วัน',\n      dd: '%d วัน',\n      w: '1 สัปดาห์',\n      ww: '%d สัปดาห์',\n      M: '1 เดือน',\n      MM: '%d เดือน',\n      y: '1 ปี',\n      yy: '%d ปี'\n    }\n  });\n  return th;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/th.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tk.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/tk.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Turkmen [tk]\n//! author : Atamyrat Abdyrahmanov : https://github.com/atamyratabdy\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var suffixes = {\n    1: \"'inji\",\n    5: \"'inji\",\n    8: \"'inji\",\n    70: \"'inji\",\n    80: \"'inji\",\n    2: \"'nji\",\n    7: \"'nji\",\n    20: \"'nji\",\n    50: \"'nji\",\n    3: \"'ünji\",\n    4: \"'ünji\",\n    100: \"'ünji\",\n    6: \"'njy\",\n    9: \"'unjy\",\n    10: \"'unjy\",\n    30: \"'unjy\",\n    60: \"'ynjy\",\n    90: \"'ynjy\"\n  };\n  var tk = moment.defineLocale('tk', {\n    months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split('_'),\n    monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),\n    weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split('_'),\n    weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),\n    weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[bugün sagat] LT',\n      nextDay: '[ertir sagat] LT',\n      nextWeek: '[indiki] dddd [sagat] LT',\n      lastDay: '[düýn] LT',\n      lastWeek: '[geçen] dddd [sagat] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s soň',\n      past: '%s öň',\n      s: 'birnäçe sekunt',\n      m: 'bir minut',\n      mm: '%d minut',\n      h: 'bir sagat',\n      hh: '%d sagat',\n      d: 'bir gün',\n      dd: '%d gün',\n      M: 'bir aý',\n      MM: '%d aý',\n      y: 'bir ýyl',\n      yy: '%d ýyl'\n    },\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'Do':\n        case 'DD':\n          return number;\n\n        default:\n          if (number === 0) {\n            // special case for zero\n            return number + \"'unjy\";\n          }\n\n          var a = number % 10,\n              b = number % 100 - a,\n              c = number >= 100 ? 100 : null;\n          return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return tk;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tk.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tl-ph.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/tl-ph.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Tagalog (Philippines) [tl-ph]\n//! author : Dan Hagman : https://github.com/hagmandan\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var tlPh = moment.defineLocale('tl-ph', {\n    months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),\n    monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n    weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),\n    weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n    weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'MM/D/YYYY',\n      LL: 'MMMM D, YYYY',\n      LLL: 'MMMM D, YYYY HH:mm',\n      LLLL: 'dddd, MMMM DD, YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: 'LT [ngayong araw]',\n      nextDay: '[Bukas ng] LT',\n      nextWeek: 'LT [sa susunod na] dddd',\n      lastDay: 'LT [kahapon]',\n      lastWeek: 'LT [noong nakaraang] dddd',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'sa loob ng %s',\n      past: '%s ang nakalipas',\n      s: 'ilang segundo',\n      ss: '%d segundo',\n      m: 'isang minuto',\n      mm: '%d minuto',\n      h: 'isang oras',\n      hh: '%d oras',\n      d: 'isang araw',\n      dd: '%d araw',\n      M: 'isang buwan',\n      MM: '%d buwan',\n      y: 'isang taon',\n      yy: '%d taon'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal: function ordinal(number) {\n      return number;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return tlPh;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tl-ph.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tlh.js":
/*!*******************************************!*\
  !*** ./node_modules/moment/locale/tlh.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Klingon [tlh]\n//! author : Dominika Kruk : https://github.com/amaranthrose\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');\n\n  function translateFuture(output) {\n    var time = output;\n    time = output.indexOf('jaj') !== -1 ? time.slice(0, -3) + 'leS' : output.indexOf('jar') !== -1 ? time.slice(0, -3) + 'waQ' : output.indexOf('DIS') !== -1 ? time.slice(0, -3) + 'nem' : time + ' pIq';\n    return time;\n  }\n\n  function translatePast(output) {\n    var time = output;\n    time = output.indexOf('jaj') !== -1 ? time.slice(0, -3) + 'Hu’' : output.indexOf('jar') !== -1 ? time.slice(0, -3) + 'wen' : output.indexOf('DIS') !== -1 ? time.slice(0, -3) + 'ben' : time + ' ret';\n    return time;\n  }\n\n  function translate(number, withoutSuffix, string, isFuture) {\n    var numberNoun = numberAsNoun(number);\n\n    switch (string) {\n      case 'ss':\n        return numberNoun + ' lup';\n\n      case 'mm':\n        return numberNoun + ' tup';\n\n      case 'hh':\n        return numberNoun + ' rep';\n\n      case 'dd':\n        return numberNoun + ' jaj';\n\n      case 'MM':\n        return numberNoun + ' jar';\n\n      case 'yy':\n        return numberNoun + ' DIS';\n    }\n  }\n\n  function numberAsNoun(number) {\n    var hundred = Math.floor(number % 1000 / 100),\n        ten = Math.floor(number % 100 / 10),\n        one = number % 10,\n        word = '';\n\n    if (hundred > 0) {\n      word += numbersNouns[hundred] + 'vatlh';\n    }\n\n    if (ten > 0) {\n      word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';\n    }\n\n    if (one > 0) {\n      word += (word !== '' ? ' ' : '') + numbersNouns[one];\n    }\n\n    return word === '' ? 'pagh' : word;\n  }\n\n  var tlh = moment.defineLocale('tlh', {\n    months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),\n    monthsShort: 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    weekdaysShort: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    weekdaysMin: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[DaHjaj] LT',\n      nextDay: '[wa’leS] LT',\n      nextWeek: 'LLL',\n      lastDay: '[wa’Hu’] LT',\n      lastWeek: 'LLL',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: translateFuture,\n      past: translatePast,\n      s: 'puS lup',\n      ss: translate,\n      m: 'wa’ tup',\n      mm: translate,\n      h: 'wa’ rep',\n      hh: translate,\n      d: 'wa’ jaj',\n      dd: translate,\n      M: 'wa’ jar',\n      MM: translate,\n      y: 'wa’ DIS',\n      yy: translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return tlh;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tlh.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tr.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/tr.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Turkish [tr]\n//! authors : Erhan Gundogan : https://github.com/erhangundogan,\n//!           Burak Yiğit Kaya: https://github.com/BYK\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var suffixes = {\n    1: \"'inci\",\n    5: \"'inci\",\n    8: \"'inci\",\n    70: \"'inci\",\n    80: \"'inci\",\n    2: \"'nci\",\n    7: \"'nci\",\n    20: \"'nci\",\n    50: \"'nci\",\n    3: \"'üncü\",\n    4: \"'üncü\",\n    100: \"'üncü\",\n    6: \"'ncı\",\n    9: \"'uncu\",\n    10: \"'uncu\",\n    30: \"'uncu\",\n    60: \"'ıncı\",\n    90: \"'ıncı\"\n  };\n  var tr = moment.defineLocale('tr', {\n    months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),\n    monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),\n    weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),\n    weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),\n    weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 12) {\n        return isLower ? 'öö' : 'ÖÖ';\n      } else {\n        return isLower ? 'ös' : 'ÖS';\n      }\n    },\n    meridiemParse: /öö|ÖÖ|ös|ÖS/,\n    isPM: function isPM(input) {\n      return input === 'ös' || input === 'ÖS';\n    },\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[bugün saat] LT',\n      nextDay: '[yarın saat] LT',\n      nextWeek: '[gelecek] dddd [saat] LT',\n      lastDay: '[dün] LT',\n      lastWeek: '[geçen] dddd [saat] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s sonra',\n      past: '%s önce',\n      s: 'birkaç saniye',\n      ss: '%d saniye',\n      m: 'bir dakika',\n      mm: '%d dakika',\n      h: 'bir saat',\n      hh: '%d saat',\n      d: 'bir gün',\n      dd: '%d gün',\n      w: 'bir hafta',\n      ww: '%d hafta',\n      M: 'bir ay',\n      MM: '%d ay',\n      y: 'bir yıl',\n      yy: '%d yıl'\n    },\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'Do':\n        case 'DD':\n          return number;\n\n        default:\n          if (number === 0) {\n            // special case for zero\n            return number + \"'ıncı\";\n          }\n\n          var a = number % 10,\n              b = number % 100 - a,\n              c = number >= 100 ? 100 : null;\n          return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return tr;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tr.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tzl.js":
/*!*******************************************!*\
  !*** ./node_modules/moment/locale/tzl.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Talossan [tzl]\n//! author : Robin van der Vliet : https://github.com/robin0van0der0v\n//! author : Iustì Canun\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n  // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.\n  // This is currently too difficult (maybe even impossible) to add.\n\n  var tzl = moment.defineLocale('tzl', {\n    months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),\n    monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),\n    weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),\n    weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),\n    weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),\n    longDateFormat: {\n      LT: 'HH.mm',\n      LTS: 'HH.mm.ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D. MMMM [dallas] YYYY',\n      LLL: 'D. MMMM [dallas] YYYY HH.mm',\n      LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'\n    },\n    meridiemParse: /d\\'o|d\\'a/i,\n    isPM: function isPM(input) {\n      return \"d'o\" === input.toLowerCase();\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours > 11) {\n        return isLower ? \"d'o\" : \"D'O\";\n      } else {\n        return isLower ? \"d'a\" : \"D'A\";\n      }\n    },\n    calendar: {\n      sameDay: '[oxhi à] LT',\n      nextDay: '[demà à] LT',\n      nextWeek: 'dddd [à] LT',\n      lastDay: '[ieiri à] LT',\n      lastWeek: '[sür el] dddd [lasteu à] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'osprei %s',\n      past: 'ja%s',\n      s: processRelativeTime,\n      ss: processRelativeTime,\n      m: processRelativeTime,\n      mm: processRelativeTime,\n      h: processRelativeTime,\n      hh: processRelativeTime,\n      d: processRelativeTime,\n      dd: processRelativeTime,\n      M: processRelativeTime,\n      MM: processRelativeTime,\n      y: processRelativeTime,\n      yy: processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n\n  function processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n      s: ['viensas secunds', \"'iensas secunds\"],\n      ss: [number + ' secunds', '' + number + ' secunds'],\n      m: [\"'n míut\", \"'iens míut\"],\n      mm: [number + ' míuts', '' + number + ' míuts'],\n      h: [\"'n þora\", \"'iensa þora\"],\n      hh: [number + ' þoras', '' + number + ' þoras'],\n      d: [\"'n ziua\", \"'iensa ziua\"],\n      dd: [number + ' ziuas', '' + number + ' ziuas'],\n      M: [\"'n mes\", \"'iens mes\"],\n      MM: [number + ' mesen', '' + number + ' mesen'],\n      y: [\"'n ar\", \"'iens ar\"],\n      yy: [number + ' ars', '' + number + ' ars']\n    };\n    return isFuture ? format[key][0] : withoutSuffix ? format[key][0] : format[key][1];\n  }\n\n  return tzl;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tzl.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tzm-latn.js":
/*!************************************************!*\
  !*** ./node_modules/moment/locale/tzm-latn.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Central Atlas Tamazight Latin [tzm-latn]\n//! author : Abdel Said : https://github.com/abdelsaid\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var tzmLatn = moment.defineLocale('tzm-latn', {\n    months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),\n    monthsShort: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),\n    weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[asdkh g] LT',\n      nextDay: '[aska g] LT',\n      nextWeek: 'dddd [g] LT',\n      lastDay: '[assant g] LT',\n      lastWeek: 'dddd [g] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'dadkh s yan %s',\n      past: 'yan %s',\n      s: 'imik',\n      ss: '%d imik',\n      m: 'minuḍ',\n      mm: '%d minuḍ',\n      h: 'saɛa',\n      hh: '%d tassaɛin',\n      d: 'ass',\n      dd: '%d ossan',\n      M: 'ayowr',\n      MM: '%d iyyirn',\n      y: 'asgas',\n      yy: '%d isgasn'\n    },\n    week: {\n      dow: 6,\n      // Saturday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return tzmLatn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tzm-latn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/tzm.js":
/*!*******************************************!*\
  !*** ./node_modules/moment/locale/tzm.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Central Atlas Tamazight [tzm]\n//! author : Abdel Said : https://github.com/abdelsaid\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var tzm = moment.defineLocale('tzm', {\n    months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),\n    monthsShort: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),\n    weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',\n      nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',\n      nextWeek: 'dddd [ⴴ] LT',\n      lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',\n      lastWeek: 'dddd [ⴴ] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',\n      past: 'ⵢⴰⵏ %s',\n      s: 'ⵉⵎⵉⴽ',\n      ss: '%d ⵉⵎⵉⴽ',\n      m: 'ⵎⵉⵏⵓⴺ',\n      mm: '%d ⵎⵉⵏⵓⴺ',\n      h: 'ⵙⴰⵄⴰ',\n      hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',\n      d: 'ⴰⵙⵙ',\n      dd: '%d oⵙⵙⴰⵏ',\n      M: 'ⴰⵢoⵓⵔ',\n      MM: '%d ⵉⵢⵢⵉⵔⵏ',\n      y: 'ⴰⵙⴳⴰⵙ',\n      yy: '%d ⵉⵙⴳⴰⵙⵏ'\n    },\n    week: {\n      dow: 6,\n      // Saturday is the first day of the week.\n      doy: 12 // The week that contains Jan 12th is the first week of the year.\n\n    }\n  });\n  return tzm;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/tzm.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ug-cn.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/ug-cn.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Uyghur (China) [ug-cn]\n//! author: boyaq : https://github.com/boyaq\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var ugCn = moment.defineLocale('ug-cn', {\n    months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split('_'),\n    monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split('_'),\n    weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split('_'),\n    weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n    weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY-MM-DD',\n      LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',\n      LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n      LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm'\n    },\n    meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === 'يېرىم كېچە' || meridiem === 'سەھەر' || meridiem === 'چۈشتىن بۇرۇن') {\n        return hour;\n      } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {\n        return hour + 12;\n      } else {\n        return hour >= 11 ? hour : hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      var hm = hour * 100 + minute;\n\n      if (hm < 600) {\n        return 'يېرىم كېچە';\n      } else if (hm < 900) {\n        return 'سەھەر';\n      } else if (hm < 1130) {\n        return 'چۈشتىن بۇرۇن';\n      } else if (hm < 1230) {\n        return 'چۈش';\n      } else if (hm < 1800) {\n        return 'چۈشتىن كېيىن';\n      } else {\n        return 'كەچ';\n      }\n    },\n    calendar: {\n      sameDay: '[بۈگۈن سائەت] LT',\n      nextDay: '[ئەتە سائەت] LT',\n      nextWeek: '[كېلەركى] dddd [سائەت] LT',\n      lastDay: '[تۆنۈگۈن] LT',\n      lastWeek: '[ئالدىنقى] dddd [سائەت] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s كېيىن',\n      past: '%s بۇرۇن',\n      s: 'نەچچە سېكونت',\n      ss: '%d سېكونت',\n      m: 'بىر مىنۇت',\n      mm: '%d مىنۇت',\n      h: 'بىر سائەت',\n      hh: '%d سائەت',\n      d: 'بىر كۈن',\n      dd: '%d كۈن',\n      M: 'بىر ئاي',\n      MM: '%d ئاي',\n      y: 'بىر يىل',\n      yy: '%d يىل'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + '-كۈنى';\n\n        case 'w':\n        case 'W':\n          return number + '-ھەپتە';\n\n        default:\n          return number;\n      }\n    },\n    preparse: function preparse(string) {\n      return string.replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/,/g, '،');\n    },\n    week: {\n      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 1st is the first week of the year.\n\n    }\n  });\n  return ugCn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ug-cn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/uk.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/uk.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Ukrainian [uk]\n//! author : zemlanin : https://github.com/zemlanin\n//! Author : Menelion Elensúle : https://github.com/Oire\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  function plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2];\n  }\n\n  function relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n      ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',\n      mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',\n      hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',\n      dd: 'день_дні_днів',\n      MM: 'місяць_місяці_місяців',\n      yy: 'рік_роки_років'\n    };\n\n    if (key === 'm') {\n      return withoutSuffix ? 'хвилина' : 'хвилину';\n    } else if (key === 'h') {\n      return withoutSuffix ? 'година' : 'годину';\n    } else {\n      return number + ' ' + plural(format[key], +number);\n    }\n  }\n\n  function weekdaysCaseReplace(m, format) {\n    var weekdays = {\n      nominative: 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),\n      accusative: 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),\n      genitive: 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')\n    },\n        nounCase;\n\n    if (m === true) {\n      return weekdays['nominative'].slice(1, 7).concat(weekdays['nominative'].slice(0, 1));\n    }\n\n    if (!m) {\n      return weekdays['nominative'];\n    }\n\n    nounCase = /(\\[[ВвУу]\\]) ?dddd/.test(format) ? 'accusative' : /\\[?(?:минулої|наступної)? ?\\] ?dddd/.test(format) ? 'genitive' : 'nominative';\n    return weekdays[nounCase][m.day()];\n  }\n\n  function processHoursFunction(str) {\n    return function () {\n      return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';\n    };\n  }\n\n  var uk = moment.defineLocale('uk', {\n    months: {\n      format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),\n      standalone: 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')\n    },\n    monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),\n    weekdays: weekdaysCaseReplace,\n    weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD.MM.YYYY',\n      LL: 'D MMMM YYYY р.',\n      LLL: 'D MMMM YYYY р., HH:mm',\n      LLLL: 'dddd, D MMMM YYYY р., HH:mm'\n    },\n    calendar: {\n      sameDay: processHoursFunction('[Сьогодні '),\n      nextDay: processHoursFunction('[Завтра '),\n      lastDay: processHoursFunction('[Вчора '),\n      nextWeek: processHoursFunction('[У] dddd ['),\n      lastWeek: function lastWeek() {\n        switch (this.day()) {\n          case 0:\n          case 3:\n          case 5:\n          case 6:\n            return processHoursFunction('[Минулої] dddd [').call(this);\n\n          case 1:\n          case 2:\n          case 4:\n            return processHoursFunction('[Минулого] dddd [').call(this);\n        }\n      },\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'за %s',\n      past: '%s тому',\n      s: 'декілька секунд',\n      ss: relativeTimeWithPlural,\n      m: relativeTimeWithPlural,\n      mm: relativeTimeWithPlural,\n      h: 'годину',\n      hh: relativeTimeWithPlural,\n      d: 'день',\n      dd: relativeTimeWithPlural,\n      M: 'місяць',\n      MM: relativeTimeWithPlural,\n      y: 'рік',\n      yy: relativeTimeWithPlural\n    },\n    // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason\n    meridiemParse: /ночі|ранку|дня|вечора/,\n    isPM: function isPM(input) {\n      return /^(дня|вечора)$/.test(input);\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 4) {\n        return 'ночі';\n      } else if (hour < 12) {\n        return 'ранку';\n      } else if (hour < 17) {\n        return 'дня';\n      } else {\n        return 'вечора';\n      }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(й|го)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'M':\n        case 'd':\n        case 'DDD':\n        case 'w':\n        case 'W':\n          return number + '-й';\n\n        case 'D':\n          return number + '-го';\n\n        default:\n          return number;\n      }\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return uk;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/uk.js?");

/***/ }),

/***/ "./node_modules/moment/locale/ur.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/ur.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Urdu [ur]\n//! author : Sawood Alam : https://github.com/ibnesayeed\n//! author : Zack : https://github.com/ZackVision\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var months = ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n      days = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];\n  var ur = moment.defineLocale('ur', {\n    months: months,\n    monthsShort: months,\n    weekdays: days,\n    weekdaysShort: days,\n    weekdaysMin: days,\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd، D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /صبح|شام/,\n    isPM: function isPM(input) {\n      return 'شام' === input;\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      if (hour < 12) {\n        return 'صبح';\n      }\n\n      return 'شام';\n    },\n    calendar: {\n      sameDay: '[آج بوقت] LT',\n      nextDay: '[کل بوقت] LT',\n      nextWeek: 'dddd [بوقت] LT',\n      lastDay: '[گذشتہ روز بوقت] LT',\n      lastWeek: '[گذشتہ] dddd [بوقت] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s بعد',\n      past: '%s قبل',\n      s: 'چند سیکنڈ',\n      ss: '%d سیکنڈ',\n      m: 'ایک منٹ',\n      mm: '%d منٹ',\n      h: 'ایک گھنٹہ',\n      hh: '%d گھنٹے',\n      d: 'ایک دن',\n      dd: '%d دن',\n      M: 'ایک ماہ',\n      MM: '%d ماہ',\n      y: 'ایک سال',\n      yy: '%d سال'\n    },\n    preparse: function preparse(string) {\n      return string.replace(/،/g, ',');\n    },\n    postformat: function postformat(string) {\n      return string.replace(/,/g, '،');\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return ur;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/ur.js?");

/***/ }),

/***/ "./node_modules/moment/locale/uz-latn.js":
/*!***********************************************!*\
  !*** ./node_modules/moment/locale/uz-latn.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Uzbek Latin [uz-latn]\n//! author : Rasulbek Mirzayev : github.com/Rasulbeeek\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var uzLatn = moment.defineLocale('uz-latn', {\n    months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'),\n    monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),\n    weekdays: 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'),\n    weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),\n    weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'D MMMM YYYY, dddd HH:mm'\n    },\n    calendar: {\n      sameDay: '[Bugun soat] LT [da]',\n      nextDay: '[Ertaga] LT [da]',\n      nextWeek: 'dddd [kuni soat] LT [da]',\n      lastDay: '[Kecha soat] LT [da]',\n      lastWeek: \"[O'tgan] dddd [kuni soat] LT [da]\",\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'Yaqin %s ichida',\n      past: 'Bir necha %s oldin',\n      s: 'soniya',\n      ss: '%d soniya',\n      m: 'bir daqiqa',\n      mm: '%d daqiqa',\n      h: 'bir soat',\n      hh: '%d soat',\n      d: 'bir kun',\n      dd: '%d kun',\n      M: 'bir oy',\n      MM: '%d oy',\n      y: 'bir yil',\n      yy: '%d yil'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 7th is the first week of the year.\n\n    }\n  });\n  return uzLatn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/uz-latn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/uz.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/uz.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Uzbek [uz]\n//! author : Sardor Muminov : https://github.com/muminoff\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var uz = moment.defineLocale('uz', {\n    months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),\n    monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),\n    weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),\n    weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'D MMMM YYYY, dddd HH:mm'\n    },\n    calendar: {\n      sameDay: '[Бугун соат] LT [да]',\n      nextDay: '[Эртага] LT [да]',\n      nextWeek: 'dddd [куни соат] LT [да]',\n      lastDay: '[Кеча соат] LT [да]',\n      lastWeek: '[Утган] dddd [куни соат] LT [да]',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'Якин %s ичида',\n      past: 'Бир неча %s олдин',\n      s: 'фурсат',\n      ss: '%d фурсат',\n      m: 'бир дакика',\n      mm: '%d дакика',\n      h: 'бир соат',\n      hh: '%d соат',\n      d: 'бир кун',\n      dd: '%d кун',\n      M: 'бир ой',\n      MM: '%d ой',\n      y: 'бир йил',\n      yy: '%d йил'\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 7 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return uz;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/uz.js?");

/***/ }),

/***/ "./node_modules/moment/locale/vi.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/vi.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Vietnamese [vi]\n//! author : Bang Nguyen : https://github.com/bangnk\n//! author : Chien Kira : https://github.com/chienkira\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var vi = moment.defineLocale('vi', {\n    months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),\n    monthsShort: 'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),\n    weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n    weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n    weekdaysParseExact: true,\n    meridiemParse: /sa|ch/i,\n    isPM: function isPM(input) {\n      return /^ch$/i.test(input);\n    },\n    meridiem: function meridiem(hours, minutes, isLower) {\n      if (hours < 12) {\n        return isLower ? 'sa' : 'SA';\n      } else {\n        return isLower ? 'ch' : 'CH';\n      }\n    },\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM [năm] YYYY',\n      LLL: 'D MMMM [năm] YYYY HH:mm',\n      LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',\n      l: 'DD/M/YYYY',\n      ll: 'D MMM YYYY',\n      lll: 'D MMM YYYY HH:mm',\n      llll: 'ddd, D MMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[Hôm nay lúc] LT',\n      nextDay: '[Ngày mai lúc] LT',\n      nextWeek: 'dddd [tuần tới lúc] LT',\n      lastDay: '[Hôm qua lúc] LT',\n      lastWeek: 'dddd [tuần trước lúc] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: '%s tới',\n      past: '%s trước',\n      s: 'vài giây',\n      ss: '%d giây',\n      m: 'một phút',\n      mm: '%d phút',\n      h: 'một giờ',\n      hh: '%d giờ',\n      d: 'một ngày',\n      dd: '%d ngày',\n      w: 'một tuần',\n      ww: '%d tuần',\n      M: 'một tháng',\n      MM: '%d tháng',\n      y: 'một năm',\n      yy: '%d năm'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal: function ordinal(number) {\n      return number;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return vi;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/vi.js?");

/***/ }),

/***/ "./node_modules/moment/locale/x-pseudo.js":
/*!************************************************!*\
  !*** ./node_modules/moment/locale/x-pseudo.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Pseudo [x-pseudo]\n//! author : Andrew Hood : https://github.com/andrewhood125\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var xPseudo = moment.defineLocale('x-pseudo', {\n    months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),\n    monthsShort: 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),\n    weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),\n    weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),\n    weekdaysParseExact: true,\n    longDateFormat: {\n      LT: 'HH:mm',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY HH:mm',\n      LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n      sameDay: '[T~ódá~ý át] LT',\n      nextDay: '[T~ómó~rró~w át] LT',\n      nextWeek: 'dddd [át] LT',\n      lastDay: '[Ý~ést~érdá~ý át] LT',\n      lastWeek: '[L~ást] dddd [át] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'í~ñ %s',\n      past: '%s á~gó',\n      s: 'á ~féw ~sécó~ñds',\n      ss: '%d s~écóñ~ds',\n      m: 'á ~míñ~úté',\n      mm: '%d m~íñú~tés',\n      h: 'á~ñ hó~úr',\n      hh: '%d h~óúrs',\n      d: 'á ~dáý',\n      dd: '%d d~áýs',\n      M: 'á ~móñ~th',\n      MM: '%d m~óñt~hs',\n      y: 'á ~ýéár',\n      yy: '%d ý~éárs'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = ~~(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    },\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return xPseudo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/x-pseudo.js?");

/***/ }),

/***/ "./node_modules/moment/locale/yo.js":
/*!******************************************!*\
  !*** ./node_modules/moment/locale/yo.js ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Yoruba Nigeria [yo]\n//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var yo = moment.defineLocale('yo', {\n    months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),\n    monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),\n    weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),\n    weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),\n    weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),\n    longDateFormat: {\n      LT: 'h:mm A',\n      LTS: 'h:mm:ss A',\n      L: 'DD/MM/YYYY',\n      LL: 'D MMMM YYYY',\n      LLL: 'D MMMM YYYY h:mm A',\n      LLLL: 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar: {\n      sameDay: '[Ònì ni] LT',\n      nextDay: '[Ọ̀la ni] LT',\n      nextWeek: \"dddd [Ọsẹ̀ tón'bọ] [ni] LT\",\n      lastDay: '[Àna ni] LT',\n      lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',\n      sameElse: 'L'\n    },\n    relativeTime: {\n      future: 'ní %s',\n      past: '%s kọjá',\n      s: 'ìsẹjú aayá die',\n      ss: 'aayá %d',\n      m: 'ìsẹjú kan',\n      mm: 'ìsẹjú %d',\n      h: 'wákati kan',\n      hh: 'wákati %d',\n      d: 'ọjọ́ kan',\n      dd: 'ọjọ́ %d',\n      M: 'osù kan',\n      MM: 'osù %d',\n      y: 'ọdún kan',\n      yy: 'ọdún %d'\n    },\n    dayOfMonthOrdinalParse: /ọjọ́\\s\\d{1,2}/,\n    ordinal: 'ọjọ́ %d',\n    week: {\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return yo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/yo.js?");

/***/ }),

/***/ "./node_modules/moment/locale/zh-cn.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/zh-cn.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Chinese (China) [zh-cn]\n//! author : suupic : https://github.com/suupic\n//! author : Zeno Zeng : https://github.com/zenozeng\n//! author : uu109 : https://github.com/uu109\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var zhCn = moment.defineLocale('zh-cn', {\n    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),\n    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY/MM/DD',\n      LL: 'YYYY年M月D日',\n      LLL: 'YYYY年M月D日Ah点mm分',\n      LLLL: 'YYYY年M月D日ddddAh点mm分',\n      l: 'YYYY/M/D',\n      ll: 'YYYY年M月D日',\n      lll: 'YYYY年M月D日 HH:mm',\n      llll: 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n        return hour;\n      } else if (meridiem === '下午' || meridiem === '晚上') {\n        return hour + 12;\n      } else {\n        // '中午'\n        return hour >= 11 ? hour : hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      var hm = hour * 100 + minute;\n\n      if (hm < 600) {\n        return '凌晨';\n      } else if (hm < 900) {\n        return '早上';\n      } else if (hm < 1130) {\n        return '上午';\n      } else if (hm < 1230) {\n        return '中午';\n      } else if (hm < 1800) {\n        return '下午';\n      } else {\n        return '晚上';\n      }\n    },\n    calendar: {\n      sameDay: '[今天]LT',\n      nextDay: '[明天]LT',\n      nextWeek: function nextWeek(now) {\n        if (now.week() !== this.week()) {\n          return '[下]dddLT';\n        } else {\n          return '[本]dddLT';\n        }\n      },\n      lastDay: '[昨天]LT',\n      lastWeek: function lastWeek(now) {\n        if (this.week() !== now.week()) {\n          return '[上]dddLT';\n        } else {\n          return '[本]dddLT';\n        }\n      },\n      sameElse: 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|周)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + '日';\n\n        case 'M':\n          return number + '月';\n\n        case 'w':\n        case 'W':\n          return number + '周';\n\n        default:\n          return number;\n      }\n    },\n    relativeTime: {\n      future: '%s后',\n      past: '%s前',\n      s: '几秒',\n      ss: '%d 秒',\n      m: '1 分钟',\n      mm: '%d 分钟',\n      h: '1 小时',\n      hh: '%d 小时',\n      d: '1 天',\n      dd: '%d 天',\n      w: '1 周',\n      ww: '%d 周',\n      M: '1 个月',\n      MM: '%d 个月',\n      y: '1 年',\n      yy: '%d 年'\n    },\n    week: {\n      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n      dow: 1,\n      // Monday is the first day of the week.\n      doy: 4 // The week that contains Jan 4th is the first week of the year.\n\n    }\n  });\n  return zhCn;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/zh-cn.js?");

/***/ }),

/***/ "./node_modules/moment/locale/zh-hk.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/zh-hk.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Chinese (Hong Kong) [zh-hk]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Konstantin : https://github.com/skfd\n//! author : Anthony : https://github.com/anthonylau\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var zhHk = moment.defineLocale('zh-hk', {\n    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY/MM/DD',\n      LL: 'YYYY年M月D日',\n      LLL: 'YYYY年M月D日 HH:mm',\n      LLLL: 'YYYY年M月D日dddd HH:mm',\n      l: 'YYYY/M/D',\n      ll: 'YYYY年M月D日',\n      lll: 'YYYY年M月D日 HH:mm',\n      llll: 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n        return hour;\n      } else if (meridiem === '中午') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === '下午' || meridiem === '晚上') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      var hm = hour * 100 + minute;\n\n      if (hm < 600) {\n        return '凌晨';\n      } else if (hm < 900) {\n        return '早上';\n      } else if (hm < 1200) {\n        return '上午';\n      } else if (hm === 1200) {\n        return '中午';\n      } else if (hm < 1800) {\n        return '下午';\n      } else {\n        return '晚上';\n      }\n    },\n    calendar: {\n      sameDay: '[今天]LT',\n      nextDay: '[明天]LT',\n      nextWeek: '[下]ddddLT',\n      lastDay: '[昨天]LT',\n      lastWeek: '[上]ddddLT',\n      sameElse: 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + '日';\n\n        case 'M':\n          return number + '月';\n\n        case 'w':\n        case 'W':\n          return number + '週';\n\n        default:\n          return number;\n      }\n    },\n    relativeTime: {\n      future: '%s後',\n      past: '%s前',\n      s: '幾秒',\n      ss: '%d 秒',\n      m: '1 分鐘',\n      mm: '%d 分鐘',\n      h: '1 小時',\n      hh: '%d 小時',\n      d: '1 天',\n      dd: '%d 天',\n      M: '1 個月',\n      MM: '%d 個月',\n      y: '1 年',\n      yy: '%d 年'\n    }\n  });\n  return zhHk;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/zh-hk.js?");

/***/ }),

/***/ "./node_modules/moment/locale/zh-mo.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/zh-mo.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Chinese (Macau) [zh-mo]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Tan Yuanhong : https://github.com/le0tan\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var zhMo = moment.defineLocale('zh-mo', {\n    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'DD/MM/YYYY',\n      LL: 'YYYY年M月D日',\n      LLL: 'YYYY年M月D日 HH:mm',\n      LLLL: 'YYYY年M月D日dddd HH:mm',\n      l: 'D/M/YYYY',\n      ll: 'YYYY年M月D日',\n      lll: 'YYYY年M月D日 HH:mm',\n      llll: 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n        return hour;\n      } else if (meridiem === '中午') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === '下午' || meridiem === '晚上') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      var hm = hour * 100 + minute;\n\n      if (hm < 600) {\n        return '凌晨';\n      } else if (hm < 900) {\n        return '早上';\n      } else if (hm < 1130) {\n        return '上午';\n      } else if (hm < 1230) {\n        return '中午';\n      } else if (hm < 1800) {\n        return '下午';\n      } else {\n        return '晚上';\n      }\n    },\n    calendar: {\n      sameDay: '[今天] LT',\n      nextDay: '[明天] LT',\n      nextWeek: '[下]dddd LT',\n      lastDay: '[昨天] LT',\n      lastWeek: '[上]dddd LT',\n      sameElse: 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + '日';\n\n        case 'M':\n          return number + '月';\n\n        case 'w':\n        case 'W':\n          return number + '週';\n\n        default:\n          return number;\n      }\n    },\n    relativeTime: {\n      future: '%s內',\n      past: '%s前',\n      s: '幾秒',\n      ss: '%d 秒',\n      m: '1 分鐘',\n      mm: '%d 分鐘',\n      h: '1 小時',\n      hh: '%d 小時',\n      d: '1 天',\n      dd: '%d 天',\n      M: '1 個月',\n      MM: '%d 個月',\n      y: '1 年',\n      yy: '%d 年'\n    }\n  });\n  return zhMo;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/zh-mo.js?");

/***/ }),

/***/ "./node_modules/moment/locale/zh-tw.js":
/*!*********************************************!*\
  !*** ./node_modules/moment/locale/zh-tw.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js locale configuration\n//! locale : Chinese (Taiwan) [zh-tw]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' && \"function\" === 'function' ? factory(__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")) :  true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../moment */ \"./node_modules/moment/moment.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function (moment) {\n  'use strict'; //! moment.js locale configuration\n\n  var zhTw = moment.defineLocale('zh-tw', {\n    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat: {\n      LT: 'HH:mm',\n      LTS: 'HH:mm:ss',\n      L: 'YYYY/MM/DD',\n      LL: 'YYYY年M月D日',\n      LLL: 'YYYY年M月D日 HH:mm',\n      LLLL: 'YYYY年M月D日dddd HH:mm',\n      l: 'YYYY/M/D',\n      ll: 'YYYY年M月D日',\n      lll: 'YYYY年M月D日 HH:mm',\n      llll: 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour: function meridiemHour(hour, meridiem) {\n      if (hour === 12) {\n        hour = 0;\n      }\n\n      if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n        return hour;\n      } else if (meridiem === '中午') {\n        return hour >= 11 ? hour : hour + 12;\n      } else if (meridiem === '下午' || meridiem === '晚上') {\n        return hour + 12;\n      }\n    },\n    meridiem: function meridiem(hour, minute, isLower) {\n      var hm = hour * 100 + minute;\n\n      if (hm < 600) {\n        return '凌晨';\n      } else if (hm < 900) {\n        return '早上';\n      } else if (hm < 1130) {\n        return '上午';\n      } else if (hm < 1230) {\n        return '中午';\n      } else if (hm < 1800) {\n        return '下午';\n      } else {\n        return '晚上';\n      }\n    },\n    calendar: {\n      sameDay: '[今天] LT',\n      nextDay: '[明天] LT',\n      nextWeek: '[下]dddd LT',\n      lastDay: '[昨天] LT',\n      lastWeek: '[上]dddd LT',\n      sameElse: 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n    ordinal: function ordinal(number, period) {\n      switch (period) {\n        case 'd':\n        case 'D':\n        case 'DDD':\n          return number + '日';\n\n        case 'M':\n          return number + '月';\n\n        case 'w':\n        case 'W':\n          return number + '週';\n\n        default:\n          return number;\n      }\n    },\n    relativeTime: {\n      future: '%s後',\n      past: '%s前',\n      s: '幾秒',\n      ss: '%d 秒',\n      m: '1 分鐘',\n      mm: '%d 分鐘',\n      h: '1 小時',\n      hh: '%d 小時',\n      d: '1 天',\n      dd: '%d 天',\n      M: '1 個月',\n      MM: '%d 個月',\n      y: '1 年',\n      yy: '%d 年'\n    }\n  });\n  return zhTw;\n});\n\n//# sourceURL=webpack://rup/./node_modules/moment/locale/zh-tw.js?");

/***/ }),

/***/ "./node_modules/moment/moment.js":
/*!***************************************!*\
  !*** ./node_modules/moment/moment.js ***!
  \***************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n//! moment.js\n//! version : 2.29.4\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n;\n\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;\n})(this, function () {\n  'use strict';\n\n  var hookCallback;\n\n  function hooks() {\n    return hookCallback.apply(null, arguments);\n  } // This is done to register the method called with moment()\n  // without creating circular dependencies.\n\n\n  function setHookCallback(callback) {\n    hookCallback = callback;\n  }\n\n  function isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n  }\n\n  function isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n  }\n\n  function hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n  }\n\n  function isObjectEmpty(obj) {\n    if (Object.getOwnPropertyNames) {\n      return Object.getOwnPropertyNames(obj).length === 0;\n    } else {\n      var k;\n\n      for (k in obj) {\n        if (hasOwnProp(obj, k)) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  }\n\n  function isUndefined(input) {\n    return input === void 0;\n  }\n\n  function isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n  }\n\n  function isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n  }\n\n  function map(arr, fn) {\n    var res = [],\n        i,\n        arrLen = arr.length;\n\n    for (i = 0; i < arrLen; ++i) {\n      res.push(fn(arr[i], i));\n    }\n\n    return res;\n  }\n\n  function extend(a, b) {\n    for (var i in b) {\n      if (hasOwnProp(b, i)) {\n        a[i] = b[i];\n      }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n      a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n      a.valueOf = b.valueOf;\n    }\n\n    return a;\n  }\n\n  function createUTC(input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n  }\n\n  function defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n      empty: false,\n      unusedTokens: [],\n      unusedInput: [],\n      overflow: -2,\n      charsLeftOver: 0,\n      nullInput: false,\n      invalidEra: null,\n      invalidMonth: null,\n      invalidFormat: false,\n      userInvalidated: false,\n      iso: false,\n      parsedDateParts: [],\n      era: null,\n      meridiem: null,\n      rfc2822: false,\n      weekdayMismatch: false\n    };\n  }\n\n  function getParsingFlags(m) {\n    if (m._pf == null) {\n      m._pf = defaultParsingFlags();\n    }\n\n    return m._pf;\n  }\n\n  var some;\n\n  if (Array.prototype.some) {\n    some = Array.prototype.some;\n  } else {\n    some = function some(fun) {\n      var t = Object(this),\n          len = t.length >>> 0,\n          i;\n\n      for (i = 0; i < len; i++) {\n        if (i in t && fun.call(this, t[i], i, t)) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n  }\n\n  function isValid(m) {\n    if (m._isValid == null) {\n      var flags = getParsingFlags(m),\n          parsedParts = some.call(flags.parsedDateParts, function (i) {\n        return i != null;\n      }),\n          isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || flags.meridiem && parsedParts);\n\n      if (m._strict) {\n        isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined;\n      }\n\n      if (Object.isFrozen == null || !Object.isFrozen(m)) {\n        m._isValid = isNowValid;\n      } else {\n        return isNowValid;\n      }\n    }\n\n    return m._isValid;\n  }\n\n  function createInvalid(flags) {\n    var m = createUTC(NaN);\n\n    if (flags != null) {\n      extend(getParsingFlags(m), flags);\n    } else {\n      getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n  } // Plugins that add properties should also add the key here (null value),\n  // so we can properly clone ourselves.\n\n\n  var momentProperties = hooks.momentProperties = [],\n      updateInProgress = false;\n\n  function copyConfig(to, from) {\n    var i,\n        prop,\n        val,\n        momentPropertiesLen = momentProperties.length;\n\n    if (!isUndefined(from._isAMomentObject)) {\n      to._isAMomentObject = from._isAMomentObject;\n    }\n\n    if (!isUndefined(from._i)) {\n      to._i = from._i;\n    }\n\n    if (!isUndefined(from._f)) {\n      to._f = from._f;\n    }\n\n    if (!isUndefined(from._l)) {\n      to._l = from._l;\n    }\n\n    if (!isUndefined(from._strict)) {\n      to._strict = from._strict;\n    }\n\n    if (!isUndefined(from._tzm)) {\n      to._tzm = from._tzm;\n    }\n\n    if (!isUndefined(from._isUTC)) {\n      to._isUTC = from._isUTC;\n    }\n\n    if (!isUndefined(from._offset)) {\n      to._offset = from._offset;\n    }\n\n    if (!isUndefined(from._pf)) {\n      to._pf = getParsingFlags(from);\n    }\n\n    if (!isUndefined(from._locale)) {\n      to._locale = from._locale;\n    }\n\n    if (momentPropertiesLen > 0) {\n      for (i = 0; i < momentPropertiesLen; i++) {\n        prop = momentProperties[i];\n        val = from[prop];\n\n        if (!isUndefined(val)) {\n          to[prop] = val;\n        }\n      }\n    }\n\n    return to;\n  } // Moment prototype object\n\n\n  function Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n\n    if (!this.isValid()) {\n      this._d = new Date(NaN);\n    } // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n\n\n    if (updateInProgress === false) {\n      updateInProgress = true;\n      hooks.updateOffset(this);\n      updateInProgress = false;\n    }\n  }\n\n  function isMoment(obj) {\n    return obj instanceof Moment || obj != null && obj._isAMomentObject != null;\n  }\n\n  function warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) {\n      console.warn('Deprecation warning: ' + msg);\n    }\n  }\n\n  function deprecate(msg, fn) {\n    var firstTime = true;\n    return extend(function () {\n      if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(null, msg);\n      }\n\n      if (firstTime) {\n        var args = [],\n            arg,\n            i,\n            key,\n            argLen = arguments.length;\n\n        for (i = 0; i < argLen; i++) {\n          arg = '';\n\n          if (_typeof(arguments[i]) === 'object') {\n            arg += '\\n[' + i + '] ';\n\n            for (key in arguments[0]) {\n              if (hasOwnProp(arguments[0], key)) {\n                arg += key + ': ' + arguments[0][key] + ', ';\n              }\n            }\n\n            arg = arg.slice(0, -2); // Remove trailing comma and space\n          } else {\n            arg = arguments[i];\n          }\n\n          args.push(arg);\n        }\n\n        warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + new Error().stack);\n        firstTime = false;\n      }\n\n      return fn.apply(this, arguments);\n    }, fn);\n  }\n\n  var deprecations = {};\n\n  function deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n      hooks.deprecationHandler(name, msg);\n    }\n\n    if (!deprecations[name]) {\n      warn(msg);\n      deprecations[name] = true;\n    }\n  }\n\n  hooks.suppressDeprecationWarnings = false;\n  hooks.deprecationHandler = null;\n\n  function isFunction(input) {\n    return typeof Function !== 'undefined' && input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n  }\n\n  function set(config) {\n    var prop, i;\n\n    for (i in config) {\n      if (hasOwnProp(config, i)) {\n        prop = config[i];\n\n        if (isFunction(prop)) {\n          this[i] = prop;\n        } else {\n          this['_' + i] = prop;\n        }\n      }\n    }\n\n    this._config = config; // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n\n    this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + /\\d{1,2}/.source);\n  }\n\n  function mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig),\n        prop;\n\n    for (prop in childConfig) {\n      if (hasOwnProp(childConfig, prop)) {\n        if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n          res[prop] = {};\n          extend(res[prop], parentConfig[prop]);\n          extend(res[prop], childConfig[prop]);\n        } else if (childConfig[prop] != null) {\n          res[prop] = childConfig[prop];\n        } else {\n          delete res[prop];\n        }\n      }\n    }\n\n    for (prop in parentConfig) {\n      if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop])) {\n        // make sure changes to properties don't modify parent config\n        res[prop] = extend({}, res[prop]);\n      }\n    }\n\n    return res;\n  }\n\n  function Locale(config) {\n    if (config != null) {\n      this.set(config);\n    }\n  }\n\n  var keys;\n\n  if (Object.keys) {\n    keys = Object.keys;\n  } else {\n    keys = function keys(obj) {\n      var i,\n          res = [];\n\n      for (i in obj) {\n        if (hasOwnProp(obj, i)) {\n          res.push(i);\n        }\n      }\n\n      return res;\n    };\n  }\n\n  var defaultCalendar = {\n    sameDay: '[Today at] LT',\n    nextDay: '[Tomorrow at] LT',\n    nextWeek: 'dddd [at] LT',\n    lastDay: '[Yesterday at] LT',\n    lastWeek: '[Last] dddd [at] LT',\n    sameElse: 'L'\n  };\n\n  function calendar(key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n  }\n\n  function zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? forceSign ? '+' : '' : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n  }\n\n  var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n      localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n      formatFunctions = {},\n      formatTokenFunctions = {}; // token:    'M'\n  // padded:   ['MM', 2]\n  // ordinal:  'Mo'\n  // callback: function () { this.month() + 1 }\n\n  function addFormatToken(token, padded, ordinal, callback) {\n    var func = callback;\n\n    if (typeof callback === 'string') {\n      func = function func() {\n        return this[callback]();\n      };\n    }\n\n    if (token) {\n      formatTokenFunctions[token] = func;\n    }\n\n    if (padded) {\n      formatTokenFunctions[padded[0]] = function () {\n        return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n      };\n    }\n\n    if (ordinal) {\n      formatTokenFunctions[ordinal] = function () {\n        return this.localeData().ordinal(func.apply(this, arguments), token);\n      };\n    }\n  }\n\n  function removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n      return input.replace(/^\\[|\\]$/g, '');\n    }\n\n    return input.replace(/\\\\/g, '');\n  }\n\n  function makeFormatFunction(format) {\n    var array = format.match(formattingTokens),\n        i,\n        length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n      if (formatTokenFunctions[array[i]]) {\n        array[i] = formatTokenFunctions[array[i]];\n      } else {\n        array[i] = removeFormattingTokens(array[i]);\n      }\n    }\n\n    return function (mom) {\n      var output = '',\n          i;\n\n      for (i = 0; i < length; i++) {\n        output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n      }\n\n      return output;\n    };\n  } // format date using native date object\n\n\n  function formatMoment(m, format) {\n    if (!m.isValid()) {\n      return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n    return formatFunctions[format](m);\n  }\n\n  function expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n      return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n\n    while (i >= 0 && localFormattingTokens.test(format)) {\n      format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n      localFormattingTokens.lastIndex = 0;\n      i -= 1;\n    }\n\n    return format;\n  }\n\n  var defaultLongDateFormat = {\n    LTS: 'h:mm:ss A',\n    LT: 'h:mm A',\n    L: 'MM/DD/YYYY',\n    LL: 'MMMM D, YYYY',\n    LLL: 'MMMM D, YYYY h:mm A',\n    LLLL: 'dddd, MMMM D, YYYY h:mm A'\n  };\n\n  function longDateFormat(key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n      return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.match(formattingTokens).map(function (tok) {\n      if (tok === 'MMMM' || tok === 'MM' || tok === 'DD' || tok === 'dddd') {\n        return tok.slice(1);\n      }\n\n      return tok;\n    }).join('');\n    return this._longDateFormat[key];\n  }\n\n  var defaultInvalidDate = 'Invalid date';\n\n  function invalidDate() {\n    return this._invalidDate;\n  }\n\n  var defaultOrdinal = '%d',\n      defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n  function ordinal(number) {\n    return this._ordinal.replace('%d', number);\n  }\n\n  var defaultRelativeTime = {\n    future: 'in %s',\n    past: '%s ago',\n    s: 'a few seconds',\n    ss: '%d seconds',\n    m: 'a minute',\n    mm: '%d minutes',\n    h: 'an hour',\n    hh: '%d hours',\n    d: 'a day',\n    dd: '%d days',\n    w: 'a week',\n    ww: '%d weeks',\n    M: 'a month',\n    MM: '%d months',\n    y: 'a year',\n    yy: '%d years'\n  };\n\n  function relativeTime(number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number);\n  }\n\n  function pastFuture(diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n  }\n\n  var aliases = {};\n\n  function addUnitAlias(unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n  }\n\n  function normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n  }\n\n  function normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n      if (hasOwnProp(inputObject, prop)) {\n        normalizedProp = normalizeUnits(prop);\n\n        if (normalizedProp) {\n          normalizedInput[normalizedProp] = inputObject[prop];\n        }\n      }\n    }\n\n    return normalizedInput;\n  }\n\n  var priorities = {};\n\n  function addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n  }\n\n  function getPrioritizedUnits(unitsObj) {\n    var units = [],\n        u;\n\n    for (u in unitsObj) {\n      if (hasOwnProp(unitsObj, u)) {\n        units.push({\n          unit: u,\n          priority: priorities[u]\n        });\n      }\n    }\n\n    units.sort(function (a, b) {\n      return a.priority - b.priority;\n    });\n    return units;\n  }\n\n  function isLeapYear(year) {\n    return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n  }\n\n  function absFloor(number) {\n    if (number < 0) {\n      // -0 -> 0\n      return Math.ceil(number) || 0;\n    } else {\n      return Math.floor(number);\n    }\n  }\n\n  function toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n      value = absFloor(coercedNumber);\n    }\n\n    return value;\n  }\n\n  function makeGetSet(unit, keepTime) {\n    return function (value) {\n      if (value != null) {\n        set$1(this, unit, value);\n        hooks.updateOffset(this, keepTime);\n        return this;\n      } else {\n        return get(this, unit);\n      }\n    };\n  }\n\n  function get(mom, unit) {\n    return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n  }\n\n  function set$1(mom, unit, value) {\n    if (mom.isValid() && !isNaN(value)) {\n      if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n        value = toInt(value);\n\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n      } else {\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n      }\n    }\n  } // MOMENTS\n\n\n  function stringGet(units) {\n    units = normalizeUnits(units);\n\n    if (isFunction(this[units])) {\n      return this[units]();\n    }\n\n    return this;\n  }\n\n  function stringSet(units, value) {\n    if (_typeof(units) === 'object') {\n      units = normalizeObjectUnits(units);\n      var prioritized = getPrioritizedUnits(units),\n          i,\n          prioritizedLen = prioritized.length;\n\n      for (i = 0; i < prioritizedLen; i++) {\n        this[prioritized[i].unit](units[prioritized[i].unit]);\n      }\n    } else {\n      units = normalizeUnits(units);\n\n      if (isFunction(this[units])) {\n        return this[units](value);\n      }\n    }\n\n    return this;\n  }\n\n  var match1 = /\\d/,\n      //       0 - 9\n  match2 = /\\d\\d/,\n      //      00 - 99\n  match3 = /\\d{3}/,\n      //     000 - 999\n  match4 = /\\d{4}/,\n      //    0000 - 9999\n  match6 = /[+-]?\\d{6}/,\n      // -999999 - 999999\n  match1to2 = /\\d\\d?/,\n      //       0 - 99\n  match3to4 = /\\d\\d\\d\\d?/,\n      //     999 - 9999\n  match5to6 = /\\d\\d\\d\\d\\d\\d?/,\n      //   99999 - 999999\n  match1to3 = /\\d{1,3}/,\n      //       0 - 999\n  match1to4 = /\\d{1,4}/,\n      //       0 - 9999\n  match1to6 = /[+-]?\\d{1,6}/,\n      // -999999 - 999999\n  matchUnsigned = /\\d+/,\n      //       0 - inf\n  matchSigned = /[+-]?\\d+/,\n      //    -inf - inf\n  matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi,\n      // +00:00 -00:00 +0000 -0000 or Z\n  matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi,\n      // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n  matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/,\n      // 123456789 123456789.123\n  // any word (or two) characters or numbers including two/three word month in arabic.\n  // includes scottish gaelic two word and hyphenated months\n  matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n      regexes;\n  regexes = {};\n\n  function addRegexToken(token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n      return isStrict && strictRegex ? strictRegex : regex;\n    };\n  }\n\n  function getParseRegexForToken(token, config) {\n    if (!hasOwnProp(regexes, token)) {\n      return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n  } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n\n\n  function unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n      return p1 || p2 || p3 || p4;\n    }));\n  }\n\n  function regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n  }\n\n  var tokens = {};\n\n  function addParseToken(token, callback) {\n    var i,\n        func = callback,\n        tokenLen;\n\n    if (typeof token === 'string') {\n      token = [token];\n    }\n\n    if (isNumber(callback)) {\n      func = function func(input, array) {\n        array[callback] = toInt(input);\n      };\n    }\n\n    tokenLen = token.length;\n\n    for (i = 0; i < tokenLen; i++) {\n      tokens[token[i]] = func;\n    }\n  }\n\n  function addWeekParseToken(token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n      config._w = config._w || {};\n      callback(input, config._w, config, token);\n    });\n  }\n\n  function addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n      tokens[token](input, config._a, config, token);\n    }\n  }\n\n  var YEAR = 0,\n      MONTH = 1,\n      DATE = 2,\n      HOUR = 3,\n      MINUTE = 4,\n      SECOND = 5,\n      MILLISECOND = 6,\n      WEEK = 7,\n      WEEKDAY = 8;\n\n  function mod(n, x) {\n    return (n % x + x) % x;\n  }\n\n  var indexOf;\n\n  if (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n  } else {\n    indexOf = function indexOf(o) {\n      // I know\n      var i;\n\n      for (i = 0; i < this.length; ++i) {\n        if (this[i] === o) {\n          return i;\n        }\n      }\n\n      return -1;\n    };\n  }\n\n  function daysInMonth(year, month) {\n    if (isNaN(year) || isNaN(month)) {\n      return NaN;\n    }\n\n    var modMonth = mod(month, 12);\n    year += (month - modMonth) / 12;\n    return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - modMonth % 7 % 2;\n  } // FORMATTING\n\n\n  addFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n  });\n  addFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n  });\n  addFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n  }); // ALIASES\n\n  addUnitAlias('month', 'M'); // PRIORITY\n\n  addUnitPriority('month', 8); // PARSING\n\n  addRegexToken('M', match1to2);\n  addRegexToken('MM', match1to2, match2);\n  addRegexToken('MMM', function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n  });\n  addRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n  });\n  addParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n  });\n  addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid.\n\n\n    if (month != null) {\n      array[MONTH] = month;\n    } else {\n      getParsingFlags(config).invalidMonth = input;\n    }\n  }); // LOCALES\n\n  var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n      defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n      MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n      defaultMonthsShortRegex = matchWord,\n      defaultMonthsRegex = matchWord;\n\n  function localeMonths(m, format) {\n    if (!m) {\n      return isArray(this._months) ? this._months : this._months['standalone'];\n    }\n\n    return isArray(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n  }\n\n  function localeMonthsShort(m, format) {\n    if (!m) {\n      return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone'];\n    }\n\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n  }\n\n  function handleStrictParse(monthName, format, strict) {\n    var i,\n        ii,\n        mom,\n        llc = monthName.toLocaleLowerCase();\n\n    if (!this._monthsParse) {\n      // this is not used\n      this._monthsParse = [];\n      this._longMonthsParse = [];\n      this._shortMonthsParse = [];\n\n      for (i = 0; i < 12; ++i) {\n        mom = createUTC([2000, i]);\n        this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n        this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n      }\n    }\n\n    if (strict) {\n      if (format === 'MMM') {\n        ii = indexOf.call(this._shortMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._longMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    } else {\n      if (format === 'MMM') {\n        ii = indexOf.call(this._shortMonthsParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._longMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._longMonthsParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._shortMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    }\n  }\n\n  function localeMonthsParse(monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n      return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n      this._monthsParse = [];\n      this._longMonthsParse = [];\n      this._shortMonthsParse = [];\n    } // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n\n\n    for (i = 0; i < 12; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, i]);\n\n      if (strict && !this._longMonthsParse[i]) {\n        this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n        this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n      }\n\n      if (!strict && !this._monthsParse[i]) {\n        regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n        this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n      } // test the regex\n\n\n      if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n        return i;\n      } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n        return i;\n      } else if (!strict && this._monthsParse[i].test(monthName)) {\n        return i;\n      }\n    }\n  } // MOMENTS\n\n\n  function setMonth(mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n      // No op\n      return mom;\n    }\n\n    if (typeof value === 'string') {\n      if (/^\\d+$/.test(value)) {\n        value = toInt(value);\n      } else {\n        value = mom.localeData().monthsParse(value); // TODO: Another silent failure?\n\n        if (!isNumber(value)) {\n          return mom;\n        }\n      }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n\n    return mom;\n  }\n\n  function getSetMonth(value) {\n    if (value != null) {\n      setMonth(this, value);\n      hooks.updateOffset(this, true);\n      return this;\n    } else {\n      return get(this, 'Month');\n    }\n  }\n\n  function getDaysInMonth() {\n    return daysInMonth(this.year(), this.month());\n  }\n\n  function monthsShortRegex(isStrict) {\n    if (this._monthsParseExact) {\n      if (!hasOwnProp(this, '_monthsRegex')) {\n        computeMonthsParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._monthsShortStrictRegex;\n      } else {\n        return this._monthsShortRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_monthsShortRegex')) {\n        this._monthsShortRegex = defaultMonthsShortRegex;\n      }\n\n      return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n  }\n\n  function monthsRegex(isStrict) {\n    if (this._monthsParseExact) {\n      if (!hasOwnProp(this, '_monthsRegex')) {\n        computeMonthsParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._monthsStrictRegex;\n      } else {\n        return this._monthsRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_monthsRegex')) {\n        this._monthsRegex = defaultMonthsRegex;\n      }\n\n      return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex;\n    }\n  }\n\n  function computeMonthsParse() {\n    function cmpLenRev(a, b) {\n      return b.length - a.length;\n    }\n\n    var shortPieces = [],\n        longPieces = [],\n        mixedPieces = [],\n        i,\n        mom;\n\n    for (i = 0; i < 12; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, i]);\n      shortPieces.push(this.monthsShort(mom, ''));\n      longPieces.push(this.months(mom, ''));\n      mixedPieces.push(this.months(mom, ''));\n      mixedPieces.push(this.monthsShort(mom, ''));\n    } // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n\n\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n\n    for (i = 0; i < 12; i++) {\n      shortPieces[i] = regexEscape(shortPieces[i]);\n      longPieces[i] = regexEscape(longPieces[i]);\n    }\n\n    for (i = 0; i < 24; i++) {\n      mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n  } // FORMATTING\n\n\n  addFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n  });\n  addFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n  });\n  addFormatToken(0, ['YYYY', 4], 0, 'year');\n  addFormatToken(0, ['YYYYY', 5], 0, 'year');\n  addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES\n\n  addUnitAlias('year', 'y'); // PRIORITIES\n\n  addUnitPriority('year', 1); // PARSING\n\n  addRegexToken('Y', matchSigned);\n  addRegexToken('YY', match1to2, match2);\n  addRegexToken('YYYY', match1to4, match4);\n  addRegexToken('YYYYY', match1to6, match6);\n  addRegexToken('YYYYYY', match1to6, match6);\n  addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n  addParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n  });\n  addParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n  });\n  addParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n  }); // HELPERS\n\n  function daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n  } // HOOKS\n\n\n  hooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n  }; // MOMENTS\n\n\n  var getSetYear = makeGetSet('FullYear', true);\n\n  function getIsLeapYear() {\n    return isLeapYear(this.year());\n  }\n\n  function createDate(y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date; // the date constructor remaps years 0-99 to 1900-1999\n\n    if (y < 100 && y >= 0) {\n      // preserve leap years using a full 400 year cycle, then reset\n      date = new Date(y + 400, m, d, h, M, s, ms);\n\n      if (isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n      }\n    } else {\n      date = new Date(y, m, d, h, M, s, ms);\n    }\n\n    return date;\n  }\n\n  function createUTCDate(y) {\n    var date, args; // the Date.UTC function remaps years 0-99 to 1900-1999\n\n    if (y < 100 && y >= 0) {\n      args = Array.prototype.slice.call(arguments); // preserve leap years using a full 400 year cycle, then reset\n\n      args[0] = y + 400;\n      date = new Date(Date.UTC.apply(null, args));\n\n      if (isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n      }\n    } else {\n      date = new Date(Date.UTC.apply(null, arguments));\n    }\n\n    return date;\n  } // start-of-first-week - start-of-year\n\n\n  function firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n    fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n    fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n    return -fwdlw + fwd - 1;\n  } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n\n\n  function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear,\n        resDayOfYear;\n\n    if (dayOfYear <= 0) {\n      resYear = year - 1;\n      resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n      resYear = year + 1;\n      resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n      resYear = year;\n      resDayOfYear = dayOfYear;\n    }\n\n    return {\n      year: resYear,\n      dayOfYear: resDayOfYear\n    };\n  }\n\n  function weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek,\n        resYear;\n\n    if (week < 1) {\n      resYear = mom.year() - 1;\n      resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n      resWeek = week - weeksInYear(mom.year(), dow, doy);\n      resYear = mom.year() + 1;\n    } else {\n      resYear = mom.year();\n      resWeek = week;\n    }\n\n    return {\n      week: resWeek,\n      year: resYear\n    };\n  }\n\n  function weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n  } // FORMATTING\n\n\n  addFormatToken('w', ['ww', 2], 'wo', 'week');\n  addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES\n\n  addUnitAlias('week', 'w');\n  addUnitAlias('isoWeek', 'W'); // PRIORITIES\n\n  addUnitPriority('week', 5);\n  addUnitPriority('isoWeek', 5); // PARSING\n\n  addRegexToken('w', match1to2);\n  addRegexToken('ww', match1to2, match2);\n  addRegexToken('W', match1to2);\n  addRegexToken('WW', match1to2, match2);\n  addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n  }); // HELPERS\n  // LOCALES\n\n  function localeWeek(mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n  }\n\n  var defaultLocaleWeek = {\n    dow: 0,\n    // Sunday is the first day of the week.\n    doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n  };\n\n  function localeFirstDayOfWeek() {\n    return this._week.dow;\n  }\n\n  function localeFirstDayOfYear() {\n    return this._week.doy;\n  } // MOMENTS\n\n\n  function getSetWeek(input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n  }\n\n  function getSetISOWeek(input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n  } // FORMATTING\n\n\n  addFormatToken('d', 0, 'do', 'day');\n  addFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n  });\n  addFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n  });\n  addFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n  });\n  addFormatToken('e', 0, 0, 'weekday');\n  addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES\n\n  addUnitAlias('day', 'd');\n  addUnitAlias('weekday', 'e');\n  addUnitAlias('isoWeekday', 'E'); // PRIORITY\n\n  addUnitPriority('day', 11);\n  addUnitPriority('weekday', 11);\n  addUnitPriority('isoWeekday', 11); // PARSING\n\n  addRegexToken('d', match1to2);\n  addRegexToken('e', match1to2);\n  addRegexToken('E', match1to2);\n  addRegexToken('dd', function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n  });\n  addRegexToken('ddd', function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n  });\n  addRegexToken('dddd', function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n  });\n  addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid\n\n\n    if (weekday != null) {\n      week.d = weekday;\n    } else {\n      getParsingFlags(config).invalidWeekday = input;\n    }\n  });\n  addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n  }); // HELPERS\n\n  function parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n      return input;\n    }\n\n    if (!isNaN(input)) {\n      return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n\n    if (typeof input === 'number') {\n      return input;\n    }\n\n    return null;\n  }\n\n  function parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n      return locale.weekdaysParse(input) % 7 || 7;\n    }\n\n    return isNaN(input) ? null : input;\n  } // LOCALES\n\n\n  function shiftWeekdays(ws, n) {\n    return ws.slice(n, 7).concat(ws.slice(0, n));\n  }\n\n  var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n      defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n      defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n      defaultWeekdaysRegex = matchWord,\n      defaultWeekdaysShortRegex = matchWord,\n      defaultWeekdaysMinRegex = matchWord;\n\n  function localeWeekdays(m, format) {\n    var weekdays = isArray(this._weekdays) ? this._weekdays : this._weekdays[m && m !== true && this._weekdays.isFormat.test(format) ? 'format' : 'standalone'];\n    return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays;\n  }\n\n  function localeWeekdaysShort(m) {\n    return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n  }\n\n  function localeWeekdaysMin(m) {\n    return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n  }\n\n  function handleStrictParse$1(weekdayName, format, strict) {\n    var i,\n        ii,\n        mom,\n        llc = weekdayName.toLocaleLowerCase();\n\n    if (!this._weekdaysParse) {\n      this._weekdaysParse = [];\n      this._shortWeekdaysParse = [];\n      this._minWeekdaysParse = [];\n\n      for (i = 0; i < 7; ++i) {\n        mom = createUTC([2000, 1]).day(i);\n        this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n        this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n        this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n      }\n    }\n\n    if (strict) {\n      if (format === 'dddd') {\n        ii = indexOf.call(this._weekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else if (format === 'ddd') {\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    } else {\n      if (format === 'dddd') {\n        ii = indexOf.call(this._weekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else if (format === 'ddd') {\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._weekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._weekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    }\n  }\n\n  function localeWeekdaysParse(weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n      return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n      this._weekdaysParse = [];\n      this._minWeekdaysParse = [];\n      this._shortWeekdaysParse = [];\n      this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, 1]).day(i);\n\n      if (strict && !this._fullWeekdaysParse[i]) {\n        this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$', 'i');\n        this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$', 'i');\n        this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$', 'i');\n      }\n\n      if (!this._weekdaysParse[i]) {\n        regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n        this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n      } // test the regex\n\n\n      if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n        return i;\n      } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n        return i;\n      } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n        return i;\n      } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n        return i;\n      }\n    }\n  } // MOMENTS\n\n\n  function getSetDayOfWeek(input) {\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    }\n\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n\n    if (input != null) {\n      input = parseWeekday(input, this.localeData());\n      return this.add(input - day, 'd');\n    } else {\n      return day;\n    }\n  }\n\n  function getSetLocaleDayOfWeek(input) {\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    }\n\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n  }\n\n  function getSetISODayOfWeek(input) {\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    } // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n\n    if (input != null) {\n      var weekday = parseIsoWeekday(input, this.localeData());\n      return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n      return this.day() || 7;\n    }\n  }\n\n  function weekdaysRegex(isStrict) {\n    if (this._weekdaysParseExact) {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        computeWeekdaysParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._weekdaysStrictRegex;\n      } else {\n        return this._weekdaysRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        this._weekdaysRegex = defaultWeekdaysRegex;\n      }\n\n      return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n  }\n\n  function weekdaysShortRegex(isStrict) {\n    if (this._weekdaysParseExact) {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        computeWeekdaysParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._weekdaysShortStrictRegex;\n      } else {\n        return this._weekdaysShortRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n        this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n      }\n\n      return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n  }\n\n  function weekdaysMinRegex(isStrict) {\n    if (this._weekdaysParseExact) {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        computeWeekdaysParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._weekdaysMinStrictRegex;\n      } else {\n        return this._weekdaysMinRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n        this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n      }\n\n      return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n  }\n\n  function computeWeekdaysParse() {\n    function cmpLenRev(a, b) {\n      return b.length - a.length;\n    }\n\n    var minPieces = [],\n        shortPieces = [],\n        longPieces = [],\n        mixedPieces = [],\n        i,\n        mom,\n        minp,\n        shortp,\n        longp;\n\n    for (i = 0; i < 7; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, 1]).day(i);\n      minp = regexEscape(this.weekdaysMin(mom, ''));\n      shortp = regexEscape(this.weekdaysShort(mom, ''));\n      longp = regexEscape(this.weekdays(mom, ''));\n      minPieces.push(minp);\n      shortPieces.push(shortp);\n      longPieces.push(longp);\n      mixedPieces.push(minp);\n      mixedPieces.push(shortp);\n      mixedPieces.push(longp);\n    } // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n\n\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n  } // FORMATTING\n\n\n  function hFormat() {\n    return this.hours() % 12 || 12;\n  }\n\n  function kFormat() {\n    return this.hours() || 24;\n  }\n\n  addFormatToken('H', ['HH', 2], 0, 'hour');\n  addFormatToken('h', ['hh', 2], 0, hFormat);\n  addFormatToken('k', ['kk', 2], 0, kFormat);\n  addFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n  });\n  addFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);\n  });\n  addFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n  });\n  addFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);\n  });\n\n  function meridiem(token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n      return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n  }\n\n  meridiem('a', true);\n  meridiem('A', false); // ALIASES\n\n  addUnitAlias('hour', 'h'); // PRIORITY\n\n  addUnitPriority('hour', 13); // PARSING\n\n  function matchMeridiem(isStrict, locale) {\n    return locale._meridiemParse;\n  }\n\n  addRegexToken('a', matchMeridiem);\n  addRegexToken('A', matchMeridiem);\n  addRegexToken('H', match1to2);\n  addRegexToken('h', match1to2);\n  addRegexToken('k', match1to2);\n  addRegexToken('HH', match1to2, match2);\n  addRegexToken('hh', match1to2, match2);\n  addRegexToken('kk', match1to2, match2);\n  addRegexToken('hmm', match3to4);\n  addRegexToken('hmmss', match5to6);\n  addRegexToken('Hmm', match3to4);\n  addRegexToken('Hmmss', match5to6);\n  addParseToken(['H', 'HH'], HOUR);\n  addParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n  });\n  addParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n  });\n  addParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n  });\n  addParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n  });\n  addParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4,\n        pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n  });\n  addParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n  });\n  addParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4,\n        pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n  }); // LOCALES\n\n  function localeIsPM(input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return (input + '').toLowerCase().charAt(0) === 'p';\n  }\n\n  var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n      // Setting the hour should keep the time, because the user explicitly\n  // specified which hour they want. So trying to maintain the same hour (in\n  // a new timezone) makes sense. Adding/subtracting hours does not follow\n  // this rule.\n  getSetHour = makeGetSet('Hours', true);\n\n  function localeMeridiem(hours, minutes, isLower) {\n    if (hours > 11) {\n      return isLower ? 'pm' : 'PM';\n    } else {\n      return isLower ? 'am' : 'AM';\n    }\n  }\n\n  var baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n    week: defaultLocaleWeek,\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n    meridiemParse: defaultLocaleMeridiemParse\n  }; // internal storage for locale config files\n\n  var locales = {},\n      localeFamilies = {},\n      globalLocale;\n\n  function commonPrefix(arr1, arr2) {\n    var i,\n        minl = Math.min(arr1.length, arr2.length);\n\n    for (i = 0; i < minl; i += 1) {\n      if (arr1[i] !== arr2[i]) {\n        return i;\n      }\n    }\n\n    return minl;\n  }\n\n  function normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n  } // pick the locale from the array\n  // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n  // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n\n\n  function chooseLocale(names) {\n    var i = 0,\n        j,\n        next,\n        locale,\n        split;\n\n    while (i < names.length) {\n      split = normalizeLocale(names[i]).split('-');\n      j = split.length;\n      next = normalizeLocale(names[i + 1]);\n      next = next ? next.split('-') : null;\n\n      while (j > 0) {\n        locale = loadLocale(split.slice(0, j).join('-'));\n\n        if (locale) {\n          return locale;\n        }\n\n        if (next && next.length >= j && commonPrefix(split, next) >= j - 1) {\n          //the next array item is better than a shallower substring of this one\n          break;\n        }\n\n        j--;\n      }\n\n      i++;\n    }\n\n    return globalLocale;\n  }\n\n  function isLocaleNameSane(name) {\n    // Prevent names that look like filesystem paths, i.e contain '/' or '\\'\n    return name.match('^[^/\\\\\\\\]*$') != null;\n  }\n\n  function loadLocale(name) {\n    var oldLocale = null,\n        aliasedRequire; // TODO: Find a better way to register and load all the locales in Node\n\n    if (locales[name] === undefined && typeof module !== 'undefined' && module && module.exports && isLocaleNameSane(name)) {\n      try {\n        oldLocale = globalLocale._abbr;\n        aliasedRequire = require;\n        __webpack_require__(\"./node_modules/moment/locale sync recursive ^\\\\.\\\\/.*$\")(\"./\" + name);\n        getSetGlobalLocale(oldLocale);\n      } catch (e) {\n        // mark as not found to avoid repeating expensive file require call causing high CPU\n        // when trying to find en-US, en_US, en-us for every format call\n        locales[name] = null; // null means not found\n      }\n    }\n\n    return locales[name];\n  } // This function will load locale and then set the global locale.  If\n  // no arguments are passed in, it will simply return the current global\n  // locale key.\n\n\n  function getSetGlobalLocale(key, values) {\n    var data;\n\n    if (key) {\n      if (isUndefined(values)) {\n        data = getLocale(key);\n      } else {\n        data = defineLocale(key, values);\n      }\n\n      if (data) {\n        // moment.duration._locale = moment._locale = data;\n        globalLocale = data;\n      } else {\n        if (typeof console !== 'undefined' && console.warn) {\n          //warn user if arguments are passed but the locale could not be set\n          console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n        }\n      }\n    }\n\n    return globalLocale._abbr;\n  }\n\n  function defineLocale(name, config) {\n    if (config !== null) {\n      var locale,\n          parentConfig = baseConfig;\n      config.abbr = name;\n\n      if (locales[name] != null) {\n        deprecateSimple('defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n        parentConfig = locales[name]._config;\n      } else if (config.parentLocale != null) {\n        if (locales[config.parentLocale] != null) {\n          parentConfig = locales[config.parentLocale]._config;\n        } else {\n          locale = loadLocale(config.parentLocale);\n\n          if (locale != null) {\n            parentConfig = locale._config;\n          } else {\n            if (!localeFamilies[config.parentLocale]) {\n              localeFamilies[config.parentLocale] = [];\n            }\n\n            localeFamilies[config.parentLocale].push({\n              name: name,\n              config: config\n            });\n            return null;\n          }\n        }\n      }\n\n      locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n      if (localeFamilies[name]) {\n        localeFamilies[name].forEach(function (x) {\n          defineLocale(x.name, x.config);\n        });\n      } // backwards compat for now: also set the locale\n      // make sure we set the locale AFTER all child locales have been\n      // created, so we won't end up with the child locale set.\n\n\n      getSetGlobalLocale(name);\n      return locales[name];\n    } else {\n      // useful for testing\n      delete locales[name];\n      return null;\n    }\n  }\n\n  function updateLocale(name, config) {\n    if (config != null) {\n      var locale,\n          tmpLocale,\n          parentConfig = baseConfig;\n\n      if (locales[name] != null && locales[name].parentLocale != null) {\n        // Update existing child locale in-place to avoid memory-leaks\n        locales[name].set(mergeConfigs(locales[name]._config, config));\n      } else {\n        // MERGE\n        tmpLocale = loadLocale(name);\n\n        if (tmpLocale != null) {\n          parentConfig = tmpLocale._config;\n        }\n\n        config = mergeConfigs(parentConfig, config);\n\n        if (tmpLocale == null) {\n          // updateLocale is called for creating a new locale\n          // Set abbr so it will have a name (getters return\n          // undefined otherwise).\n          config.abbr = name;\n        }\n\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n      } // backwards compat for now: also set the locale\n\n\n      getSetGlobalLocale(name);\n    } else {\n      // pass null for config to unupdate, useful for tests\n      if (locales[name] != null) {\n        if (locales[name].parentLocale != null) {\n          locales[name] = locales[name].parentLocale;\n\n          if (name === getSetGlobalLocale()) {\n            getSetGlobalLocale(name);\n          }\n        } else if (locales[name] != null) {\n          delete locales[name];\n        }\n      }\n    }\n\n    return locales[name];\n  } // returns locale data\n\n\n  function getLocale(key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n      key = key._locale._abbr;\n    }\n\n    if (!key) {\n      return globalLocale;\n    }\n\n    if (!isArray(key)) {\n      //short-circuit everything else\n      locale = loadLocale(key);\n\n      if (locale) {\n        return locale;\n      }\n\n      key = [key];\n    }\n\n    return chooseLocale(key);\n  }\n\n  function listLocales() {\n    return keys(locales);\n  }\n\n  function checkOverflow(m) {\n    var overflow,\n        a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n      overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1;\n\n      if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n        overflow = DATE;\n      }\n\n      if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n        overflow = WEEK;\n      }\n\n      if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n        overflow = WEEKDAY;\n      }\n\n      getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n  } // iso 8601 regex\n  // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n\n\n  var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n      basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n      tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n      isoDates = [['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/], ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/], ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/], ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false], ['YYYY-DDD', /\\d{4}-\\d{3}/], ['YYYY-MM', /\\d{4}-\\d\\d/, false], ['YYYYYYMMDD', /[+-]\\d{10}/], ['YYYYMMDD', /\\d{8}/], ['GGGG[W]WWE', /\\d{4}W\\d{3}/], ['GGGG[W]WW', /\\d{4}W\\d{2}/, false], ['YYYYDDD', /\\d{7}/], ['YYYYMM', /\\d{6}/, false], ['YYYY', /\\d{4}/, false]],\n      // iso time formats and regexes\n  isoTimes = [['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/], ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/], ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/], ['HH:mm', /\\d\\d:\\d\\d/], ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/], ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/], ['HHmmss', /\\d\\d\\d\\d\\d\\d/], ['HHmm', /\\d\\d\\d\\d/], ['HH', /\\d\\d/]],\n      aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n      // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n  rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n      obsOffsets = {\n    UT: 0,\n    GMT: 0,\n    EDT: -4 * 60,\n    EST: -5 * 60,\n    CDT: -5 * 60,\n    CST: -6 * 60,\n    MDT: -6 * 60,\n    MST: -7 * 60,\n    PDT: -7 * 60,\n    PST: -8 * 60\n  }; // date from iso format\n\n  function configFromISO(config) {\n    var i,\n        l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime,\n        dateFormat,\n        timeFormat,\n        tzFormat,\n        isoDatesLen = isoDates.length,\n        isoTimesLen = isoTimes.length;\n\n    if (match) {\n      getParsingFlags(config).iso = true;\n\n      for (i = 0, l = isoDatesLen; i < l; i++) {\n        if (isoDates[i][1].exec(match[1])) {\n          dateFormat = isoDates[i][0];\n          allowTime = isoDates[i][2] !== false;\n          break;\n        }\n      }\n\n      if (dateFormat == null) {\n        config._isValid = false;\n        return;\n      }\n\n      if (match[3]) {\n        for (i = 0, l = isoTimesLen; i < l; i++) {\n          if (isoTimes[i][1].exec(match[3])) {\n            // match[2] should be 'T' or space\n            timeFormat = (match[2] || ' ') + isoTimes[i][0];\n            break;\n          }\n        }\n\n        if (timeFormat == null) {\n          config._isValid = false;\n          return;\n        }\n      }\n\n      if (!allowTime && timeFormat != null) {\n        config._isValid = false;\n        return;\n      }\n\n      if (match[4]) {\n        if (tzRegex.exec(match[4])) {\n          tzFormat = 'Z';\n        } else {\n          config._isValid = false;\n          return;\n        }\n      }\n\n      config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n      configFromStringAndFormat(config);\n    } else {\n      config._isValid = false;\n    }\n  }\n\n  function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n    var result = [untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10)];\n\n    if (secondStr) {\n      result.push(parseInt(secondStr, 10));\n    }\n\n    return result;\n  }\n\n  function untruncateYear(yearStr) {\n    var year = parseInt(yearStr, 10);\n\n    if (year <= 49) {\n      return 2000 + year;\n    } else if (year <= 999) {\n      return 1900 + year;\n    }\n\n    return year;\n  }\n\n  function preprocessRFC2822(s) {\n    // Remove comments and folding whitespace and replace multiple-spaces with a single space\n    return s.replace(/\\([^()]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n  }\n\n  function checkWeekday(weekdayStr, parsedInput, config) {\n    if (weekdayStr) {\n      // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n      var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n          weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n\n      if (weekdayProvided !== weekdayActual) {\n        getParsingFlags(config).weekdayMismatch = true;\n        config._isValid = false;\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  function calculateOffset(obsOffset, militaryOffset, numOffset) {\n    if (obsOffset) {\n      return obsOffsets[obsOffset];\n    } else if (militaryOffset) {\n      // the only allowed military tz is Z\n      return 0;\n    } else {\n      var hm = parseInt(numOffset, 10),\n          m = hm % 100,\n          h = (hm - m) / 100;\n      return h * 60 + m;\n    }\n  } // date and time from ref 2822 format\n\n\n  function configFromRFC2822(config) {\n    var match = rfc2822.exec(preprocessRFC2822(config._i)),\n        parsedArray;\n\n    if (match) {\n      parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n\n      if (!checkWeekday(match[1], parsedArray, config)) {\n        return;\n      }\n\n      config._a = parsedArray;\n      config._tzm = calculateOffset(match[8], match[9], match[10]);\n      config._d = createUTCDate.apply(null, config._a);\n\n      config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n      getParsingFlags(config).rfc2822 = true;\n    } else {\n      config._isValid = false;\n    }\n  } // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n\n\n  function configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n      config._d = new Date(+matched[1]);\n      return;\n    }\n\n    configFromISO(config);\n\n    if (config._isValid === false) {\n      delete config._isValid;\n    } else {\n      return;\n    }\n\n    configFromRFC2822(config);\n\n    if (config._isValid === false) {\n      delete config._isValid;\n    } else {\n      return;\n    }\n\n    if (config._strict) {\n      config._isValid = false;\n    } else {\n      // Final attempt, use Input Fallback\n      hooks.createFromInputFallback(config);\n    }\n  }\n\n  hooks.createFromInputFallback = deprecate('value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) {\n    config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n  }); // Pick the first defined of two or three arguments.\n\n  function defaults(a, b, c) {\n    if (a != null) {\n      return a;\n    }\n\n    if (b != null) {\n      return b;\n    }\n\n    return c;\n  }\n\n  function currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n\n    if (config._useUTC) {\n      return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n  } // convert an array to a date.\n  // the array should mirror the parameters below\n  // note: all values past the year are optional and will default to the lowest possible value.\n  // [year, month, day , hour, minute, second, millisecond]\n\n\n  function configFromArray(config) {\n    var i,\n        date,\n        input = [],\n        currentDate,\n        expectedWeekday,\n        yearToUse;\n\n    if (config._d) {\n      return;\n    }\n\n    currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays\n\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n      dayOfYearFromWeekInfo(config);\n    } //if the day of the year is set, figure out what it is\n\n\n    if (config._dayOfYear != null) {\n      yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n      if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n        getParsingFlags(config)._overflowDayOfYear = true;\n      }\n\n      date = createUTCDate(yearToUse, 0, config._dayOfYear);\n      config._a[MONTH] = date.getUTCMonth();\n      config._a[DATE] = date.getUTCDate();\n    } // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n\n\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n      config._a[i] = input[i] = currentDate[i];\n    } // Zero out whatever was not defaulted, including time\n\n\n    for (; i < 7; i++) {\n      config._a[i] = input[i] = config._a[i] == null ? i === 2 ? 1 : 0 : config._a[i];\n    } // Check for 24:00:00.000\n\n\n    if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) {\n      config._nextDay = true;\n      config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n\n    if (config._tzm != null) {\n      config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n      config._a[HOUR] = 24;\n    } // check for mismatching day of week\n\n\n    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n      getParsingFlags(config).weekdayMismatch = true;\n    }\n  }\n\n  function dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n    w = config._w;\n\n    if (w.GG != null || w.W != null || w.E != null) {\n      dow = 1;\n      doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on\n      // how we interpret now (local, utc, fixed offset). So create\n      // a now version of current config (take local/utc/offset flags, and\n      // create now).\n\n      weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n      week = defaults(w.W, 1);\n      weekday = defaults(w.E, 1);\n\n      if (weekday < 1 || weekday > 7) {\n        weekdayOverflow = true;\n      }\n    } else {\n      dow = config._locale._week.dow;\n      doy = config._locale._week.doy;\n      curWeek = weekOfYear(createLocal(), dow, doy);\n      weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week.\n\n      week = defaults(w.w, curWeek.week);\n\n      if (w.d != null) {\n        // weekday -- low day numbers are considered next week\n        weekday = w.d;\n\n        if (weekday < 0 || weekday > 6) {\n          weekdayOverflow = true;\n        }\n      } else if (w.e != null) {\n        // local weekday -- counting starts from beginning of week\n        weekday = w.e + dow;\n\n        if (w.e < 0 || w.e > 6) {\n          weekdayOverflow = true;\n        }\n      } else {\n        // default to beginning of week\n        weekday = dow;\n      }\n    }\n\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n      getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n      getParsingFlags(config)._overflowWeekday = true;\n    } else {\n      temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n      config._a[YEAR] = temp.year;\n      config._dayOfYear = temp.dayOfYear;\n    }\n  } // constant that refers to the ISO standard\n\n\n  hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form\n\n\n  hooks.RFC_2822 = function () {}; // date from string and format string\n\n\n  function configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n      configFromISO(config);\n      return;\n    }\n\n    if (config._f === hooks.RFC_2822) {\n      configFromRFC2822(config);\n      return;\n    }\n\n    config._a = [];\n    getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC`\n\n    var string = '' + config._i,\n        i,\n        parsedInput,\n        tokens,\n        token,\n        skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0,\n        era,\n        tokenLen;\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n    tokenLen = tokens.length;\n\n    for (i = 0; i < tokenLen; i++) {\n      token = tokens[i];\n      parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n\n      if (parsedInput) {\n        skipped = string.substr(0, string.indexOf(parsedInput));\n\n        if (skipped.length > 0) {\n          getParsingFlags(config).unusedInput.push(skipped);\n        }\n\n        string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n        totalParsedInputLength += parsedInput.length;\n      } // don't parse if it's not a known token\n\n\n      if (formatTokenFunctions[token]) {\n        if (parsedInput) {\n          getParsingFlags(config).empty = false;\n        } else {\n          getParsingFlags(config).unusedTokens.push(token);\n        }\n\n        addTimeToArrayFromToken(token, parsedInput, config);\n      } else if (config._strict && !parsedInput) {\n        getParsingFlags(config).unusedTokens.push(token);\n      }\n    } // add remaining unparsed input length to the string\n\n\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n\n    if (string.length > 0) {\n      getParsingFlags(config).unusedInput.push(string);\n    } // clear _12h flag if hour is <= 12\n\n\n    if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) {\n      getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem; // handle meridiem\n\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); // handle era\n\n    era = getParsingFlags(config).era;\n\n    if (era !== null) {\n      config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n    }\n\n    configFromArray(config);\n    checkOverflow(config);\n  }\n\n  function meridiemFixWrap(locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n      // nothing to do\n      return hour;\n    }\n\n    if (locale.meridiemHour != null) {\n      return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n      // Fallback\n      isPm = locale.isPM(meridiem);\n\n      if (isPm && hour < 12) {\n        hour += 12;\n      }\n\n      if (!isPm && hour === 12) {\n        hour = 0;\n      }\n\n      return hour;\n    } else {\n      // this is not supposed to happen\n      return hour;\n    }\n  } // date from string and array of format strings\n\n\n  function configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n        scoreToBeat,\n        i,\n        currentScore,\n        validFormatFound,\n        bestFormatIsValid = false,\n        configfLen = config._f.length;\n\n    if (configfLen === 0) {\n      getParsingFlags(config).invalidFormat = true;\n      config._d = new Date(NaN);\n      return;\n    }\n\n    for (i = 0; i < configfLen; i++) {\n      currentScore = 0;\n      validFormatFound = false;\n      tempConfig = copyConfig({}, config);\n\n      if (config._useUTC != null) {\n        tempConfig._useUTC = config._useUTC;\n      }\n\n      tempConfig._f = config._f[i];\n      configFromStringAndFormat(tempConfig);\n\n      if (isValid(tempConfig)) {\n        validFormatFound = true;\n      } // if there is any input that was not parsed add a penalty for that format\n\n\n      currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens\n\n      currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n      getParsingFlags(tempConfig).score = currentScore;\n\n      if (!bestFormatIsValid) {\n        if (scoreToBeat == null || currentScore < scoreToBeat || validFormatFound) {\n          scoreToBeat = currentScore;\n          bestMoment = tempConfig;\n\n          if (validFormatFound) {\n            bestFormatIsValid = true;\n          }\n        }\n      } else {\n        if (currentScore < scoreToBeat) {\n          scoreToBeat = currentScore;\n          bestMoment = tempConfig;\n        }\n      }\n    }\n\n    extend(config, bestMoment || tempConfig);\n  }\n\n  function configFromObject(config) {\n    if (config._d) {\n      return;\n    }\n\n    var i = normalizeObjectUnits(config._i),\n        dayOrDate = i.day === undefined ? i.date : i.day;\n    config._a = map([i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n      return obj && parseInt(obj, 10);\n    });\n    configFromArray(config);\n  }\n\n  function createFromConfig(config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n\n    if (res._nextDay) {\n      // Adding is smart enough around DST\n      res.add(1, 'd');\n      res._nextDay = undefined;\n    }\n\n    return res;\n  }\n\n  function prepareConfig(config) {\n    var input = config._i,\n        format = config._f;\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || format === undefined && input === '') {\n      return createInvalid({\n        nullInput: true\n      });\n    }\n\n    if (typeof input === 'string') {\n      config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n      return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n      config._d = input;\n    } else if (isArray(format)) {\n      configFromStringAndArray(config);\n    } else if (format) {\n      configFromStringAndFormat(config);\n    } else {\n      configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n      config._d = null;\n    }\n\n    return config;\n  }\n\n  function configFromInput(config) {\n    var input = config._i;\n\n    if (isUndefined(input)) {\n      config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n      config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n      configFromString(config);\n    } else if (isArray(input)) {\n      config._a = map(input.slice(0), function (obj) {\n        return parseInt(obj, 10);\n      });\n      configFromArray(config);\n    } else if (isObject(input)) {\n      configFromObject(config);\n    } else if (isNumber(input)) {\n      // from milliseconds\n      config._d = new Date(input);\n    } else {\n      hooks.createFromInputFallback(config);\n    }\n  }\n\n  function createLocalOrUTC(input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (format === true || format === false) {\n      strict = format;\n      format = undefined;\n    }\n\n    if (locale === true || locale === false) {\n      strict = locale;\n      locale = undefined;\n    }\n\n    if (isObject(input) && isObjectEmpty(input) || isArray(input) && input.length === 0) {\n      input = undefined;\n    } // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n\n\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n    return createFromConfig(c);\n  }\n\n  function createLocal(input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n  }\n\n  var prototypeMin = deprecate('moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () {\n    var other = createLocal.apply(null, arguments);\n\n    if (this.isValid() && other.isValid()) {\n      return other < this ? this : other;\n    } else {\n      return createInvalid();\n    }\n  }),\n      prototypeMax = deprecate('moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () {\n    var other = createLocal.apply(null, arguments);\n\n    if (this.isValid() && other.isValid()) {\n      return other > this ? this : other;\n    } else {\n      return createInvalid();\n    }\n  }); // Pick a moment m from moments so that m[fn](other) is true for all\n  // other. This relies on the function fn to be transitive.\n  //\n  // moments should either be an array of moment objects or an array, whose\n  // first element is an array of moment objects.\n\n  function pickBy(fn, moments) {\n    var res, i;\n\n    if (moments.length === 1 && isArray(moments[0])) {\n      moments = moments[0];\n    }\n\n    if (!moments.length) {\n      return createLocal();\n    }\n\n    res = moments[0];\n\n    for (i = 1; i < moments.length; ++i) {\n      if (!moments[i].isValid() || moments[i][fn](res)) {\n        res = moments[i];\n      }\n    }\n\n    return res;\n  } // TODO: Use [].sort instead?\n\n\n  function min() {\n    var args = [].slice.call(arguments, 0);\n    return pickBy('isBefore', args);\n  }\n\n  function max() {\n    var args = [].slice.call(arguments, 0);\n    return pickBy('isAfter', args);\n  }\n\n  var now = function now() {\n    return Date.now ? Date.now() : +new Date();\n  };\n\n  var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n  function isDurationValid(m) {\n    var key,\n        unitHasDecimal = false,\n        i,\n        orderLen = ordering.length;\n\n    for (key in m) {\n      if (hasOwnProp(m, key) && !(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n        return false;\n      }\n    }\n\n    for (i = 0; i < orderLen; ++i) {\n      if (m[ordering[i]]) {\n        if (unitHasDecimal) {\n          return false; // only allow non-integers for smallest unit\n        }\n\n        if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n          unitHasDecimal = true;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  function isValid$1() {\n    return this._isValid;\n  }\n\n  function createInvalid$1() {\n    return createDuration(NaN);\n  }\n\n  function Duration(duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n    this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove\n\n    this._milliseconds = +milliseconds + seconds * 1e3 + // 1000\n    minutes * 6e4 + // 1000 * 60\n    hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n\n    this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n\n    this._months = +months + quarters * 3 + years * 12;\n    this._data = {};\n    this._locale = getLocale();\n\n    this._bubble();\n  }\n\n  function isDuration(obj) {\n    return obj instanceof Duration;\n  }\n\n  function absRound(number) {\n    if (number < 0) {\n      return Math.round(-1 * number) * -1;\n    } else {\n      return Math.round(number);\n    }\n  } // compare two arrays, return the number of differences\n\n\n  function compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n\n    for (i = 0; i < len; i++) {\n      if (dontConvert && array1[i] !== array2[i] || !dontConvert && toInt(array1[i]) !== toInt(array2[i])) {\n        diffs++;\n      }\n    }\n\n    return diffs + lengthDiff;\n  } // FORMATTING\n\n\n  function offset(token, separator) {\n    addFormatToken(token, 0, 0, function () {\n      var offset = this.utcOffset(),\n          sign = '+';\n\n      if (offset < 0) {\n        offset = -offset;\n        sign = '-';\n      }\n\n      return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~offset % 60, 2);\n    });\n  }\n\n  offset('Z', ':');\n  offset('ZZ', ''); // PARSING\n\n  addRegexToken('Z', matchShortOffset);\n  addRegexToken('ZZ', matchShortOffset);\n  addParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n  }); // HELPERS\n  // timezone chunker\n  // '+10:00' > ['10',  '00']\n  // '-1530'  > ['-15', '30']\n\n  var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n  function offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher),\n        chunk,\n        parts,\n        minutes;\n\n    if (matches === null) {\n      return null;\n    }\n\n    chunk = matches[matches.length - 1] || [];\n    parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    minutes = +(parts[1] * 60) + toInt(parts[2]);\n    return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n  } // Return a moment from input, that is local/utc/zone equivalent to model.\n\n\n  function cloneWithOffset(input, model) {\n    var res, diff;\n\n    if (model._isUTC) {\n      res = model.clone();\n      diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api.\n\n      res._d.setTime(res._d.valueOf() + diff);\n\n      hooks.updateOffset(res, false);\n      return res;\n    } else {\n      return createLocal(input).local();\n    }\n  }\n\n  function getDateOffset(m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset());\n  } // HOOKS\n  // This function will be called whenever a moment is mutated.\n  // It is intended to keep the offset in sync with the timezone.\n\n\n  hooks.updateOffset = function () {}; // MOMENTS\n  // keepLocalTime = true means only change the timezone, without\n  // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n  // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n  // +0200, so we adjust the time as needed, to be valid.\n  //\n  // Keeping the time actually adds/subtracts (one hour)\n  // from the actual represented time. That is why we call updateOffset\n  // a second time. In case it wants us to change the offset again\n  // _changeInProgress == true case, then we have to adjust, because\n  // there is no such time in the given timezone.\n\n\n  function getSetOffset(input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    }\n\n    if (input != null) {\n      if (typeof input === 'string') {\n        input = offsetFromString(matchShortOffset, input);\n\n        if (input === null) {\n          return this;\n        }\n      } else if (Math.abs(input) < 16 && !keepMinutes) {\n        input = input * 60;\n      }\n\n      if (!this._isUTC && keepLocalTime) {\n        localAdjust = getDateOffset(this);\n      }\n\n      this._offset = input;\n      this._isUTC = true;\n\n      if (localAdjust != null) {\n        this.add(localAdjust, 'm');\n      }\n\n      if (offset !== input) {\n        if (!keepLocalTime || this._changeInProgress) {\n          addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n        } else if (!this._changeInProgress) {\n          this._changeInProgress = true;\n          hooks.updateOffset(this, true);\n          this._changeInProgress = null;\n        }\n      }\n\n      return this;\n    } else {\n      return this._isUTC ? offset : getDateOffset(this);\n    }\n  }\n\n  function getSetZone(input, keepLocalTime) {\n    if (input != null) {\n      if (typeof input !== 'string') {\n        input = -input;\n      }\n\n      this.utcOffset(input, keepLocalTime);\n      return this;\n    } else {\n      return -this.utcOffset();\n    }\n  }\n\n  function setOffsetToUTC(keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n  }\n\n  function setOffsetToLocal(keepLocalTime) {\n    if (this._isUTC) {\n      this.utcOffset(0, keepLocalTime);\n      this._isUTC = false;\n\n      if (keepLocalTime) {\n        this.subtract(getDateOffset(this), 'm');\n      }\n    }\n\n    return this;\n  }\n\n  function setOffsetToParsedOffset() {\n    if (this._tzm != null) {\n      this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n      var tZone = offsetFromString(matchOffset, this._i);\n\n      if (tZone != null) {\n        this.utcOffset(tZone);\n      } else {\n        this.utcOffset(0, true);\n      }\n    }\n\n    return this;\n  }\n\n  function hasAlignedHourOffset(input) {\n    if (!this.isValid()) {\n      return false;\n    }\n\n    input = input ? createLocal(input).utcOffset() : 0;\n    return (this.utcOffset() - input) % 60 === 0;\n  }\n\n  function isDaylightSavingTime() {\n    return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset();\n  }\n\n  function isDaylightSavingTimeShifted() {\n    if (!isUndefined(this._isDSTShifted)) {\n      return this._isDSTShifted;\n    }\n\n    var c = {},\n        other;\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n      other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n      this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n    } else {\n      this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n  }\n\n  function isLocal() {\n    return this.isValid() ? !this._isUTC : false;\n  }\n\n  function isUtcOffset() {\n    return this.isValid() ? this._isUTC : false;\n  }\n\n  function isUtc() {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n  } // ASP.NET json date format regex\n\n\n  var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n      // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n  // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n  // and further modified to allow for strings containing both week and day\n  isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n  function createDuration(input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n    match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n      duration = {\n        ms: input._milliseconds,\n        d: input._days,\n        M: input._months\n      };\n    } else if (isNumber(input) || !isNaN(+input)) {\n      duration = {};\n\n      if (key) {\n        duration[key] = +input;\n      } else {\n        duration.milliseconds = +input;\n      }\n    } else if (match = aspNetRegex.exec(input)) {\n      sign = match[1] === '-' ? -1 : 1;\n      duration = {\n        y: 0,\n        d: toInt(match[DATE]) * sign,\n        h: toInt(match[HOUR]) * sign,\n        m: toInt(match[MINUTE]) * sign,\n        s: toInt(match[SECOND]) * sign,\n        ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n\n      };\n    } else if (match = isoRegex.exec(input)) {\n      sign = match[1] === '-' ? -1 : 1;\n      duration = {\n        y: parseIso(match[2], sign),\n        M: parseIso(match[3], sign),\n        w: parseIso(match[4], sign),\n        d: parseIso(match[5], sign),\n        h: parseIso(match[6], sign),\n        m: parseIso(match[7], sign),\n        s: parseIso(match[8], sign)\n      };\n    } else if (duration == null) {\n      // checks for null or undefined\n      duration = {};\n    } else if (_typeof(duration) === 'object' && ('from' in duration || 'to' in duration)) {\n      diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n      duration = {};\n      duration.ms = diffRes.milliseconds;\n      duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n      ret._locale = input._locale;\n    }\n\n    if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n      ret._isValid = input._isValid;\n    }\n\n    return ret;\n  }\n\n  createDuration.fn = Duration.prototype;\n  createDuration.invalid = createInvalid$1;\n\n  function parseIso(inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it\n\n    return (isNaN(res) ? 0 : res) * sign;\n  }\n\n  function positiveMomentsDifference(base, other) {\n    var res = {};\n    res.months = other.month() - base.month() + (other.year() - base.year()) * 12;\n\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n      --res.months;\n    }\n\n    res.milliseconds = +other - +base.clone().add(res.months, 'M');\n    return res;\n  }\n\n  function momentsDifference(base, other) {\n    var res;\n\n    if (!(base.isValid() && other.isValid())) {\n      return {\n        milliseconds: 0,\n        months: 0\n      };\n    }\n\n    other = cloneWithOffset(other, base);\n\n    if (base.isBefore(other)) {\n      res = positiveMomentsDifference(base, other);\n    } else {\n      res = positiveMomentsDifference(other, base);\n      res.milliseconds = -res.milliseconds;\n      res.months = -res.months;\n    }\n\n    return res;\n  } // TODO: remove 'name' arg after deprecation is removed\n\n\n  function createAdder(direction, name) {\n    return function (val, period) {\n      var dur, tmp; //invert the arguments, but complain about it\n\n      if (period !== null && !isNaN(+period)) {\n        deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n        tmp = val;\n        val = period;\n        period = tmp;\n      }\n\n      dur = createDuration(val, period);\n      addSubtract(this, dur, direction);\n      return this;\n    };\n  }\n\n  function addSubtract(mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n      // No op\n      return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (months) {\n      setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n\n    if (days) {\n      set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n\n    if (milliseconds) {\n      mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n\n    if (updateOffset) {\n      hooks.updateOffset(mom, days || months);\n    }\n  }\n\n  var add = createAdder(1, 'add'),\n      subtract = createAdder(-1, 'subtract');\n\n  function isString(input) {\n    return typeof input === 'string' || input instanceof String;\n  } // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n\n\n  function isMomentInput(input) {\n    return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === undefined;\n  }\n\n  function isMomentInputObject(input) {\n    var objectTest = isObject(input) && !isObjectEmpty(input),\n        propertyTest = false,\n        properties = ['years', 'year', 'y', 'months', 'month', 'M', 'days', 'day', 'd', 'dates', 'date', 'D', 'hours', 'hour', 'h', 'minutes', 'minute', 'm', 'seconds', 'second', 's', 'milliseconds', 'millisecond', 'ms'],\n        i,\n        property,\n        propertyLen = properties.length;\n\n    for (i = 0; i < propertyLen; i += 1) {\n      property = properties[i];\n      propertyTest = propertyTest || hasOwnProp(input, property);\n    }\n\n    return objectTest && propertyTest;\n  }\n\n  function isNumberOrStringArray(input) {\n    var arrayTest = isArray(input),\n        dataTypeTest = false;\n\n    if (arrayTest) {\n      dataTypeTest = input.filter(function (item) {\n        return !isNumber(item) && isString(input);\n      }).length === 0;\n    }\n\n    return arrayTest && dataTypeTest;\n  }\n\n  function isCalendarSpec(input) {\n    var objectTest = isObject(input) && !isObjectEmpty(input),\n        propertyTest = false,\n        properties = ['sameDay', 'nextDay', 'lastDay', 'nextWeek', 'lastWeek', 'sameElse'],\n        i,\n        property;\n\n    for (i = 0; i < properties.length; i += 1) {\n      property = properties[i];\n      propertyTest = propertyTest || hasOwnProp(input, property);\n    }\n\n    return objectTest && propertyTest;\n  }\n\n  function getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse';\n  }\n\n  function calendar$1(time, formats) {\n    // Support for single parameter, formats only overload to the calendar function\n    if (arguments.length === 1) {\n      if (!arguments[0]) {\n        time = undefined;\n        formats = undefined;\n      } else if (isMomentInput(arguments[0])) {\n        time = arguments[0];\n        formats = undefined;\n      } else if (isCalendarSpec(arguments[0])) {\n        formats = arguments[0];\n        time = undefined;\n      }\n    } // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n\n\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse',\n        output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n  }\n\n  function clone() {\n    return new Moment(this);\n  }\n\n  function isAfter(input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n\n    if (!(this.isValid() && localInput.isValid())) {\n      return false;\n    }\n\n    units = normalizeUnits(units) || 'millisecond';\n\n    if (units === 'millisecond') {\n      return this.valueOf() > localInput.valueOf();\n    } else {\n      return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n  }\n\n  function isBefore(input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n\n    if (!(this.isValid() && localInput.isValid())) {\n      return false;\n    }\n\n    units = normalizeUnits(units) || 'millisecond';\n\n    if (units === 'millisecond') {\n      return this.valueOf() < localInput.valueOf();\n    } else {\n      return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n  }\n\n  function isBetween(from, to, units, inclusivity) {\n    var localFrom = isMoment(from) ? from : createLocal(from),\n        localTo = isMoment(to) ? to : createLocal(to);\n\n    if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n      return false;\n    }\n\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));\n  }\n\n  function isSame(input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n\n    if (!(this.isValid() && localInput.isValid())) {\n      return false;\n    }\n\n    units = normalizeUnits(units) || 'millisecond';\n\n    if (units === 'millisecond') {\n      return this.valueOf() === localInput.valueOf();\n    } else {\n      inputMs = localInput.valueOf();\n      return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n  }\n\n  function isSameOrAfter(input, units) {\n    return this.isSame(input, units) || this.isAfter(input, units);\n  }\n\n  function isSameOrBefore(input, units) {\n    return this.isSame(input, units) || this.isBefore(input, units);\n  }\n\n  function diff(input, units, asFloat) {\n    var that, zoneDelta, output;\n\n    if (!this.isValid()) {\n      return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n      return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n    units = normalizeUnits(units);\n\n    switch (units) {\n      case 'year':\n        output = monthDiff(this, that) / 12;\n        break;\n\n      case 'month':\n        output = monthDiff(this, that);\n        break;\n\n      case 'quarter':\n        output = monthDiff(this, that) / 3;\n        break;\n\n      case 'second':\n        output = (this - that) / 1e3;\n        break;\n      // 1000\n\n      case 'minute':\n        output = (this - that) / 6e4;\n        break;\n      // 1000 * 60\n\n      case 'hour':\n        output = (this - that) / 36e5;\n        break;\n      // 1000 * 60 * 60\n\n      case 'day':\n        output = (this - that - zoneDelta) / 864e5;\n        break;\n      // 1000 * 60 * 60 * 24, negate dst\n\n      case 'week':\n        output = (this - that - zoneDelta) / 6048e5;\n        break;\n      // 1000 * 60 * 60 * 24 * 7, negate dst\n\n      default:\n        output = this - that;\n    }\n\n    return asFloat ? output : absFloor(output);\n  }\n\n  function monthDiff(a, b) {\n    if (a.date() < b.date()) {\n      // end-of-month calculations work correct when the start month has more\n      // days than the end month.\n      return -monthDiff(b, a);\n    } // difference in months\n\n\n    var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n    anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2,\n        adjust;\n\n    if (b - anchor < 0) {\n      anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month\n\n      adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n      anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month\n\n      adjust = (b - anchor) / (anchor2 - anchor);\n    } //check for negative zero, return zero if negative zero\n\n\n    return -(wholeMonthDiff + adjust) || 0;\n  }\n\n  hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n  hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n  function toString() {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n  }\n\n  function toISOString(keepOffset) {\n    if (!this.isValid()) {\n      return null;\n    }\n\n    var utc = keepOffset !== true,\n        m = utc ? this.clone().utc() : this;\n\n    if (m.year() < 0 || m.year() > 9999) {\n      return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n\n    if (isFunction(Date.prototype.toISOString)) {\n      // native implementation is ~50x faster, use it when we can\n      if (utc) {\n        return this.toDate().toISOString();\n      } else {\n        return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n      }\n    }\n\n    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n  }\n  /**\n   * Return a human readable representation of a moment that can\n   * also be evaluated to get a new moment which is the same\n   *\n   * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n   */\n\n\n  function inspect() {\n    if (!this.isValid()) {\n      return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n\n    var func = 'moment',\n        zone = '',\n        prefix,\n        year,\n        datetime,\n        suffix;\n\n    if (!this.isLocal()) {\n      func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n      zone = 'Z';\n    }\n\n    prefix = '[' + func + '(\"]';\n    year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n    datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    suffix = zone + '[\")]';\n    return this.format(prefix + year + datetime + suffix);\n  }\n\n  function format(inputString) {\n    if (!inputString) {\n      inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n  }\n\n  function from(time, withoutSuffix) {\n    if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {\n      return createDuration({\n        to: this,\n        from: time\n      }).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n      return this.localeData().invalidDate();\n    }\n  }\n\n  function fromNow(withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n  }\n\n  function to(time, withoutSuffix) {\n    if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {\n      return createDuration({\n        from: this,\n        to: time\n      }).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n      return this.localeData().invalidDate();\n    }\n  }\n\n  function toNow(withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n  } // If passed a locale key, it will set the locale for this\n  // instance.  Otherwise, it will return the locale configuration\n  // variables for this instance.\n\n\n  function locale(key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n      return this._locale._abbr;\n    } else {\n      newLocaleData = getLocale(key);\n\n      if (newLocaleData != null) {\n        this._locale = newLocaleData;\n      }\n\n      return this;\n    }\n  }\n\n  var lang = deprecate('moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) {\n    if (key === undefined) {\n      return this.localeData();\n    } else {\n      return this.locale(key);\n    }\n  });\n\n  function localeData() {\n    return this._locale;\n  }\n\n  var MS_PER_SECOND = 1000,\n      MS_PER_MINUTE = 60 * MS_PER_SECOND,\n      MS_PER_HOUR = 60 * MS_PER_MINUTE,\n      MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; // actual modulo - handles negative numbers (for dates before 1970):\n\n  function mod$1(dividend, divisor) {\n    return (dividend % divisor + divisor) % divisor;\n  }\n\n  function localStartOfDate(y, m, d) {\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0) {\n      // preserve leap years using a full 400 year cycle, then reset\n      return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n    } else {\n      return new Date(y, m, d).valueOf();\n    }\n  }\n\n  function utcStartOfDate(y, m, d) {\n    // Date.UTC remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0) {\n      // preserve leap years using a full 400 year cycle, then reset\n      return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n    } else {\n      return Date.UTC(y, m, d);\n    }\n  }\n\n  function startOf(units) {\n    var time, startOfDate;\n    units = normalizeUnits(units);\n\n    if (units === undefined || units === 'millisecond' || !this.isValid()) {\n      return this;\n    }\n\n    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n    switch (units) {\n      case 'year':\n        time = startOfDate(this.year(), 0, 1);\n        break;\n\n      case 'quarter':\n        time = startOfDate(this.year(), this.month() - this.month() % 3, 1);\n        break;\n\n      case 'month':\n        time = startOfDate(this.year(), this.month(), 1);\n        break;\n\n      case 'week':\n        time = startOfDate(this.year(), this.month(), this.date() - this.weekday());\n        break;\n\n      case 'isoWeek':\n        time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1));\n        break;\n\n      case 'day':\n      case 'date':\n        time = startOfDate(this.year(), this.month(), this.date());\n        break;\n\n      case 'hour':\n        time = this._d.valueOf();\n        time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR);\n        break;\n\n      case 'minute':\n        time = this._d.valueOf();\n        time -= mod$1(time, MS_PER_MINUTE);\n        break;\n\n      case 'second':\n        time = this._d.valueOf();\n        time -= mod$1(time, MS_PER_SECOND);\n        break;\n    }\n\n    this._d.setTime(time);\n\n    hooks.updateOffset(this, true);\n    return this;\n  }\n\n  function endOf(units) {\n    var time, startOfDate;\n    units = normalizeUnits(units);\n\n    if (units === undefined || units === 'millisecond' || !this.isValid()) {\n      return this;\n    }\n\n    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n    switch (units) {\n      case 'year':\n        time = startOfDate(this.year() + 1, 0, 1) - 1;\n        break;\n\n      case 'quarter':\n        time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1;\n        break;\n\n      case 'month':\n        time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n        break;\n\n      case 'week':\n        time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1;\n        break;\n\n      case 'isoWeek':\n        time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1;\n        break;\n\n      case 'day':\n      case 'date':\n        time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n        break;\n\n      case 'hour':\n        time = this._d.valueOf();\n        time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1;\n        break;\n\n      case 'minute':\n        time = this._d.valueOf();\n        time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n        break;\n\n      case 'second':\n        time = this._d.valueOf();\n        time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n        break;\n    }\n\n    this._d.setTime(time);\n\n    hooks.updateOffset(this, true);\n    return this;\n  }\n\n  function valueOf() {\n    return this._d.valueOf() - (this._offset || 0) * 60000;\n  }\n\n  function unix() {\n    return Math.floor(this.valueOf() / 1000);\n  }\n\n  function toDate() {\n    return new Date(this.valueOf());\n  }\n\n  function toArray() {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n  }\n\n  function toObject() {\n    var m = this;\n    return {\n      years: m.year(),\n      months: m.month(),\n      date: m.date(),\n      hours: m.hours(),\n      minutes: m.minutes(),\n      seconds: m.seconds(),\n      milliseconds: m.milliseconds()\n    };\n  }\n\n  function toJSON() {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n  }\n\n  function isValid$2() {\n    return isValid(this);\n  }\n\n  function parsingFlags() {\n    return extend({}, getParsingFlags(this));\n  }\n\n  function invalidAt() {\n    return getParsingFlags(this).overflow;\n  }\n\n  function creationData() {\n    return {\n      input: this._i,\n      format: this._f,\n      locale: this._locale,\n      isUTC: this._isUTC,\n      strict: this._strict\n    };\n  }\n\n  addFormatToken('N', 0, 0, 'eraAbbr');\n  addFormatToken('NN', 0, 0, 'eraAbbr');\n  addFormatToken('NNN', 0, 0, 'eraAbbr');\n  addFormatToken('NNNN', 0, 0, 'eraName');\n  addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n  addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n  addFormatToken('y', ['yy', 2], 0, 'eraYear');\n  addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n  addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n  addRegexToken('N', matchEraAbbr);\n  addRegexToken('NN', matchEraAbbr);\n  addRegexToken('NNN', matchEraAbbr);\n  addRegexToken('NNNN', matchEraName);\n  addRegexToken('NNNNN', matchEraNarrow);\n  addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (input, array, config, token) {\n    var era = config._locale.erasParse(input, token, config._strict);\n\n    if (era) {\n      getParsingFlags(config).era = era;\n    } else {\n      getParsingFlags(config).invalidEra = input;\n    }\n  });\n  addRegexToken('y', matchUnsigned);\n  addRegexToken('yy', matchUnsigned);\n  addRegexToken('yyy', matchUnsigned);\n  addRegexToken('yyyy', matchUnsigned);\n  addRegexToken('yo', matchEraYearOrdinal);\n  addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n  addParseToken(['yo'], function (input, array, config, token) {\n    var match;\n\n    if (config._locale._eraYearOrdinalRegex) {\n      match = input.match(config._locale._eraYearOrdinalRegex);\n    }\n\n    if (config._locale.eraYearOrdinalParse) {\n      array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n    } else {\n      array[YEAR] = parseInt(input, 10);\n    }\n  });\n\n  function localeEras(m, format) {\n    var i,\n        l,\n        date,\n        eras = this._eras || getLocale('en')._eras;\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      switch (_typeof(eras[i].since)) {\n        case 'string':\n          // truncate time\n          date = hooks(eras[i].since).startOf('day');\n          eras[i].since = date.valueOf();\n          break;\n      }\n\n      switch (_typeof(eras[i].until)) {\n        case 'undefined':\n          eras[i].until = +Infinity;\n          break;\n\n        case 'string':\n          // truncate time\n          date = hooks(eras[i].until).startOf('day').valueOf();\n          eras[i].until = date.valueOf();\n          break;\n      }\n    }\n\n    return eras;\n  }\n\n  function localeErasParse(eraName, format, strict) {\n    var i,\n        l,\n        eras = this.eras(),\n        name,\n        abbr,\n        narrow;\n    eraName = eraName.toUpperCase();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      name = eras[i].name.toUpperCase();\n      abbr = eras[i].abbr.toUpperCase();\n      narrow = eras[i].narrow.toUpperCase();\n\n      if (strict) {\n        switch (format) {\n          case 'N':\n          case 'NN':\n          case 'NNN':\n            if (abbr === eraName) {\n              return eras[i];\n            }\n\n            break;\n\n          case 'NNNN':\n            if (name === eraName) {\n              return eras[i];\n            }\n\n            break;\n\n          case 'NNNNN':\n            if (narrow === eraName) {\n              return eras[i];\n            }\n\n            break;\n        }\n      } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n        return eras[i];\n      }\n    }\n  }\n\n  function localeErasConvertYear(era, year) {\n    var dir = era.since <= era.until ? +1 : -1;\n\n    if (year === undefined) {\n      return hooks(era.since).year();\n    } else {\n      return hooks(era.since).year() + (year - era.offset) * dir;\n    }\n  }\n\n  function getEraName() {\n    var i,\n        l,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      // truncate time\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until) {\n        return eras[i].name;\n      }\n\n      if (eras[i].until <= val && val <= eras[i].since) {\n        return eras[i].name;\n      }\n    }\n\n    return '';\n  }\n\n  function getEraNarrow() {\n    var i,\n        l,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      // truncate time\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until) {\n        return eras[i].narrow;\n      }\n\n      if (eras[i].until <= val && val <= eras[i].since) {\n        return eras[i].narrow;\n      }\n    }\n\n    return '';\n  }\n\n  function getEraAbbr() {\n    var i,\n        l,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      // truncate time\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until) {\n        return eras[i].abbr;\n      }\n\n      if (eras[i].until <= val && val <= eras[i].since) {\n        return eras[i].abbr;\n      }\n    }\n\n    return '';\n  }\n\n  function getEraYear() {\n    var i,\n        l,\n        dir,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      dir = eras[i].since <= eras[i].until ? +1 : -1; // truncate time\n\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until || eras[i].until <= val && val <= eras[i].since) {\n        return (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset;\n      }\n    }\n\n    return this.year();\n  }\n\n  function erasNameRegex(isStrict) {\n    if (!hasOwnProp(this, '_erasNameRegex')) {\n      computeErasParse.call(this);\n    }\n\n    return isStrict ? this._erasNameRegex : this._erasRegex;\n  }\n\n  function erasAbbrRegex(isStrict) {\n    if (!hasOwnProp(this, '_erasAbbrRegex')) {\n      computeErasParse.call(this);\n    }\n\n    return isStrict ? this._erasAbbrRegex : this._erasRegex;\n  }\n\n  function erasNarrowRegex(isStrict) {\n    if (!hasOwnProp(this, '_erasNarrowRegex')) {\n      computeErasParse.call(this);\n    }\n\n    return isStrict ? this._erasNarrowRegex : this._erasRegex;\n  }\n\n  function matchEraAbbr(isStrict, locale) {\n    return locale.erasAbbrRegex(isStrict);\n  }\n\n  function matchEraName(isStrict, locale) {\n    return locale.erasNameRegex(isStrict);\n  }\n\n  function matchEraNarrow(isStrict, locale) {\n    return locale.erasNarrowRegex(isStrict);\n  }\n\n  function matchEraYearOrdinal(isStrict, locale) {\n    return locale._eraYearOrdinalRegex || matchUnsigned;\n  }\n\n  function computeErasParse() {\n    var abbrPieces = [],\n        namePieces = [],\n        narrowPieces = [],\n        mixedPieces = [],\n        i,\n        l,\n        eras = this.eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      namePieces.push(regexEscape(eras[i].name));\n      abbrPieces.push(regexEscape(eras[i].abbr));\n      narrowPieces.push(regexEscape(eras[i].narrow));\n      mixedPieces.push(regexEscape(eras[i].name));\n      mixedPieces.push(regexEscape(eras[i].abbr));\n      mixedPieces.push(regexEscape(eras[i].narrow));\n    }\n\n    this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n    this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n    this._erasNarrowRegex = new RegExp('^(' + narrowPieces.join('|') + ')', 'i');\n  } // FORMATTING\n\n\n  addFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n  });\n  addFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n  });\n\n  function addWeekYearFormatToken(token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n  }\n\n  addWeekYearFormatToken('gggg', 'weekYear');\n  addWeekYearFormatToken('ggggg', 'weekYear');\n  addWeekYearFormatToken('GGGG', 'isoWeekYear');\n  addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES\n\n  addUnitAlias('weekYear', 'gg');\n  addUnitAlias('isoWeekYear', 'GG'); // PRIORITY\n\n  addUnitPriority('weekYear', 1);\n  addUnitPriority('isoWeekYear', 1); // PARSING\n\n  addRegexToken('G', matchSigned);\n  addRegexToken('g', matchSigned);\n  addRegexToken('GG', match1to2, match2);\n  addRegexToken('gg', match1to2, match2);\n  addRegexToken('GGGG', match1to4, match4);\n  addRegexToken('gggg', match1to4, match4);\n  addRegexToken('GGGGG', match1to6, match6);\n  addRegexToken('ggggg', match1to6, match6);\n  addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n  });\n  addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n  }); // MOMENTS\n\n  function getSetWeekYear(input) {\n    return getSetWeekYearHelper.call(this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy);\n  }\n\n  function getSetISOWeekYear(input) {\n    return getSetWeekYearHelper.call(this, input, this.isoWeek(), this.isoWeekday(), 1, 4);\n  }\n\n  function getISOWeeksInYear() {\n    return weeksInYear(this.year(), 1, 4);\n  }\n\n  function getISOWeeksInISOWeekYear() {\n    return weeksInYear(this.isoWeekYear(), 1, 4);\n  }\n\n  function getWeeksInYear() {\n    var weekInfo = this.localeData()._week;\n\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n  }\n\n  function getWeeksInWeekYear() {\n    var weekInfo = this.localeData()._week;\n\n    return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n  }\n\n  function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n\n    if (input == null) {\n      return weekOfYear(this, dow, doy).year;\n    } else {\n      weeksTarget = weeksInYear(input, dow, doy);\n\n      if (week > weeksTarget) {\n        week = weeksTarget;\n      }\n\n      return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n  }\n\n  function setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n  } // FORMATTING\n\n\n  addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES\n\n  addUnitAlias('quarter', 'Q'); // PRIORITY\n\n  addUnitPriority('quarter', 7); // PARSING\n\n  addRegexToken('Q', match1);\n  addParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n  }); // MOMENTS\n\n  function getSetQuarter(input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n  } // FORMATTING\n\n\n  addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES\n\n  addUnitAlias('date', 'D'); // PRIORITY\n\n  addUnitPriority('date', 9); // PARSING\n\n  addRegexToken('D', match1to2);\n  addRegexToken('DD', match1to2, match2);\n  addRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ? locale._dayOfMonthOrdinalParse || locale._ordinalParse : locale._dayOfMonthOrdinalParseLenient;\n  });\n  addParseToken(['D', 'DD'], DATE);\n  addParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0]);\n  }); // MOMENTS\n\n  var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING\n\n  addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES\n\n  addUnitAlias('dayOfYear', 'DDD'); // PRIORITY\n\n  addUnitPriority('dayOfYear', 4); // PARSING\n\n  addRegexToken('DDD', match1to3);\n  addRegexToken('DDDD', match3);\n  addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n  }); // HELPERS\n  // MOMENTS\n\n  function getSetDayOfYear(input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n  } // FORMATTING\n\n\n  addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES\n\n  addUnitAlias('minute', 'm'); // PRIORITY\n\n  addUnitPriority('minute', 14); // PARSING\n\n  addRegexToken('m', match1to2);\n  addRegexToken('mm', match1to2, match2);\n  addParseToken(['m', 'mm'], MINUTE); // MOMENTS\n\n  var getSetMinute = makeGetSet('Minutes', false); // FORMATTING\n\n  addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES\n\n  addUnitAlias('second', 's'); // PRIORITY\n\n  addUnitPriority('second', 15); // PARSING\n\n  addRegexToken('s', match1to2);\n  addRegexToken('ss', match1to2, match2);\n  addParseToken(['s', 'ss'], SECOND); // MOMENTS\n\n  var getSetSecond = makeGetSet('Seconds', false); // FORMATTING\n\n  addFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n  });\n  addFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n  });\n  addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n  addFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n  });\n  addFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n  });\n  addFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n  });\n  addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n  });\n  addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n  });\n  addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n  }); // ALIASES\n\n  addUnitAlias('millisecond', 'ms'); // PRIORITY\n\n  addUnitPriority('millisecond', 16); // PARSING\n\n  addRegexToken('S', match1to3, match1);\n  addRegexToken('SS', match1to3, match2);\n  addRegexToken('SSS', match1to3, match3);\n  var token, getSetMillisecond;\n\n  for (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n  }\n\n  function parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n  }\n\n  for (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n  }\n\n  getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING\n\n  addFormatToken('z', 0, 0, 'zoneAbbr');\n  addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS\n\n  function getZoneAbbr() {\n    return this._isUTC ? 'UTC' : '';\n  }\n\n  function getZoneName() {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n  }\n\n  var proto = Moment.prototype;\n  proto.add = add;\n  proto.calendar = calendar$1;\n  proto.clone = clone;\n  proto.diff = diff;\n  proto.endOf = endOf;\n  proto.format = format;\n  proto.from = from;\n  proto.fromNow = fromNow;\n  proto.to = to;\n  proto.toNow = toNow;\n  proto.get = stringGet;\n  proto.invalidAt = invalidAt;\n  proto.isAfter = isAfter;\n  proto.isBefore = isBefore;\n  proto.isBetween = isBetween;\n  proto.isSame = isSame;\n  proto.isSameOrAfter = isSameOrAfter;\n  proto.isSameOrBefore = isSameOrBefore;\n  proto.isValid = isValid$2;\n  proto.lang = lang;\n  proto.locale = locale;\n  proto.localeData = localeData;\n  proto.max = prototypeMax;\n  proto.min = prototypeMin;\n  proto.parsingFlags = parsingFlags;\n  proto.set = stringSet;\n  proto.startOf = startOf;\n  proto.subtract = subtract;\n  proto.toArray = toArray;\n  proto.toObject = toObject;\n  proto.toDate = toDate;\n  proto.toISOString = toISOString;\n  proto.inspect = inspect;\n\n  if (typeof Symbol !== 'undefined' && Symbol[\"for\"] != null) {\n    proto[Symbol[\"for\"]('nodejs.util.inspect.custom')] = function () {\n      return 'Moment<' + this.format() + '>';\n    };\n  }\n\n  proto.toJSON = toJSON;\n  proto.toString = toString;\n  proto.unix = unix;\n  proto.valueOf = valueOf;\n  proto.creationData = creationData;\n  proto.eraName = getEraName;\n  proto.eraNarrow = getEraNarrow;\n  proto.eraAbbr = getEraAbbr;\n  proto.eraYear = getEraYear;\n  proto.year = getSetYear;\n  proto.isLeapYear = getIsLeapYear;\n  proto.weekYear = getSetWeekYear;\n  proto.isoWeekYear = getSetISOWeekYear;\n  proto.quarter = proto.quarters = getSetQuarter;\n  proto.month = getSetMonth;\n  proto.daysInMonth = getDaysInMonth;\n  proto.week = proto.weeks = getSetWeek;\n  proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n  proto.weeksInYear = getWeeksInYear;\n  proto.weeksInWeekYear = getWeeksInWeekYear;\n  proto.isoWeeksInYear = getISOWeeksInYear;\n  proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n  proto.date = getSetDayOfMonth;\n  proto.day = proto.days = getSetDayOfWeek;\n  proto.weekday = getSetLocaleDayOfWeek;\n  proto.isoWeekday = getSetISODayOfWeek;\n  proto.dayOfYear = getSetDayOfYear;\n  proto.hour = proto.hours = getSetHour;\n  proto.minute = proto.minutes = getSetMinute;\n  proto.second = proto.seconds = getSetSecond;\n  proto.millisecond = proto.milliseconds = getSetMillisecond;\n  proto.utcOffset = getSetOffset;\n  proto.utc = setOffsetToUTC;\n  proto.local = setOffsetToLocal;\n  proto.parseZone = setOffsetToParsedOffset;\n  proto.hasAlignedHourOffset = hasAlignedHourOffset;\n  proto.isDST = isDaylightSavingTime;\n  proto.isLocal = isLocal;\n  proto.isUtcOffset = isUtcOffset;\n  proto.isUtc = isUtc;\n  proto.isUTC = isUtc;\n  proto.zoneAbbr = getZoneAbbr;\n  proto.zoneName = getZoneName;\n  proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n  proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n  proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n  proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n  proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n  function createUnix(input) {\n    return createLocal(input * 1000);\n  }\n\n  function createInZone() {\n    return createLocal.apply(null, arguments).parseZone();\n  }\n\n  function preParsePostFormat(string) {\n    return string;\n  }\n\n  var proto$1 = Locale.prototype;\n  proto$1.calendar = calendar;\n  proto$1.longDateFormat = longDateFormat;\n  proto$1.invalidDate = invalidDate;\n  proto$1.ordinal = ordinal;\n  proto$1.preparse = preParsePostFormat;\n  proto$1.postformat = preParsePostFormat;\n  proto$1.relativeTime = relativeTime;\n  proto$1.pastFuture = pastFuture;\n  proto$1.set = set;\n  proto$1.eras = localeEras;\n  proto$1.erasParse = localeErasParse;\n  proto$1.erasConvertYear = localeErasConvertYear;\n  proto$1.erasAbbrRegex = erasAbbrRegex;\n  proto$1.erasNameRegex = erasNameRegex;\n  proto$1.erasNarrowRegex = erasNarrowRegex;\n  proto$1.months = localeMonths;\n  proto$1.monthsShort = localeMonthsShort;\n  proto$1.monthsParse = localeMonthsParse;\n  proto$1.monthsRegex = monthsRegex;\n  proto$1.monthsShortRegex = monthsShortRegex;\n  proto$1.week = localeWeek;\n  proto$1.firstDayOfYear = localeFirstDayOfYear;\n  proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n  proto$1.weekdays = localeWeekdays;\n  proto$1.weekdaysMin = localeWeekdaysMin;\n  proto$1.weekdaysShort = localeWeekdaysShort;\n  proto$1.weekdaysParse = localeWeekdaysParse;\n  proto$1.weekdaysRegex = weekdaysRegex;\n  proto$1.weekdaysShortRegex = weekdaysShortRegex;\n  proto$1.weekdaysMinRegex = weekdaysMinRegex;\n  proto$1.isPM = localeIsPM;\n  proto$1.meridiem = localeMeridiem;\n\n  function get$1(format, index, field, setter) {\n    var locale = getLocale(),\n        utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n  }\n\n  function listMonthsImpl(format, index, field) {\n    if (isNumber(format)) {\n      index = format;\n      format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n      return get$1(format, index, field, 'month');\n    }\n\n    var i,\n        out = [];\n\n    for (i = 0; i < 12; i++) {\n      out[i] = get$1(format, i, field, 'month');\n    }\n\n    return out;\n  } // ()\n  // (5)\n  // (fmt, 5)\n  // (fmt)\n  // (true)\n  // (true, 5)\n  // (true, fmt, 5)\n  // (true, fmt)\n\n\n  function listWeekdaysImpl(localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n      if (isNumber(format)) {\n        index = format;\n        format = undefined;\n      }\n\n      format = format || '';\n    } else {\n      format = localeSorted;\n      index = format;\n      localeSorted = false;\n\n      if (isNumber(format)) {\n        index = format;\n        format = undefined;\n      }\n\n      format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0,\n        i,\n        out = [];\n\n    if (index != null) {\n      return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    for (i = 0; i < 7; i++) {\n      out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n\n    return out;\n  }\n\n  function listMonths(format, index) {\n    return listMonthsImpl(format, index, 'months');\n  }\n\n  function listMonthsShort(format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n  }\n\n  function listWeekdays(localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n  }\n\n  function listWeekdaysShort(localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n  }\n\n  function listWeekdaysMin(localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n  }\n\n  getSetGlobalLocale('en', {\n    eras: [{\n      since: '0001-01-01',\n      until: +Infinity,\n      offset: 1,\n      name: 'Anno Domini',\n      narrow: 'AD',\n      abbr: 'AD'\n    }, {\n      since: '0000-12-31',\n      until: -Infinity,\n      offset: 1,\n      name: 'Before Christ',\n      narrow: 'BC',\n      abbr: 'BC'\n    }],\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal: function ordinal(number) {\n      var b = number % 10,\n          output = toInt(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    }\n  }); // Side effect imports\n\n  hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n  hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n  var mathAbs = Math.abs;\n\n  function abs() {\n    var data = this._data;\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days = mathAbs(this._days);\n    this._months = mathAbs(this._months);\n    data.milliseconds = mathAbs(data.milliseconds);\n    data.seconds = mathAbs(data.seconds);\n    data.minutes = mathAbs(data.minutes);\n    data.hours = mathAbs(data.hours);\n    data.months = mathAbs(data.months);\n    data.years = mathAbs(data.years);\n    return this;\n  }\n\n  function addSubtract$1(duration, input, value, direction) {\n    var other = createDuration(input, value);\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days += direction * other._days;\n    duration._months += direction * other._months;\n    return duration._bubble();\n  } // supports only 2.0-style add(1, 's') or add(duration)\n\n\n  function add$1(input, value) {\n    return addSubtract$1(this, input, value, 1);\n  } // supports only 2.0-style subtract(1, 's') or subtract(duration)\n\n\n  function subtract$1(input, value) {\n    return addSubtract$1(this, input, value, -1);\n  }\n\n  function absCeil(number) {\n    if (number < 0) {\n      return Math.floor(number);\n    } else {\n      return Math.ceil(number);\n    }\n  }\n\n  function bubble() {\n    var milliseconds = this._milliseconds,\n        days = this._days,\n        months = this._months,\n        data = this._data,\n        seconds,\n        minutes,\n        hours,\n        years,\n        monthsFromDays; // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n\n    if (!(milliseconds >= 0 && days >= 0 && months >= 0 || milliseconds <= 0 && days <= 0 && months <= 0)) {\n      milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n      days = 0;\n      months = 0;\n    } // The following code bubbles up values, see the tests for\n    // examples of what that means.\n\n\n    data.milliseconds = milliseconds % 1000;\n    seconds = absFloor(milliseconds / 1000);\n    data.seconds = seconds % 60;\n    minutes = absFloor(seconds / 60);\n    data.minutes = minutes % 60;\n    hours = absFloor(minutes / 60);\n    data.hours = hours % 24;\n    days += absFloor(hours / 24); // convert days to months\n\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year\n\n    years = absFloor(months / 12);\n    months %= 12;\n    data.days = days;\n    data.months = months;\n    data.years = years;\n    return this;\n  }\n\n  function daysToMonths(days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n  }\n\n  function monthsToDays(months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n  }\n\n  function as(units) {\n    if (!this.isValid()) {\n      return NaN;\n    }\n\n    var days,\n        months,\n        milliseconds = this._milliseconds;\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'quarter' || units === 'year') {\n      days = this._days + milliseconds / 864e5;\n      months = this._months + daysToMonths(days);\n\n      switch (units) {\n        case 'month':\n          return months;\n\n        case 'quarter':\n          return months / 3;\n\n        case 'year':\n          return months / 12;\n      }\n    } else {\n      // handle milliseconds separately because of floating point math errors (issue #1867)\n      days = this._days + Math.round(monthsToDays(this._months));\n\n      switch (units) {\n        case 'week':\n          return days / 7 + milliseconds / 6048e5;\n\n        case 'day':\n          return days + milliseconds / 864e5;\n\n        case 'hour':\n          return days * 24 + milliseconds / 36e5;\n\n        case 'minute':\n          return days * 1440 + milliseconds / 6e4;\n\n        case 'second':\n          return days * 86400 + milliseconds / 1000;\n        // Math.floor prevents floating point math errors here\n\n        case 'millisecond':\n          return Math.floor(days * 864e5) + milliseconds;\n\n        default:\n          throw new Error('Unknown unit ' + units);\n      }\n    }\n  } // TODO: Use this.as('ms')?\n\n\n  function valueOf$1() {\n    if (!this.isValid()) {\n      return NaN;\n    }\n\n    return this._milliseconds + this._days * 864e5 + this._months % 12 * 2592e6 + toInt(this._months / 12) * 31536e6;\n  }\n\n  function makeAs(alias) {\n    return function () {\n      return this.as(alias);\n    };\n  }\n\n  var asMilliseconds = makeAs('ms'),\n      asSeconds = makeAs('s'),\n      asMinutes = makeAs('m'),\n      asHours = makeAs('h'),\n      asDays = makeAs('d'),\n      asWeeks = makeAs('w'),\n      asMonths = makeAs('M'),\n      asQuarters = makeAs('Q'),\n      asYears = makeAs('y');\n\n  function clone$1() {\n    return createDuration(this);\n  }\n\n  function get$2(units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n  }\n\n  function makeGetter(name) {\n    return function () {\n      return this.isValid() ? this._data[name] : NaN;\n    };\n  }\n\n  var milliseconds = makeGetter('milliseconds'),\n      seconds = makeGetter('seconds'),\n      minutes = makeGetter('minutes'),\n      hours = makeGetter('hours'),\n      days = makeGetter('days'),\n      months = makeGetter('months'),\n      years = makeGetter('years');\n\n  function weeks() {\n    return absFloor(this.days() / 7);\n  }\n\n  var round = Math.round,\n      thresholds = {\n    ss: 44,\n    // a few seconds to seconds\n    s: 45,\n    // seconds to minute\n    m: 45,\n    // minutes to hour\n    h: 22,\n    // hours to day\n    d: 26,\n    // days to month/week\n    w: null,\n    // weeks to month\n    M: 11 // months to year\n\n  }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n\n  function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n  }\n\n  function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n    var duration = createDuration(posNegDuration).abs(),\n        seconds = round(duration.as('s')),\n        minutes = round(duration.as('m')),\n        hours = round(duration.as('h')),\n        days = round(duration.as('d')),\n        months = round(duration.as('M')),\n        weeks = round(duration.as('w')),\n        years = round(duration.as('y')),\n        a = seconds <= thresholds.ss && ['s', seconds] || seconds < thresholds.s && ['ss', seconds] || minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || days <= 1 && ['d'] || days < thresholds.d && ['dd', days];\n\n    if (thresholds.w != null) {\n      a = a || weeks <= 1 && ['w'] || weeks < thresholds.w && ['ww', weeks];\n    }\n\n    a = a || months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || years <= 1 && ['y'] || ['yy', years];\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n  } // This function allows you to set the rounding function for relative time strings\n\n\n  function getSetRelativeTimeRounding(roundingFunction) {\n    if (roundingFunction === undefined) {\n      return round;\n    }\n\n    if (typeof roundingFunction === 'function') {\n      round = roundingFunction;\n      return true;\n    }\n\n    return false;\n  } // This function allows you to set a threshold for relative time strings\n\n\n  function getSetRelativeTimeThreshold(threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n      return false;\n    }\n\n    if (limit === undefined) {\n      return thresholds[threshold];\n    }\n\n    thresholds[threshold] = limit;\n\n    if (threshold === 's') {\n      thresholds.ss = limit - 1;\n    }\n\n    return true;\n  }\n\n  function humanize(argWithSuffix, argThresholds) {\n    if (!this.isValid()) {\n      return this.localeData().invalidDate();\n    }\n\n    var withSuffix = false,\n        th = thresholds,\n        locale,\n        output;\n\n    if (_typeof(argWithSuffix) === 'object') {\n      argThresholds = argWithSuffix;\n      argWithSuffix = false;\n    }\n\n    if (typeof argWithSuffix === 'boolean') {\n      withSuffix = argWithSuffix;\n    }\n\n    if (_typeof(argThresholds) === 'object') {\n      th = Object.assign({}, thresholds, argThresholds);\n\n      if (argThresholds.s != null && argThresholds.ss == null) {\n        th.ss = argThresholds.s - 1;\n      }\n    }\n\n    locale = this.localeData();\n    output = relativeTime$1(this, !withSuffix, th, locale);\n\n    if (withSuffix) {\n      output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n  }\n\n  var abs$1 = Math.abs;\n\n  function sign(x) {\n    return (x > 0) - (x < 0) || +x;\n  }\n\n  function toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n      return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000,\n        days = abs$1(this._days),\n        months = abs$1(this._months),\n        minutes,\n        hours,\n        years,\n        s,\n        total = this.asSeconds(),\n        totalSign,\n        ymSign,\n        daysSign,\n        hmsSign;\n\n    if (!total) {\n      // this is the same as C#'s (Noda) and python (isodate)...\n      // but not other JS (goog.date)\n      return 'P0D';\n    } // 3600 seconds -> 60 minutes -> 1 hour\n\n\n    minutes = absFloor(seconds / 60);\n    hours = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60; // 12 months -> 1 year\n\n    years = absFloor(months / 12);\n    months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n\n    s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n    totalSign = total < 0 ? '-' : '';\n    ymSign = sign(this._months) !== sign(total) ? '-' : '';\n    daysSign = sign(this._days) !== sign(total) ? '-' : '';\n    hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n    return totalSign + 'P' + (years ? ymSign + years + 'Y' : '') + (months ? ymSign + months + 'M' : '') + (days ? daysSign + days + 'D' : '') + (hours || minutes || seconds ? 'T' : '') + (hours ? hmsSign + hours + 'H' : '') + (minutes ? hmsSign + minutes + 'M' : '') + (seconds ? hmsSign + s + 'S' : '');\n  }\n\n  var proto$2 = Duration.prototype;\n  proto$2.isValid = isValid$1;\n  proto$2.abs = abs;\n  proto$2.add = add$1;\n  proto$2.subtract = subtract$1;\n  proto$2.as = as;\n  proto$2.asMilliseconds = asMilliseconds;\n  proto$2.asSeconds = asSeconds;\n  proto$2.asMinutes = asMinutes;\n  proto$2.asHours = asHours;\n  proto$2.asDays = asDays;\n  proto$2.asWeeks = asWeeks;\n  proto$2.asMonths = asMonths;\n  proto$2.asQuarters = asQuarters;\n  proto$2.asYears = asYears;\n  proto$2.valueOf = valueOf$1;\n  proto$2._bubble = bubble;\n  proto$2.clone = clone$1;\n  proto$2.get = get$2;\n  proto$2.milliseconds = milliseconds;\n  proto$2.seconds = seconds;\n  proto$2.minutes = minutes;\n  proto$2.hours = hours;\n  proto$2.days = days;\n  proto$2.weeks = weeks;\n  proto$2.months = months;\n  proto$2.years = years;\n  proto$2.humanize = humanize;\n  proto$2.toISOString = toISOString$1;\n  proto$2.toString = toISOString$1;\n  proto$2.toJSON = toISOString$1;\n  proto$2.locale = locale;\n  proto$2.localeData = localeData;\n  proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n  proto$2.lang = lang; // FORMATTING\n\n  addFormatToken('X', 0, 0, 'unix');\n  addFormatToken('x', 0, 0, 'valueOf'); // PARSING\n\n  addRegexToken('x', matchSigned);\n  addRegexToken('X', matchTimestamp);\n  addParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input) * 1000);\n  });\n  addParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n  }); //! moment.js\n\n  hooks.version = '2.29.4';\n  setHookCallback(createLocal);\n  hooks.fn = proto;\n  hooks.min = min;\n  hooks.max = max;\n  hooks.now = now;\n  hooks.utc = createUTC;\n  hooks.unix = createUnix;\n  hooks.months = listMonths;\n  hooks.isDate = isDate;\n  hooks.locale = getSetGlobalLocale;\n  hooks.invalid = createInvalid;\n  hooks.duration = createDuration;\n  hooks.isMoment = isMoment;\n  hooks.weekdays = listWeekdays;\n  hooks.parseZone = createInZone;\n  hooks.localeData = getLocale;\n  hooks.isDuration = isDuration;\n  hooks.monthsShort = listMonthsShort;\n  hooks.weekdaysMin = listWeekdaysMin;\n  hooks.defineLocale = defineLocale;\n  hooks.updateLocale = updateLocale;\n  hooks.locales = listLocales;\n  hooks.weekdaysShort = listWeekdaysShort;\n  hooks.normalizeUnits = normalizeUnits;\n  hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n  hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n  hooks.calendarFormat = getCalendarFormat;\n  hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats\n\n  hooks.HTML5_FMT = {\n    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',\n    // <input type=\"datetime-local\" />\n    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',\n    // <input type=\"datetime-local\" step=\"1\" />\n    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',\n    // <input type=\"datetime-local\" step=\"0.001\" />\n    DATE: 'YYYY-MM-DD',\n    // <input type=\"date\" />\n    TIME: 'HH:mm',\n    // <input type=\"time\" />\n    TIME_SECONDS: 'HH:mm:ss',\n    // <input type=\"time\" step=\"1\" />\n    TIME_MS: 'HH:mm:ss.SSS',\n    // <input type=\"time\" step=\"0.001\" />\n    WEEK: 'GGGG-[W]WW',\n    // <input type=\"week\" />\n    MONTH: 'YYYY-MM' // <input type=\"month\" />\n\n  };\n  return hooks;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://rup/./node_modules/moment/moment.js?");

/***/ }),

/***/ "./node_modules/popper.js/dist/esm/popper.js":
/*!***************************************************!*\
  !*** ./node_modules/popper.js/dist/esm/popper.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      return 1;\n    }\n  }\n\n  return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n  var called = false;\n  return function () {\n    if (called) {\n      return;\n    }\n\n    called = true;\n    window.Promise.resolve().then(function () {\n      called = false;\n      fn();\n    });\n  };\n}\n\nfunction taskDebounce(fn) {\n  var scheduled = false;\n  return function () {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(function () {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\n\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\n\nfunction isFunction(functionToCheck) {\n  var getType = {};\n  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\n\n\nfunction getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  } // NOTE: 1 DOM access here\n\n\n  var window = element.ownerDocument.defaultView;\n  var css = window.getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\n\n\nfunction getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n\n  return element.parentNode || element.host;\n}\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\n\n\nfunction getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body;\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body;\n\n    case '#document':\n      return element.body;\n  } // Firefox want us to check `-x` and `-y` variations as well\n\n\n  var _getStyleComputedProp = getStyleComputedProperty(element),\n      overflow = _getStyleComputedProp.overflow,\n      overflowX = _getStyleComputedProp.overflowX,\n      overflowY = _getStyleComputedProp.overflowY;\n\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\n\n\nfunction getReferenceNode(reference) {\n  return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\n\nfunction isIE(version) {\n  if (version === 11) {\n    return isIE11;\n  }\n\n  if (version === 10) {\n    return isIE10;\n  }\n\n  return isIE11 || isIE10;\n}\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\n\n\nfunction getOffsetParent(element) {\n  if (!element) {\n    return document.documentElement;\n  }\n\n  var noOffsetParent = isIE(10) ? document.body : null; // NOTE: 1 DOM access here\n\n  var offsetParent = element.offsetParent || null; // Skip hidden elements which don't have an offsetParent\n\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\n    offsetParent = (element = element.nextElementSibling).offsetParent;\n  }\n\n  var nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    return element ? element.ownerDocument.documentElement : document.documentElement;\n  } // .offsetParent will return the closest TH, TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n\n\n  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY') {\n    return false;\n  }\n\n  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\n\n\nfunction getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\n\n\nfunction findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  } // Here we make sure to give as \"start\" the element that comes first in the DOM\n\n\n  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n  var start = order ? element1 : element2;\n  var end = order ? element2 : element1; // Get common ancestor container\n\n  var range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  var commonAncestorContainer = range.commonAncestorContainer; // Both nodes are inside #document\n\n  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  } // one of the nodes is inside shadowDOM, find which one\n\n\n  var element1root = getRoot(element1);\n\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\n\n\nfunction getScroll(element) {\n  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    var html = element.ownerDocument.documentElement;\n    var scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\n\n\nfunction includeScroll(rect, element) {\n  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  var scrollTop = getScroll(element, 'top');\n  var scrollLeft = getScroll(element, 'left');\n  var modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\n\nfunction getBordersSize(styles, axis) {\n  var sideA = axis === 'x' ? 'Left' : 'Top';\n  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n  return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n  var body = document.body;\n  var html = document.documentElement;\n  var computedStyle = isIE(10) && getComputedStyle(html);\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle)\n  };\n}\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar defineProperty = function defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\n\n\nfunction getClientRect(offsets) {\n  return _extends({}, offsets, {\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height\n  });\n}\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\n\n\nfunction getBoundingClientRect(element) {\n  var rect = {}; // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n\n  try {\n    if (isIE(10)) {\n      rect = element.getBoundingClientRect();\n      var scrollTop = getScroll(element, 'top');\n      var scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    } else {\n      rect = element.getBoundingClientRect();\n    }\n  } catch (e) {}\n\n  var result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top\n  }; // subtract scrollbar size from sizes\n\n  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n  var width = sizes.width || element.clientWidth || result.width;\n  var height = sizes.height || element.clientHeight || result.height;\n  var horizScrollbar = element.offsetWidth - width;\n  var vertScrollbar = element.offsetHeight - height; // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n\n  if (horizScrollbar || vertScrollbar) {\n    var styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  var isIE10 = isIE(10);\n  var isHTML = parent.nodeName === 'HTML';\n  var childrenRect = getBoundingClientRect(children);\n  var parentRect = getBoundingClientRect(parent);\n  var scrollParent = getScrollParent(children);\n  var styles = getStyleComputedProperty(parent);\n  var borderTopWidth = parseFloat(styles.borderTopWidth);\n  var borderLeftWidth = parseFloat(styles.borderLeftWidth); // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n\n  if (fixedPosition && isHTML) {\n    parentRect.top = Math.max(parentRect.top, 0);\n    parentRect.left = Math.max(parentRect.left, 0);\n  }\n\n  var offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0; // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n\n  if (!isIE10 && isHTML) {\n    var marginTop = parseFloat(styles.marginTop);\n    var marginLeft = parseFloat(styles.marginLeft);\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft; // Attach marginTop and marginLeft because in some circumstances we may need them\n\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  var html = element.ownerDocument.documentElement;\n  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  var width = Math.max(html.clientWidth, window.innerWidth || 0);\n  var height = Math.max(html.clientHeight, window.innerHeight || 0);\n  var scrollTop = !excludeScroll ? getScroll(html) : 0;\n  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n  var offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width: width,\n    height: height\n  };\n  return getClientRect(offset);\n}\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\n\n\nfunction isFixed(element) {\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n\n  var parentNode = getParentNode(element);\n\n  if (!parentNode) {\n    return false;\n  }\n\n  return isFixed(parentNode);\n}\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\n\nfunction getFixedPositionOffsetParent(element) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element || !element.parentElement || isIE()) {\n    return document.documentElement;\n  }\n\n  var el = element.parentElement;\n\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n    el = el.parentElement;\n  }\n\n  return el || document.documentElement;\n}\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\n\n\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; // NOTE: 1 DOM access here\n\n  var boundaries = {\n    top: 0,\n    left: 0\n  };\n  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); // Handle viewport case\n\n  if (boundariesElement === 'viewport') {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n  } else {\n    // Handle other cases based on DOM element used as boundaries\n    var boundariesNode = void 0;\n\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); // In case of HTML, we need a different computation\n\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n          height = _getWindowSizes.height,\n          width = _getWindowSizes.width;\n\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  } // Add paddings\n\n\n  padding = padding || 0;\n  var isPaddingNumber = typeof padding === 'number';\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n  boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n  return boundaries;\n}\n\nfunction getArea(_ref) {\n  var width = _ref.width,\n      height = _ref.height;\n  return width * height;\n}\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n  var rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height\n    }\n  };\n  var sortedAreas = Object.keys(rects).map(function (key) {\n    return _extends({\n      key: key\n    }, rects[key], {\n      area: getArea(rects[key])\n    });\n  }).sort(function (a, b) {\n    return b.area - a.area;\n  });\n  var filteredAreas = sortedAreas.filter(function (_ref2) {\n    var width = _ref2.width,\n        height = _ref2.height;\n    return width >= popper.clientWidth && height >= popper.clientHeight;\n  });\n  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n  var variation = placement.split('-')[1];\n  return computedPlacement + (variation ? '-' + variation : '');\n}\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\n\n\nfunction getReferenceOffsets(state, popper, reference) {\n  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\n\n\nfunction getOuterSizes(element) {\n  var window = element.ownerDocument.defaultView;\n  var styles = window.getComputedStyle(element);\n  var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n  var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n  var result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x\n  };\n  return result;\n}\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\n\n\nfunction getOppositePlacement(placement) {\n  var hash = {\n    left: 'right',\n    right: 'left',\n    bottom: 'top',\n    top: 'bottom'\n  };\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\n\n\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0]; // Get popper node sizes\n\n  var popperRect = getOuterSizes(popper); // Add position, width and height to our offsets object\n\n  var popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height\n  }; // depending by the popper placement we have to compute its offsets slightly differently\n\n  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  var mainSide = isHoriz ? 'top' : 'left';\n  var secondarySide = isHoriz ? 'left' : 'top';\n  var measurement = isHoriz ? 'height' : 'width';\n  var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\n\n\nfunction find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  } // use `filter` to obtain the same behavior of `find`\n\n\n  return arr.filter(check)[0];\n}\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\n\n\nfunction findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(function (cur) {\n      return cur[prop] === value;\n    });\n  } // use `find` + `indexOf` if `findIndex` isn't supported\n\n\n  var match = find(arr, function (obj) {\n    return obj[prop] === value;\n  });\n  return arr.indexOf(match);\n}\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\n\n\nfunction runModifiers(modifiers, data, ends) {\n  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n  modifiersToRun.forEach(function (modifier) {\n    if (modifier['function']) {\n      // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n\n    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n      data = fn(data, modifier);\n    }\n  });\n  return data;\n}\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\n\n\nfunction update() {\n  // if popper is destroyed, don't perform any further update\n  if (this.state.isDestroyed) {\n    return;\n  }\n\n  var data = {\n    instance: this,\n    styles: {},\n    arrowStyles: {},\n    attributes: {},\n    flipped: false,\n    offsets: {}\n  }; // compute reference element offsets\n\n  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n\n  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); // store the computed placement inside `originalPlacement`\n\n  data.originalPlacement = data.placement;\n  data.positionFixed = this.options.positionFixed; // compute the popper offsets\n\n  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; // run the modifiers\n\n  data = runModifiers(this.modifiers, data); // the first `update` will call `onCreate` callback\n  // the other ones will call `onUpdate` callback\n\n  if (!this.state.isCreated) {\n    this.state.isCreated = true;\n    this.options.onCreate(data);\n  } else {\n    this.options.onUpdate(data);\n  }\n}\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\n\n\nfunction isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(function (_ref) {\n    var name = _ref.name,\n        enabled = _ref.enabled;\n    return enabled && name === modifierName;\n  });\n}\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\n\n\nfunction getSupportedPropertyName(property) {\n  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (var i = 0; i < prefixes.length; i++) {\n    var prefix = prefixes[i];\n    var toCheck = prefix ? '' + prefix + upperProp : property;\n\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n\n  return null;\n}\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\n\n\nfunction destroy() {\n  this.state.isDestroyed = true; // touch DOM only if `applyStyle` modifier is enabled\n\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n    this.popper.removeAttribute('x-placement');\n    this.popper.style.position = '';\n    this.popper.style.top = '';\n    this.popper.style.left = '';\n    this.popper.style.right = '';\n    this.popper.style.bottom = '';\n    this.popper.style.willChange = '';\n    this.popper.style[getSupportedPropertyName('transform')] = '';\n  }\n\n  this.disableEventListeners(); // remove the popper if user explicitly asked for the deletion on destroy\n  // do not use `remove` because IE11 doesn't support it\n\n  if (this.options.removeOnDestroy) {\n    this.popper.parentNode.removeChild(this.popper);\n  }\n\n  return this;\n}\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\n\n\nfunction getWindow(element) {\n  var ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  var isBody = scrollParent.nodeName === 'BODY';\n  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, {\n    passive: true\n  });\n\n  if (!isBody) {\n    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n  }\n\n  scrollParents.push(target);\n}\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\n\n\nfunction setupEventListeners(reference, options, state, updateBound) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, {\n    passive: true\n  }); // Scroll event listener on scroll parents\n\n  var scrollElement = getScrollParent(reference);\n  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n  return state;\n}\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\n\n\nfunction enableEventListeners() {\n  if (!this.state.eventsEnabled) {\n    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n  }\n}\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\n\n\nfunction removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound); // Remove scroll event listener on scroll parents\n\n  state.scrollParents.forEach(function (target) {\n    target.removeEventListener('scroll', state.updateBound);\n  }); // Reset state\n\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\n\n\nfunction disableEventListeners() {\n  if (this.state.eventsEnabled) {\n    cancelAnimationFrame(this.scheduleUpdate);\n    this.state = removeEventListeners(this.reference, this.state);\n  }\n}\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\n\n\nfunction isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\n\n\nfunction setStyles(element, styles) {\n  Object.keys(styles).forEach(function (prop) {\n    var unit = ''; // add unit if the value is numeric and is one of the following\n\n    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n      unit = 'px';\n    }\n\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\n\n\nfunction setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function (prop) {\n    var value = attributes[prop];\n\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\n\n\nfunction applyStyle(data) {\n  // any property present in `data.styles` will be applied to the popper,\n  // in this way we can make the 3rd party modifiers add custom styles to it\n  // Be aware, modifiers could override the properties defined in the previous\n  // lines of this modifier!\n  setStyles(data.instance.popper, data.styles); // any property present in `data.attributes` will be applied to the popper,\n  // they will be set as HTML attributes of the element\n\n  setAttributes(data.instance.popper, data.attributes); // if arrowElement is defined and arrowStyles has some properties\n\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n    setStyles(data.arrowElement, data.arrowStyles);\n  }\n\n  return data;\n}\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\n\n\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n  // compute reference element offsets\n  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n\n  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n  popper.setAttribute('x-placement', placement); // Apply `position` to popper before anything else because\n  // without the position applied we can't guarantee correct computations\n\n  setStyles(popper, {\n    position: options.positionFixed ? 'fixed' : 'absolute'\n  });\n  return options;\n}\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\n\n\nfunction getRoundedOffsets(data, shouldRound) {\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n  var round = Math.round,\n      floor = Math.floor;\n\n  var noRound = function noRound(v) {\n    return v;\n  };\n\n  var referenceWidth = round(reference.width);\n  var popperWidth = round(popper.width);\n  var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n  var isVariation = data.placement.indexOf('-') !== -1;\n  var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n  var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n  var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n  var verticalToInteger = !shouldRound ? noRound : round;\n  return {\n    left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n    top: verticalToInteger(popper.top),\n    bottom: verticalToInteger(popper.bottom),\n    right: horizontalToInteger(popper.right)\n  };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\nfunction computeStyle(data, options) {\n  var x = options.x,\n      y = options.y;\n  var popper = data.offsets.popper; // Remove this legacy support in Popper.js v2\n\n  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'applyStyle';\n  }).gpuAcceleration;\n\n  if (legacyGpuAccelerationOption !== undefined) {\n    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n  }\n\n  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n  var offsetParent = getOffsetParent(data.instance.popper);\n  var offsetParentRect = getBoundingClientRect(offsetParent); // Styles\n\n  var styles = {\n    position: popper.position\n  };\n  var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n  var sideA = x === 'bottom' ? 'top' : 'bottom';\n  var sideB = y === 'right' ? 'left' : 'right'; // if gpuAcceleration is set to `true` and transform is supported,\n  //  we use `translate3d` to apply the position to the popper we\n  // automatically use the supported prefixed version if needed\n\n  var prefixedProperty = getSupportedPropertyName('transform'); // now, let's make a step back and look at this code closely (wtf?)\n  // If the content of the popper grows once it's been positioned, it\n  // may happen that the popper gets misplaced because of the new content\n  // overflowing its reference element\n  // To avoid this problem, we provide two options (x and y), which allow\n  // the consumer to define the offset origin.\n  // If we position a popper on top of a reference element, we can set\n  // `x` to `top` to make the popper grow towards its top instead of\n  // its bottom.\n\n  var left = void 0,\n      top = void 0;\n\n  if (sideA === 'bottom') {\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n    // and not the bottom of the html element\n    if (offsetParent.nodeName === 'HTML') {\n      top = -offsetParent.clientHeight + offsets.bottom;\n    } else {\n      top = -offsetParentRect.height + offsets.bottom;\n    }\n  } else {\n    top = offsets.top;\n  }\n\n  if (sideB === 'right') {\n    if (offsetParent.nodeName === 'HTML') {\n      left = -offsetParent.clientWidth + offsets.right;\n    } else {\n      left = -offsetParentRect.width + offsets.right;\n    }\n  } else {\n    left = offsets.left;\n  }\n\n  if (gpuAcceleration && prefixedProperty) {\n    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n    styles[sideA] = 0;\n    styles[sideB] = 0;\n    styles.willChange = 'transform';\n  } else {\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n    var invertTop = sideA === 'bottom' ? -1 : 1;\n    var invertLeft = sideB === 'right' ? -1 : 1;\n    styles[sideA] = top * invertTop;\n    styles[sideB] = left * invertLeft;\n    styles.willChange = sideA + ', ' + sideB;\n  } // Attributes\n\n\n  var attributes = {\n    'x-placement': data.placement\n  }; // Update `data` attributes, styles and arrowStyles\n\n  data.attributes = _extends({}, attributes, data.attributes);\n  data.styles = _extends({}, styles, data.styles);\n  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n  return data;\n}\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\n\n\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n  var requesting = find(modifiers, function (_ref) {\n    var name = _ref.name;\n    return name === requestingName;\n  });\n  var isRequired = !!requesting && modifiers.some(function (modifier) {\n    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n  });\n\n  if (!isRequired) {\n    var _requesting = '`' + requestingName + '`';\n\n    var requested = '`' + requestedName + '`';\n    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n  }\n\n  return isRequired;\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction arrow(data, options) {\n  var _data$offsets$arrow; // arrow depends on keepTogether in order to work\n\n\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n    return data;\n  }\n\n  var arrowElement = options.element; // if arrowElement is a string, suppose it's a CSS selector\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = data.instance.popper.querySelector(arrowElement); // if arrowElement is not found, don't run the modifier\n\n    if (!arrowElement) {\n      return data;\n    }\n  } else {\n    // if the arrowElement isn't a query selector we must check that the\n    // provided DOM node is child of its popper node\n    if (!data.instance.popper.contains(arrowElement)) {\n      console.warn('WARNING: `arrow.element` must be child of its popper element!');\n      return data;\n    }\n  }\n\n  var placement = data.placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n  var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n  var len = isVertical ? 'height' : 'width';\n  var sideCapitalized = isVertical ? 'Top' : 'Left';\n  var side = sideCapitalized.toLowerCase();\n  var altSide = isVertical ? 'left' : 'top';\n  var opSide = isVertical ? 'bottom' : 'right';\n  var arrowElementSize = getOuterSizes(arrowElement)[len]; //\n  // extends keepTogether behavior making sure the popper and its\n  // reference have enough pixels in conjunction\n  //\n  // top/left side\n\n  if (reference[opSide] - arrowElementSize < popper[side]) {\n    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n  } // bottom/right side\n\n\n  if (reference[side] + arrowElementSize > popper[opSide]) {\n    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n  }\n\n  data.offsets.popper = getClientRect(data.offsets.popper); // compute center of the popper\n\n  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; // Compute the sideValue using the updated popper offsets\n  // take popper margin in account because we don't have this info available\n\n  var css = getStyleComputedProperty(data.instance.popper);\n  var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; // prevent arrowElement from being placed not contiguously to its popper\n\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n  data.arrowElement = arrowElement;\n  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n  return data;\n}\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\n\n\nfunction getOppositeVariation(variation) {\n  if (variation === 'end') {\n    return 'start';\n  } else if (variation === 'start') {\n    return 'end';\n  }\n\n  return variation;\n}\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\n\n\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; // Get rid of `auto` `auto-start` and `auto-end`\n\nvar validPlacements = placements.slice(3);\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\n\nfunction clockwise(placement) {\n  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  var index = validPlacements.indexOf(placement);\n  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n  return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n  FLIP: 'flip',\n  CLOCKWISE: 'clockwise',\n  COUNTERCLOCKWISE: 'counterclockwise'\n};\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\nfunction flip(data, options) {\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n    return data;\n  }\n\n  if (data.flipped && data.placement === data.originalPlacement) {\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n    return data;\n  }\n\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n  var placement = data.placement.split('-')[0];\n  var placementOpposite = getOppositePlacement(placement);\n  var variation = data.placement.split('-')[1] || '';\n  var flipOrder = [];\n\n  switch (options.behavior) {\n    case BEHAVIORS.FLIP:\n      flipOrder = [placement, placementOpposite];\n      break;\n\n    case BEHAVIORS.CLOCKWISE:\n      flipOrder = clockwise(placement);\n      break;\n\n    case BEHAVIORS.COUNTERCLOCKWISE:\n      flipOrder = clockwise(placement, true);\n      break;\n\n    default:\n      flipOrder = options.behavior;\n  }\n\n  flipOrder.forEach(function (step, index) {\n    if (placement !== step || flipOrder.length === index + 1) {\n      return data;\n    }\n\n    placement = data.placement.split('-')[0];\n    placementOpposite = getOppositePlacement(placement);\n    var popperOffsets = data.offsets.popper;\n    var refOffsets = data.offsets.reference; // using floor because the reference offsets may contain decimals we are not going to consider here\n\n    var floor = Math.floor;\n    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; // flip the variation if required\n\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; // flips variation if reference element overflows boundaries\n\n    var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); // flips variation if popper content overflows boundaries\n\n    var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n    var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\n      // this boolean to detect any flip loop\n      data.flipped = true;\n\n      if (overlapsRef || overflowsBoundaries) {\n        placement = flipOrder[index + 1];\n      }\n\n      if (flippedVariation) {\n        variation = getOppositeVariation(variation);\n      }\n\n      data.placement = placement + (variation ? '-' + variation : ''); // this object contains `position`, we want to preserve it along with\n      // any additional property we may add in the future\n\n      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n      data = runModifiers(data.instance.modifiers, data, 'flip');\n    }\n  });\n  return data;\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction keepTogether(data) {\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n  var placement = data.placement.split('-')[0];\n  var floor = Math.floor;\n  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n  var side = isVertical ? 'right' : 'bottom';\n  var opSide = isVertical ? 'left' : 'top';\n  var measurement = isVertical ? 'width' : 'height';\n\n  if (popper[side] < floor(reference[opSide])) {\n    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n  }\n\n  if (popper[opSide] > floor(reference[side])) {\n    data.offsets.popper[opSide] = floor(reference[side]);\n  }\n\n  return data;\n}\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\n\n\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n  // separate value from unit\n  var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n  var value = +split[1];\n  var unit = split[2]; // If it's not a number it's an operator, I guess\n\n  if (!value) {\n    return str;\n  }\n\n  if (unit.indexOf('%') === 0) {\n    var element = void 0;\n\n    switch (unit) {\n      case '%p':\n        element = popperOffsets;\n        break;\n\n      case '%':\n      case '%r':\n      default:\n        element = referenceOffsets;\n    }\n\n    var rect = getClientRect(element);\n    return rect[measurement] / 100 * value;\n  } else if (unit === 'vh' || unit === 'vw') {\n    // if is a vh or vw, we calculate the size based on the viewport\n    var size = void 0;\n\n    if (unit === 'vh') {\n      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n    } else {\n      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n    }\n\n    return size / 100 * value;\n  } else {\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\n    // if is an implicit unit, it's px, and we return just the value\n    return value;\n  }\n}\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\n\n\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n  var offsets = [0, 0]; // Use height if placement is left or right and index is 0 otherwise use width\n  // in this way the first offset will use an axis and the second one\n  // will use the other one\n\n  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; // Split the offset string to obtain a list of values and operands\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n\n  var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n    return frag.trim();\n  }); // Detect if the offset string contains a pair of values or a single one\n  // they could be separated by comma or space\n\n  var divider = fragments.indexOf(find(fragments, function (frag) {\n    return frag.search(/,|\\s/) !== -1;\n  }));\n\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n  } // If divider is found, we divide the list of values and operands to divide\n  // them by ofset X and Y.\n\n\n  var splitRegex = /\\s*,\\s*|\\s+/;\n  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; // Convert the values with units to absolute pixels to allow our computations\n\n  ops = ops.map(function (op, index) {\n    // Most of the units rely on the orientation of the popper\n    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n    var mergeWithPrevious = false;\n    return op // This aggregates any `+` or `-` sign that aren't considered operators\n    // e.g.: 10 + +5 => [10, +, +5]\n    .reduce(function (a, b) {\n      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n        a[a.length - 1] = b;\n        mergeWithPrevious = true;\n        return a;\n      } else if (mergeWithPrevious) {\n        a[a.length - 1] += b;\n        mergeWithPrevious = false;\n        return a;\n      } else {\n        return a.concat(b);\n      }\n    }, []) // Here we convert the string values into number values (in px)\n    .map(function (str) {\n      return toValue(str, measurement, popperOffsets, referenceOffsets);\n    });\n  }); // Loop trough the offsets arrays and execute the operations\n\n  ops.forEach(function (op, index) {\n    op.forEach(function (frag, index2) {\n      if (isNumeric(frag)) {\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n      }\n    });\n  });\n  return offsets;\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction offset(data, _ref) {\n  var offset = _ref.offset;\n  var placement = data.placement,\n      _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n  var basePlacement = placement.split('-')[0];\n  var offsets = void 0;\n\n  if (isNumeric(+offset)) {\n    offsets = [+offset, 0];\n  } else {\n    offsets = parseOffset(offset, popper, reference, basePlacement);\n  }\n\n  if (basePlacement === 'left') {\n    popper.top += offsets[0];\n    popper.left -= offsets[1];\n  } else if (basePlacement === 'right') {\n    popper.top += offsets[0];\n    popper.left += offsets[1];\n  } else if (basePlacement === 'top') {\n    popper.left += offsets[0];\n    popper.top -= offsets[1];\n  } else if (basePlacement === 'bottom') {\n    popper.left += offsets[0];\n    popper.top += offsets[1];\n  }\n\n  data.popper = popper;\n  return data;\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction preventOverflow(data, options) {\n  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); // If offsetParent is the reference element, we really want to\n  // go one step up and use the next offsetParent as reference to\n  // avoid to make this modifier completely useless and look like broken\n\n  if (data.instance.reference === boundariesElement) {\n    boundariesElement = getOffsetParent(boundariesElement);\n  } // NOTE: DOM access here\n  // resets the popper's position so that the document size can be calculated excluding\n  // the size of the popper element itself\n\n\n  var transformProp = getSupportedPropertyName('transform');\n  var popperStyles = data.instance.popper.style; // assignment to help minification\n\n  var top = popperStyles.top,\n      left = popperStyles.left,\n      transform = popperStyles[transformProp];\n  popperStyles.top = '';\n  popperStyles.left = '';\n  popperStyles[transformProp] = '';\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); // NOTE: DOM access here\n  // restores the original style properties after the offsets have been computed\n\n  popperStyles.top = top;\n  popperStyles.left = left;\n  popperStyles[transformProp] = transform;\n  options.boundaries = boundaries;\n  var order = options.priority;\n  var popper = data.offsets.popper;\n  var check = {\n    primary: function primary(placement) {\n      var value = popper[placement];\n\n      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n        value = Math.max(popper[placement], boundaries[placement]);\n      }\n\n      return defineProperty({}, placement, value);\n    },\n    secondary: function secondary(placement) {\n      var mainSide = placement === 'right' ? 'left' : 'top';\n      var value = popper[mainSide];\n\n      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n      }\n\n      return defineProperty({}, mainSide, value);\n    }\n  };\n  order.forEach(function (placement) {\n    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n    popper = _extends({}, popper, check[side](placement));\n  });\n  data.offsets.popper = popper;\n  return data;\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction shift(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var shiftvariation = placement.split('-')[1]; // if shift shiftvariation is specified, run the modifier\n\n  if (shiftvariation) {\n    var _data$offsets = data.offsets,\n        reference = _data$offsets.reference,\n        popper = _data$offsets.popper;\n    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n    var side = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n    var shiftOffsets = {\n      start: defineProperty({}, side, reference[side]),\n      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n    };\n    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n  }\n\n  return data;\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction hide(data) {\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n    return data;\n  }\n\n  var refRect = data.offsets.reference;\n  var bound = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'preventOverflow';\n  }).boundaries;\n\n  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === true) {\n      return data;\n    }\n\n    data.hide = true;\n    data.attributes['x-out-of-boundaries'] = '';\n  } else {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === false) {\n      return data;\n    }\n\n    data.hide = false;\n    data.attributes['x-out-of-boundaries'] = false;\n  }\n\n  return data;\n}\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n\n\nfunction inner(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n  data.placement = getOppositePlacement(placement);\n  data.offsets.popper = getClientRect(popper);\n  return data;\n}\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\n\n\nvar modifiers = {\n  /**\n   * Modifier used to shift the popper on the start or end of its reference\n   * element.<br />\n   * It will read the variation of the `placement` property.<br />\n   * It can be one either `-end` or `-start`.\n   * @memberof modifiers\n   * @inner\n   */\n  shift: {\n    /** @prop {number} order=100 - Index used to define the order of execution */\n    order: 100,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: shift\n  },\n\n  /**\n   * The `offset` modifier can shift your popper on both its axis.\n   *\n   * It accepts the following units:\n   * - `px` or unit-less, interpreted as pixels\n   * - `%` or `%r`, percentage relative to the length of the reference element\n   * - `%p`, percentage relative to the length of the popper element\n   * - `vw`, CSS viewport width unit\n   * - `vh`, CSS viewport height unit\n   *\n   * For length is intended the main axis relative to the placement of the popper.<br />\n   * This means that if the placement is `top` or `bottom`, the length will be the\n   * `width`. In case of `left` or `right`, it will be the `height`.\n   *\n   * You can provide a single value (as `Number` or `String`), or a pair of values\n   * as `String` divided by a comma or one (or more) white spaces.<br />\n   * The latter is a deprecated method because it leads to confusion and will be\n   * removed in v2.<br />\n   * Additionally, it accepts additions and subtractions between different units.\n   * Note that multiplications and divisions aren't supported.\n   *\n   * Valid examples are:\n   * ```\n   * 10\n   * '10%'\n   * '10, 10'\n   * '10%, 10'\n   * '10 + 10%'\n   * '10 - 5vh + 3%'\n   * '-10px + 5vh, 5px - 6%'\n   * ```\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  offset: {\n    /** @prop {number} order=200 - Index used to define the order of execution */\n    order: 200,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: offset,\n\n    /** @prop {Number|String} offset=0\n     * The offset value as described in the modifier description\n     */\n    offset: 0\n  },\n\n  /**\n   * Modifier used to prevent the popper from being positioned outside the boundary.\n   *\n   * A scenario exists where the reference itself is not within the boundaries.<br />\n   * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n   * In this case we need to decide whether the popper should either:\n   *\n   * - detach from the reference and remain \"trapped\" in the boundaries, or\n   * - if it should ignore the boundary and \"escape with its reference\"\n   *\n   * When `escapeWithReference` is set to`true` and reference is completely\n   * outside its boundaries, the popper will overflow (or completely leave)\n   * the boundaries in order to remain attached to the edge of the reference.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  preventOverflow: {\n    /** @prop {number} order=300 - Index used to define the order of execution */\n    order: 300,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: preventOverflow,\n\n    /**\n     * @prop {Array} [priority=['left','right','top','bottom']]\n     * Popper will try to prevent overflow following these priorities by default,\n     * then, it could overflow on the left and on top of the `boundariesElement`\n     */\n    priority: ['left', 'right', 'top', 'bottom'],\n\n    /**\n     * @prop {number} padding=5\n     * Amount of pixel used to define a minimum distance between the boundaries\n     * and the popper. This makes sure the popper always has a little padding\n     * between the edges of its container\n     */\n    padding: 5,\n\n    /**\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n     * `viewport` or any DOM element.\n     */\n    boundariesElement: 'scrollParent'\n  },\n\n  /**\n   * Modifier used to make sure the reference and its popper stay near each other\n   * without leaving any gap between the two. Especially useful when the arrow is\n   * enabled and you want to ensure that it points to its reference element.\n   * It cares only about the first axis. You can still have poppers with margin\n   * between the popper and its reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  keepTogether: {\n    /** @prop {number} order=400 - Index used to define the order of execution */\n    order: 400,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: keepTogether\n  },\n\n  /**\n   * This modifier is used to move the `arrowElement` of the popper to make\n   * sure it is positioned between the reference element and its popper element.\n   * It will read the outer size of the `arrowElement` node to detect how many\n   * pixels of conjunction are needed.\n   *\n   * It has no effect if no `arrowElement` is provided.\n   * @memberof modifiers\n   * @inner\n   */\n  arrow: {\n    /** @prop {number} order=500 - Index used to define the order of execution */\n    order: 500,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: arrow,\n\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n    element: '[x-arrow]'\n  },\n\n  /**\n   * Modifier used to flip the popper's placement when it starts to overlap its\n   * reference element.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   *\n   * **NOTE:** this modifier will interrupt the current update cycle and will\n   * restart it if it detects the need to flip the placement.\n   * @memberof modifiers\n   * @inner\n   */\n  flip: {\n    /** @prop {number} order=600 - Index used to define the order of execution */\n    order: 600,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: flip,\n\n    /**\n     * @prop {String|Array} behavior='flip'\n     * The behavior used to change the popper's placement. It can be one of\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n     * placements (with optional variations)\n     */\n    behavior: 'flip',\n\n    /**\n     * @prop {number} padding=5\n     * The popper will flip if it hits the edges of the `boundariesElement`\n     */\n    padding: 5,\n\n    /**\n     * @prop {String|HTMLElement} boundariesElement='viewport'\n     * The element which will define the boundaries of the popper position.\n     * The popper will never be placed outside of the defined boundaries\n     * (except if `keepTogether` is enabled)\n     */\n    boundariesElement: 'viewport',\n\n    /**\n     * @prop {Boolean} flipVariations=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the reference element overlaps its boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariations: false,\n\n    /**\n     * @prop {Boolean} flipVariationsByContent=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the popper element overlaps its reference boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariationsByContent: false\n  },\n\n  /**\n   * Modifier used to make the popper flow toward the inner of the reference element.\n   * By default, when this modifier is disabled, the popper will be placed outside\n   * the reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  inner: {\n    /** @prop {number} order=700 - Index used to define the order of execution */\n    order: 700,\n\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n    enabled: false,\n\n    /** @prop {ModifierFn} */\n    fn: inner\n  },\n\n  /**\n   * Modifier used to hide the popper when its reference element is outside of the\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n   * be used to hide with a CSS selector the popper when its reference is\n   * out of boundaries.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   * @memberof modifiers\n   * @inner\n   */\n  hide: {\n    /** @prop {number} order=800 - Index used to define the order of execution */\n    order: 800,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: hide\n  },\n\n  /**\n   * Computes the style that will be applied to the popper element to gets\n   * properly positioned.\n   *\n   * Note that this modifier will not touch the DOM, it just prepares the styles\n   * so that `applyStyle` modifier can apply it. This separation is useful\n   * in case you need to replace `applyStyle` with a custom implementation.\n   *\n   * This modifier has `850` as `order` value to maintain backward compatibility\n   * with previous versions of Popper.js. Expect the modifiers ordering method\n   * to change in future major versions of the library.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  computeStyle: {\n    /** @prop {number} order=850 - Index used to define the order of execution */\n    order: 850,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: computeStyle,\n\n    /**\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: true,\n\n    /**\n     * @prop {string} [x='bottom']\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n     * Change this if your popper should grow in a direction different from `bottom`\n     */\n    x: 'bottom',\n\n    /**\n     * @prop {string} [x='left']\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n     * Change this if your popper should grow in a direction different from `right`\n     */\n    y: 'right'\n  },\n\n  /**\n   * Applies the computed styles to the popper element.\n   *\n   * All the DOM manipulations are limited to this modifier. This is useful in case\n   * you want to integrate Popper.js inside a framework or view library and you\n   * want to delegate all the DOM manipulations to it.\n   *\n   * Note that if you disable this modifier, you must make sure the popper element\n   * has its position set to `absolute` before Popper.js can do its work!\n   *\n   * Just disable this modifier and define your own to achieve the desired effect.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  applyStyle: {\n    /** @prop {number} order=900 - Index used to define the order of execution */\n    order: 900,\n\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n\n    /** @prop {ModifierFn} */\n    fn: applyStyle,\n\n    /** @prop {Function} */\n    onLoad: applyStyleOnLoad,\n\n    /**\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: undefined\n  }\n};\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n *   modifiers: {\n *     preventOverflow: { enabled: false }\n *   }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\n\nvar Defaults = {\n  /**\n   * Popper's placement.\n   * @prop {Popper.placements} placement='bottom'\n   */\n  placement: 'bottom',\n\n  /**\n   * Set this to true if you want popper to position it self in 'fixed' mode\n   * @prop {Boolean} positionFixed=false\n   */\n  positionFixed: false,\n\n  /**\n   * Whether events (resize, scroll) are initially enabled.\n   * @prop {Boolean} eventsEnabled=true\n   */\n  eventsEnabled: true,\n\n  /**\n   * Set to true if you want to automatically remove the popper when\n   * you call the `destroy` method.\n   * @prop {Boolean} removeOnDestroy=false\n   */\n  removeOnDestroy: false,\n\n  /**\n   * Callback called when the popper is created.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onCreate}\n   */\n  onCreate: function onCreate() {},\n\n  /**\n   * Callback called when the popper is updated. This callback is not called\n   * on the initialization/creation of the popper, but only on subsequent\n   * updates.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onUpdate}\n   */\n  onUpdate: function onUpdate() {},\n\n  /**\n   * List of modifiers used to modify the offsets before they are applied to the popper.\n   * They provide most of the functionalities of Popper.js.\n   * @prop {modifiers}\n   */\n  modifiers: modifiers\n};\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n// Utils\n// Methods\n\nvar Popper = function () {\n  /**\n   * Creates a new Popper.js instance.\n   * @class Popper\n   * @param {Element|referenceObject} reference - The reference element used to position the popper\n   * @param {Element} popper - The HTML / XML element used as the popper\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n   * @return {Object} instance - The generated Popper.js instance\n   */\n  function Popper(reference, popper) {\n    var _this = this;\n\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    classCallCheck(this, Popper);\n\n    this.scheduleUpdate = function () {\n      return requestAnimationFrame(_this.update);\n    }; // make update() debounced, so that it only runs at most once-per-tick\n\n\n    this.update = debounce(this.update.bind(this)); // with {} we create a new object with the options inside it\n\n    this.options = _extends({}, Popper.Defaults, options); // init state\n\n    this.state = {\n      isDestroyed: false,\n      isCreated: false,\n      scrollParents: []\n    }; // get reference and popper elements (allow jQuery wrappers)\n\n    this.reference = reference && reference.jquery ? reference[0] : reference;\n    this.popper = popper && popper.jquery ? popper[0] : popper; // Deep merge modifiers options\n\n    this.options.modifiers = {};\n    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n    }); // Refactoring modifiers' list (Object => Array)\n\n    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n      return _extends({\n        name: name\n      }, _this.options.modifiers[name]);\n    }) // sort the modifiers by order\n    .sort(function (a, b) {\n      return a.order - b.order;\n    }); // modifiers have the ability to execute arbitrary code when Popper.js get inited\n    // such code is executed in the same order of its modifier\n    // they could add new properties to their options configuration\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n\n    this.modifiers.forEach(function (modifierOptions) {\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n      }\n    }); // fire the first update to position the popper in the right place\n\n    this.update();\n    var eventsEnabled = this.options.eventsEnabled;\n\n    if (eventsEnabled) {\n      // setup event listeners, they will take care of update the position in specific situations\n      this.enableEventListeners();\n    }\n\n    this.state.eventsEnabled = eventsEnabled;\n  } // We can't use class properties because they don't get listed in the\n  // class prototype and break stuff like Sinon stubs\n\n\n  createClass(Popper, [{\n    key: 'update',\n    value: function update$$1() {\n      return update.call(this);\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy$$1() {\n      return destroy.call(this);\n    }\n  }, {\n    key: 'enableEventListeners',\n    value: function enableEventListeners$$1() {\n      return enableEventListeners.call(this);\n    }\n  }, {\n    key: 'disableEventListeners',\n    value: function disableEventListeners$$1() {\n      return disableEventListeners.call(this);\n    }\n    /**\n     * Schedules an update. It will run on the next UI update available.\n     * @method scheduleUpdate\n     * @memberof Popper\n     */\n\n    /**\n     * Collection of utilities useful when writing custom modifiers.\n     * Starting from version 1.7, this method is available only if you\n     * include `popper-utils.js` before `popper.js`.\n     *\n     * **DEPRECATION**: This way to access PopperUtils is deprecated\n     * and will be removed in v2! Use the PopperUtils module directly instead.\n     * Due to the high instability of the methods contained in Utils, we can't\n     * guarantee them to follow semver. Use them at your own risk!\n     * @static\n     * @private\n     * @type {Object}\n     * @deprecated since version 1.8\n     * @member Utils\n     * @memberof Popper\n     */\n\n  }]);\n  return Popper;\n}();\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Popper);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./node_modules/popper.js/dist/esm/popper.js?");

/***/ }),

/***/ "./node_modules/printd/index.js":
/*!**************************************!*\
  !*** ./node_modules/printd/index.js ***!
  \**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Printd = exports.createIFrame = exports.createLinkStyle = exports.createStyle = void 0;\nvar URL_LONG = /^(((http[s]?)|file):)?(\\/\\/)+([0-9a-zA-Z-_.=?&].+)$/;\nvar URL_SHORT = /^((\\.|\\.\\.)?\\/)([0-9a-zA-Z-_.=?&]+\\/)*([0-9a-zA-Z-_.=?&]+)$/;\n\nvar isValidURL = function isValidURL(str) {\n  return URL_LONG.test(str) || URL_SHORT.test(str);\n};\n\nfunction createStyle(doc, cssText) {\n  var style = doc.createElement(\"style\");\n  style.appendChild(doc.createTextNode(cssText));\n  return style;\n}\n\nexports.createStyle = createStyle;\n\nfunction createLinkStyle(doc, url) {\n  var style = doc.createElement(\"link\");\n  style.type = \"text/css\";\n  style.rel = \"stylesheet\";\n  style.href = url;\n  return style;\n}\n\nexports.createLinkStyle = createLinkStyle;\n\nfunction createIFrame(parent) {\n  var el = window.document.createElement(\"iframe\");\n  el.setAttribute(\"src\", \"about:blank\");\n  el.setAttribute(\"style\", \"visibility:hidden;width:0;height:0;position:absolute;z-index:-9999;bottom:0;\");\n  el.setAttribute(\"width\", \"0\");\n  el.setAttribute(\"height\", \"0\");\n  el.setAttribute(\"wmode\", \"opaque\");\n  parent.appendChild(el);\n  return el;\n}\n\nexports.createIFrame = createIFrame;\nvar DEFAULT_OPTIONS = {\n  parent: window.document.body,\n  headElements: [],\n  bodyElements: []\n};\n/** Printd class that prints HTML elements in a blank document */\n\nvar Printd =\n/** @class */\nfunction () {\n  function Printd(options) {\n    this.isLoading = false;\n    this.hasEvents = false; // IE 11+ \"Object.assign\" polyfill\n\n    this.opts = [DEFAULT_OPTIONS, options || {}].reduce(function (a, b) {\n      Object.keys(b).forEach(function (k) {\n        return a[k] = b[k];\n      });\n      return a;\n    }, {});\n    this.iframe = createIFrame(this.opts.parent);\n  }\n  /** Gets current Iframe reference */\n\n\n  Printd.prototype.getIFrame = function () {\n    return this.iframe;\n  };\n  /**\n   * Print an HTMLElement\n   *\n   * @param el HTMLElement\n   * @param styles Optional styles (css texts or urls) that will add to iframe document.head\n   * @param scripts Optional scripts (script texts or urls) that will add to iframe document.body\n   * @param callback Optional callback that will be triggered when content is ready to print\n   */\n\n\n  Printd.prototype.print = function (el, styles, scripts, callback) {\n    if (this.isLoading) return;\n    var _a = this.iframe,\n        contentDocument = _a.contentDocument,\n        contentWindow = _a.contentWindow;\n    if (!contentDocument || !contentWindow) return;\n    this.iframe.src = \"about:blank\";\n    this.elCopy = el.cloneNode(true);\n    if (!this.elCopy) return;\n    this.isLoading = true;\n    this.callback = callback;\n    var doc = contentWindow.document;\n    doc.open();\n    doc.write('<!DOCTYPE html><html><head><meta charset=\"utf-8\"></head><body></body></html>');\n    this.addEvents(); // 1. append custom elements\n\n    var _b = this.opts,\n        headElements = _b.headElements,\n        bodyElements = _b.bodyElements; // 1.1 append custom head elements\n\n    if (Array.isArray(headElements)) {\n      headElements.forEach(function (el) {\n        return doc.head.appendChild(el);\n      });\n    } // 1.1 append custom body elements\n\n\n    if (Array.isArray(bodyElements)) {\n      bodyElements.forEach(function (el) {\n        return doc.body.appendChild(el);\n      });\n    } // 2. append custom styles\n\n\n    if (Array.isArray(styles)) {\n      styles.forEach(function (value) {\n        if (value) {\n          doc.head.appendChild(isValidURL(value) ? createLinkStyle(doc, value) : createStyle(doc, value));\n        }\n      });\n    } // 3. append element copy\n\n\n    doc.body.appendChild(this.elCopy); // 4. append custom scripts\n\n    if (Array.isArray(scripts)) {\n      scripts.forEach(function (value) {\n        if (value) {\n          var script = doc.createElement(\"script\");\n\n          if (isValidURL(value)) {\n            script.src = value;\n          } else {\n            script.innerText = value;\n          }\n\n          doc.body.appendChild(script);\n        }\n      });\n    }\n\n    doc.close();\n  };\n  /**\n   * Print an URL\n   *\n   * @param url URL to print\n   * @param callback Optional callback that will be triggered when content is ready to print\n   */\n\n\n  Printd.prototype.printURL = function (url, callback) {\n    if (this.isLoading) return;\n    this.addEvents();\n    this.isLoading = true;\n    this.callback = callback;\n    this.iframe.src = url;\n  };\n\n  Printd.prototype.launchPrint = function (contentWindow) {\n    if (!this.isLoading) {\n      contentWindow.print();\n    }\n  };\n\n  Printd.prototype.addEvents = function () {\n    var _this = this;\n\n    if (!this.hasEvents) {\n      this.hasEvents = true;\n      this.iframe.addEventListener(\"load\", function () {\n        return _this.onLoad();\n      }, false);\n    }\n  };\n\n  Printd.prototype.onLoad = function () {\n    var _this = this;\n\n    if (this.iframe) {\n      this.isLoading = false;\n      var _a = this.iframe,\n          contentDocument = _a.contentDocument,\n          contentWindow_1 = _a.contentWindow;\n      if (!contentDocument || !contentWindow_1) return;\n\n      if (typeof this.callback === \"function\") {\n        this.callback({\n          iframe: this.iframe,\n          element: this.elCopy,\n          launchPrint: function launchPrint() {\n            return _this.launchPrint(contentWindow_1);\n          }\n        });\n      } else {\n        this.launchPrint(contentWindow_1);\n      }\n    }\n  };\n\n  return Printd;\n}();\n\nexports.Printd = Printd;\nexports[\"default\"] = Printd;\n\n//# sourceURL=webpack://rup/./node_modules/printd/index.js?");

/***/ }),

/***/ "./node_modules/qtip2/dist/jquery.qtip.js":
/*!************************************************!*\
  !*** ./node_modules/qtip2/dist/jquery.qtip.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\n * qTip2 - Pretty powerful tooltips - v3.0.3\n * http://qtip2.com\n *\n * Copyright (c) 2016 \n * Released under the MIT licenses\n * http://jquery.org/license\n *\n * Date: Wed May 11 2016 10:31 GMT+0100+0100\n * Plugins: tips modal viewport svg imagemap ie6\n * Styles: core basic css3\n */\n\n/*global window: false, jQuery: false, console: false, define: false */\n\n/* Cache window, document, undefined */\n(function (window, document, undefined) {\n  // Uses AMD or browser globals to create a jQuery plugin.\n  (function (factory) {\n    \"use strict\";\n\n    if (true) {\n      !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    } else {}\n  })(function ($) {\n    \"use strict\"; // Enable ECMAScript \"strict\" operation for this function. See more: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/\n\n    ; // Munge the primitives - Paul Irish tip\n\n    var TRUE = true,\n        FALSE = false,\n        NULL = null,\n        // Common variables\n    X = 'x',\n        Y = 'y',\n        WIDTH = 'width',\n        HEIGHT = 'height',\n        // Positioning sides\n    TOP = 'top',\n        LEFT = 'left',\n        BOTTOM = 'bottom',\n        RIGHT = 'right',\n        CENTER = 'center',\n        // Position adjustment types\n    FLIP = 'flip',\n        FLIPINVERT = 'flipinvert',\n        SHIFT = 'shift',\n        // Shortcut vars\n    QTIP,\n        PROTOTYPE,\n        CORNER,\n        CHECKS,\n        PLUGINS = {},\n        NAMESPACE = 'qtip',\n        ATTR_HAS = 'data-hasqtip',\n        ATTR_ID = 'data-qtip-id',\n        WIDGET = ['ui-widget', 'ui-tooltip'],\n        SELECTOR = '.' + NAMESPACE,\n        INACTIVE_EVENTS = 'click dblclick mousedown mouseup mousemove mouseleave mouseenter'.split(' '),\n        CLASS_FIXED = NAMESPACE + '-fixed',\n        CLASS_DEFAULT = NAMESPACE + '-default',\n        CLASS_FOCUS = NAMESPACE + '-focus',\n        CLASS_HOVER = NAMESPACE + '-hover',\n        CLASS_DISABLED = NAMESPACE + '-disabled',\n        replaceSuffix = '_replacedByqTip',\n        oldtitle = 'oldtitle',\n        trackingBound,\n        // Browser detection\n    BROWSER = {\n      /*\n       * IE version detection\n       *\n       * Adapted from: http://ajaxian.com/archives/attack-of-the-ie-conditional-comment\n       * Credit to James Padolsey for the original implemntation!\n       */\n      ie: function () {\n        /* eslint-disable no-empty */\n        var v, i;\n\n        for (v = 4, i = document.createElement('div'); (i.innerHTML = '<!--[if gt IE ' + v + ']><i></i><![endif]-->') && i.getElementsByTagName('i')[0]; v += 1) {}\n\n        return v > 4 ? v : NaN;\n        /* eslint-enable no-empty */\n      }(),\n\n      /*\n       * iOS version detection\n       */\n      iOS: parseFloat(('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ''])[1]).replace('undefined', '3_2').replace('_', '.').replace('_', '')) || FALSE\n    };\n    ;\n\n    function QTip(target, options, id, attr) {\n      // Elements and ID\n      this.id = id;\n      this.target = target;\n      this.tooltip = NULL;\n      this.elements = {\n        target: target\n      }; // Internal constructs\n\n      this._id = NAMESPACE + '-' + id;\n      this.timers = {\n        img: {}\n      };\n      this.options = options;\n      this.plugins = {}; // Cache object\n\n      this.cache = {\n        event: {},\n        target: $(),\n        disabled: FALSE,\n        attr: attr,\n        onTooltip: FALSE,\n        lastClass: ''\n      }; // Set the initial flags\n\n      this.rendered = this.destroyed = this.disabled = this.waiting = this.hiddenDuringWait = this.positioning = this.triggering = FALSE;\n    }\n\n    PROTOTYPE = QTip.prototype;\n\n    PROTOTYPE._when = function (deferreds) {\n      return $.when.apply($, deferreds);\n    };\n\n    PROTOTYPE.render = function (show) {\n      if (this.rendered || this.destroyed) {\n        return this;\n      } // If tooltip has already been rendered, exit\n\n\n      var self = this,\n          options = this.options,\n          cache = this.cache,\n          elements = this.elements,\n          text = options.content.text,\n          title = options.content.title,\n          button = options.content.button,\n          posOptions = options.position,\n          deferreds = []; // Add ARIA attributes to target\n\n      $.attr(this.target[0], 'aria-describedby', this._id); // Create public position object that tracks current position corners\n\n      cache.posClass = this._createPosClass((this.position = {\n        my: posOptions.my,\n        at: posOptions.at\n      }).my); // Create tooltip element\n\n      this.tooltip = elements.tooltip = $('<div/>', {\n        'id': this._id,\n        'class': [NAMESPACE, CLASS_DEFAULT, options.style.classes, cache.posClass].join(' '),\n        'width': options.style.width || '',\n        'height': options.style.height || '',\n        'tracking': posOptions.target === 'mouse' && posOptions.adjust.mouse,\n\n        /* ARIA specific attributes */\n        'role': 'alert',\n        'aria-live': 'polite',\n        'aria-atomic': FALSE,\n        'aria-describedby': this._id + '-content',\n        'aria-hidden': TRUE\n      }).toggleClass(CLASS_DISABLED, this.disabled).attr(ATTR_ID, this.id).data(NAMESPACE, this).appendTo(posOptions.container).append( // Create content element\n      elements.content = $('<div />', {\n        'class': NAMESPACE + '-content',\n        'id': this._id + '-content',\n        'aria-atomic': TRUE\n      })); // Set rendered flag and prevent redundant reposition calls for now\n\n      this.rendered = -1;\n      this.positioning = TRUE; // Create title...\n\n      if (title) {\n        this._createTitle(); // Update title only if its not a callback (called in toggle if so)\n\n\n        if (!$.isFunction(title)) {\n          deferreds.push(this._updateTitle(title, FALSE));\n        }\n      } // Create button\n\n\n      if (button) {\n        this._createButton();\n      } // Set proper rendered flag and update content if not a callback function (called in toggle)\n\n\n      if (!$.isFunction(text)) {\n        deferreds.push(this._updateContent(text, FALSE));\n      }\n\n      this.rendered = TRUE; // Setup widget classes\n\n      this._setWidget(); // Initialize 'render' plugins\n\n\n      $.each(PLUGINS, function (name) {\n        var instance;\n\n        if (this.initialize === 'render' && (instance = this(self))) {\n          self.plugins[name] = instance;\n        }\n      }); // Unassign initial events and assign proper events\n\n      this._unassignEvents();\n\n      this._assignEvents(); // When deferreds have completed\n\n\n      this._when(deferreds).then(function () {\n        // tooltiprender event\n        self._trigger('render'); // Reset flags\n\n\n        self.positioning = FALSE; // Show tooltip if not hidden during wait period\n\n        if (!self.hiddenDuringWait && (options.show.ready || show)) {\n          self.toggle(TRUE, cache.event, FALSE);\n        }\n\n        self.hiddenDuringWait = FALSE;\n      }); // Expose API\n\n\n      QTIP.api[this.id] = this;\n      return this;\n    };\n\n    PROTOTYPE.destroy = function (immediate) {\n      // Set flag the signify destroy is taking place to plugins\n      // and ensure it only gets destroyed once!\n      if (this.destroyed) {\n        return this.target;\n      }\n\n      function process() {\n        if (this.destroyed) {\n          return;\n        }\n\n        this.destroyed = TRUE;\n        var target = this.target,\n            title = target.attr(oldtitle),\n            timer; // Destroy tooltip if rendered\n\n        if (this.rendered) {\n          this.tooltip.stop(1, 0).find('*').remove().end().remove();\n        } // Destroy all plugins\n\n\n        $.each(this.plugins, function () {\n          this.destroy && this.destroy();\n        }); // Clear timers\n\n        for (timer in this.timers) {\n          if (this.timers.hasOwnProperty(timer)) {\n            clearTimeout(this.timers[timer]);\n          }\n        } // Remove api object and ARIA attributes\n\n\n        target.removeData(NAMESPACE).removeAttr(ATTR_ID).removeAttr(ATTR_HAS).removeAttr('aria-describedby'); // Reset old title attribute if removed\n\n        if (this.options.suppress && title) {\n          target.attr('title', title).removeAttr(oldtitle);\n        } // Remove qTip events associated with this API\n\n\n        this._unassignEvents(); // Remove ID from used id objects, and delete object references\n        // for better garbage collection and leak protection\n\n\n        this.options = this.elements = this.cache = this.timers = this.plugins = this.mouse = NULL; // Delete epoxsed API object\n\n        delete QTIP.api[this.id];\n      } // If an immediate destroy is needed\n\n\n      if ((immediate !== TRUE || this.triggering === 'hide') && this.rendered) {\n        this.tooltip.one('tooltiphidden', $.proxy(process, this));\n        !this.triggering && this.hide();\n      } // If we're not in the process of hiding... process\n      else {\n        process.call(this);\n      }\n\n      return this.target;\n    };\n\n    ;\n\n    function invalidOpt(a) {\n      return a === NULL || $.type(a) !== 'object';\n    }\n\n    function invalidContent(c) {\n      return !($.isFunction(c) || c && c.attr || c.length || $.type(c) === 'object' && (c.jquery || c.then));\n    } // Option object sanitizer\n\n\n    function sanitizeOptions(opts) {\n      var content, text, ajax, once;\n\n      if (invalidOpt(opts)) {\n        return FALSE;\n      }\n\n      if (invalidOpt(opts.metadata)) {\n        opts.metadata = {\n          type: opts.metadata\n        };\n      }\n\n      if ('content' in opts) {\n        content = opts.content;\n\n        if (invalidOpt(content) || content.jquery || content.done) {\n          text = invalidContent(content) ? FALSE : content;\n          content = opts.content = {\n            text: text\n          };\n        } else {\n          text = content.text;\n        } // DEPRECATED - Old content.ajax plugin functionality\n        // Converts it into the proper Deferred syntax\n\n\n        if ('ajax' in content) {\n          ajax = content.ajax;\n          once = ajax && ajax.once !== FALSE;\n          delete content.ajax;\n\n          content.text = function (event, api) {\n            var loading = text || $(this).attr(api.options.content.attr) || 'Loading...',\n                deferred = $.ajax($.extend({}, ajax, {\n              context: api\n            })).then(ajax.success, NULL, ajax.error).then(function (newContent) {\n              if (newContent && once) {\n                api.set('content.text', newContent);\n              }\n\n              return newContent;\n            }, function (xhr, status, error) {\n              if (api.destroyed || xhr.status === 0) {\n                return;\n              }\n\n              api.set('content.text', status + ': ' + error);\n            });\n            return !once ? (api.set('content.text', loading), deferred) : loading;\n          };\n        }\n\n        if ('title' in content) {\n          if ($.isPlainObject(content.title)) {\n            content.button = content.title.button;\n            content.title = content.title.text;\n          }\n\n          if (invalidContent(content.title || FALSE)) {\n            content.title = FALSE;\n          }\n        }\n      }\n\n      if ('position' in opts && invalidOpt(opts.position)) {\n        opts.position = {\n          my: opts.position,\n          at: opts.position\n        };\n      }\n\n      if ('show' in opts && invalidOpt(opts.show)) {\n        opts.show = opts.show.jquery ? {\n          target: opts.show\n        } : opts.show === TRUE ? {\n          ready: TRUE\n        } : {\n          event: opts.show\n        };\n      }\n\n      if ('hide' in opts && invalidOpt(opts.hide)) {\n        opts.hide = opts.hide.jquery ? {\n          target: opts.hide\n        } : {\n          event: opts.hide\n        };\n      }\n\n      if ('style' in opts && invalidOpt(opts.style)) {\n        opts.style = {\n          classes: opts.style\n        };\n      } // Sanitize plugin options\n\n\n      $.each(PLUGINS, function () {\n        this.sanitize && this.sanitize(opts);\n      });\n      return opts;\n    } // Setup builtin .set() option checks\n\n\n    CHECKS = PROTOTYPE.checks = {\n      builtin: {\n        // Core checks\n        '^id$': function id$(obj, o, v, prev) {\n          var id = v === TRUE ? QTIP.nextid : v,\n              newId = NAMESPACE + '-' + id;\n\n          if (id !== FALSE && id.length > 0 && !$('#' + newId).length) {\n            this._id = newId;\n\n            if (this.rendered) {\n              this.tooltip[0].id = this._id;\n              this.elements.content[0].id = this._id + '-content';\n              this.elements.title[0].id = this._id + '-title';\n            }\n          } else {\n            obj[o] = prev;\n          }\n        },\n        '^prerender': function prerender(obj, o, v) {\n          v && !this.rendered && this.render(this.options.show.ready);\n        },\n        // Content checks\n        '^content.text$': function contentText$(obj, o, v) {\n          this._updateContent(v);\n        },\n        '^content.attr$': function contentAttr$(obj, o, v, prev) {\n          if (this.options.content.text === this.target.attr(prev)) {\n            this._updateContent(this.target.attr(v));\n          }\n        },\n        '^content.title$': function contentTitle$(obj, o, v) {\n          // Remove title if content is null\n          if (!v) {\n            return this._removeTitle();\n          } // If title isn't already created, create it now and update\n\n\n          v && !this.elements.title && this._createTitle();\n\n          this._updateTitle(v);\n        },\n        '^content.button$': function contentButton$(obj, o, v) {\n          this._updateButton(v);\n        },\n        '^content.title.(text|button)$': function contentTitleTextButton$(obj, o, v) {\n          this.set('content.' + o, v); // Backwards title.text/button compat\n        },\n        // Position checks\n        '^position.(my|at)$': function positionMyAt$(obj, o, v) {\n          if ('string' === typeof v) {\n            this.position[o] = obj[o] = new CORNER(v, o === 'at');\n          }\n        },\n        '^position.container$': function positionContainer$(obj, o, v) {\n          this.rendered && this.tooltip.appendTo(v);\n        },\n        // Show checks\n        '^show.ready$': function showReady$(obj, o, v) {\n          v && (!this.rendered && this.render(TRUE) || this.toggle(TRUE));\n        },\n        // Style checks\n        '^style.classes$': function styleClasses$(obj, o, v, p) {\n          this.rendered && this.tooltip.removeClass(p).addClass(v);\n        },\n        '^style.(width|height)': function styleWidthHeight(obj, o, v) {\n          this.rendered && this.tooltip.css(o, v);\n        },\n        '^style.widget|content.title': function styleWidgetContentTitle() {\n          this.rendered && this._setWidget();\n        },\n        '^style.def': function styleDef(obj, o, v) {\n          this.rendered && this.tooltip.toggleClass(CLASS_DEFAULT, !!v);\n        },\n        // Events check\n        '^events.(render|show|move|hide|focus|blur)$': function eventsRenderShowMoveHideFocusBlur$(obj, o, v) {\n          this.rendered && this.tooltip[($.isFunction(v) ? '' : 'un') + 'bind']('tooltip' + o, v);\n        },\n        // Properties which require event reassignment\n        '^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)': function showHidePositionEventTargetFixedInactiveLeaveDistanceViewportAdjust() {\n          if (!this.rendered) {\n            return;\n          } // Set tracking flag\n\n\n          var posOptions = this.options.position;\n          this.tooltip.attr('tracking', posOptions.target === 'mouse' && posOptions.adjust.mouse); // Reassign events\n\n          this._unassignEvents();\n\n          this._assignEvents();\n        }\n      }\n    }; // Dot notation converter\n\n    function convertNotation(options, notation) {\n      var i = 0,\n          obj,\n          option = options,\n          // Split notation into array\n      levels = notation.split('.'); // Loop through\n\n      while (option = option[levels[i++]]) {\n        if (i < levels.length) {\n          obj = option;\n        }\n      }\n\n      return [obj || options, levels.pop()];\n    }\n\n    PROTOTYPE.get = function (notation) {\n      if (this.destroyed) {\n        return this;\n      }\n\n      var o = convertNotation(this.options, notation.toLowerCase()),\n          result = o[0][o[1]];\n      return result.precedance ? result.string() : result;\n    };\n\n    function setCallback(notation, args) {\n      var category, rule, match;\n\n      for (category in this.checks) {\n        if (!this.checks.hasOwnProperty(category)) {\n          continue;\n        }\n\n        for (rule in this.checks[category]) {\n          if (!this.checks[category].hasOwnProperty(rule)) {\n            continue;\n          }\n\n          if (match = new RegExp(rule, 'i').exec(notation)) {\n            args.push(match);\n\n            if (category === 'builtin' || this.plugins[category]) {\n              this.checks[category][rule].apply(this.plugins[category] || this, args);\n            }\n          }\n        }\n      }\n    }\n\n    var rmove = /^position\\.(my|at|adjust|target|container|viewport)|style|content|show\\.ready/i,\n        rrender = /^prerender|show\\.ready/i;\n\n    PROTOTYPE.set = function (option, value) {\n      if (this.destroyed) {\n        return this;\n      }\n\n      var rendered = this.rendered,\n          reposition = FALSE,\n          options = this.options,\n          name; // Convert singular option/value pair into object form\n\n      if ('string' === typeof option) {\n        name = option;\n        option = {};\n        option[name] = value;\n      } else {\n        option = $.extend({}, option);\n      } // Set all of the defined options to their new values\n\n\n      $.each(option, function (notation, val) {\n        if (rendered && rrender.test(notation)) {\n          delete option[notation];\n          return;\n        } // Set new obj value\n\n\n        var obj = convertNotation(options, notation.toLowerCase()),\n            previous;\n        previous = obj[0][obj[1]];\n        obj[0][obj[1]] = val && val.nodeType ? $(val) : val; // Also check if we need to reposition\n\n        reposition = rmove.test(notation) || reposition; // Set the new params for the callback\n\n        option[notation] = [obj[0], obj[1], val, previous];\n      }); // Re-sanitize options\n\n      sanitizeOptions(options);\n      /*\n       * Execute any valid callbacks for the set options\n       * Also set positioning flag so we don't get loads of redundant repositioning calls.\n       */\n\n      this.positioning = TRUE;\n      $.each(option, $.proxy(setCallback, this));\n      this.positioning = FALSE; // Update position if needed\n\n      if (this.rendered && this.tooltip[0].offsetWidth > 0 && reposition) {\n        this.reposition(options.position.target === 'mouse' ? NULL : this.cache.event);\n      }\n\n      return this;\n    };\n\n    ;\n\n    PROTOTYPE._update = function (content, element) {\n      var self = this,\n          cache = this.cache; // Make sure tooltip is rendered and content is defined. If not return\n\n      if (!this.rendered || !content) {\n        return FALSE;\n      } // Use function to parse content\n\n\n      if ($.isFunction(content)) {\n        content = content.call(this.elements.target, cache.event, this) || '';\n      } // Handle deferred content\n\n\n      if ($.isFunction(content.then)) {\n        cache.waiting = TRUE;\n        return content.then(function (c) {\n          cache.waiting = FALSE;\n          return self._update(c, element);\n        }, NULL, function (e) {\n          return self._update(e, element);\n        });\n      } // If content is null... return false\n\n\n      if (content === FALSE || !content && content !== '') {\n        return FALSE;\n      } // Append new content if its a DOM array and show it if hidden\n\n\n      if (content.jquery && content.length > 0) {\n        element.empty().append(content.css({\n          display: 'block',\n          visibility: 'visible'\n        }));\n      } // Content is a regular string, insert the new content\n      else {\n        element.html(content);\n      } // Wait for content to be loaded, and reposition\n\n\n      return this._waitForContent(element).then(function (images) {\n        if (self.rendered && self.tooltip[0].offsetWidth > 0) {\n          self.reposition(cache.event, !images.length);\n        }\n      });\n    };\n\n    PROTOTYPE._waitForContent = function (element) {\n      var cache = this.cache; // Set flag\n\n      cache.waiting = TRUE; // If imagesLoaded is included, ensure images have loaded and return promise\n\n      return ($.fn.imagesLoaded ? element.imagesLoaded() : new $.Deferred().resolve([])).done(function () {\n        cache.waiting = FALSE;\n      }).promise();\n    };\n\n    PROTOTYPE._updateContent = function (content, reposition) {\n      this._update(content, this.elements.content, reposition);\n    };\n\n    PROTOTYPE._updateTitle = function (content, reposition) {\n      if (this._update(content, this.elements.title, reposition) === FALSE) {\n        this._removeTitle(FALSE);\n      }\n    };\n\n    PROTOTYPE._createTitle = function () {\n      var elements = this.elements,\n          id = this._id + '-title'; // Destroy previous title element, if present\n\n      if (elements.titlebar) {\n        this._removeTitle();\n      } // Create title bar and title elements\n\n\n      elements.titlebar = $('<div />', {\n        'class': NAMESPACE + '-titlebar ' + (this.options.style.widget ? createWidgetClass('header') : '')\n      }).append(elements.title = $('<div />', {\n        'id': id,\n        'class': NAMESPACE + '-title',\n        'aria-atomic': TRUE\n      })).insertBefore(elements.content) // Button-specific events\n      .delegate('.qtip-close', 'mousedown keydown mouseup keyup mouseout', function (event) {\n        $(this).toggleClass('ui-state-active ui-state-focus', event.type.substr(-4) === 'down');\n      }).delegate('.qtip-close', 'mouseover mouseout', function (event) {\n        $(this).toggleClass('ui-state-hover', event.type === 'mouseover');\n      }); // Create button if enabled\n\n      if (this.options.content.button) {\n        this._createButton();\n      }\n    };\n\n    PROTOTYPE._removeTitle = function (reposition) {\n      var elements = this.elements;\n\n      if (elements.title) {\n        elements.titlebar.remove();\n        elements.titlebar = elements.title = elements.button = NULL; // Reposition if enabled\n\n        if (reposition !== FALSE) {\n          this.reposition();\n        }\n      }\n    };\n\n    ;\n\n    PROTOTYPE._createPosClass = function (my) {\n      return NAMESPACE + '-pos-' + (my || this.options.position.my).abbrev();\n    };\n\n    PROTOTYPE.reposition = function (event, effect) {\n      if (!this.rendered || this.positioning || this.destroyed) {\n        return this;\n      } // Set positioning flag\n\n\n      this.positioning = TRUE;\n      var cache = this.cache,\n          tooltip = this.tooltip,\n          posOptions = this.options.position,\n          target = posOptions.target,\n          my = posOptions.my,\n          at = posOptions.at,\n          viewport = posOptions.viewport,\n          container = posOptions.container,\n          adjust = posOptions.adjust,\n          method = adjust.method.split(' '),\n          tooltipWidth = tooltip.outerWidth(FALSE),\n          tooltipHeight = tooltip.outerHeight(FALSE),\n          targetWidth = 0,\n          targetHeight = 0,\n          type = tooltip.css('position'),\n          position = {\n        left: 0,\n        top: 0\n      },\n          visible = tooltip[0].offsetWidth > 0,\n          isScroll = event && event.type === 'scroll',\n          win = $(window),\n          doc = container[0].ownerDocument,\n          mouse = this.mouse,\n          pluginCalculations,\n          offset,\n          adjusted,\n          newClass; // Check if absolute position was passed\n\n      if ($.isArray(target) && target.length === 2) {\n        // Force left top and set position\n        at = {\n          x: LEFT,\n          y: TOP\n        };\n        position = {\n          left: target[0],\n          top: target[1]\n        };\n      } // Check if mouse was the target\n      else if (target === 'mouse') {\n        // Force left top to allow flipping\n        at = {\n          x: LEFT,\n          y: TOP\n        }; // Use the mouse origin that caused the show event, if distance hiding is enabled\n\n        if ((!adjust.mouse || this.options.hide.distance) && cache.origin && cache.origin.pageX) {\n          event = cache.origin;\n        } // Use cached event for resize/scroll events\n        else if (!event || event && (event.type === 'resize' || event.type === 'scroll')) {\n          event = cache.event;\n        } // Otherwise, use the cached mouse coordinates if available\n        else if (mouse && mouse.pageX) {\n          event = mouse;\n        } // Calculate body and container offset and take them into account below\n\n\n        if (type !== 'static') {\n          position = container.offset();\n        }\n\n        if (doc.body.offsetWidth !== (window.innerWidth || doc.documentElement.clientWidth)) {\n          offset = $(document.body).offset();\n        } // Use event coordinates for position\n\n\n        position = {\n          left: event.pageX - position.left + (offset && offset.left || 0),\n          top: event.pageY - position.top + (offset && offset.top || 0)\n        }; // Scroll events are a pain, some browsers\n\n        if (adjust.mouse && isScroll && mouse) {\n          position.left -= (mouse.scrollX || 0) - win.scrollLeft();\n          position.top -= (mouse.scrollY || 0) - win.scrollTop();\n        }\n      } // Target wasn't mouse or absolute...\n      else {\n        // Check if event targetting is being used\n        if (target === 'event') {\n          if (event && event.target && event.type !== 'scroll' && event.type !== 'resize') {\n            cache.target = $(event.target);\n          } else if (!event.target) {\n            cache.target = this.elements.target;\n          }\n        } else if (target !== 'event') {\n          cache.target = $(target.jquery ? target : this.elements.target);\n        }\n\n        target = cache.target; // Parse the target into a jQuery object and make sure there's an element present\n\n        target = $(target).eq(0);\n\n        if (target.length === 0) {\n          return this;\n        } // Check if window or document is the target\n        else if (target[0] === document || target[0] === window) {\n          targetWidth = BROWSER.iOS ? window.innerWidth : target.width();\n          targetHeight = BROWSER.iOS ? window.innerHeight : target.height();\n\n          if (target[0] === window) {\n            position = {\n              top: (viewport || target).scrollTop(),\n              left: (viewport || target).scrollLeft()\n            };\n          }\n        } // Check if the target is an <AREA> element\n        else if (PLUGINS.imagemap && target.is('area')) {\n          pluginCalculations = PLUGINS.imagemap(this, target, at, PLUGINS.viewport ? method : FALSE);\n        } // Check if the target is an SVG element\n        else if (PLUGINS.svg && target && target[0].ownerSVGElement) {\n          pluginCalculations = PLUGINS.svg(this, target, at, PLUGINS.viewport ? method : FALSE);\n        } // Otherwise use regular jQuery methods\n        else {\n          targetWidth = target.outerWidth(FALSE);\n          targetHeight = target.outerHeight(FALSE);\n          position = target.offset();\n        } // Parse returned plugin values into proper variables\n\n\n        if (pluginCalculations) {\n          targetWidth = pluginCalculations.width;\n          targetHeight = pluginCalculations.height;\n          offset = pluginCalculations.offset;\n          position = pluginCalculations.position;\n        } // Adjust position to take into account offset parents\n\n\n        position = this.reposition.offset(target, position, container); // Adjust for position.fixed tooltips (and also iOS scroll bug in v3.2-4.0 & v4.3-4.3.2)\n\n        if (BROWSER.iOS > 3.1 && BROWSER.iOS < 4.1 || BROWSER.iOS >= 4.3 && BROWSER.iOS < 4.33 || !BROWSER.iOS && type === 'fixed') {\n          position.left -= win.scrollLeft();\n          position.top -= win.scrollTop();\n        } // Adjust position relative to target\n\n\n        if (!pluginCalculations || pluginCalculations && pluginCalculations.adjustable !== FALSE) {\n          position.left += at.x === RIGHT ? targetWidth : at.x === CENTER ? targetWidth / 2 : 0;\n          position.top += at.y === BOTTOM ? targetHeight : at.y === CENTER ? targetHeight / 2 : 0;\n        }\n      } // Adjust position relative to tooltip\n\n\n      position.left += adjust.x + (my.x === RIGHT ? -tooltipWidth : my.x === CENTER ? -tooltipWidth / 2 : 0);\n      position.top += adjust.y + (my.y === BOTTOM ? -tooltipHeight : my.y === CENTER ? -tooltipHeight / 2 : 0); // Use viewport adjustment plugin if enabled\n\n      if (PLUGINS.viewport) {\n        adjusted = position.adjusted = PLUGINS.viewport(this, position, posOptions, targetWidth, targetHeight, tooltipWidth, tooltipHeight); // Apply offsets supplied by positioning plugin (if used)\n\n        if (offset && adjusted.left) {\n          position.left += offset.left;\n        }\n\n        if (offset && adjusted.top) {\n          position.top += offset.top;\n        } // Apply any new 'my' position\n\n\n        if (adjusted.my) {\n          this.position.my = adjusted.my;\n        }\n      } // Viewport adjustment is disabled, set values to zero\n      else {\n        position.adjusted = {\n          left: 0,\n          top: 0\n        };\n      } // Set tooltip position class if it's changed\n\n\n      if (cache.posClass !== (newClass = this._createPosClass(this.position.my))) {\n        cache.posClass = newClass;\n        tooltip.removeClass(cache.posClass).addClass(newClass);\n      } // tooltipmove event\n\n\n      if (!this._trigger('move', [position, viewport.elem || viewport], event)) {\n        return this;\n      }\n\n      delete position.adjusted; // If effect is disabled, target it mouse, no animation is defined or positioning gives NaN out, set CSS directly\n\n      if (effect === FALSE || !visible || isNaN(position.left) || isNaN(position.top) || target === 'mouse' || !$.isFunction(posOptions.effect)) {\n        tooltip.css(position);\n      } // Use custom function if provided\n      else if ($.isFunction(posOptions.effect)) {\n        posOptions.effect.call(tooltip, this, $.extend({}, position));\n        tooltip.queue(function (next) {\n          // Reset attributes to avoid cross-browser rendering bugs\n          $(this).css({\n            opacity: '',\n            height: ''\n          });\n\n          if (BROWSER.ie) {\n            this.style.removeAttribute('filter');\n          }\n\n          next();\n        });\n      } // Set positioning flag\n\n\n      this.positioning = FALSE;\n      return this;\n    }; // Custom (more correct for qTip!) offset calculator\n\n\n    PROTOTYPE.reposition.offset = function (elem, pos, container) {\n      if (!container[0]) {\n        return pos;\n      }\n\n      var ownerDocument = $(elem[0].ownerDocument),\n          quirks = !!BROWSER.ie && document.compatMode !== 'CSS1Compat',\n          parent = container[0],\n          scrolled,\n          position,\n          parentOffset,\n          overflow;\n\n      function scroll(e, i) {\n        pos.left += i * e.scrollLeft();\n        pos.top += i * e.scrollTop();\n      } // Compensate for non-static containers offset\n\n\n      do {\n        if ((position = $.css(parent, 'position')) !== 'static') {\n          if (position === 'fixed') {\n            parentOffset = parent.getBoundingClientRect();\n            scroll(ownerDocument, -1);\n          } else {\n            parentOffset = $(parent).position();\n            parentOffset.left += parseFloat($.css(parent, 'borderLeftWidth')) || 0;\n            parentOffset.top += parseFloat($.css(parent, 'borderTopWidth')) || 0;\n          }\n\n          pos.left -= parentOffset.left + (parseFloat($.css(parent, 'marginLeft')) || 0);\n          pos.top -= parentOffset.top + (parseFloat($.css(parent, 'marginTop')) || 0); // If this is the first parent element with an overflow of \"scroll\" or \"auto\", store it\n\n          if (!scrolled && (overflow = $.css(parent, 'overflow')) !== 'hidden' && overflow !== 'visible') {\n            scrolled = $(parent);\n          }\n        }\n      } while (parent = parent.offsetParent); // Compensate for containers scroll if it also has an offsetParent (or in IE quirks mode)\n\n\n      if (scrolled && (scrolled[0] !== ownerDocument[0] || quirks)) {\n        scroll(scrolled, 1);\n      }\n\n      return pos;\n    }; // Corner class\n\n\n    var C = (CORNER = PROTOTYPE.reposition.Corner = function (corner, forceY) {\n      corner = ('' + corner).replace(/([A-Z])/, ' $1').replace(/middle/gi, CENTER).toLowerCase();\n      this.x = (corner.match(/left|right/i) || corner.match(/center/) || ['inherit'])[0].toLowerCase();\n      this.y = (corner.match(/top|bottom|center/i) || ['inherit'])[0].toLowerCase();\n      this.forceY = !!forceY;\n      var f = corner.charAt(0);\n      this.precedance = f === 't' || f === 'b' ? Y : X;\n    }).prototype;\n\n    C.invert = function (z, center) {\n      this[z] = this[z] === LEFT ? RIGHT : this[z] === RIGHT ? LEFT : center || this[z];\n    };\n\n    C.string = function (join) {\n      var x = this.x,\n          y = this.y;\n      var result = x !== y ? x === 'center' || y !== 'center' && (this.precedance === Y || this.forceY) ? [y, x] : [x, y] : [x];\n      return join !== false ? result.join(' ') : result;\n    };\n\n    C.abbrev = function () {\n      var result = this.string(false);\n      return result[0].charAt(0) + (result[1] && result[1].charAt(0) || '');\n    };\n\n    C.clone = function () {\n      return new CORNER(this.string(), this.forceY);\n    };\n\n    ;\n\n    PROTOTYPE.toggle = function (state, event) {\n      var cache = this.cache,\n          options = this.options,\n          tooltip = this.tooltip; // Try to prevent flickering when tooltip overlaps show element\n\n      if (event) {\n        if (/over|enter/.test(event.type) && cache.event && /out|leave/.test(cache.event.type) && options.show.target.add(event.target).length === options.show.target.length && tooltip.has(event.relatedTarget).length) {\n          return this;\n        } // Cache event\n\n\n        cache.event = $.event.fix(event);\n      } // If we're currently waiting and we've just hidden... stop it\n\n\n      this.waiting && !state && (this.hiddenDuringWait = TRUE); // Render the tooltip if showing and it isn't already\n\n      if (!this.rendered) {\n        return state ? this.render(1) : this;\n      } else if (this.destroyed || this.disabled) {\n        return this;\n      }\n\n      var type = state ? 'show' : 'hide',\n          opts = this.options[type],\n          posOptions = this.options.position,\n          contentOptions = this.options.content,\n          width = this.tooltip.css('width'),\n          visible = this.tooltip.is(':visible'),\n          animate = state || opts.target.length === 1,\n          sameTarget = !event || opts.target.length < 2 || cache.target[0] === event.target,\n          identicalState,\n          allow,\n          after; // Detect state if valid one isn't provided\n\n      if (_typeof(state).search('boolean|number')) {\n        state = !visible;\n      } // Check if the tooltip is in an identical state to the new would-be state\n\n\n      identicalState = !tooltip.is(':animated') && visible === state && sameTarget; // Fire tooltip(show/hide) event and check if destroyed\n\n      allow = !identicalState ? !!this._trigger(type, [90]) : NULL; // Check to make sure the tooltip wasn't destroyed in the callback\n\n      if (this.destroyed) {\n        return this;\n      } // If the user didn't stop the method prematurely and we're showing the tooltip, focus it\n\n\n      if (allow !== FALSE && state) {\n        this.focus(event);\n      } // If the state hasn't changed or the user stopped it, return early\n\n\n      if (!allow || identicalState) {\n        return this;\n      } // Set ARIA hidden attribute\n\n\n      $.attr(tooltip[0], 'aria-hidden', !!!state); // Execute state specific properties\n\n      if (state) {\n        // Store show origin coordinates\n        this.mouse && (cache.origin = $.event.fix(this.mouse)); // Update tooltip content & title if it's a dynamic function\n\n        if ($.isFunction(contentOptions.text)) {\n          this._updateContent(contentOptions.text, FALSE);\n        }\n\n        if ($.isFunction(contentOptions.title)) {\n          this._updateTitle(contentOptions.title, FALSE);\n        } // Cache mousemove events for positioning purposes (if not already tracking)\n\n\n        if (!trackingBound && posOptions.target === 'mouse' && posOptions.adjust.mouse) {\n          $(document).bind('mousemove.' + NAMESPACE, this._storeMouse);\n          trackingBound = TRUE;\n        } // Update the tooltip position (set width first to prevent viewport/max-width issues)\n\n\n        if (!width) {\n          tooltip.css('width', tooltip.outerWidth(FALSE));\n        }\n\n        this.reposition(event, arguments[2]);\n\n        if (!width) {\n          tooltip.css('width', '');\n        } // Hide other tooltips if tooltip is solo\n\n\n        if (!!opts.solo) {\n          (typeof opts.solo === 'string' ? $(opts.solo) : $(SELECTOR, opts.solo)).not(tooltip).not(opts.target).qtip('hide', new $.Event('tooltipsolo'));\n        }\n      } else {\n        // Clear show timer if we're hiding\n        clearTimeout(this.timers.show); // Remove cached origin on hide\n\n        delete cache.origin; // Remove mouse tracking event if not needed (all tracking qTips are hidden)\n\n        if (trackingBound && !$(SELECTOR + '[tracking=\"true\"]:visible', opts.solo).not(tooltip).length) {\n          $(document).unbind('mousemove.' + NAMESPACE);\n          trackingBound = FALSE;\n        } // Blur the tooltip\n\n\n        this.blur(event);\n      } // Define post-animation, state specific properties\n\n\n      after = $.proxy(function () {\n        if (state) {\n          // Prevent antialias from disappearing in IE by removing filter\n          if (BROWSER.ie) {\n            tooltip[0].style.removeAttribute('filter');\n          } // Remove overflow setting to prevent tip bugs\n\n\n          tooltip.css('overflow', ''); // Autofocus elements if enabled\n\n          if ('string' === typeof opts.autofocus) {\n            $(this.options.show.autofocus, tooltip).focus();\n          } // If set, hide tooltip when inactive for delay period\n\n\n          this.options.show.target.trigger('qtip-' + this.id + '-inactive');\n        } else {\n          // Reset CSS states\n          tooltip.css({\n            display: '',\n            visibility: '',\n            opacity: '',\n            left: '',\n            top: ''\n          });\n        } // tooltipvisible/tooltiphidden events\n\n\n        this._trigger(state ? 'visible' : 'hidden');\n      }, this); // If no effect type is supplied, use a simple toggle\n\n      if (opts.effect === FALSE || animate === FALSE) {\n        tooltip[type]();\n        after();\n      } // Use custom function if provided\n      else if ($.isFunction(opts.effect)) {\n        tooltip.stop(1, 1);\n        opts.effect.call(tooltip, this);\n        tooltip.queue('fx', function (n) {\n          after();\n          n();\n        });\n      } // Use basic fade function by default\n      else {\n        tooltip.fadeTo(90, state ? 1 : 0, after);\n      } // If inactive hide method is set, active it\n\n\n      if (state) {\n        opts.target.trigger('qtip-' + this.id + '-inactive');\n      }\n\n      return this;\n    };\n\n    PROTOTYPE.show = function (event) {\n      return this.toggle(TRUE, event);\n    };\n\n    PROTOTYPE.hide = function (event) {\n      return this.toggle(FALSE, event);\n    };\n\n    ;\n\n    PROTOTYPE.focus = function (event) {\n      if (!this.rendered || this.destroyed) {\n        return this;\n      }\n\n      var qtips = $(SELECTOR),\n          tooltip = this.tooltip,\n          curIndex = parseInt(tooltip[0].style.zIndex, 10),\n          newIndex = QTIP.zindex + qtips.length; // Only update the z-index if it has changed and tooltip is not already focused\n\n      if (!tooltip.hasClass(CLASS_FOCUS)) {\n        // tooltipfocus event\n        if (this._trigger('focus', [newIndex], event)) {\n          // Only update z-index's if they've changed\n          if (curIndex !== newIndex) {\n            // Reduce our z-index's and keep them properly ordered\n            qtips.each(function () {\n              if (this.style.zIndex > curIndex) {\n                this.style.zIndex = this.style.zIndex - 1;\n              }\n            }); // Fire blur event for focused tooltip\n\n            qtips.filter('.' + CLASS_FOCUS).qtip('blur', event);\n          } // Set the new z-index\n\n\n          tooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex;\n        }\n      }\n\n      return this;\n    };\n\n    PROTOTYPE.blur = function (event) {\n      if (!this.rendered || this.destroyed) {\n        return this;\n      } // Set focused status to FALSE\n\n\n      this.tooltip.removeClass(CLASS_FOCUS); // tooltipblur event\n\n      this._trigger('blur', [this.tooltip.css('zIndex')], event);\n\n      return this;\n    };\n\n    ;\n\n    PROTOTYPE.disable = function (state) {\n      if (this.destroyed) {\n        return this;\n      } // If 'toggle' is passed, toggle the current state\n\n\n      if (state === 'toggle') {\n        state = !(this.rendered ? this.tooltip.hasClass(CLASS_DISABLED) : this.disabled);\n      } // Disable if no state passed\n      else if ('boolean' !== typeof state) {\n        state = TRUE;\n      }\n\n      if (this.rendered) {\n        this.tooltip.toggleClass(CLASS_DISABLED, state).attr('aria-disabled', state);\n      }\n\n      this.disabled = !!state;\n      return this;\n    };\n\n    PROTOTYPE.enable = function () {\n      return this.disable(FALSE);\n    };\n\n    ;\n\n    PROTOTYPE._createButton = function () {\n      var self = this,\n          elements = this.elements,\n          tooltip = elements.tooltip,\n          button = this.options.content.button,\n          isString = typeof button === 'string',\n          close = isString ? button : 'Close tooltip';\n\n      if (elements.button) {\n        elements.button.remove();\n      } // Use custom button if one was supplied by user, else use default\n\n\n      if (button.jquery) {\n        elements.button = button;\n      } else {\n        elements.button = $('<a />', {\n          'class': 'qtip-close ' + (this.options.style.widget ? '' : NAMESPACE + '-icon'),\n          'title': close,\n          'aria-label': close\n        }).prepend($('<span />', {\n          'class': 'ui-icon ui-icon-close',\n          'html': '&times;'\n        }));\n      } // Create button and setup attributes\n\n\n      elements.button.appendTo(elements.titlebar || tooltip).attr('role', 'button').click(function (event) {\n        if (!tooltip.hasClass(CLASS_DISABLED)) {\n          self.hide(event);\n        }\n\n        return FALSE;\n      });\n    };\n\n    PROTOTYPE._updateButton = function (button) {\n      // Make sure tooltip is rendered and if not, return\n      if (!this.rendered) {\n        return FALSE;\n      }\n\n      var elem = this.elements.button;\n\n      if (button) {\n        this._createButton();\n      } else {\n        elem.remove();\n      }\n    };\n\n    ; // Widget class creator\n\n    function createWidgetClass(cls) {\n      return WIDGET.concat('').join(cls ? '-' + cls + ' ' : ' ');\n    } // Widget class setter method\n\n\n    PROTOTYPE._setWidget = function () {\n      var on = this.options.style.widget,\n          elements = this.elements,\n          tooltip = elements.tooltip,\n          disabled = tooltip.hasClass(CLASS_DISABLED);\n      tooltip.removeClass(CLASS_DISABLED);\n      CLASS_DISABLED = on ? 'ui-state-disabled' : 'qtip-disabled';\n      tooltip.toggleClass(CLASS_DISABLED, disabled);\n      tooltip.toggleClass('ui-helper-reset ' + createWidgetClass(), on).toggleClass(CLASS_DEFAULT, this.options.style.def && !on);\n\n      if (elements.content) {\n        elements.content.toggleClass(createWidgetClass('content'), on);\n      }\n\n      if (elements.titlebar) {\n        elements.titlebar.toggleClass(createWidgetClass('header'), on);\n      }\n\n      if (elements.button) {\n        elements.button.toggleClass(NAMESPACE + '-icon', !on);\n      }\n    };\n\n    ;\n\n    function delay(callback, duration) {\n      // If tooltip has displayed, start hide timer\n      if (duration > 0) {\n        return setTimeout($.proxy(callback, this), duration);\n      } else {\n        callback.call(this);\n      }\n    }\n\n    function showMethod(event) {\n      if (this.tooltip.hasClass(CLASS_DISABLED)) {\n        return;\n      } // Clear hide timers\n\n\n      clearTimeout(this.timers.show);\n      clearTimeout(this.timers.hide); // Start show timer\n\n      this.timers.show = delay.call(this, function () {\n        this.toggle(TRUE, event);\n      }, this.options.show.delay);\n    }\n\n    function hideMethod(event) {\n      if (this.tooltip.hasClass(CLASS_DISABLED) || this.destroyed) {\n        return;\n      } // Check if new target was actually the tooltip element\n\n\n      var relatedTarget = $(event.relatedTarget),\n          ontoTooltip = relatedTarget.closest(SELECTOR)[0] === this.tooltip[0],\n          ontoTarget = relatedTarget[0] === this.options.show.target[0]; // Clear timers and stop animation queue\n\n      clearTimeout(this.timers.show);\n      clearTimeout(this.timers.hide); // Prevent hiding if tooltip is fixed and event target is the tooltip.\n      // Or if mouse positioning is enabled and cursor momentarily overlaps\n\n      if (this !== relatedTarget[0] && this.options.position.target === 'mouse' && ontoTooltip || this.options.hide.fixed && /mouse(out|leave|move)/.test(event.type) && (ontoTooltip || ontoTarget)) {\n        /* eslint-disable no-empty */\n        try {\n          event.preventDefault();\n          event.stopImmediatePropagation();\n        } catch (e) {}\n        /* eslint-enable no-empty */\n\n\n        return;\n      } // If tooltip has displayed, start hide timer\n\n\n      this.timers.hide = delay.call(this, function () {\n        this.toggle(FALSE, event);\n      }, this.options.hide.delay, this);\n    }\n\n    function inactiveMethod(event) {\n      if (this.tooltip.hasClass(CLASS_DISABLED) || !this.options.hide.inactive) {\n        return;\n      } // Clear timer\n\n\n      clearTimeout(this.timers.inactive);\n      this.timers.inactive = delay.call(this, function () {\n        this.hide(event);\n      }, this.options.hide.inactive);\n    }\n\n    function repositionMethod(event) {\n      if (this.rendered && this.tooltip[0].offsetWidth > 0) {\n        this.reposition(event);\n      }\n    } // Store mouse coordinates\n\n\n    PROTOTYPE._storeMouse = function (event) {\n      (this.mouse = $.event.fix(event)).type = 'mousemove';\n      return this;\n    }; // Bind events\n\n\n    PROTOTYPE._bind = function (targets, events, method, suffix, context) {\n      if (!targets || !method || !events.length) {\n        return;\n      }\n\n      var ns = '.' + this._id + (suffix ? '-' + suffix : '');\n      $(targets).bind((events.split ? events : events.join(ns + ' ')) + ns, $.proxy(method, context || this));\n      return this;\n    };\n\n    PROTOTYPE._unbind = function (targets, suffix) {\n      targets && $(targets).unbind('.' + this._id + (suffix ? '-' + suffix : ''));\n      return this;\n    }; // Global delegation helper\n\n\n    function delegate(selector, events, method) {\n      $(document.body).delegate(selector, (events.split ? events : events.join('.' + NAMESPACE + ' ')) + '.' + NAMESPACE, function () {\n        var api = QTIP.api[$.attr(this, ATTR_ID)];\n        api && !api.disabled && method.apply(api, arguments);\n      });\n    } // Event trigger\n\n\n    PROTOTYPE._trigger = function (type, args, event) {\n      var callback = new $.Event('tooltip' + type);\n      callback.originalEvent = event && $.extend({}, event) || this.cache.event || NULL;\n      this.triggering = type;\n      this.tooltip.trigger(callback, [this].concat(args || []));\n      this.triggering = FALSE;\n      return !callback.isDefaultPrevented();\n    };\n\n    PROTOTYPE._bindEvents = function (showEvents, hideEvents, showTargets, hideTargets, showCallback, hideCallback) {\n      // Get tasrgets that lye within both\n      var similarTargets = showTargets.filter(hideTargets).add(hideTargets.filter(showTargets)),\n          toggleEvents = []; // If hide and show targets are the same...\n\n      if (similarTargets.length) {\n        // Filter identical show/hide events\n        $.each(hideEvents, function (i, type) {\n          var showIndex = $.inArray(type, showEvents); // Both events are identical, remove from both hide and show events\n          // and append to toggleEvents\n\n          showIndex > -1 && toggleEvents.push(showEvents.splice(showIndex, 1)[0]);\n        }); // Toggle events are special case of identical show/hide events, which happen in sequence\n\n        if (toggleEvents.length) {\n          // Bind toggle events to the similar targets\n          this._bind(similarTargets, toggleEvents, function (event) {\n            var state = this.rendered ? this.tooltip[0].offsetWidth > 0 : false;\n            (state ? hideCallback : showCallback).call(this, event);\n          }); // Remove the similar targets from the regular show/hide bindings\n\n\n          showTargets = showTargets.not(similarTargets);\n          hideTargets = hideTargets.not(similarTargets);\n        }\n      } // Apply show/hide/toggle events\n\n\n      this._bind(showTargets, showEvents, showCallback);\n\n      this._bind(hideTargets, hideEvents, hideCallback);\n    };\n\n    PROTOTYPE._assignInitialEvents = function (event) {\n      var options = this.options,\n          showTarget = options.show.target,\n          hideTarget = options.hide.target,\n          showEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [],\n          hideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : []; // Catch remove/removeqtip events on target element to destroy redundant tooltips\n\n      this._bind(this.elements.target, ['remove', 'removeqtip'], function () {\n        this.destroy(true);\n      }, 'destroy');\n      /*\n       * Make sure hoverIntent functions properly by using mouseleave as a hide event if\n       * mouseenter/mouseout is used for show.event, even if it isn't in the users options.\n       */\n\n\n      if (/mouse(over|enter)/i.test(options.show.event) && !/mouse(out|leave)/i.test(options.hide.event)) {\n        hideEvents.push('mouseleave');\n      }\n      /*\n       * Also make sure initial mouse targetting works correctly by caching mousemove coords\n       * on show targets before the tooltip has rendered. Also set onTarget when triggered to\n       * keep mouse tracking working.\n       */\n\n\n      this._bind(showTarget, 'mousemove', function (moveEvent) {\n        this._storeMouse(moveEvent);\n\n        this.cache.onTarget = TRUE;\n      }); // Define hoverIntent function\n\n\n      function hoverIntent(hoverEvent) {\n        // Only continue if tooltip isn't disabled\n        if (this.disabled || this.destroyed) {\n          return FALSE;\n        } // Cache the event data\n\n\n        this.cache.event = hoverEvent && $.event.fix(hoverEvent);\n        this.cache.target = hoverEvent && $(hoverEvent.target); // Start the event sequence\n\n        clearTimeout(this.timers.show);\n        this.timers.show = delay.call(this, function () {\n          this.render(_typeof(hoverEvent) === 'object' || options.show.ready);\n        }, options.prerender ? 0 : options.show.delay);\n      } // Filter and bind events\n\n\n      this._bindEvents(showEvents, hideEvents, showTarget, hideTarget, hoverIntent, function () {\n        if (!this.timers) {\n          return FALSE;\n        }\n\n        clearTimeout(this.timers.show);\n      }); // Prerendering is enabled, create tooltip now\n\n\n      if (options.show.ready || options.prerender) {\n        hoverIntent.call(this, event);\n      }\n    }; // Event assignment method\n\n\n    PROTOTYPE._assignEvents = function () {\n      var self = this,\n          options = this.options,\n          posOptions = options.position,\n          tooltip = this.tooltip,\n          showTarget = options.show.target,\n          hideTarget = options.hide.target,\n          containerTarget = posOptions.container,\n          viewportTarget = posOptions.viewport,\n          documentTarget = $(document),\n          windowTarget = $(window),\n          showEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [],\n          hideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : []; // Assign passed event callbacks\n\n      $.each(options.events, function (name, callback) {\n        self._bind(tooltip, name === 'toggle' ? ['tooltipshow', 'tooltiphide'] : ['tooltip' + name], callback, null, tooltip);\n      }); // Hide tooltips when leaving current window/frame (but not select/option elements)\n\n      if (/mouse(out|leave)/i.test(options.hide.event) && options.hide.leave === 'window') {\n        this._bind(documentTarget, ['mouseout', 'blur'], function (event) {\n          if (!/select|option/.test(event.target.nodeName) && !event.relatedTarget) {\n            this.hide(event);\n          }\n        });\n      } // Enable hide.fixed by adding appropriate class\n\n\n      if (options.hide.fixed) {\n        hideTarget = hideTarget.add(tooltip.addClass(CLASS_FIXED));\n      }\n      /*\n       * Make sure hoverIntent functions properly by using mouseleave to clear show timer if\n       * mouseenter/mouseout is used for show.event, even if it isn't in the users options.\n       */\n      else if (/mouse(over|enter)/i.test(options.show.event)) {\n        this._bind(hideTarget, 'mouseleave', function () {\n          clearTimeout(this.timers.show);\n        });\n      } // Hide tooltip on document mousedown if unfocus events are enabled\n\n\n      if (('' + options.hide.event).indexOf('unfocus') > -1) {\n        this._bind(containerTarget.closest('html'), ['mousedown', 'touchstart'], function (event) {\n          var elem = $(event.target),\n              enabled = this.rendered && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0,\n              isAncestor = elem.parents(SELECTOR).filter(this.tooltip[0]).length > 0;\n\n          if (elem[0] !== this.target[0] && elem[0] !== this.tooltip[0] && !isAncestor && !this.target.has(elem[0]).length && enabled) {\n            this.hide(event);\n          }\n        });\n      } // Check if the tooltip hides when inactive\n\n\n      if ('number' === typeof options.hide.inactive) {\n        // Bind inactive method to show target(s) as a custom event\n        this._bind(showTarget, 'qtip-' + this.id + '-inactive', inactiveMethod, 'inactive'); // Define events which reset the 'inactive' event handler\n\n\n        this._bind(hideTarget.add(tooltip), QTIP.inactiveEvents, inactiveMethod);\n      } // Filter and bind events\n\n\n      this._bindEvents(showEvents, hideEvents, showTarget, hideTarget, showMethod, hideMethod); // Mouse movement bindings\n\n\n      this._bind(showTarget.add(tooltip), 'mousemove', function (event) {\n        // Check if the tooltip hides when mouse is moved a certain distance\n        if ('number' === typeof options.hide.distance) {\n          var origin = this.cache.origin || {},\n              limit = this.options.hide.distance,\n              abs = Math.abs; // Check if the movement has gone beyond the limit, and hide it if so\n\n          if (abs(event.pageX - origin.pageX) >= limit || abs(event.pageY - origin.pageY) >= limit) {\n            this.hide(event);\n          }\n        } // Cache mousemove coords on show targets\n\n\n        this._storeMouse(event);\n      }); // Mouse positioning events\n\n\n      if (posOptions.target === 'mouse') {\n        // If mouse adjustment is on...\n        if (posOptions.adjust.mouse) {\n          // Apply a mouseleave event so we don't get problems with overlapping\n          if (options.hide.event) {\n            // Track if we're on the target or not\n            this._bind(showTarget, ['mouseenter', 'mouseleave'], function (event) {\n              if (!this.cache) {\n                return FALSE;\n              }\n\n              this.cache.onTarget = event.type === 'mouseenter';\n            });\n          } // Update tooltip position on mousemove\n\n\n          this._bind(documentTarget, 'mousemove', function (event) {\n            // Update the tooltip position only if the tooltip is visible and adjustment is enabled\n            if (this.rendered && this.cache.onTarget && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0) {\n              this.reposition(event);\n            }\n          });\n        }\n      } // Adjust positions of the tooltip on window resize if enabled\n\n\n      if (posOptions.adjust.resize || viewportTarget.length) {\n        this._bind($.event.special.resize ? viewportTarget : windowTarget, 'resize', repositionMethod);\n      } // Adjust tooltip position on scroll of the window or viewport element if present\n\n\n      if (posOptions.adjust.scroll) {\n        this._bind(windowTarget.add(posOptions.container), 'scroll', repositionMethod);\n      }\n    }; // Un-assignment method\n\n\n    PROTOTYPE._unassignEvents = function () {\n      var options = this.options,\n          showTargets = options.show.target,\n          hideTargets = options.hide.target,\n          targets = $.grep([this.elements.target[0], this.rendered && this.tooltip[0], options.position.container[0], options.position.viewport[0], options.position.container.closest('html')[0], // unfocus\n      window, document], function (i) {\n        return _typeof(i) === 'object';\n      }); // Add show and hide targets if they're valid\n\n      if (showTargets && showTargets.toArray) {\n        targets = targets.concat(showTargets.toArray());\n      }\n\n      if (hideTargets && hideTargets.toArray) {\n        targets = targets.concat(hideTargets.toArray());\n      } // Unbind the events\n\n\n      this._unbind(targets)._unbind(targets, 'destroy')._unbind(targets, 'inactive');\n    }; // Apply common event handlers using delegate (avoids excessive .bind calls!)\n\n\n    $(function () {\n      delegate(SELECTOR, ['mouseenter', 'mouseleave'], function (event) {\n        var state = event.type === 'mouseenter',\n            tooltip = $(event.currentTarget),\n            target = $(event.relatedTarget || event.target),\n            options = this.options; // On mouseenter...\n\n        if (state) {\n          // Focus the tooltip on mouseenter (z-index stacking)\n          this.focus(event); // Clear hide timer on tooltip hover to prevent it from closing\n\n          tooltip.hasClass(CLASS_FIXED) && !tooltip.hasClass(CLASS_DISABLED) && clearTimeout(this.timers.hide);\n        } // On mouseleave...\n        else {\n          // When mouse tracking is enabled, hide when we leave the tooltip and not onto the show target (if a hide event is set)\n          if (options.position.target === 'mouse' && options.position.adjust.mouse && options.hide.event && options.show.target && !target.closest(options.show.target[0]).length) {\n            this.hide(event);\n          }\n        } // Add hover class\n\n\n        tooltip.toggleClass(CLASS_HOVER, state);\n      }); // Define events which reset the 'inactive' event handler\n\n      delegate('[' + ATTR_ID + ']', INACTIVE_EVENTS, inactiveMethod);\n    });\n    ; // Initialization method\n\n    function init(elem, id, opts) {\n      var obj,\n          posOptions,\n          attr,\n          config,\n          title,\n          // Setup element references\n      docBody = $(document.body),\n          // Use document body instead of document element if needed\n      newTarget = elem[0] === document ? docBody : elem,\n          // Grab metadata from element if plugin is present\n      metadata = elem.metadata ? elem.metadata(opts.metadata) : NULL,\n          // If metadata type if HTML5, grab 'name' from the object instead, or use the regular data object otherwise\n      metadata5 = opts.metadata.type === 'html5' && metadata ? metadata[opts.metadata.name] : NULL,\n          // Grab data from metadata.name (or data-qtipopts as fallback) using .data() method,\n      html5 = elem.data(opts.metadata.name || 'qtipopts'); // If we don't get an object returned attempt to parse it manualyl without parseJSON\n\n      /* eslint-disable no-empty */\n\n      try {\n        html5 = typeof html5 === 'string' ? $.parseJSON(html5) : html5;\n      } catch (e) {}\n      /* eslint-enable no-empty */\n      // Merge in and sanitize metadata\n\n\n      config = $.extend(TRUE, {}, QTIP.defaults, opts, _typeof(html5) === 'object' ? sanitizeOptions(html5) : NULL, sanitizeOptions(metadata5 || metadata)); // Re-grab our positioning options now we've merged our metadata and set id to passed value\n\n      posOptions = config.position;\n      config.id = id; // Setup missing content if none is detected\n\n      if ('boolean' === typeof config.content.text) {\n        attr = elem.attr(config.content.attr); // Grab from supplied attribute if available\n\n        if (config.content.attr !== FALSE && attr) {\n          config.content.text = attr;\n        } // No valid content was found, abort render\n        else {\n          return FALSE;\n        }\n      } // Setup target options\n\n\n      if (!posOptions.container.length) {\n        posOptions.container = docBody;\n      }\n\n      if (posOptions.target === FALSE) {\n        posOptions.target = newTarget;\n      }\n\n      if (config.show.target === FALSE) {\n        config.show.target = newTarget;\n      }\n\n      if (config.show.solo === TRUE) {\n        config.show.solo = posOptions.container.closest('body');\n      }\n\n      if (config.hide.target === FALSE) {\n        config.hide.target = newTarget;\n      }\n\n      if (config.position.viewport === TRUE) {\n        config.position.viewport = posOptions.container;\n      } // Ensure we only use a single container\n\n\n      posOptions.container = posOptions.container.eq(0); // Convert position corner values into x and y strings\n\n      posOptions.at = new CORNER(posOptions.at, TRUE);\n      posOptions.my = new CORNER(posOptions.my); // Destroy previous tooltip if overwrite is enabled, or skip element if not\n\n      if (elem.data(NAMESPACE)) {\n        if (config.overwrite) {\n          elem.qtip('destroy', true);\n        } else if (config.overwrite === FALSE) {\n          return FALSE;\n        }\n      } // Add has-qtip attribute\n\n\n      elem.attr(ATTR_HAS, id); // Remove title attribute and store it if present\n\n      if (config.suppress && (title = elem.attr('title'))) {\n        // Final attr call fixes event delegatiom and IE default tooltip showing problem\n        elem.removeAttr('title').attr(oldtitle, title).attr('title', '');\n      } // Initialize the tooltip and add API reference\n\n\n      obj = new QTip(elem, config, id, !!attr);\n      elem.data(NAMESPACE, obj);\n      return obj;\n    } // jQuery $.fn extension method\n\n\n    QTIP = $.fn.qtip = function (options, notation, newValue) {\n      var command = ('' + options).toLowerCase(),\n          // Parse command\n      returned = NULL,\n          args = $.makeArray(arguments).slice(1),\n          event = args[args.length - 1],\n          opts = this[0] ? $.data(this[0], NAMESPACE) : NULL; // Check for API request\n\n      if (!arguments.length && opts || command === 'api') {\n        return opts;\n      } // Execute API command if present\n      else if ('string' === typeof options) {\n        this.each(function () {\n          var api = $.data(this, NAMESPACE);\n\n          if (!api) {\n            return TRUE;\n          } // Cache the event if possible\n\n\n          if (event && event.timeStamp) {\n            api.cache.event = event;\n          } // Check for specific API commands\n\n\n          if (notation && (command === 'option' || command === 'options')) {\n            if (newValue !== undefined || $.isPlainObject(notation)) {\n              api.set(notation, newValue);\n            } else {\n              returned = api.get(notation);\n              return FALSE;\n            }\n          } // Execute API command\n          else if (api[command]) {\n            api[command].apply(api, args);\n          }\n        });\n        return returned !== NULL ? returned : this;\n      } // No API commands. validate provided options and setup qTips\n      else if ('object' === _typeof(options) || !arguments.length) {\n        // Sanitize options first\n        opts = sanitizeOptions($.extend(TRUE, {}, options));\n        return this.each(function (i) {\n          var api, id; // Find next available ID, or use custom ID if provided\n\n          id = $.isArray(opts.id) ? opts.id[i] : opts.id;\n          id = !id || id === FALSE || id.length < 1 || QTIP.api[id] ? QTIP.nextid++ : id; // Initialize the qTip and re-grab newly sanitized options\n\n          api = init($(this), id, opts);\n\n          if (api === FALSE) {\n            return TRUE;\n          } else {\n            QTIP.api[id] = api;\n          } // Initialize plugins\n\n\n          $.each(PLUGINS, function () {\n            if (this.initialize === 'initialize') {\n              this(api);\n            }\n          }); // Assign initial pre-render events\n\n          api._assignInitialEvents(event);\n        });\n      }\n    }; // Expose class\n\n\n    $.qtip = QTip; // Populated in render method\n\n    QTIP.api = {};\n    ;\n    $.each({\n      /* Allow other plugins to successfully retrieve the title of an element with a qTip applied */\n      attr: function attr(_attr, val) {\n        if (this.length) {\n          var self = this[0],\n              title = 'title',\n              api = $.data(self, 'qtip');\n\n          if (_attr === title && api && api.options && 'object' === _typeof(api) && 'object' === _typeof(api.options) && api.options.suppress) {\n            if (arguments.length < 2) {\n              return $.attr(self, oldtitle);\n            } // If qTip is rendered and title was originally used as content, update it\n\n\n            if (api && api.options.content.attr === title && api.cache.attr) {\n              api.set('content.text', val);\n            } // Use the regular attr method to set, then cache the result\n\n\n            return this.attr(oldtitle, val);\n          }\n        }\n\n        return $.fn['attr' + replaceSuffix].apply(this, arguments);\n      },\n\n      /* Allow clone to correctly retrieve cached title attributes */\n      clone: function clone(keepData) {\n        // Clone our element using the real clone method\n        var elems = $.fn['clone' + replaceSuffix].apply(this, arguments); // Grab all elements with an oldtitle set, and change it to regular title attribute, if keepData is false\n\n        if (!keepData) {\n          elems.filter('[' + oldtitle + ']').attr('title', function () {\n            return $.attr(this, oldtitle);\n          }).removeAttr(oldtitle);\n        }\n\n        return elems;\n      }\n    }, function (name, func) {\n      if (!func || $.fn[name + replaceSuffix]) {\n        return TRUE;\n      }\n\n      var old = $.fn[name + replaceSuffix] = $.fn[name];\n\n      $.fn[name] = function () {\n        return func.apply(this, arguments) || old.apply(this, arguments);\n      };\n    });\n    /* Fire off 'removeqtip' handler in $.cleanData if jQuery UI not present (it already does similar).\n     * This snippet is taken directly from jQuery UI source code found here:\n     *     http://code.jquery.com/ui/jquery-ui-git.js\n     */\n\n    if (!$.ui) {\n      $['cleanData' + replaceSuffix] = $.cleanData;\n\n      $.cleanData = function (elems) {\n        for (var i = 0, elem; (elem = $(elems[i])).length; i++) {\n          if (elem.attr(ATTR_HAS)) {\n            /* eslint-disable no-empty */\n            try {\n              elem.triggerHandler('removeqtip');\n            } catch (e) {}\n            /* eslint-enable no-empty */\n\n          }\n        }\n\n        $['cleanData' + replaceSuffix].apply(this, arguments);\n      };\n    }\n\n    ; // qTip version\n\n    QTIP.version = '3.0.3'; // Base ID for all qTips\n\n    QTIP.nextid = 0; // Inactive events array\n\n    QTIP.inactiveEvents = INACTIVE_EVENTS; // Base z-index for all qTips\n\n    QTIP.zindex = 15000; // Define configuration defaults\n\n    QTIP.defaults = {\n      prerender: FALSE,\n      id: FALSE,\n      overwrite: TRUE,\n      suppress: TRUE,\n      content: {\n        text: TRUE,\n        attr: 'title',\n        title: FALSE,\n        button: FALSE\n      },\n      position: {\n        my: 'top left',\n        at: 'bottom right',\n        target: FALSE,\n        container: FALSE,\n        viewport: FALSE,\n        adjust: {\n          x: 0,\n          y: 0,\n          mouse: TRUE,\n          scroll: TRUE,\n          resize: TRUE,\n          method: 'flipinvert flipinvert'\n        },\n        effect: function effect(api, pos) {\n          $(this).animate(pos, {\n            duration: 200,\n            queue: FALSE\n          });\n        }\n      },\n      show: {\n        target: FALSE,\n        event: 'mouseenter',\n        effect: TRUE,\n        delay: 90,\n        solo: FALSE,\n        ready: FALSE,\n        autofocus: FALSE\n      },\n      hide: {\n        target: FALSE,\n        event: 'mouseleave',\n        effect: TRUE,\n        delay: 0,\n        fixed: FALSE,\n        inactive: FALSE,\n        leave: 'window',\n        distance: FALSE\n      },\n      style: {\n        classes: '',\n        widget: FALSE,\n        width: FALSE,\n        height: FALSE,\n        def: TRUE\n      },\n      events: {\n        render: NULL,\n        move: NULL,\n        show: NULL,\n        hide: NULL,\n        toggle: NULL,\n        visible: NULL,\n        hidden: NULL,\n        focus: NULL,\n        blur: NULL\n      }\n    };\n    ;\n    var TIP,\n        createVML,\n        SCALE,\n        PIXEL_RATIO,\n        BACKING_STORE_RATIO,\n        // Common CSS strings\n    MARGIN = 'margin',\n        BORDER = 'border',\n        COLOR = 'color',\n        BG_COLOR = 'background-color',\n        TRANSPARENT = 'transparent',\n        IMPORTANT = ' !important',\n        // Check if the browser supports <canvas/> elements\n    HASCANVAS = !!document.createElement('canvas').getContext,\n        // Invalid colour values used in parseColours()\n    INVALID = /rgba?\\(0, 0, 0(, 0)?\\)|transparent|#123456/i; // Camel-case method, taken from jQuery source\n    // http://code.jquery.com/jquery-1.8.0.js\n\n    function camel(s) {\n      return s.charAt(0).toUpperCase() + s.slice(1);\n    }\n    /*\n     * Modified from Modernizr's testPropsAll()\n     * http://modernizr.com/downloads/modernizr-latest.js\n     */\n\n\n    var cssProps = {},\n        cssPrefixes = ['Webkit', 'O', 'Moz', 'ms'];\n\n    function vendorCss(elem, prop) {\n      var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),\n          props = (prop + ' ' + cssPrefixes.join(ucProp + ' ') + ucProp).split(' '),\n          cur,\n          val,\n          i = 0; // If the property has already been mapped...\n\n      if (cssProps[prop]) {\n        return elem.css(cssProps[prop]);\n      }\n\n      while (cur = props[i++]) {\n        if ((val = elem.css(cur)) !== undefined) {\n          cssProps[prop] = cur;\n          return val;\n        }\n      }\n    } // Parse a given elements CSS property into an int\n\n\n    function intCss(elem, prop) {\n      return Math.ceil(parseFloat(vendorCss(elem, prop)));\n    } // VML creation (for IE only)\n\n\n    if (!HASCANVAS) {\n      createVML = function createVML(tag, props, style) {\n        return '<qtipvml:' + tag + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"qtip-vml\" ' + (props || '') + ' style=\"behavior: url(#default#VML); ' + (style || '') + '\" />';\n      };\n    } // Canvas only definitions\n    else {\n      PIXEL_RATIO = window.devicePixelRatio || 1;\n\n      BACKING_STORE_RATIO = function () {\n        var context = document.createElement('canvas').getContext('2d');\n        return context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || 1;\n      }();\n\n      SCALE = PIXEL_RATIO / BACKING_STORE_RATIO;\n    }\n\n    function Tip(qtip, options) {\n      this._ns = 'tip';\n      this.options = options;\n      this.offset = options.offset;\n      this.size = [options.width, options.height]; // Initialize\n\n      this.qtip = qtip;\n      this.init(qtip);\n    }\n\n    $.extend(Tip.prototype, {\n      init: function init(qtip) {\n        var context, tip; // Create tip element and prepend to the tooltip\n\n        tip = this.element = qtip.elements.tip = $('<div />', {\n          'class': NAMESPACE + '-tip'\n        }).prependTo(qtip.tooltip); // Create tip drawing element(s)\n\n        if (HASCANVAS) {\n          // save() as soon as we create the canvas element so FF2 doesn't bork on our first restore()!\n          context = $('<canvas />').appendTo(this.element)[0].getContext('2d'); // Setup constant parameters\n\n          context.lineJoin = 'miter';\n          context.miterLimit = 100000;\n          context.save();\n        } else {\n          context = createVML('shape', 'coordorigin=\"0,0\"', 'position:absolute;');\n          this.element.html(context + context); // Prevent mousing down on the tip since it causes problems with .live() handling in IE due to VML\n\n          qtip._bind($('*', tip).add(tip), ['click', 'mousedown'], function (event) {\n            event.stopPropagation();\n          }, this._ns);\n        } // Bind update events\n\n\n        qtip._bind(qtip.tooltip, 'tooltipmove', this.reposition, this._ns, this); // Create it\n\n\n        this.create();\n      },\n      _swapDimensions: function _swapDimensions() {\n        this.size[0] = this.options.height;\n        this.size[1] = this.options.width;\n      },\n      _resetDimensions: function _resetDimensions() {\n        this.size[0] = this.options.width;\n        this.size[1] = this.options.height;\n      },\n      _useTitle: function _useTitle(corner) {\n        var titlebar = this.qtip.elements.titlebar;\n        return titlebar && (corner.y === TOP || corner.y === CENTER && this.element.position().top + this.size[1] / 2 + this.options.offset < titlebar.outerHeight(TRUE));\n      },\n      _parseCorner: function _parseCorner(corner) {\n        var my = this.qtip.options.position.my; // Detect corner and mimic properties\n\n        if (corner === FALSE || my === FALSE) {\n          corner = FALSE;\n        } else if (corner === TRUE) {\n          corner = new CORNER(my.string());\n        } else if (!corner.string) {\n          corner = new CORNER(corner);\n          corner.fixed = TRUE;\n        }\n\n        return corner;\n      },\n      _parseWidth: function _parseWidth(corner, side, use) {\n        var elements = this.qtip.elements,\n            prop = BORDER + camel(side) + 'Width';\n        return (use ? intCss(use, prop) : intCss(elements.content, prop) || intCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) || intCss(elements.tooltip, prop)) || 0;\n      },\n      _parseRadius: function _parseRadius(corner) {\n        var elements = this.qtip.elements,\n            prop = BORDER + camel(corner.y) + camel(corner.x) + 'Radius';\n        return BROWSER.ie < 9 ? 0 : intCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) || intCss(elements.tooltip, prop) || 0;\n      },\n      _invalidColour: function _invalidColour(elem, prop, compare) {\n        var val = elem.css(prop);\n        return !val || compare && val === elem.css(compare) || INVALID.test(val) ? FALSE : val;\n      },\n      _parseColours: function _parseColours(corner) {\n        var elements = this.qtip.elements,\n            tip = this.element.css('cssText', ''),\n            borderSide = BORDER + camel(corner[corner.precedance]) + camel(COLOR),\n            colorElem = this._useTitle(corner) && elements.titlebar || elements.content,\n            css = this._invalidColour,\n            color = []; // Attempt to detect the background colour from various elements, left-to-right precedance\n\n        color[0] = css(tip, BG_COLOR) || css(colorElem, BG_COLOR) || css(elements.content, BG_COLOR) || css(elements.tooltip, BG_COLOR) || tip.css(BG_COLOR); // Attempt to detect the correct border side colour from various elements, left-to-right precedance\n\n        color[1] = css(tip, borderSide, COLOR) || css(colorElem, borderSide, COLOR) || css(elements.content, borderSide, COLOR) || css(elements.tooltip, borderSide, COLOR) || elements.tooltip.css(borderSide); // Reset background and border colours\n\n        $('*', tip).add(tip).css('cssText', BG_COLOR + ':' + TRANSPARENT + IMPORTANT + ';' + BORDER + ':0' + IMPORTANT + ';');\n        return color;\n      },\n      _calculateSize: function _calculateSize(corner) {\n        var y = corner.precedance === Y,\n            width = this.options.width,\n            height = this.options.height,\n            isCenter = corner.abbrev() === 'c',\n            base = (y ? width : height) * (isCenter ? 0.5 : 1),\n            pow = Math.pow,\n            round = Math.round,\n            bigHyp,\n            ratio,\n            result,\n            smallHyp = Math.sqrt(pow(base, 2) + pow(height, 2)),\n            hyp = [this.border / base * smallHyp, this.border / height * smallHyp];\n        hyp[2] = Math.sqrt(pow(hyp[0], 2) - pow(this.border, 2));\n        hyp[3] = Math.sqrt(pow(hyp[1], 2) - pow(this.border, 2));\n        bigHyp = smallHyp + hyp[2] + hyp[3] + (isCenter ? 0 : hyp[0]);\n        ratio = bigHyp / smallHyp;\n        result = [round(ratio * width), round(ratio * height)];\n        return y ? result : result.reverse();\n      },\n      // Tip coordinates calculator\n      _calculateTip: function _calculateTip(corner, size, scale) {\n        scale = scale || 1;\n        size = size || this.size;\n        var width = size[0] * scale,\n            height = size[1] * scale,\n            width2 = Math.ceil(width / 2),\n            height2 = Math.ceil(height / 2),\n            // Define tip coordinates in terms of height and width values\n        tips = {\n          br: [0, 0, width, height, width, 0],\n          bl: [0, 0, width, 0, 0, height],\n          tr: [0, height, width, 0, width, height],\n          tl: [0, 0, 0, height, width, height],\n          tc: [0, height, width2, 0, width, height],\n          bc: [0, 0, width, 0, width2, height],\n          rc: [0, 0, width, height2, 0, height],\n          lc: [width, 0, width, height, 0, height2]\n        }; // Set common side shapes\n\n        tips.lt = tips.br;\n        tips.rt = tips.bl;\n        tips.lb = tips.tr;\n        tips.rb = tips.tl;\n        return tips[corner.abbrev()];\n      },\n      // Tip coordinates drawer (canvas)\n      _drawCoords: function _drawCoords(context, coords) {\n        context.beginPath();\n        context.moveTo(coords[0], coords[1]);\n        context.lineTo(coords[2], coords[3]);\n        context.lineTo(coords[4], coords[5]);\n        context.closePath();\n      },\n      create: function create() {\n        // Determine tip corner\n        var c = this.corner = (HASCANVAS || BROWSER.ie) && this._parseCorner(this.options.corner); // If we have a tip corner...\n\n\n        this.enabled = !!this.corner && this.corner.abbrev() !== 'c';\n\n        if (this.enabled) {\n          // Cache it\n          this.qtip.cache.corner = c.clone(); // Create it\n\n          this.update();\n        } // Toggle tip element\n\n\n        this.element.toggle(this.enabled);\n        return this.corner;\n      },\n      update: function update(corner, position) {\n        if (!this.enabled) {\n          return this;\n        }\n\n        var elements = this.qtip.elements,\n            tip = this.element,\n            inner = tip.children(),\n            options = this.options,\n            curSize = this.size,\n            mimic = options.mimic,\n            round = Math.round,\n            color,\n            precedance,\n            context,\n            coords,\n            bigCoords,\n            translate,\n            newSize,\n            border; // Re-determine tip if not already set\n\n        if (!corner) {\n          corner = this.qtip.cache.corner || this.corner;\n        } // Use corner property if we detect an invalid mimic value\n\n\n        if (mimic === FALSE) {\n          mimic = corner;\n        } // Otherwise inherit mimic properties from the corner object as necessary\n        else {\n          mimic = new CORNER(mimic);\n          mimic.precedance = corner.precedance;\n\n          if (mimic.x === 'inherit') {\n            mimic.x = corner.x;\n          } else if (mimic.y === 'inherit') {\n            mimic.y = corner.y;\n          } else if (mimic.x === mimic.y) {\n            mimic[corner.precedance] = corner[corner.precedance];\n          }\n        }\n\n        precedance = mimic.precedance; // Ensure the tip width.height are relative to the tip position\n\n        if (corner.precedance === X) {\n          this._swapDimensions();\n        } else {\n          this._resetDimensions();\n        } // Update our colours\n\n\n        color = this.color = this._parseColours(corner); // Detect border width, taking into account colours\n\n        if (color[1] !== TRANSPARENT) {\n          // Grab border width\n          border = this.border = this._parseWidth(corner, corner[corner.precedance]); // If border width isn't zero, use border color as fill if it's not invalid (1.0 style tips)\n\n          if (options.border && border < 1 && !INVALID.test(color[1])) {\n            color[0] = color[1];\n          } // Set border width (use detected border width if options.border is true)\n\n\n          this.border = border = options.border !== TRUE ? options.border : border;\n        } // Border colour was invalid, set border to zero\n        else {\n          this.border = border = 0;\n        } // Determine tip size\n\n\n        newSize = this.size = this._calculateSize(corner);\n        tip.css({\n          width: newSize[0],\n          height: newSize[1],\n          lineHeight: newSize[1] + 'px'\n        }); // Calculate tip translation\n\n        if (corner.precedance === Y) {\n          translate = [round(mimic.x === LEFT ? border : mimic.x === RIGHT ? newSize[0] - curSize[0] - border : (newSize[0] - curSize[0]) / 2), round(mimic.y === TOP ? newSize[1] - curSize[1] : 0)];\n        } else {\n          translate = [round(mimic.x === LEFT ? newSize[0] - curSize[0] : 0), round(mimic.y === TOP ? border : mimic.y === BOTTOM ? newSize[1] - curSize[1] - border : (newSize[1] - curSize[1]) / 2)];\n        } // Canvas drawing implementation\n\n\n        if (HASCANVAS) {\n          // Grab canvas context and clear/save it\n          context = inner[0].getContext('2d');\n          context.restore();\n          context.save();\n          context.clearRect(0, 0, 6000, 6000); // Calculate coordinates\n\n          coords = this._calculateTip(mimic, curSize, SCALE);\n          bigCoords = this._calculateTip(mimic, this.size, SCALE); // Set the canvas size using calculated size\n\n          inner.attr(WIDTH, newSize[0] * SCALE).attr(HEIGHT, newSize[1] * SCALE);\n          inner.css(WIDTH, newSize[0]).css(HEIGHT, newSize[1]); // Draw the outer-stroke tip\n\n          this._drawCoords(context, bigCoords);\n\n          context.fillStyle = color[1];\n          context.fill(); // Draw the actual tip\n\n          context.translate(translate[0] * SCALE, translate[1] * SCALE);\n\n          this._drawCoords(context, coords);\n\n          context.fillStyle = color[0];\n          context.fill();\n        } // VML (IE Proprietary implementation)\n        else {\n          // Calculate coordinates\n          coords = this._calculateTip(mimic); // Setup coordinates string\n\n          coords = 'm' + coords[0] + ',' + coords[1] + ' l' + coords[2] + ',' + coords[3] + ' ' + coords[4] + ',' + coords[5] + ' xe'; // Setup VML-specific offset for pixel-perfection\n\n          translate[2] = border && /^(r|b)/i.test(corner.string()) ? BROWSER.ie === 8 ? 2 : 1 : 0; // Set initial CSS\n\n          inner.css({\n            coordsize: newSize[0] + border + ' ' + newSize[1] + border,\n            antialias: '' + (mimic.string().indexOf(CENTER) > -1),\n            left: translate[0] - translate[2] * Number(precedance === X),\n            top: translate[1] - translate[2] * Number(precedance === Y),\n            width: newSize[0] + border,\n            height: newSize[1] + border\n          }).each(function (i) {\n            var $this = $(this); // Set shape specific attributes\n\n            $this[$this.prop ? 'prop' : 'attr']({\n              coordsize: newSize[0] + border + ' ' + newSize[1] + border,\n              path: coords,\n              fillcolor: color[0],\n              filled: !!i,\n              stroked: !i\n            }).toggle(!!(border || i)); // Check if border is enabled and add stroke element\n\n            !i && $this.html(createVML('stroke', 'weight=\"' + border * 2 + 'px\" color=\"' + color[1] + '\" miterlimit=\"1000\" joinstyle=\"miter\"'));\n          });\n        } // Opera bug #357 - Incorrect tip position\n        // https://github.com/Craga89/qTip2/issues/367\n\n\n        window.opera && setTimeout(function () {\n          elements.tip.css({\n            display: 'inline-block',\n            visibility: 'visible'\n          });\n        }, 1); // Position if needed\n\n        if (position !== FALSE) {\n          this.calculate(corner, newSize);\n        }\n      },\n      calculate: function calculate(corner, size) {\n        if (!this.enabled) {\n          return FALSE;\n        }\n\n        var self = this,\n            elements = this.qtip.elements,\n            tip = this.element,\n            userOffset = this.options.offset,\n            position = {},\n            precedance,\n            corners; // Inherit corner if not provided\n\n        corner = corner || this.corner;\n        precedance = corner.precedance; // Determine which tip dimension to use for adjustment\n\n        size = size || this._calculateSize(corner); // Setup corners and offset array\n\n        corners = [corner.x, corner.y];\n\n        if (precedance === X) {\n          corners.reverse();\n        } // Calculate tip position\n\n\n        $.each(corners, function (i, side) {\n          var b, bc, br;\n\n          if (side === CENTER) {\n            b = precedance === Y ? LEFT : TOP;\n            position[b] = '50%';\n            position[MARGIN + '-' + b] = -Math.round(size[precedance === Y ? 0 : 1] / 2) + userOffset;\n          } else {\n            b = self._parseWidth(corner, side, elements.tooltip);\n            bc = self._parseWidth(corner, side, elements.content);\n            br = self._parseRadius(corner);\n            position[side] = Math.max(-self.border, i ? bc : userOffset + (br > b ? br : -b));\n          }\n        }); // Adjust for tip size\n\n        position[corner[precedance]] -= size[precedance === X ? 0 : 1]; // Set and return new position\n\n        tip.css({\n          margin: '',\n          top: '',\n          bottom: '',\n          left: '',\n          right: ''\n        }).css(position);\n        return position;\n      },\n      reposition: function reposition(event, api, pos) {\n        if (!this.enabled) {\n          return;\n        }\n\n        var cache = api.cache,\n            newCorner = this.corner.clone(),\n            adjust = pos.adjusted,\n            method = api.options.position.adjust.method.split(' '),\n            horizontal = method[0],\n            vertical = method[1] || method[0],\n            shift = {\n          left: FALSE,\n          top: FALSE,\n          x: 0,\n          y: 0\n        },\n            offset,\n            css = {},\n            props;\n\n        function shiftflip(direction, precedance, popposite, side, opposite) {\n          // Horizontal - Shift or flip method\n          if (direction === SHIFT && newCorner.precedance === precedance && adjust[side] && newCorner[popposite] !== CENTER) {\n            newCorner.precedance = newCorner.precedance === X ? Y : X;\n          } else if (direction !== SHIFT && adjust[side]) {\n            newCorner[precedance] = newCorner[precedance] === CENTER ? adjust[side] > 0 ? side : opposite : newCorner[precedance] === side ? opposite : side;\n          }\n        }\n\n        function shiftonly(xy, side, opposite) {\n          if (newCorner[xy] === CENTER) {\n            css[MARGIN + '-' + side] = shift[xy] = offset[MARGIN + '-' + side] - adjust[side];\n          } else {\n            props = offset[opposite] !== undefined ? [adjust[side], -offset[side]] : [-adjust[side], offset[side]];\n\n            if ((shift[xy] = Math.max(props[0], props[1])) > props[0]) {\n              pos[side] -= adjust[side];\n              shift[side] = FALSE;\n            }\n\n            css[offset[opposite] !== undefined ? opposite : side] = shift[xy];\n          }\n        } // If our tip position isn't fixed e.g. doesn't adjust with viewport...\n\n\n        if (this.corner.fixed !== TRUE) {\n          // Perform shift/flip adjustments\n          shiftflip(horizontal, X, Y, LEFT, RIGHT);\n          shiftflip(vertical, Y, X, TOP, BOTTOM); // Update and redraw the tip if needed (check cached details of last drawn tip)\n\n          if (newCorner.string() !== cache.corner.string() || cache.cornerTop !== adjust.top || cache.cornerLeft !== adjust.left) {\n            this.update(newCorner, FALSE);\n          }\n        } // Setup tip offset properties\n\n\n        offset = this.calculate(newCorner); // Readjust offset object to make it left/top\n\n        if (offset.right !== undefined) {\n          offset.left = -offset.right;\n        }\n\n        if (offset.bottom !== undefined) {\n          offset.top = -offset.bottom;\n        }\n\n        offset.user = this.offset; // Perform shift adjustments\n\n        shift.left = horizontal === SHIFT && !!adjust.left;\n\n        if (shift.left) {\n          shiftonly(X, LEFT, RIGHT);\n        }\n\n        shift.top = vertical === SHIFT && !!adjust.top;\n\n        if (shift.top) {\n          shiftonly(Y, TOP, BOTTOM);\n        }\n        /*\n        * If the tip is adjusted in both dimensions, or in a\n        * direction that would cause it to be anywhere but the\n        * outer border, hide it!\n        */\n\n\n        this.element.css(css).toggle(!(shift.x && shift.y || newCorner.x === CENTER && shift.y || newCorner.y === CENTER && shift.x)); // Adjust position to accomodate tip dimensions\n\n        pos.left -= offset.left.charAt ? offset.user : horizontal !== SHIFT || shift.top || !shift.left && !shift.top ? offset.left + this.border : 0;\n        pos.top -= offset.top.charAt ? offset.user : vertical !== SHIFT || shift.left || !shift.left && !shift.top ? offset.top + this.border : 0; // Cache details\n\n        cache.cornerLeft = adjust.left;\n        cache.cornerTop = adjust.top;\n        cache.corner = newCorner.clone();\n      },\n      destroy: function destroy() {\n        // Unbind events\n        this.qtip._unbind(this.qtip.tooltip, this._ns); // Remove the tip element(s)\n\n\n        if (this.qtip.elements.tip) {\n          this.qtip.elements.tip.find('*').remove().end().remove();\n        }\n      }\n    });\n\n    TIP = PLUGINS.tip = function (api) {\n      return new Tip(api, api.options.style.tip);\n    }; // Initialize tip on render\n\n\n    TIP.initialize = 'render'; // Setup plugin sanitization options\n\n    TIP.sanitize = function (options) {\n      if (options.style && 'tip' in options.style) {\n        var opts = options.style.tip;\n\n        if (_typeof(opts) !== 'object') {\n          opts = options.style.tip = {\n            corner: opts\n          };\n        }\n\n        if (!/string|boolean/i.test(_typeof(opts.corner))) {\n          opts.corner = TRUE;\n        }\n      }\n    }; // Add new option checks for the plugin\n\n\n    CHECKS.tip = {\n      '^position.my|style.tip.(corner|mimic|border)$': function positionMyStyleTipCornerMimicBorder$() {\n        // Make sure a tip can be drawn\n        this.create(); // Reposition the tooltip\n\n        this.qtip.reposition();\n      },\n      '^style.tip.(height|width)$': function styleTipHeightWidth$(obj) {\n        // Re-set dimensions and redraw the tip\n        this.size = [obj.width, obj.height];\n        this.update(); // Reposition the tooltip\n\n        this.qtip.reposition();\n      },\n      '^content.title|style.(classes|widget)$': function contentTitleStyleClassesWidget$() {\n        this.update();\n      }\n    }; // Extend original qTip defaults\n\n    $.extend(TRUE, QTIP.defaults, {\n      style: {\n        tip: {\n          corner: TRUE,\n          mimic: FALSE,\n          width: 6,\n          height: 6,\n          border: TRUE,\n          offset: 0\n        }\n      }\n    });\n    ;\n    var MODAL,\n        OVERLAY,\n        MODALCLASS = 'qtip-modal',\n        MODALSELECTOR = '.' + MODALCLASS;\n\n    OVERLAY = function OVERLAY() {\n      var self = this,\n          focusableElems = {},\n          current,\n          prevState,\n          elem; // Modified code from jQuery UI 1.10.0 source\n      // http://code.jquery.com/ui/1.10.0/jquery-ui.js\n\n      function focusable(element) {\n        // Use the defined focusable checker when possible\n        if ($.expr[':'].focusable) {\n          return $.expr[':'].focusable;\n        }\n\n        var isTabIndexNotNaN = !isNaN($.attr(element, 'tabindex')),\n            nodeName = element.nodeName && element.nodeName.toLowerCase(),\n            map,\n            mapName,\n            img;\n\n        if ('area' === nodeName) {\n          map = element.parentNode;\n          mapName = map.name;\n\n          if (!element.href || !mapName || map.nodeName.toLowerCase() !== 'map') {\n            return false;\n          }\n\n          img = $('img[usemap=#' + mapName + ']')[0];\n          return !!img && img.is(':visible');\n        }\n\n        return /input|select|textarea|button|object/.test(nodeName) ? !element.disabled : 'a' === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN;\n      } // Focus inputs using cached focusable elements (see update())\n\n\n      function focusInputs(blurElems) {\n        // Blurring body element in IE causes window.open windows to unfocus!\n        if (focusableElems.length < 1 && blurElems.length) {\n          blurElems.not('body').blur();\n        } // Focus the inputs\n        else {\n          focusableElems.first().focus();\n        }\n      } // Steal focus from elements outside tooltip\n\n\n      function stealFocus(event) {\n        if (!elem.is(':visible')) {\n          return;\n        }\n\n        var target = $(event.target),\n            tooltip = current.tooltip,\n            container = target.closest(SELECTOR),\n            targetOnTop; // Determine if input container target is above this\n\n        targetOnTop = container.length < 1 ? FALSE : parseInt(container[0].style.zIndex, 10) > parseInt(tooltip[0].style.zIndex, 10); // If we're showing a modal, but focus has landed on an input below\n        // this modal, divert focus to the first visible input in this modal\n        // or if we can't find one... the tooltip itself\n\n        if (!targetOnTop && target.closest(SELECTOR)[0] !== tooltip[0]) {\n          focusInputs(target);\n        }\n      }\n\n      $.extend(self, {\n        init: function init() {\n          // Create document overlay\n          elem = self.elem = $('<div />', {\n            id: 'qtip-overlay',\n            html: '<div></div>',\n            mousedown: function mousedown() {\n              return FALSE;\n            }\n          }).hide(); // Make sure we can't focus anything outside the tooltip\n\n          $(document.body).bind('focusin' + MODALSELECTOR, stealFocus); // Apply keyboard \"Escape key\" close handler\n\n          $(document).bind('keydown' + MODALSELECTOR, function (event) {\n            if (current && current.options.show.modal.escape && event.keyCode === 27) {\n              current.hide(event);\n            }\n          }); // Apply click handler for blur option\n\n          elem.bind('click' + MODALSELECTOR, function (event) {\n            if (current && current.options.show.modal.blur) {\n              current.hide(event);\n            }\n          });\n          return self;\n        },\n        update: function update(api) {\n          // Update current API reference\n          current = api; // Update focusable elements if enabled\n\n          if (api.options.show.modal.stealfocus !== FALSE) {\n            focusableElems = api.tooltip.find('*').filter(function () {\n              return focusable(this);\n            });\n          } else {\n            focusableElems = [];\n          }\n        },\n        toggle: function toggle(api, state, duration) {\n          var tooltip = api.tooltip,\n              options = api.options.show.modal,\n              effect = options.effect,\n              type = state ? 'show' : 'hide',\n              visible = elem.is(':visible'),\n              visibleModals = $(MODALSELECTOR).filter(':visible:not(:animated)').not(tooltip); // Set active tooltip API reference\n\n          self.update(api); // If the modal can steal the focus...\n          // Blur the current item and focus anything in the modal we an\n\n          if (state && options.stealfocus !== FALSE) {\n            focusInputs($(':focus'));\n          } // Toggle backdrop cursor style on show\n\n\n          elem.toggleClass('blurs', options.blur); // Append to body on show\n\n          if (state) {\n            elem.appendTo(document.body);\n          } // Prevent modal from conflicting with show.solo, and don't hide backdrop is other modals are visible\n\n\n          if (elem.is(':animated') && visible === state && prevState !== FALSE || !state && visibleModals.length) {\n            return self;\n          } // Stop all animations\n\n\n          elem.stop(TRUE, FALSE); // Use custom function if provided\n\n          if ($.isFunction(effect)) {\n            effect.call(elem, state);\n          } // If no effect type is supplied, use a simple toggle\n          else if (effect === FALSE) {\n            elem[type]();\n          } // Use basic fade function\n          else {\n            elem.fadeTo(parseInt(duration, 10) || 90, state ? 1 : 0, function () {\n              if (!state) {\n                elem.hide();\n              }\n            });\n          } // Reset position and detach from body on hide\n\n\n          if (!state) {\n            elem.queue(function (next) {\n              elem.css({\n                left: '',\n                top: ''\n              });\n\n              if (!$(MODALSELECTOR).length) {\n                elem.detach();\n              }\n\n              next();\n            });\n          } // Cache the state\n\n\n          prevState = state; // If the tooltip is destroyed, set reference to null\n\n          if (current.destroyed) {\n            current = NULL;\n          }\n\n          return self;\n        }\n      });\n      self.init();\n    };\n\n    OVERLAY = new OVERLAY();\n\n    function Modal(api, options) {\n      this.options = options;\n      this._ns = '-modal';\n      this.qtip = api;\n      this.init(api);\n    }\n\n    $.extend(Modal.prototype, {\n      init: function init(qtip) {\n        var tooltip = qtip.tooltip; // If modal is disabled... return\n\n        if (!this.options.on) {\n          return this;\n        } // Set overlay reference\n\n\n        qtip.elements.overlay = OVERLAY.elem; // Add unique attribute so we can grab modal tooltips easily via a SELECTOR, and set z-index\n\n        tooltip.addClass(MODALCLASS).css('z-index', QTIP.modal_zindex + $(MODALSELECTOR).length); // Apply our show/hide/focus modal events\n\n        qtip._bind(tooltip, ['tooltipshow', 'tooltiphide'], function (event, api, duration) {\n          var oEvent = event.originalEvent; // Make sure mouseout doesn't trigger a hide when showing the modal and mousing onto backdrop\n\n          if (event.target === tooltip[0]) {\n            if (oEvent && event.type === 'tooltiphide' && /mouse(leave|enter)/.test(oEvent.type) && $(oEvent.relatedTarget).closest(OVERLAY.elem[0]).length) {\n              /* eslint-disable no-empty */\n              try {\n                event.preventDefault();\n              } catch (e) {}\n              /* eslint-enable no-empty */\n\n            } else if (!oEvent || oEvent && oEvent.type !== 'tooltipsolo') {\n              this.toggle(event, event.type === 'tooltipshow', duration);\n            }\n          }\n        }, this._ns, this); // Adjust modal z-index on tooltip focus\n\n\n        qtip._bind(tooltip, 'tooltipfocus', function (event, api) {\n          // If focus was cancelled before it reached us, don't do anything\n          if (event.isDefaultPrevented() || event.target !== tooltip[0]) {\n            return;\n          }\n\n          var qtips = $(MODALSELECTOR),\n              // Keep the modal's lower than other, regular qtips\n          newIndex = QTIP.modal_zindex + qtips.length,\n              curIndex = parseInt(tooltip[0].style.zIndex, 10); // Set overlay z-index\n\n          OVERLAY.elem[0].style.zIndex = newIndex - 1; // Reduce modal z-index's and keep them properly ordered\n\n          qtips.each(function () {\n            if (this.style.zIndex > curIndex) {\n              this.style.zIndex -= 1;\n            }\n          }); // Fire blur event for focused tooltip\n\n          qtips.filter('.' + CLASS_FOCUS).qtip('blur', event.originalEvent); // Set the new z-index\n\n          tooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex; // Set current\n\n          OVERLAY.update(api); // Prevent default handling\n\n          /* eslint-disable no-empty */\n\n          try {\n            event.preventDefault();\n          } catch (e) {}\n          /* eslint-enable no-empty */\n\n        }, this._ns, this); // Focus any other visible modals when this one hides\n\n\n        qtip._bind(tooltip, 'tooltiphide', function (event) {\n          if (event.target === tooltip[0]) {\n            $(MODALSELECTOR).filter(':visible').not(tooltip).last().qtip('focus', event);\n          }\n        }, this._ns, this);\n      },\n      toggle: function toggle(event, state, duration) {\n        // Make sure default event hasn't been prevented\n        if (event && event.isDefaultPrevented()) {\n          return this;\n        } // Toggle it\n\n\n        OVERLAY.toggle(this.qtip, !!state, duration);\n      },\n      destroy: function destroy() {\n        // Remove modal class\n        this.qtip.tooltip.removeClass(MODALCLASS); // Remove bound events\n\n        this.qtip._unbind(this.qtip.tooltip, this._ns); // Delete element reference\n\n\n        OVERLAY.toggle(this.qtip, FALSE);\n        delete this.qtip.elements.overlay;\n      }\n    });\n\n    MODAL = PLUGINS.modal = function (api) {\n      return new Modal(api, api.options.show.modal);\n    }; // Setup sanitiztion rules\n\n\n    MODAL.sanitize = function (opts) {\n      if (opts.show) {\n        if (_typeof(opts.show.modal) !== 'object') {\n          opts.show.modal = {\n            on: !!opts.show.modal\n          };\n        } else if (typeof opts.show.modal.on === 'undefined') {\n          opts.show.modal.on = TRUE;\n        }\n      }\n    }; // Base z-index for all modal tooltips (use qTip core z-index as a base)\n\n    /* eslint-disable camelcase */\n\n\n    QTIP.modal_zindex = QTIP.zindex - 200;\n    /* eslint-enable camelcase */\n    // Plugin needs to be initialized on render\n\n    MODAL.initialize = 'render'; // Setup option set checks\n\n    CHECKS.modal = {\n      '^show.modal.(on|blur)$': function showModalOnBlur$() {\n        // Initialise\n        this.destroy();\n        this.init(); // Show the modal if not visible already and tooltip is visible\n\n        this.qtip.elems.overlay.toggle(this.qtip.tooltip[0].offsetWidth > 0);\n      }\n    }; // Extend original api defaults\n\n    $.extend(TRUE, QTIP.defaults, {\n      show: {\n        modal: {\n          on: FALSE,\n          effect: TRUE,\n          blur: TRUE,\n          stealfocus: TRUE,\n          escape: TRUE\n        }\n      }\n    });\n    ;\n\n    PLUGINS.viewport = function (api, position, posOptions, targetWidth, targetHeight, elemWidth, elemHeight) {\n      var target = posOptions.target,\n          tooltip = api.elements.tooltip,\n          my = posOptions.my,\n          at = posOptions.at,\n          adjust = posOptions.adjust,\n          method = adjust.method.split(' '),\n          methodX = method[0],\n          methodY = method[1] || method[0],\n          viewport = posOptions.viewport,\n          container = posOptions.container,\n          adjusted = {\n        left: 0,\n        top: 0\n      },\n          fixed,\n          newMy,\n          containerOffset,\n          containerStatic,\n          viewportWidth,\n          viewportHeight,\n          viewportScroll,\n          viewportOffset; // If viewport is not a jQuery element, or it's the window/document, or no adjustment method is used... return\n\n      if (!viewport.jquery || target[0] === window || target[0] === document.body || adjust.method === 'none') {\n        return adjusted;\n      } // Cach container details\n\n\n      containerOffset = container.offset() || adjusted;\n      containerStatic = container.css('position') === 'static'; // Cache our viewport details\n\n      fixed = tooltip.css('position') === 'fixed';\n      viewportWidth = viewport[0] === window ? viewport.width() : viewport.outerWidth(FALSE);\n      viewportHeight = viewport[0] === window ? viewport.height() : viewport.outerHeight(FALSE);\n      viewportScroll = {\n        left: fixed ? 0 : viewport.scrollLeft(),\n        top: fixed ? 0 : viewport.scrollTop()\n      };\n      viewportOffset = viewport.offset() || adjusted; // Generic calculation method\n\n      function calculate(side, otherSide, type, adjustment, side1, side2, lengthName, targetLength, elemLength) {\n        var initialPos = position[side1],\n            mySide = my[side],\n            atSide = at[side],\n            isShift = type === SHIFT,\n            myLength = mySide === side1 ? elemLength : mySide === side2 ? -elemLength : -elemLength / 2,\n            atLength = atSide === side1 ? targetLength : atSide === side2 ? -targetLength : -targetLength / 2,\n            sideOffset = viewportScroll[side1] + viewportOffset[side1] - (containerStatic ? 0 : containerOffset[side1]),\n            overflow1 = sideOffset - initialPos,\n            overflow2 = initialPos + elemLength - (lengthName === WIDTH ? viewportWidth : viewportHeight) - sideOffset,\n            offset = myLength - (my.precedance === side || mySide === my[otherSide] ? atLength : 0) - (atSide === CENTER ? targetLength / 2 : 0); // shift\n\n        if (isShift) {\n          offset = (mySide === side1 ? 1 : -1) * myLength; // Adjust position but keep it within viewport dimensions\n\n          position[side1] += overflow1 > 0 ? overflow1 : overflow2 > 0 ? -overflow2 : 0;\n          position[side1] = Math.max(-containerOffset[side1] + viewportOffset[side1], initialPos - offset, Math.min(Math.max(-containerOffset[side1] + viewportOffset[side1] + (lengthName === WIDTH ? viewportWidth : viewportHeight), initialPos + offset), position[side1], // Make sure we don't adjust complete off the element when using 'center'\n          mySide === 'center' ? initialPos - myLength : 1E9));\n        } // flip/flipinvert\n        else {\n          // Update adjustment amount depending on if using flipinvert or flip\n          adjustment *= type === FLIPINVERT ? 2 : 0; // Check for overflow on the left/top\n\n          if (overflow1 > 0 && (mySide !== side1 || overflow2 > 0)) {\n            position[side1] -= offset + adjustment;\n            newMy.invert(side, side1);\n          } // Check for overflow on the bottom/right\n          else if (overflow2 > 0 && (mySide !== side2 || overflow1 > 0)) {\n            position[side1] -= (mySide === CENTER ? -offset : offset) + adjustment;\n            newMy.invert(side, side2);\n          } // Make sure we haven't made things worse with the adjustment and reset if so\n\n\n          if (position[side1] < viewportScroll[side1] && -position[side1] > overflow2) {\n            position[side1] = initialPos;\n            newMy = my.clone();\n          }\n        }\n\n        return position[side1] - initialPos;\n      } // Set newMy if using flip or flipinvert methods\n\n\n      if (methodX !== 'shift' || methodY !== 'shift') {\n        newMy = my.clone();\n      } // Adjust position based onviewport and adjustment options\n\n\n      adjusted = {\n        left: methodX !== 'none' ? calculate(X, Y, methodX, adjust.x, LEFT, RIGHT, WIDTH, targetWidth, elemWidth) : 0,\n        top: methodY !== 'none' ? calculate(Y, X, methodY, adjust.y, TOP, BOTTOM, HEIGHT, targetHeight, elemHeight) : 0,\n        my: newMy\n      };\n      return adjusted;\n    };\n\n    ;\n    PLUGINS.polys = {\n      // POLY area coordinate calculator\n      //\tSpecial thanks to Ed Cradock for helping out with this.\n      //\tUses a binary search algorithm to find suitable coordinates.\n      polygon: function polygon(baseCoords, corner) {\n        var result = {\n          width: 0,\n          height: 0,\n          position: {\n            top: 1e10,\n            right: 0,\n            bottom: 0,\n            left: 1e10\n          },\n          adjustable: FALSE\n        },\n            i = 0,\n            next,\n            coords = [],\n            compareX = 1,\n            compareY = 1,\n            realX = 0,\n            realY = 0,\n            newWidth,\n            newHeight; // First pass, sanitize coords and determine outer edges\n\n        i = baseCoords.length;\n\n        while (i--) {\n          next = [parseInt(baseCoords[--i], 10), parseInt(baseCoords[i + 1], 10)];\n\n          if (next[0] > result.position.right) {\n            result.position.right = next[0];\n          }\n\n          if (next[0] < result.position.left) {\n            result.position.left = next[0];\n          }\n\n          if (next[1] > result.position.bottom) {\n            result.position.bottom = next[1];\n          }\n\n          if (next[1] < result.position.top) {\n            result.position.top = next[1];\n          }\n\n          coords.push(next);\n        } // Calculate height and width from outer edges\n\n\n        newWidth = result.width = Math.abs(result.position.right - result.position.left);\n        newHeight = result.height = Math.abs(result.position.bottom - result.position.top); // If it's the center corner...\n\n        if (corner.abbrev() === 'c') {\n          result.position = {\n            left: result.position.left + result.width / 2,\n            top: result.position.top + result.height / 2\n          };\n        } else {\n          // Second pass, use a binary search algorithm to locate most suitable coordinate\n          while (newWidth > 0 && newHeight > 0 && compareX > 0 && compareY > 0) {\n            newWidth = Math.floor(newWidth / 2);\n            newHeight = Math.floor(newHeight / 2);\n\n            if (corner.x === LEFT) {\n              compareX = newWidth;\n            } else if (corner.x === RIGHT) {\n              compareX = result.width - newWidth;\n            } else {\n              compareX += Math.floor(newWidth / 2);\n            }\n\n            if (corner.y === TOP) {\n              compareY = newHeight;\n            } else if (corner.y === BOTTOM) {\n              compareY = result.height - newHeight;\n            } else {\n              compareY += Math.floor(newHeight / 2);\n            }\n\n            i = coords.length;\n\n            while (i--) {\n              if (coords.length < 2) {\n                break;\n              }\n\n              realX = coords[i][0] - result.position.left;\n              realY = coords[i][1] - result.position.top;\n\n              if (corner.x === LEFT && realX >= compareX || corner.x === RIGHT && realX <= compareX || corner.x === CENTER && (realX < compareX || realX > result.width - compareX) || corner.y === TOP && realY >= compareY || corner.y === BOTTOM && realY <= compareY || corner.y === CENTER && (realY < compareY || realY > result.height - compareY)) {\n                coords.splice(i, 1);\n              }\n            }\n          }\n\n          result.position = {\n            left: coords[0][0],\n            top: coords[0][1]\n          };\n        }\n\n        return result;\n      },\n      rect: function rect(ax, ay, bx, by) {\n        return {\n          width: Math.abs(bx - ax),\n          height: Math.abs(by - ay),\n          position: {\n            left: Math.min(ax, bx),\n            top: Math.min(ay, by)\n          }\n        };\n      },\n      _angles: {\n        tc: 3 / 2,\n        tr: 7 / 4,\n        tl: 5 / 4,\n        bc: 1 / 2,\n        br: 1 / 4,\n        bl: 3 / 4,\n        rc: 2,\n        lc: 1,\n        c: 0\n      },\n      ellipse: function ellipse(cx, cy, rx, ry, corner) {\n        var c = PLUGINS.polys._angles[corner.abbrev()],\n            rxc = c === 0 ? 0 : rx * Math.cos(c * Math.PI),\n            rys = ry * Math.sin(c * Math.PI);\n\n        return {\n          width: rx * 2 - Math.abs(rxc),\n          height: ry * 2 - Math.abs(rys),\n          position: {\n            left: cx + rxc,\n            top: cy + rys\n          },\n          adjustable: FALSE\n        };\n      },\n      circle: function circle(cx, cy, r, corner) {\n        return PLUGINS.polys.ellipse(cx, cy, r, r, corner);\n      }\n    };\n    ;\n\n    PLUGINS.svg = function (api, svg, corner) {\n      var elem = svg[0],\n          root = $(elem.ownerSVGElement),\n          ownerDocument = elem.ownerDocument,\n          strokeWidth2 = (parseInt(svg.css('stroke-width'), 10) || 0) / 2,\n          frameOffset,\n          mtx,\n          transformed,\n          len,\n          next,\n          i,\n          points,\n          result,\n          position; // Ascend the parentNode chain until we find an element with getBBox()\n\n      while (!elem.getBBox) {\n        elem = elem.parentNode;\n      }\n\n      if (!elem.getBBox || !elem.parentNode) {\n        return FALSE;\n      } // Determine which shape calculation to use\n\n\n      switch (elem.nodeName) {\n        case 'ellipse':\n        case 'circle':\n          result = PLUGINS.polys.ellipse(elem.cx.baseVal.value, elem.cy.baseVal.value, (elem.rx || elem.r).baseVal.value + strokeWidth2, (elem.ry || elem.r).baseVal.value + strokeWidth2, corner);\n          break;\n\n        case 'line':\n        case 'polygon':\n        case 'polyline':\n          // Determine points object (line has none, so mimic using array)\n          points = elem.points || [{\n            x: elem.x1.baseVal.value,\n            y: elem.y1.baseVal.value\n          }, {\n            x: elem.x2.baseVal.value,\n            y: elem.y2.baseVal.value\n          }];\n\n          for (result = [], i = -1, len = points.numberOfItems || points.length; ++i < len;) {\n            next = points.getItem ? points.getItem(i) : points[i];\n            result.push.apply(result, [next.x, next.y]);\n          }\n\n          result = PLUGINS.polys.polygon(result, corner);\n          break;\n        // Unknown shape or rectangle? Use bounding box\n\n        default:\n          result = elem.getBBox();\n          result = {\n            width: result.width,\n            height: result.height,\n            position: {\n              left: result.x,\n              top: result.y\n            }\n          };\n          break;\n      } // Shortcut assignments\n\n\n      position = result.position;\n      root = root[0]; // Convert position into a pixel value\n\n      if (root.createSVGPoint) {\n        mtx = elem.getScreenCTM();\n        points = root.createSVGPoint();\n        points.x = position.left;\n        points.y = position.top;\n        transformed = points.matrixTransform(mtx);\n        position.left = transformed.x;\n        position.top = transformed.y;\n      } // Check the element is not in a child document, and if so, adjust for frame elements offset\n\n\n      if (ownerDocument !== document && api.position.target !== 'mouse') {\n        frameOffset = $((ownerDocument.defaultView || ownerDocument.parentWindow).frameElement).offset();\n\n        if (frameOffset) {\n          position.left += frameOffset.left;\n          position.top += frameOffset.top;\n        }\n      } // Adjust by scroll offset of owner document\n\n\n      ownerDocument = $(ownerDocument);\n      position.left += ownerDocument.scrollLeft();\n      position.top += ownerDocument.scrollTop();\n      return result;\n    };\n\n    ;\n\n    PLUGINS.imagemap = function (api, area, corner) {\n      if (!area.jquery) {\n        area = $(area);\n      }\n\n      var shape = (area.attr('shape') || 'rect').toLowerCase().replace('poly', 'polygon'),\n          image = $('img[usemap=\"#' + area.parent('map').attr('name') + '\"]'),\n          coordsString = $.trim(area.attr('coords')),\n          coordsArray = coordsString.replace(/,$/, '').split(','),\n          imageOffset,\n          coords,\n          i,\n          result,\n          len; // If we can't find the image using the map...\n\n      if (!image.length) {\n        return FALSE;\n      } // Pass coordinates string if polygon\n\n\n      if (shape === 'polygon') {\n        result = PLUGINS.polys.polygon(coordsArray, corner);\n      } // Otherwise parse the coordinates and pass them as arguments\n      else if (PLUGINS.polys[shape]) {\n        for (i = -1, len = coordsArray.length, coords = []; ++i < len;) {\n          coords.push(parseInt(coordsArray[i], 10));\n        }\n\n        result = PLUGINS.polys[shape].apply(this, coords.concat(corner));\n      } // If no shapre calculation method was found, return false\n      else {\n        return FALSE;\n      } // Make sure we account for padding and borders on the image\n\n\n      imageOffset = image.offset();\n      imageOffset.left += Math.ceil((image.outerWidth(FALSE) - image.width()) / 2);\n      imageOffset.top += Math.ceil((image.outerHeight(FALSE) - image.height()) / 2); // Add image position to offset coordinates\n\n      result.position.left += imageOffset.left;\n      result.position.top += imageOffset.top;\n      return result;\n    };\n\n    ;\n    var IE6,\n\n    /*\n     * BGIFrame adaption (http://plugins.jquery.com/project/bgiframe)\n     * Special thanks to Brandon Aaron\n     */\n    BGIFRAME = '<iframe class=\"qtip-bgiframe\" frameborder=\"0\" tabindex=\"-1\" src=\"javascript:\\'\\';\" ' + ' style=\"display:block; position:absolute; z-index:-1; filter:alpha(opacity=0); ' + '-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\"></iframe>';\n\n    function Ie6(api) {\n      this._ns = 'ie6';\n      this.qtip = api;\n      this.init(api);\n    }\n\n    $.extend(Ie6.prototype, {\n      _scroll: function _scroll() {\n        var overlay = this.qtip.elements.overlay;\n        overlay && (overlay[0].style.top = $(window).scrollTop() + 'px');\n      },\n      init: function init(qtip) {\n        var tooltip = qtip.tooltip; // Create the BGIFrame element if needed\n\n        if ($('select, object').length < 1) {\n          this.bgiframe = qtip.elements.bgiframe = $(BGIFRAME).appendTo(tooltip); // Update BGIFrame on tooltip move\n\n          qtip._bind(tooltip, 'tooltipmove', this.adjustBGIFrame, this._ns, this);\n        } // redraw() container for width/height calculations\n\n\n        this.redrawContainer = $('<div/>', {\n          id: NAMESPACE + '-rcontainer'\n        }).appendTo(document.body); // Fixup modal plugin if present too\n\n        if (qtip.elements.overlay && qtip.elements.overlay.addClass('qtipmodal-ie6fix')) {\n          qtip._bind(window, ['scroll', 'resize'], this._scroll, this._ns, this);\n\n          qtip._bind(tooltip, ['tooltipshow'], this._scroll, this._ns, this);\n        } // Set dimensions\n\n\n        this.redraw();\n      },\n      adjustBGIFrame: function adjustBGIFrame() {\n        var tooltip = this.qtip.tooltip,\n            dimensions = {\n          height: tooltip.outerHeight(FALSE),\n          width: tooltip.outerWidth(FALSE)\n        },\n            plugin = this.qtip.plugins.tip,\n            tip = this.qtip.elements.tip,\n            tipAdjust,\n            offset; // Adjust border offset\n\n        offset = parseInt(tooltip.css('borderLeftWidth'), 10) || 0;\n        offset = {\n          left: -offset,\n          top: -offset\n        }; // Adjust for tips plugin\n\n        if (plugin && tip) {\n          tipAdjust = plugin.corner.precedance === 'x' ? [WIDTH, LEFT] : [HEIGHT, TOP];\n          offset[tipAdjust[1]] -= tip[tipAdjust[0]]();\n        } // Update bgiframe\n\n\n        this.bgiframe.css(offset).css(dimensions);\n      },\n      // Max/min width simulator function\n      redraw: function redraw() {\n        if (this.qtip.rendered < 1 || this.drawing) {\n          return this;\n        }\n\n        var tooltip = this.qtip.tooltip,\n            style = this.qtip.options.style,\n            container = this.qtip.options.position.container,\n            perc,\n            width,\n            max,\n            min; // Set drawing flag\n\n        this.qtip.drawing = 1; // If tooltip has a set height/width, just set it... like a boss!\n\n        if (style.height) {\n          tooltip.css(HEIGHT, style.height);\n        }\n\n        if (style.width) {\n          tooltip.css(WIDTH, style.width);\n        } // Simulate max/min width if not set width present...\n        else {\n          // Reset width and add fluid class\n          tooltip.css(WIDTH, '').appendTo(this.redrawContainer); // Grab our tooltip width (add 1 if odd so we don't get wrapping problems.. huzzah!)\n\n          width = tooltip.width();\n\n          if (width % 2 < 1) {\n            width += 1;\n          } // Grab our max/min properties\n\n\n          max = tooltip.css('maxWidth') || '';\n          min = tooltip.css('minWidth') || ''; // Parse into proper pixel values\n\n          perc = (max + min).indexOf('%') > -1 ? container.width() / 100 : 0;\n          max = (max.indexOf('%') > -1 ? perc : 1 * parseInt(max, 10)) || width;\n          min = (min.indexOf('%') > -1 ? perc : 1 * parseInt(min, 10)) || 0; // Determine new dimension size based on max/min/current values\n\n          width = max + min ? Math.min(Math.max(width, min), max) : width; // Set the newly calculated width and remvoe fluid class\n\n          tooltip.css(WIDTH, Math.round(width)).appendTo(container);\n        } // Set drawing flag\n\n\n        this.drawing = 0;\n        return this;\n      },\n      destroy: function destroy() {\n        // Remove iframe\n        this.bgiframe && this.bgiframe.remove(); // Remove bound events\n\n        this.qtip._unbind([window, this.qtip.tooltip], this._ns);\n      }\n    });\n\n    IE6 = PLUGINS.ie6 = function (api) {\n      // Proceed only if the browser is IE6\n      return BROWSER.ie === 6 ? new Ie6(api) : FALSE;\n    };\n\n    IE6.initialize = 'render';\n    CHECKS.ie6 = {\n      '^content|style$': function contentStyle$() {\n        this.redraw();\n      }\n    };\n    ;\n  });\n})(window, document);\n\n//# sourceURL=webpack://rup/./node_modules/qtip2/dist/jquery.qtip.js?");

/***/ }),

/***/ "./node_modules/regenerator-runtime/runtime.js":
/*!*****************************************************!*\
  !*** ./node_modules/regenerator-runtime/runtime.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(module) {function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar runtime = function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function define(obj, key, value) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n    return obj[key];\n  }\n\n  try {\n    // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n    define({}, \"\");\n  } catch (err) {\n    define = function define(obj, key, value) {\n      return obj[key] = value;\n    };\n  }\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n    return generator;\n  }\n\n  exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n\n  function tryCatch(fn, obj, arg) {\n    try {\n      return {\n        type: \"normal\",\n        arg: fn.call(obj, arg)\n      };\n    } catch (err) {\n      return {\n        type: \"throw\",\n        arg: err\n      };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\"; // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n\n  var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n\n  function Generator() {}\n\n  function GeneratorFunction() {}\n\n  function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n\n\n  var IteratorPrototype = {};\n  define(IteratorPrototype, iteratorSymbol, function () {\n    return this;\n  });\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n\n  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = GeneratorFunctionPrototype;\n  define(Gp, \"constructor\", GeneratorFunctionPrototype);\n  define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n  GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"); // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function (method) {\n      define(prototype, method, function (arg) {\n        return this._invoke(method, arg);\n      });\n    });\n  }\n\n  exports.isGeneratorFunction = function (genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can\n    // do is to check its .name property.\n    (ctor.displayName || ctor.name) === \"GeneratorFunction\" : false;\n  };\n\n  exports.mark = function (genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n    }\n\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  }; // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n\n\n  exports.awrap = function (arg) {\n    return {\n      __await: arg\n    };\n  };\n\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n\n        if (value && _typeof(value) === \"object\" && hasOwn.call(value, \"__await\")) {\n          return PromiseImpl.resolve(value.__await).then(function (value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function (err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return PromiseImpl.resolve(value).then(function (unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function (error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new PromiseImpl(function (resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise = // If enqueue has been called before, then we want to wait until\n      // all previous Promises have been resolved before calling invoke,\n      // so that results are always delivered in the correct order. If\n      // enqueue has not been called before, then it is important to\n      // call invoke immediately, without waiting on a callback to fire,\n      // so that the async generator function has the opportunity to do\n      // any necessary setup in a predictable way. This predictability\n      // is why the Promise constructor synchronously invokes its\n      // executor callback, and why async functions synchronously\n      // execute code before the first await. Since we implement simple\n      // async functions in terms of async generators, it is especially\n      // important to get this right, even though it requires care.\n      previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later\n      // invocations of the iterator.\n      callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n    } // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n\n\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n    return this;\n  });\n  exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n\n  exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    if (PromiseImpl === void 0) PromiseImpl = Promise;\n    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n    return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.\n    : iter.next().then(function (result) {\n      return result.done ? result.value : iter.next();\n    });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        } // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n\n\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n        var record = tryCatch(innerFn, self, context);\n\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted; // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  } // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n\n\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (!info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).\n\n      context.next = delegate.nextLoc; // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    } // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n\n\n    context.delegate = null;\n    return ContinueSentinel;\n  } // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n\n\n  defineIteratorMethods(Gp);\n  define(Gp, toStringTagSymbol, \"Generator\"); // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n\n  define(Gp, iteratorSymbol, function () {\n    return this;\n  });\n  define(Gp, \"toString\", function () {\n    return \"[object Generator]\";\n  });\n\n  function pushTryEntry(locs) {\n    var entry = {\n      tryLoc: locs[0]\n    };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{\n      tryLoc: \"root\"\n    }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function (object) {\n    var keys = [];\n\n    for (var key in object) {\n      keys.push(key);\n    }\n\n    keys.reverse(); // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      } // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n\n\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1,\n            next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n          return next;\n        };\n\n        return next.next = next;\n      }\n    } // Return an iterator with no values.\n\n\n    return {\n      next: doneResult\n    };\n  }\n\n  exports.values = values;\n\n  function doneResult() {\n    return {\n      value: undefined,\n      done: true\n    };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n    reset: function reset(skipTempReset) {\n      this.prev = 0;\n      this.next = 0; // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n      this.method = \"next\";\n      this.arg = undefined;\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n    stop: function stop() {\n      this.done = true;\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n    dispatchException: function dispatchException(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !!caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n    abrupt: function abrupt(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n\n        if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry && (type === \"break\" || type === \"continue\") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n    complete: function complete(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" || record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n    finish: function finish(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n    \"catch\": function _catch(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n\n          return thrown;\n        }\n      } // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n\n\n      throw new Error(\"illegal catch attempt\");\n    },\n    delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  }; // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n\n  return exports;\n}( // If this script is executing as a CommonJS module, use module.exports\n// as the regeneratorRuntime namespace. Otherwise create a new empty\n// object. Either way, the resulting object will be used to initialize\n// the regeneratorRuntime variable at the top of this file.\n( false ? undefined : _typeof(module)) === \"object\" ? module.exports : {});\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, in modern engines\n  // we can explicitly access globalThis. In older engines we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  if ((typeof globalThis === \"undefined\" ? \"undefined\" : _typeof(globalThis)) === \"object\") {\n    globalThis.regeneratorRuntime = runtime;\n  } else {\n    Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n  }\n}\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://rup/./node_modules/regenerator-runtime/runtime.js?");

/***/ }),

/***/ "./node_modules/select2/dist/js/select2.js":
/*!*************************************************!*\
  !*** ./node_modules/select2/dist/js/select2.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function($) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;var require;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * Select2 4.0.13\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\n */\n;\n\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (jQuery) {\n  // This is needed so we can catch the AMD loader configuration and use it\n  // The inner file should be wrapped (by `banner.start.js`) in a function that\n  // returns the AMD loader references.\n  var S2 = function () {\n    // Restore the Select2 AMD loader so it can be used\n    // Needed mostly in the language files, where the loader is not inserted\n    if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {\n      var S2 = jQuery.fn.select2.amd;\n    }\n\n    var S2;\n\n    (function () {\n      if (!S2 || !S2.requirejs) {\n        if (!S2) {\n          S2 = {};\n        } else {\n          require = S2;\n        }\n        /**\n         * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\n         * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n         */\n        //Going sloppy to avoid 'use strict' string cost, but strict practices should\n        //be followed.\n\n        /*global setTimeout: false */\n\n\n        var requirejs, require, define;\n\n        (function (undef) {\n          var main,\n              _req,\n              makeMap,\n              handlers,\n              defined = {},\n              waiting = {},\n              config = {},\n              defining = {},\n              hasOwn = Object.prototype.hasOwnProperty,\n              aps = [].slice,\n              jsSuffixRegExp = /\\.js$/;\n\n          function hasProp(obj, prop) {\n            return hasOwn.call(obj, prop);\n          }\n          /**\n           * Given a relative module name, like ./something, normalize it to\n           * a real name that can be mapped to a path.\n           * @param {String} name the relative name\n           * @param {String} baseName a real name that the name arg is relative\n           * to.\n           * @returns {String} normalized name\n           */\n\n\n          function normalize(name, baseName) {\n            var nameParts,\n                nameSegment,\n                mapValue,\n                foundMap,\n                lastIndex,\n                foundI,\n                foundStarMap,\n                starI,\n                i,\n                j,\n                part,\n                normalizedBaseParts,\n                baseParts = baseName && baseName.split(\"/\"),\n                map = config.map,\n                starMap = map && map['*'] || {}; //Adjust any relative paths.\n\n            if (name) {\n              name = name.split('/');\n              lastIndex = name.length - 1; // If wanting node ID compatibility, strip .js from end\n              // of IDs. Have to do this here, and not in nameToUrl\n              // because node allows either .js or non .js to map\n              // to same file.\n\n              if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n              } // Starts with a '.' so need the baseName\n\n\n              if (name[0].charAt(0) === '.' && baseParts) {\n                //Convert baseName to array, and lop off the last part,\n                //so that . matches that 'directory' and not name of the baseName's\n                //module. For instance, baseName of 'one/two/three', maps to\n                //'one/two/three.js', but we want the directory, 'one/two' for\n                //this normalization.\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                name = normalizedBaseParts.concat(name);\n              } //start trimDots\n\n\n              for (i = 0; i < name.length; i++) {\n                part = name[i];\n\n                if (part === '.') {\n                  name.splice(i, 1);\n                  i -= 1;\n                } else if (part === '..') {\n                  // If at the start, or previous value is still ..,\n                  // keep them so that when converted to a path it may\n                  // still work when converted to a path, even though\n                  // as an ID it is less than ideal. In larger point\n                  // releases, may be better to just kick out an error.\n                  if (i === 0 || i === 1 && name[2] === '..' || name[i - 1] === '..') {\n                    continue;\n                  } else if (i > 0) {\n                    name.splice(i - 1, 2);\n                    i -= 2;\n                  }\n                }\n              } //end trimDots\n\n\n              name = name.join('/');\n            } //Apply map config if available.\n\n\n            if ((baseParts || starMap) && map) {\n              nameParts = name.split('/');\n\n              for (i = nameParts.length; i > 0; i -= 1) {\n                nameSegment = nameParts.slice(0, i).join(\"/\");\n\n                if (baseParts) {\n                  //Find the longest baseName segment match in the config.\n                  //So, do joins on the biggest to smallest lengths of baseParts.\n                  for (j = baseParts.length; j > 0; j -= 1) {\n                    mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has  config, find if it has one for\n                    //this name.\n\n                    if (mapValue) {\n                      mapValue = mapValue[nameSegment];\n\n                      if (mapValue) {\n                        //Match, update name to the new value.\n                        foundMap = mapValue;\n                        foundI = i;\n                        break;\n                      }\n                    }\n                  }\n                }\n\n                if (foundMap) {\n                  break;\n                } //Check for a star map match, but just hold on to it,\n                //if there is a shorter segment match later in a matching\n                //config, then favor over this star map.\n\n\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\n                  foundStarMap = starMap[nameSegment];\n                  starI = i;\n                }\n              }\n\n              if (!foundMap && foundStarMap) {\n                foundMap = foundStarMap;\n                foundI = starI;\n              }\n\n              if (foundMap) {\n                nameParts.splice(0, foundI, foundMap);\n                name = nameParts.join('/');\n              }\n            }\n\n            return name;\n          }\n\n          function makeRequire(relName, forceSync) {\n            return function () {\n              //A version of a require function that passes a moduleName\n              //value for items that may need to\n              //look up paths relative to the moduleName\n              var args = aps.call(arguments, 0); //If first arg is not require('string'), and there is only\n              //one arg, it is the array form without a callback. Insert\n              //a null so that the following concat is correct.\n\n              if (typeof args[0] !== 'string' && args.length === 1) {\n                args.push(null);\n              }\n\n              return _req.apply(undef, args.concat([relName, forceSync]));\n            };\n          }\n\n          function makeNormalize(relName) {\n            return function (name) {\n              return normalize(name, relName);\n            };\n          }\n\n          function makeLoad(depName) {\n            return function (value) {\n              defined[depName] = value;\n            };\n          }\n\n          function callDep(name) {\n            if (hasProp(waiting, name)) {\n              var args = waiting[name];\n              delete waiting[name];\n              defining[name] = true;\n              main.apply(undef, args);\n            }\n\n            if (!hasProp(defined, name) && !hasProp(defining, name)) {\n              throw new Error('No ' + name);\n            }\n\n            return defined[name];\n          } //Turns a plugin!resource to [plugin, resource]\n          //with the plugin being undefined if the name\n          //did not have a plugin prefix.\n\n\n          function splitPrefix(name) {\n            var prefix,\n                index = name ? name.indexOf('!') : -1;\n\n            if (index > -1) {\n              prefix = name.substring(0, index);\n              name = name.substring(index + 1, name.length);\n            }\n\n            return [prefix, name];\n          } //Creates a parts array for a relName where first part is plugin ID,\n          //second part is resource ID. Assumes relName has already been normalized.\n\n\n          function makeRelParts(relName) {\n            return relName ? splitPrefix(relName) : [];\n          }\n          /**\n           * Makes a name map, normalizing the name, and using a plugin\n           * for normalization if necessary. Grabs a ref to plugin\n           * too, as an optimization.\n           */\n\n\n          makeMap = function makeMap(name, relParts) {\n            var plugin,\n                parts = splitPrefix(name),\n                prefix = parts[0],\n                relResourceName = relParts[1];\n            name = parts[1];\n\n            if (prefix) {\n              prefix = normalize(prefix, relResourceName);\n              plugin = callDep(prefix);\n            } //Normalize according\n\n\n            if (prefix) {\n              if (plugin && plugin.normalize) {\n                name = plugin.normalize(name, makeNormalize(relResourceName));\n              } else {\n                name = normalize(name, relResourceName);\n              }\n            } else {\n              name = normalize(name, relResourceName);\n              parts = splitPrefix(name);\n              prefix = parts[0];\n              name = parts[1];\n\n              if (prefix) {\n                plugin = callDep(prefix);\n              }\n            } //Using ridiculous property names for space reasons\n\n\n            return {\n              f: prefix ? prefix + '!' + name : name,\n              //fullName\n              n: name,\n              pr: prefix,\n              p: plugin\n            };\n          };\n\n          function makeConfig(name) {\n            return function () {\n              return config && config.config && config.config[name] || {};\n            };\n          }\n\n          handlers = {\n            require: function require(name) {\n              return makeRequire(name);\n            },\n            exports: function exports(name) {\n              var e = defined[name];\n\n              if (typeof e !== 'undefined') {\n                return e;\n              } else {\n                return defined[name] = {};\n              }\n            },\n            module: function module(name) {\n              return {\n                id: name,\n                uri: '',\n                exports: defined[name],\n                config: makeConfig(name)\n              };\n            }\n          };\n\n          main = function main(name, deps, callback, relName) {\n            var cjsModule,\n                depName,\n                ret,\n                map,\n                i,\n                relParts,\n                args = [],\n                callbackType = _typeof(callback),\n                usingExports; //Use name if no relName\n\n\n            relName = relName || name;\n            relParts = makeRelParts(relName); //Call the callback to define the module, if necessary.\n\n            if (callbackType === 'undefined' || callbackType === 'function') {\n              //Pull out the defined dependencies and pass the ordered\n              //values to the callback.\n              //Default to [require, exports, module] if no deps\n              deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n\n              for (i = 0; i < deps.length; i += 1) {\n                map = makeMap(deps[i], relParts);\n                depName = map.f; //Fast path CommonJS standard dependencies.\n\n                if (depName === \"require\") {\n                  args[i] = handlers.require(name);\n                } else if (depName === \"exports\") {\n                  //CommonJS module spec 1.1\n                  args[i] = handlers.exports(name);\n                  usingExports = true;\n                } else if (depName === \"module\") {\n                  //CommonJS module spec 1.1\n                  cjsModule = args[i] = handlers.module(name);\n                } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) {\n                  args[i] = callDep(depName);\n                } else if (map.p) {\n                  map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n                  args[i] = defined[depName];\n                } else {\n                  throw new Error(name + ' missing ' + depName);\n                }\n              }\n\n              ret = callback ? callback.apply(defined[name], args) : undefined;\n\n              if (name) {\n                //If setting exports via \"module\" is in play,\n                //favor that over return value and exports. After that,\n                //favor a non-undefined return value over exports use.\n                if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) {\n                  defined[name] = cjsModule.exports;\n                } else if (ret !== undef || !usingExports) {\n                  //Use the return value from the function.\n                  defined[name] = ret;\n                }\n              }\n            } else if (name) {\n              //May just be an object definition for the module. Only\n              //worry about defining if have a module name.\n              defined[name] = callback;\n            }\n          };\n\n          requirejs = require = _req = function req(deps, callback, relName, forceSync, alt) {\n            if (typeof deps === \"string\") {\n              if (handlers[deps]) {\n                //callback in this case is really relName\n                return handlers[deps](callback);\n              } //Just return the module wanted. In this scenario, the\n              //deps arg is the module name, and second arg (if passed)\n              //is just the relName.\n              //Normalize module name, if it contains . or ..\n\n\n              return callDep(makeMap(deps, makeRelParts(callback)).f);\n            } else if (!deps.splice) {\n              //deps is a config object, not an array.\n              config = deps;\n\n              if (config.deps) {\n                _req(config.deps, config.callback);\n              }\n\n              if (!callback) {\n                return;\n              }\n\n              if (callback.splice) {\n                //callback is an array, which means it is a dependency list.\n                //Adjust args if there are dependencies\n                deps = callback;\n                callback = relName;\n                relName = null;\n              } else {\n                deps = undef;\n              }\n            } //Support require(['a'])\n\n\n            callback = callback || function () {}; //If relName is a function, it is an errback handler,\n            //so remove it.\n\n\n            if (typeof relName === 'function') {\n              relName = forceSync;\n              forceSync = alt;\n            } //Simulate async callback;\n\n\n            if (forceSync) {\n              main(undef, deps, callback, relName);\n            } else {\n              //Using a non-zero value because of concern for what old browsers\n              //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n              //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n              //If want a value immediately, use require('id') instead -- something\n              //that works in almond on the global level, but not guaranteed and\n              //unlikely to work in other AMD implementations.\n              setTimeout(function () {\n                main(undef, deps, callback, relName);\n              }, 4);\n            }\n\n            return _req;\n          };\n          /**\n           * Just drops the config on the floor, but returns req in case\n           * the config return value is used.\n           */\n\n\n          _req.config = function (cfg) {\n            return _req(cfg);\n          };\n          /**\n           * Expose module registry for debugging and tooling\n           */\n\n\n          requirejs._defined = defined;\n\n          define = function define(name, deps, callback) {\n            if (typeof name !== 'string') {\n              throw new Error('See almond README: incorrect module build, no module name');\n            } //This module may not have dependencies\n\n\n            if (!deps.splice) {\n              //deps is not an array, so probably means\n              //an object literal or factory function for\n              //the value. Adjust args.\n              callback = deps;\n              deps = [];\n            }\n\n            if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n              waiting[name] = [name, deps, callback];\n            }\n          };\n\n          define.amd = {\n            jQuery: true\n          };\n        })();\n\n        S2.requirejs = requirejs;\n        S2.require = require;\n        S2.define = define;\n      }\n    })();\n\n    S2.define(\"almond\", function () {});\n    /* global jQuery:false, $:false */\n\n    S2.define('jquery', [], function () {\n      var _$ = jQuery || $;\n\n      if (_$ == null && console && console.error) {\n        console.error('Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.');\n      }\n\n      return _$;\n    });\n    S2.define('select2/utils', ['jquery'], function ($) {\n      var Utils = {};\n\n      Utils.Extend = function (ChildClass, SuperClass) {\n        var __hasProp = {}.hasOwnProperty;\n\n        function BaseConstructor() {\n          this.constructor = ChildClass;\n        }\n\n        for (var key in SuperClass) {\n          if (__hasProp.call(SuperClass, key)) {\n            ChildClass[key] = SuperClass[key];\n          }\n        }\n\n        BaseConstructor.prototype = SuperClass.prototype;\n        ChildClass.prototype = new BaseConstructor();\n        ChildClass.__super__ = SuperClass.prototype;\n        return ChildClass;\n      };\n\n      function getMethods(theClass) {\n        var proto = theClass.prototype;\n        var methods = [];\n\n        for (var methodName in proto) {\n          var m = proto[methodName];\n\n          if (typeof m !== 'function') {\n            continue;\n          }\n\n          if (methodName === 'constructor') {\n            continue;\n          }\n\n          methods.push(methodName);\n        }\n\n        return methods;\n      }\n\n      Utils.Decorate = function (SuperClass, DecoratorClass) {\n        var decoratedMethods = getMethods(DecoratorClass);\n        var superMethods = getMethods(SuperClass);\n\n        function DecoratedClass() {\n          var unshift = Array.prototype.unshift;\n          var argCount = DecoratorClass.prototype.constructor.length;\n          var calledConstructor = SuperClass.prototype.constructor;\n\n          if (argCount > 0) {\n            unshift.call(arguments, SuperClass.prototype.constructor);\n            calledConstructor = DecoratorClass.prototype.constructor;\n          }\n\n          calledConstructor.apply(this, arguments);\n        }\n\n        DecoratorClass.displayName = SuperClass.displayName;\n\n        function ctr() {\n          this.constructor = DecoratedClass;\n        }\n\n        DecoratedClass.prototype = new ctr();\n\n        for (var m = 0; m < superMethods.length; m++) {\n          var superMethod = superMethods[m];\n          DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod];\n        }\n\n        var calledMethod = function calledMethod(methodName) {\n          // Stub out the original method if it's not decorating an actual method\n          var originalMethod = function originalMethod() {};\n\n          if (methodName in DecoratedClass.prototype) {\n            originalMethod = DecoratedClass.prototype[methodName];\n          }\n\n          var decoratedMethod = DecoratorClass.prototype[methodName];\n          return function () {\n            var unshift = Array.prototype.unshift;\n            unshift.call(arguments, originalMethod);\n            return decoratedMethod.apply(this, arguments);\n          };\n        };\n\n        for (var d = 0; d < decoratedMethods.length; d++) {\n          var decoratedMethod = decoratedMethods[d];\n          DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n        }\n\n        return DecoratedClass;\n      };\n\n      var Observable = function Observable() {\n        this.listeners = {};\n      };\n\n      Observable.prototype.on = function (event, callback) {\n        this.listeners = this.listeners || {};\n\n        if (event in this.listeners) {\n          this.listeners[event].push(callback);\n        } else {\n          this.listeners[event] = [callback];\n        }\n      };\n\n      Observable.prototype.trigger = function (event) {\n        var slice = Array.prototype.slice;\n        var params = slice.call(arguments, 1);\n        this.listeners = this.listeners || {}; // Params should always come in as an array\n\n        if (params == null) {\n          params = [];\n        } // If there are no arguments to the event, use a temporary object\n\n\n        if (params.length === 0) {\n          params.push({});\n        } // Set the `_type` of the first object to the event\n\n\n        params[0]._type = event;\n\n        if (event in this.listeners) {\n          this.invoke(this.listeners[event], slice.call(arguments, 1));\n        }\n\n        if ('*' in this.listeners) {\n          this.invoke(this.listeners['*'], arguments);\n        }\n      };\n\n      Observable.prototype.invoke = function (listeners, params) {\n        for (var i = 0, len = listeners.length; i < len; i++) {\n          listeners[i].apply(this, params);\n        }\n      };\n\n      Utils.Observable = Observable;\n\n      Utils.generateChars = function (length) {\n        var chars = '';\n\n        for (var i = 0; i < length; i++) {\n          var randomChar = Math.floor(Math.random() * 36);\n          chars += randomChar.toString(36);\n        }\n\n        return chars;\n      };\n\n      Utils.bind = function (func, context) {\n        return function () {\n          func.apply(context, arguments);\n        };\n      };\n\n      Utils._convertData = function (data) {\n        for (var originalKey in data) {\n          var keys = originalKey.split('-');\n          var dataLevel = data;\n\n          if (keys.length === 1) {\n            continue;\n          }\n\n          for (var k = 0; k < keys.length; k++) {\n            var key = keys[k]; // Lowercase the first letter\n            // By default, dash-separated becomes camelCase\n\n            key = key.substring(0, 1).toLowerCase() + key.substring(1);\n\n            if (!(key in dataLevel)) {\n              dataLevel[key] = {};\n            }\n\n            if (k == keys.length - 1) {\n              dataLevel[key] = data[originalKey];\n            }\n\n            dataLevel = dataLevel[key];\n          }\n\n          delete data[originalKey];\n        }\n\n        return data;\n      };\n\n      Utils.hasScroll = function (index, el) {\n        // Adapted from the function created by @ShadowScripter\n        // and adapted by @BillBarry on the Stack Exchange Code Review website.\n        // The original code can be found at\n        // http://codereview.stackexchange.com/q/13338\n        // and was designed to be used with the Sizzle selector engine.\n        var $el = $(el);\n        var overflowX = el.style.overflowX;\n        var overflowY = el.style.overflowY; //Check both x and y declarations\n\n        if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) {\n          return false;\n        }\n\n        if (overflowX === 'scroll' || overflowY === 'scroll') {\n          return true;\n        }\n\n        return $el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth;\n      };\n\n      Utils.escapeMarkup = function (markup) {\n        var replaceMap = {\n          '\\\\': '&#92;',\n          '&': '&amp;',\n          '<': '&lt;',\n          '>': '&gt;',\n          '\"': '&quot;',\n          '\\'': '&#39;',\n          '/': '&#47;'\n        }; // Do not try to escape the markup if it's not a string\n\n        if (typeof markup !== 'string') {\n          return markup;\n        }\n\n        return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n          return replaceMap[match];\n        });\n      }; // Append an array of jQuery nodes to a given element.\n\n\n      Utils.appendMany = function ($element, $nodes) {\n        // jQuery 1.7.x does not support $.fn.append() with an array\n        // Fall back to a jQuery object collection using $.fn.add()\n        if ($.fn.jquery.substr(0, 3) === '1.7') {\n          var $jqNodes = $();\n          $.map($nodes, function (node) {\n            $jqNodes = $jqNodes.add(node);\n          });\n          $nodes = $jqNodes;\n        }\n\n        $element.append($nodes);\n      }; // Cache objects in Utils.__cache instead of $.data (see #4346)\n\n\n      Utils.__cache = {};\n      var id = 0;\n\n      Utils.GetUniqueElementId = function (element) {\n        // Get a unique element Id. If element has no id,\n        // creates a new unique number, stores it in the id\n        // attribute and returns the new id.\n        // If an id already exists, it simply returns it.\n        var select2Id = element.getAttribute('data-select2-id');\n\n        if (select2Id == null) {\n          // If element has id, use it.\n          if (element.id) {\n            select2Id = element.id;\n            element.setAttribute('data-select2-id', select2Id);\n          } else {\n            element.setAttribute('data-select2-id', ++id);\n            select2Id = id.toString();\n          }\n        }\n\n        return select2Id;\n      };\n\n      Utils.StoreData = function (element, name, value) {\n        // Stores an item in the cache for a specified element.\n        // name is the cache key.\n        var id = Utils.GetUniqueElementId(element);\n\n        if (!Utils.__cache[id]) {\n          Utils.__cache[id] = {};\n        }\n\n        Utils.__cache[id][name] = value;\n      };\n\n      Utils.GetData = function (element, name) {\n        // Retrieves a value from the cache by its key (name)\n        // name is optional. If no name specified, return\n        // all cache items for the specified element.\n        // and for a specified element.\n        var id = Utils.GetUniqueElementId(element);\n\n        if (name) {\n          if (Utils.__cache[id]) {\n            if (Utils.__cache[id][name] != null) {\n              return Utils.__cache[id][name];\n            }\n\n            return $(element).data(name); // Fallback to HTML5 data attribs.\n          }\n\n          return $(element).data(name); // Fallback to HTML5 data attribs.\n        } else {\n          return Utils.__cache[id];\n        }\n      };\n\n      Utils.RemoveData = function (element) {\n        // Removes all cached items for a specified element.\n        var id = Utils.GetUniqueElementId(element);\n\n        if (Utils.__cache[id] != null) {\n          delete Utils.__cache[id];\n        }\n\n        element.removeAttribute('data-select2-id');\n      };\n\n      return Utils;\n    });\n    S2.define('select2/results', ['jquery', './utils'], function ($, Utils) {\n      function Results($element, options, dataAdapter) {\n        this.$element = $element;\n        this.data = dataAdapter;\n        this.options = options;\n\n        Results.__super__.constructor.call(this);\n      }\n\n      Utils.Extend(Results, Utils.Observable);\n\n      Results.prototype.render = function () {\n        var $results = $('<ul class=\"select2-results__options\" role=\"listbox\"></ul>');\n\n        if (this.options.get('multiple')) {\n          $results.attr('aria-multiselectable', 'true');\n        }\n\n        this.$results = $results;\n        return $results;\n      };\n\n      Results.prototype.clear = function () {\n        this.$results.empty();\n      };\n\n      Results.prototype.displayMessage = function (params) {\n        var escapeMarkup = this.options.get('escapeMarkup');\n        this.clear();\n        this.hideLoading();\n        var $message = $('<li role=\"alert\" aria-live=\"assertive\"' + ' class=\"select2-results__option\"></li>');\n        var message = this.options.get('translations').get(params.message);\n        $message.append(escapeMarkup(message(params.args)));\n        $message[0].className += ' select2-results__message';\n        this.$results.append($message);\n      };\n\n      Results.prototype.hideMessages = function () {\n        this.$results.find('.select2-results__message').remove();\n      };\n\n      Results.prototype.append = function (data) {\n        this.hideLoading();\n        var $options = [];\n\n        if (data.results == null || data.results.length === 0) {\n          if (this.$results.children().length === 0) {\n            this.trigger('results:message', {\n              message: 'noResults'\n            });\n          }\n\n          return;\n        }\n\n        data.results = this.sort(data.results);\n\n        for (var d = 0; d < data.results.length; d++) {\n          var item = data.results[d];\n          var $option = this.option(item);\n          $options.push($option);\n        }\n\n        this.$results.append($options);\n      };\n\n      Results.prototype.position = function ($results, $dropdown) {\n        var $resultsContainer = $dropdown.find('.select2-results');\n        $resultsContainer.append($results);\n      };\n\n      Results.prototype.sort = function (data) {\n        var sorter = this.options.get('sorter');\n        return sorter(data);\n      };\n\n      Results.prototype.highlightFirstItem = function () {\n        var $options = this.$results.find('.select2-results__option[aria-selected]');\n        var $selected = $options.filter('[aria-selected=true]'); // Check if there are any selected options\n\n        if ($selected.length > 0) {\n          // If there are selected options, highlight the first\n          $selected.first().trigger('mouseenter');\n        } else {\n          // If there are no selected options, highlight the first option\n          // in the dropdown\n          $options.first().trigger('mouseenter');\n        }\n\n        this.ensureHighlightVisible();\n      };\n\n      Results.prototype.setClasses = function () {\n        var self = this;\n        this.data.current(function (selected) {\n          var selectedIds = $.map(selected, function (s) {\n            return s.id.toString();\n          });\n          var $options = self.$results.find('.select2-results__option[aria-selected]');\n          $options.each(function () {\n            var $option = $(this);\n            var item = Utils.GetData(this, 'data'); // id needs to be converted to a string when comparing\n\n            var id = '' + item.id;\n\n            if (item.element != null && item.element.selected || item.element == null && $.inArray(id, selectedIds) > -1) {\n              $option.attr('aria-selected', 'true');\n            } else {\n              $option.attr('aria-selected', 'false');\n            }\n          });\n        });\n      };\n\n      Results.prototype.showLoading = function (params) {\n        this.hideLoading();\n        var loadingMore = this.options.get('translations').get('searching');\n        var loading = {\n          disabled: true,\n          loading: true,\n          text: loadingMore(params)\n        };\n        var $loading = this.option(loading);\n        $loading.className += ' loading-results';\n        this.$results.prepend($loading);\n      };\n\n      Results.prototype.hideLoading = function () {\n        this.$results.find('.loading-results').remove();\n      };\n\n      Results.prototype.option = function (data) {\n        var option = document.createElement('li');\n        option.className = 'select2-results__option';\n        var attrs = {\n          'role': 'option',\n          'aria-selected': 'false'\n        };\n        var matches = window.Element.prototype.matches || window.Element.prototype.msMatchesSelector || window.Element.prototype.webkitMatchesSelector;\n\n        if (data.element != null && matches.call(data.element, ':disabled') || data.element == null && data.disabled) {\n          delete attrs['aria-selected'];\n          attrs['aria-disabled'] = 'true';\n        }\n\n        if (data.id == null) {\n          delete attrs['aria-selected'];\n        }\n\n        if (data._resultId != null) {\n          option.id = data._resultId;\n        }\n\n        if (data.title) {\n          option.title = data.title;\n        }\n\n        if (data.children) {\n          attrs.role = 'group';\n          attrs['aria-label'] = data.text;\n          delete attrs['aria-selected'];\n        }\n\n        for (var attr in attrs) {\n          var val = attrs[attr];\n          option.setAttribute(attr, val);\n        }\n\n        if (data.children) {\n          var $option = $(option);\n          var label = document.createElement('strong');\n          label.className = 'select2-results__group';\n          var $label = $(label);\n          this.template(data, label);\n          var $children = [];\n\n          for (var c = 0; c < data.children.length; c++) {\n            var child = data.children[c];\n            var $child = this.option(child);\n            $children.push($child);\n          }\n\n          var $childrenContainer = $('<ul></ul>', {\n            'class': 'select2-results__options select2-results__options--nested'\n          });\n          $childrenContainer.append($children);\n          $option.append(label);\n          $option.append($childrenContainer);\n        } else {\n          this.template(data, option);\n        }\n\n        Utils.StoreData(option, 'data', data);\n        return option;\n      };\n\n      Results.prototype.bind = function (container, $container) {\n        var self = this;\n        var id = container.id + '-results';\n        this.$results.attr('id', id);\n        container.on('results:all', function (params) {\n          self.clear();\n          self.append(params.data);\n\n          if (container.isOpen()) {\n            self.setClasses();\n            self.highlightFirstItem();\n          }\n        });\n        container.on('results:append', function (params) {\n          self.append(params.data);\n\n          if (container.isOpen()) {\n            self.setClasses();\n          }\n        });\n        container.on('query', function (params) {\n          self.hideMessages();\n          self.showLoading(params);\n        });\n        container.on('select', function () {\n          if (!container.isOpen()) {\n            return;\n          }\n\n          self.setClasses();\n\n          if (self.options.get('scrollAfterSelect')) {\n            self.highlightFirstItem();\n          }\n        });\n        container.on('unselect', function () {\n          if (!container.isOpen()) {\n            return;\n          }\n\n          self.setClasses();\n\n          if (self.options.get('scrollAfterSelect')) {\n            self.highlightFirstItem();\n          }\n        });\n        container.on('open', function () {\n          // When the dropdown is open, aria-expended=\"true\"\n          self.$results.attr('aria-expanded', 'true');\n          self.$results.attr('aria-hidden', 'false');\n          self.setClasses();\n          self.ensureHighlightVisible();\n        });\n        container.on('close', function () {\n          // When the dropdown is closed, aria-expended=\"false\"\n          self.$results.attr('aria-expanded', 'false');\n          self.$results.attr('aria-hidden', 'true');\n          self.$results.removeAttr('aria-activedescendant');\n        });\n        container.on('results:toggle', function () {\n          var $highlighted = self.getHighlightedResults();\n\n          if ($highlighted.length === 0) {\n            return;\n          }\n\n          $highlighted.trigger('mouseup');\n        });\n        container.on('results:select', function () {\n          var $highlighted = self.getHighlightedResults();\n\n          if ($highlighted.length === 0) {\n            return;\n          }\n\n          var data = Utils.GetData($highlighted[0], 'data');\n\n          if ($highlighted.attr('aria-selected') == 'true') {\n            self.trigger('close', {});\n          } else {\n            self.trigger('select', {\n              data: data\n            });\n          }\n        });\n        container.on('results:previous', function () {\n          var $highlighted = self.getHighlightedResults();\n          var $options = self.$results.find('[aria-selected]');\n          var currentIndex = $options.index($highlighted); // If we are already at the top, don't move further\n          // If no options, currentIndex will be -1\n\n          if (currentIndex <= 0) {\n            return;\n          }\n\n          var nextIndex = currentIndex - 1; // If none are highlighted, highlight the first\n\n          if ($highlighted.length === 0) {\n            nextIndex = 0;\n          }\n\n          var $next = $options.eq(nextIndex);\n          $next.trigger('mouseenter');\n          var currentOffset = self.$results.offset().top;\n          var nextTop = $next.offset().top;\n          var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n\n          if (nextIndex === 0) {\n            self.$results.scrollTop(0);\n          } else if (nextTop - currentOffset < 0) {\n            self.$results.scrollTop(nextOffset);\n          }\n        });\n        container.on('results:next', function () {\n          var $highlighted = self.getHighlightedResults();\n          var $options = self.$results.find('[aria-selected]');\n          var currentIndex = $options.index($highlighted);\n          var nextIndex = currentIndex + 1; // If we are at the last option, stay there\n\n          if (nextIndex >= $options.length) {\n            return;\n          }\n\n          var $next = $options.eq(nextIndex);\n          $next.trigger('mouseenter');\n          var currentOffset = self.$results.offset().top + self.$results.outerHeight(false);\n          var nextBottom = $next.offset().top + $next.outerHeight(false);\n          var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n\n          if (nextIndex === 0) {\n            self.$results.scrollTop(0);\n          } else if (nextBottom > currentOffset) {\n            self.$results.scrollTop(nextOffset);\n          }\n        });\n        container.on('results:focus', function (params) {\n          params.element.addClass('select2-results__option--highlighted');\n        });\n        container.on('results:message', function (params) {\n          self.displayMessage(params);\n        });\n\n        if ($.fn.mousewheel) {\n          this.$results.on('mousewheel', function (e) {\n            var top = self.$results.scrollTop();\n            var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;\n            var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n            var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n\n            if (isAtTop) {\n              self.$results.scrollTop(0);\n              e.preventDefault();\n              e.stopPropagation();\n            } else if (isAtBottom) {\n              self.$results.scrollTop(self.$results.get(0).scrollHeight - self.$results.height());\n              e.preventDefault();\n              e.stopPropagation();\n            }\n          });\n        }\n\n        this.$results.on('mouseup', '.select2-results__option[aria-selected]', function (evt) {\n          var $this = $(this);\n          var data = Utils.GetData(this, 'data');\n\n          if ($this.attr('aria-selected') === 'true') {\n            if (self.options.get('multiple')) {\n              self.trigger('unselect', {\n                originalEvent: evt,\n                data: data\n              });\n            } else {\n              self.trigger('close', {});\n            }\n\n            return;\n          }\n\n          self.trigger('select', {\n            originalEvent: evt,\n            data: data\n          });\n        });\n        this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) {\n          var data = Utils.GetData(this, 'data');\n          self.getHighlightedResults().removeClass('select2-results__option--highlighted');\n          self.trigger('results:focus', {\n            data: data,\n            element: $(this)\n          });\n        });\n      };\n\n      Results.prototype.getHighlightedResults = function () {\n        var $highlighted = this.$results.find('.select2-results__option--highlighted');\n        return $highlighted;\n      };\n\n      Results.prototype.destroy = function () {\n        this.$results.remove();\n      };\n\n      Results.prototype.ensureHighlightVisible = function () {\n        var $highlighted = this.getHighlightedResults();\n\n        if ($highlighted.length === 0) {\n          return;\n        }\n\n        var $options = this.$results.find('[aria-selected]');\n        var currentIndex = $options.index($highlighted);\n        var currentOffset = this.$results.offset().top;\n        var nextTop = $highlighted.offset().top;\n        var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n        var offsetDelta = nextTop - currentOffset;\n        nextOffset -= $highlighted.outerHeight(false) * 2;\n\n        if (currentIndex <= 2) {\n          this.$results.scrollTop(0);\n        } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n          this.$results.scrollTop(nextOffset);\n        }\n      };\n\n      Results.prototype.template = function (result, container) {\n        var template = this.options.get('templateResult');\n        var escapeMarkup = this.options.get('escapeMarkup');\n        var content = template(result, container);\n\n        if (content == null) {\n          container.style.display = 'none';\n        } else if (typeof content === 'string') {\n          container.innerHTML = escapeMarkup(content);\n        } else {\n          $(container).append(content);\n        }\n      };\n\n      return Results;\n    });\n    S2.define('select2/keys', [], function () {\n      var KEYS = {\n        BACKSPACE: 8,\n        TAB: 9,\n        ENTER: 13,\n        SHIFT: 16,\n        CTRL: 17,\n        ALT: 18,\n        ESC: 27,\n        SPACE: 32,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        END: 35,\n        HOME: 36,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        DELETE: 46\n      };\n      return KEYS;\n    });\n    S2.define('select2/selection/base', ['jquery', '../utils', '../keys'], function ($, Utils, KEYS) {\n      function BaseSelection($element, options) {\n        this.$element = $element;\n        this.options = options;\n\n        BaseSelection.__super__.constructor.call(this);\n      }\n\n      Utils.Extend(BaseSelection, Utils.Observable);\n\n      BaseSelection.prototype.render = function () {\n        var $selection = $('<span class=\"select2-selection\" role=\"combobox\" ' + ' aria-haspopup=\"true\" aria-expanded=\"false\">' + '</span>');\n        this._tabindex = 0;\n\n        if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {\n          this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');\n        } else if (this.$element.attr('tabindex') != null) {\n          this._tabindex = this.$element.attr('tabindex');\n        }\n\n        $selection.attr('title', this.$element.attr('title'));\n        $selection.attr('tabindex', this._tabindex);\n        $selection.attr('aria-disabled', 'false');\n        this.$selection = $selection;\n        return $selection;\n      };\n\n      BaseSelection.prototype.bind = function (container, $container) {\n        var self = this;\n        var resultsId = container.id + '-results';\n        this.container = container;\n        this.$selection.on('focus', function (evt) {\n          self.trigger('focus', evt);\n        });\n        this.$selection.on('blur', function (evt) {\n          self._handleBlur(evt);\n        });\n        this.$selection.on('keydown', function (evt) {\n          self.trigger('keypress', evt);\n\n          if (evt.which === KEYS.SPACE) {\n            evt.preventDefault();\n          }\n        });\n        container.on('results:focus', function (params) {\n          self.$selection.attr('aria-activedescendant', params.data._resultId);\n        });\n        container.on('selection:update', function (params) {\n          self.update(params.data);\n        });\n        container.on('open', function () {\n          // When the dropdown is open, aria-expanded=\"true\"\n          self.$selection.attr('aria-expanded', 'true');\n          self.$selection.attr('aria-owns', resultsId);\n\n          self._attachCloseHandler(container);\n        });\n        container.on('close', function () {\n          // When the dropdown is closed, aria-expanded=\"false\"\n          self.$selection.attr('aria-expanded', 'false');\n          self.$selection.removeAttr('aria-activedescendant');\n          self.$selection.removeAttr('aria-owns');\n          self.$selection.trigger('focus');\n\n          self._detachCloseHandler(container);\n        });\n        container.on('enable', function () {\n          self.$selection.attr('tabindex', self._tabindex);\n          self.$selection.attr('aria-disabled', 'false');\n        });\n        container.on('disable', function () {\n          self.$selection.attr('tabindex', '-1');\n          self.$selection.attr('aria-disabled', 'true');\n        });\n      };\n\n      BaseSelection.prototype._handleBlur = function (evt) {\n        var self = this; // This needs to be delayed as the active element is the body when the tab\n        // key is pressed, possibly along with others.\n\n        window.setTimeout(function () {\n          // Don't trigger `blur` if the focus is still in the selection\n          if (document.activeElement == self.$selection[0] || $.contains(self.$selection[0], document.activeElement)) {\n            return;\n          }\n\n          self.trigger('blur', evt);\n        }, 1);\n      };\n\n      BaseSelection.prototype._attachCloseHandler = function (container) {\n        $(document.body).on('mousedown.select2.' + container.id, function (e) {\n          var $target = $(e.target);\n          var $select = $target.closest('.select2');\n          var $all = $('.select2.select2-container--open');\n          $all.each(function () {\n            if (this == $select[0]) {\n              return;\n            }\n\n            var $element = Utils.GetData(this, 'element');\n            $element.select2('close');\n          });\n        });\n      };\n\n      BaseSelection.prototype._detachCloseHandler = function (container) {\n        $(document.body).off('mousedown.select2.' + container.id);\n      };\n\n      BaseSelection.prototype.position = function ($selection, $container) {\n        var $selectionContainer = $container.find('.selection');\n        $selectionContainer.append($selection);\n      };\n\n      BaseSelection.prototype.destroy = function () {\n        this._detachCloseHandler(this.container);\n      };\n\n      BaseSelection.prototype.update = function (data) {\n        throw new Error('The `update` method must be defined in child classes.');\n      };\n      /**\n       * Helper method to abstract the \"enabled\" (not \"disabled\") state of this\n       * object.\n       *\n       * @return {true} if the instance is not disabled.\n       * @return {false} if the instance is disabled.\n       */\n\n\n      BaseSelection.prototype.isEnabled = function () {\n        return !this.isDisabled();\n      };\n      /**\n       * Helper method to abstract the \"disabled\" state of this object.\n       *\n       * @return {true} if the disabled option is true.\n       * @return {false} if the disabled option is false.\n       */\n\n\n      BaseSelection.prototype.isDisabled = function () {\n        return this.options.get('disabled');\n      };\n\n      return BaseSelection;\n    });\n    S2.define('select2/selection/single', ['jquery', './base', '../utils', '../keys'], function ($, BaseSelection, Utils, KEYS) {\n      function SingleSelection() {\n        SingleSelection.__super__.constructor.apply(this, arguments);\n      }\n\n      Utils.Extend(SingleSelection, BaseSelection);\n\n      SingleSelection.prototype.render = function () {\n        var $selection = SingleSelection.__super__.render.call(this);\n\n        $selection.addClass('select2-selection--single');\n        $selection.html('<span class=\"select2-selection__rendered\"></span>' + '<span class=\"select2-selection__arrow\" role=\"presentation\">' + '<b role=\"presentation\"></b>' + '</span>');\n        return $selection;\n      };\n\n      SingleSelection.prototype.bind = function (container, $container) {\n        var self = this;\n\n        SingleSelection.__super__.bind.apply(this, arguments);\n\n        var id = container.id + '-container';\n        this.$selection.find('.select2-selection__rendered').attr('id', id).attr('role', 'textbox').attr('aria-readonly', 'true');\n        this.$selection.attr('aria-labelledby', id);\n        this.$selection.on('mousedown', function (evt) {\n          // Only respond to left clicks\n          if (evt.which !== 1) {\n            return;\n          }\n\n          self.trigger('toggle', {\n            originalEvent: evt\n          });\n        });\n        this.$selection.on('focus', function (evt) {// User focuses on the container\n        });\n        this.$selection.on('blur', function (evt) {// User exits the container\n        });\n        container.on('focus', function (evt) {\n          if (!container.isOpen()) {\n            self.$selection.trigger('focus');\n          }\n        });\n      };\n\n      SingleSelection.prototype.clear = function () {\n        var $rendered = this.$selection.find('.select2-selection__rendered');\n        $rendered.empty();\n        $rendered.removeAttr('title'); // clear tooltip on empty\n      };\n\n      SingleSelection.prototype.display = function (data, container) {\n        var template = this.options.get('templateSelection');\n        var escapeMarkup = this.options.get('escapeMarkup');\n        return escapeMarkup(template(data, container));\n      };\n\n      SingleSelection.prototype.selectionContainer = function () {\n        return $('<span></span>');\n      };\n\n      SingleSelection.prototype.update = function (data) {\n        if (data.length === 0) {\n          this.clear();\n          return;\n        }\n\n        var selection = data[0];\n        var $rendered = this.$selection.find('.select2-selection__rendered');\n        var formatted = this.display(selection, $rendered);\n        $rendered.empty().append(formatted);\n        var title = selection.title || selection.text;\n\n        if (title) {\n          $rendered.attr('title', title);\n        } else {\n          $rendered.removeAttr('title');\n        }\n      };\n\n      return SingleSelection;\n    });\n    S2.define('select2/selection/multiple', ['jquery', './base', '../utils'], function ($, BaseSelection, Utils) {\n      function MultipleSelection($element, options) {\n        MultipleSelection.__super__.constructor.apply(this, arguments);\n      }\n\n      Utils.Extend(MultipleSelection, BaseSelection);\n\n      MultipleSelection.prototype.render = function () {\n        var $selection = MultipleSelection.__super__.render.call(this);\n\n        $selection.addClass('select2-selection--multiple');\n        $selection.html('<ul class=\"select2-selection__rendered\"></ul>');\n        return $selection;\n      };\n\n      MultipleSelection.prototype.bind = function (container, $container) {\n        var self = this;\n\n        MultipleSelection.__super__.bind.apply(this, arguments);\n\n        this.$selection.on('click', function (evt) {\n          self.trigger('toggle', {\n            originalEvent: evt\n          });\n        });\n        this.$selection.on('click', '.select2-selection__choice__remove', function (evt) {\n          // Ignore the event if it is disabled\n          if (self.isDisabled()) {\n            return;\n          }\n\n          var $remove = $(this);\n          var $selection = $remove.parent();\n          var data = Utils.GetData($selection[0], 'data');\n          self.trigger('unselect', {\n            originalEvent: evt,\n            data: data\n          });\n        });\n      };\n\n      MultipleSelection.prototype.clear = function () {\n        var $rendered = this.$selection.find('.select2-selection__rendered');\n        $rendered.empty();\n        $rendered.removeAttr('title');\n      };\n\n      MultipleSelection.prototype.display = function (data, container) {\n        var template = this.options.get('templateSelection');\n        var escapeMarkup = this.options.get('escapeMarkup');\n        return escapeMarkup(template(data, container));\n      };\n\n      MultipleSelection.prototype.selectionContainer = function () {\n        var $container = $('<li class=\"select2-selection__choice\">' + '<span class=\"select2-selection__choice__remove\" role=\"presentation\">' + '&times;' + '</span>' + '</li>');\n        return $container;\n      };\n\n      MultipleSelection.prototype.update = function (data) {\n        this.clear();\n\n        if (data.length === 0) {\n          return;\n        }\n\n        var $selections = [];\n\n        for (var d = 0; d < data.length; d++) {\n          var selection = data[d];\n          var $selection = this.selectionContainer();\n          var formatted = this.display(selection, $selection);\n          $selection.append(formatted);\n          var title = selection.title || selection.text;\n\n          if (title) {\n            $selection.attr('title', title);\n          }\n\n          Utils.StoreData($selection[0], 'data', selection);\n          $selections.push($selection);\n        }\n\n        var $rendered = this.$selection.find('.select2-selection__rendered');\n        Utils.appendMany($rendered, $selections);\n      };\n\n      return MultipleSelection;\n    });\n    S2.define('select2/selection/placeholder', ['../utils'], function (Utils) {\n      function Placeholder(decorated, $element, options) {\n        this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n        decorated.call(this, $element, options);\n      }\n\n      Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {\n        if (typeof placeholder === 'string') {\n          placeholder = {\n            id: '',\n            text: placeholder\n          };\n        }\n\n        return placeholder;\n      };\n\n      Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {\n        var $placeholder = this.selectionContainer();\n        $placeholder.html(this.display(placeholder));\n        $placeholder.addClass('select2-selection__placeholder').removeClass('select2-selection__choice');\n        return $placeholder;\n      };\n\n      Placeholder.prototype.update = function (decorated, data) {\n        var singlePlaceholder = data.length == 1 && data[0].id != this.placeholder.id;\n        var multipleSelections = data.length > 1;\n\n        if (multipleSelections || singlePlaceholder) {\n          return decorated.call(this, data);\n        }\n\n        this.clear();\n        var $placeholder = this.createPlaceholder(this.placeholder);\n        this.$selection.find('.select2-selection__rendered').append($placeholder);\n      };\n\n      return Placeholder;\n    });\n    S2.define('select2/selection/allowClear', ['jquery', '../keys', '../utils'], function ($, KEYS, Utils) {\n      function AllowClear() {}\n\n      AllowClear.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        decorated.call(this, container, $container);\n\n        if (this.placeholder == null) {\n          if (this.options.get('debug') && window.console && console.error) {\n            console.error('Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.');\n          }\n        }\n\n        this.$selection.on('mousedown', '.select2-selection__clear', function (evt) {\n          self._handleClear(evt);\n        });\n        container.on('keypress', function (evt) {\n          self._handleKeyboardClear(evt, container);\n        });\n      };\n\n      AllowClear.prototype._handleClear = function (_, evt) {\n        // Ignore the event if it is disabled\n        if (this.isDisabled()) {\n          return;\n        }\n\n        var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected\n\n        if ($clear.length === 0) {\n          return;\n        }\n\n        evt.stopPropagation();\n        var data = Utils.GetData($clear[0], 'data');\n        var previousVal = this.$element.val();\n        this.$element.val(this.placeholder.id);\n        var unselectData = {\n          data: data\n        };\n        this.trigger('clear', unselectData);\n\n        if (unselectData.prevented) {\n          this.$element.val(previousVal);\n          return;\n        }\n\n        for (var d = 0; d < data.length; d++) {\n          unselectData = {\n            data: data[d]\n          }; // Trigger the `unselect` event, so people can prevent it from being\n          // cleared.\n\n          this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out.\n\n          if (unselectData.prevented) {\n            this.$element.val(previousVal);\n            return;\n          }\n        }\n\n        this.$element.trigger('input').trigger('change');\n        this.trigger('toggle', {});\n      };\n\n      AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {\n        if (container.isOpen()) {\n          return;\n        }\n\n        if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n          this._handleClear(evt);\n        }\n      };\n\n      AllowClear.prototype.update = function (decorated, data) {\n        decorated.call(this, data);\n\n        if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) {\n          return;\n        }\n\n        var removeAll = this.options.get('translations').get('removeAllItems');\n        var $remove = $('<span class=\"select2-selection__clear\" title=\"' + removeAll() + '\">' + '&times;' + '</span>');\n        Utils.StoreData($remove[0], 'data', data);\n        this.$selection.find('.select2-selection__rendered').prepend($remove);\n      };\n\n      return AllowClear;\n    });\n    S2.define('select2/selection/search', ['jquery', '../utils', '../keys'], function ($, Utils, KEYS) {\n      function Search(decorated, $element, options) {\n        decorated.call(this, $element, options);\n      }\n\n      Search.prototype.render = function (decorated) {\n        var $search = $('<li class=\"select2-search select2-search--inline\">' + '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' + ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"none\"' + ' spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" />' + '</li>');\n        this.$searchContainer = $search;\n        this.$search = $search.find('input');\n        var $rendered = decorated.call(this);\n\n        this._transferTabIndex();\n\n        return $rendered;\n      };\n\n      Search.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        var resultsId = container.id + '-results';\n        decorated.call(this, container, $container);\n        container.on('open', function () {\n          self.$search.attr('aria-controls', resultsId);\n          self.$search.trigger('focus');\n        });\n        container.on('close', function () {\n          self.$search.val('');\n          self.$search.removeAttr('aria-controls');\n          self.$search.removeAttr('aria-activedescendant');\n          self.$search.trigger('focus');\n        });\n        container.on('enable', function () {\n          self.$search.prop('disabled', false);\n\n          self._transferTabIndex();\n        });\n        container.on('disable', function () {\n          self.$search.prop('disabled', true);\n        });\n        container.on('focus', function (evt) {\n          self.$search.trigger('focus');\n        });\n        container.on('results:focus', function (params) {\n          if (params.data._resultId) {\n            self.$search.attr('aria-activedescendant', params.data._resultId);\n          } else {\n            self.$search.removeAttr('aria-activedescendant');\n          }\n        });\n        this.$selection.on('focusin', '.select2-search--inline', function (evt) {\n          self.trigger('focus', evt);\n        });\n        this.$selection.on('focusout', '.select2-search--inline', function (evt) {\n          self._handleBlur(evt);\n        });\n        this.$selection.on('keydown', '.select2-search--inline', function (evt) {\n          evt.stopPropagation();\n          self.trigger('keypress', evt);\n          self._keyUpPrevented = evt.isDefaultPrevented();\n          var key = evt.which;\n\n          if (key === KEYS.BACKSPACE && self.$search.val() === '') {\n            var $previousChoice = self.$searchContainer.prev('.select2-selection__choice');\n\n            if ($previousChoice.length > 0) {\n              var item = Utils.GetData($previousChoice[0], 'data');\n              self.searchRemoveChoice(item);\n              evt.preventDefault();\n            }\n          }\n        });\n        this.$selection.on('click', '.select2-search--inline', function (evt) {\n          if (self.$search.val()) {\n            evt.stopPropagation();\n          }\n        }); // Try to detect the IE version should the `documentMode` property that\n        // is stored on the document. This is only implemented in IE and is\n        // slightly cleaner than doing a user agent check.\n        // This property is not available in Edge, but Edge also doesn't have\n        // this bug.\n\n        var msie = document.documentMode;\n        var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event\n        // This will prevent double-triggering of events for browsers which support\n        // both the `keyup` and `input` events.\n\n        this.$selection.on('input.searchcheck', '.select2-search--inline', function (evt) {\n          // IE will trigger the `input` event when a placeholder is used on a\n          // search box. To get around this issue, we are forced to ignore all\n          // `input` events in IE and keep using `keyup`.\n          if (disableInputEvents) {\n            self.$selection.off('input.search input.searchcheck');\n            return;\n          } // Unbind the duplicated `keyup` event\n\n\n          self.$selection.off('keyup.search');\n        });\n        this.$selection.on('keyup.search input.search', '.select2-search--inline', function (evt) {\n          // IE will trigger the `input` event when a placeholder is used on a\n          // search box. To get around this issue, we are forced to ignore all\n          // `input` events in IE and keep using `keyup`.\n          if (disableInputEvents && evt.type === 'input') {\n            self.$selection.off('input.search input.searchcheck');\n            return;\n          }\n\n          var key = evt.which; // We can freely ignore events from modifier keys\n\n          if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {\n            return;\n          } // Tabbing will be handled during the `keydown` phase\n\n\n          if (key == KEYS.TAB) {\n            return;\n          }\n\n          self.handleSearch(evt);\n        });\n      };\n      /**\n       * This method will transfer the tabindex attribute from the rendered\n       * selection to the search box. This allows for the search box to be used as\n       * the primary focus instead of the selection container.\n       *\n       * @private\n       */\n\n\n      Search.prototype._transferTabIndex = function (decorated) {\n        this.$search.attr('tabindex', this.$selection.attr('tabindex'));\n        this.$selection.attr('tabindex', '-1');\n      };\n\n      Search.prototype.createPlaceholder = function (decorated, placeholder) {\n        this.$search.attr('placeholder', placeholder.text);\n      };\n\n      Search.prototype.update = function (decorated, data) {\n        var searchHadFocus = this.$search[0] == document.activeElement;\n        this.$search.attr('placeholder', '');\n        decorated.call(this, data);\n        this.$selection.find('.select2-selection__rendered').append(this.$searchContainer);\n        this.resizeSearch();\n\n        if (searchHadFocus) {\n          this.$search.trigger('focus');\n        }\n      };\n\n      Search.prototype.handleSearch = function () {\n        this.resizeSearch();\n\n        if (!this._keyUpPrevented) {\n          var input = this.$search.val();\n          this.trigger('query', {\n            term: input\n          });\n        }\n\n        this._keyUpPrevented = false;\n      };\n\n      Search.prototype.searchRemoveChoice = function (decorated, item) {\n        this.trigger('unselect', {\n          data: item\n        });\n        this.$search.val(item.text);\n        this.handleSearch();\n      };\n\n      Search.prototype.resizeSearch = function () {\n        this.$search.css('width', '25px');\n        var width = '';\n\n        if (this.$search.attr('placeholder') !== '') {\n          width = this.$selection.find('.select2-selection__rendered').width();\n        } else {\n          var minimumWidth = this.$search.val().length + 1;\n          width = minimumWidth * 0.75 + 'em';\n        }\n\n        this.$search.css('width', width);\n      };\n\n      return Search;\n    });\n    S2.define('select2/selection/eventRelay', ['jquery'], function ($) {\n      function EventRelay() {}\n\n      EventRelay.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        var relayEvents = ['open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting', 'clear', 'clearing'];\n        var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting', 'clearing'];\n        decorated.call(this, container, $container);\n        container.on('*', function (name, params) {\n          // Ignore events that should not be relayed\n          if ($.inArray(name, relayEvents) === -1) {\n            return;\n          } // The parameters should always be an object\n\n\n          params = params || {}; // Generate the jQuery event for the Select2 event\n\n          var evt = $.Event('select2:' + name, {\n            params: params\n          });\n          self.$element.trigger(evt); // Only handle preventable events if it was one\n\n          if ($.inArray(name, preventableEvents) === -1) {\n            return;\n          }\n\n          params.prevented = evt.isDefaultPrevented();\n        });\n      };\n\n      return EventRelay;\n    });\n    S2.define('select2/translation', ['jquery', 'require'], function ($, require) {\n      function Translation(dict) {\n        this.dict = dict || {};\n      }\n\n      Translation.prototype.all = function () {\n        return this.dict;\n      };\n\n      Translation.prototype.get = function (key) {\n        return this.dict[key];\n      };\n\n      Translation.prototype.extend = function (translation) {\n        this.dict = $.extend({}, translation.all(), this.dict);\n      }; // Static functions\n\n\n      Translation._cache = {};\n\n      Translation.loadPath = function (path) {\n        if (!(path in Translation._cache)) {\n          var translations = require(path);\n\n          Translation._cache[path] = translations;\n        }\n\n        return new Translation(Translation._cache[path]);\n      };\n\n      return Translation;\n    });\n    S2.define('select2/diacritics', [], function () {\n      var diacritics = {\n        \"\\u24B6\": 'A',\n        \"\\uFF21\": 'A',\n        \"\\xC0\": 'A',\n        \"\\xC1\": 'A',\n        \"\\xC2\": 'A',\n        \"\\u1EA6\": 'A',\n        \"\\u1EA4\": 'A',\n        \"\\u1EAA\": 'A',\n        \"\\u1EA8\": 'A',\n        \"\\xC3\": 'A',\n        \"\\u0100\": 'A',\n        \"\\u0102\": 'A',\n        \"\\u1EB0\": 'A',\n        \"\\u1EAE\": 'A',\n        \"\\u1EB4\": 'A',\n        \"\\u1EB2\": 'A',\n        \"\\u0226\": 'A',\n        \"\\u01E0\": 'A',\n        \"\\xC4\": 'A',\n        \"\\u01DE\": 'A',\n        \"\\u1EA2\": 'A',\n        \"\\xC5\": 'A',\n        \"\\u01FA\": 'A',\n        \"\\u01CD\": 'A',\n        \"\\u0200\": 'A',\n        \"\\u0202\": 'A',\n        \"\\u1EA0\": 'A',\n        \"\\u1EAC\": 'A',\n        \"\\u1EB6\": 'A',\n        \"\\u1E00\": 'A',\n        \"\\u0104\": 'A',\n        \"\\u023A\": 'A',\n        \"\\u2C6F\": 'A',\n        \"\\uA732\": 'AA',\n        \"\\xC6\": 'AE',\n        \"\\u01FC\": 'AE',\n        \"\\u01E2\": 'AE',\n        \"\\uA734\": 'AO',\n        \"\\uA736\": 'AU',\n        \"\\uA738\": 'AV',\n        \"\\uA73A\": 'AV',\n        \"\\uA73C\": 'AY',\n        \"\\u24B7\": 'B',\n        \"\\uFF22\": 'B',\n        \"\\u1E02\": 'B',\n        \"\\u1E04\": 'B',\n        \"\\u1E06\": 'B',\n        \"\\u0243\": 'B',\n        \"\\u0182\": 'B',\n        \"\\u0181\": 'B',\n        \"\\u24B8\": 'C',\n        \"\\uFF23\": 'C',\n        \"\\u0106\": 'C',\n        \"\\u0108\": 'C',\n        \"\\u010A\": 'C',\n        \"\\u010C\": 'C',\n        \"\\xC7\": 'C',\n        \"\\u1E08\": 'C',\n        \"\\u0187\": 'C',\n        \"\\u023B\": 'C',\n        \"\\uA73E\": 'C',\n        \"\\u24B9\": 'D',\n        \"\\uFF24\": 'D',\n        \"\\u1E0A\": 'D',\n        \"\\u010E\": 'D',\n        \"\\u1E0C\": 'D',\n        \"\\u1E10\": 'D',\n        \"\\u1E12\": 'D',\n        \"\\u1E0E\": 'D',\n        \"\\u0110\": 'D',\n        \"\\u018B\": 'D',\n        \"\\u018A\": 'D',\n        \"\\u0189\": 'D',\n        \"\\uA779\": 'D',\n        \"\\u01F1\": 'DZ',\n        \"\\u01C4\": 'DZ',\n        \"\\u01F2\": 'Dz',\n        \"\\u01C5\": 'Dz',\n        \"\\u24BA\": 'E',\n        \"\\uFF25\": 'E',\n        \"\\xC8\": 'E',\n        \"\\xC9\": 'E',\n        \"\\xCA\": 'E',\n        \"\\u1EC0\": 'E',\n        \"\\u1EBE\": 'E',\n        \"\\u1EC4\": 'E',\n        \"\\u1EC2\": 'E',\n        \"\\u1EBC\": 'E',\n        \"\\u0112\": 'E',\n        \"\\u1E14\": 'E',\n        \"\\u1E16\": 'E',\n        \"\\u0114\": 'E',\n        \"\\u0116\": 'E',\n        \"\\xCB\": 'E',\n        \"\\u1EBA\": 'E',\n        \"\\u011A\": 'E',\n        \"\\u0204\": 'E',\n        \"\\u0206\": 'E',\n        \"\\u1EB8\": 'E',\n        \"\\u1EC6\": 'E',\n        \"\\u0228\": 'E',\n        \"\\u1E1C\": 'E',\n        \"\\u0118\": 'E',\n        \"\\u1E18\": 'E',\n        \"\\u1E1A\": 'E',\n        \"\\u0190\": 'E',\n        \"\\u018E\": 'E',\n        \"\\u24BB\": 'F',\n        \"\\uFF26\": 'F',\n        \"\\u1E1E\": 'F',\n        \"\\u0191\": 'F',\n        \"\\uA77B\": 'F',\n        \"\\u24BC\": 'G',\n        \"\\uFF27\": 'G',\n        \"\\u01F4\": 'G',\n        \"\\u011C\": 'G',\n        \"\\u1E20\": 'G',\n        \"\\u011E\": 'G',\n        \"\\u0120\": 'G',\n        \"\\u01E6\": 'G',\n        \"\\u0122\": 'G',\n        \"\\u01E4\": 'G',\n        \"\\u0193\": 'G',\n        \"\\uA7A0\": 'G',\n        \"\\uA77D\": 'G',\n        \"\\uA77E\": 'G',\n        \"\\u24BD\": 'H',\n        \"\\uFF28\": 'H',\n        \"\\u0124\": 'H',\n        \"\\u1E22\": 'H',\n        \"\\u1E26\": 'H',\n        \"\\u021E\": 'H',\n        \"\\u1E24\": 'H',\n        \"\\u1E28\": 'H',\n        \"\\u1E2A\": 'H',\n        \"\\u0126\": 'H',\n        \"\\u2C67\": 'H',\n        \"\\u2C75\": 'H',\n        \"\\uA78D\": 'H',\n        \"\\u24BE\": 'I',\n        \"\\uFF29\": 'I',\n        \"\\xCC\": 'I',\n        \"\\xCD\": 'I',\n        \"\\xCE\": 'I',\n        \"\\u0128\": 'I',\n        \"\\u012A\": 'I',\n        \"\\u012C\": 'I',\n        \"\\u0130\": 'I',\n        \"\\xCF\": 'I',\n        \"\\u1E2E\": 'I',\n        \"\\u1EC8\": 'I',\n        \"\\u01CF\": 'I',\n        \"\\u0208\": 'I',\n        \"\\u020A\": 'I',\n        \"\\u1ECA\": 'I',\n        \"\\u012E\": 'I',\n        \"\\u1E2C\": 'I',\n        \"\\u0197\": 'I',\n        \"\\u24BF\": 'J',\n        \"\\uFF2A\": 'J',\n        \"\\u0134\": 'J',\n        \"\\u0248\": 'J',\n        \"\\u24C0\": 'K',\n        \"\\uFF2B\": 'K',\n        \"\\u1E30\": 'K',\n        \"\\u01E8\": 'K',\n        \"\\u1E32\": 'K',\n        \"\\u0136\": 'K',\n        \"\\u1E34\": 'K',\n        \"\\u0198\": 'K',\n        \"\\u2C69\": 'K',\n        \"\\uA740\": 'K',\n        \"\\uA742\": 'K',\n        \"\\uA744\": 'K',\n        \"\\uA7A2\": 'K',\n        \"\\u24C1\": 'L',\n        \"\\uFF2C\": 'L',\n        \"\\u013F\": 'L',\n        \"\\u0139\": 'L',\n        \"\\u013D\": 'L',\n        \"\\u1E36\": 'L',\n        \"\\u1E38\": 'L',\n        \"\\u013B\": 'L',\n        \"\\u1E3C\": 'L',\n        \"\\u1E3A\": 'L',\n        \"\\u0141\": 'L',\n        \"\\u023D\": 'L',\n        \"\\u2C62\": 'L',\n        \"\\u2C60\": 'L',\n        \"\\uA748\": 'L',\n        \"\\uA746\": 'L',\n        \"\\uA780\": 'L',\n        \"\\u01C7\": 'LJ',\n        \"\\u01C8\": 'Lj',\n        \"\\u24C2\": 'M',\n        \"\\uFF2D\": 'M',\n        \"\\u1E3E\": 'M',\n        \"\\u1E40\": 'M',\n        \"\\u1E42\": 'M',\n        \"\\u2C6E\": 'M',\n        \"\\u019C\": 'M',\n        \"\\u24C3\": 'N',\n        \"\\uFF2E\": 'N',\n        \"\\u01F8\": 'N',\n        \"\\u0143\": 'N',\n        \"\\xD1\": 'N',\n        \"\\u1E44\": 'N',\n        \"\\u0147\": 'N',\n        \"\\u1E46\": 'N',\n        \"\\u0145\": 'N',\n        \"\\u1E4A\": 'N',\n        \"\\u1E48\": 'N',\n        \"\\u0220\": 'N',\n        \"\\u019D\": 'N',\n        \"\\uA790\": 'N',\n        \"\\uA7A4\": 'N',\n        \"\\u01CA\": 'NJ',\n        \"\\u01CB\": 'Nj',\n        \"\\u24C4\": 'O',\n        \"\\uFF2F\": 'O',\n        \"\\xD2\": 'O',\n        \"\\xD3\": 'O',\n        \"\\xD4\": 'O',\n        \"\\u1ED2\": 'O',\n        \"\\u1ED0\": 'O',\n        \"\\u1ED6\": 'O',\n        \"\\u1ED4\": 'O',\n        \"\\xD5\": 'O',\n        \"\\u1E4C\": 'O',\n        \"\\u022C\": 'O',\n        \"\\u1E4E\": 'O',\n        \"\\u014C\": 'O',\n        \"\\u1E50\": 'O',\n        \"\\u1E52\": 'O',\n        \"\\u014E\": 'O',\n        \"\\u022E\": 'O',\n        \"\\u0230\": 'O',\n        \"\\xD6\": 'O',\n        \"\\u022A\": 'O',\n        \"\\u1ECE\": 'O',\n        \"\\u0150\": 'O',\n        \"\\u01D1\": 'O',\n        \"\\u020C\": 'O',\n        \"\\u020E\": 'O',\n        \"\\u01A0\": 'O',\n        \"\\u1EDC\": 'O',\n        \"\\u1EDA\": 'O',\n        \"\\u1EE0\": 'O',\n        \"\\u1EDE\": 'O',\n        \"\\u1EE2\": 'O',\n        \"\\u1ECC\": 'O',\n        \"\\u1ED8\": 'O',\n        \"\\u01EA\": 'O',\n        \"\\u01EC\": 'O',\n        \"\\xD8\": 'O',\n        \"\\u01FE\": 'O',\n        \"\\u0186\": 'O',\n        \"\\u019F\": 'O',\n        \"\\uA74A\": 'O',\n        \"\\uA74C\": 'O',\n        \"\\u0152\": 'OE',\n        \"\\u01A2\": 'OI',\n        \"\\uA74E\": 'OO',\n        \"\\u0222\": 'OU',\n        \"\\u24C5\": 'P',\n        \"\\uFF30\": 'P',\n        \"\\u1E54\": 'P',\n        \"\\u1E56\": 'P',\n        \"\\u01A4\": 'P',\n        \"\\u2C63\": 'P',\n        \"\\uA750\": 'P',\n        \"\\uA752\": 'P',\n        \"\\uA754\": 'P',\n        \"\\u24C6\": 'Q',\n        \"\\uFF31\": 'Q',\n        \"\\uA756\": 'Q',\n        \"\\uA758\": 'Q',\n        \"\\u024A\": 'Q',\n        \"\\u24C7\": 'R',\n        \"\\uFF32\": 'R',\n        \"\\u0154\": 'R',\n        \"\\u1E58\": 'R',\n        \"\\u0158\": 'R',\n        \"\\u0210\": 'R',\n        \"\\u0212\": 'R',\n        \"\\u1E5A\": 'R',\n        \"\\u1E5C\": 'R',\n        \"\\u0156\": 'R',\n        \"\\u1E5E\": 'R',\n        \"\\u024C\": 'R',\n        \"\\u2C64\": 'R',\n        \"\\uA75A\": 'R',\n        \"\\uA7A6\": 'R',\n        \"\\uA782\": 'R',\n        \"\\u24C8\": 'S',\n        \"\\uFF33\": 'S',\n        \"\\u1E9E\": 'S',\n        \"\\u015A\": 'S',\n        \"\\u1E64\": 'S',\n        \"\\u015C\": 'S',\n        \"\\u1E60\": 'S',\n        \"\\u0160\": 'S',\n        \"\\u1E66\": 'S',\n        \"\\u1E62\": 'S',\n        \"\\u1E68\": 'S',\n        \"\\u0218\": 'S',\n        \"\\u015E\": 'S',\n        \"\\u2C7E\": 'S',\n        \"\\uA7A8\": 'S',\n        \"\\uA784\": 'S',\n        \"\\u24C9\": 'T',\n        \"\\uFF34\": 'T',\n        \"\\u1E6A\": 'T',\n        \"\\u0164\": 'T',\n        \"\\u1E6C\": 'T',\n        \"\\u021A\": 'T',\n        \"\\u0162\": 'T',\n        \"\\u1E70\": 'T',\n        \"\\u1E6E\": 'T',\n        \"\\u0166\": 'T',\n        \"\\u01AC\": 'T',\n        \"\\u01AE\": 'T',\n        \"\\u023E\": 'T',\n        \"\\uA786\": 'T',\n        \"\\uA728\": 'TZ',\n        \"\\u24CA\": 'U',\n        \"\\uFF35\": 'U',\n        \"\\xD9\": 'U',\n        \"\\xDA\": 'U',\n        \"\\xDB\": 'U',\n        \"\\u0168\": 'U',\n        \"\\u1E78\": 'U',\n        \"\\u016A\": 'U',\n        \"\\u1E7A\": 'U',\n        \"\\u016C\": 'U',\n        \"\\xDC\": 'U',\n        \"\\u01DB\": 'U',\n        \"\\u01D7\": 'U',\n        \"\\u01D5\": 'U',\n        \"\\u01D9\": 'U',\n        \"\\u1EE6\": 'U',\n        \"\\u016E\": 'U',\n        \"\\u0170\": 'U',\n        \"\\u01D3\": 'U',\n        \"\\u0214\": 'U',\n        \"\\u0216\": 'U',\n        \"\\u01AF\": 'U',\n        \"\\u1EEA\": 'U',\n        \"\\u1EE8\": 'U',\n        \"\\u1EEE\": 'U',\n        \"\\u1EEC\": 'U',\n        \"\\u1EF0\": 'U',\n        \"\\u1EE4\": 'U',\n        \"\\u1E72\": 'U',\n        \"\\u0172\": 'U',\n        \"\\u1E76\": 'U',\n        \"\\u1E74\": 'U',\n        \"\\u0244\": 'U',\n        \"\\u24CB\": 'V',\n        \"\\uFF36\": 'V',\n        \"\\u1E7C\": 'V',\n        \"\\u1E7E\": 'V',\n        \"\\u01B2\": 'V',\n        \"\\uA75E\": 'V',\n        \"\\u0245\": 'V',\n        \"\\uA760\": 'VY',\n        \"\\u24CC\": 'W',\n        \"\\uFF37\": 'W',\n        \"\\u1E80\": 'W',\n        \"\\u1E82\": 'W',\n        \"\\u0174\": 'W',\n        \"\\u1E86\": 'W',\n        \"\\u1E84\": 'W',\n        \"\\u1E88\": 'W',\n        \"\\u2C72\": 'W',\n        \"\\u24CD\": 'X',\n        \"\\uFF38\": 'X',\n        \"\\u1E8A\": 'X',\n        \"\\u1E8C\": 'X',\n        \"\\u24CE\": 'Y',\n        \"\\uFF39\": 'Y',\n        \"\\u1EF2\": 'Y',\n        \"\\xDD\": 'Y',\n        \"\\u0176\": 'Y',\n        \"\\u1EF8\": 'Y',\n        \"\\u0232\": 'Y',\n        \"\\u1E8E\": 'Y',\n        \"\\u0178\": 'Y',\n        \"\\u1EF6\": 'Y',\n        \"\\u1EF4\": 'Y',\n        \"\\u01B3\": 'Y',\n        \"\\u024E\": 'Y',\n        \"\\u1EFE\": 'Y',\n        \"\\u24CF\": 'Z',\n        \"\\uFF3A\": 'Z',\n        \"\\u0179\": 'Z',\n        \"\\u1E90\": 'Z',\n        \"\\u017B\": 'Z',\n        \"\\u017D\": 'Z',\n        \"\\u1E92\": 'Z',\n        \"\\u1E94\": 'Z',\n        \"\\u01B5\": 'Z',\n        \"\\u0224\": 'Z',\n        \"\\u2C7F\": 'Z',\n        \"\\u2C6B\": 'Z',\n        \"\\uA762\": 'Z',\n        \"\\u24D0\": 'a',\n        \"\\uFF41\": 'a',\n        \"\\u1E9A\": 'a',\n        \"\\xE0\": 'a',\n        \"\\xE1\": 'a',\n        \"\\xE2\": 'a',\n        \"\\u1EA7\": 'a',\n        \"\\u1EA5\": 'a',\n        \"\\u1EAB\": 'a',\n        \"\\u1EA9\": 'a',\n        \"\\xE3\": 'a',\n        \"\\u0101\": 'a',\n        \"\\u0103\": 'a',\n        \"\\u1EB1\": 'a',\n        \"\\u1EAF\": 'a',\n        \"\\u1EB5\": 'a',\n        \"\\u1EB3\": 'a',\n        \"\\u0227\": 'a',\n        \"\\u01E1\": 'a',\n        \"\\xE4\": 'a',\n        \"\\u01DF\": 'a',\n        \"\\u1EA3\": 'a',\n        \"\\xE5\": 'a',\n        \"\\u01FB\": 'a',\n        \"\\u01CE\": 'a',\n        \"\\u0201\": 'a',\n        \"\\u0203\": 'a',\n        \"\\u1EA1\": 'a',\n        \"\\u1EAD\": 'a',\n        \"\\u1EB7\": 'a',\n        \"\\u1E01\": 'a',\n        \"\\u0105\": 'a',\n        \"\\u2C65\": 'a',\n        \"\\u0250\": 'a',\n        \"\\uA733\": 'aa',\n        \"\\xE6\": 'ae',\n        \"\\u01FD\": 'ae',\n        \"\\u01E3\": 'ae',\n        \"\\uA735\": 'ao',\n        \"\\uA737\": 'au',\n        \"\\uA739\": 'av',\n        \"\\uA73B\": 'av',\n        \"\\uA73D\": 'ay',\n        \"\\u24D1\": 'b',\n        \"\\uFF42\": 'b',\n        \"\\u1E03\": 'b',\n        \"\\u1E05\": 'b',\n        \"\\u1E07\": 'b',\n        \"\\u0180\": 'b',\n        \"\\u0183\": 'b',\n        \"\\u0253\": 'b',\n        \"\\u24D2\": 'c',\n        \"\\uFF43\": 'c',\n        \"\\u0107\": 'c',\n        \"\\u0109\": 'c',\n        \"\\u010B\": 'c',\n        \"\\u010D\": 'c',\n        \"\\xE7\": 'c',\n        \"\\u1E09\": 'c',\n        \"\\u0188\": 'c',\n        \"\\u023C\": 'c',\n        \"\\uA73F\": 'c',\n        \"\\u2184\": 'c',\n        \"\\u24D3\": 'd',\n        \"\\uFF44\": 'd',\n        \"\\u1E0B\": 'd',\n        \"\\u010F\": 'd',\n        \"\\u1E0D\": 'd',\n        \"\\u1E11\": 'd',\n        \"\\u1E13\": 'd',\n        \"\\u1E0F\": 'd',\n        \"\\u0111\": 'd',\n        \"\\u018C\": 'd',\n        \"\\u0256\": 'd',\n        \"\\u0257\": 'd',\n        \"\\uA77A\": 'd',\n        \"\\u01F3\": 'dz',\n        \"\\u01C6\": 'dz',\n        \"\\u24D4\": 'e',\n        \"\\uFF45\": 'e',\n        \"\\xE8\": 'e',\n        \"\\xE9\": 'e',\n        \"\\xEA\": 'e',\n        \"\\u1EC1\": 'e',\n        \"\\u1EBF\": 'e',\n        \"\\u1EC5\": 'e',\n        \"\\u1EC3\": 'e',\n        \"\\u1EBD\": 'e',\n        \"\\u0113\": 'e',\n        \"\\u1E15\": 'e',\n        \"\\u1E17\": 'e',\n        \"\\u0115\": 'e',\n        \"\\u0117\": 'e',\n        \"\\xEB\": 'e',\n        \"\\u1EBB\": 'e',\n        \"\\u011B\": 'e',\n        \"\\u0205\": 'e',\n        \"\\u0207\": 'e',\n        \"\\u1EB9\": 'e',\n        \"\\u1EC7\": 'e',\n        \"\\u0229\": 'e',\n        \"\\u1E1D\": 'e',\n        \"\\u0119\": 'e',\n        \"\\u1E19\": 'e',\n        \"\\u1E1B\": 'e',\n        \"\\u0247\": 'e',\n        \"\\u025B\": 'e',\n        \"\\u01DD\": 'e',\n        \"\\u24D5\": 'f',\n        \"\\uFF46\": 'f',\n        \"\\u1E1F\": 'f',\n        \"\\u0192\": 'f',\n        \"\\uA77C\": 'f',\n        \"\\u24D6\": 'g',\n        \"\\uFF47\": 'g',\n        \"\\u01F5\": 'g',\n        \"\\u011D\": 'g',\n        \"\\u1E21\": 'g',\n        \"\\u011F\": 'g',\n        \"\\u0121\": 'g',\n        \"\\u01E7\": 'g',\n        \"\\u0123\": 'g',\n        \"\\u01E5\": 'g',\n        \"\\u0260\": 'g',\n        \"\\uA7A1\": 'g',\n        \"\\u1D79\": 'g',\n        \"\\uA77F\": 'g',\n        \"\\u24D7\": 'h',\n        \"\\uFF48\": 'h',\n        \"\\u0125\": 'h',\n        \"\\u1E23\": 'h',\n        \"\\u1E27\": 'h',\n        \"\\u021F\": 'h',\n        \"\\u1E25\": 'h',\n        \"\\u1E29\": 'h',\n        \"\\u1E2B\": 'h',\n        \"\\u1E96\": 'h',\n        \"\\u0127\": 'h',\n        \"\\u2C68\": 'h',\n        \"\\u2C76\": 'h',\n        \"\\u0265\": 'h',\n        \"\\u0195\": 'hv',\n        \"\\u24D8\": 'i',\n        \"\\uFF49\": 'i',\n        \"\\xEC\": 'i',\n        \"\\xED\": 'i',\n        \"\\xEE\": 'i',\n        \"\\u0129\": 'i',\n        \"\\u012B\": 'i',\n        \"\\u012D\": 'i',\n        \"\\xEF\": 'i',\n        \"\\u1E2F\": 'i',\n        \"\\u1EC9\": 'i',\n        \"\\u01D0\": 'i',\n        \"\\u0209\": 'i',\n        \"\\u020B\": 'i',\n        \"\\u1ECB\": 'i',\n        \"\\u012F\": 'i',\n        \"\\u1E2D\": 'i',\n        \"\\u0268\": 'i',\n        \"\\u0131\": 'i',\n        \"\\u24D9\": 'j',\n        \"\\uFF4A\": 'j',\n        \"\\u0135\": 'j',\n        \"\\u01F0\": 'j',\n        \"\\u0249\": 'j',\n        \"\\u24DA\": 'k',\n        \"\\uFF4B\": 'k',\n        \"\\u1E31\": 'k',\n        \"\\u01E9\": 'k',\n        \"\\u1E33\": 'k',\n        \"\\u0137\": 'k',\n        \"\\u1E35\": 'k',\n        \"\\u0199\": 'k',\n        \"\\u2C6A\": 'k',\n        \"\\uA741\": 'k',\n        \"\\uA743\": 'k',\n        \"\\uA745\": 'k',\n        \"\\uA7A3\": 'k',\n        \"\\u24DB\": 'l',\n        \"\\uFF4C\": 'l',\n        \"\\u0140\": 'l',\n        \"\\u013A\": 'l',\n        \"\\u013E\": 'l',\n        \"\\u1E37\": 'l',\n        \"\\u1E39\": 'l',\n        \"\\u013C\": 'l',\n        \"\\u1E3D\": 'l',\n        \"\\u1E3B\": 'l',\n        \"\\u017F\": 'l',\n        \"\\u0142\": 'l',\n        \"\\u019A\": 'l',\n        \"\\u026B\": 'l',\n        \"\\u2C61\": 'l',\n        \"\\uA749\": 'l',\n        \"\\uA781\": 'l',\n        \"\\uA747\": 'l',\n        \"\\u01C9\": 'lj',\n        \"\\u24DC\": 'm',\n        \"\\uFF4D\": 'm',\n        \"\\u1E3F\": 'm',\n        \"\\u1E41\": 'm',\n        \"\\u1E43\": 'm',\n        \"\\u0271\": 'm',\n        \"\\u026F\": 'm',\n        \"\\u24DD\": 'n',\n        \"\\uFF4E\": 'n',\n        \"\\u01F9\": 'n',\n        \"\\u0144\": 'n',\n        \"\\xF1\": 'n',\n        \"\\u1E45\": 'n',\n        \"\\u0148\": 'n',\n        \"\\u1E47\": 'n',\n        \"\\u0146\": 'n',\n        \"\\u1E4B\": 'n',\n        \"\\u1E49\": 'n',\n        \"\\u019E\": 'n',\n        \"\\u0272\": 'n',\n        \"\\u0149\": 'n',\n        \"\\uA791\": 'n',\n        \"\\uA7A5\": 'n',\n        \"\\u01CC\": 'nj',\n        \"\\u24DE\": 'o',\n        \"\\uFF4F\": 'o',\n        \"\\xF2\": 'o',\n        \"\\xF3\": 'o',\n        \"\\xF4\": 'o',\n        \"\\u1ED3\": 'o',\n        \"\\u1ED1\": 'o',\n        \"\\u1ED7\": 'o',\n        \"\\u1ED5\": 'o',\n        \"\\xF5\": 'o',\n        \"\\u1E4D\": 'o',\n        \"\\u022D\": 'o',\n        \"\\u1E4F\": 'o',\n        \"\\u014D\": 'o',\n        \"\\u1E51\": 'o',\n        \"\\u1E53\": 'o',\n        \"\\u014F\": 'o',\n        \"\\u022F\": 'o',\n        \"\\u0231\": 'o',\n        \"\\xF6\": 'o',\n        \"\\u022B\": 'o',\n        \"\\u1ECF\": 'o',\n        \"\\u0151\": 'o',\n        \"\\u01D2\": 'o',\n        \"\\u020D\": 'o',\n        \"\\u020F\": 'o',\n        \"\\u01A1\": 'o',\n        \"\\u1EDD\": 'o',\n        \"\\u1EDB\": 'o',\n        \"\\u1EE1\": 'o',\n        \"\\u1EDF\": 'o',\n        \"\\u1EE3\": 'o',\n        \"\\u1ECD\": 'o',\n        \"\\u1ED9\": 'o',\n        \"\\u01EB\": 'o',\n        \"\\u01ED\": 'o',\n        \"\\xF8\": 'o',\n        \"\\u01FF\": 'o',\n        \"\\u0254\": 'o',\n        \"\\uA74B\": 'o',\n        \"\\uA74D\": 'o',\n        \"\\u0275\": 'o',\n        \"\\u0153\": 'oe',\n        \"\\u01A3\": 'oi',\n        \"\\u0223\": 'ou',\n        \"\\uA74F\": 'oo',\n        \"\\u24DF\": 'p',\n        \"\\uFF50\": 'p',\n        \"\\u1E55\": 'p',\n        \"\\u1E57\": 'p',\n        \"\\u01A5\": 'p',\n        \"\\u1D7D\": 'p',\n        \"\\uA751\": 'p',\n        \"\\uA753\": 'p',\n        \"\\uA755\": 'p',\n        \"\\u24E0\": 'q',\n        \"\\uFF51\": 'q',\n        \"\\u024B\": 'q',\n        \"\\uA757\": 'q',\n        \"\\uA759\": 'q',\n        \"\\u24E1\": 'r',\n        \"\\uFF52\": 'r',\n        \"\\u0155\": 'r',\n        \"\\u1E59\": 'r',\n        \"\\u0159\": 'r',\n        \"\\u0211\": 'r',\n        \"\\u0213\": 'r',\n        \"\\u1E5B\": 'r',\n        \"\\u1E5D\": 'r',\n        \"\\u0157\": 'r',\n        \"\\u1E5F\": 'r',\n        \"\\u024D\": 'r',\n        \"\\u027D\": 'r',\n        \"\\uA75B\": 'r',\n        \"\\uA7A7\": 'r',\n        \"\\uA783\": 'r',\n        \"\\u24E2\": 's',\n        \"\\uFF53\": 's',\n        \"\\xDF\": 's',\n        \"\\u015B\": 's',\n        \"\\u1E65\": 's',\n        \"\\u015D\": 's',\n        \"\\u1E61\": 's',\n        \"\\u0161\": 's',\n        \"\\u1E67\": 's',\n        \"\\u1E63\": 's',\n        \"\\u1E69\": 's',\n        \"\\u0219\": 's',\n        \"\\u015F\": 's',\n        \"\\u023F\": 's',\n        \"\\uA7A9\": 's',\n        \"\\uA785\": 's',\n        \"\\u1E9B\": 's',\n        \"\\u24E3\": 't',\n        \"\\uFF54\": 't',\n        \"\\u1E6B\": 't',\n        \"\\u1E97\": 't',\n        \"\\u0165\": 't',\n        \"\\u1E6D\": 't',\n        \"\\u021B\": 't',\n        \"\\u0163\": 't',\n        \"\\u1E71\": 't',\n        \"\\u1E6F\": 't',\n        \"\\u0167\": 't',\n        \"\\u01AD\": 't',\n        \"\\u0288\": 't',\n        \"\\u2C66\": 't',\n        \"\\uA787\": 't',\n        \"\\uA729\": 'tz',\n        \"\\u24E4\": 'u',\n        \"\\uFF55\": 'u',\n        \"\\xF9\": 'u',\n        \"\\xFA\": 'u',\n        \"\\xFB\": 'u',\n        \"\\u0169\": 'u',\n        \"\\u1E79\": 'u',\n        \"\\u016B\": 'u',\n        \"\\u1E7B\": 'u',\n        \"\\u016D\": 'u',\n        \"\\xFC\": 'u',\n        \"\\u01DC\": 'u',\n        \"\\u01D8\": 'u',\n        \"\\u01D6\": 'u',\n        \"\\u01DA\": 'u',\n        \"\\u1EE7\": 'u',\n        \"\\u016F\": 'u',\n        \"\\u0171\": 'u',\n        \"\\u01D4\": 'u',\n        \"\\u0215\": 'u',\n        \"\\u0217\": 'u',\n        \"\\u01B0\": 'u',\n        \"\\u1EEB\": 'u',\n        \"\\u1EE9\": 'u',\n        \"\\u1EEF\": 'u',\n        \"\\u1EED\": 'u',\n        \"\\u1EF1\": 'u',\n        \"\\u1EE5\": 'u',\n        \"\\u1E73\": 'u',\n        \"\\u0173\": 'u',\n        \"\\u1E77\": 'u',\n        \"\\u1E75\": 'u',\n        \"\\u0289\": 'u',\n        \"\\u24E5\": 'v',\n        \"\\uFF56\": 'v',\n        \"\\u1E7D\": 'v',\n        \"\\u1E7F\": 'v',\n        \"\\u028B\": 'v',\n        \"\\uA75F\": 'v',\n        \"\\u028C\": 'v',\n        \"\\uA761\": 'vy',\n        \"\\u24E6\": 'w',\n        \"\\uFF57\": 'w',\n        \"\\u1E81\": 'w',\n        \"\\u1E83\": 'w',\n        \"\\u0175\": 'w',\n        \"\\u1E87\": 'w',\n        \"\\u1E85\": 'w',\n        \"\\u1E98\": 'w',\n        \"\\u1E89\": 'w',\n        \"\\u2C73\": 'w',\n        \"\\u24E7\": 'x',\n        \"\\uFF58\": 'x',\n        \"\\u1E8B\": 'x',\n        \"\\u1E8D\": 'x',\n        \"\\u24E8\": 'y',\n        \"\\uFF59\": 'y',\n        \"\\u1EF3\": 'y',\n        \"\\xFD\": 'y',\n        \"\\u0177\": 'y',\n        \"\\u1EF9\": 'y',\n        \"\\u0233\": 'y',\n        \"\\u1E8F\": 'y',\n        \"\\xFF\": 'y',\n        \"\\u1EF7\": 'y',\n        \"\\u1E99\": 'y',\n        \"\\u1EF5\": 'y',\n        \"\\u01B4\": 'y',\n        \"\\u024F\": 'y',\n        \"\\u1EFF\": 'y',\n        \"\\u24E9\": 'z',\n        \"\\uFF5A\": 'z',\n        \"\\u017A\": 'z',\n        \"\\u1E91\": 'z',\n        \"\\u017C\": 'z',\n        \"\\u017E\": 'z',\n        \"\\u1E93\": 'z',\n        \"\\u1E95\": 'z',\n        \"\\u01B6\": 'z',\n        \"\\u0225\": 'z',\n        \"\\u0240\": 'z',\n        \"\\u2C6C\": 'z',\n        \"\\uA763\": 'z',\n        \"\\u0386\": \"\\u0391\",\n        \"\\u0388\": \"\\u0395\",\n        \"\\u0389\": \"\\u0397\",\n        \"\\u038A\": \"\\u0399\",\n        \"\\u03AA\": \"\\u0399\",\n        \"\\u038C\": \"\\u039F\",\n        \"\\u038E\": \"\\u03A5\",\n        \"\\u03AB\": \"\\u03A5\",\n        \"\\u038F\": \"\\u03A9\",\n        \"\\u03AC\": \"\\u03B1\",\n        \"\\u03AD\": \"\\u03B5\",\n        \"\\u03AE\": \"\\u03B7\",\n        \"\\u03AF\": \"\\u03B9\",\n        \"\\u03CA\": \"\\u03B9\",\n        \"\\u0390\": \"\\u03B9\",\n        \"\\u03CC\": \"\\u03BF\",\n        \"\\u03CD\": \"\\u03C5\",\n        \"\\u03CB\": \"\\u03C5\",\n        \"\\u03B0\": \"\\u03C5\",\n        \"\\u03CE\": \"\\u03C9\",\n        \"\\u03C2\": \"\\u03C3\",\n        \"\\u2019\": '\\''\n      };\n      return diacritics;\n    });\n    S2.define('select2/data/base', ['../utils'], function (Utils) {\n      function BaseAdapter($element, options) {\n        BaseAdapter.__super__.constructor.call(this);\n      }\n\n      Utils.Extend(BaseAdapter, Utils.Observable);\n\n      BaseAdapter.prototype.current = function (callback) {\n        throw new Error('The `current` method must be defined in child classes.');\n      };\n\n      BaseAdapter.prototype.query = function (params, callback) {\n        throw new Error('The `query` method must be defined in child classes.');\n      };\n\n      BaseAdapter.prototype.bind = function (container, $container) {// Can be implemented in subclasses\n      };\n\n      BaseAdapter.prototype.destroy = function () {// Can be implemented in subclasses\n      };\n\n      BaseAdapter.prototype.generateResultId = function (container, data) {\n        var id = container.id + '-result-';\n        id += Utils.generateChars(4);\n\n        if (data.id != null) {\n          id += '-' + data.id.toString();\n        } else {\n          id += '-' + Utils.generateChars(4);\n        }\n\n        return id;\n      };\n\n      return BaseAdapter;\n    });\n    S2.define('select2/data/select', ['./base', '../utils', 'jquery'], function (BaseAdapter, Utils, $) {\n      function SelectAdapter($element, options) {\n        this.$element = $element;\n        this.options = options;\n\n        SelectAdapter.__super__.constructor.call(this);\n      }\n\n      Utils.Extend(SelectAdapter, BaseAdapter);\n\n      SelectAdapter.prototype.current = function (callback) {\n        var data = [];\n        var self = this;\n        this.$element.find(':selected').each(function () {\n          var $option = $(this);\n          var option = self.item($option);\n          data.push(option);\n        });\n        callback(data);\n      };\n\n      SelectAdapter.prototype.select = function (data) {\n        var self = this;\n        data.selected = true; // If data.element is a DOM node, use it instead\n\n        if ($(data.element).is('option')) {\n          data.element.selected = true;\n          this.$element.trigger('input').trigger('change');\n          return;\n        }\n\n        if (this.$element.prop('multiple')) {\n          this.current(function (currentData) {\n            var val = [];\n            data = [data];\n            data.push.apply(data, currentData);\n\n            for (var d = 0; d < data.length; d++) {\n              var id = data[d].id;\n\n              if ($.inArray(id, val) === -1) {\n                val.push(id);\n              }\n            }\n\n            self.$element.val(val);\n            self.$element.trigger('input').trigger('change');\n          });\n        } else {\n          var val = data.id;\n          this.$element.val(val);\n          this.$element.trigger('input').trigger('change');\n        }\n      };\n\n      SelectAdapter.prototype.unselect = function (data) {\n        var self = this;\n\n        if (!this.$element.prop('multiple')) {\n          return;\n        }\n\n        data.selected = false;\n\n        if ($(data.element).is('option')) {\n          data.element.selected = false;\n          this.$element.trigger('input').trigger('change');\n          return;\n        }\n\n        this.current(function (currentData) {\n          var val = [];\n\n          for (var d = 0; d < currentData.length; d++) {\n            var id = currentData[d].id;\n\n            if (id !== data.id && $.inArray(id, val) === -1) {\n              val.push(id);\n            }\n          }\n\n          self.$element.val(val);\n          self.$element.trigger('input').trigger('change');\n        });\n      };\n\n      SelectAdapter.prototype.bind = function (container, $container) {\n        var self = this;\n        this.container = container;\n        container.on('select', function (params) {\n          self.select(params.data);\n        });\n        container.on('unselect', function (params) {\n          self.unselect(params.data);\n        });\n      };\n\n      SelectAdapter.prototype.destroy = function () {\n        // Remove anything added to child elements\n        this.$element.find('*').each(function () {\n          // Remove any custom data set by Select2\n          Utils.RemoveData(this);\n        });\n      };\n\n      SelectAdapter.prototype.query = function (params, callback) {\n        var data = [];\n        var self = this;\n        var $options = this.$element.children();\n        $options.each(function () {\n          var $option = $(this);\n\n          if (!$option.is('option') && !$option.is('optgroup')) {\n            return;\n          }\n\n          var option = self.item($option);\n          var matches = self.matches(params, option);\n\n          if (matches !== null) {\n            data.push(matches);\n          }\n        });\n        callback({\n          results: data\n        });\n      };\n\n      SelectAdapter.prototype.addOptions = function ($options) {\n        Utils.appendMany(this.$element, $options);\n      };\n\n      SelectAdapter.prototype.option = function (data) {\n        var option;\n\n        if (data.children) {\n          option = document.createElement('optgroup');\n          option.label = data.text;\n        } else {\n          option = document.createElement('option');\n\n          if (option.textContent !== undefined) {\n            option.textContent = data.text;\n          } else {\n            option.innerText = data.text;\n          }\n        }\n\n        if (data.id !== undefined) {\n          option.value = data.id;\n        }\n\n        if (data.disabled) {\n          option.disabled = true;\n        }\n\n        if (data.selected) {\n          option.selected = true;\n        }\n\n        if (data.title) {\n          option.title = data.title;\n        }\n\n        var $option = $(option);\n\n        var normalizedData = this._normalizeItem(data);\n\n        normalizedData.element = option; // Override the option's data with the combined data\n\n        Utils.StoreData(option, 'data', normalizedData);\n        return $option;\n      };\n\n      SelectAdapter.prototype.item = function ($option) {\n        var data = {};\n        data = Utils.GetData($option[0], 'data');\n\n        if (data != null) {\n          return data;\n        }\n\n        if ($option.is('option')) {\n          data = {\n            id: $option.val(),\n            text: $option.text(),\n            disabled: $option.prop('disabled'),\n            selected: $option.prop('selected'),\n            title: $option.prop('title')\n          };\n        } else if ($option.is('optgroup')) {\n          data = {\n            text: $option.prop('label'),\n            children: [],\n            title: $option.prop('title')\n          };\n          var $children = $option.children('option');\n          var children = [];\n\n          for (var c = 0; c < $children.length; c++) {\n            var $child = $($children[c]);\n            var child = this.item($child);\n            children.push(child);\n          }\n\n          data.children = children;\n        }\n\n        data = this._normalizeItem(data);\n        data.element = $option[0];\n        Utils.StoreData($option[0], 'data', data);\n        return data;\n      };\n\n      SelectAdapter.prototype._normalizeItem = function (item) {\n        if (item !== Object(item)) {\n          item = {\n            id: item,\n            text: item\n          };\n        }\n\n        item = $.extend({}, {\n          text: ''\n        }, item);\n        var defaults = {\n          selected: false,\n          disabled: false\n        };\n\n        if (item.id != null) {\n          item.id = item.id.toString();\n        }\n\n        if (item.text != null) {\n          item.text = item.text.toString();\n        }\n\n        if (item._resultId == null && item.id && this.container != null) {\n          item._resultId = this.generateResultId(this.container, item);\n        }\n\n        return $.extend({}, defaults, item);\n      };\n\n      SelectAdapter.prototype.matches = function (params, data) {\n        var matcher = this.options.get('matcher');\n        return matcher(params, data);\n      };\n\n      return SelectAdapter;\n    });\n    S2.define('select2/data/array', ['./select', '../utils', 'jquery'], function (SelectAdapter, Utils, $) {\n      function ArrayAdapter($element, options) {\n        this._dataToConvert = options.get('data') || [];\n\n        ArrayAdapter.__super__.constructor.call(this, $element, options);\n      }\n\n      Utils.Extend(ArrayAdapter, SelectAdapter);\n\n      ArrayAdapter.prototype.bind = function (container, $container) {\n        ArrayAdapter.__super__.bind.call(this, container, $container);\n\n        this.addOptions(this.convertToOptions(this._dataToConvert));\n      };\n\n      ArrayAdapter.prototype.select = function (data) {\n        var $option = this.$element.find('option').filter(function (i, elm) {\n          return elm.value == data.id.toString();\n        });\n\n        if ($option.length === 0) {\n          $option = this.option(data);\n          this.addOptions($option);\n        }\n\n        ArrayAdapter.__super__.select.call(this, data);\n      };\n\n      ArrayAdapter.prototype.convertToOptions = function (data) {\n        var self = this;\n        var $existing = this.$element.find('option');\n        var existingIds = $existing.map(function () {\n          return self.item($(this)).id;\n        }).get();\n        var $options = []; // Filter out all items except for the one passed in the argument\n\n        function onlyItem(item) {\n          return function () {\n            return $(this).val() == item.id;\n          };\n        }\n\n        for (var d = 0; d < data.length; d++) {\n          var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data\n\n\n          if ($.inArray(item.id, existingIds) >= 0) {\n            var $existingOption = $existing.filter(onlyItem(item));\n            var existingData = this.item($existingOption);\n            var newData = $.extend(true, {}, item, existingData);\n            var $newOption = this.option(newData);\n            $existingOption.replaceWith($newOption);\n            continue;\n          }\n\n          var $option = this.option(item);\n\n          if (item.children) {\n            var $children = this.convertToOptions(item.children);\n            Utils.appendMany($option, $children);\n          }\n\n          $options.push($option);\n        }\n\n        return $options;\n      };\n\n      return ArrayAdapter;\n    });\n    S2.define('select2/data/ajax', ['./array', '../utils', 'jquery'], function (ArrayAdapter, Utils, $) {\n      function AjaxAdapter($element, options) {\n        this.ajaxOptions = this._applyDefaults(options.get('ajax'));\n\n        if (this.ajaxOptions.processResults != null) {\n          this.processResults = this.ajaxOptions.processResults;\n        }\n\n        AjaxAdapter.__super__.constructor.call(this, $element, options);\n      }\n\n      Utils.Extend(AjaxAdapter, ArrayAdapter);\n\n      AjaxAdapter.prototype._applyDefaults = function (options) {\n        var defaults = {\n          data: function data(params) {\n            return $.extend({}, params, {\n              q: params.term\n            });\n          },\n          transport: function transport(params, success, failure) {\n            var $request = $.ajax(params);\n            $request.then(success);\n            $request.fail(failure);\n            return $request;\n          }\n        };\n        return $.extend({}, defaults, options, true);\n      };\n\n      AjaxAdapter.prototype.processResults = function (results) {\n        return results;\n      };\n\n      AjaxAdapter.prototype.query = function (params, callback) {\n        var matches = [];\n        var self = this;\n\n        if (this._request != null) {\n          // JSONP requests cannot always be aborted\n          if ($.isFunction(this._request.abort)) {\n            this._request.abort();\n          }\n\n          this._request = null;\n        }\n\n        var options = $.extend({\n          type: 'GET'\n        }, this.ajaxOptions);\n\n        if (typeof options.url === 'function') {\n          options.url = options.url.call(this.$element, params);\n        }\n\n        if (typeof options.data === 'function') {\n          options.data = options.data.call(this.$element, params);\n        }\n\n        function request() {\n          var $request = options.transport(options, function (data) {\n            var results = self.processResults(data, params);\n\n            if (self.options.get('debug') && window.console && console.error) {\n              // Check to make sure that the response included a `results` key.\n              if (!results || !results.results || !$.isArray(results.results)) {\n                console.error('Select2: The AJAX results did not return an array in the ' + '`results` key of the response.');\n              }\n            }\n\n            callback(results);\n          }, function () {\n            // Attempt to detect if a request was aborted\n            // Only works if the transport exposes a status property\n            if ('status' in $request && ($request.status === 0 || $request.status === '0')) {\n              return;\n            }\n\n            self.trigger('results:message', {\n              message: 'errorLoading'\n            });\n          });\n          self._request = $request;\n        }\n\n        if (this.ajaxOptions.delay && params.term != null) {\n          if (this._queryTimeout) {\n            window.clearTimeout(this._queryTimeout);\n          }\n\n          this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n        } else {\n          request();\n        }\n      };\n\n      return AjaxAdapter;\n    });\n    S2.define('select2/data/tags', ['jquery'], function ($) {\n      function Tags(decorated, $element, options) {\n        var tags = options.get('tags');\n        var createTag = options.get('createTag');\n\n        if (createTag !== undefined) {\n          this.createTag = createTag;\n        }\n\n        var insertTag = options.get('insertTag');\n\n        if (insertTag !== undefined) {\n          this.insertTag = insertTag;\n        }\n\n        decorated.call(this, $element, options);\n\n        if ($.isArray(tags)) {\n          for (var t = 0; t < tags.length; t++) {\n            var tag = tags[t];\n\n            var item = this._normalizeItem(tag);\n\n            var $option = this.option(item);\n            this.$element.append($option);\n          }\n        }\n      }\n\n      Tags.prototype.query = function (decorated, params, callback) {\n        var self = this;\n\n        this._removeOldTags();\n\n        if (params.term == null || params.page != null) {\n          decorated.call(this, params, callback);\n          return;\n        }\n\n        function wrapper(obj, child) {\n          var data = obj.results;\n\n          for (var i = 0; i < data.length; i++) {\n            var option = data[i];\n            var checkChildren = option.children != null && !wrapper({\n              results: option.children\n            }, true);\n            var optionText = (option.text || '').toUpperCase();\n            var paramsTerm = (params.term || '').toUpperCase();\n            var checkText = optionText === paramsTerm;\n\n            if (checkText || checkChildren) {\n              if (child) {\n                return false;\n              }\n\n              obj.data = data;\n              callback(obj);\n              return;\n            }\n          }\n\n          if (child) {\n            return true;\n          }\n\n          var tag = self.createTag(params);\n\n          if (tag != null) {\n            var $option = self.option(tag);\n            $option.attr('data-select2-tag', true);\n            self.addOptions([$option]);\n            self.insertTag(data, tag);\n          }\n\n          obj.results = data;\n          callback(obj);\n        }\n\n        decorated.call(this, params, wrapper);\n      };\n\n      Tags.prototype.createTag = function (decorated, params) {\n        var term = $.trim(params.term);\n\n        if (term === '') {\n          return null;\n        }\n\n        return {\n          id: term,\n          text: term\n        };\n      };\n\n      Tags.prototype.insertTag = function (_, data, tag) {\n        data.unshift(tag);\n      };\n\n      Tags.prototype._removeOldTags = function (_) {\n        var $options = this.$element.find('option[data-select2-tag]');\n        $options.each(function () {\n          if (this.selected) {\n            return;\n          }\n\n          $(this).remove();\n        });\n      };\n\n      return Tags;\n    });\n    S2.define('select2/data/tokenizer', ['jquery'], function ($) {\n      function Tokenizer(decorated, $element, options) {\n        var tokenizer = options.get('tokenizer');\n\n        if (tokenizer !== undefined) {\n          this.tokenizer = tokenizer;\n        }\n\n        decorated.call(this, $element, options);\n      }\n\n      Tokenizer.prototype.bind = function (decorated, container, $container) {\n        decorated.call(this, container, $container);\n        this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field');\n      };\n\n      Tokenizer.prototype.query = function (decorated, params, callback) {\n        var self = this;\n\n        function createAndSelect(data) {\n          // Normalize the data object so we can use it for checks\n          var item = self._normalizeItem(data); // Check if the data object already exists as a tag\n          // Select it if it doesn't\n\n\n          var $existingOptions = self.$element.find('option').filter(function () {\n            return $(this).val() === item.id;\n          }); // If an existing option wasn't found for it, create the option\n\n          if (!$existingOptions.length) {\n            var $option = self.option(item);\n            $option.attr('data-select2-tag', true);\n\n            self._removeOldTags();\n\n            self.addOptions([$option]);\n          } // Select the item, now that we know there is an option for it\n\n\n          select(item);\n        }\n\n        function select(data) {\n          self.trigger('select', {\n            data: data\n          });\n        }\n\n        params.term = params.term || '';\n        var tokenData = this.tokenizer(params, this.options, createAndSelect);\n\n        if (tokenData.term !== params.term) {\n          // Replace the search term if we have the search box\n          if (this.$search.length) {\n            this.$search.val(tokenData.term);\n            this.$search.trigger('focus');\n          }\n\n          params.term = tokenData.term;\n        }\n\n        decorated.call(this, params, callback);\n      };\n\n      Tokenizer.prototype.tokenizer = function (_, params, options, callback) {\n        var separators = options.get('tokenSeparators') || [];\n        var term = params.term;\n        var i = 0;\n\n        var createTag = this.createTag || function (params) {\n          return {\n            id: params.term,\n            text: params.term\n          };\n        };\n\n        while (i < term.length) {\n          var termChar = term[i];\n\n          if ($.inArray(termChar, separators) === -1) {\n            i++;\n            continue;\n          }\n\n          var part = term.substr(0, i);\n          var partParams = $.extend({}, params, {\n            term: part\n          });\n          var data = createTag(partParams);\n\n          if (data == null) {\n            i++;\n            continue;\n          }\n\n          callback(data); // Reset the term to not include the tokenized portion\n\n          term = term.substr(i + 1) || '';\n          i = 0;\n        }\n\n        return {\n          term: term\n        };\n      };\n\n      return Tokenizer;\n    });\n    S2.define('select2/data/minimumInputLength', [], function () {\n      function MinimumInputLength(decorated, $e, options) {\n        this.minimumInputLength = options.get('minimumInputLength');\n        decorated.call(this, $e, options);\n      }\n\n      MinimumInputLength.prototype.query = function (decorated, params, callback) {\n        params.term = params.term || '';\n\n        if (params.term.length < this.minimumInputLength) {\n          this.trigger('results:message', {\n            message: 'inputTooShort',\n            args: {\n              minimum: this.minimumInputLength,\n              input: params.term,\n              params: params\n            }\n          });\n          return;\n        }\n\n        decorated.call(this, params, callback);\n      };\n\n      return MinimumInputLength;\n    });\n    S2.define('select2/data/maximumInputLength', [], function () {\n      function MaximumInputLength(decorated, $e, options) {\n        this.maximumInputLength = options.get('maximumInputLength');\n        decorated.call(this, $e, options);\n      }\n\n      MaximumInputLength.prototype.query = function (decorated, params, callback) {\n        params.term = params.term || '';\n\n        if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) {\n          this.trigger('results:message', {\n            message: 'inputTooLong',\n            args: {\n              maximum: this.maximumInputLength,\n              input: params.term,\n              params: params\n            }\n          });\n          return;\n        }\n\n        decorated.call(this, params, callback);\n      };\n\n      return MaximumInputLength;\n    });\n    S2.define('select2/data/maximumSelectionLength', [], function () {\n      function MaximumSelectionLength(decorated, $e, options) {\n        this.maximumSelectionLength = options.get('maximumSelectionLength');\n        decorated.call(this, $e, options);\n      }\n\n      MaximumSelectionLength.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        decorated.call(this, container, $container);\n        container.on('select', function () {\n          self._checkIfMaximumSelected();\n        });\n      };\n\n      MaximumSelectionLength.prototype.query = function (decorated, params, callback) {\n        var self = this;\n\n        this._checkIfMaximumSelected(function () {\n          decorated.call(self, params, callback);\n        });\n      };\n\n      MaximumSelectionLength.prototype._checkIfMaximumSelected = function (_, successCallback) {\n        var self = this;\n        this.current(function (currentData) {\n          var count = currentData != null ? currentData.length : 0;\n\n          if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) {\n            self.trigger('results:message', {\n              message: 'maximumSelected',\n              args: {\n                maximum: self.maximumSelectionLength\n              }\n            });\n            return;\n          }\n\n          if (successCallback) {\n            successCallback();\n          }\n        });\n      };\n\n      return MaximumSelectionLength;\n    });\n    S2.define('select2/dropdown', ['jquery', './utils'], function ($, Utils) {\n      function Dropdown($element, options) {\n        this.$element = $element;\n        this.options = options;\n\n        Dropdown.__super__.constructor.call(this);\n      }\n\n      Utils.Extend(Dropdown, Utils.Observable);\n\n      Dropdown.prototype.render = function () {\n        var $dropdown = $('<span class=\"select2-dropdown\">' + '<span class=\"select2-results\"></span>' + '</span>');\n        $dropdown.attr('dir', this.options.get('dir'));\n        this.$dropdown = $dropdown;\n        return $dropdown;\n      };\n\n      Dropdown.prototype.bind = function () {// Should be implemented in subclasses\n      };\n\n      Dropdown.prototype.position = function ($dropdown, $container) {// Should be implemented in subclasses\n      };\n\n      Dropdown.prototype.destroy = function () {\n        // Remove the dropdown from the DOM\n        this.$dropdown.remove();\n      };\n\n      return Dropdown;\n    });\n    S2.define('select2/dropdown/search', ['jquery', '../utils'], function ($, Utils) {\n      function Search() {}\n\n      Search.prototype.render = function (decorated) {\n        var $rendered = decorated.call(this);\n        var $search = $('<span class=\"select2-search select2-search--dropdown\">' + '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' + ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"none\"' + ' spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" />' + '</span>');\n        this.$searchContainer = $search;\n        this.$search = $search.find('input');\n        $rendered.prepend($search);\n        return $rendered;\n      };\n\n      Search.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        var resultsId = container.id + '-results';\n        decorated.call(this, container, $container);\n        this.$search.on('keydown', function (evt) {\n          self.trigger('keypress', evt);\n          self._keyUpPrevented = evt.isDefaultPrevented();\n        }); // Workaround for browsers which do not support the `input` event\n        // This will prevent double-triggering of events for browsers which support\n        // both the `keyup` and `input` events.\n\n        this.$search.on('input', function (evt) {\n          // Unbind the duplicated `keyup` event\n          $(this).off('keyup');\n        });\n        this.$search.on('keyup input', function (evt) {\n          self.handleSearch(evt);\n        });\n        container.on('open', function () {\n          self.$search.attr('tabindex', 0);\n          self.$search.attr('aria-controls', resultsId);\n          self.$search.trigger('focus');\n          window.setTimeout(function () {\n            self.$search.trigger('focus');\n          }, 0);\n        });\n        container.on('close', function () {\n          self.$search.attr('tabindex', -1);\n          self.$search.removeAttr('aria-controls');\n          self.$search.removeAttr('aria-activedescendant');\n          self.$search.val('');\n          self.$search.trigger('blur');\n        });\n        container.on('focus', function () {\n          if (!container.isOpen()) {\n            self.$search.trigger('focus');\n          }\n        });\n        container.on('results:all', function (params) {\n          if (params.query.term == null || params.query.term === '') {\n            var showSearch = self.showSearch(params);\n\n            if (showSearch) {\n              self.$searchContainer.removeClass('select2-search--hide');\n            } else {\n              self.$searchContainer.addClass('select2-search--hide');\n            }\n          }\n        });\n        container.on('results:focus', function (params) {\n          if (params.data._resultId) {\n            self.$search.attr('aria-activedescendant', params.data._resultId);\n          } else {\n            self.$search.removeAttr('aria-activedescendant');\n          }\n        });\n      };\n\n      Search.prototype.handleSearch = function (evt) {\n        if (!this._keyUpPrevented) {\n          var input = this.$search.val();\n          this.trigger('query', {\n            term: input\n          });\n        }\n\n        this._keyUpPrevented = false;\n      };\n\n      Search.prototype.showSearch = function (_, params) {\n        return true;\n      };\n\n      return Search;\n    });\n    S2.define('select2/dropdown/hidePlaceholder', [], function () {\n      function HidePlaceholder(decorated, $element, options, dataAdapter) {\n        this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n        decorated.call(this, $element, options, dataAdapter);\n      }\n\n      HidePlaceholder.prototype.append = function (decorated, data) {\n        data.results = this.removePlaceholder(data.results);\n        decorated.call(this, data);\n      };\n\n      HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {\n        if (typeof placeholder === 'string') {\n          placeholder = {\n            id: '',\n            text: placeholder\n          };\n        }\n\n        return placeholder;\n      };\n\n      HidePlaceholder.prototype.removePlaceholder = function (_, data) {\n        var modifiedData = data.slice(0);\n\n        for (var d = data.length - 1; d >= 0; d--) {\n          var item = data[d];\n\n          if (this.placeholder.id === item.id) {\n            modifiedData.splice(d, 1);\n          }\n        }\n\n        return modifiedData;\n      };\n\n      return HidePlaceholder;\n    });\n    S2.define('select2/dropdown/infiniteScroll', ['jquery'], function ($) {\n      function InfiniteScroll(decorated, $element, options, dataAdapter) {\n        this.lastParams = {};\n        decorated.call(this, $element, options, dataAdapter);\n        this.$loadingMore = this.createLoadingMore();\n        this.loading = false;\n      }\n\n      InfiniteScroll.prototype.append = function (decorated, data) {\n        this.$loadingMore.remove();\n        this.loading = false;\n        decorated.call(this, data);\n\n        if (this.showLoadingMore(data)) {\n          this.$results.append(this.$loadingMore);\n          this.loadMoreIfNeeded();\n        }\n      };\n\n      InfiniteScroll.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        decorated.call(this, container, $container);\n        container.on('query', function (params) {\n          self.lastParams = params;\n          self.loading = true;\n        });\n        container.on('query:append', function (params) {\n          self.lastParams = params;\n          self.loading = true;\n        });\n        this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));\n      };\n\n      InfiniteScroll.prototype.loadMoreIfNeeded = function () {\n        var isLoadMoreVisible = $.contains(document.documentElement, this.$loadingMore[0]);\n\n        if (this.loading || !isLoadMoreVisible) {\n          return;\n        }\n\n        var currentOffset = this.$results.offset().top + this.$results.outerHeight(false);\n        var loadingMoreOffset = this.$loadingMore.offset().top + this.$loadingMore.outerHeight(false);\n\n        if (currentOffset + 50 >= loadingMoreOffset) {\n          this.loadMore();\n        }\n      };\n\n      InfiniteScroll.prototype.loadMore = function () {\n        this.loading = true;\n        var params = $.extend({}, {\n          page: 1\n        }, this.lastParams);\n        params.page++;\n        this.trigger('query:append', params);\n      };\n\n      InfiniteScroll.prototype.showLoadingMore = function (_, data) {\n        return data.pagination && data.pagination.more;\n      };\n\n      InfiniteScroll.prototype.createLoadingMore = function () {\n        var $option = $('<li ' + 'class=\"select2-results__option select2-results__option--load-more\"' + 'role=\"option\" aria-disabled=\"true\"></li>');\n        var message = this.options.get('translations').get('loadingMore');\n        $option.html(message(this.lastParams));\n        return $option;\n      };\n\n      return InfiniteScroll;\n    });\n    S2.define('select2/dropdown/attachBody', ['jquery', '../utils'], function ($, Utils) {\n      function AttachBody(decorated, $element, options) {\n        this.$dropdownParent = $(options.get('dropdownParent') || document.body);\n        decorated.call(this, $element, options);\n      }\n\n      AttachBody.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        decorated.call(this, container, $container);\n        container.on('open', function () {\n          self._showDropdown();\n\n          self._attachPositioningHandler(container); // Must bind after the results handlers to ensure correct sizing\n\n\n          self._bindContainerResultHandlers(container);\n        });\n        container.on('close', function () {\n          self._hideDropdown();\n\n          self._detachPositioningHandler(container);\n        });\n        this.$dropdownContainer.on('mousedown', function (evt) {\n          evt.stopPropagation();\n        });\n      };\n\n      AttachBody.prototype.destroy = function (decorated) {\n        decorated.call(this);\n        this.$dropdownContainer.remove();\n      };\n\n      AttachBody.prototype.position = function (decorated, $dropdown, $container) {\n        // Clone all of the container classes\n        $dropdown.attr('class', $container.attr('class'));\n        $dropdown.removeClass('select2');\n        $dropdown.addClass('select2-container--open');\n        $dropdown.css({\n          position: 'absolute',\n          top: -999999\n        });\n        this.$container = $container;\n      };\n\n      AttachBody.prototype.render = function (decorated) {\n        var $container = $('<span></span>');\n        var $dropdown = decorated.call(this);\n        $container.append($dropdown);\n        this.$dropdownContainer = $container;\n        return $container;\n      };\n\n      AttachBody.prototype._hideDropdown = function (decorated) {\n        this.$dropdownContainer.detach();\n      };\n\n      AttachBody.prototype._bindContainerResultHandlers = function (decorated, container) {\n        // These should only be bound once\n        if (this._containerResultsHandlersBound) {\n          return;\n        }\n\n        var self = this;\n        container.on('results:all', function () {\n          self._positionDropdown();\n\n          self._resizeDropdown();\n        });\n        container.on('results:append', function () {\n          self._positionDropdown();\n\n          self._resizeDropdown();\n        });\n        container.on('results:message', function () {\n          self._positionDropdown();\n\n          self._resizeDropdown();\n        });\n        container.on('select', function () {\n          self._positionDropdown();\n\n          self._resizeDropdown();\n        });\n        container.on('unselect', function () {\n          self._positionDropdown();\n\n          self._resizeDropdown();\n        });\n        this._containerResultsHandlersBound = true;\n      };\n\n      AttachBody.prototype._attachPositioningHandler = function (decorated, container) {\n        var self = this;\n        var scrollEvent = 'scroll.select2.' + container.id;\n        var resizeEvent = 'resize.select2.' + container.id;\n        var orientationEvent = 'orientationchange.select2.' + container.id;\n        var $watchers = this.$container.parents().filter(Utils.hasScroll);\n        $watchers.each(function () {\n          Utils.StoreData(this, 'select2-scroll-position', {\n            x: $(this).scrollLeft(),\n            y: $(this).scrollTop()\n          });\n        });\n        $watchers.on(scrollEvent, function (ev) {\n          var position = Utils.GetData(this, 'select2-scroll-position');\n          $(this).scrollTop(position.y);\n        });\n        $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) {\n          self._positionDropdown();\n\n          self._resizeDropdown();\n        });\n      };\n\n      AttachBody.prototype._detachPositioningHandler = function (decorated, container) {\n        var scrollEvent = 'scroll.select2.' + container.id;\n        var resizeEvent = 'resize.select2.' + container.id;\n        var orientationEvent = 'orientationchange.select2.' + container.id;\n        var $watchers = this.$container.parents().filter(Utils.hasScroll);\n        $watchers.off(scrollEvent);\n        $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);\n      };\n\n      AttachBody.prototype._positionDropdown = function () {\n        var $window = $(window);\n        var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');\n        var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');\n        var newDirection = null;\n        var offset = this.$container.offset();\n        offset.bottom = offset.top + this.$container.outerHeight(false);\n        var container = {\n          height: this.$container.outerHeight(false)\n        };\n        container.top = offset.top;\n        container.bottom = offset.top + container.height;\n        var dropdown = {\n          height: this.$dropdown.outerHeight(false)\n        };\n        var viewport = {\n          top: $window.scrollTop(),\n          bottom: $window.scrollTop() + $window.height()\n        };\n        var enoughRoomAbove = viewport.top < offset.top - dropdown.height;\n        var enoughRoomBelow = viewport.bottom > offset.bottom + dropdown.height;\n        var css = {\n          left: offset.left,\n          top: container.bottom\n        }; // Determine what the parent element is to use for calculating the offset\n\n        var $offsetParent = this.$dropdownParent; // For statically positioned elements, we need to get the element\n        // that is determining the offset\n\n        if ($offsetParent.css('position') === 'static') {\n          $offsetParent = $offsetParent.offsetParent();\n        }\n\n        var parentOffset = {\n          top: 0,\n          left: 0\n        };\n\n        if ($.contains(document.body, $offsetParent[0]) || $offsetParent[0].isConnected) {\n          parentOffset = $offsetParent.offset();\n        }\n\n        css.top -= parentOffset.top;\n        css.left -= parentOffset.left;\n\n        if (!isCurrentlyAbove && !isCurrentlyBelow) {\n          newDirection = 'below';\n        }\n\n        if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n          newDirection = 'above';\n        } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n          newDirection = 'below';\n        }\n\n        if (newDirection == 'above' || isCurrentlyAbove && newDirection !== 'below') {\n          css.top = container.top - parentOffset.top - dropdown.height;\n        }\n\n        if (newDirection != null) {\n          this.$dropdown.removeClass('select2-dropdown--below select2-dropdown--above').addClass('select2-dropdown--' + newDirection);\n          this.$container.removeClass('select2-container--below select2-container--above').addClass('select2-container--' + newDirection);\n        }\n\n        this.$dropdownContainer.css(css);\n      };\n\n      AttachBody.prototype._resizeDropdown = function () {\n        var css = {\n          width: this.$container.outerWidth(false) + 'px'\n        };\n\n        if (this.options.get('dropdownAutoWidth')) {\n          css.minWidth = css.width;\n          css.position = 'relative';\n          css.width = 'auto';\n        }\n\n        this.$dropdown.css(css);\n      };\n\n      AttachBody.prototype._showDropdown = function (decorated) {\n        this.$dropdownContainer.appendTo(this.$dropdownParent);\n\n        this._positionDropdown();\n\n        this._resizeDropdown();\n      };\n\n      return AttachBody;\n    });\n    S2.define('select2/dropdown/minimumResultsForSearch', [], function () {\n      function countResults(data) {\n        var count = 0;\n\n        for (var d = 0; d < data.length; d++) {\n          var item = data[d];\n\n          if (item.children) {\n            count += countResults(item.children);\n          } else {\n            count++;\n          }\n        }\n\n        return count;\n      }\n\n      function MinimumResultsForSearch(decorated, $element, options, dataAdapter) {\n        this.minimumResultsForSearch = options.get('minimumResultsForSearch');\n\n        if (this.minimumResultsForSearch < 0) {\n          this.minimumResultsForSearch = Infinity;\n        }\n\n        decorated.call(this, $element, options, dataAdapter);\n      }\n\n      MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {\n        if (countResults(params.data.results) < this.minimumResultsForSearch) {\n          return false;\n        }\n\n        return decorated.call(this, params);\n      };\n\n      return MinimumResultsForSearch;\n    });\n    S2.define('select2/dropdown/selectOnClose', ['../utils'], function (Utils) {\n      function SelectOnClose() {}\n\n      SelectOnClose.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        decorated.call(this, container, $container);\n        container.on('close', function (params) {\n          self._handleSelectOnClose(params);\n        });\n      };\n\n      SelectOnClose.prototype._handleSelectOnClose = function (_, params) {\n        if (params && params.originalSelect2Event != null) {\n          var event = params.originalSelect2Event; // Don't select an item if the close event was triggered from a select or\n          // unselect event\n\n          if (event._type === 'select' || event._type === 'unselect') {\n            return;\n          }\n        }\n\n        var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results\n\n        if ($highlightedResults.length < 1) {\n          return;\n        }\n\n        var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte\n\n        if (data.element != null && data.element.selected || data.element == null && data.selected) {\n          return;\n        }\n\n        this.trigger('select', {\n          data: data\n        });\n      };\n\n      return SelectOnClose;\n    });\n    S2.define('select2/dropdown/closeOnSelect', [], function () {\n      function CloseOnSelect() {}\n\n      CloseOnSelect.prototype.bind = function (decorated, container, $container) {\n        var self = this;\n        decorated.call(this, container, $container);\n        container.on('select', function (evt) {\n          self._selectTriggered(evt);\n        });\n        container.on('unselect', function (evt) {\n          self._selectTriggered(evt);\n        });\n      };\n\n      CloseOnSelect.prototype._selectTriggered = function (_, evt) {\n        var originalEvent = evt.originalEvent; // Don't close if the control key is being held\n\n        if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {\n          return;\n        }\n\n        this.trigger('close', {\n          originalEvent: originalEvent,\n          originalSelect2Event: evt\n        });\n      };\n\n      return CloseOnSelect;\n    });\n    S2.define('select2/i18n/en', [], function () {\n      // English\n      return {\n        errorLoading: function errorLoading() {\n          return 'The results could not be loaded.';\n        },\n        inputTooLong: function inputTooLong(args) {\n          var overChars = args.input.length - args.maximum;\n          var message = 'Please delete ' + overChars + ' character';\n\n          if (overChars != 1) {\n            message += 's';\n          }\n\n          return message;\n        },\n        inputTooShort: function inputTooShort(args) {\n          var remainingChars = args.minimum - args.input.length;\n          var message = 'Please enter ' + remainingChars + ' or more characters';\n          return message;\n        },\n        loadingMore: function loadingMore() {\n          return 'Loading more results…';\n        },\n        maximumSelected: function maximumSelected(args) {\n          var message = 'You can only select ' + args.maximum + ' item';\n\n          if (args.maximum != 1) {\n            message += 's';\n          }\n\n          return message;\n        },\n        noResults: function noResults() {\n          return 'No results found';\n        },\n        searching: function searching() {\n          return 'Searching…';\n        },\n        removeAllItems: function removeAllItems() {\n          return 'Remove all items';\n        }\n      };\n    });\n    S2.define('select2/defaults', ['jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en'], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) {\n      function Defaults() {\n        this.reset();\n      }\n\n      Defaults.prototype.apply = function (options) {\n        options = $.extend(true, {}, this.defaults, options);\n\n        if (options.dataAdapter == null) {\n          if (options.ajax != null) {\n            options.dataAdapter = AjaxData;\n          } else if (options.data != null) {\n            options.dataAdapter = ArrayData;\n          } else {\n            options.dataAdapter = SelectData;\n          }\n\n          if (options.minimumInputLength > 0) {\n            options.dataAdapter = Utils.Decorate(options.dataAdapter, MinimumInputLength);\n          }\n\n          if (options.maximumInputLength > 0) {\n            options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumInputLength);\n          }\n\n          if (options.maximumSelectionLength > 0) {\n            options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumSelectionLength);\n          }\n\n          if (options.tags) {\n            options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n          }\n\n          if (options.tokenSeparators != null || options.tokenizer != null) {\n            options.dataAdapter = Utils.Decorate(options.dataAdapter, Tokenizer);\n          }\n\n          if (options.query != null) {\n            var Query = require(options.amdBase + 'compat/query');\n\n            options.dataAdapter = Utils.Decorate(options.dataAdapter, Query);\n          }\n\n          if (options.initSelection != null) {\n            var InitSelection = require(options.amdBase + 'compat/initSelection');\n\n            options.dataAdapter = Utils.Decorate(options.dataAdapter, InitSelection);\n          }\n        }\n\n        if (options.resultsAdapter == null) {\n          options.resultsAdapter = ResultsList;\n\n          if (options.ajax != null) {\n            options.resultsAdapter = Utils.Decorate(options.resultsAdapter, InfiniteScroll);\n          }\n\n          if (options.placeholder != null) {\n            options.resultsAdapter = Utils.Decorate(options.resultsAdapter, HidePlaceholder);\n          }\n\n          if (options.selectOnClose) {\n            options.resultsAdapter = Utils.Decorate(options.resultsAdapter, SelectOnClose);\n          }\n        }\n\n        if (options.dropdownAdapter == null) {\n          if (options.multiple) {\n            options.dropdownAdapter = Dropdown;\n          } else {\n            var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n            options.dropdownAdapter = SearchableDropdown;\n          }\n\n          if (options.minimumResultsForSearch !== 0) {\n            options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, MinimumResultsForSearch);\n          }\n\n          if (options.closeOnSelect) {\n            options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, CloseOnSelect);\n          }\n\n          if (options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null) {\n            var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');\n\n            options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, DropdownCSS);\n          }\n\n          options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, AttachBody);\n        }\n\n        if (options.selectionAdapter == null) {\n          if (options.multiple) {\n            options.selectionAdapter = MultipleSelection;\n          } else {\n            options.selectionAdapter = SingleSelection;\n          } // Add the placeholder mixin if a placeholder was specified\n\n\n          if (options.placeholder != null) {\n            options.selectionAdapter = Utils.Decorate(options.selectionAdapter, Placeholder);\n          }\n\n          if (options.allowClear) {\n            options.selectionAdapter = Utils.Decorate(options.selectionAdapter, AllowClear);\n          }\n\n          if (options.multiple) {\n            options.selectionAdapter = Utils.Decorate(options.selectionAdapter, SelectionSearch);\n          }\n\n          if (options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null) {\n            var ContainerCSS = require(options.amdBase + 'compat/containerCss');\n\n            options.selectionAdapter = Utils.Decorate(options.selectionAdapter, ContainerCSS);\n          }\n\n          options.selectionAdapter = Utils.Decorate(options.selectionAdapter, EventRelay);\n        } // If the defaults were not previously applied from an element, it is\n        // possible for the language option to have not been resolved\n\n\n        options.language = this._resolveLanguage(options.language); // Always fall back to English since it will always be complete\n\n        options.language.push('en');\n        var uniqueLanguages = [];\n\n        for (var l = 0; l < options.language.length; l++) {\n          var language = options.language[l];\n\n          if (uniqueLanguages.indexOf(language) === -1) {\n            uniqueLanguages.push(language);\n          }\n        }\n\n        options.language = uniqueLanguages;\n        options.translations = this._processTranslations(options.language, options.debug);\n        return options;\n      };\n\n      Defaults.prototype.reset = function () {\n        function stripDiacritics(text) {\n          // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n          function match(a) {\n            return DIACRITICS[a] || a;\n          }\n\n          return text.replace(/[^\\u0000-\\u007E]/g, match);\n        }\n\n        function matcher(params, data) {\n          // Always return the object if there is nothing to compare\n          if ($.trim(params.term) === '') {\n            return data;\n          } // Do a recursive check for options with children\n\n\n          if (data.children && data.children.length > 0) {\n            // Clone the data object if there are children\n            // This is required as we modify the object to remove any non-matches\n            var match = $.extend(true, {}, data); // Check each child of the option\n\n            for (var c = data.children.length - 1; c >= 0; c--) {\n              var child = data.children[c];\n              var matches = matcher(params, child); // If there wasn't a match, remove the object in the array\n\n              if (matches == null) {\n                match.children.splice(c, 1);\n              }\n            } // If any children matched, return the new object\n\n\n            if (match.children.length > 0) {\n              return match;\n            } // If there were no matching children, check just the plain object\n\n\n            return matcher(params, match);\n          }\n\n          var original = stripDiacritics(data.text).toUpperCase();\n          var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term\n\n          if (original.indexOf(term) > -1) {\n            return data;\n          } // If it doesn't contain the term, don't return anything\n\n\n          return null;\n        }\n\n        this.defaults = {\n          amdBase: './',\n          amdLanguageBase: './i18n/',\n          closeOnSelect: true,\n          debug: false,\n          dropdownAutoWidth: false,\n          escapeMarkup: Utils.escapeMarkup,\n          language: {},\n          matcher: matcher,\n          minimumInputLength: 0,\n          maximumInputLength: 0,\n          maximumSelectionLength: 0,\n          minimumResultsForSearch: 0,\n          selectOnClose: false,\n          scrollAfterSelect: false,\n          sorter: function sorter(data) {\n            return data;\n          },\n          templateResult: function templateResult(result) {\n            return result.text;\n          },\n          templateSelection: function templateSelection(selection) {\n            return selection.text;\n          },\n          theme: 'default',\n          width: 'resolve'\n        };\n      };\n\n      Defaults.prototype.applyFromElement = function (options, $element) {\n        var optionLanguage = options.language;\n        var defaultLanguage = this.defaults.language;\n        var elementLanguage = $element.prop('lang');\n        var parentLanguage = $element.closest('[lang]').prop('lang');\n        var languages = Array.prototype.concat.call(this._resolveLanguage(elementLanguage), this._resolveLanguage(optionLanguage), this._resolveLanguage(defaultLanguage), this._resolveLanguage(parentLanguage));\n        options.language = languages;\n        return options;\n      };\n\n      Defaults.prototype._resolveLanguage = function (language) {\n        if (!language) {\n          return [];\n        }\n\n        if ($.isEmptyObject(language)) {\n          return [];\n        }\n\n        if ($.isPlainObject(language)) {\n          return [language];\n        }\n\n        var languages;\n\n        if (!$.isArray(language)) {\n          languages = [language];\n        } else {\n          languages = language;\n        }\n\n        var resolvedLanguages = [];\n\n        for (var l = 0; l < languages.length; l++) {\n          resolvedLanguages.push(languages[l]);\n\n          if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {\n            // Extract the region information if it is included\n            var languageParts = languages[l].split('-');\n            var baseLanguage = languageParts[0];\n            resolvedLanguages.push(baseLanguage);\n          }\n        }\n\n        return resolvedLanguages;\n      };\n\n      Defaults.prototype._processTranslations = function (languages, debug) {\n        var translations = new Translation();\n\n        for (var l = 0; l < languages.length; l++) {\n          var languageData = new Translation();\n          var language = languages[l];\n\n          if (typeof language === 'string') {\n            try {\n              // Try to load it with the original name\n              languageData = Translation.loadPath(language);\n            } catch (e) {\n              try {\n                // If we couldn't load it, check if it wasn't the full path\n                language = this.defaults.amdLanguageBase + language;\n                languageData = Translation.loadPath(language);\n              } catch (ex) {\n                // The translation could not be loaded at all. Sometimes this is\n                // because of a configuration problem, other times this can be\n                // because of how Select2 helps load all possible translation files\n                if (debug && window.console && console.warn) {\n                  console.warn('Select2: The language file for \"' + language + '\" could ' + 'not be automatically loaded. A fallback will be used instead.');\n                }\n              }\n            }\n          } else if ($.isPlainObject(language)) {\n            languageData = new Translation(language);\n          } else {\n            languageData = language;\n          }\n\n          translations.extend(languageData);\n        }\n\n        return translations;\n      };\n\n      Defaults.prototype.set = function (key, value) {\n        var camelKey = $.camelCase(key);\n        var data = {};\n        data[camelKey] = value;\n\n        var convertedData = Utils._convertData(data);\n\n        $.extend(true, this.defaults, convertedData);\n      };\n\n      var defaults = new Defaults();\n      return defaults;\n    });\n    S2.define('select2/options', ['require', 'jquery', './defaults', './utils'], function (require, $, Defaults, Utils) {\n      function Options(options, $element) {\n        this.options = options;\n\n        if ($element != null) {\n          this.fromElement($element);\n        }\n\n        if ($element != null) {\n          this.options = Defaults.applyFromElement(this.options, $element);\n        }\n\n        this.options = Defaults.apply(this.options);\n\n        if ($element && $element.is('input')) {\n          var InputCompat = require(this.get('amdBase') + 'compat/inputData');\n\n          this.options.dataAdapter = Utils.Decorate(this.options.dataAdapter, InputCompat);\n        }\n      }\n\n      Options.prototype.fromElement = function ($e) {\n        var excludedData = ['select2'];\n\n        if (this.options.multiple == null) {\n          this.options.multiple = $e.prop('multiple');\n        }\n\n        if (this.options.disabled == null) {\n          this.options.disabled = $e.prop('disabled');\n        }\n\n        if (this.options.dir == null) {\n          if ($e.prop('dir')) {\n            this.options.dir = $e.prop('dir');\n          } else if ($e.closest('[dir]').prop('dir')) {\n            this.options.dir = $e.closest('[dir]').prop('dir');\n          } else {\n            this.options.dir = 'ltr';\n          }\n        }\n\n        $e.prop('disabled', this.options.disabled);\n        $e.prop('multiple', this.options.multiple);\n\n        if (Utils.GetData($e[0], 'select2Tags')) {\n          if (this.options.debug && window.console && console.warn) {\n            console.warn('Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags=\"true\"` attributes and will be ' + 'removed in future versions of Select2.');\n          }\n\n          Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));\n          Utils.StoreData($e[0], 'tags', true);\n        }\n\n        if (Utils.GetData($e[0], 'ajaxUrl')) {\n          if (this.options.debug && window.console && console.warn) {\n            console.warn('Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.');\n          }\n\n          $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));\n          Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));\n        }\n\n        var dataset = {};\n\n        function upperCaseLetter(_, letter) {\n          return letter.toUpperCase();\n        } // Pre-load all of the attributes which are prefixed with `data-`\n\n\n        for (var attr = 0; attr < $e[0].attributes.length; attr++) {\n          var attributeName = $e[0].attributes[attr].name;\n          var prefix = 'data-';\n\n          if (attributeName.substr(0, prefix.length) == prefix) {\n            // Get the contents of the attribute after `data-`\n            var dataName = attributeName.substring(prefix.length); // Get the data contents from the consistent source\n            // This is more than likely the jQuery data helper\n\n            var dataValue = Utils.GetData($e[0], dataName); // camelCase the attribute name to match the spec\n\n            var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); // Store the data attribute contents into the dataset since\n\n            dataset[camelDataName] = dataValue;\n          }\n        } // Prefer the element's `dataset` attribute if it exists\n        // jQuery 1.x does not correctly handle data attributes with multiple dashes\n\n\n        if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {\n          dataset = $.extend(true, {}, $e[0].dataset, dataset);\n        } // Prefer our internal data cache if it exists\n\n\n        var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);\n        data = Utils._convertData(data);\n\n        for (var key in data) {\n          if ($.inArray(key, excludedData) > -1) {\n            continue;\n          }\n\n          if ($.isPlainObject(this.options[key])) {\n            $.extend(this.options[key], data[key]);\n          } else {\n            this.options[key] = data[key];\n          }\n        }\n\n        return this;\n      };\n\n      Options.prototype.get = function (key) {\n        return this.options[key];\n      };\n\n      Options.prototype.set = function (key, val) {\n        this.options[key] = val;\n      };\n\n      return Options;\n    });\n    S2.define('select2/core', ['jquery', './options', './utils', './keys'], function ($, Options, Utils, KEYS) {\n      var Select2 = function Select2($element, options) {\n        if (Utils.GetData($element[0], 'select2') != null) {\n          Utils.GetData($element[0], 'select2').destroy();\n        }\n\n        this.$element = $element;\n        this.id = this._generateId($element);\n        options = options || {};\n        this.options = new Options(options, $element);\n\n        Select2.__super__.constructor.call(this); // Set up the tabindex\n\n\n        var tabindex = $element.attr('tabindex') || 0;\n        Utils.StoreData($element[0], 'old-tabindex', tabindex);\n        $element.attr('tabindex', '-1'); // Set up containers and adapters\n\n        var DataAdapter = this.options.get('dataAdapter');\n        this.dataAdapter = new DataAdapter($element, this.options);\n        var $container = this.render();\n\n        this._placeContainer($container);\n\n        var SelectionAdapter = this.options.get('selectionAdapter');\n        this.selection = new SelectionAdapter($element, this.options);\n        this.$selection = this.selection.render();\n        this.selection.position(this.$selection, $container);\n        var DropdownAdapter = this.options.get('dropdownAdapter');\n        this.dropdown = new DropdownAdapter($element, this.options);\n        this.$dropdown = this.dropdown.render();\n        this.dropdown.position(this.$dropdown, $container);\n        var ResultsAdapter = this.options.get('resultsAdapter');\n        this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n        this.$results = this.results.render();\n        this.results.position(this.$results, this.$dropdown); // Bind events\n\n        var self = this; // Bind the container to all of the adapters\n\n        this._bindAdapters(); // Register any DOM event handlers\n\n\n        this._registerDomEvents(); // Register any internal event handlers\n\n\n        this._registerDataEvents();\n\n        this._registerSelectionEvents();\n\n        this._registerDropdownEvents();\n\n        this._registerResultsEvents();\n\n        this._registerEvents(); // Set the initial state\n\n\n        this.dataAdapter.current(function (initialData) {\n          self.trigger('selection:update', {\n            data: initialData\n          });\n        }); // Hide the original select\n\n        $element.addClass('select2-hidden-accessible');\n        $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes\n\n        this._syncAttributes();\n\n        Utils.StoreData($element[0], 'select2', this); // Ensure backwards compatibility with $element.data('select2').\n\n        $element.data('select2', this);\n      };\n\n      Utils.Extend(Select2, Utils.Observable);\n\n      Select2.prototype._generateId = function ($element) {\n        var id = '';\n\n        if ($element.attr('id') != null) {\n          id = $element.attr('id');\n        } else if ($element.attr('name') != null) {\n          id = $element.attr('name') + '-' + Utils.generateChars(2);\n        } else {\n          id = Utils.generateChars(4);\n        }\n\n        id = id.replace(/(:|\\.|\\[|\\]|,)/g, '');\n        id = 'select2-' + id;\n        return id;\n      };\n\n      Select2.prototype._placeContainer = function ($container) {\n        $container.insertAfter(this.$element);\n\n        var width = this._resolveWidth(this.$element, this.options.get('width'));\n\n        if (width != null) {\n          $container.css('width', width);\n        }\n      };\n\n      Select2.prototype._resolveWidth = function ($element, method) {\n        var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n\n        if (method == 'resolve') {\n          var styleWidth = this._resolveWidth($element, 'style');\n\n          if (styleWidth != null) {\n            return styleWidth;\n          }\n\n          return this._resolveWidth($element, 'element');\n        }\n\n        if (method == 'element') {\n          var elementWidth = $element.outerWidth(false);\n\n          if (elementWidth <= 0) {\n            return 'auto';\n          }\n\n          return elementWidth + 'px';\n        }\n\n        if (method == 'style') {\n          var style = $element.attr('style');\n\n          if (typeof style !== 'string') {\n            return null;\n          }\n\n          var attrs = style.split(';');\n\n          for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n            var attr = attrs[i].replace(/\\s/g, '');\n            var matches = attr.match(WIDTH);\n\n            if (matches !== null && matches.length >= 1) {\n              return matches[1];\n            }\n          }\n\n          return null;\n        }\n\n        if (method == 'computedstyle') {\n          var computedStyle = window.getComputedStyle($element[0]);\n          return computedStyle.width;\n        }\n\n        return method;\n      };\n\n      Select2.prototype._bindAdapters = function () {\n        this.dataAdapter.bind(this, this.$container);\n        this.selection.bind(this, this.$container);\n        this.dropdown.bind(this, this.$container);\n        this.results.bind(this, this.$container);\n      };\n\n      Select2.prototype._registerDomEvents = function () {\n        var self = this;\n        this.$element.on('change.select2', function () {\n          self.dataAdapter.current(function (data) {\n            self.trigger('selection:update', {\n              data: data\n            });\n          });\n        });\n        this.$element.on('focus.select2', function (evt) {\n          self.trigger('focus', evt);\n        });\n        this._syncA = Utils.bind(this._syncAttributes, this);\n        this._syncS = Utils.bind(this._syncSubtree, this);\n\n        if (this.$element[0].attachEvent) {\n          this.$element[0].attachEvent('onpropertychange', this._syncA);\n        }\n\n        var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;\n\n        if (observer != null) {\n          this._observer = new observer(function (mutations) {\n            self._syncA();\n\n            self._syncS(null, mutations);\n          });\n\n          this._observer.observe(this.$element[0], {\n            attributes: true,\n            childList: true,\n            subtree: false\n          });\n        } else if (this.$element[0].addEventListener) {\n          this.$element[0].addEventListener('DOMAttrModified', self._syncA, false);\n          this.$element[0].addEventListener('DOMNodeInserted', self._syncS, false);\n          this.$element[0].addEventListener('DOMNodeRemoved', self._syncS, false);\n        }\n      };\n\n      Select2.prototype._registerDataEvents = function () {\n        var self = this;\n        this.dataAdapter.on('*', function (name, params) {\n          self.trigger(name, params);\n        });\n      };\n\n      Select2.prototype._registerSelectionEvents = function () {\n        var self = this;\n        var nonRelayEvents = ['toggle', 'focus'];\n        this.selection.on('toggle', function () {\n          self.toggleDropdown();\n        });\n        this.selection.on('focus', function (params) {\n          self.focus(params);\n        });\n        this.selection.on('*', function (name, params) {\n          if ($.inArray(name, nonRelayEvents) !== -1) {\n            return;\n          }\n\n          self.trigger(name, params);\n        });\n      };\n\n      Select2.prototype._registerDropdownEvents = function () {\n        var self = this;\n        this.dropdown.on('*', function (name, params) {\n          self.trigger(name, params);\n        });\n      };\n\n      Select2.prototype._registerResultsEvents = function () {\n        var self = this;\n        this.results.on('*', function (name, params) {\n          self.trigger(name, params);\n        });\n      };\n\n      Select2.prototype._registerEvents = function () {\n        var self = this;\n        this.on('open', function () {\n          self.$container.addClass('select2-container--open');\n        });\n        this.on('close', function () {\n          self.$container.removeClass('select2-container--open');\n        });\n        this.on('enable', function () {\n          self.$container.removeClass('select2-container--disabled');\n        });\n        this.on('disable', function () {\n          self.$container.addClass('select2-container--disabled');\n        });\n        this.on('blur', function () {\n          self.$container.removeClass('select2-container--focus');\n        });\n        this.on('query', function (params) {\n          if (!self.isOpen()) {\n            self.trigger('open', {});\n          }\n\n          this.dataAdapter.query(params, function (data) {\n            self.trigger('results:all', {\n              data: data,\n              query: params\n            });\n          });\n        });\n        this.on('query:append', function (params) {\n          this.dataAdapter.query(params, function (data) {\n            self.trigger('results:append', {\n              data: data,\n              query: params\n            });\n          });\n        });\n        this.on('keypress', function (evt) {\n          var key = evt.which;\n\n          if (self.isOpen()) {\n            if (key === KEYS.ESC || key === KEYS.TAB || key === KEYS.UP && evt.altKey) {\n              self.close(evt);\n              evt.preventDefault();\n            } else if (key === KEYS.ENTER) {\n              self.trigger('results:select', {});\n              evt.preventDefault();\n            } else if (key === KEYS.SPACE && evt.ctrlKey) {\n              self.trigger('results:toggle', {});\n              evt.preventDefault();\n            } else if (key === KEYS.UP) {\n              self.trigger('results:previous', {});\n              evt.preventDefault();\n            } else if (key === KEYS.DOWN) {\n              self.trigger('results:next', {});\n              evt.preventDefault();\n            }\n          } else {\n            if (key === KEYS.ENTER || key === KEYS.SPACE || key === KEYS.DOWN && evt.altKey) {\n              self.open();\n              evt.preventDefault();\n            }\n          }\n        });\n      };\n\n      Select2.prototype._syncAttributes = function () {\n        this.options.set('disabled', this.$element.prop('disabled'));\n\n        if (this.isDisabled()) {\n          if (this.isOpen()) {\n            this.close();\n          }\n\n          this.trigger('disable', {});\n        } else {\n          this.trigger('enable', {});\n        }\n      };\n\n      Select2.prototype._isChangeMutation = function (evt, mutations) {\n        var changed = false;\n        var self = this; // Ignore any mutation events raised for elements that aren't options or\n        // optgroups. This handles the case when the select element is destroyed\n\n        if (evt && evt.target && evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP') {\n          return;\n        }\n\n        if (!mutations) {\n          // If mutation events aren't supported, then we can only assume that the\n          // change affected the selections\n          changed = true;\n        } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {\n          for (var n = 0; n < mutations.addedNodes.length; n++) {\n            var node = mutations.addedNodes[n];\n\n            if (node.selected) {\n              changed = true;\n            }\n          }\n        } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {\n          changed = true;\n        } else if ($.isArray(mutations)) {\n          $.each(mutations, function (evt, mutation) {\n            if (self._isChangeMutation(evt, mutation)) {\n              // We've found a change mutation.\n              // Let's escape from the loop and continue\n              changed = true;\n              return false;\n            }\n          });\n        }\n\n        return changed;\n      };\n\n      Select2.prototype._syncSubtree = function (evt, mutations) {\n        var changed = this._isChangeMutation(evt, mutations);\n\n        var self = this; // Only re-pull the data if we think there is a change\n\n        if (changed) {\n          this.dataAdapter.current(function (currentData) {\n            self.trigger('selection:update', {\n              data: currentData\n            });\n          });\n        }\n      };\n      /**\n       * Override the trigger method to automatically trigger pre-events when\n       * there are events that can be prevented.\n       */\n\n\n      Select2.prototype.trigger = function (name, args) {\n        var actualTrigger = Select2.__super__.trigger;\n        var preTriggerMap = {\n          'open': 'opening',\n          'close': 'closing',\n          'select': 'selecting',\n          'unselect': 'unselecting',\n          'clear': 'clearing'\n        };\n\n        if (args === undefined) {\n          args = {};\n        }\n\n        if (name in preTriggerMap) {\n          var preTriggerName = preTriggerMap[name];\n          var preTriggerArgs = {\n            prevented: false,\n            name: name,\n            args: args\n          };\n          actualTrigger.call(this, preTriggerName, preTriggerArgs);\n\n          if (preTriggerArgs.prevented) {\n            args.prevented = true;\n            return;\n          }\n        }\n\n        actualTrigger.call(this, name, args);\n      };\n\n      Select2.prototype.toggleDropdown = function () {\n        if (this.isDisabled()) {\n          return;\n        }\n\n        if (this.isOpen()) {\n          this.close();\n        } else {\n          this.open();\n        }\n      };\n\n      Select2.prototype.open = function () {\n        if (this.isOpen()) {\n          return;\n        }\n\n        if (this.isDisabled()) {\n          return;\n        }\n\n        this.trigger('query', {});\n      };\n\n      Select2.prototype.close = function (evt) {\n        if (!this.isOpen()) {\n          return;\n        }\n\n        this.trigger('close', {\n          originalEvent: evt\n        });\n      };\n      /**\n       * Helper method to abstract the \"enabled\" (not \"disabled\") state of this\n       * object.\n       *\n       * @return {true} if the instance is not disabled.\n       * @return {false} if the instance is disabled.\n       */\n\n\n      Select2.prototype.isEnabled = function () {\n        return !this.isDisabled();\n      };\n      /**\n       * Helper method to abstract the \"disabled\" state of this object.\n       *\n       * @return {true} if the disabled option is true.\n       * @return {false} if the disabled option is false.\n       */\n\n\n      Select2.prototype.isDisabled = function () {\n        return this.options.get('disabled');\n      };\n\n      Select2.prototype.isOpen = function () {\n        return this.$container.hasClass('select2-container--open');\n      };\n\n      Select2.prototype.hasFocus = function () {\n        return this.$container.hasClass('select2-container--focus');\n      };\n\n      Select2.prototype.focus = function (data) {\n        // No need to re-trigger focus events if we are already focused\n        if (this.hasFocus()) {\n          return;\n        }\n\n        this.$container.addClass('select2-container--focus');\n        this.trigger('focus', {});\n      };\n\n      Select2.prototype.enable = function (args) {\n        if (this.options.get('debug') && window.console && console.warn) {\n          console.warn('Select2: The `select2(\"enable\")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop(\"disabled\")' + ' instead.');\n        }\n\n        if (args == null || args.length === 0) {\n          args = [true];\n        }\n\n        var disabled = !args[0];\n        this.$element.prop('disabled', disabled);\n      };\n\n      Select2.prototype.data = function () {\n        if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) {\n          console.warn('Select2: Data can no longer be set using `select2(\"data\")`. You ' + 'should consider setting the value instead using `$element.val()`.');\n        }\n\n        var data = [];\n        this.dataAdapter.current(function (currentData) {\n          data = currentData;\n        });\n        return data;\n      };\n\n      Select2.prototype.val = function (args) {\n        if (this.options.get('debug') && window.console && console.warn) {\n          console.warn('Select2: The `select2(\"val\")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.');\n        }\n\n        if (args == null || args.length === 0) {\n          return this.$element.val();\n        }\n\n        var newVal = args[0];\n\n        if ($.isArray(newVal)) {\n          newVal = $.map(newVal, function (obj) {\n            return obj.toString();\n          });\n        }\n\n        this.$element.val(newVal).trigger('input').trigger('change');\n      };\n\n      Select2.prototype.destroy = function () {\n        this.$container.remove();\n\n        if (this.$element[0].detachEvent) {\n          this.$element[0].detachEvent('onpropertychange', this._syncA);\n        }\n\n        if (this._observer != null) {\n          this._observer.disconnect();\n\n          this._observer = null;\n        } else if (this.$element[0].removeEventListener) {\n          this.$element[0].removeEventListener('DOMAttrModified', this._syncA, false);\n          this.$element[0].removeEventListener('DOMNodeInserted', this._syncS, false);\n          this.$element[0].removeEventListener('DOMNodeRemoved', this._syncS, false);\n        }\n\n        this._syncA = null;\n        this._syncS = null;\n        this.$element.off('.select2');\n        this.$element.attr('tabindex', Utils.GetData(this.$element[0], 'old-tabindex'));\n        this.$element.removeClass('select2-hidden-accessible');\n        this.$element.attr('aria-hidden', 'false');\n        Utils.RemoveData(this.$element[0]);\n        this.$element.removeData('select2');\n        this.dataAdapter.destroy();\n        this.selection.destroy();\n        this.dropdown.destroy();\n        this.results.destroy();\n        this.dataAdapter = null;\n        this.selection = null;\n        this.dropdown = null;\n        this.results = null;\n      };\n\n      Select2.prototype.render = function () {\n        var $container = $('<span class=\"select2 select2-container\">' + '<span class=\"selection\"></span>' + '<span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span>' + '</span>');\n        $container.attr('dir', this.options.get('dir'));\n        this.$container = $container;\n        this.$container.addClass('select2-container--' + this.options.get('theme'));\n        Utils.StoreData($container[0], 'element', this.$element);\n        return $container;\n      };\n\n      return Select2;\n    });\n    S2.define('jquery-mousewheel', ['jquery'], function ($) {\n      // Used to shim jQuery.mousewheel for non-full builds.\n      return $;\n    });\n    S2.define('jquery.select2', ['jquery', 'jquery-mousewheel', './select2/core', './select2/defaults', './select2/utils'], function ($, _, Select2, Defaults, Utils) {\n      if ($.fn.select2 == null) {\n        // All methods that should return the element\n        var thisMethods = ['open', 'close', 'destroy'];\n\n        $.fn.select2 = function (options) {\n          options = options || {};\n\n          if (_typeof(options) === 'object') {\n            this.each(function () {\n              var instanceOptions = $.extend(true, {}, options);\n              var instance = new Select2($(this), instanceOptions);\n            });\n            return this;\n          } else if (typeof options === 'string') {\n            var ret;\n            var args = Array.prototype.slice.call(arguments, 1);\n            this.each(function () {\n              var instance = Utils.GetData(this, 'select2');\n\n              if (instance == null && window.console && console.error) {\n                console.error('The select2(\\'' + options + '\\') method was called on an ' + 'element that is not using Select2.');\n              }\n\n              ret = instance[options].apply(instance, args);\n            }); // Check if we should be returning `this`\n\n            if ($.inArray(options, thisMethods) > -1) {\n              return this;\n            }\n\n            return ret;\n          } else {\n            throw new Error('Invalid arguments for Select2: ' + options);\n          }\n        };\n      }\n\n      if ($.fn.select2.defaults == null) {\n        $.fn.select2.defaults = Defaults;\n      }\n\n      return Select2;\n    }); // Return the AMD loader configuration so it can be used outside of this file\n\n    return {\n      define: S2.define,\n      require: S2.require\n    };\n  }(); // Autoload the jQuery bindings\n  // We know that all of the modules exist above this, so we're safe\n\n\n  var select2 = S2.require('jquery.select2'); // Hold the AMD module references on the jQuery function that was just loaded\n  // This allows Select2 to use the internal loader outside of this file, such\n  // as in the language files.\n\n\n  jQuery.fn.select2.amd = S2; // Return the Select2 instance for anyone who is importing it.\n\n  return select2;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./node_modules/select2/dist/js/select2.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_baseCreate.js":
/*!********************************************************!*\
  !*** ./node_modules/underscore/modules/_baseCreate.js ***!
  \********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return baseCreate; });\n/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ \"./node_modules/underscore/modules/isObject.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n\n // Create a naked function reference for surrogate-prototype-swapping.\n\nfunction ctor() {\n  return function () {};\n} // An internal function for creating a new object that inherits from another.\n\n\nfunction baseCreate(prototype) {\n  if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prototype)) return {};\n  if (_setup_js__WEBPACK_IMPORTED_MODULE_1__[\"nativeCreate\"]) return Object(_setup_js__WEBPACK_IMPORTED_MODULE_1__[\"nativeCreate\"])(prototype);\n  var Ctor = ctor();\n  Ctor.prototype = prototype;\n  var result = new Ctor();\n  Ctor.prototype = null;\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_baseCreate.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_baseIteratee.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/_baseIteratee.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return baseIteratee; });\n/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./identity.js */ \"./node_modules/underscore/modules/identity.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isObject.js */ \"./node_modules/underscore/modules/isObject.js\");\n/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ \"./node_modules/underscore/modules/isArray.js\");\n/* harmony import */ var _matcher_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./matcher.js */ \"./node_modules/underscore/modules/matcher.js\");\n/* harmony import */ var _property_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./property.js */ \"./node_modules/underscore/modules/property.js\");\n/* harmony import */ var _optimizeCb_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_optimizeCb.js */ \"./node_modules/underscore/modules/_optimizeCb.js\");\n\n\n\n\n\n\n // An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `_.identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\n\nfunction baseIteratee(value, context, argCount) {\n  if (value == null) return _identity_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n  if (Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(value)) return Object(_optimizeCb_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(value, context, argCount);\n  if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(value) && !Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(value)) return Object(_matcher_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(value);\n  return Object(_property_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(value);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_baseIteratee.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_cb.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/_cb.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return cb; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIteratee.js */ \"./node_modules/underscore/modules/_baseIteratee.js\");\n/* harmony import */ var _iteratee_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./iteratee.js */ \"./node_modules/underscore/modules/iteratee.js\");\n\n\n // The function we call internally to generate a callback. It invokes\n// `_.iteratee` if overridden, otherwise `baseIteratee`.\n\nfunction cb(value, context, argCount) {\n  if (_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].iteratee !== _iteratee_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]) return _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].iteratee(value, context);\n  return Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(value, context, argCount);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_cb.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_chainResult.js":
/*!*********************************************************!*\
  !*** ./node_modules/underscore/modules/_chainResult.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return chainResult; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n // Helper function to continue chaining intermediate results.\n\nfunction chainResult(instance, obj) {\n  return instance._chain ? Object(_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj).chain() : obj;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_chainResult.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_collectNonEnumProps.js":
/*!*****************************************************************!*\
  !*** ./node_modules/underscore/modules/_collectNonEnumProps.js ***!
  \*****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return collectNonEnumProps; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n\n\n // Internal helper to create a simple lookup structure.\n// `collectNonEnumProps` used to depend on `_.contains`, but this led to\n// circular imports. `emulatedSet` is a one-off solution that only works for\n// arrays of strings.\n\nfunction emulatedSet(keys) {\n  var hash = {};\n\n  for (var l = keys.length, i = 0; i < l; ++i) {\n    hash[keys[i]] = true;\n  }\n\n  return {\n    contains: function contains(key) {\n      return hash[key] === true;\n    },\n    push: function push(key) {\n      hash[key] = true;\n      return keys.push(key);\n    }\n  };\n} // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n// be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n// needed.\n\n\nfunction collectNonEnumProps(obj, keys) {\n  keys = emulatedSet(keys);\n  var nonEnumIdx = _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"nonEnumerableProps\"].length;\n  var constructor = obj.constructor;\n  var proto = Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(constructor) && constructor.prototype || _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"ObjProto\"]; // Constructor is a special case.\n\n  var prop = 'constructor';\n  if (Object(_has_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n  while (nonEnumIdx--) {\n    prop = _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"nonEnumerableProps\"][nonEnumIdx];\n\n    if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n      keys.push(prop);\n    }\n  }\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_collectNonEnumProps.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_createAssigner.js":
/*!************************************************************!*\
  !*** ./node_modules/underscore/modules/_createAssigner.js ***!
  \************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createAssigner; });\n// An internal function for creating assigner functions.\nfunction createAssigner(keysFunc, defaults) {\n  return function (obj) {\n    var length = arguments.length;\n    if (defaults) obj = Object(obj);\n    if (length < 2 || obj == null) return obj;\n\n    for (var index = 1; index < length; index++) {\n      var source = arguments[index],\n          keys = keysFunc(source),\n          l = keys.length;\n\n      for (var i = 0; i < l; i++) {\n        var key = keys[i];\n        if (!defaults || obj[key] === void 0) obj[key] = source[key];\n      }\n    }\n\n    return obj;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_createAssigner.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_createEscaper.js":
/*!***********************************************************!*\
  !*** ./node_modules/underscore/modules/_createEscaper.js ***!
  \***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createEscaper; });\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n // Internal helper to generate functions for escaping and unescaping strings\n// to/from HTML interpolation.\n\nfunction createEscaper(map) {\n  var escaper = function escaper(match) {\n    return map[match];\n  }; // Regexes for identifying a key that needs to be escaped.\n\n\n  var source = '(?:' + Object(_keys_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(map).join('|') + ')';\n  var testRegexp = RegExp(source);\n  var replaceRegexp = RegExp(source, 'g');\n  return function (string) {\n    string = string == null ? '' : '' + string;\n    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_createEscaper.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_createIndexFinder.js":
/*!***************************************************************!*\
  !*** ./node_modules/underscore/modules/_createIndexFinder.js ***!
  \***************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createIndexFinder; });\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _isNaN_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isNaN.js */ \"./node_modules/underscore/modules/isNaN.js\");\n\n\n // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\n\nfunction createIndexFinder(dir, predicateFind, sortedIndex) {\n  return function (array, item, idx) {\n    var i = 0,\n        length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(array);\n\n    if (typeof idx == 'number') {\n      if (dir > 0) {\n        i = idx >= 0 ? idx : Math.max(idx + length, i);\n      } else {\n        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n      }\n    } else if (sortedIndex && idx && length) {\n      idx = sortedIndex(array, item);\n      return array[idx] === item ? idx : -1;\n    }\n\n    if (item !== item) {\n      idx = predicateFind(_setup_js__WEBPACK_IMPORTED_MODULE_1__[\"slice\"].call(array, i, length), _isNaN_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n      return idx >= 0 ? idx + i : -1;\n    }\n\n    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n      if (array[idx] === item) return idx;\n    }\n\n    return -1;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_createIndexFinder.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_createPredicateIndexFinder.js":
/*!************************************************************************!*\
  !*** ./node_modules/underscore/modules/_createPredicateIndexFinder.js ***!
  \************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createPredicateIndexFinder; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n\n // Internal function to generate `_.findIndex` and `_.findLastIndex`.\n\nfunction createPredicateIndexFinder(dir) {\n  return function (array, predicate, context) {\n    predicate = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(predicate, context);\n    var length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(array);\n    var index = dir > 0 ? 0 : length - 1;\n\n    for (; index >= 0 && index < length; index += dir) {\n      if (predicate(array[index], index, array)) return index;\n    }\n\n    return -1;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_createPredicateIndexFinder.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_createReduce.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/_createReduce.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createReduce; });\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n/* harmony import */ var _optimizeCb_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_optimizeCb.js */ \"./node_modules/underscore/modules/_optimizeCb.js\");\n\n\n // Internal helper to create a reducing function, iterating left or right.\n\nfunction createReduce(dir) {\n  // Wrap code that reassigns argument variables in a separate function than\n  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n  var reducer = function reducer(obj, iteratee, memo, initial) {\n    var _keys = !Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj) && Object(_keys_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj),\n        length = (_keys || obj).length,\n        index = dir > 0 ? 0 : length - 1;\n\n    if (!initial) {\n      memo = obj[_keys ? _keys[index] : index];\n      index += dir;\n    }\n\n    for (; index >= 0 && index < length; index += dir) {\n      var currentKey = _keys ? _keys[index] : index;\n      memo = iteratee(memo, obj[currentKey], currentKey, obj);\n    }\n\n    return memo;\n  };\n\n  return function (obj, iteratee, memo, context) {\n    var initial = arguments.length >= 3;\n    return reducer(obj, Object(_optimizeCb_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(iteratee, context, 4), memo, initial);\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_createReduce.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_createSizePropertyCheck.js":
/*!*********************************************************************!*\
  !*** ./node_modules/underscore/modules/_createSizePropertyCheck.js ***!
  \*********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createSizePropertyCheck; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // Common internal logic for `isArrayLike` and `isBufferLike`.\n\nfunction createSizePropertyCheck(getSizeProperty) {\n  return function (collection) {\n    var sizeProperty = getSizeProperty(collection);\n    return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_ARRAY_INDEX\"];\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_createSizePropertyCheck.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_deepGet.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/_deepGet.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return deepGet; });\n// Internal function to obtain a nested property in `obj` along `path`.\nfunction deepGet(obj, path) {\n  var length = path.length;\n\n  for (var i = 0; i < length; i++) {\n    if (obj == null) return void 0;\n    obj = obj[path[i]];\n  }\n\n  return length ? obj : void 0;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_deepGet.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_escapeMap.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/_escapeMap.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// Internal list of HTML entities for escaping.\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;'\n});\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_escapeMap.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_executeBound.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/_executeBound.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return executeBound; });\n/* harmony import */ var _baseCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseCreate.js */ \"./node_modules/underscore/modules/_baseCreate.js\");\n/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject.js */ \"./node_modules/underscore/modules/isObject.js\");\n\n // Internal function to execute `sourceFunc` bound to `context` with optional\n// `args`. Determines whether to execute a function as a constructor or as a\n// normal function.\n\nfunction executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n  var self = Object(_baseCreate_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(sourceFunc.prototype);\n  var result = sourceFunc.apply(self, args);\n  if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(result)) return result;\n  return self;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_executeBound.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_flatten.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/_flatten.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return flatten; });\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArray.js */ \"./node_modules/underscore/modules/isArray.js\");\n/* harmony import */ var _isArguments_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArguments.js */ \"./node_modules/underscore/modules/isArguments.js\");\n\n\n\n // Internal implementation of a recursive `flatten` function.\n\nfunction flatten(input, depth, strict, output) {\n  output = output || [];\n\n  if (!depth && depth !== 0) {\n    depth = Infinity;\n  } else if (depth <= 0) {\n    return output.concat(input);\n  }\n\n  var idx = output.length;\n\n  for (var i = 0, length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(input); i < length; i++) {\n    var value = input[i];\n\n    if (Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(value) && (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(value) || Object(_isArguments_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(value))) {\n      // Flatten current level of array or arguments object.\n      if (depth > 1) {\n        flatten(value, depth - 1, strict, output);\n        idx = output.length;\n      } else {\n        var j = 0,\n            len = value.length;\n\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      }\n    } else if (!strict) {\n      output[idx++] = value;\n    }\n  }\n\n  return output;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_flatten.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_getByteLength.js":
/*!***********************************************************!*\
  !*** ./node_modules/underscore/modules/_getByteLength.js ***!
  \***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _shallowProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_shallowProperty.js */ \"./node_modules/underscore/modules/_shallowProperty.js\");\n // Internal helper to obtain the `byteLength` property of an object.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_shallowProperty_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('byteLength'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_getByteLength.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_getLength.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/_getLength.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _shallowProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_shallowProperty.js */ \"./node_modules/underscore/modules/_shallowProperty.js\");\n // Internal helper to obtain the `length` property of an object.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_shallowProperty_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('length'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_getLength.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_group.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/_group.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return group; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./each.js */ \"./node_modules/underscore/modules/each.js\");\n\n // An internal function used for aggregate \"group by\" operations.\n\nfunction group(behavior, partition) {\n  return function (obj, iteratee, context) {\n    var result = partition ? [[], []] : {};\n    iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(iteratee, context);\n    Object(_each_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj, function (value, index) {\n      var key = iteratee(value, index, obj);\n      behavior(result, value, key);\n    });\n    return result;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_group.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_has.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/_has.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return has; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // Internal function to check whether `key` is an own property name of `obj`.\n\nfunction has(obj, key) {\n  return obj != null && _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"hasOwnProperty\"].call(obj, key);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_has.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_hasObjectTag.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/_hasObjectTag.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Object'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_hasObjectTag.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_isArrayLike.js":
/*!*********************************************************!*\
  !*** ./node_modules/underscore/modules/_isArrayLike.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createSizePropertyCheck_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createSizePropertyCheck.js */ \"./node_modules/underscore/modules/_createSizePropertyCheck.js\");\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n\n // Internal helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createSizePropertyCheck_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_getLength_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_isArrayLike.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_isBufferLike.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/_isBufferLike.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createSizePropertyCheck_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createSizePropertyCheck.js */ \"./node_modules/underscore/modules/_createSizePropertyCheck.js\");\n/* harmony import */ var _getByteLength_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getByteLength.js */ \"./node_modules/underscore/modules/_getByteLength.js\");\n\n // Internal helper to determine whether we should spend extensive checks against\n// `ArrayBuffer` et al.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createSizePropertyCheck_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_getByteLength_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_isBufferLike.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_keyInObj.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/_keyInObj.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return keyInObj; });\n// Internal `_.pick` helper function to determine whether `key` is an enumerable\n// property name of `obj`.\nfunction keyInObj(value, key, obj) {\n  return key in obj;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_keyInObj.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_methodFingerprint.js":
/*!***************************************************************!*\
  !*** ./node_modules/underscore/modules/_methodFingerprint.js ***!
  \***************************************************************/
/*! exports provided: ie11fingerprint, mapMethods, weakMapMethods, setMethods */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ie11fingerprint\", function() { return ie11fingerprint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapMethods\", function() { return mapMethods; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"weakMapMethods\", function() { return weakMapMethods; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setMethods\", function() { return setMethods; });\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _allKeys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./allKeys.js */ \"./node_modules/underscore/modules/allKeys.js\");\n\n\n // Since the regular `Object.prototype.toString` type tests don't work for\n// some types in IE 11, we use a fingerprinting heuristic instead, based\n// on the methods. It's not great, but it's the best we got.\n// The fingerprint method lists are defined below.\n\nfunction ie11fingerprint(methods) {\n  var length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(methods);\n  return function (obj) {\n    if (obj == null) return false; // `Map`, `WeakMap` and `Set` have no enumerable keys.\n\n    var keys = Object(_allKeys_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj);\n    if (Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(keys)) return false;\n\n    for (var i = 0; i < length; i++) {\n      if (!Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj[methods[i]])) return false;\n    } // If we are testing against `WeakMap`, we need to ensure that\n    // `obj` doesn't have a `forEach` method in order to distinguish\n    // it from a regular `Map`.\n\n\n    return methods !== weakMapMethods || !Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj[forEachName]);\n  };\n} // In the interest of compact minification, we write\n// each string in the fingerprints only once.\n\nvar forEachName = 'forEach',\n    hasName = 'has',\n    commonInit = ['clear', 'delete'],\n    mapTail = ['get', hasName, 'set']; // `Map`, `WeakMap` and `Set` each have slightly different\n// combinations of the above sublists.\n\nvar mapMethods = commonInit.concat(forEachName, mapTail),\n    weakMapMethods = commonInit.concat(mapTail),\n    setMethods = ['add'].concat(commonInit, forEachName, hasName);\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_methodFingerprint.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_optimizeCb.js":
/*!********************************************************!*\
  !*** ./node_modules/underscore/modules/_optimizeCb.js ***!
  \********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return optimizeCb; });\n// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nfunction optimizeCb(func, context, argCount) {\n  if (context === void 0) return func;\n\n  switch (argCount == null ? 3 : argCount) {\n    case 1:\n      return function (value) {\n        return func.call(context, value);\n      };\n    // The 2-argument case is omitted because we’re not using it.\n\n    case 3:\n      return function (value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n\n    case 4:\n      return function (accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n  }\n\n  return function () {\n    return func.apply(context, arguments);\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_optimizeCb.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_setup.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/_setup.js ***!
  \***************************************************/
/*! exports provided: VERSION, root, ArrayProto, ObjProto, SymbolProto, push, slice, toString, hasOwnProperty, supportsArrayBuffer, supportsDataView, nativeIsArray, nativeKeys, nativeCreate, nativeIsView, _isNaN, _isFinite, hasEnumBug, nonEnumerableProps, MAX_ARRAY_INDEX */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VERSION\", function() { return VERSION; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"root\", function() { return root; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ArrayProto\", function() { return ArrayProto; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ObjProto\", function() { return ObjProto; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SymbolProto\", function() { return SymbolProto; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"push\", function() { return push; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"slice\", function() { return slice; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toString\", function() { return toString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasOwnProperty\", function() { return hasOwnProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportsArrayBuffer\", function() { return supportsArrayBuffer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportsDataView\", function() { return supportsDataView; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"nativeIsArray\", function() { return nativeIsArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"nativeKeys\", function() { return nativeKeys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"nativeCreate\", function() { return nativeCreate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"nativeIsView\", function() { return nativeIsView; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"_isNaN\", function() { return _isNaN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"_isFinite\", function() { return _isFinite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasEnumBug\", function() { return hasEnumBug; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"nonEnumerableProps\", function() { return nonEnumerableProps; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MAX_ARRAY_INDEX\", function() { return MAX_ARRAY_INDEX; });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n// Current version.\nvar VERSION = '1.13.6'; // Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\n\nvar root = (typeof self === \"undefined\" ? \"undefined\" : _typeof(self)) == 'object' && self.self === self && self || (typeof global === \"undefined\" ? \"undefined\" : _typeof(global)) == 'object' && global.global === global && global || Function('return this')() || {}; // Save bytes in the minified (but not gzipped) version:\n\nvar ArrayProto = Array.prototype,\n    ObjProto = Object.prototype;\nvar SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; // Create quick reference variables for speed access to core prototypes.\n\nvar push = ArrayProto.push,\n    slice = ArrayProto.slice,\n    toString = ObjProto.toString,\n    hasOwnProperty = ObjProto.hasOwnProperty; // Modern feature detection.\n\nvar supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n    supportsDataView = typeof DataView !== 'undefined'; // All **ECMAScript 5+** native function implementations that we hope to use\n// are declared here.\n\nvar nativeIsArray = Array.isArray,\n    nativeKeys = Object.keys,\n    nativeCreate = Object.create,\n    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; // Create references to these builtin functions because we override them.\n\nvar _isNaN = isNaN,\n    _isFinite = isFinite; // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n\nvar hasEnumBug = !{\n  toString: null\n}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; // The largest integer that can be represented exactly.\n\nvar MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_setup.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_shallowProperty.js":
/*!*************************************************************!*\
  !*** ./node_modules/underscore/modules/_shallowProperty.js ***!
  \*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return shallowProperty; });\n// Internal helper to generate a function to obtain property `key` from `obj`.\nfunction shallowProperty(key) {\n  return function (obj) {\n    return obj == null ? void 0 : obj[key];\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_shallowProperty.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_stringTagBug.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/_stringTagBug.js ***!
  \**********************************************************/
/*! exports provided: hasStringTagBug, isIE11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasStringTagBug\", function() { return hasStringTagBug; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isIE11\", function() { return isIE11; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _hasObjectTag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hasObjectTag.js */ \"./node_modules/underscore/modules/_hasObjectTag.js\");\n\n // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n// In IE 11, the most common among them, this problem also applies to\n// `Map`, `WeakMap` and `Set`.\n\nvar hasStringTagBug = _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"supportsDataView\"] && Object(_hasObjectTag_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(new DataView(new ArrayBuffer(8))),\n    isIE11 = typeof Map !== 'undefined' && Object(_hasObjectTag_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(new Map());\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_stringTagBug.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_tagTester.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/_tagTester.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return tagTester; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // Internal function for creating a `toString`-based type tester.\n\nfunction tagTester(name) {\n  var tag = '[object ' + name + ']';\n  return function (obj) {\n    return _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"toString\"].call(obj) === tag;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_tagTester.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_toBufferView.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/_toBufferView.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return toBufferView; });\n/* harmony import */ var _getByteLength_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getByteLength.js */ \"./node_modules/underscore/modules/_getByteLength.js\");\n // Internal function to wrap or shallow-copy an ArrayBuffer,\n// typed array or DataView to a new view, reusing the buffer.\n\nfunction toBufferView(bufferSource) {\n  return new Uint8Array(bufferSource.buffer || bufferSource, bufferSource.byteOffset || 0, Object(_getByteLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(bufferSource));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_toBufferView.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_toPath.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/_toPath.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return toPath; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _toPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toPath.js */ \"./node_modules/underscore/modules/toPath.js\");\n\n // Internal wrapper for `_.toPath` to enable minification.\n// Similar to `cb` for `_.iteratee`.\n\nfunction toPath(path) {\n  return _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toPath(path);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_toPath.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/_unescapeMap.js":
/*!*********************************************************!*\
  !*** ./node_modules/underscore/modules/_unescapeMap.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _invert_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invert.js */ \"./node_modules/underscore/modules/invert.js\");\n/* harmony import */ var _escapeMap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_escapeMap.js */ \"./node_modules/underscore/modules/_escapeMap.js\");\n\n // Internal list of HTML entities for unescaping.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_invert_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_escapeMap_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/_unescapeMap.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/after.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/after.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return after; });\n// Returns a function that will only be executed on and after the Nth call.\nfunction after(times, func) {\n  return function () {\n    if (--times < 1) {\n      return func.apply(this, arguments);\n    }\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/after.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/allKeys.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/allKeys.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return allKeys; });\n/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ \"./node_modules/underscore/modules/isObject.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _collectNonEnumProps_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_collectNonEnumProps.js */ \"./node_modules/underscore/modules/_collectNonEnumProps.js\");\n\n\n // Retrieve all the enumerable property names of an object.\n\nfunction allKeys(obj) {\n  if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj)) return [];\n  var keys = [];\n\n  for (var key in obj) {\n    keys.push(key);\n  } // Ahem, IE < 9.\n\n\n  if (_setup_js__WEBPACK_IMPORTED_MODULE_1__[\"hasEnumBug\"]) Object(_collectNonEnumProps_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj, keys);\n  return keys;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/allKeys.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/before.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/before.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return before; });\n// Returns a function that will only be executed up to (but not including) the\n// Nth call.\nfunction before(times, func) {\n  var memo;\n  return function () {\n    if (--times > 0) {\n      memo = func.apply(this, arguments);\n    }\n\n    if (times <= 1) func = null;\n    return memo;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/before.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/bind.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/bind.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _executeBound_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_executeBound.js */ \"./node_modules/underscore/modules/_executeBound.js\");\n\n\n // Create a function bound to a given object (assigning `this`, and arguments,\n// optionally).\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (func, context, args) {\n  if (!Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(func)) throw new TypeError('Bind must be called on a function');\n  var bound = Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (callArgs) {\n    return Object(_executeBound_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(func, bound, context, this, args.concat(callArgs));\n  });\n  return bound;\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/bind.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/bindAll.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/bindAll.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_flatten.js */ \"./node_modules/underscore/modules/_flatten.js\");\n/* harmony import */ var _bind_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bind.js */ \"./node_modules/underscore/modules/bind.js\");\n\n\n // Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (obj, keys) {\n  keys = Object(_flatten_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(keys, false, false);\n  var index = keys.length;\n  if (index < 1) throw new Error('bindAll must be passed function names');\n\n  while (index--) {\n    var key = keys[index];\n    obj[key] = Object(_bind_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj[key], obj);\n  }\n\n  return obj;\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/bindAll.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/chain.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/chain.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return chain; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n // Start chaining a wrapped Underscore object.\n\nfunction chain(obj) {\n  var instance = Object(_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj);\n\n  instance._chain = true;\n  return instance;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/chain.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/chunk.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/chunk.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return chunk; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\n\nfunction chunk(array, count) {\n  if (count == null || count < 1) return [];\n  var result = [];\n  var i = 0,\n      length = array.length;\n\n  while (i < length) {\n    result.push(_setup_js__WEBPACK_IMPORTED_MODULE_0__[\"slice\"].call(array, i, i += count));\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/chunk.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/clone.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/clone.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return clone; });\n/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ \"./node_modules/underscore/modules/isObject.js\");\n/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArray.js */ \"./node_modules/underscore/modules/isArray.js\");\n/* harmony import */ var _extend_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./extend.js */ \"./node_modules/underscore/modules/extend.js\");\n\n\n // Create a (shallow-cloned) duplicate of an object.\n\nfunction clone(obj) {\n  if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj)) return obj;\n  return Object(_isArray_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) ? obj.slice() : Object(_extend_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, obj);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/clone.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/compact.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/compact.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return compact; });\n/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./filter.js */ \"./node_modules/underscore/modules/filter.js\");\n // Trim out all falsy values from an array.\n\nfunction compact(array) {\n  return Object(_filter_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(array, Boolean);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/compact.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/compose.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/compose.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return compose; });\n// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nfunction compose() {\n  var args = arguments;\n  var start = args.length - 1;\n  return function () {\n    var i = start;\n    var result = args[start].apply(this, arguments);\n\n    while (i--) {\n      result = args[i].call(this, result);\n    }\n\n    return result;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/compose.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/constant.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/constant.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return constant; });\n// Predicate-generating function. Often useful outside of Underscore.\nfunction constant(value) {\n  return function () {\n    return value;\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/constant.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/contains.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/contains.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return contains; });\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./values.js */ \"./node_modules/underscore/modules/values.js\");\n/* harmony import */ var _indexOf_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./indexOf.js */ \"./node_modules/underscore/modules/indexOf.js\");\n\n\n // Determine if the array or object contains a given item (using `===`).\n\nfunction contains(obj, item, fromIndex, guard) {\n  if (!Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj)) obj = Object(_values_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj);\n  if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n  return Object(_indexOf_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj, item, fromIndex) >= 0;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/contains.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/countBy.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/countBy.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _group_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_group.js */ \"./node_modules/underscore/modules/_group.js\");\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n\n // Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_group_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (result, value, key) {\n  if (Object(_has_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(result, key)) result[key]++;else result[key] = 1;\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/countBy.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/create.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/create.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return create; });\n/* harmony import */ var _baseCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseCreate.js */ \"./node_modules/underscore/modules/_baseCreate.js\");\n/* harmony import */ var _extendOwn_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./extendOwn.js */ \"./node_modules/underscore/modules/extendOwn.js\");\n\n // Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\n\nfunction create(prototype, props) {\n  var result = Object(_baseCreate_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prototype);\n  if (props) Object(_extendOwn_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(result, props);\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/create.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/debounce.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/debounce.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return debounce; });\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./now.js */ \"./node_modules/underscore/modules/now.js\");\n\n // When a sequence of calls of the returned function ends, the argument\n// function is triggered. The end of a sequence is defined by the `wait`\n// parameter. If `immediate` is passed, the argument function will be\n// triggered at the beginning of the sequence instead of at the end.\n\nfunction debounce(func, wait, immediate) {\n  var timeout, previous, args, result, context;\n\n  var later = function later() {\n    var passed = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])() - previous;\n\n    if (wait > passed) {\n      timeout = setTimeout(later, wait - passed);\n    } else {\n      timeout = null;\n      if (!immediate) result = func.apply(context, args); // This check is needed because `func` can recursively invoke `debounced`.\n\n      if (!timeout) args = context = null;\n    }\n  };\n\n  var debounced = Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (_args) {\n    context = this;\n    args = _args;\n    previous = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n\n    if (!timeout) {\n      timeout = setTimeout(later, wait);\n      if (immediate) result = func.apply(context, args);\n    }\n\n    return result;\n  });\n\n  debounced.cancel = function () {\n    clearTimeout(timeout);\n    timeout = args = context = null;\n  };\n\n  return debounced;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/debounce.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/defaults.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/defaults.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createAssigner_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createAssigner.js */ \"./node_modules/underscore/modules/_createAssigner.js\");\n/* harmony import */ var _allKeys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./allKeys.js */ \"./node_modules/underscore/modules/allKeys.js\");\n\n // Fill in a given object with default properties.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createAssigner_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_allKeys_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], true));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/defaults.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/defer.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/defer.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _partial_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./partial.js */ \"./node_modules/underscore/modules/partial.js\");\n/* harmony import */ var _delay_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./delay.js */ \"./node_modules/underscore/modules/delay.js\");\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n\n\n // Defers a function, scheduling it to run after the current call stack has\n// cleared.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_partial_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_delay_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _underscore_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"], 1));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/defer.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/delay.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/delay.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n // Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (func, wait, args) {\n  return setTimeout(function () {\n    return func.apply(null, args);\n  }, wait);\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/delay.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/difference.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/difference.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_flatten.js */ \"./node_modules/underscore/modules/_flatten.js\");\n/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./filter.js */ \"./node_modules/underscore/modules/filter.js\");\n/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contains.js */ \"./node_modules/underscore/modules/contains.js\");\n\n\n\n // Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (array, rest) {\n  rest = Object(_flatten_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(rest, true, true);\n  return Object(_filter_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(array, function (value) {\n    return !Object(_contains_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(rest, value);\n  });\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/difference.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/each.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/each.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return each; });\n/* harmony import */ var _optimizeCb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_optimizeCb.js */ \"./node_modules/underscore/modules/_optimizeCb.js\");\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n\n // The cornerstone for collection functions, an `each`\n// implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\n\nfunction each(obj, iteratee, context) {\n  iteratee = Object(_optimizeCb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(iteratee, context);\n  var i, length;\n\n  if (Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj)) {\n    for (i = 0, length = obj.length; i < length; i++) {\n      iteratee(obj[i], i, obj);\n    }\n  } else {\n    var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj);\n\n    for (i = 0, length = _keys.length; i < length; i++) {\n      iteratee(obj[_keys[i]], _keys[i], obj);\n    }\n  }\n\n  return obj;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/each.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/escape.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/escape.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createEscaper_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createEscaper.js */ \"./node_modules/underscore/modules/_createEscaper.js\");\n/* harmony import */ var _escapeMap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_escapeMap.js */ \"./node_modules/underscore/modules/_escapeMap.js\");\n\n // Function for escaping strings to HTML interpolation.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createEscaper_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_escapeMap_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/escape.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/every.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/every.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return every; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n\n // Determine whether all of the elements pass a truth test.\n\nfunction every(obj, predicate, context) {\n  predicate = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(predicate, context);\n\n  var _keys = !Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) && Object(_keys_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj),\n      length = (_keys || obj).length;\n\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (!predicate(obj[currentKey], currentKey, obj)) return false;\n  }\n\n  return true;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/every.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/extend.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/extend.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createAssigner_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createAssigner.js */ \"./node_modules/underscore/modules/_createAssigner.js\");\n/* harmony import */ var _allKeys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./allKeys.js */ \"./node_modules/underscore/modules/allKeys.js\");\n\n // Extend a given object with all the properties in passed-in object(s).\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createAssigner_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_allKeys_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/extend.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/extendOwn.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/extendOwn.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createAssigner_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createAssigner.js */ \"./node_modules/underscore/modules/_createAssigner.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n // Assigns a given object with all the own properties in the passed-in\n// object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createAssigner_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_keys_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/extendOwn.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/filter.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/filter.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return filter; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./each.js */ \"./node_modules/underscore/modules/each.js\");\n\n // Return all the elements that pass a truth test.\n\nfunction filter(obj, predicate, context) {\n  var results = [];\n  predicate = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(predicate, context);\n  Object(_each_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj, function (value, index, list) {\n    if (predicate(value, index, list)) results.push(value);\n  });\n  return results;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/filter.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/find.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/find.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return find; });\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _findIndex_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./findIndex.js */ \"./node_modules/underscore/modules/findIndex.js\");\n/* harmony import */ var _findKey_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./findKey.js */ \"./node_modules/underscore/modules/findKey.js\");\n\n\n // Return the first value which passes a truth test.\n\nfunction find(obj, predicate, context) {\n  var keyFinder = Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj) ? _findIndex_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"] : _findKey_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n  var key = keyFinder(obj, predicate, context);\n  if (key !== void 0 && key !== -1) return obj[key];\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/find.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/findIndex.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/findIndex.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createPredicateIndexFinder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createPredicateIndexFinder.js */ \"./node_modules/underscore/modules/_createPredicateIndexFinder.js\");\n // Returns the first index on an array-like that passes a truth test.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createPredicateIndexFinder_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(1));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/findIndex.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/findKey.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/findKey.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return findKey; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n // Returns the first key on an object that passes a truth test.\n\nfunction findKey(obj, predicate, context) {\n  predicate = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(predicate, context);\n\n  var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj),\n      key;\n\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    key = _keys[i];\n    if (predicate(obj[key], key, obj)) return key;\n  }\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/findKey.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/findLastIndex.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/findLastIndex.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createPredicateIndexFinder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createPredicateIndexFinder.js */ \"./node_modules/underscore/modules/_createPredicateIndexFinder.js\");\n // Returns the last index on an array-like that passes a truth test.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createPredicateIndexFinder_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(-1));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/findLastIndex.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/findWhere.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/findWhere.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return findWhere; });\n/* harmony import */ var _find_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./find.js */ \"./node_modules/underscore/modules/find.js\");\n/* harmony import */ var _matcher_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./matcher.js */ \"./node_modules/underscore/modules/matcher.js\");\n\n // Convenience version of a common use case of `_.find`: getting the first\n// object containing specific `key:value` pairs.\n\nfunction findWhere(obj, attrs) {\n  return Object(_find_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj, Object(_matcher_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(attrs));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/findWhere.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/first.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/first.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return first; });\n/* harmony import */ var _initial_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./initial.js */ \"./node_modules/underscore/modules/initial.js\");\n // Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `_.map`.\n\nfunction first(array, n, guard) {\n  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n  if (n == null || guard) return array[0];\n  return Object(_initial_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(array, array.length - n);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/first.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/flatten.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/flatten.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return flatten; });\n/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_flatten.js */ \"./node_modules/underscore/modules/_flatten.js\");\n // Flatten out an array, either recursively (by default), or up to `depth`.\n// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\n\nfunction flatten(array, depth) {\n  return Object(_flatten_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(array, depth, false);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/flatten.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/functions.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/functions.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return functions; });\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n // Return a sorted list of the function names available on the object.\n\nfunction functions(obj) {\n  var names = [];\n\n  for (var key in obj) {\n    if (Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj[key])) names.push(key);\n  }\n\n  return names.sort();\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/functions.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/get.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/get.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return get; });\n/* harmony import */ var _toPath_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_toPath.js */ \"./node_modules/underscore/modules/_toPath.js\");\n/* harmony import */ var _deepGet_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_deepGet.js */ \"./node_modules/underscore/modules/_deepGet.js\");\n/* harmony import */ var _isUndefined_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isUndefined.js */ \"./node_modules/underscore/modules/isUndefined.js\");\n\n\n // Get the value of the (deep) property on `path` from `object`.\n// If any property in `path` does not exist or if the value is\n// `undefined`, return `defaultValue` instead.\n// The `path` is normalized through `_.toPath`.\n\nfunction get(object, path, defaultValue) {\n  var value = Object(_deepGet_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(object, Object(_toPath_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(path));\n  return Object(_isUndefined_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(value) ? defaultValue : value;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/get.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/groupBy.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/groupBy.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _group_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_group.js */ \"./node_modules/underscore/modules/_group.js\");\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n\n // Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_group_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (result, value, key) {\n  if (Object(_has_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(result, key)) result[key].push(value);else result[key] = [value];\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/groupBy.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/has.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/has.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return has; });\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n/* harmony import */ var _toPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_toPath.js */ \"./node_modules/underscore/modules/_toPath.js\");\n\n // Shortcut function for checking if an object has a given property directly on\n// itself (in other words, not on a prototype). Unlike the internal `has`\n// function, this public version can also traverse nested properties.\n\nfunction has(obj, path) {\n  path = Object(_toPath_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(path);\n  var length = path.length;\n\n  for (var i = 0; i < length; i++) {\n    var key = path[i];\n    if (!Object(_has_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj, key)) return false;\n    obj = obj[key];\n  }\n\n  return !!length;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/has.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/identity.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/identity.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return identity; });\n// Keep the identity function around for default iteratees.\nfunction identity(value) {\n  return value;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/identity.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/index-all.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/index-all.js ***!
  \******************************************************/
/*! exports provided: default, VERSION, restArguments, isObject, isNull, isUndefined, isBoolean, isElement, isString, isNumber, isDate, isRegExp, isError, isSymbol, isArrayBuffer, isDataView, isArray, isFunction, isArguments, isFinite, isNaN, isTypedArray, isEmpty, isMatch, isEqual, isMap, isWeakMap, isSet, isWeakSet, keys, allKeys, values, pairs, invert, functions, methods, extend, extendOwn, assign, defaults, create, clone, tap, get, has, mapObject, identity, constant, noop, toPath, property, propertyOf, matcher, matches, times, random, now, escape, unescape, templateSettings, template, result, uniqueId, chain, iteratee, partial, bind, bindAll, memoize, delay, defer, throttle, debounce, wrap, negate, compose, after, before, once, findKey, findIndex, findLastIndex, sortedIndex, indexOf, lastIndexOf, find, detect, findWhere, each, forEach, map, collect, reduce, foldl, inject, reduceRight, foldr, filter, select, reject, every, all, some, any, contains, includes, include, invoke, pluck, where, max, min, shuffle, sample, sortBy, groupBy, indexBy, countBy, partition, toArray, size, pick, omit, first, head, take, initial, last, rest, tail, drop, compact, flatten, without, uniq, unique, union, intersection, difference, unzip, transpose, zip, object, range, chunk, mixin */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _index_default_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index-default.js */ \"./node_modules/underscore/modules/index-default.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _index_default_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ \"./node_modules/underscore/modules/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"VERSION\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"VERSION\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"restArguments\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"restArguments\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isObject\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isObject\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isNull\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isNull\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isUndefined\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isUndefined\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isBoolean\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isBoolean\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isElement\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isElement\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isString\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isString\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isNumber\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isDate\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isDate\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isRegExp\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isRegExp\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isError\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isSymbol\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isSymbol\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isArrayBuffer\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isArrayBuffer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isDataView\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isDataView\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isArray\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isArray\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isFunction\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isArguments\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isArguments\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isFinite\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isFinite\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isNaN\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isTypedArray\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isTypedArray\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isEmpty\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isEmpty\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isMatch\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isMatch\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isEqual\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isEqual\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isMap\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isMap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isWeakMap\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isWeakMap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isSet\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isSet\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isWeakSet\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"isWeakSet\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"keys\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"keys\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"allKeys\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"allKeys\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"values\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"values\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"pairs\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"pairs\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"invert\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"invert\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"functions\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"functions\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"methods\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"methods\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"extend\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"extendOwn\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"extendOwn\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"assign\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"assign\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"defaults\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"create\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"create\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"clone\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"clone\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"tap\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"tap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"get\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"has\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"has\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"mapObject\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"mapObject\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"identity\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"identity\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"constant\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"constant\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"noop\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"noop\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"toPath\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"toPath\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"property\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"propertyOf\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"propertyOf\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matcher\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"matcher\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matches\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"matches\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"times\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"times\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"random\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"random\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"now\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"now\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"escape\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"escape\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unescape\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"unescape\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"templateSettings\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"templateSettings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"template\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"template\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"result\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"result\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"uniqueId\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"uniqueId\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"chain\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"chain\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"iteratee\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"iteratee\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"partial\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"partial\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bind\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"bind\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bindAll\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"bindAll\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"memoize\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"memoize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"delay\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"delay\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defer\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"defer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"throttle\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"throttle\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"debounce\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"wrap\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"wrap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"negate\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"negate\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compose\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"compose\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"after\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"after\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"before\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"before\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"once\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"once\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findKey\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"findKey\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findIndex\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"findIndex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findLastIndex\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"findLastIndex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sortedIndex\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"sortedIndex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"indexOf\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"indexOf\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"lastIndexOf\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"lastIndexOf\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"find\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"find\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"detect\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"detect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findWhere\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"findWhere\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"each\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"each\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"forEach\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"forEach\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"map\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"map\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"collect\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"collect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"reduce\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"reduce\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"foldl\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"foldl\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"inject\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"inject\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"reduceRight\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"reduceRight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"foldr\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"foldr\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"filter\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"filter\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"select\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"reject\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"reject\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"every\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"every\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"all\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"all\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"some\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"some\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"any\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"any\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"contains\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"contains\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"includes\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"includes\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"include\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"include\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"invoke\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"invoke\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"pluck\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"pluck\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"where\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"where\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"max\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"max\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"min\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"min\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shuffle\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"shuffle\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sample\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"sample\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sortBy\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"sortBy\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"groupBy\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"groupBy\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"indexBy\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"indexBy\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"countBy\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"countBy\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"partition\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"partition\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"toArray\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"toArray\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"size\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"size\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"pick\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"pick\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"omit\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"omit\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"first\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"first\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"head\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"head\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"take\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"take\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"initial\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"initial\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"last\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"last\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"rest\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"rest\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"tail\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"tail\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"drop\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"drop\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compact\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"compact\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flatten\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"flatten\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"without\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"without\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"uniq\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"uniq\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unique\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"unique\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"union\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"union\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"intersection\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"intersection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"difference\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"difference\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unzip\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"unzip\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"transpose\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"transpose\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"zip\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"zip\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"object\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"object\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"range\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"range\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"chunk\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"chunk\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"mixin\", function() { return _index_js__WEBPACK_IMPORTED_MODULE_1__[\"mixin\"]; });\n\n// ESM Exports\n// ===========\n// This module is the package entry point for ES module users. In other words,\n// it is the module they are interfacing with when they import from the whole\n// package instead of from a submodule, like this:\n//\n// ```js\n// import { map } from 'underscore';\n// ```\n//\n// The difference with `./index-default`, which is the package entry point for\n// CommonJS, AMD and UMD users, is purely technical. In ES modules, named and\n// default exports are considered to be siblings, so when you have a default\n// export, its properties are not automatically available as named exports. For\n// this reason, we re-export the named exports in addition to providing the same\n// default export as in `./index-default`.\n\n\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/index-all.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/index-default.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/index-default.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ \"./node_modules/underscore/modules/index.js\");\n// Default Export\n// ==============\n// In this module, we mix our bundled exports into the `_` object and export\n// the result. This is analogous to setting `module.exports = _` in CommonJS.\n// Hence, this module is also the entry point of our UMD bundle and the package\n// entry point for CommonJS and AMD users. In other words, this is (the source\n// of) the module you are interfacing with when you do any of the following:\n//\n// ```js\n// // CommonJS\n// var _ = require('underscore');\n//\n// // AMD\n// define(['underscore'], function(_) {...});\n//\n// // UMD in the browser\n// // _ is available as a global variable\n// ```\n\n // Add all of the Underscore functions to the wrapper object.\n\nvar _ = Object(_index_js__WEBPACK_IMPORTED_MODULE_0__[\"mixin\"])(_index_js__WEBPACK_IMPORTED_MODULE_0__); // Legacy Node.js API.\n\n\n_._ = _; // Export the Underscore API.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_);\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/index-default.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/index.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/index.js ***!
  \**************************************************/
/*! exports provided: VERSION, restArguments, isObject, isNull, isUndefined, isBoolean, isElement, isString, isNumber, isDate, isRegExp, isError, isSymbol, isArrayBuffer, isDataView, isArray, isFunction, isArguments, isFinite, isNaN, isTypedArray, isEmpty, isMatch, isEqual, isMap, isWeakMap, isSet, isWeakSet, keys, allKeys, values, pairs, invert, functions, methods, extend, extendOwn, assign, defaults, create, clone, tap, get, has, mapObject, identity, constant, noop, toPath, property, propertyOf, matcher, matches, times, random, now, escape, unescape, templateSettings, template, result, uniqueId, chain, iteratee, partial, bind, bindAll, memoize, delay, defer, throttle, debounce, wrap, negate, compose, after, before, once, findKey, findIndex, findLastIndex, sortedIndex, indexOf, lastIndexOf, find, detect, findWhere, each, forEach, map, collect, reduce, foldl, inject, reduceRight, foldr, filter, select, reject, every, all, some, any, contains, includes, include, invoke, pluck, where, max, min, shuffle, sample, sortBy, groupBy, indexBy, countBy, partition, toArray, size, pick, omit, first, head, take, initial, last, rest, tail, drop, compact, flatten, without, uniq, unique, union, intersection, difference, unzip, transpose, zip, object, range, chunk, mixin, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"VERSION\", function() { return _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"VERSION\"]; });\n\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"restArguments\", function() { return _restArguments_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isObject.js */ \"./node_modules/underscore/modules/isObject.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isObject\", function() { return _isObject_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _isNull_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isNull.js */ \"./node_modules/underscore/modules/isNull.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isNull\", function() { return _isNull_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _isUndefined_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isUndefined.js */ \"./node_modules/underscore/modules/isUndefined.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isUndefined\", function() { return _isUndefined_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _isBoolean_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isBoolean.js */ \"./node_modules/underscore/modules/isBoolean.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isBoolean\", function() { return _isBoolean_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _isElement_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isElement.js */ \"./node_modules/underscore/modules/isElement.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isElement\", function() { return _isElement_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./isString.js */ \"./node_modules/underscore/modules/isString.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isString\", function() { return _isString_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _isNumber_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./isNumber.js */ \"./node_modules/underscore/modules/isNumber.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return _isNumber_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _isDate_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./isDate.js */ \"./node_modules/underscore/modules/isDate.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isDate\", function() { return _isDate_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _isRegExp_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./isRegExp.js */ \"./node_modules/underscore/modules/isRegExp.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isRegExp\", function() { return _isRegExp_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _isError_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./isError.js */ \"./node_modules/underscore/modules/isError.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isError\", function() { return _isError_js__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./isSymbol.js */ \"./node_modules/underscore/modules/isSymbol.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isSymbol\", function() { return _isSymbol_js__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _isArrayBuffer_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./isArrayBuffer.js */ \"./node_modules/underscore/modules/isArrayBuffer.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isArrayBuffer\", function() { return _isArrayBuffer_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony import */ var _isDataView_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./isDataView.js */ \"./node_modules/underscore/modules/isDataView.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isDataView\", function() { return _isDataView_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"]; });\n\n/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./isArray.js */ \"./node_modules/underscore/modules/isArray.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isArray\", function() { return _isArray_js__WEBPACK_IMPORTED_MODULE_15__[\"default\"]; });\n\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return _isFunction_js__WEBPACK_IMPORTED_MODULE_16__[\"default\"]; });\n\n/* harmony import */ var _isArguments_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./isArguments.js */ \"./node_modules/underscore/modules/isArguments.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isArguments\", function() { return _isArguments_js__WEBPACK_IMPORTED_MODULE_17__[\"default\"]; });\n\n/* harmony import */ var _isFinite_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./isFinite.js */ \"./node_modules/underscore/modules/isFinite.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isFinite\", function() { return _isFinite_js__WEBPACK_IMPORTED_MODULE_18__[\"default\"]; });\n\n/* harmony import */ var _isNaN_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./isNaN.js */ \"./node_modules/underscore/modules/isNaN.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return _isNaN_js__WEBPACK_IMPORTED_MODULE_19__[\"default\"]; });\n\n/* harmony import */ var _isTypedArray_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./isTypedArray.js */ \"./node_modules/underscore/modules/isTypedArray.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isTypedArray\", function() { return _isTypedArray_js__WEBPACK_IMPORTED_MODULE_20__[\"default\"]; });\n\n/* harmony import */ var _isEmpty_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./isEmpty.js */ \"./node_modules/underscore/modules/isEmpty.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isEmpty\", function() { return _isEmpty_js__WEBPACK_IMPORTED_MODULE_21__[\"default\"]; });\n\n/* harmony import */ var _isMatch_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./isMatch.js */ \"./node_modules/underscore/modules/isMatch.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isMatch\", function() { return _isMatch_js__WEBPACK_IMPORTED_MODULE_22__[\"default\"]; });\n\n/* harmony import */ var _isEqual_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./isEqual.js */ \"./node_modules/underscore/modules/isEqual.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isEqual\", function() { return _isEqual_js__WEBPACK_IMPORTED_MODULE_23__[\"default\"]; });\n\n/* harmony import */ var _isMap_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./isMap.js */ \"./node_modules/underscore/modules/isMap.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isMap\", function() { return _isMap_js__WEBPACK_IMPORTED_MODULE_24__[\"default\"]; });\n\n/* harmony import */ var _isWeakMap_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./isWeakMap.js */ \"./node_modules/underscore/modules/isWeakMap.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isWeakMap\", function() { return _isWeakMap_js__WEBPACK_IMPORTED_MODULE_25__[\"default\"]; });\n\n/* harmony import */ var _isSet_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./isSet.js */ \"./node_modules/underscore/modules/isSet.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isSet\", function() { return _isSet_js__WEBPACK_IMPORTED_MODULE_26__[\"default\"]; });\n\n/* harmony import */ var _isWeakSet_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./isWeakSet.js */ \"./node_modules/underscore/modules/isWeakSet.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"isWeakSet\", function() { return _isWeakSet_js__WEBPACK_IMPORTED_MODULE_27__[\"default\"]; });\n\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"keys\", function() { return _keys_js__WEBPACK_IMPORTED_MODULE_28__[\"default\"]; });\n\n/* harmony import */ var _allKeys_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./allKeys.js */ \"./node_modules/underscore/modules/allKeys.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"allKeys\", function() { return _allKeys_js__WEBPACK_IMPORTED_MODULE_29__[\"default\"]; });\n\n/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./values.js */ \"./node_modules/underscore/modules/values.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"values\", function() { return _values_js__WEBPACK_IMPORTED_MODULE_30__[\"default\"]; });\n\n/* harmony import */ var _pairs_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./pairs.js */ \"./node_modules/underscore/modules/pairs.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"pairs\", function() { return _pairs_js__WEBPACK_IMPORTED_MODULE_31__[\"default\"]; });\n\n/* harmony import */ var _invert_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./invert.js */ \"./node_modules/underscore/modules/invert.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"invert\", function() { return _invert_js__WEBPACK_IMPORTED_MODULE_32__[\"default\"]; });\n\n/* harmony import */ var _functions_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./functions.js */ \"./node_modules/underscore/modules/functions.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"functions\", function() { return _functions_js__WEBPACK_IMPORTED_MODULE_33__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"methods\", function() { return _functions_js__WEBPACK_IMPORTED_MODULE_33__[\"default\"]; });\n\n/* harmony import */ var _extend_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./extend.js */ \"./node_modules/underscore/modules/extend.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return _extend_js__WEBPACK_IMPORTED_MODULE_34__[\"default\"]; });\n\n/* harmony import */ var _extendOwn_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./extendOwn.js */ \"./node_modules/underscore/modules/extendOwn.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"extendOwn\", function() { return _extendOwn_js__WEBPACK_IMPORTED_MODULE_35__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"assign\", function() { return _extendOwn_js__WEBPACK_IMPORTED_MODULE_35__[\"default\"]; });\n\n/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./defaults.js */ \"./node_modules/underscore/modules/defaults.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return _defaults_js__WEBPACK_IMPORTED_MODULE_36__[\"default\"]; });\n\n/* harmony import */ var _create_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./create.js */ \"./node_modules/underscore/modules/create.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"create\", function() { return _create_js__WEBPACK_IMPORTED_MODULE_37__[\"default\"]; });\n\n/* harmony import */ var _clone_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./clone.js */ \"./node_modules/underscore/modules/clone.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"clone\", function() { return _clone_js__WEBPACK_IMPORTED_MODULE_38__[\"default\"]; });\n\n/* harmony import */ var _tap_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./tap.js */ \"./node_modules/underscore/modules/tap.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"tap\", function() { return _tap_js__WEBPACK_IMPORTED_MODULE_39__[\"default\"]; });\n\n/* harmony import */ var _get_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./get.js */ \"./node_modules/underscore/modules/get.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"get\", function() { return _get_js__WEBPACK_IMPORTED_MODULE_40__[\"default\"]; });\n\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./has.js */ \"./node_modules/underscore/modules/has.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"has\", function() { return _has_js__WEBPACK_IMPORTED_MODULE_41__[\"default\"]; });\n\n/* harmony import */ var _mapObject_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./mapObject.js */ \"./node_modules/underscore/modules/mapObject.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"mapObject\", function() { return _mapObject_js__WEBPACK_IMPORTED_MODULE_42__[\"default\"]; });\n\n/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./identity.js */ \"./node_modules/underscore/modules/identity.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"identity\", function() { return _identity_js__WEBPACK_IMPORTED_MODULE_43__[\"default\"]; });\n\n/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./constant.js */ \"./node_modules/underscore/modules/constant.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"constant\", function() { return _constant_js__WEBPACK_IMPORTED_MODULE_44__[\"default\"]; });\n\n/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./noop.js */ \"./node_modules/underscore/modules/noop.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"noop\", function() { return _noop_js__WEBPACK_IMPORTED_MODULE_45__[\"default\"]; });\n\n/* harmony import */ var _toPath_js__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./toPath.js */ \"./node_modules/underscore/modules/toPath.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"toPath\", function() { return _toPath_js__WEBPACK_IMPORTED_MODULE_46__[\"default\"]; });\n\n/* harmony import */ var _property_js__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./property.js */ \"./node_modules/underscore/modules/property.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return _property_js__WEBPACK_IMPORTED_MODULE_47__[\"default\"]; });\n\n/* harmony import */ var _propertyOf_js__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./propertyOf.js */ \"./node_modules/underscore/modules/propertyOf.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"propertyOf\", function() { return _propertyOf_js__WEBPACK_IMPORTED_MODULE_48__[\"default\"]; });\n\n/* harmony import */ var _matcher_js__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./matcher.js */ \"./node_modules/underscore/modules/matcher.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matcher\", function() { return _matcher_js__WEBPACK_IMPORTED_MODULE_49__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matches\", function() { return _matcher_js__WEBPACK_IMPORTED_MODULE_49__[\"default\"]; });\n\n/* harmony import */ var _times_js__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./times.js */ \"./node_modules/underscore/modules/times.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"times\", function() { return _times_js__WEBPACK_IMPORTED_MODULE_50__[\"default\"]; });\n\n/* harmony import */ var _random_js__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./random.js */ \"./node_modules/underscore/modules/random.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"random\", function() { return _random_js__WEBPACK_IMPORTED_MODULE_51__[\"default\"]; });\n\n/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./now.js */ \"./node_modules/underscore/modules/now.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"now\", function() { return _now_js__WEBPACK_IMPORTED_MODULE_52__[\"default\"]; });\n\n/* harmony import */ var _escape_js__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./escape.js */ \"./node_modules/underscore/modules/escape.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"escape\", function() { return _escape_js__WEBPACK_IMPORTED_MODULE_53__[\"default\"]; });\n\n/* harmony import */ var _unescape_js__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./unescape.js */ \"./node_modules/underscore/modules/unescape.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unescape\", function() { return _unescape_js__WEBPACK_IMPORTED_MODULE_54__[\"default\"]; });\n\n/* harmony import */ var _templateSettings_js__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./templateSettings.js */ \"./node_modules/underscore/modules/templateSettings.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"templateSettings\", function() { return _templateSettings_js__WEBPACK_IMPORTED_MODULE_55__[\"default\"]; });\n\n/* harmony import */ var _template_js__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./template.js */ \"./node_modules/underscore/modules/template.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"template\", function() { return _template_js__WEBPACK_IMPORTED_MODULE_56__[\"default\"]; });\n\n/* harmony import */ var _result_js__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./result.js */ \"./node_modules/underscore/modules/result.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"result\", function() { return _result_js__WEBPACK_IMPORTED_MODULE_57__[\"default\"]; });\n\n/* harmony import */ var _uniqueId_js__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./uniqueId.js */ \"./node_modules/underscore/modules/uniqueId.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"uniqueId\", function() { return _uniqueId_js__WEBPACK_IMPORTED_MODULE_58__[\"default\"]; });\n\n/* harmony import */ var _chain_js__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./chain.js */ \"./node_modules/underscore/modules/chain.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"chain\", function() { return _chain_js__WEBPACK_IMPORTED_MODULE_59__[\"default\"]; });\n\n/* harmony import */ var _iteratee_js__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./iteratee.js */ \"./node_modules/underscore/modules/iteratee.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"iteratee\", function() { return _iteratee_js__WEBPACK_IMPORTED_MODULE_60__[\"default\"]; });\n\n/* harmony import */ var _partial_js__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./partial.js */ \"./node_modules/underscore/modules/partial.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"partial\", function() { return _partial_js__WEBPACK_IMPORTED_MODULE_61__[\"default\"]; });\n\n/* harmony import */ var _bind_js__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./bind.js */ \"./node_modules/underscore/modules/bind.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bind\", function() { return _bind_js__WEBPACK_IMPORTED_MODULE_62__[\"default\"]; });\n\n/* harmony import */ var _bindAll_js__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./bindAll.js */ \"./node_modules/underscore/modules/bindAll.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bindAll\", function() { return _bindAll_js__WEBPACK_IMPORTED_MODULE_63__[\"default\"]; });\n\n/* harmony import */ var _memoize_js__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./memoize.js */ \"./node_modules/underscore/modules/memoize.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"memoize\", function() { return _memoize_js__WEBPACK_IMPORTED_MODULE_64__[\"default\"]; });\n\n/* harmony import */ var _delay_js__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./delay.js */ \"./node_modules/underscore/modules/delay.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"delay\", function() { return _delay_js__WEBPACK_IMPORTED_MODULE_65__[\"default\"]; });\n\n/* harmony import */ var _defer_js__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./defer.js */ \"./node_modules/underscore/modules/defer.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defer\", function() { return _defer_js__WEBPACK_IMPORTED_MODULE_66__[\"default\"]; });\n\n/* harmony import */ var _throttle_js__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./throttle.js */ \"./node_modules/underscore/modules/throttle.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"throttle\", function() { return _throttle_js__WEBPACK_IMPORTED_MODULE_67__[\"default\"]; });\n\n/* harmony import */ var _debounce_js__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./debounce.js */ \"./node_modules/underscore/modules/debounce.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return _debounce_js__WEBPACK_IMPORTED_MODULE_68__[\"default\"]; });\n\n/* harmony import */ var _wrap_js__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./wrap.js */ \"./node_modules/underscore/modules/wrap.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"wrap\", function() { return _wrap_js__WEBPACK_IMPORTED_MODULE_69__[\"default\"]; });\n\n/* harmony import */ var _negate_js__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./negate.js */ \"./node_modules/underscore/modules/negate.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"negate\", function() { return _negate_js__WEBPACK_IMPORTED_MODULE_70__[\"default\"]; });\n\n/* harmony import */ var _compose_js__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./compose.js */ \"./node_modules/underscore/modules/compose.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compose\", function() { return _compose_js__WEBPACK_IMPORTED_MODULE_71__[\"default\"]; });\n\n/* harmony import */ var _after_js__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./after.js */ \"./node_modules/underscore/modules/after.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"after\", function() { return _after_js__WEBPACK_IMPORTED_MODULE_72__[\"default\"]; });\n\n/* harmony import */ var _before_js__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./before.js */ \"./node_modules/underscore/modules/before.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"before\", function() { return _before_js__WEBPACK_IMPORTED_MODULE_73__[\"default\"]; });\n\n/* harmony import */ var _once_js__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./once.js */ \"./node_modules/underscore/modules/once.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"once\", function() { return _once_js__WEBPACK_IMPORTED_MODULE_74__[\"default\"]; });\n\n/* harmony import */ var _findKey_js__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./findKey.js */ \"./node_modules/underscore/modules/findKey.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findKey\", function() { return _findKey_js__WEBPACK_IMPORTED_MODULE_75__[\"default\"]; });\n\n/* harmony import */ var _findIndex_js__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./findIndex.js */ \"./node_modules/underscore/modules/findIndex.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findIndex\", function() { return _findIndex_js__WEBPACK_IMPORTED_MODULE_76__[\"default\"]; });\n\n/* harmony import */ var _findLastIndex_js__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./findLastIndex.js */ \"./node_modules/underscore/modules/findLastIndex.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findLastIndex\", function() { return _findLastIndex_js__WEBPACK_IMPORTED_MODULE_77__[\"default\"]; });\n\n/* harmony import */ var _sortedIndex_js__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./sortedIndex.js */ \"./node_modules/underscore/modules/sortedIndex.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sortedIndex\", function() { return _sortedIndex_js__WEBPACK_IMPORTED_MODULE_78__[\"default\"]; });\n\n/* harmony import */ var _indexOf_js__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./indexOf.js */ \"./node_modules/underscore/modules/indexOf.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"indexOf\", function() { return _indexOf_js__WEBPACK_IMPORTED_MODULE_79__[\"default\"]; });\n\n/* harmony import */ var _lastIndexOf_js__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./lastIndexOf.js */ \"./node_modules/underscore/modules/lastIndexOf.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"lastIndexOf\", function() { return _lastIndexOf_js__WEBPACK_IMPORTED_MODULE_80__[\"default\"]; });\n\n/* harmony import */ var _find_js__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./find.js */ \"./node_modules/underscore/modules/find.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"find\", function() { return _find_js__WEBPACK_IMPORTED_MODULE_81__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"detect\", function() { return _find_js__WEBPACK_IMPORTED_MODULE_81__[\"default\"]; });\n\n/* harmony import */ var _findWhere_js__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./findWhere.js */ \"./node_modules/underscore/modules/findWhere.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"findWhere\", function() { return _findWhere_js__WEBPACK_IMPORTED_MODULE_82__[\"default\"]; });\n\n/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./each.js */ \"./node_modules/underscore/modules/each.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"each\", function() { return _each_js__WEBPACK_IMPORTED_MODULE_83__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"forEach\", function() { return _each_js__WEBPACK_IMPORTED_MODULE_83__[\"default\"]; });\n\n/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! ./map.js */ \"./node_modules/underscore/modules/map.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"map\", function() { return _map_js__WEBPACK_IMPORTED_MODULE_84__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"collect\", function() { return _map_js__WEBPACK_IMPORTED_MODULE_84__[\"default\"]; });\n\n/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! ./reduce.js */ \"./node_modules/underscore/modules/reduce.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"reduce\", function() { return _reduce_js__WEBPACK_IMPORTED_MODULE_85__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"foldl\", function() { return _reduce_js__WEBPACK_IMPORTED_MODULE_85__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"inject\", function() { return _reduce_js__WEBPACK_IMPORTED_MODULE_85__[\"default\"]; });\n\n/* harmony import */ var _reduceRight_js__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! ./reduceRight.js */ \"./node_modules/underscore/modules/reduceRight.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"reduceRight\", function() { return _reduceRight_js__WEBPACK_IMPORTED_MODULE_86__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"foldr\", function() { return _reduceRight_js__WEBPACK_IMPORTED_MODULE_86__[\"default\"]; });\n\n/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! ./filter.js */ \"./node_modules/underscore/modules/filter.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"filter\", function() { return _filter_js__WEBPACK_IMPORTED_MODULE_87__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return _filter_js__WEBPACK_IMPORTED_MODULE_87__[\"default\"]; });\n\n/* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! ./reject.js */ \"./node_modules/underscore/modules/reject.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"reject\", function() { return _reject_js__WEBPACK_IMPORTED_MODULE_88__[\"default\"]; });\n\n/* harmony import */ var _every_js__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(/*! ./every.js */ \"./node_modules/underscore/modules/every.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"every\", function() { return _every_js__WEBPACK_IMPORTED_MODULE_89__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"all\", function() { return _every_js__WEBPACK_IMPORTED_MODULE_89__[\"default\"]; });\n\n/* harmony import */ var _some_js__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(/*! ./some.js */ \"./node_modules/underscore/modules/some.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"some\", function() { return _some_js__WEBPACK_IMPORTED_MODULE_90__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"any\", function() { return _some_js__WEBPACK_IMPORTED_MODULE_90__[\"default\"]; });\n\n/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(/*! ./contains.js */ \"./node_modules/underscore/modules/contains.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"contains\", function() { return _contains_js__WEBPACK_IMPORTED_MODULE_91__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"includes\", function() { return _contains_js__WEBPACK_IMPORTED_MODULE_91__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"include\", function() { return _contains_js__WEBPACK_IMPORTED_MODULE_91__[\"default\"]; });\n\n/* harmony import */ var _invoke_js__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(/*! ./invoke.js */ \"./node_modules/underscore/modules/invoke.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"invoke\", function() { return _invoke_js__WEBPACK_IMPORTED_MODULE_92__[\"default\"]; });\n\n/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(/*! ./pluck.js */ \"./node_modules/underscore/modules/pluck.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"pluck\", function() { return _pluck_js__WEBPACK_IMPORTED_MODULE_93__[\"default\"]; });\n\n/* harmony import */ var _where_js__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(/*! ./where.js */ \"./node_modules/underscore/modules/where.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"where\", function() { return _where_js__WEBPACK_IMPORTED_MODULE_94__[\"default\"]; });\n\n/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(/*! ./max.js */ \"./node_modules/underscore/modules/max.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"max\", function() { return _max_js__WEBPACK_IMPORTED_MODULE_95__[\"default\"]; });\n\n/* harmony import */ var _min_js__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(/*! ./min.js */ \"./node_modules/underscore/modules/min.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"min\", function() { return _min_js__WEBPACK_IMPORTED_MODULE_96__[\"default\"]; });\n\n/* harmony import */ var _shuffle_js__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(/*! ./shuffle.js */ \"./node_modules/underscore/modules/shuffle.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shuffle\", function() { return _shuffle_js__WEBPACK_IMPORTED_MODULE_97__[\"default\"]; });\n\n/* harmony import */ var _sample_js__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(/*! ./sample.js */ \"./node_modules/underscore/modules/sample.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sample\", function() { return _sample_js__WEBPACK_IMPORTED_MODULE_98__[\"default\"]; });\n\n/* harmony import */ var _sortBy_js__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(/*! ./sortBy.js */ \"./node_modules/underscore/modules/sortBy.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sortBy\", function() { return _sortBy_js__WEBPACK_IMPORTED_MODULE_99__[\"default\"]; });\n\n/* harmony import */ var _groupBy_js__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(/*! ./groupBy.js */ \"./node_modules/underscore/modules/groupBy.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"groupBy\", function() { return _groupBy_js__WEBPACK_IMPORTED_MODULE_100__[\"default\"]; });\n\n/* harmony import */ var _indexBy_js__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(/*! ./indexBy.js */ \"./node_modules/underscore/modules/indexBy.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"indexBy\", function() { return _indexBy_js__WEBPACK_IMPORTED_MODULE_101__[\"default\"]; });\n\n/* harmony import */ var _countBy_js__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(/*! ./countBy.js */ \"./node_modules/underscore/modules/countBy.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"countBy\", function() { return _countBy_js__WEBPACK_IMPORTED_MODULE_102__[\"default\"]; });\n\n/* harmony import */ var _partition_js__WEBPACK_IMPORTED_MODULE_103__ = __webpack_require__(/*! ./partition.js */ \"./node_modules/underscore/modules/partition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"partition\", function() { return _partition_js__WEBPACK_IMPORTED_MODULE_103__[\"default\"]; });\n\n/* harmony import */ var _toArray_js__WEBPACK_IMPORTED_MODULE_104__ = __webpack_require__(/*! ./toArray.js */ \"./node_modules/underscore/modules/toArray.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"toArray\", function() { return _toArray_js__WEBPACK_IMPORTED_MODULE_104__[\"default\"]; });\n\n/* harmony import */ var _size_js__WEBPACK_IMPORTED_MODULE_105__ = __webpack_require__(/*! ./size.js */ \"./node_modules/underscore/modules/size.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"size\", function() { return _size_js__WEBPACK_IMPORTED_MODULE_105__[\"default\"]; });\n\n/* harmony import */ var _pick_js__WEBPACK_IMPORTED_MODULE_106__ = __webpack_require__(/*! ./pick.js */ \"./node_modules/underscore/modules/pick.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"pick\", function() { return _pick_js__WEBPACK_IMPORTED_MODULE_106__[\"default\"]; });\n\n/* harmony import */ var _omit_js__WEBPACK_IMPORTED_MODULE_107__ = __webpack_require__(/*! ./omit.js */ \"./node_modules/underscore/modules/omit.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"omit\", function() { return _omit_js__WEBPACK_IMPORTED_MODULE_107__[\"default\"]; });\n\n/* harmony import */ var _first_js__WEBPACK_IMPORTED_MODULE_108__ = __webpack_require__(/*! ./first.js */ \"./node_modules/underscore/modules/first.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"first\", function() { return _first_js__WEBPACK_IMPORTED_MODULE_108__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"head\", function() { return _first_js__WEBPACK_IMPORTED_MODULE_108__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"take\", function() { return _first_js__WEBPACK_IMPORTED_MODULE_108__[\"default\"]; });\n\n/* harmony import */ var _initial_js__WEBPACK_IMPORTED_MODULE_109__ = __webpack_require__(/*! ./initial.js */ \"./node_modules/underscore/modules/initial.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"initial\", function() { return _initial_js__WEBPACK_IMPORTED_MODULE_109__[\"default\"]; });\n\n/* harmony import */ var _last_js__WEBPACK_IMPORTED_MODULE_110__ = __webpack_require__(/*! ./last.js */ \"./node_modules/underscore/modules/last.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"last\", function() { return _last_js__WEBPACK_IMPORTED_MODULE_110__[\"default\"]; });\n\n/* harmony import */ var _rest_js__WEBPACK_IMPORTED_MODULE_111__ = __webpack_require__(/*! ./rest.js */ \"./node_modules/underscore/modules/rest.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"rest\", function() { return _rest_js__WEBPACK_IMPORTED_MODULE_111__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"tail\", function() { return _rest_js__WEBPACK_IMPORTED_MODULE_111__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"drop\", function() { return _rest_js__WEBPACK_IMPORTED_MODULE_111__[\"default\"]; });\n\n/* harmony import */ var _compact_js__WEBPACK_IMPORTED_MODULE_112__ = __webpack_require__(/*! ./compact.js */ \"./node_modules/underscore/modules/compact.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compact\", function() { return _compact_js__WEBPACK_IMPORTED_MODULE_112__[\"default\"]; });\n\n/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_113__ = __webpack_require__(/*! ./flatten.js */ \"./node_modules/underscore/modules/flatten.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flatten\", function() { return _flatten_js__WEBPACK_IMPORTED_MODULE_113__[\"default\"]; });\n\n/* harmony import */ var _without_js__WEBPACK_IMPORTED_MODULE_114__ = __webpack_require__(/*! ./without.js */ \"./node_modules/underscore/modules/without.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"without\", function() { return _without_js__WEBPACK_IMPORTED_MODULE_114__[\"default\"]; });\n\n/* harmony import */ var _uniq_js__WEBPACK_IMPORTED_MODULE_115__ = __webpack_require__(/*! ./uniq.js */ \"./node_modules/underscore/modules/uniq.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"uniq\", function() { return _uniq_js__WEBPACK_IMPORTED_MODULE_115__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unique\", function() { return _uniq_js__WEBPACK_IMPORTED_MODULE_115__[\"default\"]; });\n\n/* harmony import */ var _union_js__WEBPACK_IMPORTED_MODULE_116__ = __webpack_require__(/*! ./union.js */ \"./node_modules/underscore/modules/union.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"union\", function() { return _union_js__WEBPACK_IMPORTED_MODULE_116__[\"default\"]; });\n\n/* harmony import */ var _intersection_js__WEBPACK_IMPORTED_MODULE_117__ = __webpack_require__(/*! ./intersection.js */ \"./node_modules/underscore/modules/intersection.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"intersection\", function() { return _intersection_js__WEBPACK_IMPORTED_MODULE_117__[\"default\"]; });\n\n/* harmony import */ var _difference_js__WEBPACK_IMPORTED_MODULE_118__ = __webpack_require__(/*! ./difference.js */ \"./node_modules/underscore/modules/difference.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"difference\", function() { return _difference_js__WEBPACK_IMPORTED_MODULE_118__[\"default\"]; });\n\n/* harmony import */ var _unzip_js__WEBPACK_IMPORTED_MODULE_119__ = __webpack_require__(/*! ./unzip.js */ \"./node_modules/underscore/modules/unzip.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unzip\", function() { return _unzip_js__WEBPACK_IMPORTED_MODULE_119__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"transpose\", function() { return _unzip_js__WEBPACK_IMPORTED_MODULE_119__[\"default\"]; });\n\n/* harmony import */ var _zip_js__WEBPACK_IMPORTED_MODULE_120__ = __webpack_require__(/*! ./zip.js */ \"./node_modules/underscore/modules/zip.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"zip\", function() { return _zip_js__WEBPACK_IMPORTED_MODULE_120__[\"default\"]; });\n\n/* harmony import */ var _object_js__WEBPACK_IMPORTED_MODULE_121__ = __webpack_require__(/*! ./object.js */ \"./node_modules/underscore/modules/object.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"object\", function() { return _object_js__WEBPACK_IMPORTED_MODULE_121__[\"default\"]; });\n\n/* harmony import */ var _range_js__WEBPACK_IMPORTED_MODULE_122__ = __webpack_require__(/*! ./range.js */ \"./node_modules/underscore/modules/range.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"range\", function() { return _range_js__WEBPACK_IMPORTED_MODULE_122__[\"default\"]; });\n\n/* harmony import */ var _chunk_js__WEBPACK_IMPORTED_MODULE_123__ = __webpack_require__(/*! ./chunk.js */ \"./node_modules/underscore/modules/chunk.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"chunk\", function() { return _chunk_js__WEBPACK_IMPORTED_MODULE_123__[\"default\"]; });\n\n/* harmony import */ var _mixin_js__WEBPACK_IMPORTED_MODULE_124__ = __webpack_require__(/*! ./mixin.js */ \"./node_modules/underscore/modules/mixin.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"mixin\", function() { return _mixin_js__WEBPACK_IMPORTED_MODULE_124__[\"default\"]; });\n\n/* harmony import */ var _underscore_array_methods_js__WEBPACK_IMPORTED_MODULE_125__ = __webpack_require__(/*! ./underscore-array-methods.js */ \"./node_modules/underscore/modules/underscore-array-methods.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _underscore_array_methods_js__WEBPACK_IMPORTED_MODULE_125__[\"default\"]; });\n\n// Named Exports\n// =============\n//     Underscore.js 1.13.6\n//     https://underscorejs.org\n//     (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n// Baseline setup.\n\n // Object Functions\n// ----------------\n// Our most fundamental functions operate on any JavaScript object.\n// Most functions in Underscore depend on at least one function in this section.\n// A group of functions that check the types of core JavaScript values.\n// These are often informally referred to as the \"isType\" functions.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // Functions that treat an object as a dictionary of key-value pairs.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // Utility Functions\n// -----------------\n// A bit of a grab bag: Predicate-generating functions for use with filters and\n// loops, string escaping and templating, create random numbers and unique ids,\n// and functions that facilitate Underscore's chaining and iteration conventions.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // Function (ahem) Functions\n// -------------------------\n// These functions take a function as an argument and return a new function\n// as the result. Also known as higher-order functions.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // Finders\n// -------\n// Functions that extract (the position of) a single element from an object\n// or array based on some criterion.\n\n\n\n\n\n\n\n\n // Collection Functions\n// --------------------\n// Functions that work on any collection of elements: either an array, or\n// an object of key-value pairs.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // `_.pick` and `_.omit` are actually object functions, but we put\n// them here in order to create a more natural reading order in the\n// monolithic build as they depend on `_.contains`.\n\n\n // Array Functions\n// ---------------\n// Functions that operate on arrays (and array-likes) only, because they’re\n// expressed in terms of operations on an ordered list of values.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // OOP\n// ---\n// These modules support the \"object-oriented\" calling style. See also\n// `underscore.js` and `index-default.js`.\n\n\n\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/index.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/indexBy.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/indexBy.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _group_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_group.js */ \"./node_modules/underscore/modules/_group.js\");\n // Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n// when you know that your index values will be unique.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_group_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (result, value, key) {\n  result[key] = value;\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/indexBy.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/indexOf.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/indexOf.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _sortedIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sortedIndex.js */ \"./node_modules/underscore/modules/sortedIndex.js\");\n/* harmony import */ var _findIndex_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./findIndex.js */ \"./node_modules/underscore/modules/findIndex.js\");\n/* harmony import */ var _createIndexFinder_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_createIndexFinder.js */ \"./node_modules/underscore/modules/_createIndexFinder.js\");\n\n\n // Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createIndexFinder_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(1, _findIndex_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _sortedIndex_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/indexOf.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/initial.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/initial.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return initial; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\n\nfunction initial(array, n, guard) {\n  return _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"slice\"].call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/initial.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/intersection.js":
/*!*********************************************************!*\
  !*** ./node_modules/underscore/modules/intersection.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return intersection; });\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contains.js */ \"./node_modules/underscore/modules/contains.js\");\n\n // Produce an array that contains every item shared between all the\n// passed-in arrays.\n\nfunction intersection(array) {\n  var result = [];\n  var argsLength = arguments.length;\n\n  for (var i = 0, length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(array); i < length; i++) {\n    var item = array[i];\n    if (Object(_contains_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(result, item)) continue;\n    var j;\n\n    for (j = 1; j < argsLength; j++) {\n      if (!Object(_contains_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arguments[j], item)) break;\n    }\n\n    if (j === argsLength) result.push(item);\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/intersection.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/invert.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/invert.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return invert; });\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n // Invert the keys and values of an object. The values must be serializable.\n\nfunction invert(obj) {\n  var result = {};\n\n  var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj);\n\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    result[obj[_keys[i]]] = _keys[i];\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/invert.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/invoke.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/invoke.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map.js */ \"./node_modules/underscore/modules/map.js\");\n/* harmony import */ var _deepGet_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_deepGet.js */ \"./node_modules/underscore/modules/_deepGet.js\");\n/* harmony import */ var _toPath_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_toPath.js */ \"./node_modules/underscore/modules/_toPath.js\");\n\n\n\n\n // Invoke a method (with arguments) on every item in a collection.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (obj, path, args) {\n  var contextPath, func;\n\n  if (Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(path)) {\n    func = path;\n  } else {\n    path = Object(_toPath_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(path);\n    contextPath = path.slice(0, -1);\n    path = path[path.length - 1];\n  }\n\n  return Object(_map_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj, function (context) {\n    var method = func;\n\n    if (!method) {\n      if (contextPath && contextPath.length) {\n        context = Object(_deepGet_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(context, contextPath);\n      }\n\n      if (context == null) return void 0;\n      method = context[path];\n    }\n\n    return method == null ? method : method.apply(context, args);\n  });\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/invoke.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isArguments.js":
/*!********************************************************!*\
  !*** ./node_modules/underscore/modules/isArguments.js ***!
  \********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n\n\nvar isArguments = Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Arguments'); // Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n\n(function () {\n  if (!isArguments(arguments)) {\n    isArguments = function isArguments(obj) {\n      return Object(_has_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj, 'callee');\n    };\n  }\n})();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (isArguments);\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isArguments.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isArray.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/isArray.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n // Is a given value an array?\n// Delegates to ECMA5's native `Array.isArray`.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_setup_js__WEBPACK_IMPORTED_MODULE_0__[\"nativeIsArray\"] || Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('Array'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isArray.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isArrayBuffer.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/isArrayBuffer.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('ArrayBuffer'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isArrayBuffer.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isBoolean.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/isBoolean.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isBoolean; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // Is a given value a boolean?\n\nfunction isBoolean(obj) {\n  return obj === true || obj === false || _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"toString\"].call(obj) === '[object Boolean]';\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isBoolean.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isDataView.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/isDataView.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _isArrayBuffer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArrayBuffer.js */ \"./node_modules/underscore/modules/isArrayBuffer.js\");\n/* harmony import */ var _stringTagBug_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_stringTagBug.js */ \"./node_modules/underscore/modules/_stringTagBug.js\");\n\n\n\n\nvar isDataView = Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('DataView'); // In IE 10 - Edge 13, we need a different heuristic\n// to determine whether an object is a `DataView`.\n\nfunction ie10IsDataView(obj) {\n  return obj != null && Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj.getInt8) && Object(_isArrayBuffer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj.buffer);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_stringTagBug_js__WEBPACK_IMPORTED_MODULE_3__[\"hasStringTagBug\"] ? ie10IsDataView : isDataView);\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isDataView.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isDate.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/isDate.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Date'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isDate.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isElement.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/isElement.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isElement; });\n// Is a given value a DOM element?\nfunction isElement(obj) {\n  return !!(obj && obj.nodeType === 1);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isElement.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isEmpty.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/isEmpty.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isEmpty; });\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArray.js */ \"./node_modules/underscore/modules/isArray.js\");\n/* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isString.js */ \"./node_modules/underscore/modules/isString.js\");\n/* harmony import */ var _isArguments_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArguments.js */ \"./node_modules/underscore/modules/isArguments.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n\n\n\n // Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\n\nfunction isEmpty(obj) {\n  if (obj == null) return true; // Skip the more expensive `toString`-based type checks if `obj` has no\n  // `.length`.\n\n  var length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj);\n  if (typeof length == 'number' && (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) || Object(_isString_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj) || Object(_isArguments_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj))) return length === 0;\n  return Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_keys_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(obj)) === 0;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isEmpty.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isEqual.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/isEqual.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isEqual; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _getByteLength_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_getByteLength.js */ \"./node_modules/underscore/modules/_getByteLength.js\");\n/* harmony import */ var _isTypedArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isTypedArray.js */ \"./node_modules/underscore/modules/isTypedArray.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _stringTagBug_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_stringTagBug.js */ \"./node_modules/underscore/modules/_stringTagBug.js\");\n/* harmony import */ var _isDataView_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isDataView.js */ \"./node_modules/underscore/modules/isDataView.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n/* harmony import */ var _toBufferView_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./_toBufferView.js */ \"./node_modules/underscore/modules/_toBufferView.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n\n\n\n\n\n\n\n\n\n // We use this string twice, so give it a name for minification.\n\nvar tagDataView = '[object DataView]'; // Internal recursive comparison function for `_.isEqual`.\n\nfunction eq(a, b, aStack, bStack) {\n  // Identical objects are equal. `0 === -0`, but they aren't identical.\n  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n  if (a === b) return a !== 0 || 1 / a === 1 / b; // `null` or `undefined` only equal to itself (strict comparison).\n\n  if (a == null || b == null) return false; // `NaN`s are equivalent, but non-reflexive.\n\n  if (a !== a) return b !== b; // Exhaust primitive checks\n\n  var type = _typeof(a);\n\n  if (type !== 'function' && type !== 'object' && _typeof(b) != 'object') return false;\n  return deepEq(a, b, aStack, bStack);\n} // Internal recursive comparison function for `_.isEqual`.\n\n\nfunction deepEq(a, b, aStack, bStack) {\n  // Unwrap any wrapped objects.\n  if (a instanceof _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) a = a._wrapped;\n  if (b instanceof _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) b = b._wrapped; // Compare `[[Class]]` names.\n\n  var className = _setup_js__WEBPACK_IMPORTED_MODULE_1__[\"toString\"].call(a);\n  if (className !== _setup_js__WEBPACK_IMPORTED_MODULE_1__[\"toString\"].call(b)) return false; // Work around a bug in IE 10 - Edge 13.\n\n  if (_stringTagBug_js__WEBPACK_IMPORTED_MODULE_5__[\"hasStringTagBug\"] && className == '[object Object]' && Object(_isDataView_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(a)) {\n    if (!Object(_isDataView_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(b)) return false;\n    className = tagDataView;\n  }\n\n  switch (className) {\n    // These types are compared by value.\n    case '[object RegExp]': // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n\n    case '[object String]':\n      // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n      // equivalent to `new String(\"5\")`.\n      return '' + a === '' + b;\n\n    case '[object Number]':\n      // `NaN`s are equivalent, but non-reflexive.\n      // Object(NaN) is equivalent to NaN.\n      if (+a !== +a) return +b !== +b; // An `egal` comparison is performed for other numeric values.\n\n      return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n\n    case '[object Date]':\n    case '[object Boolean]':\n      // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n      // millisecond representations. Note that invalid dates with millisecond representations\n      // of `NaN` are not equivalent.\n      return +a === +b;\n\n    case '[object Symbol]':\n      return _setup_js__WEBPACK_IMPORTED_MODULE_1__[\"SymbolProto\"].valueOf.call(a) === _setup_js__WEBPACK_IMPORTED_MODULE_1__[\"SymbolProto\"].valueOf.call(b);\n\n    case '[object ArrayBuffer]':\n    case tagDataView:\n      // Coerce to typed array so we can fall through.\n      return deepEq(Object(_toBufferView_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(a), Object(_toBufferView_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(b), aStack, bStack);\n  }\n\n  var areArrays = className === '[object Array]';\n\n  if (!areArrays && Object(_isTypedArray_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(a)) {\n    var byteLength = Object(_getByteLength_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(a);\n    if (byteLength !== Object(_getByteLength_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(b)) return false;\n    if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;\n    areArrays = true;\n  }\n\n  if (!areArrays) {\n    if (_typeof(a) != 'object' || _typeof(b) != 'object') return false; // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n    // from different frames are.\n\n    var aCtor = a.constructor,\n        bCtor = b.constructor;\n\n    if (aCtor !== bCtor && !(Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(aCtor) && aCtor instanceof aCtor && Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(bCtor) && bCtor instanceof bCtor) && 'constructor' in a && 'constructor' in b) {\n      return false;\n    }\n  } // Assume equality for cyclic structures. The algorithm for detecting cyclic\n  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n  // Initializing stack of traversed objects.\n  // It's done here since we only need them for objects and arrays comparison.\n\n\n  aStack = aStack || [];\n  bStack = bStack || [];\n  var length = aStack.length;\n\n  while (length--) {\n    // Linear search. Performance is inversely proportional to the number of\n    // unique nested structures.\n    if (aStack[length] === a) return bStack[length] === b;\n  } // Add the first object to the stack of traversed objects.\n\n\n  aStack.push(a);\n  bStack.push(b); // Recursively compare objects and arrays.\n\n  if (areArrays) {\n    // Compare array lengths to determine if a deep comparison is necessary.\n    length = a.length;\n    if (length !== b.length) return false; // Deep compare the contents, ignoring non-numeric properties.\n\n    while (length--) {\n      if (!eq(a[length], b[length], aStack, bStack)) return false;\n    }\n  } else {\n    // Deep compare objects.\n    var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(a),\n        key;\n\n    length = _keys.length; // Ensure that both objects contain the same number of properties before comparing deep equality.\n\n    if (Object(_keys_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(b).length !== length) return false;\n\n    while (length--) {\n      // Deep compare each member\n      key = _keys[length];\n      if (!(Object(_has_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n    }\n  } // Remove the first object from the stack of traversed objects.\n\n\n  aStack.pop();\n  bStack.pop();\n  return true;\n} // Perform a deep comparison to check if two objects are equal.\n\n\nfunction isEqual(a, b) {\n  return eq(a, b);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isEqual.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isError.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/isError.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Error'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isError.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isFinite.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/isFinite.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isFinite; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isSymbol.js */ \"./node_modules/underscore/modules/isSymbol.js\");\n\n // Is a given object a finite number?\n\nfunction isFinite(obj) {\n  return !Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) && Object(_setup_js__WEBPACK_IMPORTED_MODULE_0__[\"_isFinite\"])(obj) && !isNaN(parseFloat(obj));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isFinite.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isFunction.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/isFunction.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n\n\nvar isFunction = Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Function'); // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\n\nvar nodelist = _setup_js__WEBPACK_IMPORTED_MODULE_1__[\"root\"].document && _setup_js__WEBPACK_IMPORTED_MODULE_1__[\"root\"].document.childNodes;\n\nif ( true && (typeof Int8Array === \"undefined\" ? \"undefined\" : _typeof(Int8Array)) != 'object' && typeof nodelist != 'function') {\n  isFunction = function isFunction(obj) {\n    return typeof obj == 'function' || false;\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (isFunction);\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isFunction.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isMap.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/isMap.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n/* harmony import */ var _stringTagBug_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_stringTagBug.js */ \"./node_modules/underscore/modules/_stringTagBug.js\");\n/* harmony import */ var _methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_methodFingerprint.js */ \"./node_modules/underscore/modules/_methodFingerprint.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_stringTagBug_js__WEBPACK_IMPORTED_MODULE_1__[\"isIE11\"] ? Object(_methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__[\"ie11fingerprint\"])(_methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__[\"mapMethods\"]) : Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Map'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isMap.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isMatch.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/isMatch.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isMatch; });\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n // Returns whether an object has a given set of `key:value` pairs.\n\nfunction isMatch(object, attrs) {\n  var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(attrs),\n      length = _keys.length;\n\n  if (object == null) return !length;\n  var obj = Object(object);\n\n  for (var i = 0; i < length; i++) {\n    var key = _keys[i];\n    if (attrs[key] !== obj[key] || !(key in obj)) return false;\n  }\n\n  return true;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isMatch.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isNaN.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/isNaN.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isNaN; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _isNumber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isNumber.js */ \"./node_modules/underscore/modules/isNumber.js\");\n\n // Is the given value `NaN`?\n\nfunction isNaN(obj) {\n  return Object(_isNumber_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) && Object(_setup_js__WEBPACK_IMPORTED_MODULE_0__[\"_isNaN\"])(obj);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isNaN.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isNull.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/isNull.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isNull; });\n// Is a given value equal to null?\nfunction isNull(obj) {\n  return obj === null;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isNull.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isNumber.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/isNumber.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Number'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isNumber.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isObject.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/isObject.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isObject; });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n// Is a given variable an object?\nfunction isObject(obj) {\n  var type = _typeof(obj);\n\n  return type === 'function' || type === 'object' && !!obj;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isObject.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isRegExp.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/isRegExp.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('RegExp'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isRegExp.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isSet.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/isSet.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n/* harmony import */ var _stringTagBug_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_stringTagBug.js */ \"./node_modules/underscore/modules/_stringTagBug.js\");\n/* harmony import */ var _methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_methodFingerprint.js */ \"./node_modules/underscore/modules/_methodFingerprint.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_stringTagBug_js__WEBPACK_IMPORTED_MODULE_1__[\"isIE11\"] ? Object(_methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__[\"ie11fingerprint\"])(_methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__[\"setMethods\"]) : Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Set'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isSet.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isString.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/isString.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('String'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isString.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isSymbol.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/isSymbol.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('Symbol'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isSymbol.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isTypedArray.js":
/*!*********************************************************!*\
  !*** ./node_modules/underscore/modules/isTypedArray.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _isDataView_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isDataView.js */ \"./node_modules/underscore/modules/isDataView.js\");\n/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constant.js */ \"./node_modules/underscore/modules/constant.js\");\n/* harmony import */ var _isBufferLike_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_isBufferLike.js */ \"./node_modules/underscore/modules/_isBufferLike.js\");\n\n\n\n // Is a given value a typed array?\n\nvar typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\n\nfunction isTypedArray(obj) {\n  // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n  // Otherwise, fall back on the above regular expression.\n  return _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"nativeIsView\"] ? Object(_setup_js__WEBPACK_IMPORTED_MODULE_0__[\"nativeIsView\"])(obj) && !Object(_isDataView_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) : Object(_isBufferLike_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj) && typedArrayPattern.test(_setup_js__WEBPACK_IMPORTED_MODULE_0__[\"toString\"].call(obj));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_setup_js__WEBPACK_IMPORTED_MODULE_0__[\"supportsArrayBuffer\"] ? isTypedArray : Object(_constant_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isTypedArray.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isUndefined.js":
/*!********************************************************!*\
  !*** ./node_modules/underscore/modules/isUndefined.js ***!
  \********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isUndefined; });\n// Is a given variable undefined?\nfunction isUndefined(obj) {\n  return obj === void 0;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isUndefined.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isWeakMap.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/isWeakMap.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n/* harmony import */ var _stringTagBug_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_stringTagBug.js */ \"./node_modules/underscore/modules/_stringTagBug.js\");\n/* harmony import */ var _methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_methodFingerprint.js */ \"./node_modules/underscore/modules/_methodFingerprint.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_stringTagBug_js__WEBPACK_IMPORTED_MODULE_1__[\"isIE11\"] ? Object(_methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__[\"ie11fingerprint\"])(_methodFingerprint_js__WEBPACK_IMPORTED_MODULE_2__[\"weakMapMethods\"]) : Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('WeakMap'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isWeakMap.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/isWeakSet.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/isWeakSet.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _tagTester_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_tagTester.js */ \"./node_modules/underscore/modules/_tagTester.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_tagTester_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('WeakSet'));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/isWeakSet.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/iteratee.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/iteratee.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return iteratee; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIteratee.js */ \"./node_modules/underscore/modules/_baseIteratee.js\");\n\n // External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only `argCount` argument.\n\nfunction iteratee(value, context) {\n  return Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(value, context, Infinity);\n}\n_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].iteratee = iteratee;\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/iteratee.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/keys.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/keys.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return keys; });\n/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ \"./node_modules/underscore/modules/isObject.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n/* harmony import */ var _collectNonEnumProps_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_collectNonEnumProps.js */ \"./node_modules/underscore/modules/_collectNonEnumProps.js\");\n\n\n\n // Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\n\nfunction keys(obj) {\n  if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj)) return [];\n  if (_setup_js__WEBPACK_IMPORTED_MODULE_1__[\"nativeKeys\"]) return Object(_setup_js__WEBPACK_IMPORTED_MODULE_1__[\"nativeKeys\"])(obj);\n  var keys = [];\n\n  for (var key in obj) {\n    if (Object(_has_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj, key)) keys.push(key);\n  } // Ahem, IE < 9.\n\n\n  if (_setup_js__WEBPACK_IMPORTED_MODULE_1__[\"hasEnumBug\"]) Object(_collectNonEnumProps_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj, keys);\n  return keys;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/keys.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/last.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/last.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return last; });\n/* harmony import */ var _rest_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rest.js */ \"./node_modules/underscore/modules/rest.js\");\n // Get the last element of an array. Passing **n** will return the last N\n// values in the array.\n\nfunction last(array, n, guard) {\n  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n  if (n == null || guard) return array[array.length - 1];\n  return Object(_rest_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(array, Math.max(0, array.length - n));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/last.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/lastIndexOf.js":
/*!********************************************************!*\
  !*** ./node_modules/underscore/modules/lastIndexOf.js ***!
  \********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _findLastIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./findLastIndex.js */ \"./node_modules/underscore/modules/findLastIndex.js\");\n/* harmony import */ var _createIndexFinder_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createIndexFinder.js */ \"./node_modules/underscore/modules/_createIndexFinder.js\");\n\n // Return the position of the last occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createIndexFinder_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(-1, _findLastIndex_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/lastIndexOf.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/map.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/map.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return map; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n\n // Return the results of applying the iteratee to each element.\n\nfunction map(obj, iteratee, context) {\n  iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(iteratee, context);\n\n  var _keys = !Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) && Object(_keys_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj),\n      length = (_keys || obj).length,\n      results = Array(length);\n\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    results[index] = iteratee(obj[currentKey], currentKey, obj);\n  }\n\n  return results;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/map.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/mapObject.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/mapObject.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return mapObject; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n // Returns the results of applying the `iteratee` to each element of `obj`.\n// In contrast to `_.map` it returns an object.\n\nfunction mapObject(obj, iteratee, context) {\n  iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(iteratee, context);\n\n  var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj),\n      length = _keys.length,\n      results = {};\n\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys[index];\n    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n  }\n\n  return results;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/mapObject.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/matcher.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/matcher.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return matcher; });\n/* harmony import */ var _extendOwn_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./extendOwn.js */ \"./node_modules/underscore/modules/extendOwn.js\");\n/* harmony import */ var _isMatch_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isMatch.js */ \"./node_modules/underscore/modules/isMatch.js\");\n\n // Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\n\nfunction matcher(attrs) {\n  attrs = Object(_extendOwn_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, attrs);\n  return function (obj) {\n    return Object(_isMatch_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj, attrs);\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/matcher.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/max.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/max.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return max; });\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./values.js */ \"./node_modules/underscore/modules/values.js\");\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./each.js */ \"./node_modules/underscore/modules/each.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n\n\n\n // Return the maximum element (or element-based computation).\n\nfunction max(obj, iteratee, context) {\n  var result = -Infinity,\n      lastComputed = -Infinity,\n      value,\n      computed;\n\n  if (iteratee == null || typeof iteratee == 'number' && _typeof(obj[0]) != 'object' && obj != null) {\n    obj = Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj) ? obj : Object(_values_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj);\n\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n\n      if (value != null && value > result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(iteratee, context);\n    Object(_each_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj, function (v, index, list) {\n      computed = iteratee(v, index, list);\n\n      if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/max.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/memoize.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/memoize.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return memoize; });\n/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_has.js */ \"./node_modules/underscore/modules/_has.js\");\n // Memoize an expensive function by storing its results.\n\nfunction memoize(func, hasher) {\n  var memoize = function memoize(key) {\n    var cache = memoize.cache;\n    var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n    if (!Object(_has_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(cache, address)) cache[address] = func.apply(this, arguments);\n    return cache[address];\n  };\n\n  memoize.cache = {};\n  return memoize;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/memoize.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/min.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/min.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return min; });\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./values.js */ \"./node_modules/underscore/modules/values.js\");\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./each.js */ \"./node_modules/underscore/modules/each.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n\n\n\n // Return the minimum element (or element-based computation).\n\nfunction min(obj, iteratee, context) {\n  var result = Infinity,\n      lastComputed = Infinity,\n      value,\n      computed;\n\n  if (iteratee == null || typeof iteratee == 'number' && _typeof(obj[0]) != 'object' && obj != null) {\n    obj = Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj) ? obj : Object(_values_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj);\n\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n\n      if (value != null && value < result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(iteratee, context);\n    Object(_each_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj, function (v, index, list) {\n      computed = iteratee(v, index, list);\n\n      if (computed < lastComputed || computed === Infinity && result === Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/min.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/mixin.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/mixin.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return mixin; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./each.js */ \"./node_modules/underscore/modules/each.js\");\n/* harmony import */ var _functions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./functions.js */ \"./node_modules/underscore/modules/functions.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _chainResult_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_chainResult.js */ \"./node_modules/underscore/modules/_chainResult.js\");\n\n\n\n\n // Add your own custom functions to the Underscore object.\n\nfunction mixin(obj) {\n  Object(_each_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_functions_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj), function (name) {\n    var func = _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"][name] = obj[name];\n\n    _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype[name] = function () {\n      var args = [this._wrapped];\n      _setup_js__WEBPACK_IMPORTED_MODULE_3__[\"push\"].apply(args, arguments);\n      return Object(_chainResult_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(this, func.apply(_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"], args));\n    };\n  });\n  return _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/mixin.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/negate.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/negate.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return negate; });\n// Returns a negated version of the passed-in predicate.\nfunction negate(predicate) {\n  return function () {\n    return !predicate.apply(this, arguments);\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/negate.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/noop.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/noop.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return noop; });\n// Predicate-generating function. Often useful outside of Underscore.\nfunction noop() {}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/noop.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/now.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/now.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// A (possibly faster) way to get the current timestamp as an integer.\n/* harmony default export */ __webpack_exports__[\"default\"] = (Date.now || function () {\n  return new Date().getTime();\n});\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/now.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/object.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/object.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return object; });\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n // Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of `_.pairs`.\n\nfunction object(list, values) {\n  var result = {};\n\n  for (var i = 0, length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(list); i < length; i++) {\n    if (values) {\n      result[list[i]] = values[i];\n    } else {\n      result[list[i][0]] = list[i][1];\n    }\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/object.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/omit.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/omit.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _negate_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./negate.js */ \"./node_modules/underscore/modules/negate.js\");\n/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map.js */ \"./node_modules/underscore/modules/map.js\");\n/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_flatten.js */ \"./node_modules/underscore/modules/_flatten.js\");\n/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contains.js */ \"./node_modules/underscore/modules/contains.js\");\n/* harmony import */ var _pick_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pick.js */ \"./node_modules/underscore/modules/pick.js\");\n\n\n\n\n\n\n // Return a copy of the object without the disallowed properties.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (obj, keys) {\n  var iteratee = keys[0],\n      context;\n\n  if (Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(iteratee)) {\n    iteratee = Object(_negate_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(iteratee);\n    if (keys.length > 1) context = keys[1];\n  } else {\n    keys = Object(_map_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(Object(_flatten_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(keys, false, false), String);\n\n    iteratee = function iteratee(value, key) {\n      return !Object(_contains_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(keys, key);\n    };\n  }\n\n  return Object(_pick_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(obj, iteratee, context);\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/omit.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/once.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/once.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _partial_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./partial.js */ \"./node_modules/underscore/modules/partial.js\");\n/* harmony import */ var _before_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./before.js */ \"./node_modules/underscore/modules/before.js\");\n\n // Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_partial_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_before_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], 2));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/once.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/pairs.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/pairs.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return pairs; });\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n // Convert an object into a list of `[key, value]` pairs.\n// The opposite of `_.object` with one argument.\n\nfunction pairs(obj) {\n  var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj);\n\n  var length = _keys.length;\n  var pairs = Array(length);\n\n  for (var i = 0; i < length; i++) {\n    pairs[i] = [_keys[i], obj[_keys[i]]];\n  }\n\n  return pairs;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/pairs.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/partial.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/partial.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _executeBound_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_executeBound.js */ \"./node_modules/underscore/modules/_executeBound.js\");\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n\n\n // Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. `_` acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\n\nvar partial = Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (func, boundArgs) {\n  var placeholder = partial.placeholder;\n\n  var bound = function bound() {\n    var position = 0,\n        length = boundArgs.length;\n    var args = Array(length);\n\n    for (var i = 0; i < length; i++) {\n      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n    }\n\n    while (position < arguments.length) {\n      args.push(arguments[position++]);\n    }\n\n    return Object(_executeBound_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(func, bound, this, this, args);\n  };\n\n  return bound;\n});\npartial.placeholder = _underscore_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (partial);\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/partial.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/partition.js":
/*!******************************************************!*\
  !*** ./node_modules/underscore/modules/partition.js ***!
  \******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _group_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_group.js */ \"./node_modules/underscore/modules/_group.js\");\n // Split a collection into two arrays: one whose elements all pass the given\n// truth test, and one whose elements all do not pass the truth test.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_group_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (result, value, pass) {\n  result[pass ? 0 : 1].push(value);\n}, true));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/partition.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/pick.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/pick.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _optimizeCb_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_optimizeCb.js */ \"./node_modules/underscore/modules/_optimizeCb.js\");\n/* harmony import */ var _allKeys_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./allKeys.js */ \"./node_modules/underscore/modules/allKeys.js\");\n/* harmony import */ var _keyInObj_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_keyInObj.js */ \"./node_modules/underscore/modules/_keyInObj.js\");\n/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_flatten.js */ \"./node_modules/underscore/modules/_flatten.js\");\n\n\n\n\n\n // Return a copy of the object only containing the allowed properties.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (obj, keys) {\n  var result = {},\n      iteratee = keys[0];\n  if (obj == null) return result;\n\n  if (Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(iteratee)) {\n    if (keys.length > 1) iteratee = Object(_optimizeCb_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(iteratee, keys[1]);\n    keys = Object(_allKeys_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj);\n  } else {\n    iteratee = _keyInObj_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"];\n    keys = Object(_flatten_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(keys, false, false);\n    obj = Object(obj);\n  }\n\n  for (var i = 0, length = keys.length; i < length; i++) {\n    var key = keys[i];\n    var value = obj[key];\n    if (iteratee(value, key, obj)) result[key] = value;\n  }\n\n  return result;\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/pick.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/pluck.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/pluck.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return pluck; });\n/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map.js */ \"./node_modules/underscore/modules/map.js\");\n/* harmony import */ var _property_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./property.js */ \"./node_modules/underscore/modules/property.js\");\n\n // Convenience version of a common use case of `_.map`: fetching a property.\n\nfunction pluck(obj, key) {\n  return Object(_map_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj, Object(_property_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(key));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/pluck.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/property.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/property.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return property; });\n/* harmony import */ var _deepGet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_deepGet.js */ \"./node_modules/underscore/modules/_deepGet.js\");\n/* harmony import */ var _toPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_toPath.js */ \"./node_modules/underscore/modules/_toPath.js\");\n\n // Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indices.\n\nfunction property(path) {\n  path = Object(_toPath_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(path);\n  return function (obj) {\n    return Object(_deepGet_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj, path);\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/property.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/propertyOf.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/propertyOf.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return propertyOf; });\n/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./noop.js */ \"./node_modules/underscore/modules/noop.js\");\n/* harmony import */ var _get_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get.js */ \"./node_modules/underscore/modules/get.js\");\n\n // Generates a function for a given object that returns a given property.\n\nfunction propertyOf(obj) {\n  if (obj == null) return _noop_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n  return function (path) {\n    return Object(_get_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj, path);\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/propertyOf.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/random.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/random.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return random; });\n// Return a random integer between `min` and `max` (inclusive).\nfunction random(min, max) {\n  if (max == null) {\n    max = min;\n    min = 0;\n  }\n\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/random.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/range.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/range.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return range; });\n// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nfunction range(start, stop, step) {\n  if (stop == null) {\n    stop = start || 0;\n    start = 0;\n  }\n\n  if (!step) {\n    step = stop < start ? -1 : 1;\n  }\n\n  var length = Math.max(Math.ceil((stop - start) / step), 0);\n  var range = Array(length);\n\n  for (var idx = 0; idx < length; idx++, start += step) {\n    range[idx] = start;\n  }\n\n  return range;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/range.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/reduce.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/reduce.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createReduce.js */ \"./node_modules/underscore/modules/_createReduce.js\");\n // **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createReduce_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(1));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/reduce.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/reduceRight.js":
/*!********************************************************!*\
  !*** ./node_modules/underscore/modules/reduceRight.js ***!
  \********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createReduce.js */ \"./node_modules/underscore/modules/_createReduce.js\");\n // The right-associative version of reduce, also known as `foldr`.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createReduce_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(-1));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/reduceRight.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/reject.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/reject.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return reject; });\n/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./filter.js */ \"./node_modules/underscore/modules/filter.js\");\n/* harmony import */ var _negate_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./negate.js */ \"./node_modules/underscore/modules/negate.js\");\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n\n\n // Return all the elements for which a truth test fails.\n\nfunction reject(obj, predicate, context) {\n  return Object(_filter_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj, Object(_negate_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_cb_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(predicate)), context);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/reject.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/rest.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/rest.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return rest; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // Returns everything but the first entry of the `array`. Especially useful on\n// the `arguments` object. Passing an **n** will return the rest N values in the\n// `array`.\n\nfunction rest(array, n, guard) {\n  return _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"slice\"].call(array, n == null || guard ? 1 : n);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/rest.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/restArguments.js":
/*!**********************************************************!*\
  !*** ./node_modules/underscore/modules/restArguments.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return restArguments; });\n// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nfunction restArguments(func, startIndex) {\n  startIndex = startIndex == null ? func.length - 1 : +startIndex;\n  return function () {\n    var length = Math.max(arguments.length - startIndex, 0),\n        rest = Array(length),\n        index = 0;\n\n    for (; index < length; index++) {\n      rest[index] = arguments[index + startIndex];\n    }\n\n    switch (startIndex) {\n      case 0:\n        return func.call(this, rest);\n\n      case 1:\n        return func.call(this, arguments[0], rest);\n\n      case 2:\n        return func.call(this, arguments[0], arguments[1], rest);\n    }\n\n    var args = Array(startIndex + 1);\n\n    for (index = 0; index < startIndex; index++) {\n      args[index] = arguments[index];\n    }\n\n    args[startIndex] = rest;\n    return func.apply(this, args);\n  };\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/restArguments.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/result.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/result.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return result; });\n/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isFunction.js */ \"./node_modules/underscore/modules/isFunction.js\");\n/* harmony import */ var _toPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_toPath.js */ \"./node_modules/underscore/modules/_toPath.js\");\n\n // Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\n\nfunction result(obj, path, fallback) {\n  path = Object(_toPath_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(path);\n  var length = path.length;\n\n  if (!length) {\n    return Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(fallback) ? fallback.call(obj) : fallback;\n  }\n\n  for (var i = 0; i < length; i++) {\n    var prop = obj == null ? void 0 : obj[path[i]];\n\n    if (prop === void 0) {\n      prop = fallback;\n      i = length; // Ensure we don't continue iterating.\n    }\n\n    obj = Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prop) ? prop.call(obj) : prop;\n  }\n\n  return obj;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/result.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/sample.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/sample.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return sample; });\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./values.js */ \"./node_modules/underscore/modules/values.js\");\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _random_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./random.js */ \"./node_modules/underscore/modules/random.js\");\n/* harmony import */ var _toArray_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./toArray.js */ \"./node_modules/underscore/modules/toArray.js\");\n\n\n\n\n // Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `_.map`.\n\nfunction sample(obj, n, guard) {\n  if (n == null || guard) {\n    if (!Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj)) obj = Object(_values_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj);\n    return obj[Object(_random_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj.length - 1)];\n  }\n\n  var sample = Object(_toArray_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(obj);\n  var length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(sample);\n  n = Math.max(Math.min(n, length), 0);\n  var last = length - 1;\n\n  for (var index = 0; index < n; index++) {\n    var rand = Object(_random_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(index, last);\n    var temp = sample[index];\n    sample[index] = sample[rand];\n    sample[rand] = temp;\n  }\n\n  return sample.slice(0, n);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/sample.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/shuffle.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/shuffle.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return shuffle; });\n/* harmony import */ var _sample_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sample.js */ \"./node_modules/underscore/modules/sample.js\");\n // Shuffle a collection.\n\nfunction shuffle(obj) {\n  return Object(_sample_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj, Infinity);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/shuffle.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/size.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/size.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return size; });\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n // Return the number of elements in a collection.\n\nfunction size(obj) {\n  if (obj == null) return 0;\n  return Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj) ? obj.length : Object(_keys_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj).length;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/size.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/some.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/some.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return some; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n\n\n // Determine if at least one element in the object passes a truth test.\n\nfunction some(obj, predicate, context) {\n  predicate = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(predicate, context);\n\n  var _keys = !Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(obj) && Object(_keys_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj),\n      length = (_keys || obj).length;\n\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (predicate(obj[currentKey], currentKey, obj)) return true;\n  }\n\n  return false;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/some.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/sortBy.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/sortBy.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return sortBy; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pluck.js */ \"./node_modules/underscore/modules/pluck.js\");\n/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map.js */ \"./node_modules/underscore/modules/map.js\");\n\n\n // Sort the object's values by a criterion produced by an iteratee.\n\nfunction sortBy(obj, iteratee, context) {\n  var index = 0;\n  iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(iteratee, context);\n  return Object(_pluck_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_map_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj, function (value, key, list) {\n    return {\n      value: value,\n      index: index++,\n      criteria: iteratee(value, key, list)\n    };\n  }).sort(function (left, right) {\n    var a = left.criteria;\n    var b = right.criteria;\n\n    if (a !== b) {\n      if (a > b || a === void 0) return 1;\n      if (a < b || b === void 0) return -1;\n    }\n\n    return left.index - right.index;\n  }), 'value');\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/sortBy.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/sortedIndex.js":
/*!********************************************************!*\
  !*** ./node_modules/underscore/modules/sortedIndex.js ***!
  \********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return sortedIndex; });\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n\n // Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\n\nfunction sortedIndex(array, obj, iteratee, context) {\n  iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(iteratee, context, 1);\n  var value = iteratee(obj);\n  var low = 0,\n      high = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(array);\n\n  while (low < high) {\n    var mid = Math.floor((low + high) / 2);\n    if (iteratee(array[mid]) < value) low = mid + 1;else high = mid;\n  }\n\n  return low;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/sortedIndex.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/tap.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/tap.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return tap; });\n// Invokes `interceptor` with the `obj` and then returns `obj`.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nfunction tap(obj, interceptor) {\n  interceptor(obj);\n  return obj;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/tap.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/template.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/template.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return template; });\n/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaults.js */ \"./node_modules/underscore/modules/defaults.js\");\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _templateSettings_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./templateSettings.js */ \"./node_modules/underscore/modules/templateSettings.js\");\n\n\n // When customizing `_.templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\n\nvar noMatch = /(.)^/; // Certain characters need to be escaped so that they can be put into a\n// string literal.\n\nvar escapes = {\n  \"'\": \"'\",\n  '\\\\': '\\\\',\n  '\\r': 'r',\n  '\\n': 'n',\n  \"\\u2028\": 'u2028',\n  \"\\u2029\": 'u2029'\n};\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nfunction escapeChar(match) {\n  return '\\\\' + escapes[match];\n} // In order to prevent third-party code injection through\n// `_.templateSettings.variable`, we test it against the following regular\n// expression. It is intentionally a bit more liberal than just matching valid\n// identifiers, but still prevents possible loopholes through defaults or\n// destructuring assignment.\n\n\nvar bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/; // JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\n\nfunction template(text, settings, oldSettings) {\n  if (!settings && oldSettings) settings = oldSettings;\n  settings = Object(_defaults_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, settings, _underscore_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].templateSettings); // Combine delimiters into one regular expression via alternation.\n\n  var matcher = RegExp([(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source].join('|') + '|$', 'g'); // Compile the template source, escaping string literals appropriately.\n\n  var index = 0;\n  var source = \"__p+='\";\n  text.replace(matcher, function (match, escape, interpolate, evaluate, offset) {\n    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n    index = offset + match.length;\n\n    if (escape) {\n      source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n    } else if (interpolate) {\n      source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n    } else if (evaluate) {\n      source += \"';\\n\" + evaluate + \"\\n__p+='\";\n    } // Adobe VMs need the match returned to produce the correct offset.\n\n\n    return match;\n  });\n  source += \"';\\n\";\n  var argument = settings.variable;\n\n  if (argument) {\n    // Insure against third-party code injection. (CVE-2021-23358)\n    if (!bareIdentifier.test(argument)) throw new Error('variable is not a bare identifier: ' + argument);\n  } else {\n    // If a variable is not specified, place data values in local scope.\n    source = 'with(obj||{}){\\n' + source + '}\\n';\n    argument = 'obj';\n  }\n\n  source = \"var __t,__p='',__j=Array.prototype.join,\" + \"print=function(){__p+=__j.call(arguments,'');};\\n\" + source + 'return __p;\\n';\n  var render;\n\n  try {\n    render = new Function(argument, '_', source);\n  } catch (e) {\n    e.source = source;\n    throw e;\n  }\n\n  var template = function template(data) {\n    return render.call(this, data, _underscore_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n  }; // Provide the compiled source as a convenience for precompilation.\n\n\n  template.source = 'function(' + argument + '){\\n' + source + '}';\n  return template;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/template.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/templateSettings.js":
/*!*************************************************************!*\
  !*** ./node_modules/underscore/modules/templateSettings.js ***!
  \*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n // By default, Underscore uses ERB-style template delimiters. Change the\n// following template settings to use alternative delimiters.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].templateSettings = {\n  evaluate: /<%([\\s\\S]+?)%>/g,\n  interpolate: /<%=([\\s\\S]+?)%>/g,\n  escape: /<%-([\\s\\S]+?)%>/g\n});\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/templateSettings.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/throttle.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/throttle.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return throttle; });\n/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ \"./node_modules/underscore/modules/now.js\");\n // Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\n\nfunction throttle(func, wait, options) {\n  var timeout, context, args, result;\n  var previous = 0;\n  if (!options) options = {};\n\n  var later = function later() {\n    previous = options.leading === false ? 0 : Object(_now_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\n    timeout = null;\n    result = func.apply(context, args);\n    if (!timeout) context = args = null;\n  };\n\n  var throttled = function throttled() {\n    var _now = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\n\n    if (!previous && options.leading === false) previous = _now;\n    var remaining = wait - (_now - previous);\n    context = this;\n    args = arguments;\n\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n      }\n\n      previous = _now;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n\n    return result;\n  };\n\n  throttled.cancel = function () {\n    clearTimeout(timeout);\n    previous = 0;\n    timeout = context = args = null;\n  };\n\n  return throttled;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/throttle.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/times.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/times.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return times; });\n/* harmony import */ var _optimizeCb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_optimizeCb.js */ \"./node_modules/underscore/modules/_optimizeCb.js\");\n // Run a function **n** times.\n\nfunction times(n, iteratee, context) {\n  var accum = Array(Math.max(0, n));\n  iteratee = Object(_optimizeCb_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(iteratee, context, 1);\n\n  for (var i = 0; i < n; i++) {\n    accum[i] = iteratee(i);\n  }\n\n  return accum;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/times.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/toArray.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/toArray.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return toArray; });\n/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isArray.js */ \"./node_modules/underscore/modules/isArray.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isString.js */ \"./node_modules/underscore/modules/isString.js\");\n/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_isArrayLike.js */ \"./node_modules/underscore/modules/_isArrayLike.js\");\n/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./map.js */ \"./node_modules/underscore/modules/map.js\");\n/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./identity.js */ \"./node_modules/underscore/modules/identity.js\");\n/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./values.js */ \"./node_modules/underscore/modules/values.js\");\n\n\n\n\n\n\n // Safely create a real, live array from anything iterable.\n\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\nfunction toArray(obj) {\n  if (!obj) return [];\n  if (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj)) return _setup_js__WEBPACK_IMPORTED_MODULE_1__[\"slice\"].call(obj);\n\n  if (Object(_isString_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(obj)) {\n    // Keep surrogate pair characters together.\n    return obj.match(reStrSymbol);\n  }\n\n  if (Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(obj)) return Object(_map_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(obj, _identity_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n  return Object(_values_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(obj);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/toArray.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/toPath.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/toPath.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return toPath; });\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArray.js */ \"./node_modules/underscore/modules/isArray.js\");\n\n // Normalize a (deep) property `path` to array.\n// Like `_.iteratee`, this function can be customized.\n\nfunction toPath(path) {\n  return Object(_isArray_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(path) ? path : [path];\n}\n_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toPath = toPath;\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/toPath.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/underscore-array-methods.js":
/*!*********************************************************************!*\
  !*** ./node_modules/underscore/modules/underscore-array-methods.js ***!
  \*********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _underscore_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./underscore.js */ \"./node_modules/underscore/modules/underscore.js\");\n/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./each.js */ \"./node_modules/underscore/modules/each.js\");\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n/* harmony import */ var _chainResult_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_chainResult.js */ \"./node_modules/underscore/modules/_chainResult.js\");\n\n\n\n // Add all mutator `Array` functions to the wrapper.\n\nObject(_each_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function (name) {\n  var method = _setup_js__WEBPACK_IMPORTED_MODULE_2__[\"ArrayProto\"][name];\n\n  _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype[name] = function () {\n    var obj = this._wrapped;\n\n    if (obj != null) {\n      method.apply(obj, arguments);\n\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n        delete obj[0];\n      }\n    }\n\n    return Object(_chainResult_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this, obj);\n  };\n}); // Add all accessor `Array` functions to the wrapper.\n\nObject(_each_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(['concat', 'join', 'slice'], function (name) {\n  var method = _setup_js__WEBPACK_IMPORTED_MODULE_2__[\"ArrayProto\"][name];\n\n  _underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype[name] = function () {\n    var obj = this._wrapped;\n    if (obj != null) obj = method.apply(obj, arguments);\n    return Object(_chainResult_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this, obj);\n  };\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (_underscore_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/underscore-array-methods.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/underscore.js":
/*!*******************************************************!*\
  !*** ./node_modules/underscore/modules/underscore.js ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _; });\n/* harmony import */ var _setup_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_setup.js */ \"./node_modules/underscore/modules/_setup.js\");\n // If Underscore is called as a function, it returns a wrapped object that can\n// be used OO-style. This wrapper holds altered versions of all functions added\n// through `_.mixin`. Wrapped objects may be chained.\n\nfunction _(obj) {\n  if (obj instanceof _) return obj;\n  if (!(this instanceof _)) return new _(obj);\n  this._wrapped = obj;\n}\n_.VERSION = _setup_js__WEBPACK_IMPORTED_MODULE_0__[\"VERSION\"]; // Extracts the result from a wrapped and chained object.\n\n_.prototype.value = function () {\n  return this._wrapped;\n}; // Provide unwrapping proxies for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n\n\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function () {\n  return String(this._wrapped);\n};\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/underscore.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/unescape.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/unescape.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createEscaper_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createEscaper.js */ \"./node_modules/underscore/modules/_createEscaper.js\");\n/* harmony import */ var _unescapeMap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_unescapeMap.js */ \"./node_modules/underscore/modules/_unescapeMap.js\");\n\n // Function for unescaping strings from HTML interpolation.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_createEscaper_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_unescapeMap_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/unescape.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/union.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/union.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _uniq_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./uniq.js */ \"./node_modules/underscore/modules/uniq.js\");\n/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_flatten.js */ \"./node_modules/underscore/modules/_flatten.js\");\n\n\n // Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (arrays) {\n  return Object(_uniq_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_flatten_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arrays, true, true));\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/union.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/uniq.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/uniq.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return uniq; });\n/* harmony import */ var _isBoolean_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isBoolean.js */ \"./node_modules/underscore/modules/isBoolean.js\");\n/* harmony import */ var _cb_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_cb.js */ \"./node_modules/underscore/modules/_cb.js\");\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contains.js */ \"./node_modules/underscore/modules/contains.js\");\n\n\n\n // Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\n\nfunction uniq(array, isSorted, iteratee, context) {\n  if (!Object(_isBoolean_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(isSorted)) {\n    context = iteratee;\n    iteratee = isSorted;\n    isSorted = false;\n  }\n\n  if (iteratee != null) iteratee = Object(_cb_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(iteratee, context);\n  var result = [];\n  var seen = [];\n\n  for (var i = 0, length = Object(_getLength_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(array); i < length; i++) {\n    var value = array[i],\n        computed = iteratee ? iteratee(value, i, array) : value;\n\n    if (isSorted && !iteratee) {\n      if (!i || seen !== computed) result.push(value);\n      seen = computed;\n    } else if (iteratee) {\n      if (!Object(_contains_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(seen, computed)) {\n        seen.push(computed);\n        result.push(value);\n      }\n    } else if (!Object(_contains_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(result, value)) {\n      result.push(value);\n    }\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/uniq.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/uniqueId.js":
/*!*****************************************************!*\
  !*** ./node_modules/underscore/modules/uniqueId.js ***!
  \*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return uniqueId; });\n// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nfunction uniqueId(prefix) {\n  var id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/uniqueId.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/unzip.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/unzip.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return unzip; });\n/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./max.js */ \"./node_modules/underscore/modules/max.js\");\n/* harmony import */ var _getLength_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getLength.js */ \"./node_modules/underscore/modules/_getLength.js\");\n/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pluck.js */ \"./node_modules/underscore/modules/pluck.js\");\n\n\n // Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\n\nfunction unzip(array) {\n  var length = array && Object(_max_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(array, _getLength_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]).length || 0;\n  var result = Array(length);\n\n  for (var index = 0; index < length; index++) {\n    result[index] = Object(_pluck_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(array, index);\n  }\n\n  return result;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/unzip.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/values.js":
/*!***************************************************!*\
  !*** ./node_modules/underscore/modules/values.js ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return values; });\n/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keys.js */ \"./node_modules/underscore/modules/keys.js\");\n // Retrieve the values of an object's properties.\n\nfunction values(obj) {\n  var _keys = Object(_keys_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj);\n\n  var length = _keys.length;\n  var values = Array(length);\n\n  for (var i = 0; i < length; i++) {\n    values[i] = obj[_keys[i]];\n  }\n\n  return values;\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/values.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/where.js":
/*!**************************************************!*\
  !*** ./node_modules/underscore/modules/where.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return where; });\n/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./filter.js */ \"./node_modules/underscore/modules/filter.js\");\n/* harmony import */ var _matcher_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./matcher.js */ \"./node_modules/underscore/modules/matcher.js\");\n\n // Convenience version of a common use case of `_.filter`: selecting only\n// objects containing specific `key:value` pairs.\n\nfunction where(obj, attrs) {\n  return Object(_filter_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(obj, Object(_matcher_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(attrs));\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/where.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/without.js":
/*!****************************************************!*\
  !*** ./node_modules/underscore/modules/without.js ***!
  \****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _difference_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./difference.js */ \"./node_modules/underscore/modules/difference.js\");\n\n // Return a version of the array that does not contain the specified value(s).\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (array, otherArrays) {\n  return Object(_difference_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(array, otherArrays);\n}));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/without.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/wrap.js":
/*!*************************************************!*\
  !*** ./node_modules/underscore/modules/wrap.js ***!
  \*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return wrap; });\n/* harmony import */ var _partial_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./partial.js */ \"./node_modules/underscore/modules/partial.js\");\n // Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\n\nfunction wrap(func, wrapper) {\n  return Object(_partial_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(wrapper, func);\n}\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/wrap.js?");

/***/ }),

/***/ "./node_modules/underscore/modules/zip.js":
/*!************************************************!*\
  !*** ./node_modules/underscore/modules/zip.js ***!
  \************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _restArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restArguments.js */ \"./node_modules/underscore/modules/restArguments.js\");\n/* harmony import */ var _unzip_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./unzip.js */ \"./node_modules/underscore/modules/unzip.js\");\n\n // Zip together multiple lists into a single array -- elements that share\n// an index go together.\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_restArguments_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_unzip_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));\n\n//# sourceURL=webpack://rup/./node_modules/underscore/modules/zip.js?");

/***/ }),

/***/ "./node_modules/webpack/buildin/amd-options.js":
/*!****************************************!*\
  !*** (webpack)/buildin/amd-options.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n\n/* WEBPACK VAR INJECTION */}.call(this, {}))\n\n//# sourceURL=webpack://rup/(webpack)/buildin/amd-options.js?");

/***/ }),

/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nvar g; // This works in non-strict mode\n\ng = function () {\n  return this;\n}();\n\ntry {\n  // This works if eval is allowed (see CSP)\n  g = g || new Function(\"return this\")();\n} catch (e) {\n  // This works if the window reference is available\n  if ((typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\") g = window;\n} // g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\n\nmodule.exports = g;\n\n//# sourceURL=webpack://rup/(webpack)/buildin/global.js?");

/***/ }),

/***/ "./node_modules/webpack/buildin/module.js":
/*!***********************************!*\
  !*** (webpack)/buildin/module.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (module) {\n  if (!module.webpackPolyfill) {\n    module.deprecate = function () {};\n\n    module.paths = []; // module.parent = undefined by default\n\n    if (!module.children) module.children = [];\n    Object.defineProperty(module, \"loaded\", {\n      enumerable: true,\n      get: function get() {\n        return module.l;\n      }\n    });\n    Object.defineProperty(module, \"id\", {\n      enumerable: true,\n      get: function get() {\n        return module.i;\n      }\n    });\n    module.webpackPolyfill = 1;\n  }\n\n  return module;\n};\n\n//# sourceURL=webpack://rup/(webpack)/buildin/module.js?");

/***/ }),

/***/ "./scss/rup-base.scss":
/*!****************************!*\
  !*** ./scss/rup-base.scss ***!
  \****************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://rup/./scss/rup-base.scss?");

/***/ }),

/***/ "./scss/rup-theme.scss":
/*!*****************************!*\
  !*** ./scss/rup-theme.scss ***!
  \*****************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://rup/./scss/rup-theme.scss?");

/***/ }),

/***/ "./src/adapter/ButtonBootstrapAdapter.js":
/*!***********************************************!*\
  !*** ./src/adapter/ButtonBootstrapAdapter.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function ButtonBootstrapAdapter() {}\n\n  ButtonBootstrapAdapter.prototype.NAME = 'button_bootstrap';\n\n  ButtonBootstrapAdapter.prototype.createDropdownButton = function (settings) {\n    var $self = this,\n        dropdownSettings = settings.dropdown;\n    return $(Rup.Templates.rup.button.dropdownButton({\n      id: $self.prop('id') + '_dropdown',\n      classes: 'rup-dropdown-button'\n    }));\n  };\n\n  ButtonBootstrapAdapter.prototype.createMButton = function (settings, label) {\n    var $self = this,\n        dropdownSettings = settings.dropdown;\n    return $(Rup.Templates.rup.button.mbutton({\n      id: $self.prop('id'),\n      classes: 'rup-toolbar_menuButton ui-button ui-corner-all ui-widget rup-toolbar_menuButtonSlided',\n      label: label,\n      iconClasses: 'ui-button-icon ui-icon rup-toolbar_menuButtonIcon'\n    }));\n  };\n\n  ButtonBootstrapAdapter.prototype.createMButtonContainer = function (settings, label) {\n    var $self = this,\n        dropdownSettings = settings.dropdown;\n    return $(Rup.Templates.rup.button.mbutton - container({\n      id: $self.prop('id') + '-container',\n      classes: 'ui-widget ui-widget-content rup-toolbar_menuButtonContainer',\n      label: label,\n      iconClasses: 'ui-button-icon ui-icon rup-toolbar_menuButtonIcon'\n    }));\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ButtonBootstrapAdapter.prototype.NAME] = new ButtonBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ButtonBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/ButtonJQueryUIAdapter.js":
/*!**********************************************!*\
  !*** ./src/adapter/ButtonJQueryUIAdapter.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function ButtonJQueryUIAdapter() {}\n\n  ButtonJQueryUIAdapter.prototype.NAME = 'button_jqueryui';\n\n  ButtonJQueryUIAdapter.prototype.createDropdownButton = function (settings) {\n    var $self = this,\n        dropdownSettings = settings.dropdown;\n    return jQuery('<button>').attr({\n      type: 'button',\n      id: $self.prop('id') + '_dropdown'\n    }).text('Administración de filtros').button({\n      icons: {\n        primary: dropdownSettings.dropdownIcon\n      },\n      text: false\n    }).addClass('rup-dropdown-button');\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ButtonJQueryUIAdapter.prototype.NAME] = new ButtonJQueryUIAdapter();\n  return $;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/adapter/ButtonJQueryUIAdapter.js?");

/***/ }),

/***/ "./src/adapter/ButtonMaterialAdapter.js":
/*!**********************************************!*\
  !*** ./src/adapter/ButtonMaterialAdapter.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function ButtonMaterialAdapter() {}\n\n  ButtonMaterialAdapter.prototype.NAME = 'button_material';\n\n  ButtonMaterialAdapter.prototype.createDropdownButton = function (settings) {\n    var $self = this,\n        dropdownSettings = settings.dropdown; // Limpieza de las clases de jQuery UI\n\n    $self.removeClass('ui-button ui-corner-all ui-widget');\n    var classes = 'rup-dropdown-button-material';\n    $.each($self[0].classList, function (key, value) {\n      if (value.indexOf('btn-material') >= 0) {\n        classes = classes + ' ' + value;\n      }\n    });\n    return $(Rup.Templates.rup.button.dropdownButton({\n      id: $self.prop('id') + '_dropdown',\n      // Usamos las clases del boton principal para que el enfasis sea siempre el mismo\n      classes: classes\n    }));\n  };\n\n  ButtonMaterialAdapter.prototype.createMButton = function (settings, label) {\n    var $self = this,\n        dropdownSettings = settings.dropdown;\n    return $(Rup.Templates.rup.button.mbutton({\n      id: $self.prop('id'),\n      classes: 'btn-material btn-material-primary-high-emphasis rup-toolbar_menuButton rup-toolbar_menuButtonSlided',\n      label: label,\n      iconClasses: 'rup-toolbar_menuButtonIcon'\n    }));\n  };\n\n  ButtonMaterialAdapter.prototype.createMButtonContainer = function (settings, label) {\n    var $self = this,\n        dropdownSettings = settings.dropdown;\n    return $(Rup.Templates.rup.button['mbutton-container']({\n      id: $self.prop('id') + '-container',\n      classes: 'rup-toolbar_menuButtonContainer',\n      label: label,\n      iconClasses: 'rup-toolbar_menuButtonIcon'\n    }));\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ButtonMaterialAdapter.prototype.NAME] = new ButtonMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ButtonMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/CalendarBootstrapAdapter.js":
/*!*************************************************!*\
  !*** ./src/adapter/CalendarBootstrapAdapter.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function CalendarBootstrapAdapter() {}\n\n  CalendarBootstrapAdapter.prototype.NAME = 'calendar_bootstrap';\n\n  CalendarBootstrapAdapter.prototype.classComponent = function () {\n    return 'rup-bootstrap';\n  };\n\n  CalendarBootstrapAdapter.prototype.closeLiteral = function () {\n    return '';\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[CalendarBootstrapAdapter.prototype.NAME] = new CalendarBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/CalendarBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/DateBootstrapAdapter.js":
/*!*********************************************!*\
  !*** ./src/adapter/DateBootstrapAdapter.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function DateBootstrapAdapter() {}\n\n  DateBootstrapAdapter.prototype.NAME = 'date_bootstrap';\n\n  DateBootstrapAdapter.prototype.initIconTrigger = function (settings) {\n    // Imagen del calendario.\n    settings.buttonImage = $.rup.STATICS + (settings.buttonImage ? settings.buttonImage : \"/rup/css/images/calendario.svg\");\n    settings.buttonText = settings.buttonText; //Atributos NO MODIFICABLES\n    //La imagen no debe ser un botón\n\n    settings.buttonImageOnly = false; //Solo permitir caracteres permitidos en la máscara\n\n    settings.constrainInput = true; //Mostrar patrón con foco en input y pinchando imagen\n\n    settings.showOn = 'both';\n  };\n\n  DateBootstrapAdapter.prototype.postConfigure = function (settings) {\n    if (settings.id != undefined) {\n      var $self = this,\n          data = $self.data('datepicker'),\n          $input = data.input,\n          $trigger = data.trigger,\n          $div;\n      $div = $('<div>').addClass('rup-date-input-group');\n      $input.add($trigger).wrapAll($div);\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[DateBootstrapAdapter.prototype.NAME] = new DateBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/DateBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/DateMaterialAdapter.js":
/*!********************************************!*\
  !*** ./src/adapter/DateMaterialAdapter.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function DateMaterialAdapter() {}\n\n  DateMaterialAdapter.prototype.NAME = 'date_material';\n\n  DateMaterialAdapter.prototype.initIconTrigger = function (settings) {\n    // Imagen del calendario.\n    settings.buttonImage = $.rup.STATICS + (settings.buttonImage ? settings.buttonImage : \"/rup/css/images/calendario.svg\");\n    settings.buttonText = settings.buttonText; //Atributos NO MODIFICABLES\n    //La imagen no debe ser un botón\n\n    settings.buttonImageOnly = false; //Solo permitir caracteres permitidos en la máscara\n\n    settings.constrainInput = true; //Mostrar patrón con foco en input y pinchando imagen\n\n    settings.showOn = 'both';\n  };\n\n  DateMaterialAdapter.prototype.postConfigure = function (settings) {\n    if (settings.id != undefined) {\n      var $self = this,\n          data = $self.data('datepicker'),\n          $input = data.input,\n          $trigger = data.trigger,\n          $div;\n      $div = $('<div>').addClass('rup-date-input-group-material');\n      $input.add($trigger).wrapAll($div); // Añade los labels tras el input al que esten asociados.\n\n      var allLabels = $('label[for=\"' + $self[0].id + '\"]');\n      $.each(allLabels, function (key, label) {\n        // En caso de tener mas de un label, entrara por el if (la primera iteracion siempre se añade al dom directamente).\n        if (key > 0) {\n          var previousLabelLeftValue = allLabels[key - 1].offsetLeft;\n          var previousLabelWidthValue = $(allLabels[key - 1]).outerWidth();\n          $(label).css({\n            left: '' + (previousLabelLeftValue + previousLabelWidthValue + 10) + 'px'\n          });\n          $(label).insertAfter($(allLabels[key - 1]));\n        } else {\n          $(label).insertAfter($trigger);\n        }\n      }); // Estiliza el dialogo\n\n      $(\".ui-datepicker, .ui-datepicker-inline\").addClass(\"material-datepicker\");\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[DateMaterialAdapter.prototype.NAME] = new DateMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/DateMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/DialogBootstrapAdapter.js":
/*!***********************************************!*\
  !*** ./src/adapter/DialogBootstrapAdapter.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function DialogBootstrapAdapter() {}\n\n  DialogBootstrapAdapter.prototype.NAME = 'dialog_bootstrap';\n\n  DialogBootstrapAdapter.prototype.classComponent = function () {\n    return 'btn btn-light';\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[DialogBootstrapAdapter.prototype.NAME] = new DialogBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/DialogBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/DialogMaterialAdapter.js":
/*!**********************************************!*\
  !*** ./src/adapter/DialogMaterialAdapter.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function DialogMaterialAdapter() {}\n\n  DialogMaterialAdapter.prototype.NAME = 'dialog_material';\n\n  DialogMaterialAdapter.prototype.classComponent = function () {\n    return 'btn-material btn-material-sm btn-material-primary-low-emphasis';\n  };\n\n  DialogMaterialAdapter.prototype.titlebarColor = function () {\n    return 'app-primary-color';\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[DialogMaterialAdapter.prototype.NAME] = new DialogMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/DialogMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/FeedbackBootstrapAdapter.js":
/*!*************************************************!*\
  !*** ./src/adapter/FeedbackBootstrapAdapter.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function FeedbackBootstrapAdapter() {}\n\n  FeedbackBootstrapAdapter.prototype.NAME = 'feedback_bootstrap';\n\n  FeedbackBootstrapAdapter.prototype.classComponent = function () {\n    return 'rup-bootstrap';\n  };\n\n  FeedbackBootstrapAdapter.prototype.closeIcon = function () {\n    return '<i class=\"mdi mdi-close\" aria-hidden=\"true\"></i>';\n  };\n\n  FeedbackBootstrapAdapter.prototype.containerClass = function () {\n    return 'rup-feedback ui-widget ui-widget-content ui-corner-all';\n  };\n\n  FeedbackBootstrapAdapter.prototype.feedbackIcon = function (type) {\n    switch (type) {\n      case 'alert':\n        return '<i class=\"mdi mdi-alert\"></i>';\n\n      case 'error':\n        return '<i class=\"mdi mdi-alert-circle-outline\"></i>';\n\n      default:\n        return '<i class=\"mdi mdi-check-circle\"></i>';\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[FeedbackBootstrapAdapter.prototype.NAME] = new FeedbackBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/FeedbackBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/FeedbackJQueryUIAdapter.js":
/*!************************************************!*\
  !*** ./src/adapter/FeedbackJQueryUIAdapter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function FeedbackJQueryUIAdapter() {}\n\n  FeedbackJQueryUIAdapter.prototype.NAME = 'feedback_jqueryui';\n\n  FeedbackJQueryUIAdapter.prototype.classComponent = function () {\n    return 'rup-jqueryui';\n  };\n\n  FeedbackJQueryUIAdapter.prototype.closeIcon = function () {\n    return $.rup.i18nParse($.rup.i18n.base, 'rup_global.cerrar');\n  };\n\n  FeedbackJQueryUIAdapter.prototype.containerClass = function () {\n    return 'rup-feedback ui-widget ui-widget-content ui-corner-all';\n  };\n\n  FeedbackJQueryUIAdapter.prototype.feedbackIcon = function (type) {\n    switch (type) {\n      case 'alert':\n        return '<i class=\"mdi mdi-alert\"></i>';\n\n      case 'error':\n        return '<i class=\"mdi mdi-alert-circle-outline\"></i>';\n\n      default:\n        return '<i class=\"mdi mdi-check-circle\"></i>';\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[FeedbackJQueryUIAdapter.prototype.NAME] = new FeedbackJQueryUIAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/FeedbackJQueryUIAdapter.js?");

/***/ }),

/***/ "./src/adapter/FeedbackMaterialAdapter.js":
/*!************************************************!*\
  !*** ./src/adapter/FeedbackMaterialAdapter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function FeedbackMaterialAdapter() {}\n\n  FeedbackMaterialAdapter.prototype.NAME = 'feedback_material';\n\n  FeedbackMaterialAdapter.prototype.classComponent = function () {\n    return 'rup-bootstrap-materializado';\n  };\n\n  FeedbackMaterialAdapter.prototype.closeIcon = function () {\n    return '<i class=\"mdi mdi-close\"></i>';\n  };\n\n  FeedbackMaterialAdapter.prototype.containerClass = function () {\n    return 'rup-feedback';\n  };\n\n  FeedbackMaterialAdapter.prototype.feedbackIcon = function (type) {\n    switch (type) {\n      case 'alert':\n        return '<i class=\"mdi mdi-alert\"></i>';\n\n      case 'error':\n        return '<i class=\"mdi mdi-alert-circle-outline\"></i>';\n\n      default:\n        return '<i class=\"mdi mdi-check-circle\"></i>';\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[FeedbackMaterialAdapter.prototype.NAME] = new FeedbackMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/FeedbackMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/JqTableBootstrapAdapter.js":
/*!************************************************!*\
  !*** ./src/adapter/JqTableBootstrapAdapter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function JqTableBootstrapAdapter() {}\n\n  JqTableBootstrapAdapter.prototype.NAME = 'jqtable_bootstrap';\n  JqTableBootstrapAdapter.prototype.CONST = {\n    core: {\n      operations: {\n        defaultOperations: {\n          'add': {\n            icon: 'mdi mdi-plus'\n          },\n          'save': {\n            icon: 'mdi mdi-content-save'\n          },\n          'edit': {\n            icon: 'mdi mdi-playlist-edit'\n          },\n          'clone': {\n            icon: 'mdi mdi-content-copy'\n          },\n          'delete': {\n            icon: 'mdi mdi-trash-can-outline'\n          },\n          'cancel': {\n            icon: 'mdi mdi-cancel'\n          }\n        }\n      }\n    }\n  };\n\n  JqTableBootstrapAdapter.prototype.configurePager = function (settings) {\n    var $self = this,\n        pagerName,\n        $pagerCenter,\n        pagerLeft,\n        pagerRight,\n        $pagerLeft,\n        $pagerCenter,\n        $pagerRight;\n\n    if (settings.pager !== undefined && settings.pager !== null) {\n      settings.$pager = $(settings.pager.indexOf('#') === 0 ? settings.pager : '#' + settings.pager);\n      pagerName = settings.$pager.attr('id');\n      settings.$pager.css('height', 'auto'); //Posibilitar redimensionar paginador\n      //Añadir clase a cada parte del paginador\n\n      $pagerLeft = $('#' + pagerName + '_left');\n      $pagerCenter = $('#' + pagerName + '_center');\n      $pagerRight = $('#' + pagerName + '_right');\n      $pagerLeft.addClass('pager_left');\n      $pagerCenter.addClass('pager_center');\n      $pagerRight.addClass('pager_right'); //pager_left\n      //**********\n      //Quitar posibles botones del paginador (y dejar la parte izquierda vacía)\n\n      $pagerLeft.html(''); //Contador de seleccionados\n\n      if (settings.multiselect === true) {\n        $pagerLeft.append($('<div></div>').addClass('ui-paging-selected').html('0 ' + jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.selected')));\n      } // Pager center\n\n\n      $pagerCenter.css('white-space', 'inherit');\n      jQuery('.pager_center table td', settings.$pager).addClass('pagControls'); // Evento de control de página máxima\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).on('change', function () {\n        var pageNum = parseInt($(this).val()),\n            totalNum = parseInt($self.rup_jqtable('getGridParam', 'lastpage'));\n\n        if (isNaN(pageNum) === false && pageNum > totalNum) {\n          $(this).val(totalNum);\n        }\n      }); // Tooltip al combo de selección de número de registros\n\n      jQuery('.pagControls select.ui-pg-selbox', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.select')).rup_tooltip(); // Tooltip al input de selección de página\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.input')).rup_tooltip();\n      var pagerLinkTemplate = Rup.Templates.rup.jqtable.pager.link.bootstrap; //Cambiar flechas paginación por literales\n\n      jQuery('#first_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.primPag')\n      })).addClass('mdi mdi-page-first').removeClass('ui-pg-button');\n      jQuery('#prev_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.anterior')\n      })).addClass('mdi mdi-chevron-left').removeClass('ui-pg-button');\n      jQuery('#next_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.siguiente')\n      })).addClass('mdi mdi-chevron-right').removeClass('ui-pg-button');\n      jQuery('#last_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.ultiPag')\n      })).addClass('mdi mdi-page-last').removeClass('ui-pg-button');\n    }\n  };\n\n  JqTableBootstrapAdapter.prototype.createDetailNavigation = function () {\n    var $self = $(this),\n        settings = $self.data('settings'),\n        jqGridID = $self.attr('id');\n    var $template = $(Rup.Templates.rup.jqtable.detail.navigation.bootstrap({\n      jqtableId: $self.prop('id'),\n      resultNumText: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.numResult'),\n      labelFirst: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.first'),\n      labelPrev: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.previous'),\n      labelNext: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.next'),\n      labelLast: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.last')\n    })); // var $self = $(this),\n    //     settings = $self.data(\"settings\"),\n    //     jqGridID = $self.attr(\"id\"),\n    //     paginationBarTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_jqtable.templates.detailForm.paginationBar\"),\n    //     paginationLinkTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_jqtable.templates.detailForm.paginationLink\"),\n    //     elementCounterTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_jqtable.templates.detailForm.elementCounter\"),\n    //     $separator = $(jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_jqtable.templates.detailForm.separator\")),\n    //     $elementCounter = $(jQuery.jgrid.format(elementCounterTmpl, jqGridID, jQuery.rup.STATICS, jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_jqtable.numResult\"))),\n    //     $paginationBar = $(jQuery.jgrid.format(paginationBarTmpl, jqGridID)),\n\n    var $firstPaginationLink = $('#first_' + jqGridID, $template),\n        $backPaginationLink = $('#back_' + jqGridID, $template),\n        $forwardPaginationLink = $('#forward_' + jqGridID, $template),\n        $lastPaginationLink = $('#last_' + jqGridID, $template),\n        extpost = undefined; // $paginationBar.append($firstPaginationLink)\n    //     .append($backPaginationLink)\n    //     .append($forwardPaginationLink)\n    //     .append($lastPaginationLink);\n    // $pagina\n\n    function doLinkNavigation(linkId, $link) {\n      var retNavParams = $.proxy(settings.fncGetNavigationParams, $self)(linkId); // Se comprueba el parametro 7 mientras esten en convivencia el rup.jqtable(entrar) y rup.table\n\n      if (retNavParams !== undefined && retNavParams[7] === undefined) {\n        if ($.proxy($.jgrid.checkUpdates, $self[0])(extpost, function () {\n          $.proxy(settings.doNavigation, $self)(retNavParams);\n        })) {\n          $.proxy(settings.doNavigation, $self)(retNavParams);\n        }\n      }\n    }\n\n    $firstPaginationLink.on('click', function () {\n      doLinkNavigation('first', $(this));\n    }); // Elemento anterior\n\n    $backPaginationLink.on('click', function () {\n      doLinkNavigation('prev', $(this));\n    }); // Elemento siguiente\n\n    $forwardPaginationLink.on('click', function () {\n      doLinkNavigation('next', $(this));\n    }); // Elemento ultimo\n\n    $lastPaginationLink.on('click', function () {\n      doLinkNavigation('last', $(this));\n    }); // return $(\"<div>\").append($elementCounter).append($paginationBar).append($separator);\n    //\n\n    return $template;\n  };\n\n  JqTableBootstrapAdapter.prototype.multifilter = {\n    dropdown: {\n      dropdownIcon: 'ui-icon-gear',\n      dropdownDialogConfig: {\n        title: '<i class=\"mdi mdi-filter\" aria-hidden=\"true\"></i>'\n      }\n    }\n  };\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[JqTableBootstrapAdapter.prototype.NAME] = new JqTableBootstrapAdapter();\n  return $;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/adapter/JqTableBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/JqTableJQueryUIAdapter.js":
/*!***********************************************!*\
  !*** ./src/adapter/JqTableJQueryUIAdapter.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function JqTableJQueryUIAdapter() {}\n\n  JqTableJQueryUIAdapter.prototype.NAME = 'jqtable_jqueryui';\n  JqTableJQueryUIAdapter.prototype.CONST = {\n    core: {\n      operations: {\n        defaultOperations: {\n          'add': {\n            icon: 'ui-icon rup-icon rup-icon-new'\n          },\n          'save': {\n            icon: 'ui-icon rup-icon rup-icon-save'\n          },\n          'edit': {\n            icon: 'ui-icon rup-icon rup-icon-edit'\n          },\n          'clone': {\n            icon: 'ui-icon rup-icon rup-icon-clone'\n          },\n          'delete': {\n            icon: 'ui-icon rup-icon rup-icon-delete'\n          },\n          'cancel': {\n            icon: 'ui-icon rup-icon rup-icon-cancel'\n          }\n        }\n      }\n    }\n  };\n\n  JqTableJQueryUIAdapter.prototype.configurePager = function (settings) {\n    var $self = this,\n        pagerName,\n        $pagerCenter,\n        pagerLeft,\n        pagerRight;\n\n    if (settings.pager !== undefined && settings.pager !== null) {\n      settings.$pager = $(settings.pager.indexOf('#') === 0 ? settings.pager : '#' + settings.pager);\n      pagerName = settings.$pager.attr('id');\n      settings.$pager.css('height', 'auto'); //Posibilitar redimensionar paginador\n      //Añadir clase a cada parte del paginador\n\n      $pagerLeft = $('#' + pagerName + '_left');\n      $pagerCenter = $('#' + pagerName + '_center');\n      $pagerRight = $('#' + pagerName + '_right');\n      $pagerLeft.addClass('pager_left');\n      $pagerCenter.addClass('pager_center');\n      $pagerRight.addClass('pager_right'); //pager_left\n      //**********\n      //Quitar posibles botones del paginador (y dejar la parte izquierda vacía)\n\n      $pagerLeft.html(''); //Contador de seleccionados\n\n      if (settings.multiselect === true) {\n        $pagerLeft.append($('<div></div>').addClass('ui-paging-selected').html('0 ' + jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.selected')));\n      } // Pager center\n\n\n      jQuery('.pager_center table td', settings.$pager).addClass('pagControls'); // Evento de control de página máxima\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).on('change', function () {\n        var pageNum = parseInt($(this).val()),\n            totalNum = parseInt($self.rup_jqtable('getGridParam', 'lastpage'));\n\n        if (isNaN(pageNum) === false && pageNum > totalNum) {\n          $(this).val(totalNum);\n        }\n      }); // Tooltip al combo de selección de número de registros\n\n      jQuery('.pagControls select.ui-pg-selbox', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.select')).rup_tooltip(); // Tooltip al input de selección de página\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.input')).rup_tooltip(); //Cambiar flechas paginación por literales\n\n      jQuery('#first_' + pagerName, $pagerCenter).html($('<a></a>').attr('href', 'javascript:void(0)').html(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.primPag')).addClass('linkPaginacion')).removeClass('ui-pg-button');\n      jQuery('#prev_' + pagerName, $pagerCenter).html($('<a></a>').attr('href', 'javascript:void(0)').html(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.anterior')).addClass('linkPaginacion')).removeClass('ui-pg-button');\n      jQuery('#next_' + pagerName, $pagerCenter).html($('<a></a>').attr('href', 'javascript:void(0)').html(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.siguiente')).addClass('linkPaginacion')).removeClass('ui-pg-button');\n      jQuery('#last_' + pagerName, $pagerCenter).html($('<a></a>').attr('href', 'javascript:void(0)').html(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.pager.ultiPag')).addClass('linkPaginacion')).removeClass('ui-pg-button');\n    }\n  };\n\n  JqTableJQueryUIAdapter.prototype.createDetailNavigation = function () {\n    var $self = $(this),\n        settings = $self.data('settings'),\n        jqGridID = $self.attr('id'),\n        paginationBarTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.templates.detailForm.paginationBar'),\n        paginationLinkTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.templates.detailForm.paginationLink'),\n        elementCounterTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.templates.detailForm.elementCounter'),\n        $separator = $(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.templates.detailForm.separator')),\n        $elementCounter = $(jQuery.jgrid.format(elementCounterTmpl, jqGridID, jQuery.rup.STATICS, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.numResult'))),\n        $paginationBar = $(jQuery.jgrid.format(paginationBarTmpl, jqGridID)),\n        $firstPaginationLink = $(jQuery.jgrid.format(paginationLinkTmpl, 'first_' + jqGridID, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.first'))),\n        $backPaginationLink = $(jQuery.jgrid.format(paginationLinkTmpl, 'back_' + jqGridID, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.previous'))),\n        $forwardPaginationLink = $(jQuery.jgrid.format(paginationLinkTmpl, 'forward_' + jqGridID, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.next'))),\n        $lastPaginationLink = $(jQuery.jgrid.format(paginationLinkTmpl, 'last_' + jqGridID, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_jqtable.last'))),\n        extpost = undefined;\n    $paginationBar.append($firstPaginationLink).append($backPaginationLink).append($forwardPaginationLink).append($lastPaginationLink);\n\n    function doLinkNavigation(linkId, $link) {\n      var retNavParams = $.proxy(settings.fncGetNavigationParams, $self)(linkId);\n\n      if ($.proxy($.jgrid.checkUpdates, $self[0])(extpost, function () {\n        $.proxy(settings.doNavigation, $self)(retNavParams);\n      })) {\n        $.proxy(settings.doNavigation, $self)(retNavParams);\n      }\n    } // Elemento primero\n\n\n    $firstPaginationLink.on('click', function () {\n      doLinkNavigation('first', $(this));\n    }); // Elemento anterior\n\n    $backPaginationLink.on('click', function () {\n      doLinkNavigation('prev', $(this));\n    }); // Elemento siguiente\n\n    $forwardPaginationLink.on('click', function () {\n      doLinkNavigation('next', $(this));\n    }); // Elemento ultimo\n\n    $lastPaginationLink.on('click', function () {\n      doLinkNavigation('last', $(this));\n    });\n    return $('<div>').append($elementCounter).append($paginationBar).append($separator);\n  };\n\n  JqTableJQueryUIAdapter.prototype.multifilter = {\n    dropdown: {\n      dropdownIcon: 'ui-icon-gear',\n      dropdownDialogConfig: {\n        title: '<span class=\"rup-icon rup-icon-filter\"></span>'\n      }\n    }\n  };\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[JqTableJQueryUIAdapter.prototype.NAME] = new JqTableJQueryUIAdapter();\n  return $;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/adapter/JqTableJQueryUIAdapter.js?");

/***/ }),

/***/ "./src/adapter/MessageBootstrapAdapter.js":
/*!************************************************!*\
  !*** ./src/adapter/MessageBootstrapAdapter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function MessageBootstrapAdapter() {}\n\n  MessageBootstrapAdapter.prototype.NAME = 'message_bootstrap';\n\n  MessageBootstrapAdapter.prototype.classComponent = function (type) {\n    switch (type) {\n      case 'error':\n        return 'btn btn-outline-danger';\n\n      case 'ok':\n        return 'btn btn-outline-success';\n\n      case 'alert':\n        return 'btn btn-light';\n\n      default:\n        return 'btn btn-outline-primary';\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[MessageBootstrapAdapter.prototype.NAME] = new MessageBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/MessageBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/MessageMaterialAdapter.js":
/*!***********************************************!*\
  !*** ./src/adapter/MessageMaterialAdapter.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function MessageMaterialAdapter() {}\n\n  MessageMaterialAdapter.prototype.NAME = 'message_material';\n\n  MessageMaterialAdapter.prototype.classComponent = function (type) {\n    switch (type) {\n      case 'error':\n        return 'btn-material btn-material-sm btn-material-primary-danger-low-emphasis';\n\n      case 'ok':\n        return 'btn-material btn-material-sm btn-material-primary-success-low-emphasis';\n\n      case 'alert':\n        return 'btn-material btn-material-sm btn-material-primary-low-secondary-emphasis';\n\n      default:\n        return 'btn-material btn-material-sm btn-material-primary-low-emphasis';\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[MessageMaterialAdapter.prototype.NAME] = new MessageMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/MessageMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/TableBootstrapAdapter.js":
/*!**********************************************!*\
  !*** ./src/adapter/TableBootstrapAdapter.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function TableBootstrapAdapter() {}\n\n  TableBootstrapAdapter.prototype.NAME = 'table_bootstrap';\n  TableBootstrapAdapter.prototype.CONST = {\n    core: {\n      operations: {\n        defaultOperations: {\n          'add': {\n            icon: 'mdi-plus'\n          },\n          'edit': {\n            icon: 'mdi-playlist-edit'\n          },\n          'clone': {\n            icon: 'mdi-content-copy'\n          },\n          'delete': {\n            icon: 'mdi-trash-can-outline'\n          },\n          'reports': {\n            icon: 'mdi-file-export'\n          },\n          'copyButton': {\n            icon: 'mdi-clipboard-text-outline'\n          },\n          'excelButton': {\n            icon: 'mdi-file-excel'\n          },\n          'pdfButton': {\n            icon: 'mdi-file-pdf'\n          },\n          'odsButton': {\n            icon: 'mdi-file'\n          },\n          'csvButton': {\n            icon: 'mdi-file-table'\n          }\n        }\n      }\n    }\n  };\n\n  TableBootstrapAdapter.prototype.configurePager = function (settings) {\n    var $self = this,\n        pagerName,\n        $pagerCenter,\n        pagerLeft,\n        pagerRight,\n        $pagerLeft,\n        $pagerCenter,\n        $pagerRight;\n\n    if (settings.pager !== undefined && settings.pager !== null) {\n      settings.$pager = $(settings.pager.indexOf('#') === 0 ? settings.pager : '#' + settings.pager);\n      pagerName = settings.$pager.attr('id');\n      settings.$pager.css('height', 'auto'); //Posibilitar redimensionar paginador\n      //Añadir clase a cada parte del paginador\n\n      $pagerLeft = $('#' + pagerName + '_left');\n      $pagerCenter = $('#' + pagerName + '_center');\n      $pagerRight = $('#' + pagerName + '_right');\n      $pagerLeft.addClass('pager_left');\n      $pagerCenter.addClass('pager_center');\n      $pagerRight.addClass('pager_right'); //pager_left\n      //**********\n      //Quitar posibles botones del paginador (y dejar la parte izquierda vacía)\n\n      $pagerLeft.html(''); //Contador de seleccionados\n\n      if (settings.multiselect === true) {\n        $pagerLeft.append($('<div></div>').addClass('ui-paging-selected').html('0 ' + jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.selected')));\n      } // Pager center\n\n\n      $pagerCenter.css('white-space', 'inherit');\n      jQuery('.pager_center table td', settings.$pager).addClass('pagControls'); // Evento de control de página máxima\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).on('change', function () {\n        var pageNum = parseInt($(this).val()),\n            totalNum = parseInt($self.rup_table('getGridParam', 'lastpage'));\n\n        if (isNaN(pageNum) === false && pageNum > totalNum) {\n          $(this).val(totalNum);\n        }\n      }); // Tooltip al combo de selección de número de registros\n\n      jQuery('.pagControls select.ui-pg-selbox', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.select')).rup_tooltip(); // Tooltip al input de selección de página\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.input')).rup_tooltip();\n      var pagerLinkTemplate = Rup.Templates.rup.table.pager.link.bootstrap; //Cambiar flechas paginación por literales\n\n      jQuery('#first_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.primPag')\n      })).addClass('mdi mdi-page-first').removeClass('ui-pg-button');\n      jQuery('#prev_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.anterior')\n      })).addClass('mdi mdi-chevron-left').removeClass('ui-pg-button');\n      jQuery('#next_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.siguiente')\n      })).addClass('mdi mdi-chevron-right').removeClass('ui-pg-button');\n      jQuery('#last_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.ultiPag')\n      })).addClass('mdi mdi-page-last').removeClass('ui-pg-button');\n    }\n  };\n\n  TableBootstrapAdapter.prototype.createDetailNavigation = function () {\n    var $self = $(this),\n        settings = $self.data('settings'),\n        tableID = $self.attr('id');\n    var $template = $(Rup.Templates.rup.table.detail.navigation.bootstrap({\n      tableId: $self.prop('id'),\n      resultNumText: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.numResult'),\n      labelFirst: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.first'),\n      labelPrev: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.previous'),\n      labelNext: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.next'),\n      labelLast: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.last')\n    })); // var $self = $(this),\n    //     settings = $self.data(\"settings\"),\n    //     tableID = $self.attr(\"id\"),\n    //     paginationBarTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.paginationBar\"),\n    //     paginationLinkTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.paginationLink\"),\n    //     elementCounterTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.elementCounter\"),\n    //     $separator = $(jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.separator\")),\n    //     $elementCounter = $(jQuery.jgrid.format(elementCounterTmpl, tableID, jQuery.rup.STATICS, jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.numResult\"))),\n    //     $paginationBar = $(jQuery.jgrid.format(paginationBarTmpl, tableID)),\n\n    var $firstPaginationLink = $('#first_' + tableID, $template),\n        $backPaginationLink = $('#back_' + tableID, $template),\n        $forwardPaginationLink = $('#forward_' + tableID, $template),\n        $lastPaginationLink = $('#last_' + tableID, $template),\n        extpost = undefined; // $paginationBar.append($firstPaginationLink)\n    //     .append($backPaginationLink)\n    //     .append($forwardPaginationLink)\n    //     .append($lastPaginationLink);\n    // $pagina\n\n    function doLinkNavigation(linkId, $link) {\n      settings.fncGetNavigationParams.bind($self)(linkId);\n    }\n\n    $firstPaginationLink.on('click', function () {\n      doLinkNavigation('first', $(this));\n    }); // Elemento anterior\n\n    $backPaginationLink.on('click', function () {\n      doLinkNavigation('prev', $(this));\n    }); // Elemento siguiente\n\n    $forwardPaginationLink.on('click', function () {\n      doLinkNavigation('next', $(this));\n    }); // Elemento ultimo\n\n    $lastPaginationLink.on('click', function () {\n      doLinkNavigation('last', $(this));\n    }); // return $(\"<div>\").append($elementCounter).append($paginationBar).append($separator);\n    //\n\n    return $template;\n  };\n\n  TableBootstrapAdapter.prototype.multifilter = {\n    classes: {\n      container: \"form-group fix-align col-sm\",\n      label: \"formulario_linea_label\",\n      defaultFilter: {\n        container: \"form-group col-sm\",\n        checkBox: \"formulario_linea_input form-control\"\n      }\n    },\n    dropdown: {\n      dropdownIcon: 'ui-icon-gear',\n      dropdownDialogConfig: {\n        title: '<i class=\"mdi mdi-filter\" aria-hidden=\"true\"></i>'\n      }\n    }\n  };\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[TableBootstrapAdapter.prototype.NAME] = new TableBootstrapAdapter();\n  return $;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/adapter/TableBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/TableMaterialAdapter.js":
/*!*********************************************!*\
  !*** ./src/adapter/TableMaterialAdapter.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function TableMaterialAdapter() {}\n\n  TableMaterialAdapter.prototype.NAME = 'table_material';\n  TableMaterialAdapter.prototype.CONST = {\n    core: {\n      operations: {\n        defaultOperations: {\n          'add': {\n            icon: 'mdi-plus'\n          },\n          'edit': {\n            icon: 'mdi-playlist-edit'\n          },\n          'clone': {\n            icon: 'mdi-content-copy'\n          },\n          'delete': {\n            icon: 'mdi-trash-can-outline'\n          },\n          'reports': {\n            icon: 'mdi-file-export'\n          },\n          'copyButton': {\n            icon: 'mdi-clipboard-text-outline'\n          },\n          'excelButton': {\n            icon: 'mdi-file-excel'\n          },\n          'pdfButton': {\n            icon: 'mdi-file-pdf'\n          },\n          'odsButton': {\n            icon: 'mdi-file'\n          },\n          'csvButton': {\n            icon: 'mdi-file-table'\n          }\n        }\n      }\n    }\n  };\n\n  TableMaterialAdapter.prototype.configurePager = function (settings) {\n    var $self = this,\n        pagerName,\n        $pagerCenter,\n        pagerLeft,\n        pagerRight,\n        $pagerLeft,\n        $pagerCenter,\n        $pagerRight;\n\n    if (settings.pager !== undefined && settings.pager !== null) {\n      settings.$pager = $(settings.pager.indexOf('#') === 0 ? settings.pager : '#' + settings.pager);\n      pagerName = settings.$pager.attr('id');\n      settings.$pager.css('height', 'auto'); //Posibilitar redimensionar paginador\n      //Añadir clase a cada parte del paginador\n\n      $pagerLeft = $('#' + pagerName + '_left');\n      $pagerCenter = $('#' + pagerName + '_center');\n      $pagerRight = $('#' + pagerName + '_right');\n      $pagerLeft.addClass('pager_left');\n      $pagerCenter.addClass('pager_center');\n      $pagerRight.addClass('pager_right'); //pager_left\n      //**********\n      //Quitar posibles botones del paginador (y dejar la parte izquierda vacía)\n\n      $pagerLeft.html(''); //Contador de seleccionados\n\n      if (settings.multiselect === true) {\n        $pagerLeft.append($('<div></div>').addClass('ui-paging-selected').html('0 ' + jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.selected')));\n      } // Pager center\n\n\n      $pagerCenter.css('white-space', 'inherit');\n      jQuery('.pager_center table td', settings.$pager).addClass('pagControls'); // Evento de control de página máxima\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).on('change', function () {\n        var pageNum = parseInt($(this).val()),\n            totalNum = parseInt($self.rup_table('getGridParam', 'lastpage'));\n\n        if (isNaN(pageNum) === false && pageNum > totalNum) {\n          $(this).val(totalNum);\n        }\n      }); // Tooltip al combo de selección de número de registros\n\n      jQuery('.pagControls select.ui-pg-selbox', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.select')).rup_tooltip(); // Tooltip al input de selección de página\n\n      jQuery('.pagControls input.ui-pg-input', $pagerCenter).attr('title', jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.input')).rup_tooltip();\n      var pagerLinkTemplate = Rup.Templates.rup.table.pager.link.material; //Cambiar flechas paginación por literales\n\n      jQuery('#first_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.primPag')\n      })).addClass('mdi mdi-page-first').removeClass('ui-pg-button');\n      jQuery('#prev_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.anterior')\n      })).addClass('mdi mdi-chevron-left').removeClass('ui-pg-button');\n      jQuery('#next_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.siguiente')\n      })).addClass('mdi mdi-chevron-right').removeClass('ui-pg-button');\n      jQuery('#last_' + pagerName, $pagerCenter).html(pagerLinkTemplate({\n        label: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.pager.ultiPag')\n      })).addClass('mdi mdi-page-last').removeClass('ui-pg-button');\n    }\n  };\n\n  TableMaterialAdapter.prototype.createDetailNavigation = function () {\n    var $self = $(this),\n        settings = $self.data('settings'),\n        tableID = $self.attr('id');\n    var $template = $(Rup.Templates.rup.table.detail.navigation.material({\n      tableId: $self.prop('id'),\n      resultNumText: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.numResult'),\n      labelFirst: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.first'),\n      labelPrev: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.previous'),\n      labelNext: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.next'),\n      labelLast: jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.last')\n    })); // var $self = $(this),\n    //     settings = $self.data(\"settings\"),\n    //     tableID = $self.attr(\"id\"),\n    //     paginationBarTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.paginationBar\"),\n    //     paginationLinkTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.paginationLink\"),\n    //     elementCounterTmpl = jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.elementCounter\"),\n    //     $separator = $(jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.templates.detailForm.separator\")),\n    //     $elementCounter = $(jQuery.jgrid.format(elementCounterTmpl, tableID, jQuery.rup.STATICS, jQuery.rup.i18nParse(jQuery.rup.i18n.base, \"rup_table.numResult\"))),\n    //     $paginationBar = $(jQuery.jgrid.format(paginationBarTmpl, tableID)),\n\n    var $firstPaginationLink = $('#first_' + tableID, $template),\n        $backPaginationLink = $('#back_' + tableID, $template),\n        $forwardPaginationLink = $('#forward_' + tableID, $template),\n        $lastPaginationLink = $('#last_' + tableID, $template),\n        extpost = undefined; // $paginationBar.append($firstPaginationLink)\n    //     .append($backPaginationLink)\n    //     .append($forwardPaginationLink)\n    //     .append($lastPaginationLink);\n    // $pagina\n\n    function doLinkNavigation(linkId, $link) {\n      settings.fncGetNavigationParams.bind($self)(linkId);\n    }\n\n    $firstPaginationLink.on('click', function () {\n      doLinkNavigation('first', $(this));\n    }); // Elemento anterior\n\n    $backPaginationLink.on('click', function () {\n      doLinkNavigation('prev', $(this));\n    }); // Elemento siguiente\n\n    $forwardPaginationLink.on('click', function () {\n      doLinkNavigation('next', $(this));\n    }); // Elemento ultimo\n\n    $lastPaginationLink.on('click', function () {\n      doLinkNavigation('last', $(this));\n    }); // return $(\"<div>\").append($elementCounter).append($paginationBar).append($separator);\n    //\n\n    return $template;\n  };\n\n  TableMaterialAdapter.prototype.multifilter = {\n    classes: {\n      container: \"form-groupMaterial\",\n      label: \"\",\n      defaultFilter: {\n        container: \"checkbox-material\",\n        checkBox: \"\"\n      }\n    },\n    dropdown: {\n      dropdownIcon: 'ui-icon-gear',\n      dropdownDialogConfig: {\n        title: '<i class=\"mdi mdi-filter\" aria-hidden=\"true\"></i>'\n      }\n    }\n  };\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[TableMaterialAdapter.prototype.NAME] = new TableMaterialAdapter();\n  return $;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/adapter/TableMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/TimeBootstrapAdapter.js":
/*!*********************************************!*\
  !*** ./src/adapter/TimeBootstrapAdapter.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function TimeBootstrapAdapter() {}\n\n  TimeBootstrapAdapter.prototype.NAME = 'time_bootstrap';\n\n  TimeBootstrapAdapter.prototype.initIconTrigger = function (settings) {\n    var $self = this,\n        $div,\n        $button,\n        $icon;\n\n    if (!$self.is('div')) {\n      $div = $('<div>').addClass('rup-time-input-group');\n      $button = $('<button>').attr('type', 'button').addClass('ui-timepicker-trigger');\n      $icon = $('<i>').attr('aria-hidden', 'true').addClass('mdi mdi-clock');\n      $button.append($icon);\n      $self.wrap($div);\n      $button.insertAfter($self);\n      $button.on('click', function () {\n        if ($('#ui-datepicker-div').css('display') === 'none') {\n          $self.timepicker('show');\n        } else {\n          $self.timepicker('hide');\n        }\n      }); // $(\"<img>\").addClass(\"ui-timepicker-trigger\")\n      //   .attr({\n      //     \"src\":settings.buttonImage,\n      //     \"alt\":$.rup.i18nParse($.rup.i18n.base,\"rup_time.buttonText\"),\n      //     \"title\":$.rup.i18nParse($.rup.i18n.base,\"rup_time.buttonText\")\n      //   })\n      // .click(function(){\n      //   if ( $(\"#ui-datepicker-div\").css(\"display\")===\"none\"){\n      //     $self.timepicker(\"show\");\n      //   } else {\n      //     $self.timepicker(\"hide\");\n      //   }\n      // })\n      // .insertAfter($self);\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[TimeBootstrapAdapter.prototype.NAME] = new TimeBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/TimeBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/TimeJQueryUIAdapter.js":
/*!********************************************!*\
  !*** ./src/adapter/TimeJQueryUIAdapter.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function TimeJQueryUIAdapter() {}\n\n  TimeJQueryUIAdapter.prototype.NAME = 'time_jqueryui';\n\n  TimeJQueryUIAdapter.prototype.initIconTrigger = function (settings) {\n    var $self = this;\n\n    if (!$self.is('div')) {\n      $('<img>').addClass('ui-timepicker-trigger').attr({\n        'src': settings.buttonImage,\n        'alt': $.rup.i18nParse($.rup.i18n.base, 'rup_time.buttonText'),\n        'title': $.rup.i18nParse($.rup.i18n.base, 'rup_time.buttonText')\n      }).click(function () {\n        if ($('#ui-datepicker-div').css('display') === 'none') {\n          $self.timepicker('show');\n        } else {\n          $self.timepicker('hide');\n        }\n      }).insertAfter($self);\n    }\n  };\n\n  TimeJQueryUIAdapter.prototype.postConfigure = function (settings) {};\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[TimeJQueryUIAdapter.prototype.NAME] = new TimeJQueryUIAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/TimeJQueryUIAdapter.js?");

/***/ }),

/***/ "./src/adapter/TimeMaterialAdapter.js":
/*!********************************************!*\
  !*** ./src/adapter/TimeMaterialAdapter.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function TimeMaterialAdapter() {}\n\n  TimeMaterialAdapter.prototype.NAME = 'time_material';\n\n  TimeMaterialAdapter.prototype.initIconTrigger = function (settings) {\n    var $self = this,\n        $div,\n        $button,\n        $icon;\n\n    if (!$self.is('div')) {\n      $div = $('<div>').addClass('rup-time-input-group-material');\n      $button = $('<button>').attr('type', 'button').addClass('ui-timepicker-trigger');\n      $icon = $('<i>').attr('aria-hidden', 'true').addClass('mdi mdi-clock');\n      $button.append($icon);\n      $self.wrap($div);\n      $button.insertAfter($self); // Añade los labels tras el input al que esten asociados.\n\n      var allLabels = $('label[for=\"' + $self[0].id + '\"]');\n      $.each(allLabels, function (key, label) {\n        // En caso de tener mas de un label, entrara por el if (la primera iteracion siempre se añade al dom directamente).\n        if (key > 0) {\n          var previousLabelLeftValue = allLabels[key - 1].offsetLeft;\n          var previousLabelWidthValue = $(allLabels[key - 1]).outerWidth();\n          $(label).css({\n            left: '' + (previousLabelLeftValue + previousLabelWidthValue + 10) + 'px'\n          });\n          $(label).insertAfter($(allLabels[key - 1]));\n        } else {\n          $(label).insertAfter($button);\n        }\n      });\n      $button.on('click', function () {\n        if ($('#ui-datepicker-div').css('display') === 'none') {\n          $self.timepicker('show');\n        } else {\n          $self.timepicker('hide');\n        }\n      });\n    } // Estiliza el dialogo\n\n\n    $(\".ui-datepicker, .ui-datepicker-inline\").addClass(\"material-datepicker\");\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[TimeMaterialAdapter.prototype.NAME] = new TimeMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/TimeMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/ToolbarBootstrapAdapter.js":
/*!************************************************!*\
  !*** ./src/adapter/ToolbarBootstrapAdapter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function ToolbarBootstrapAdapter() {}\n\n  ToolbarBootstrapAdapter.prototype.NAME = 'toolbar_bootstrap';\n\n  ToolbarBootstrapAdapter.prototype.addButton = function (obj, json_i18n) {\n    var buttonId, rightObjects; // Se obtiene el identificador del boton. En caso de no haberse indicado un valor en la propiedad id, se toma el valor de la propiedad i18nCaption.\n\n    if (obj.id) {\n      buttonId = obj.id;\n    } else {\n      buttonId = obj.i18nCaption;\n    } // Se comprueba si el id del boton contiene el identificador de la botonera. En caso de no existir se añade al principio.\n\n\n    if (buttonId.indexOf($(this).attr('id')) !== 0) {\n      buttonId = $(this).attr('id') + '##' + buttonId;\n    } // var boton = $(\"<button type='button'></button>\").text($.rup.i18nParse(json_i18n,obj.i18nCaption)).addClass(\"rup-toolbar_button\").attr({\n    //   \"id\":buttonId\n    // });\n\n\n    var boton = $(Rup.Templates.rup.toolbar.button.bootstrap({\n      id: buttonId,\n      css: obj.css,\n      label: obj.text ? obj.text : $.rup.i18nParse(json_i18n, obj.i18nCaption)\n    }));\n    boton.rup_button(obj); // boton.button(\"option\", \"icons\", {primary:obj.css, secondary:null} );\n    // if(obj.right !== undefined && obj.right === true){\n    //   boton.addClass(\"rup-button-right\");\n    // }\n    // Si fuera necesario, se añade el estilo para la ubicación derecha y se gestiona su indexado\n\n    if (obj.right !== undefined && obj.right === true) {\n      //Añadir botón a la derecha\n      var $div_rightObjects = this.children('div:not(.rup-dropdown-btn-group):not(.rup-mbutton )');\n\n      if ($div_rightObjects.length === 0) {\n        $div_rightObjects = $('<div></div>').attr('id', this.attr('id') + '-rightButtons').css('float', 'right');\n        this.append($div_rightObjects);\n      } //\t\t\t\tif (boton.parent().is(\".rup-dropdown-btn-group\")){\n      //\t\t\t\t\tboton.parent().prependTo($div_rightObjects);\n      //\t\t\t\t}else{\n\n\n      boton.prependTo($div_rightObjects); //\t\t\t\t}\n    } else {\n      if (boton.parent().is('.rup-dropdown-btn-group')) {\n        $(this).append(boton.parent());\n      } else {\n        $(this).append(boton);\n      }\n    } //Añadir evento keydown\n\n\n    this._setKeyDown(boton); // Al perder el foco se elimina el estilo de disponer del foco\n\n\n    boton.on('focusout', function () {\n      $(this).removeClass('ui-state-focus');\n    });\n    return boton;\n  };\n\n  ToolbarBootstrapAdapter.prototype.addMButton = function (obj, json_i18n) {\n    //añade a la toolbar un 'mbutton' (sin botones)\n    var botonGrp,\n        boton = '',\n        buttonId;\n\n    if (obj.id === undefined) {\n      $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_toolbar.mbuttonsIdError'));\n      boton = null;\n    } else {\n      buttonId = obj.id; // Se comprueba si el id del boton contiene el identificador de la botonera. En caso de no existir se añade al principio.\n\n      if (buttonId.indexOf($(this).attr('id')) !== 0) {\n        buttonId = $(this).attr('id') + '##' + obj.id;\n      }\n\n      botonGrp = $(Rup.Templates.rup.toolbar.mbutton.bootstrap({\n        idParent: obj.idParent,\n        id: buttonId,\n        css: obj.css,\n        groupClasses: obj.groupClasses,\n        label: obj.text ? obj.text : $.rup.i18nParse(json_i18n, obj.i18nCaption)\n      }));\n      boton = botonGrp.find('[id=\\'' + buttonId + '\\']'); //Si no se define un estilo especial se aplica por defecto\n\n      if (obj.css === undefined) {\n        obj.css = 'rup-toolbar_menuButtonIcon';\n      }\n\n      boton.rup_button();\n    }\n\n    if (obj.right !== undefined && obj.right === true) {\n      botonGrp.addClass(\"rup-button-right\");\n    } // Si fuera necesario, se añade el estilo para la ubicación derecha y se gestiona su indexado\n\n\n    if (obj.right !== undefined && obj.right === true) {\n      //Añadir botón a la derecha\n      var $div_rightObjects = this.children('div:not(.rup-dropdown-btn-group):not(.rup-mbutton )');\n\n      if ($div_rightObjects.length === 0) {\n        $div_rightObjects = $('<div></div>').attr('id', this.attr('id') + '-rightButtons').css('float', 'right');\n        this.append($div_rightObjects);\n      }\n\n      botonGrp.prependTo($div_rightObjects);\n    } else {\n      $(this).append(botonGrp);\n    } //Añadir evento keydown\n\n\n    this._setKeyDown(boton);\n\n    if (obj.click) {\n      //Añadir eventos\n      boton.click({\n        i18nCaption: obj.i18nCaption\n      }, obj.click);\n    }\n\n    return botonGrp;\n  };\n\n  ToolbarBootstrapAdapter.prototype.addButtonsToMButton = function (buttons, menuButton, json_i18n) {\n    //añade botones al 'mbutton'\n    var ul, length, boton, buttonId; //numero de botones a añadir\n\n    length = buttons.length;\n    menuButton.find('button').attr(\"href\", \"#\"); //Se añaden cada uno de los botones del menuButton\n\n    ul = menuButton.find('ul[id=\"' + menuButton.find('button').attr('id') + '-mbutton-container\"]');\n\n    for (var i = length - 1; i >= 0; i--) {\n      boton = buttons[i];\n\n      if (boton.id) {\n        buttonId = menuButton.find('button').attr('id') + '##' + boton.id;\n      } else {\n        buttonId = menuButton.find('button').attr('id') + '##' + boton.i18nCaption;\n      }\n\n      buttons[i].id = buttonId;\n      ul.append($('<li>').append(this.addButton(buttons[i], json_i18n)));\n    }\n\n    if ($('[id =\"' + menuButton.attr(\"id\") + '-mbutton-container' + '\"]').children().length != length) {\n      $('[id =\"' + menuButton.attr(\"id\") + '-mbutton-container' + '\"]').append(ul.children());\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ToolbarBootstrapAdapter.prototype.NAME] = new ToolbarBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ToolbarBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/ToolbarJQueryUIAdapter.js":
/*!***********************************************!*\
  !*** ./src/adapter/ToolbarJQueryUIAdapter.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function ToolbarJQueryUIAdapter() {}\n\n  ToolbarJQueryUIAdapter.prototype.NAME = 'toolbar_jqueryui';\n\n  ToolbarJQueryUIAdapter.prototype.addButton = function (obj, json_i18n) {\n    //añade a la toolbar un 'button'\n    var buttonId, rightObjects; // Se obtiene el identificador del boton. En caso de no haberse indicado un valor en la propiedad id, se toma el valor de la propiedad i18nCaption.\n\n    if (obj.id) {\n      buttonId = obj.id;\n    } else {\n      buttonId = obj.i18nCaption;\n    } // Se comprueba si el id del boton contiene el identificador de la botonera. En caso de no existir se añade al principio.\n\n\n    if (buttonId.indexOf($(this).attr('id')) !== 0) {\n      buttonId = $(this).attr('id') + '##' + buttonId;\n    }\n\n    var boton = $('<button type=\\'button\\'></button>').text($.rup.i18nParse(json_i18n, obj.i18nCaption)).addClass('rup-toolbar_button').attr({\n      'id': buttonId\n    });\n    boton.rup_button(obj);\n    boton.button('option', 'icons', {\n      primary: obj.css,\n      secondary: null\n    }); // Si fuera necesario, se añade el estilo para la ubicación derecha y se gestiona su indexado\n\n    if (obj.right !== undefined && obj.right === true) {\n      //Añadir botón a la derecha\n      var $div_rightObjects = this.children('div:not(.rup-dropdown-btn-group)');\n\n      if ($div_rightObjects.length === 0) {\n        $div_rightObjects = $('<div></div>').attr('id', this.attr('id') + '-rightButtons').css('float', 'right');\n        this.append($div_rightObjects);\n      } //\t\t\t\tif (boton.parent().is(\".rup-dropdown-btn-group\")){\n      //\t\t\t\t\tboton.parent().prependTo($div_rightObjects);\n      //\t\t\t\t}else{\n\n\n      boton.prependTo($div_rightObjects); //\t\t\t\t}\n    } else {\n      if (boton.parent().is('.rup-dropdown-btn-group')) {\n        $(this).append(boton.parent());\n      } else {\n        $(this).append(boton);\n      }\n    } //Añadir evento keydown\n\n\n    this._setKeyDown(boton); // Al perder el foco se elimina el estilo de disponer del foco\n\n\n    boton.on('focusout', function () {\n      $(this).removeClass('ui-state-focus');\n    });\n    return boton;\n  };\n\n  ToolbarJQueryUIAdapter.prototype.addMButton = function (obj, json_i18n) {\n    //añade a la toolbar un 'mbutton' (sin botones)\n    var boton = '',\n        buttonId;\n\n    if (obj.id === undefined) {\n      $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_toolbar.mbuttonsIdError'));\n      boton = null;\n    } else {\n      buttonId = obj.id; // Se comprueba si el id del boton contiene el identificador de la botonera. En caso de no existir se añade al principio.\n\n      if (buttonId.indexOf($(this).attr('id')) !== 0) {\n        buttonId = $(this).attr('id') + '##' + obj.id;\n      }\n\n      boton = $('<a></a>').attr('id', buttonId).text($.rup.i18nParse(json_i18n, obj.i18nCaption)).addClass('rup-toolbar_menuButton'); //Si no se define un estilo especial se aplica por defecto\n\n      if (obj.css === undefined) {\n        obj.css = 'rup-toolbar_menuButtonIcon';\n      }\n\n      boton.button().button('option', 'icons', {\n        primary: null,\n        secondary: obj.css\n      });\n    } // Si fuera necesario, se añade el estilo para la ubicación derecha y se gestiona su indexado\n\n\n    if (obj.right !== undefined && obj.right === true) {\n      //Añadir botón a la derecha\n      var $div_rightObjects = this.children('div:not(.rup-dropdown-btn-group)');\n\n      if ($div_rightObjects.length === 0) {\n        $div_rightObjects = $('<div></div>').attr('id', this.attr('id') + '-rightButtons').css('float', 'right');\n        this.append($div_rightObjects);\n      }\n\n      boton.prependTo($div_rightObjects);\n    } else {\n      $(this).append(boton);\n    } //Añadir evento keydown\n\n\n    this._setKeyDown(boton);\n\n    if (obj.click) {\n      //Añadir eventos\n      boton.click({\n        i18nCaption: obj.i18nCaption\n      }, obj.click);\n    }\n\n    return boton;\n  };\n\n  ToolbarJQueryUIAdapter.prototype.addButtonsToMButton = function (buttons, menuButton, json_i18n) {\n    //añade botones al 'mbutton'\n    var div,\n        ul,\n        //numero de botones a añadir\n    length = buttons.length,\n        boton,\n        buttonId;\n\n    if ($('[id=\\'mbutton_' + menuButton.attr('id') + '\\']').length === 0) {\n      //Contenedor del menuButton\n      div = $('<div>').addClass('ui-widget ui-widget-content rup-toolbar_menuButtonContainer').attr('id', 'mbutton_' + menuButton[0].id).css('display', 'none'); //Lista no numerada del menuButton\n\n      ul = $('<ul>').attr('role', 'menu').attr('aria-activedescendant', 'active-menuitem').attr('aria-labelledby', 'active-menuitem');\n    } else {\n      div = $('[id=\\'mbutton_' + menuButton.attr('id') + '\\']');\n      ul = div.children('ul');\n    }\n\n    menuButton.attr('href', '#'); //Se añaden cada uno de los botones del menuButton\n\n    for (var i = length; i--;) {\n      boton = buttons[i];\n\n      if (boton.id) {\n        buttonId = menuButton.attr('id') + '##' + boton.id;\n      } else {\n        buttonId = menuButton.attr('id') + '##' + boton.i18nCaption;\n      }\n\n      buttons[i].id = buttonId;\n      ul.prepend($('<li>').css('display', 'block').append(this.addButton(buttons[i], json_i18n).addClass('rup-toolbar_menuButtonElement')));\n    } //Añadir elementos al DOM\n\n\n    if (!$.rup_utils.aplicatioInPortal()) {\n      div.appendTo('body');\n      div.append(ul);\n    } else {\n      div.append(ul);\n      $('.r01gContainer').append(div);\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ToolbarJQueryUIAdapter.prototype.NAME] = new ToolbarJQueryUIAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ToolbarJQueryUIAdapter.js?");

/***/ }),

/***/ "./src/adapter/ToolbarMaterialAdapter.js":
/*!***********************************************!*\
  !*** ./src/adapter/ToolbarMaterialAdapter.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function ToolbarMaterialAdapter() {}\n\n  ToolbarMaterialAdapter.prototype.NAME = 'toolbar_material';\n\n  ToolbarMaterialAdapter.prototype.addButton = function (obj, json_i18n) {\n    var buttonId, rightObjects; // Se obtiene el identificador del boton. En caso de no haberse indicado un valor en la propiedad id, se toma el valor de la propiedad i18nCaption.\n\n    if (obj.id) {\n      buttonId = obj.id;\n    } else {\n      buttonId = obj.i18nCaption;\n    } // Se comprueba si el id del boton contiene el identificador de la botonera. En caso de no existir se añade al principio.\n\n\n    if (buttonId.indexOf($(this).attr('id')) !== 0) {\n      buttonId = $(this).attr('id') + '##' + buttonId;\n    } // var boton = $(\"<button type='button'></button>\").text($.rup.i18nParse(json_i18n,obj.i18nCaption)).addClass(\"rup-toolbar_button\").attr({\n    //   \"id\":buttonId\n    // });\n\n\n    var boton = $(Rup.Templates.rup.toolbar.button.material({\n      id: buttonId,\n      css: obj.css,\n      label: obj.text ? obj.text : $.rup.i18nParse(json_i18n, obj.i18nCaption)\n    }));\n    boton.rup_button(obj); // boton.button(\"option\", \"icons\", {primary:obj.css, secondary:null} );\n    // if(obj.right !== undefined && obj.right === true){\n    //   boton.addClass(\"rup-button-right\");\n    // }\n    // Si fuera necesario, se añade el estilo para la ubicación derecha y se gestiona su indexado\n\n    if (obj.right !== undefined && obj.right === true) {\n      //Añadir botón a la derecha\n      var $div_rightObjects = this.children('div:not(.rup-dropdown-btn-group):not(.rup-mbutton )');\n\n      if ($div_rightObjects.length === 0) {\n        $div_rightObjects = $('<div></div>').attr('id', this.attr('id') + '-rightButtons').css('float', 'right');\n        this.append($div_rightObjects);\n      } //\t\t\t\tif (boton.parent().is(\".rup-dropdown-btn-group\")){\n      //\t\t\t\t\tboton.parent().prependTo($div_rightObjects);\n      //\t\t\t\t}else{\n\n\n      boton.prependTo($div_rightObjects); //\t\t\t\t}\n    } else {\n      if (boton.parent().is('.rup-dropdown-btn-group')) {\n        $(this).append(boton.parent());\n      } else {\n        $(this).append(boton);\n      }\n    } //Añadir evento keydown\n\n\n    this._setKeyDown(boton); // Al perder el foco se elimina el estilo de disponer del foco\n\n\n    boton.on('focusout', function () {\n      $(this).removeClass('ui-state-focus');\n    });\n    return boton;\n  };\n\n  ToolbarMaterialAdapter.prototype.addMButton = function (obj, json_i18n) {\n    //añade a la toolbar un 'mbutton' (sin botones)\n    var botonGrp,\n        boton = '',\n        buttonId;\n\n    if (obj.id === undefined) {\n      $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_toolbar.mbuttonsIdError'));\n      boton = null;\n    } else {\n      buttonId = obj.id; // Se comprueba si el id del boton contiene el identificador de la botonera. En caso de no existir se añade al principio.\n\n      if (buttonId.indexOf($(this).attr('id')) !== 0) {\n        buttonId = $(this).attr('id') + '##' + obj.id;\n      }\n\n      botonGrp = $(Rup.Templates.rup.toolbar.mbutton.material({\n        idParent: obj.idParent,\n        id: buttonId,\n        css: obj.css,\n        groupClasses: obj.groupClasses,\n        label: obj.text ? obj.text : $.rup.i18nParse(json_i18n, obj.i18nCaption)\n      }));\n      boton = botonGrp.find('[id=\\'' + buttonId + '\\']'); //Si no se define un estilo especial se aplica por defecto\n\n      if (obj.css === undefined) {\n        obj.css = 'rup-toolbar_menuButtonIcon';\n      }\n\n      boton.rup_button();\n    }\n\n    if (obj.right !== undefined && obj.right === true) {\n      botonGrp.addClass('rup-button-right');\n    } // Si fuera necesario, se añade el estilo para la ubicación derecha y se gestiona su indexado\n\n\n    if (obj.right !== undefined && obj.right === true) {\n      //Añadir botón a la derecha\n      var $div_rightObjects = this.children('div:not(.rup-dropdown-btn-group):not(.rup-mbutton )');\n\n      if ($div_rightObjects.length === 0) {\n        $div_rightObjects = $('<div></div>').attr('id', this.attr('id') + '-rightButtons').css('float', 'right');\n        this.append($div_rightObjects);\n      }\n\n      botonGrp.prependTo($div_rightObjects);\n    } else {\n      $(this).append(botonGrp);\n    } //Añadir evento keydown\n\n\n    this._setKeyDown(boton);\n\n    if (obj.click) {\n      //Añadir eventos\n      boton.click({\n        i18nCaption: obj.i18nCaption\n      }, obj.click);\n    }\n\n    return botonGrp;\n  };\n\n  ToolbarMaterialAdapter.prototype.addButtonsToMButton = function (buttons, menuButton, json_i18n) {\n    //añade botones al 'mbutton'\n    var ul, length, boton, buttonId; //numero de botones a añadir\n\n    length = buttons.length;\n    menuButton.find('button').attr('href', '#'); //Se añaden cada uno de los botones del menuButton\n\n    ul = menuButton.find('ul[id=\"' + menuButton.find('button').attr('id') + '-mbutton-container\"]');\n\n    for (var i = length - 1; i >= 0; i--) {\n      boton = buttons[i];\n\n      if (boton.id) {\n        buttonId = menuButton.find('button').attr('id') + '##' + boton.id;\n      } else {\n        buttonId = menuButton.find('button').attr('id') + '##' + boton.i18nCaption;\n      }\n\n      buttons[i].id = buttonId;\n      ul.append($('<li>').append(this.addButton(buttons[i], json_i18n)));\n    }\n\n    if ($('[id =\"' + menuButton.attr('id') + '-mbutton-container' + '\"]').children().length != length) {\n      $('[id =\"' + menuButton.attr('id') + '-mbutton-container' + '\"]').append(ul.children());\n    }\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ToolbarMaterialAdapter.prototype.NAME] = new ToolbarMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ToolbarMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/UploadBootstrapAdapter.js":
/*!***********************************************!*\
  !*** ./src/adapter/UploadBootstrapAdapter.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($, Rup) {\n  function UploadBootstrapAdapter() {}\n\n  UploadBootstrapAdapter.prototype.NAME = 'upload_bootstrap';\n\n  UploadBootstrapAdapter.prototype.processdone = function (e, data) {//$(e.target).find('.start').removeAttr('disabled');\n  };\n\n  UploadBootstrapAdapter.prototype.downloadTemplate = function (o) {\n    var that = this,\n        rows = $(),\n        files = o.files,\n        options = o.options;\n    rows = $('<ul>').addClass('list-group');\n    return Rup.Templates.rup.upload.downloadTemplate({\n      files: files\n    });\n  };\n\n  UploadBootstrapAdapter.prototype.uploadTemplate = function (o) {\n    var that = this,\n        rows = $(),\n        files = o.files,\n        options = o.options;\n    return Rup.Templates.rup.upload.uploadTemplate({\n      files: files,\n      submitInForm: options.submitInForm === true ? true : undefined,\n      notSubmitInForm: !(options.submitInForm === true ? true : undefined)\n    });\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[UploadBootstrapAdapter.prototype.NAME] = new UploadBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/UploadBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/UploadJQueryUIAdapter.js":
/*!**********************************************!*\
  !*** ./src/adapter/UploadJQueryUIAdapter.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function UploadJQueryUIAdapter() {}\n\n  UploadJQueryUIAdapter.prototype.NAME = 'upload_jqueryui';\n\n  UploadJQueryUIAdapter.prototype.processdone = function (e, data) {\n    $(e.target).find('.start').button('enable');\n  };\n\n  UploadJQueryUIAdapter.prototype.downloadTemplate = function (o) {\n    var that = this,\n        rows = $(),\n        files = o.files,\n        options = o.options;\n    $.each(files, function (index, file) {\n      // file = that._downloadTemplateHelper(file);\n      var row = $('<tr class=\"template-download\"><td>' + (file.error ? '<td class=\"file_icon\"></td>' + '<td class=\"name\"></td>' + '<td class=\"size\"></td>' + '<td class=\"error\" colspan=\"2\"></td>' : '<div class=\"formulario_columna_cnt\">' + '<span class=\"izq_float file_icon\">&nbsp;</span>' + '<div class=\"izq_float name\"><a></a></div>' + '</div>' + '<div class=\"formulario_columna_cnt\">' + '<div class=\"izq_float type\"></div>' + '<div class=\"izq_float size\"></div>' + '</div>' + '<div class=\"formulario_columna_cnt\">' + '<a><div class=\"izq_float\">' + '<div class=\"file_download\" >' + '<span class=\"file_download_icon\">&nbsp;</span>' + '<span class=\"file_download_text\">' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.openUploaded') + '</span></div>' + '</div></a>' + '<div class=\"izq_float delete\"><button>' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.deleteUploaded') + '</button></div>' + '</div>') + '</td></tr>');\n      row.find('.size').text(file.sizef);\n      row.find('.type').text(file.type);\n\n      if (file.error) {\n        row.find('.name').text(file.name);\n        row.addClass('ui-state-error');\n        row.find('.error').text(options.errorMessages[file.error] || file.error);\n      } else {\n        row.find('.name a').text(file.name);\n\n        if (file.thumbnail_url) {\n          row.find('.preview').append('<a><img></a>').find('img').prop('src', file.thumbnail_url);\n          row.find('a').prop('target', '_blank');\n        }\n\n        row.find('a').prop('href', $.rup_utils.setNoPortalParam(file.url));\n        row.find('.delete button').attr('data-type', file.delete_type).attr('data-url', $.rup_utils.setNoPortalParam(file.delete_url));\n      }\n\n      rows = rows.add(row);\n    });\n    return rows;\n  };\n\n  UploadJQueryUIAdapter.prototype.uploadTemplate = function (o) {\n    var that = this,\n        rows = $(),\n        files = o.files,\n        options = o.options; // var settings = $.data(this.element[0], \"settings\");\n\n    $.each(files, function (index, file) {\n      // file = that._uploadTemplateHelper(file);\n      var row = $('<tr class=\"template-upload\"><td>' + '<div class=\"formulario_columna_cnt\">' + '<span class=\"izq_float file_icon\">&nbsp;</span>' + '<div class=\"izq_float name\"><b></b></div>' + '<div class=\"formulario_columna_cnt\">' + '<div class=\"izq_float type\"></div>' + '<div class=\"izq_float size\"></div>' + (options.submitInForm ? '<div class=\"izq_float cancel\" style><button>' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.cancelUpload') + '</button></div>' : '') + '</div>' + (!options.submitInForm ? '<div class=\"formulario_columna_cnt\">' + (file.error ? '<div class=\"izq_float error\" ></div>' : '<div class=\"izq_float progress\"><div></div></div>' + '<div class=\"izq_float fileupload-buttonbar\"><button class=\"start\">' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.startUpload') + '</button>') + '<button class=\"cancel\">' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.cancelUpload') + '</button>' + '</div>' : '<div class=\"izq_float start fileupload-buttonbar ui-button\" style=\"display:none\"><button>' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.startUpload') + '</button></div>') + '</td></tr>');\n      row.find('.name b').text(file.name);\n      row.find('.size').text(file.sizef);\n      row.find('.type').text(file.type);\n\n      if (file.error) {\n        row.addClass('ui-state-error');\n        row.find('.error').text(options.errorMessages[file.error] || file.error);\n      }\n\n      rows = rows.add(row);\n    });\n    return rows;\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[UploadJQueryUIAdapter.prototype.NAME] = new UploadJQueryUIAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/UploadJQueryUIAdapter.js?");

/***/ }),

/***/ "./src/adapter/ValidateBootstrapAdapter.js":
/*!*************************************************!*\
  !*** ./src/adapter/ValidateBootstrapAdapter.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function ValidateBootstrapAdapter() {}\n\n  ValidateBootstrapAdapter.prototype.NAME = 'validate_bootstrap';\n\n  ValidateBootstrapAdapter.prototype.forLabelElement = function (contextForm, labelAttributes) {\n    if (labelAttributes.labelForTitle !== undefined && labelAttributes.labelForTitle !== '') {\n      return $(contextForm).find(\":input[id='\" + labelAttributes.labelForId + \"']\").attr(\"oldtitle\");\n    } else if (labelAttributes.labelForId !== undefined && labelAttributes.labelForId !== '') {\n      return $(contextForm).find(\"label[for='\" + labelAttributes.labelForId + \"']\").text();\n    } else {\n      return $(contextForm).find(\"label[for='\" + labelAttributes.labelForName + \"']\").text();\n    }\n  };\n\n  ValidateBootstrapAdapter.prototype.forInputNameElement = function (contextForm, labelAttributes) {\n    return $(contextForm).find(\"label[for='\" + labelAttributes.labelForName + \"']\");\n  };\n\n  ValidateBootstrapAdapter.prototype.forInputIdElement = function (contextForm, labelAttributes) {\n    return contextForm.elements[labelAttributes.labelForId];\n  };\n\n  ValidateBootstrapAdapter.prototype.highlight = function (element, errorClass) {\n    clearValidation(element);\n    $(element).addClass('error');\n  };\n\n  ValidateBootstrapAdapter.prototype.unhighlight = function (element) {\n    clearValidation(element);\n    $(element).removeClass('error');\n  };\n\n  function clearValidation(element) {\n    if ($(element).parent().hasClass('rup-validate-field-error')) {\n      $(element).parent().find('.rup-validate-error-icon').remove();\n      $(element).unwrap();\n      $(element).parent().find('div').remove();\n    }\n  }\n\n  ValidateBootstrapAdapter.prototype.errorElement = 'div';\n\n  ValidateBootstrapAdapter.prototype.errorPlacement = function (error, element) {\n    //limpiar errores previos\n\n    /*  if (element.parent().hasClass(\"\")) {\r\n          element.parent().find(\".rup-validate-error-icon\").remove();\r\n          element.unwrap();\r\n        }*/\n    // var errorElem = error.attr(\"src\",this.errorImage).addClass(\"rup-maint_validateIcon\").html('').rup_tooltip({\"applyToPortal\": true});\n    //\n    // if (element.attr(\"ruptype\")==='combo'){\n    //   var comboElem = $(\"#\"+element.attr(\"id\")+\"-button\");\n    //   if (comboElem){\n    //     errorElem.insertAfter(comboElem);\n    //   }\n    // }else{\n    // var $inputGroup = $(\"<div>\").addClass(\"form-input-group\");\n    // var $iconError = $(\"<i>\").addClass(\"mdi mdi-close\");\n    // element.wrap($inputGroup);\n    var name = element.prop('name'),\n        labelProp = this.labels ? this.labels[name] : undefined,\n        $labelContainer = $(labelProp),\n        iconProp = this.icons ? this.icons[name] : undefined,\n        $iconContainer = $(iconProp),\n        $icon = $('<i>').addClass('rup-validate-error-icon error mdi mdi-close').attr('aria-hidden', 'true'); // Posicionamiento del label\n\n    if ($labelContainer.length > 0) {\n      $labelContainer.append(error);\n    } else {\n      error.insertAfter(element);\n    } // Posicionamiento del icon\n\n\n    if ($iconContainer.length > 0) {\n      $iconContainer.append($icon);\n    } else {\n      if (!element.parent().hasClass('rup-validate-field-error')) {\n        element.wrap($('<div>').addClass('rup-validate-field-error'));\n        $icon.insertAfter(element);\n      }\n    } // $iconError.insertAfter(element);\n    // }\n\n  };\n\n  ValidateBootstrapAdapter.prototype.showLabel = function (element, message) {\n    var label = this.errorsFor(element),\n        settings = $(this.currentForm).data('settings');\n\n    if (label.length) {\n      // refresh error/success class\n      label.removeClass(this.settings.validClass).addClass(this.settings.errorClass); // check if we have a generated label, replace the message then\n\n      label.attr('generated') && label.html(message);\n    } else {\n      // create label\n      if (this.settings.showFieldErrorAsDefault) {\n        label = $('<' + this.settings.errorElement + '></label>').attr({\n          'for': this.idOrName(element),\n          generated: true\n        }).addClass(this.settings.errorClass).html(message || '');\n      } else {\n        label = $('<' + this.settings.errorElement + '></label>').attr({\n          'for': this.idOrName(element),\n          generated: true\n        }).addClass(this.settings.errorClass).html(message || '');\n      }\n\n      if (this.settings.wrapper) {\n        // make sure the element is visible, even in IE\n        // actually showing the wrapped element is handled elsewhere\n        label = label.hide().show().wrap('<' + this.settings.wrapper + '></label>').parent();\n      }\n\n      if (!this.labelContainer.append(label).length) this.settings.errorPlacement ? this.settings.errorPlacement(label, $(element)) : label.insertAfter(element);\n    }\n\n    if (!message && settings.success) {\n      label.text('');\n      typeof this.settings.success == 'string' ? label.addClass(this.settings.success) : this.settings.success(label);\n    }\n\n    this.toShow = this.toShow.add(label);\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ValidateBootstrapAdapter.prototype.NAME] = new ValidateBootstrapAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ValidateBootstrapAdapter.js?");

/***/ }),

/***/ "./src/adapter/ValidateJQueryUIAdapter.js":
/*!************************************************!*\
  !*** ./src/adapter/ValidateJQueryUIAdapter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function ValidateJQueryUIAdapter() {}\n\n  ValidateJQueryUIAdapter.prototype.NAME = 'validate_jqueryui';\n\n  ValidateJQueryUIAdapter.prototype.forLabelElement = function (fieldTmp, labelAttributes) {\n    if (labelAttributes.labelForTitle !== undefined && labelAttributes.labelForTitle !== '') {\n      return $(fieldTmp).attr(\"oldtitle\");\n    } else if (labelAttributes.labelForId !== undefined && labelAttributes.labelForId !== '') {\n      return $(\"#\" + fieldTmp.id).find(\"label[for='\" + labelAttributes.labelForId + \"']\").text();\n    } else {\n      return $(\"#\" + fieldTmp.id).find(\"label[for='\" + labelAttributes.labelForName + \"']\").text();\n    }\n  };\n\n  ValidateJQueryUIAdapter.prototype.forInputNameElement = function (fieldTmp, labelAttributes) {\n    return $(\"#\" + fieldTmp.id).find(\"label[for='\" + labelAttributes.labelForName + \"']\");\n  };\n\n  ValidateJQueryUIAdapter.prototype.forInputIdElement = function (fieldTmp, labelAttributes) {\n    return $(\"#\" + fieldTmp.id).find(':input[id=\\'' + labelAttributes.labelForId + '\\']')[0];\n  };\n\n  ValidateJQueryUIAdapter.prototype.highlight = function (element, errorClass) {\n    $(element).addClass('error');\n  };\n\n  ValidateJQueryUIAdapter.prototype.unhighlight = function (element, errorClass) {\n    $(element).removeClass('error');\n  };\n\n  ValidateJQueryUIAdapter.prototype.errorElement = 'img';\n\n  ValidateJQueryUIAdapter.prototype.errorPlacement = function (error, element) {\n    var errorElem = error.attr('src', this.errorImage).addClass('rup-maint_validateIcon').html('').rup_tooltip({\n      'applyToPortal': true\n    });\n\n    if (element.attr('ruptype') === 'combo') {\n      var comboElem = $('#' + element.attr('id') + '-button');\n\n      if (comboElem) {\n        errorElem.insertAfter(comboElem);\n      }\n    } else {\n      errorElem.insertAfter(element);\n    }\n  };\n\n  ValidateJQueryUIAdapter.prototype.showLabel = function (element, message) {\n    var label = this.errorsFor(element),\n        settings = $(this.currentForm).data('settings');\n\n    if (label.length) {\n      // refresh error/success class\n      label.removeClass(this.settings.validClass).addClass(this.settings.errorClass); // check if we have a generated label, replace the message then\n\n      label.attr('generated') && label.html(message);\n    } else {\n      // create label\n      if (settings.showFieldErrorAsDefault) {\n        label = $('<' + this.settings.errorElement + '></label>').attr({\n          'for': this.idOrName(element),\n          generated: true\n        }).addClass(this.settings.errorClass).attr('title', message || '');\n      } else {\n        label = $('<' + this.settings.errorElement + '></label>').attr({\n          'for': this.idOrName(element),\n          generated: true\n        }).addClass(this.settings.errorClass).html(message || '');\n      }\n\n      if (this.settings.wrapper) {\n        // make sure the element is visible, even in IE\n        // actually showing the wrapped element is handled elsewhere\n        label = label.hide().show().wrap('<' + this.settings.wrapper + '></label>').parent();\n      }\n\n      if (!this.labelContainer.append(label).length) this.settings.errorPlacement ? this.settings.errorPlacement(label, $(element)) : label.insertAfter(element);\n    }\n\n    if (!message && this.settings.success) {\n      label.text('');\n      typeof this.settings.success == 'string' ? label.addClass(this.settings.success) : this.settings.success(label);\n    }\n\n    this.toShow = this.toShow.add(label);\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ValidateJQueryUIAdapter.prototype.NAME] = new ValidateJQueryUIAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ValidateJQueryUIAdapter.js?");

/***/ }),

/***/ "./src/adapter/ValidateMaterialAdapter.js":
/*!************************************************!*\
  !*** ./src/adapter/ValidateMaterialAdapter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ../templates */ \"./src/templates.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(this, function ($) {\n  function ValidateMaterialAdapter() {}\n\n  ValidateMaterialAdapter.prototype.NAME = 'validate_material';\n\n  ValidateMaterialAdapter.prototype.forLabelElement = function (contextForm, labelAttributes) {\n    if (labelAttributes.labelForTitle !== undefined && labelAttributes.labelForTitle !== '') {\n      return $(contextForm).find(\":input[id='\" + labelAttributes.labelForId + \"']\").attr(\"oldtitle\");\n    } else if (labelAttributes.labelForId !== undefined && labelAttributes.labelForId !== '') {\n      return $(contextForm).find(\"label[for='\" + labelAttributes.labelForId + \"']\").text();\n    } else {\n      return $(contextForm).find(\"label[for='\" + labelAttributes.labelForName + \"']\").text();\n    }\n  };\n\n  ValidateMaterialAdapter.prototype.forInputNameElement = function (contextForm, labelAttributes) {\n    return $(contextForm).find(\"label[for='\" + labelAttributes.labelForName + \"']\");\n  };\n\n  ValidateMaterialAdapter.prototype.forInputIdElement = function (contextForm, labelAttributes) {\n    return contextForm.elements[labelAttributes.labelForId];\n  };\n\n  ValidateMaterialAdapter.prototype.highlight = function (element, errorClass) {\n    clearValidation(element);\n    $(element).addClass('error');\n  };\n\n  ValidateMaterialAdapter.prototype.unhighlight = function (element) {\n    clearValidation(element);\n    $(element).removeClass('error');\n  };\n\n  function clearValidation(element) {\n    var $element = $(element);\n    var $container = $element.parent();\n\n    if ($element[0].type === 'checkbox' || $element[0].type === 'radio') {\n      $container = $element.parents('.form-row').find('label[data-title=\"' + $element.prop('name') + '\"]');\n    } else if ($element.attr('ruptype') === 'date') {\n      $container = $element.closest('.rup-validate-field-error');\n    }\n\n    if ($container.hasClass('rup-validate-field-error')) {\n      $container.removeClass('rup-validate-field-error');\n      $container.find('i.mdi.error').remove();\n      $container.find('span.error').remove();\n    }\n  }\n\n  ValidateMaterialAdapter.prototype.errorElement = 'span';\n\n  ValidateMaterialAdapter.prototype.errorPlacement = function (error, element) {\n    var name = element.prop('name'),\n        $container = element.parent(),\n        $icon = $('<i class=\"mdi mdi-close error\" aria-hidden=\"true\"></i>'); //si el elemento a validar es date, hay que buscar el siguiente parent\n\n    if ($container.hasClass('rup-date-input-group-material')) {\n      $container = $container.parent();\n    } // Si el elemento a validar es un checkbox/radio elegir otra posicion para su correcto visualizacion\n\n\n    if (element[0].type === \"checkbox\" || element[0].type === \"radio\") {\n      $container = element.parents(\".form-row\").find(\"label[data-title='\" + name + \"']\");\n      $icon.addClass(\"ml-3\");\n    } // Posicionamiento del label e icon\n\n\n    $container.addClass('rup-validate-field-error').append($icon).append(error);\n  };\n\n  ValidateMaterialAdapter.prototype.showLabel = function (element, message) {\n    var label = this.errorsFor(element),\n        settings = $(this.currentForm).data('settings');\n\n    if (label.length) {\n      // refresh error/success class\n      label.removeClass(this.settings.validClass).addClass(this.settings.errorClass); // check if we have a generated label, replace the message then\n\n      label.attr('generated') && label.html(message);\n    } else {\n      // create label\n      if (this.settings.showFieldErrorAsDefault) {\n        label = $('<' + this.settings.errorElement + '></label>').attr({\n          'for': this.idOrName(element),\n          generated: true\n        }).addClass(this.settings.errorClass).html(message || '');\n      } else {\n        label = $('<' + this.settings.errorElement + '></label>').attr({\n          'for': this.idOrName(element),\n          generated: true\n        }).addClass(this.settings.errorClass).html(message || '');\n      }\n\n      if (this.settings.wrapper) {\n        // make sure the element is visible, even in IE\n        // actually showing the wrapped element is handled elsewhere\n        label = label.hide().show().wrap('<' + this.settings.wrapper + '></label>').parent();\n      }\n\n      if (!this.labelContainer.append(label).length) this.settings.errorPlacement ? this.settings.errorPlacement(label, $(element)) : label.insertAfter(element);\n    }\n\n    if (!message && settings.success) {\n      label.text('');\n      typeof this.settings.success == 'string' ? label.addClass(this.settings.success) : this.settings.success(label);\n    }\n\n    this.toShow = this.toShow.add(label);\n  };\n\n  $.rup = $.rup || {};\n  $.rup.adapter = $.rup.adapter || {};\n  $.rup.adapter[ValidateMaterialAdapter.prototype.NAME] = new ValidateMaterialAdapter();\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/ValidateMaterialAdapter.js?");

/***/ }),

/***/ "./src/adapter/rup.adapter.js":
/*!************************************!*\
  !*** ./src/adapter/rup.adapter.js ***!
  \************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global jQuery */\n\n/*global define */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./DateBootstrapAdapter */ \"./src/adapter/DateBootstrapAdapter.js\"), __webpack_require__(/*! ./DateMaterialAdapter */ \"./src/adapter/DateMaterialAdapter.js\"), __webpack_require__(/*! ./TimeJQueryUIAdapter */ \"./src/adapter/TimeJQueryUIAdapter.js\"), __webpack_require__(/*! ./TimeBootstrapAdapter */ \"./src/adapter/TimeBootstrapAdapter.js\"), __webpack_require__(/*! ./TimeMaterialAdapter */ \"./src/adapter/TimeMaterialAdapter.js\"), __webpack_require__(/*! ./UploadJQueryUIAdapter */ \"./src/adapter/UploadJQueryUIAdapter.js\"), __webpack_require__(/*! ./UploadBootstrapAdapter */ \"./src/adapter/UploadBootstrapAdapter.js\"), __webpack_require__(/*! ./ButtonJQueryUIAdapter */ \"./src/adapter/ButtonJQueryUIAdapter.js\"), __webpack_require__(/*! ./ButtonBootstrapAdapter */ \"./src/adapter/ButtonBootstrapAdapter.js\"), __webpack_require__(/*! ./ButtonMaterialAdapter */ \"./src/adapter/ButtonMaterialAdapter.js\"), __webpack_require__(/*! ./ToolbarJQueryUIAdapter */ \"./src/adapter/ToolbarJQueryUIAdapter.js\"), __webpack_require__(/*! ./ToolbarBootstrapAdapter */ \"./src/adapter/ToolbarBootstrapAdapter.js\"), __webpack_require__(/*! ./ToolbarMaterialAdapter */ \"./src/adapter/ToolbarMaterialAdapter.js\"), __webpack_require__(/*! ./TableBootstrapAdapter */ \"./src/adapter/TableBootstrapAdapter.js\"), __webpack_require__(/*! ./TableMaterialAdapter */ \"./src/adapter/TableMaterialAdapter.js\"), __webpack_require__(/*! ./JqTableJQueryUIAdapter */ \"./src/adapter/JqTableJQueryUIAdapter.js\"), __webpack_require__(/*! ./JqTableBootstrapAdapter */ \"./src/adapter/JqTableBootstrapAdapter.js\"), __webpack_require__(/*! ./ValidateJQueryUIAdapter */ \"./src/adapter/ValidateJQueryUIAdapter.js\"), __webpack_require__(/*! ./ValidateBootstrapAdapter */ \"./src/adapter/ValidateBootstrapAdapter.js\"), __webpack_require__(/*! ./ValidateMaterialAdapter */ \"./src/adapter/ValidateMaterialAdapter.js\"), __webpack_require__(/*! ./FeedbackJQueryUIAdapter */ \"./src/adapter/FeedbackJQueryUIAdapter.js\"), __webpack_require__(/*! ./FeedbackBootstrapAdapter */ \"./src/adapter/FeedbackBootstrapAdapter.js\"), __webpack_require__(/*! ./FeedbackMaterialAdapter */ \"./src/adapter/FeedbackMaterialAdapter.js\"), __webpack_require__(/*! ./DialogBootstrapAdapter */ \"./src/adapter/DialogBootstrapAdapter.js\"), __webpack_require__(/*! ./DialogMaterialAdapter */ \"./src/adapter/DialogMaterialAdapter.js\"), __webpack_require__(/*! ./MessageBootstrapAdapter */ \"./src/adapter/MessageBootstrapAdapter.js\"), __webpack_require__(/*! ./MessageMaterialAdapter */ \"./src/adapter/MessageMaterialAdapter.js\"), __webpack_require__(/*! ./CalendarBootstrapAdapter */ \"./src/adapter/CalendarBootstrapAdapter.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, Templates, DateBootstrapAdapter, DateMaterialAdapter, TimeJQueryUIAdapter, TimeBootstrapAdapter, TimeMaterialAdapter, UploadJQueryUIAdapter, UploadBootstrapAdapter, ButtonJQueryUIAdapter, ButtonBootstrapAdapter, ButtonMaterialAdapter, ToolbarJQueryUIAdapter, ToolbarBootstrapAdapter, ToolbarMaterialAdapter, TableBootstrapAdapter, TableMaterialAdapter, JqTableJQueryUIAdapter, JqTableBootstrapAdapter, ValidateJQueryUIAdapter, ValidateBootstrapAdapter, ValidateMaterialAdapter, FeedbackJQueryUIAdapter, FeedbackBootstrapAdapter, FeedbackMaterialAdapter, DialogBootstrapAdapter, DialogMaterialAdapter, MessageBootstrapAdapter, MessageMaterialAdapter, CalendarBootstrapAdapter) {\n  return $;\n});\n\n//# sourceURL=webpack://rup/./src/adapter/rup.adapter.js?");

/***/ }),

/***/ "./src/core/ui/jquery-ui.multidatespicker.js":
/*!***************************************************!*\
  !*** ./src/core/ui/jquery-ui.multidatespicker.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\r\n * MultiDatesPicker v1.6.4\r\n * http://multidatespickr.sourceforge.net/\r\n * \r\n * Copyright 2014, Luca Lauretta\r\n * Dual licensed under the MIT or GPL version 2 licenses.\r\n */\n(function ($) {\n  $.extend($.ui, {\n    multiDatesPicker: {\n      version: \"1.6.4\"\n    }\n  });\n\n  $.fn.multiDatesPicker = function (method) {\n    var mdp_arguments = arguments;\n    var ret = this;\n    var today_date = new Date();\n    var day_zero = new Date(0);\n    var mdp_events = {};\n\n    function removeDate(date, type) {\n      if (!type) type = 'picked';\n      date = dateConvert.call(this, date);\n\n      for (var i = 0; i < this.multiDatesPicker.dates[type].length; i++) {\n        if (!methods.compareDates(this.multiDatesPicker.dates[type][i], date)) return this.multiDatesPicker.dates[type].splice(i, 1).pop();\n      }\n    }\n\n    function removeIndex(index, type) {\n      if (!type) type = 'picked';\n      return this.multiDatesPicker.dates[type].splice(index, 1).pop();\n    }\n\n    function addDate(date, type, no_sort) {\n      if (!type) type = 'picked';\n      date = dateConvert.call(this, date); // @todo: use jQuery UI datepicker method instead\n\n      date.setHours(0);\n      date.setMinutes(0);\n      date.setSeconds(0);\n      date.setMilliseconds(0);\n\n      if (methods.gotDate.call(this, date, type) === false) {\n        this.multiDatesPicker.dates[type].push(date);\n        if (!no_sort) this.multiDatesPicker.dates[type].sort(methods.compareDates);\n      }\n    }\n\n    function sortDates(type) {\n      if (!type) type = 'picked';\n      this.multiDatesPicker.dates[type].sort(methods.compareDates);\n    }\n\n    function dateConvert(date, desired_type, date_format) {\n      if (!desired_type) desired_type = 'object';\n      /*\r\n      if(!date_format && (typeof date == 'string')) {\r\n      date_format = $(this).datepicker('option', 'dateFormat');\r\n      if(!date_format) date_format = $.datepicker._defaults.dateFormat;\r\n      }\r\n      */\n\n      return methods.dateConvert.call(this, date, desired_type, date_format);\n    }\n\n    var methods = {\n      init: function init(options) {\n        var $this = $(this);\n        this.multiDatesPicker.changed = false;\n        this.multiDatesPicker.maxPicks = options.maxPicks;\n        var mdp_events = {\n          beforeShow: function beforeShow(input, inst) {\n            this.multiDatesPicker.changed = false;\n            if (this.multiDatesPicker.originalBeforeShow) this.multiDatesPicker.originalBeforeShow.call(this, input, inst);\n          },\n          onSelect: function onSelect(dateText, inst) {\n            var $this = $(this);\n            this.multiDatesPicker.changed = true;\n\n            if (inst._keyEvent) {\n              //no admitimos keyenter\n              return false;\n            }\n\n            if (dateText) {\n              $this.multiDatesPicker('toggleDate', dateText);\n              this.multiDatesPicker.changed = true; // @todo: this will be optimized when I'll move methods to the singleton.\n            }\n\n            if (this.multiDatesPicker.mode == 'normal' && this.multiDatesPicker.pickableRange) {\n              if (this.multiDatesPicker.dates.picked.length > 0) {\n                var min_date = this.multiDatesPicker.dates.picked[0],\n                    max_date = new Date(min_date.getTime());\n                methods.sumDays(max_date, this.multiDatesPicker.pickableRange - 1); // counts the number of disabled dates in the range\n\n                if (this.multiDatesPicker.adjustRangeToDisabled) {\n                  var c_disabled,\n                      disabled = this.multiDatesPicker.dates.disabled.slice(0);\n\n                  do {\n                    c_disabled = 0;\n\n                    for (var i = 0; i < disabled.length; i++) {\n                      if (disabled[i].getTime() <= max_date.getTime()) {\n                        if (min_date.getTime() <= disabled[i].getTime() && disabled[i].getTime() <= max_date.getTime()) {\n                          c_disabled++;\n                        }\n\n                        disabled.splice(i, 1);\n                        i--;\n                      }\n                    }\n\n                    max_date.setDate(max_date.getDate() + c_disabled);\n                  } while (c_disabled != 0);\n                }\n\n                if (this.multiDatesPicker.maxDate && max_date > this.multiDatesPicker.maxDate) max_date = this.multiDatesPicker.maxDate;\n                $this.datepicker(\"option\", \"minDate\", min_date).datepicker(\"option\", \"maxDate\", max_date);\n              } else {\n                $this.datepicker(\"option\", \"minDate\", this.multiDatesPicker.minDate).datepicker(\"option\", \"maxDate\", this.multiDatesPicker.maxDate);\n              }\n            }\n\n            if (this.multiDatesPicker.originalOnSelect && dateText) this.multiDatesPicker.originalOnSelect.call(this, dateText, inst);\n          },\n          beforeShowDay: function beforeShowDay(date) {\n            var $this = $(this),\n                gotThisDate = $this.multiDatesPicker('gotDate', date) !== false,\n                isDisabledCalendar = $this.datepicker('option', 'disabled'),\n                isDisabledDate = $this.multiDatesPicker('gotDate', date, 'disabled') !== false,\n                areAllSelected = this.multiDatesPicker.maxPicks <= this.multiDatesPicker.dates.picked.length;\n            var bsdReturn = [true, '', null];\n            if (this.multiDatesPicker.originalBeforeShowDay) bsdReturn = this.multiDatesPicker.originalBeforeShowDay.call(this, date);\n            bsdReturn[1] = gotThisDate ? 'ui-state-highlight ' + bsdReturn[1] : bsdReturn[1];\n            bsdReturn[0] = bsdReturn[0] && !(isDisabledCalendar || isDisabledDate || areAllSelected && !bsdReturn[1]);\n            return bsdReturn;\n          }\n        }; // value have to be extracted before datepicker is initiated\n\n        if ($this.val()) var inputDates = $this.val();\n\n        if (options) {\n          // value have to be extracted before datepicker is initiated\n          //if(options.altField) var inputDates = $(options.altField).val();\n          if (options.separator) this.multiDatesPicker.separator = options.separator;\n          if (!this.multiDatesPicker.separator) this.multiDatesPicker.separator = ', ';\n          this.multiDatesPicker.originalBeforeShow = options.beforeShow;\n          this.multiDatesPicker.originalOnSelect = options.onSelect;\n          this.multiDatesPicker.originalBeforeShowDay = options.beforeShowDay;\n          this.multiDatesPicker.originalOnClose = options.onClose; // datepicker init\n\n          $this.datepicker(options);\n          this.multiDatesPicker.minDate = $.datepicker._determineDate(this, options.minDate, null);\n          this.multiDatesPicker.maxDate = $.datepicker._determineDate(this, options.maxDate, null);\n          if (options.addDates) methods.addDates.call(this, options.addDates);\n          if (options.addDisabledDates) methods.addDates.call(this, options.addDisabledDates, 'disabled');\n          methods.setMode.call(this, options);\n        } else {\n          $this.datepicker();\n        }\n\n        $this.datepicker('option', mdp_events); // adds any dates found in the input or alt field\n\n        if (inputDates) $this.multiDatesPicker('value', inputDates); // generates the new string of added dates\n\n        var inputs_values = $this.multiDatesPicker('value'); // fills the input field back with all the dates in the calendar\n\n        $this.val(inputs_values); // Fixes the altField filled with defaultDate by default\n\n        var altFieldOption = $this.datepicker('option', 'altField');\n        if (altFieldOption) $(altFieldOption).val(inputs_values); // Updates the calendar view\n\n        $this.datepicker('refresh');\n      },\n      compareDates: function compareDates(date1, date2) {\n        date1 = dateConvert.call(this, date1);\n        date2 = dateConvert.call(this, date2); // return > 0 means date1 is later than date2 \n        // return == 0 means date1 is the same day as date2 \n        // return < 0 means date1 is earlier than date2 \n\n        var diff = date1.getFullYear() - date2.getFullYear();\n\n        if (!diff) {\n          diff = date1.getMonth() - date2.getMonth();\n          if (!diff) diff = date1.getDate() - date2.getDate();\n        }\n\n        return diff;\n      },\n      sumDays: function sumDays(date, n_days) {\n        var origDateType = _typeof(date);\n\n        obj_date = dateConvert.call(this, date);\n        obj_date.setDate(obj_date.getDate() + n_days);\n        return dateConvert.call(this, obj_date, origDateType);\n      },\n      dateConvert: function dateConvert(date, desired_format, dateFormat) {\n        var from_format = _typeof(date);\n\n        var $this = $(this);\n\n        if (from_format == desired_format) {\n          if (from_format == 'object') {\n            try {\n              date.getTime();\n            } catch (e) {\n              $.error('Received date is in a non supported format!');\n              return false;\n            }\n          }\n\n          return date;\n        }\n\n        if (typeof date == 'undefined') date = new Date(0);\n        if (desired_format != 'string' && desired_format != 'object' && desired_format != 'number') $.error('Date format \"' + desired_format + '\" not supported!');\n\n        if (!dateFormat) {\n          // thanks to bibendus83 -> http://sourceforge.net/tracker/index.php?func=detail&aid=3213174&group_id=358205&atid=1495382\n          var dp_dateFormat = $this.datepicker('option', 'dateFormat');\n\n          if (dp_dateFormat) {\n            dateFormat = dp_dateFormat;\n          } else {\n            dateFormat = $.datepicker._defaults.dateFormat;\n          }\n        } // converts to object as a neutral format\n\n\n        switch (from_format) {\n          case 'object':\n            break;\n\n          case 'string':\n            date = $.datepicker.parseDate(dateFormat, date);\n            break;\n\n          case 'number':\n            date = new Date(date);\n            break;\n\n          default:\n            $.error('Conversion from \"' + desired_format + '\" format not allowed on jQuery.multiDatesPicker');\n        } // then converts to the desired format\n\n\n        switch (desired_format) {\n          case 'object':\n            return date;\n\n          case 'string':\n            return $.datepicker.formatDate(dateFormat, date);\n\n          case 'number':\n            return date.getTime();\n\n          default:\n            $.error('Conversion to \"' + desired_format + '\" format not allowed on jQuery.multiDatesPicker');\n        }\n\n        return false;\n      },\n      gotDate: function gotDate(date, type) {\n        if (!type) type = 'picked';\n\n        for (var i = 0; i < this.multiDatesPicker.dates[type].length; i++) {\n          if (methods.compareDates.call(this, this.multiDatesPicker.dates[type][i], date) === 0) {\n            return i;\n          }\n        }\n\n        return false;\n      },\n      value: function value(_value) {\n        if (_value && typeof _value == 'string') {\n          methods.addDates.call(this, _value.split(this.multiDatesPicker.separator));\n        } else {\n          var dates = methods.getDates.call(this, 'string');\n          return dates.length ? dates.join(this.multiDatesPicker.separator) : \"\";\n        }\n      },\n      getDates: function getDates(format, type) {\n        if (!format) format = 'string';\n        if (!type) type = 'picked';\n\n        switch (format) {\n          case 'object':\n            return this.multiDatesPicker.dates[type];\n\n          case 'string':\n          case 'number':\n            var o_dates = new Array();\n\n            for (var i in this.multiDatesPicker.dates[type]) {\n              o_dates.push(dateConvert.call(this, this.multiDatesPicker.dates[type][i], format));\n            }\n\n            return o_dates;\n\n          default:\n            $.error('Format \"' + format + '\" not supported!');\n        }\n      },\n      addDates: function addDates(dates, type) {\n        if (!type) type = 'picked';\n\n        switch (_typeof(dates)) {\n          case 'object':\n          case 'array':\n            if (dates.length) {\n              for (var i = 0; i < dates.length; i++) {\n                addDate.call(this, dates[i], type, true);\n              }\n\n              sortDates.call(this, type);\n              break;\n            }\n\n          // else does the same as 'string'\n\n          case 'string':\n          case 'number':\n            addDate.call(this, dates, type);\n            break;\n\n          default:\n            $.error('Date format \"' + _typeof(dates) + '\" not allowed on jQuery.multiDatesPicker');\n        } //$(this).datepicker('refresh');\n\n      },\n      removeDates: function removeDates(dates, type) {\n        if (!type) type = 'picked';\n        var removed = [];\n\n        if (Object.prototype.toString.call(dates) === '[object Array]') {\n          for (var i in dates.sort(function (a, b) {\n            return b - a;\n          })) {\n            removed.push(removeDate.call(this, dates[i], type));\n          }\n        } else {\n          removed.push(removeDate.call(this, dates, type));\n        }\n\n        return removed;\n      },\n      removeIndexes: function removeIndexes(indexes, type) {\n        if (!type) type = 'picked';\n        var removed = [];\n\n        if (Object.prototype.toString.call(indexes) === '[object Array]') {\n          for (var i in indexes.sort(function (a, b) {\n            return b - a;\n          })) {\n            removed.push(removeIndex.call(this, indexes[i], type));\n          }\n        } else {\n          removed.push(removeIndex.call(this, indexes, type));\n        }\n\n        return removed;\n      },\n      resetDates: function resetDates(type) {\n        if (!type) type = 'picked';\n        this.multiDatesPicker.dates[type] = [];\n      },\n      toggleDate: function toggleDate(date, type) {\n        if (!type) type = 'picked';\n\n        switch (this.multiDatesPicker.mode) {\n          case 'daysRange':\n            this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled dates\n\n            var end = this.multiDatesPicker.autoselectRange[1];\n            var begin = this.multiDatesPicker.autoselectRange[0];\n\n            if (end < begin) {\n              // switch\n              end = this.multiDatesPicker.autoselectRange[0];\n              begin = this.multiDatesPicker.autoselectRange[1];\n            }\n\n            for (var i = begin; i < end; i++) {\n              methods.addDates.call(this, methods.sumDays.call(this, date, i), type);\n            }\n\n            break;\n\n          default:\n            if (methods.gotDate.call(this, date) === false) // adds dates\n              methods.addDates.call(this, date, type);else // removes dates\n              methods.removeDates.call(this, date, type);\n            break;\n        }\n      },\n      setMode: function setMode(options) {\n        var $this = $(this);\n        if (options.mode) this.multiDatesPicker.mode = options.mode;\n\n        switch (this.multiDatesPicker.mode) {\n          case 'normal':\n            for (option in options) {\n              switch (option) {\n                case 'maxPicks':\n                case 'minPicks':\n                case 'pickableRange':\n                case 'adjustRangeToDisabled':\n                  this.multiDatesPicker[option] = options[option];\n                  break;\n                //default: $.error('Option ' + option + ' ignored for mode \"'.options.mode.'\".');\n              }\n            }\n\n            break;\n\n          case 'daysRange':\n          case 'weeksRange':\n            var mandatory = 1;\n\n            for (option in options) {\n              switch (option) {\n                case 'autoselectRange':\n                  mandatory--;\n\n                case 'pickableRange':\n                case 'adjustRangeToDisabled':\n                  this.multiDatesPicker[option] = options[option];\n                  break;\n                //default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker');\n              }\n            }\n\n            if (mandatory > 0) $.error('Some mandatory options not specified!');\n            break;\n        }\n        /*\r\n        if(options.pickableRange) {\r\n        \t$this.datepicker(\"option\", \"maxDate\", options.pickableRange);\r\n        \t$this.datepicker(\"option\", \"minDate\", this.multiDatesPicker.minDate);\r\n        }\r\n        */\n\n\n        if (mdp_events.onSelect) mdp_events.onSelect();\n      },\n      destroy: function destroy() {\n        this.multiDatesPicker = null;\n        $(this).datepicker('destroy');\n      }\n    };\n    this.each(function () {\n      var $this = $(this);\n\n      if (!this.multiDatesPicker) {\n        this.multiDatesPicker = {\n          dates: {\n            picked: [],\n            disabled: []\n          },\n          mode: 'normal',\n          adjustRangeToDisabled: true\n        };\n      }\n\n      if (methods[method]) {\n        var exec_result = methods[method].apply(this, Array.prototype.slice.call(mdp_arguments, 1));\n\n        switch (method) {\n          case 'removeDates':\n          case 'removeIndexes':\n          case 'resetDates':\n          case 'toggleDate':\n          case 'addDates':\n            var altField = $this.datepicker('option', 'altField'); // @todo: should use altFormat for altField\n\n            var dates_string = methods.value.call(this);\n\n            if (altField !== undefined && altField != \"\") {\n              $(altField).val(dates_string);\n            }\n\n            $this.val(dates_string);\n\n            $.datepicker._refreshDatepicker(this);\n\n        }\n\n        switch (method) {\n          case 'removeDates':\n          case 'getDates':\n          case 'gotDate':\n          case 'sumDays':\n          case 'compareDates':\n          case 'dateConvert':\n          case 'value':\n            ret = exec_result;\n        }\n\n        return exec_result;\n      } else if (_typeof(method) === 'object' || !method) {\n        return methods.init.apply(this, mdp_arguments);\n      } else {\n        $.error('Method ' + method + ' does not exist on jQuery.multiDatesPicker');\n      }\n\n      return false;\n    });\n    return ret;\n  };\n\n  var PROP_NAME = 'multiDatesPicker';\n  var dpuuid = new Date().getTime();\n  var instActive;\n  $.multiDatesPicker = {\n    version: false\n  }; //$.multiDatesPicker = new MultiDatesPicker(); // singleton instance\n\n  $.multiDatesPicker.initialized = false;\n  $.multiDatesPicker.uuid = new Date().getTime();\n  $.multiDatesPicker.version = $.ui.multiDatesPicker.version; // allows MDP not to hide everytime a date is picked\n\n  $.multiDatesPicker._hideDatepicker = $.datepicker._hideDatepicker;\n\n  $.datepicker._hideDatepicker = function () {\n    var target = this._curInst.input[0];\n    var mdp = target.multiDatesPicker;\n\n    if (!mdp || this._curInst.inline === false && !mdp.changed) {\n      return $.multiDatesPicker._hideDatepicker.apply(this, arguments);\n    } else {\n      mdp.changed = false;\n\n      $.datepicker._refreshDatepicker(target);\n\n      return;\n    }\n  }; // Workaround for #4055\n  // Add another global to avoid noConflict issues with inline event handlers\n\n\n  window['DP_jQuery_' + dpuuid] = $;\n})(jQuery);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/core/ui/jquery-ui.multidatespicker.js?");

/***/ }),

/***/ "./src/core/ui/jquery-ui.timepicker.js":
/*!*********************************************!*\
  !*** ./src/core/ui/jquery-ui.timepicker.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\r\n * jQuery Timepicker Addon\r\n * By: Trent Richardson [http://trentrichardson.com]\r\n *\r\n * Copyright 2013 Trent Richardson\r\n * You may use this project under MIT license.\r\n * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt\r\n */\n(function (factory) {\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! jquery-ui */ \"./node_modules/jquery-ui/ui/widget.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  /*\r\n  * Lets not redefine timepicker, Prevent \"Uncaught RangeError: Maximum call stack size exceeded\"\r\n  */\n  $.ui.timepicker = $.ui.timepicker || {};\n\n  if ($.ui.timepicker.version) {\n    return;\n  }\n  /*\r\n  * Extend jQueryUI, get it started with our version number\r\n  */\n\n\n  $.extend($.ui, {\n    timepicker: {\n      version: \"@@version\"\n    }\n  });\n  /*\r\n  * Timepicker manager.\r\n  * Use the singleton instance of this class, $.timepicker, to interact with the time picker.\r\n  * Settings for (groups of) time pickers are maintained in an instance object,\r\n  * allowing multiple different settings on the same page.\r\n  */\n\n  var Timepicker = function Timepicker() {\n    this.regional = []; // Available regional settings, indexed by language code\n\n    this.regional[''] = {\n      // Default regional settings\n      currentText: 'Now',\n      closeText: 'Done',\n      amNames: ['AM', 'A'],\n      pmNames: ['PM', 'P'],\n      timeFormat: 'HH:mm',\n      timeSuffix: '',\n      timeOnlyTitle: 'Choose Time',\n      timeText: 'Time',\n      hourText: 'Hour',\n      minuteText: 'Minute',\n      secondText: 'Second',\n      millisecText: 'Millisecond',\n      microsecText: 'Microsecond',\n      timezoneText: 'Time Zone',\n      isRTL: false\n    };\n    this._defaults = {\n      // Global defaults for all the datetime picker instances\n      showButtonPanel: true,\n      timeOnly: false,\n      timeOnlyShowDate: false,\n      showHour: null,\n      showMinute: null,\n      showSecond: null,\n      showMillisec: null,\n      showMicrosec: null,\n      showTimezone: null,\n      showTime: true,\n      stepHour: 1,\n      stepMinute: 1,\n      stepSecond: 1,\n      stepMillisec: 1,\n      stepMicrosec: 1,\n      hour: 0,\n      minute: 0,\n      second: 0,\n      millisec: 0,\n      microsec: 0,\n      timezone: null,\n      hourMin: 0,\n      minuteMin: 0,\n      secondMin: 0,\n      millisecMin: 0,\n      microsecMin: 0,\n      hourMax: 23,\n      minuteMax: 59,\n      secondMax: 59,\n      millisecMax: 999,\n      microsecMax: 999,\n      minDateTime: null,\n      maxDateTime: null,\n      maxTime: null,\n      minTime: null,\n      onSelect: null,\n      hourGrid: 0,\n      minuteGrid: 0,\n      secondGrid: 0,\n      millisecGrid: 0,\n      microsecGrid: 0,\n      alwaysSetTime: true,\n      separator: ' ',\n      altFieldTimeOnly: true,\n      altTimeFormat: null,\n      altSeparator: null,\n      altTimeSuffix: null,\n      altRedirectFocus: true,\n      pickerTimeFormat: null,\n      pickerTimeSuffix: null,\n      showTimepicker: true,\n      timezoneList: null,\n      addSliderAccess: false,\n      sliderAccessArgs: null,\n      controlType: 'slider',\n      oneLine: false,\n      defaultValue: null,\n      parse: 'strict',\n      afterInject: null\n    };\n    $.extend(this._defaults, this.regional['']);\n  };\n\n  $.extend(Timepicker.prototype, {\n    $input: null,\n    $altInput: null,\n    $timeObj: null,\n    inst: null,\n    hour_slider: null,\n    minute_slider: null,\n    second_slider: null,\n    millisec_slider: null,\n    microsec_slider: null,\n    timezone_select: null,\n    maxTime: null,\n    minTime: null,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisec: 0,\n    microsec: 0,\n    timezone: null,\n    hourMinOriginal: null,\n    minuteMinOriginal: null,\n    secondMinOriginal: null,\n    millisecMinOriginal: null,\n    microsecMinOriginal: null,\n    hourMaxOriginal: null,\n    minuteMaxOriginal: null,\n    secondMaxOriginal: null,\n    millisecMaxOriginal: null,\n    microsecMaxOriginal: null,\n    ampm: '',\n    formattedDate: '',\n    formattedTime: '',\n    formattedDateTime: '',\n    timezoneList: null,\n    units: ['hour', 'minute', 'second', 'millisec', 'microsec'],\n    support: {},\n    control: null,\n\n    /*\r\n    * Override the default settings for all instances of the time picker.\r\n    * @param  {Object} settings  object - the new settings to use as defaults (anonymous object)\r\n    * @return {Object} the manager object\r\n    */\n    setDefaults: function setDefaults(settings) {\n      extendRemove(this._defaults, settings || {});\n      return this;\n    },\n\n    /*\r\n    * Create a new Timepicker instance\r\n    */\n    _newInst: function _newInst($input, opts) {\n      var tp_inst = new Timepicker(),\n          inlineSettings = {},\n          fns = {},\n          overrides,\n          i;\n\n      for (var attrName in this._defaults) {\n        if (this._defaults.hasOwnProperty(attrName)) {\n          var attrValue = $input.attr('time:' + attrName);\n\n          if (attrValue) {\n            try {\n              inlineSettings[attrName] = eval(attrValue);\n            } catch (err) {\n              inlineSettings[attrName] = attrValue;\n            }\n          }\n        }\n      }\n\n      overrides = {\n        beforeShow: function beforeShow(input, dp_inst) {\n          if (typeof tp_inst._defaults.evnts.beforeShow === \"function\") {\n            return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst);\n          }\n        },\n        onChangeMonthYear: function onChangeMonthYear(year, month, dp_inst) {\n          // Update the time as well : this prevents the time from disappearing from the $input field.\n          // tp_inst._updateDateTime(dp_inst);\n          if (typeof tp_inst._defaults.evnts.onChangeMonthYear === \"function\") {\n            tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);\n          }\n        },\n        onClose: function onClose(dateText, dp_inst) {\n          if (tp_inst.timeDefined === true && $input.val() !== '') {\n            tp_inst._updateDateTime(dp_inst);\n          }\n\n          if (typeof tp_inst._defaults.evnts.onClose === \"function\") {\n            tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst);\n          }\n        }\n      };\n\n      for (i in overrides) {\n        if (overrides.hasOwnProperty(i)) {\n          fns[i] = opts[i] || this._defaults[i] || null;\n        }\n      }\n\n      tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, {\n        evnts: fns,\n        timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');\n\n      });\n      tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) {\n        return val.toUpperCase();\n      });\n      tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) {\n        return val.toUpperCase();\n      }); // detect which units are supported\n\n      tp_inst.support = detectSupport(tp_inst._defaults.timeFormat + (tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') + (tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : '')); // controlType is string - key to our this._controls\n\n      if (typeof tp_inst._defaults.controlType === 'string') {\n        if (tp_inst._defaults.controlType === 'slider' && typeof $.ui.slider === 'undefined') {\n          tp_inst._defaults.controlType = 'select';\n        }\n\n        tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType];\n      } // controlType is an object and must implement create, options, value methods\n      else {\n        tp_inst.control = tp_inst._defaults.controlType;\n      } // prep the timezone options\n\n\n      var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60, 0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840];\n\n      if (tp_inst._defaults.timezoneList !== null) {\n        timezoneList = tp_inst._defaults.timezoneList;\n      }\n\n      var tzl = timezoneList.length,\n          tzi = 0,\n          tzv = null;\n\n      if (tzl > 0 && _typeof(timezoneList[0]) !== 'object') {\n        for (; tzi < tzl; tzi++) {\n          tzv = timezoneList[tzi];\n          timezoneList[tzi] = {\n            value: tzv,\n            label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601)\n          };\n        }\n      }\n\n      tp_inst._defaults.timezoneList = timezoneList; // set the default units\n\n      tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) : new Date().getTimezoneOffset() * -1;\n      tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin : tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour;\n      tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin : tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;\n      tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin : tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second;\n      tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin : tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;\n      tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin : tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec;\n      tp_inst.ampm = '';\n      tp_inst.$input = $input;\n\n      if (tp_inst._defaults.altField) {\n        tp_inst.$altInput = $(tp_inst._defaults.altField);\n\n        if (tp_inst._defaults.altRedirectFocus === true) {\n          tp_inst.$altInput.css({\n            cursor: 'pointer'\n          }).focus(function () {\n            $input.trigger(\"focus\");\n          });\n        }\n      }\n\n      if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) {\n        tp_inst._defaults.minDate = new Date();\n      }\n\n      if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) {\n        tp_inst._defaults.maxDate = new Date();\n      } // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..\n\n\n      if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) {\n        tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());\n      }\n\n      if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) {\n        tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());\n      }\n\n      if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) {\n        tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());\n      }\n\n      if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) {\n        tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());\n      }\n\n      tp_inst.$input.on('focus', function () {\n        tp_inst._onFocus();\n      });\n      return tp_inst;\n    },\n\n    /*\r\n    * add our sliders to the calendar\r\n    */\n    _addTimePicker: function _addTimePicker(dp_inst) {\n      var currDT = (this.$altInput && this._defaults.altFieldTimeOnly ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val()).trim();\n      this.timeDefined = this._parseTime(currDT);\n\n      this._limitMinMaxDateTime(dp_inst, false);\n\n      this._injectTimePicker();\n\n      this._afterInject();\n    },\n\n    /*\r\n    * parse the time string from input value or _setTime\r\n    */\n    _parseTime: function _parseTime(timeString, withDate) {\n      if (!this.inst) {\n        this.inst = $.datepicker._getInst(this.$input[0]);\n      }\n\n      if (withDate || !this._defaults.timeOnly) {\n        var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');\n\n        try {\n          var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults);\n\n          if (!parseRes.timeObj) {\n            return false;\n          }\n\n          $.extend(this, parseRes.timeObj);\n        } catch (err) {\n          $.timepicker.log(\"Error parsing the date/time string: \" + err + \"\\ndate/time string = \" + timeString + \"\\ntimeFormat = \" + this._defaults.timeFormat + \"\\ndateFormat = \" + dp_dateFormat);\n          return false;\n        }\n\n        return true;\n      } else {\n        var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults);\n\n        if (!timeObj) {\n          return false;\n        }\n\n        $.extend(this, timeObj);\n        return true;\n      }\n    },\n\n    /*\r\n    * Handle callback option after injecting timepicker\r\n    */\n    _afterInject: function _afterInject() {\n      var o = this.inst.settings;\n\n      if (typeof o.afterInject === \"function\") {\n        o.afterInject.call(this);\n      }\n    },\n\n    /*\r\n    * generate and inject html for timepicker into ui datepicker\r\n    */\n    _injectTimePicker: function _injectTimePicker() {\n      var $dp = this.inst.dpDiv,\n          o = this.inst.settings,\n          tp_inst = this,\n          litem = '',\n          uitem = '',\n          show = null,\n          max = {},\n          gridSize = {},\n          size = null,\n          i = 0,\n          l = 0; // Prevent displaying twice\n\n      if ($dp.find(\"div.ui-timepicker-div\").length === 0 && o.showTimepicker) {\n        var noDisplay = ' ui_tpicker_unit_hide',\n            html = '<div class=\"ui-timepicker-div' + (o.isRTL ? ' ui-timepicker-rtl' : '') + (o.oneLine && o.controlType === 'select' ? ' ui-timepicker-oneLine' : '') + '\"><dl>' + '<dt class=\"ui_tpicker_time_label' + (o.showTime ? '' : noDisplay) + '\">' + o.timeText + '</dt>' + '<dd class=\"ui_tpicker_time ' + (o.showTime ? '' : noDisplay) + '\"><input class=\"ui_tpicker_time_input\" ' + (o.timeInput ? '' : 'disabled') + '/></dd>'; // Create the markup\n\n        for (i = 0, l = this.units.length; i < l; i++) {\n          litem = this.units[i];\n          uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);\n          show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; // Added by Peter Medeiros:\n          // - Figure out what the hour/minute/second max should be based on the step values.\n          // - Example: if stepMinute is 15, then minMax is 45.\n\n          max[litem] = parseInt(o[litem + 'Max'] - (o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem], 10);\n          gridSize[litem] = 0;\n          html += '<dt class=\"ui_tpicker_' + litem + '_label' + (show ? '' : noDisplay) + '\">' + o[litem + 'Text'] + '</dt>' + '<dd class=\"ui_tpicker_' + litem + (show ? '' : noDisplay) + '\"><div class=\"ui_tpicker_' + litem + '_slider' + (show ? '' : noDisplay) + '\"></div>';\n\n          if (show && o[litem + 'Grid'] > 0) {\n            html += '<div style=\"padding-left: 1px\"><table class=\"ui-tpicker-grid-label\"><tr>';\n\n            if (litem === 'hour') {\n              for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) {\n                gridSize[litem]++;\n                var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {\n                  hour: h\n                }, o);\n                html += '<td data-for=\"' + litem + '\">' + tmph + '</td>';\n              }\n            } else {\n              for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) {\n                gridSize[litem]++;\n                html += '<td data-for=\"' + litem + '\">' + (m < 10 ? '0' : '') + m + '</td>';\n              }\n            }\n\n            html += '</tr></table></div>';\n          }\n\n          html += '</dd>';\n        } // Timezone\n\n\n        var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone;\n        html += '<dt class=\"ui_tpicker_timezone_label' + (showTz ? '' : noDisplay) + '\">' + o.timezoneText + '</dt>';\n        html += '<dd class=\"ui_tpicker_timezone' + (showTz ? '' : noDisplay) + '\"></dd>'; // Create the elements from string\n\n        html += '</dl></div>';\n        var $tp = $(html); // if we only want time picker...\n\n        if (o.timeOnly === true) {\n          $tp.prepend('<div class=\"ui-widget-header ui-helper-clearfix ui-corner-all\">' + '<div class=\"ui-datepicker-title\">' + o.timeOnlyTitle + '</div>' + '</div>');\n          $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();\n        } // add sliders, adjust grids, add events\n\n\n        for (i = 0, l = tp_inst.units.length; i < l; i++) {\n          litem = tp_inst.units[i];\n          uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);\n          show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; // add the slider\n\n          tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]); // adjust the grid and add click event\n\n          if (show && o[litem + 'Grid'] > 0) {\n            size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']);\n            $tp.find('.ui_tpicker_' + litem + ' table').css({\n              width: size + \"%\",\n              marginLeft: o.isRTL ? '0' : size / (-2 * gridSize[litem]) + \"%\",\n              marginRight: o.isRTL ? size / (-2 * gridSize[litem]) + \"%\" : '0',\n              borderCollapse: 'collapse'\n            }).find(\"td\").click(function (e) {\n              var $t = $(this),\n                  h = $t.html(),\n                  n = parseInt(h.replace(/[^0-9]/g), 10),\n                  ap = h.replace(/[^apm]/ig),\n                  f = $t.data('for'); // loses scope, so we use data-for\n\n              if (f === 'hour') {\n                if (ap.indexOf('p') !== -1 && n < 12) {\n                  n += 12;\n                } else {\n                  if (ap.indexOf('a') !== -1 && n === 12) {\n                    n = 0;\n                  }\n                }\n              }\n\n              tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n);\n\n              tp_inst._onTimeChange();\n\n              tp_inst._onSelectHandler();\n            }).css({\n              cursor: 'pointer',\n              width: 100 / gridSize[litem] + '%',\n              textAlign: 'center',\n              overflow: 'hidden'\n            });\n          } // end if grid > 0\n\n        } // end for loop\n        // Add timezone options\n\n\n        this.timezone_select = $tp.find('.ui_tpicker_timezone').append('<select></select>').find(\"select\");\n        $.fn.append.apply(this.timezone_select, $.map(o.timezoneList, function (val, idx) {\n          return $(\"<option />\").val(_typeof(val) === \"object\" ? val.value : val).text(_typeof(val) === \"object\" ? val.label : val);\n        }));\n\n        if (typeof this.timezone !== \"undefined\" && this.timezone !== null && this.timezone !== \"\") {\n          var local_timezone = new Date(this.inst.selectedYear, this.inst.selectedMonth, this.inst.selectedDay, 12).getTimezoneOffset() * -1;\n\n          if (local_timezone === this.timezone) {\n            selectLocalTimezone(tp_inst);\n          } else {\n            this.timezone_select.val(this.timezone);\n          }\n        } else {\n          if (typeof this.hour !== \"undefined\" && this.hour !== null && this.hour !== \"\") {\n            this.timezone_select.val(o.timezone);\n          } else {\n            selectLocalTimezone(tp_inst);\n          }\n        }\n\n        this.timezone_select.change(function () {\n          tp_inst._onTimeChange();\n\n          tp_inst._onSelectHandler();\n\n          tp_inst._afterInject();\n        }); // End timezone options\n        // inject timepicker into datepicker\n\n        var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');\n\n        if ($buttonPanel.length) {\n          $buttonPanel.before($tp);\n        } else {\n          $dp.append($tp);\n        }\n\n        this.$timeObj = $tp.find('.ui_tpicker_time_input');\n        this.$timeObj.change(function () {\n          var timeFormat = tp_inst.inst.settings.timeFormat;\n          var parsedTime = $.datepicker.parseTime(timeFormat, this.value);\n          var update = new Date();\n\n          if (parsedTime) {\n            update.setHours(parsedTime.hour);\n            update.setMinutes(parsedTime.minute);\n            update.setSeconds(parsedTime.second);\n\n            $.datepicker._setTime(tp_inst.inst, update);\n          } else {\n            this.value = tp_inst.formattedTime;\n            this.blur();\n          }\n        });\n\n        if (this.inst !== null) {\n          var timeDefined = this.timeDefined;\n\n          this._onTimeChange();\n\n          this.timeDefined = timeDefined;\n        } // slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/\n\n\n        if (this._defaults.addSliderAccess) {\n          var sliderAccessArgs = this._defaults.sliderAccessArgs,\n              rtl = this._defaults.isRTL;\n          sliderAccessArgs.isRTL = rtl;\n          setTimeout(function () {\n            // fix for inline mode\n            if ($tp.find('.ui-slider-access').length === 0) {\n              $tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs); // fix any grids since sliders are shorter\n\n              var sliderAccessWidth = $tp.find('.ui-slider-access').eq(0).outerWidth(true);\n\n              if (sliderAccessWidth) {\n                $tp.find('table:visible').each(function () {\n                  var $g = $(this),\n                      oldWidth = $g.outerWidth(),\n                      oldMarginLeft = $g.css(rtl ? 'marginRight' : 'marginLeft').toString().replace('%', ''),\n                      newWidth = oldWidth - sliderAccessWidth,\n                      newMarginLeft = oldMarginLeft * newWidth / oldWidth + '%',\n                      css = {\n                    width: newWidth,\n                    marginRight: 0,\n                    marginLeft: 0\n                  };\n                  css[rtl ? 'marginRight' : 'marginLeft'] = newMarginLeft;\n                  $g.css(css);\n                });\n              }\n            }\n          }, 10);\n        } // end slideAccess integration\n\n\n        tp_inst._limitMinMaxDateTime(this.inst, true);\n      }\n    },\n\n    /*\r\n    * This function tries to limit the ability to go outside the\r\n    * min/max date range\r\n    */\n    _limitMinMaxDateTime: function _limitMinMaxDateTime(dp_inst, adjustSliders) {\n      var o = this._defaults,\n          dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);\n\n      if (!this._defaults.showTimepicker) {\n        return;\n      } // No time so nothing to check here\n\n\n      if ($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date) {\n        var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),\n            minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);\n\n        if (this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null || this.microsecMinOriginal === null) {\n          this.hourMinOriginal = o.hourMin;\n          this.minuteMinOriginal = o.minuteMin;\n          this.secondMinOriginal = o.secondMin;\n          this.millisecMinOriginal = o.millisecMin;\n          this.microsecMinOriginal = o.microsecMin;\n        }\n\n        if (dp_inst.settings.timeOnly || minDateTimeDate.getTime() === dp_date.getTime()) {\n          this._defaults.hourMin = minDateTime.getHours();\n\n          if (this.hour <= this._defaults.hourMin) {\n            this.hour = this._defaults.hourMin;\n            this._defaults.minuteMin = minDateTime.getMinutes();\n\n            if (this.minute <= this._defaults.minuteMin) {\n              this.minute = this._defaults.minuteMin;\n              this._defaults.secondMin = minDateTime.getSeconds();\n\n              if (this.second <= this._defaults.secondMin) {\n                this.second = this._defaults.secondMin;\n                this._defaults.millisecMin = minDateTime.getMilliseconds();\n\n                if (this.millisec <= this._defaults.millisecMin) {\n                  this.millisec = this._defaults.millisecMin;\n                  this._defaults.microsecMin = minDateTime.getMicroseconds();\n                } else {\n                  if (this.microsec < this._defaults.microsecMin) {\n                    this.microsec = this._defaults.microsecMin;\n                  }\n\n                  this._defaults.microsecMin = this.microsecMinOriginal;\n                }\n              } else {\n                this._defaults.millisecMin = this.millisecMinOriginal;\n                this._defaults.microsecMin = this.microsecMinOriginal;\n              }\n            } else {\n              this._defaults.secondMin = this.secondMinOriginal;\n              this._defaults.millisecMin = this.millisecMinOriginal;\n              this._defaults.microsecMin = this.microsecMinOriginal;\n            }\n          } else {\n            this._defaults.minuteMin = this.minuteMinOriginal;\n            this._defaults.secondMin = this.secondMinOriginal;\n            this._defaults.millisecMin = this.millisecMinOriginal;\n            this._defaults.microsecMin = this.microsecMinOriginal;\n          }\n        } else {\n          this._defaults.hourMin = this.hourMinOriginal;\n          this._defaults.minuteMin = this.minuteMinOriginal;\n          this._defaults.secondMin = this.secondMinOriginal;\n          this._defaults.millisecMin = this.millisecMinOriginal;\n          this._defaults.microsecMin = this.microsecMinOriginal;\n        }\n      }\n\n      if ($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date) {\n        var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),\n            maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);\n\n        if (this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null || this.millisecMaxOriginal === null) {\n          this.hourMaxOriginal = o.hourMax;\n          this.minuteMaxOriginal = o.minuteMax;\n          this.secondMaxOriginal = o.secondMax;\n          this.millisecMaxOriginal = o.millisecMax;\n          this.microsecMaxOriginal = o.microsecMax;\n        }\n\n        if (dp_inst.settings.timeOnly || maxDateTimeDate.getTime() === dp_date.getTime()) {\n          this._defaults.hourMax = maxDateTime.getHours();\n\n          if (this.hour >= this._defaults.hourMax) {\n            this.hour = this._defaults.hourMax;\n            this._defaults.minuteMax = maxDateTime.getMinutes();\n\n            if (this.minute >= this._defaults.minuteMax) {\n              this.minute = this._defaults.minuteMax;\n              this._defaults.secondMax = maxDateTime.getSeconds();\n\n              if (this.second >= this._defaults.secondMax) {\n                this.second = this._defaults.secondMax;\n                this._defaults.millisecMax = maxDateTime.getMilliseconds();\n\n                if (this.millisec >= this._defaults.millisecMax) {\n                  this.millisec = this._defaults.millisecMax;\n                  this._defaults.microsecMax = maxDateTime.getMicroseconds();\n                } else {\n                  if (this.microsec > this._defaults.microsecMax) {\n                    this.microsec = this._defaults.microsecMax;\n                  }\n\n                  this._defaults.microsecMax = this.microsecMaxOriginal;\n                }\n              } else {\n                this._defaults.millisecMax = this.millisecMaxOriginal;\n                this._defaults.microsecMax = this.microsecMaxOriginal;\n              }\n            } else {\n              this._defaults.secondMax = this.secondMaxOriginal;\n              this._defaults.millisecMax = this.millisecMaxOriginal;\n              this._defaults.microsecMax = this.microsecMaxOriginal;\n            }\n          } else {\n            this._defaults.minuteMax = this.minuteMaxOriginal;\n            this._defaults.secondMax = this.secondMaxOriginal;\n            this._defaults.millisecMax = this.millisecMaxOriginal;\n            this._defaults.microsecMax = this.microsecMaxOriginal;\n          }\n        } else {\n          this._defaults.hourMax = this.hourMaxOriginal;\n          this._defaults.minuteMax = this.minuteMaxOriginal;\n          this._defaults.secondMax = this.secondMaxOriginal;\n          this._defaults.millisecMax = this.millisecMaxOriginal;\n          this._defaults.microsecMax = this.microsecMaxOriginal;\n        }\n      }\n\n      if (dp_inst.settings.minTime !== null) {\n        var tempMinTime = new Date(\"01/01/1970 \" + dp_inst.settings.minTime);\n\n        if (this.hour < tempMinTime.getHours()) {\n          this.hour = this._defaults.hourMin = tempMinTime.getHours();\n          this.minute = this._defaults.minuteMin = tempMinTime.getMinutes();\n        } else if (this.hour === tempMinTime.getHours() && this.minute < tempMinTime.getMinutes()) {\n          this.minute = this._defaults.minuteMin = tempMinTime.getMinutes();\n        } else {\n          if (this._defaults.hourMin < tempMinTime.getHours()) {\n            this._defaults.hourMin = tempMinTime.getHours();\n            this._defaults.minuteMin = tempMinTime.getMinutes();\n          } else if (this._defaults.hourMin === tempMinTime.getHours() === this.hour && this._defaults.minuteMin < tempMinTime.getMinutes()) {\n            this._defaults.minuteMin = tempMinTime.getMinutes();\n          } else {\n            this._defaults.minuteMin = 0;\n          }\n        }\n      }\n\n      if (dp_inst.settings.maxTime !== null) {\n        var tempMaxTime = new Date(\"01/01/1970 \" + dp_inst.settings.maxTime);\n\n        if (this.hour > tempMaxTime.getHours()) {\n          this.hour = this._defaults.hourMax = tempMaxTime.getHours();\n          this.minute = this._defaults.minuteMax = tempMaxTime.getMinutes();\n        } else if (this.hour === tempMaxTime.getHours() && this.minute > tempMaxTime.getMinutes()) {\n          this.minute = this._defaults.minuteMax = tempMaxTime.getMinutes();\n        } else {\n          if (this._defaults.hourMax > tempMaxTime.getHours()) {\n            this._defaults.hourMax = tempMaxTime.getHours();\n            this._defaults.minuteMax = tempMaxTime.getMinutes();\n          } else if (this._defaults.hourMax === tempMaxTime.getHours() === this.hour && this._defaults.minuteMax > tempMaxTime.getMinutes()) {\n            this._defaults.minuteMax = tempMaxTime.getMinutes();\n          } else {\n            this._defaults.minuteMax = 59;\n          }\n        }\n      }\n\n      if (adjustSliders !== undefined && adjustSliders === true) {\n        var hourMax = parseInt(this._defaults.hourMax - (this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour, 10),\n            minMax = parseInt(this._defaults.minuteMax - (this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute, 10),\n            secMax = parseInt(this._defaults.secondMax - (this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond, 10),\n            millisecMax = parseInt(this._defaults.millisecMax - (this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec, 10),\n            microsecMax = parseInt(this._defaults.microsecMax - (this._defaults.microsecMax - this._defaults.microsecMin) % this._defaults.stepMicrosec, 10);\n\n        if (this.hour_slider) {\n          this.control.options(this, this.hour_slider, 'hour', {\n            min: this._defaults.hourMin,\n            max: hourMax,\n            step: this._defaults.stepHour\n          });\n          this.control.value(this, this.hour_slider, 'hour', this.hour - this.hour % this._defaults.stepHour);\n        }\n\n        if (this.minute_slider) {\n          this.control.options(this, this.minute_slider, 'minute', {\n            min: this._defaults.minuteMin,\n            max: minMax,\n            step: this._defaults.stepMinute\n          });\n          this.control.value(this, this.minute_slider, 'minute', this.minute - this.minute % this._defaults.stepMinute);\n        }\n\n        if (this.second_slider) {\n          this.control.options(this, this.second_slider, 'second', {\n            min: this._defaults.secondMin,\n            max: secMax,\n            step: this._defaults.stepSecond\n          });\n          this.control.value(this, this.second_slider, 'second', this.second - this.second % this._defaults.stepSecond);\n        }\n\n        if (this.millisec_slider) {\n          this.control.options(this, this.millisec_slider, 'millisec', {\n            min: this._defaults.millisecMin,\n            max: millisecMax,\n            step: this._defaults.stepMillisec\n          });\n          this.control.value(this, this.millisec_slider, 'millisec', this.millisec - this.millisec % this._defaults.stepMillisec);\n        }\n\n        if (this.microsec_slider) {\n          this.control.options(this, this.microsec_slider, 'microsec', {\n            min: this._defaults.microsecMin,\n            max: microsecMax,\n            step: this._defaults.stepMicrosec\n          });\n          this.control.value(this, this.microsec_slider, 'microsec', this.microsec - this.microsec % this._defaults.stepMicrosec);\n        }\n      }\n    },\n\n    /*\r\n    * when a slider moves, set the internal time...\r\n    * on time change is also called when the time is updated in the text field\r\n    */\n    _onTimeChange: function _onTimeChange() {\n      if (!this._defaults.showTimepicker) {\n        return;\n      }\n\n      var hour = this.hour_slider ? this.control.value(this, this.hour_slider, 'hour') : false,\n          minute = this.minute_slider ? this.control.value(this, this.minute_slider, 'minute') : false,\n          second = this.second_slider ? this.control.value(this, this.second_slider, 'second') : false,\n          millisec = this.millisec_slider ? this.control.value(this, this.millisec_slider, 'millisec') : false,\n          microsec = this.microsec_slider ? this.control.value(this, this.microsec_slider, 'microsec') : false,\n          timezone = this.timezone_select ? this.timezone_select.val() : false,\n          o = this._defaults,\n          pickerTimeFormat = o.pickerTimeFormat || o.timeFormat,\n          pickerTimeSuffix = o.pickerTimeSuffix || o.timeSuffix;\n\n      if (_typeof(hour) === 'object') {\n        hour = false;\n      }\n\n      if (_typeof(minute) === 'object') {\n        minute = false;\n      }\n\n      if (_typeof(second) === 'object') {\n        second = false;\n      }\n\n      if (_typeof(millisec) === 'object') {\n        millisec = false;\n      }\n\n      if (_typeof(microsec) === 'object') {\n        microsec = false;\n      }\n\n      if (_typeof(timezone) === 'object') {\n        timezone = false;\n      }\n\n      if (hour !== false) {\n        hour = parseInt(hour, 10);\n      }\n\n      if (minute !== false) {\n        minute = parseInt(minute, 10);\n      }\n\n      if (second !== false) {\n        second = parseInt(second, 10);\n      }\n\n      if (millisec !== false) {\n        millisec = parseInt(millisec, 10);\n      }\n\n      if (microsec !== false) {\n        microsec = parseInt(microsec, 10);\n      }\n\n      if (timezone !== false) {\n        timezone = timezone.toString();\n      }\n\n      var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0]; // If the update was done in the input field, the input field should not be updated.\n      // If the update was done using the sliders, update the input field.\n\n      var hasChanged = hour !== parseInt(this.hour, 10) || // sliders should all be numeric\n      minute !== parseInt(this.minute, 10) || second !== parseInt(this.second, 10) || millisec !== parseInt(this.millisec, 10) || microsec !== parseInt(this.microsec, 10) || this.ampm.length > 0 && hour < 12 !== ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1) || this.timezone !== null && timezone !== this.timezone.toString() // could be numeric or \"EST\" format, so use toString()\n      ;\n\n      if (hasChanged) {\n        if (hour !== false) {\n          this.hour = hour;\n        }\n\n        if (minute !== false) {\n          this.minute = minute;\n        }\n\n        if (second !== false) {\n          this.second = second;\n        }\n\n        if (millisec !== false) {\n          this.millisec = millisec;\n        }\n\n        if (microsec !== false) {\n          this.microsec = microsec;\n        }\n\n        if (timezone !== false) {\n          this.timezone = timezone;\n        }\n\n        if (!this.inst) {\n          this.inst = $.datepicker._getInst(this.$input[0]);\n        }\n\n        this._limitMinMaxDateTime(this.inst, true);\n      }\n\n      if (this.support.ampm) {\n        this.ampm = ampm;\n      } // Updates the time within the timepicker\n\n\n      this.formattedTime = $.datepicker.formatTime(o.timeFormat, this, o);\n\n      if (this.$timeObj) {\n        if (pickerTimeFormat === o.timeFormat) {\n          this.$timeObj.val(this.formattedTime + pickerTimeSuffix);\n        } else {\n          this.$timeObj.val($.datepicker.formatTime(pickerTimeFormat, this, o) + pickerTimeSuffix);\n        }\n\n        if (this.$timeObj[0].setSelectionRange) {\n          var sPos = this.$timeObj[0].selectionStart;\n          var ePos = this.$timeObj[0].selectionEnd;\n          this.$timeObj[0].setSelectionRange(sPos, ePos);\n        }\n      }\n\n      this.timeDefined = true;\n\n      if (hasChanged) {\n        this._updateDateTime(); //this.$input.focus(); // may automatically open the picker on setDate\n\n      }\n    },\n\n    /*\r\n    * call custom onSelect.\r\n    * bind to sliders slidestop, and grid click.\r\n    */\n    _onSelectHandler: function _onSelectHandler() {\n      var onSelect = this._defaults.onSelect || this.inst.settings.onSelect;\n      var inputEl = this.$input ? this.$input[0] : null;\n\n      if (onSelect && inputEl) {\n        onSelect.apply(inputEl, [this.formattedDateTime, this]);\n      }\n    },\n\n    /*\r\n    * update our input with the new date time..\r\n    */\n    _updateDateTime: function _updateDateTime(dp_inst) {\n      dp_inst = this.inst || dp_inst;\n\n      var dtTmp = dp_inst.currentYear > 0 ? new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay) : new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay),\n          dt = $.datepicker._daylightSavingAdjust(dtTmp),\n          //dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),\n      //dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay)),\n      dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),\n          formatCfg = $.datepicker._getFormatConfig(dp_inst),\n          timeAvailable = dt !== null && this.timeDefined;\n\n      this.formattedDate = $.datepicker.formatDate(dateFmt, dt === null ? new Date() : dt, formatCfg);\n      var formattedDateTime = this.formattedDate; // if a slider was changed but datepicker doesn't have a value yet, set it\n\n      if (dp_inst.lastVal === \"\") {\n        dp_inst.currentYear = dp_inst.selectedYear;\n        dp_inst.currentMonth = dp_inst.selectedMonth;\n        dp_inst.currentDay = dp_inst.selectedDay;\n      }\n      /*\r\n      * remove following lines to force every changes in date picker to change the input value\r\n      * Bug descriptions: when an input field has a default value, and click on the field to pop up the date picker.\r\n      * If the user manually empty the value in the input field, the date picker will never change selected value.\r\n      */\n      //if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0)) {\n      //\treturn;\n      //}\n\n\n      if (this._defaults.timeOnly === true && this._defaults.timeOnlyShowDate === false) {\n        formattedDateTime = this.formattedTime;\n      } else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable) || this._defaults.timeOnly === true && this._defaults.timeOnlyShowDate === true) {\n        formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;\n      }\n\n      this.formattedDateTime = formattedDateTime;\n\n      if (!this._defaults.showTimepicker) {\n        this.$input.val(this.formattedDate);\n      } else if (this.$altInput && this._defaults.timeOnly === false && this._defaults.altFieldTimeOnly === true) {\n        this.$altInput.val(this.formattedTime);\n        this.$input.val(this.formattedDate);\n      } else if (this.$altInput) {\n        this.$input.val(formattedDateTime);\n        var altFormattedDateTime = '',\n            altSeparator = this._defaults.altSeparator !== null ? this._defaults.altSeparator : this._defaults.separator,\n            altTimeSuffix = this._defaults.altTimeSuffix !== null ? this._defaults.altTimeSuffix : this._defaults.timeSuffix;\n\n        if (!this._defaults.timeOnly) {\n          if (this._defaults.altFormat) {\n            altFormattedDateTime = $.datepicker.formatDate(this._defaults.altFormat, dt === null ? new Date() : dt, formatCfg);\n          } else {\n            altFormattedDateTime = this.formattedDate;\n          }\n\n          if (altFormattedDateTime) {\n            altFormattedDateTime += altSeparator;\n          }\n        }\n\n        if (this._defaults.altTimeFormat !== null) {\n          altFormattedDateTime += $.datepicker.formatTime(this._defaults.altTimeFormat, this, this._defaults) + altTimeSuffix;\n        } else {\n          altFormattedDateTime += this.formattedTime + altTimeSuffix;\n        }\n\n        this.$altInput.val(altFormattedDateTime);\n      } else {\n        this.$input.val(formattedDateTime);\n      }\n\n      this.$input.trigger(\"change\");\n    },\n    _onFocus: function _onFocus() {\n      if (!this.$input.val() && this._defaults.defaultValue) {\n        this.$input.val(this._defaults.defaultValue);\n\n        var inst = $.datepicker._getInst(this.$input.get(0)),\n            tp_inst = $.datepicker._get(inst, 'timepicker');\n\n        if (tp_inst) {\n          if (tp_inst._defaults.timeOnly && inst.input.val() !== inst.lastVal) {\n            try {\n              $.datepicker._updateDatepicker(inst);\n            } catch (err) {\n              $.timepicker.log(err);\n            }\n          }\n        }\n      }\n    },\n\n    /*\r\n    * Small abstraction to control types\r\n    * We can add more, just be sure to follow the pattern: create, options, value\r\n    */\n    _controls: {\n      // slider methods\n      slider: {\n        create: function create(tp_inst, obj, unit, val, min, max, step) {\n          var rtl = tp_inst._defaults.isRTL; // if rtl go -60->0 instead of 0->60\n\n          return obj.prop('slide', null).slider({\n            orientation: \"horizontal\",\n            value: rtl ? val * -1 : val,\n            min: rtl ? max * -1 : min,\n            max: rtl ? min * -1 : max,\n            step: step,\n            slide: function slide(event, ui) {\n              tp_inst.control.value(tp_inst, $(this), unit, rtl ? ui.value * -1 : ui.value);\n\n              tp_inst._onTimeChange();\n            },\n            stop: function stop(event, ui) {\n              tp_inst._onSelectHandler();\n            }\n          });\n        },\n        options: function options(tp_inst, obj, unit, opts, val) {\n          if (tp_inst._defaults.isRTL) {\n            if (typeof opts === 'string') {\n              if (opts === 'min' || opts === 'max') {\n                if (val !== undefined) {\n                  return obj.slider(opts, val * -1);\n                }\n\n                return Math.abs(obj.slider(opts));\n              }\n\n              return obj.slider(opts);\n            }\n\n            var min = opts.min,\n                max = opts.max;\n            opts.min = opts.max = null;\n\n            if (min !== undefined) {\n              opts.max = min * -1;\n            }\n\n            if (max !== undefined) {\n              opts.min = max * -1;\n            }\n\n            return obj.slider(opts);\n          }\n\n          if (typeof opts === 'string' && val !== undefined) {\n            return obj.slider(opts, val);\n          }\n\n          return obj.slider(opts);\n        },\n        value: function value(tp_inst, obj, unit, val) {\n          if (tp_inst._defaults.isRTL) {\n            if (val !== undefined) {\n              return obj.slider('value', val * -1);\n            }\n\n            return Math.abs(obj.slider('value'));\n          }\n\n          if (val !== undefined) {\n            return obj.slider('value', val);\n          }\n\n          return obj.slider('value');\n        }\n      },\n      // select methods\n      select: {\n        create: function create(tp_inst, obj, unit, val, min, max, step) {\n          var sel = '<select class=\"ui-timepicker-select ui-state-default ui-corner-all\" data-unit=\"' + unit + '\" data-min=\"' + min + '\" data-max=\"' + max + '\" data-step=\"' + step + '\">',\n              format = tp_inst._defaults.pickerTimeFormat || tp_inst._defaults.timeFormat;\n\n          for (var i = min; i <= max; i += step) {\n            sel += '<option value=\"' + i + '\"' + (i === val ? ' selected' : '') + '>';\n\n            if (unit === 'hour') {\n              sel += $.datepicker.formatTime(format.replace(/[^ht ]/ig, '').trim(), {\n                hour: i\n              }, tp_inst._defaults);\n            } else if (unit === 'millisec' || unit === 'microsec' || i >= 10) {\n              sel += i;\n            } else {\n              sel += '0' + i.toString();\n            }\n\n            sel += '</option>';\n          }\n\n          sel += '</select>';\n          obj.children('select').remove();\n          $(sel).appendTo(obj).change(function (e) {\n            tp_inst._onTimeChange();\n\n            tp_inst._onSelectHandler();\n\n            tp_inst._afterInject();\n          });\n          return obj;\n        },\n        options: function options(tp_inst, obj, unit, opts, val) {\n          var o = {},\n              $t = obj.children('select');\n\n          if (typeof opts === 'string') {\n            if (val === undefined) {\n              return $t.data(opts);\n            }\n\n            o[opts] = val;\n          } else {\n            o = opts;\n          }\n\n          return tp_inst.control.create(tp_inst, obj, $t.data('unit'), $t.val(), o.min >= 0 ? o.min : $t.data('min'), o.max || $t.data('max'), o.step || $t.data('step'));\n        },\n        value: function value(tp_inst, obj, unit, val) {\n          var $t = obj.children('select');\n\n          if (val !== undefined) {\n            return $t.val(val);\n          }\n\n          return $t.val();\n        }\n      }\n    } // end _controls\n\n  });\n  $.fn.extend({\n    /*\r\n    * shorthand just to use timepicker.\r\n    */\n    timepicker: function timepicker(o) {\n      o = o || {};\n      var tmp_args = Array.prototype.slice.call(arguments);\n\n      if (_typeof(o) === 'object') {\n        tmp_args[0] = $.extend(o, {\n          timeOnly: true\n        });\n      }\n\n      return $(this).each(function () {\n        $.fn.datetimepicker.apply($(this), tmp_args);\n      });\n    },\n\n    /*\r\n    * extend timepicker to datepicker\r\n    */\n    datetimepicker: function datetimepicker(o) {\n      o = o || {};\n      var tmp_args = arguments;\n\n      if (typeof o === 'string') {\n        if (o === 'getDate' || o === 'option' && tmp_args.length === 2 && typeof tmp_args[1] === 'string') {\n          return $.fn.datepicker.apply($(this[0]), tmp_args);\n        } else {\n          return this.each(function () {\n            var $t = $(this);\n            $t.datepicker.apply($t, tmp_args);\n          });\n        }\n      } else {\n        return this.each(function () {\n          var $t = $(this);\n          $t.datepicker($.timepicker._newInst($t, o)._defaults);\n        });\n      }\n    }\n  });\n  /*\r\n  * Public Utility to parse date and time\r\n  */\n\n  $.datepicker.parseDateTime = function (dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {\n    var parseRes = parseDateTimeInternal(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings);\n\n    if (parseRes.timeObj) {\n      var t = parseRes.timeObj;\n      parseRes.date.setHours(t.hour, t.minute, t.second, t.millisec);\n      parseRes.date.setMicroseconds(t.microsec);\n    }\n\n    return parseRes.date;\n  };\n  /*\r\n  * Public utility to parse time\r\n  */\n\n\n  $.datepicker.parseTime = function (timeFormat, timeString, options) {\n    var o = extendRemove(extendRemove({}, $.timepicker._defaults), options || {}),\n        iso8601 = timeFormat.replace(/\\'.*?\\'/g, '').indexOf('Z') !== -1; // Strict parse requires the timeString to match the timeFormat exactly\n\n    var strictParse = function strictParse(f, s, o) {\n      // pattern for standard and localized AM/PM markers\n      var getPatternAmpm = function getPatternAmpm(amNames, pmNames) {\n        var markers = [];\n\n        if (amNames) {\n          $.merge(markers, amNames);\n        }\n\n        if (pmNames) {\n          $.merge(markers, pmNames);\n        }\n\n        markers = $.map(markers, function (val) {\n          return val.replace(/[.*+?|()\\[\\]{}\\\\]/g, '\\\\$&');\n        });\n        return '(' + markers.join('|') + ')?';\n      }; // figure out position of time elements.. cause js cant do named captures\n\n\n      var getFormatPositions = function getFormatPositions(timeFormat) {\n        var finds = timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),\n            orders = {\n          h: -1,\n          m: -1,\n          s: -1,\n          l: -1,\n          c: -1,\n          t: -1,\n          z: -1\n        };\n\n        if (finds) {\n          for (var i = 0; i < finds.length; i++) {\n            if (orders[finds[i].toString().charAt(0)] === -1) {\n              orders[finds[i].toString().charAt(0)] = i + 1;\n            }\n          }\n        }\n\n        return orders;\n      };\n\n      var regstr = '^' + f.toString().replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {\n        var ml = match.length;\n\n        switch (match.charAt(0).toLowerCase()) {\n          case 'h':\n            return ml === 1 ? '(\\\\d?\\\\d)' : '(\\\\d{' + ml + '})';\n\n          case 'm':\n            return ml === 1 ? '(\\\\d?\\\\d)' : '(\\\\d{' + ml + '})';\n\n          case 's':\n            return ml === 1 ? '(\\\\d?\\\\d)' : '(\\\\d{' + ml + '})';\n\n          case 'l':\n            return '(\\\\d?\\\\d?\\\\d)';\n\n          case 'c':\n            return '(\\\\d?\\\\d?\\\\d)';\n\n          case 'z':\n            return '(z|[-+]\\\\d\\\\d:?\\\\d\\\\d|\\\\S+)?';\n\n          case 't':\n            return getPatternAmpm(o.amNames, o.pmNames);\n\n          default:\n            // literal escaped in quotes\n            return '(' + match.replace(/\\'/g, \"\").replace(/(\\.|\\$|\\^|\\\\|\\/|\\(|\\)|\\[|\\]|\\?|\\+|\\*)/g, function (m) {\n              return \"\\\\\" + m;\n            }) + ')?';\n        }\n      }).replace(/\\s/g, '\\\\s?') + o.timeSuffix + '$',\n          order = getFormatPositions(f),\n          ampm = '',\n          treg;\n      treg = s.match(new RegExp(regstr, 'i'));\n      var resTime = {\n        hour: 0,\n        minute: 0,\n        second: 0,\n        millisec: 0,\n        microsec: 0\n      };\n\n      if (treg) {\n        if (order.t !== -1) {\n          if (treg[order.t] === undefined || treg[order.t].length === 0) {\n            ampm = '';\n            resTime.ampm = '';\n          } else {\n            ampm = $.inArray(treg[order.t].toUpperCase(), $.map(o.amNames, function (x, i) {\n              return x.toUpperCase();\n            })) !== -1 ? 'AM' : 'PM';\n            resTime.ampm = o[ampm === 'AM' ? 'amNames' : 'pmNames'][0];\n          }\n        }\n\n        if (order.h !== -1) {\n          if (ampm === 'AM' && treg[order.h] === '12') {\n            resTime.hour = 0; // 12am = 0 hour\n          } else {\n            if (ampm === 'PM' && treg[order.h] !== '12') {\n              resTime.hour = parseInt(treg[order.h], 10) + 12; // 12pm = 12 hour, any other pm = hour + 12\n            } else {\n              resTime.hour = Number(treg[order.h]);\n            }\n          }\n        }\n\n        if (order.m !== -1) {\n          resTime.minute = Number(treg[order.m]);\n        }\n\n        if (order.s !== -1) {\n          resTime.second = Number(treg[order.s]);\n        }\n\n        if (order.l !== -1) {\n          resTime.millisec = Number(treg[order.l]);\n        }\n\n        if (order.c !== -1) {\n          resTime.microsec = Number(treg[order.c]);\n        }\n\n        if (order.z !== -1 && treg[order.z] !== undefined) {\n          resTime.timezone = $.timepicker.timezoneOffsetNumber(treg[order.z]);\n        }\n\n        return resTime;\n      }\n\n      return false;\n    }; // end strictParse\n    // First try JS Date, if that fails, use strictParse\n\n\n    var looseParse = function looseParse(f, s, o) {\n      try {\n        var d = new Date('2012-01-01 ' + s);\n\n        if (isNaN(d.getTime())) {\n          d = new Date('2012-01-01T' + s);\n\n          if (isNaN(d.getTime())) {\n            d = new Date('01/01/2012 ' + s);\n\n            if (isNaN(d.getTime())) {\n              throw \"Unable to parse time with native Date: \" + s;\n            }\n          }\n        }\n\n        return {\n          hour: d.getHours(),\n          minute: d.getMinutes(),\n          second: d.getSeconds(),\n          millisec: d.getMilliseconds(),\n          microsec: d.getMicroseconds(),\n          timezone: d.getTimezoneOffset() * -1\n        };\n      } catch (err) {\n        try {\n          return strictParse(f, s, o);\n        } catch (err2) {\n          $.timepicker.log(\"Unable to parse \\ntimeString: \" + s + \"\\ntimeFormat: \" + f);\n        }\n      }\n\n      return false;\n    }; // end looseParse\n\n\n    if (typeof o.parse === \"function\") {\n      return o.parse(timeFormat, timeString, o);\n    }\n\n    if (o.parse === 'loose') {\n      return looseParse(timeFormat, timeString, o);\n    }\n\n    return strictParse(timeFormat, timeString, o);\n  };\n  /**\r\n   * Public utility to format the time\r\n   * @param {string} format format of the time\r\n   * @param {Object} time Object not a Date for timezones\r\n   * @param {Object} [options] essentially the regional[].. amNames, pmNames, ampm\r\n   * @returns {string} the formatted time\r\n   */\n\n\n  $.datepicker.formatTime = function (format, time, options) {\n    options = options || {};\n    options = $.extend({}, $.timepicker._defaults, options);\n    time = $.extend({\n      hour: 0,\n      minute: 0,\n      second: 0,\n      millisec: 0,\n      microsec: 0,\n      timezone: null\n    }, time);\n    var tmptime = format,\n        ampmName = options.amNames[0],\n        hour = parseInt(time.hour, 10);\n\n    if (hour > 11) {\n      ampmName = options.pmNames[0];\n    }\n\n    tmptime = tmptime.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {\n      switch (match) {\n        case 'HH':\n          return ('0' + hour).slice(-2);\n\n        case 'H':\n          return hour;\n\n        case 'hh':\n          return ('0' + convert24to12(hour)).slice(-2);\n\n        case 'h':\n          return convert24to12(hour);\n\n        case 'mm':\n          return ('0' + time.minute).slice(-2);\n\n        case 'm':\n          return time.minute;\n\n        case 'ss':\n          return ('0' + time.second).slice(-2);\n\n        case 's':\n          return time.second;\n\n        case 'l':\n          return ('00' + time.millisec).slice(-3);\n\n        case 'c':\n          return ('00' + time.microsec).slice(-3);\n\n        case 'z':\n          return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, false);\n\n        case 'Z':\n          return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, true);\n\n        case 'T':\n          return ampmName.charAt(0).toUpperCase();\n\n        case 'TT':\n          return ampmName.toUpperCase();\n\n        case 't':\n          return ampmName.charAt(0).toLowerCase();\n\n        case 'tt':\n          return ampmName.toLowerCase();\n\n        default:\n          return match.replace(/'/g, \"\");\n      }\n    });\n    return tmptime;\n  };\n  /*\r\n  * the bad hack :/ override datepicker so it doesn't close on select\r\n  // inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378\r\n  */\n\n\n  $.datepicker._base_selectDate = $.datepicker._selectDate;\n\n  $.datepicker._selectDate = function (id, dateStr) {\n    var inst = this._getInst($(id)[0]),\n        tp_inst = this._get(inst, 'timepicker'),\n        was_inline;\n\n    if (tp_inst && inst.settings.showTimepicker) {\n      tp_inst._limitMinMaxDateTime(inst, true);\n\n      was_inline = inst.inline;\n      inst.inline = inst.stay_open = true; //This way the onSelect handler called from calendarpicker get the full dateTime\n\n      this._base_selectDate(id, dateStr);\n\n      inst.inline = was_inline;\n      inst.stay_open = false;\n\n      this._notifyChange(inst);\n\n      this._updateDatepicker(inst);\n    } else {\n      this._base_selectDate(id, dateStr);\n    }\n  };\n  /*\r\n  * second bad hack :/ override datepicker so it triggers an event when changing the input field\r\n  * and does not redraw the datepicker on every selectDate event\r\n  */\n\n\n  $.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;\n\n  $.datepicker._updateDatepicker = function (inst) {\n    // don't popup the datepicker if there is another instance already opened\n    var input = inst.input[0];\n\n    if ($.datepicker._curInst && $.datepicker._curInst !== inst && $.datepicker._datepickerShowing && $.datepicker._lastInput !== input) {\n      return;\n    }\n\n    if (typeof inst.stay_open !== 'boolean' || inst.stay_open === false) {\n      this._base_updateDatepicker(inst); // Reload the time control when changing something in the input text field.\n\n\n      var tp_inst = this._get(inst, 'timepicker');\n\n      if (tp_inst) {\n        tp_inst._addTimePicker(inst);\n      }\n    }\n  };\n  /*\r\n  * third bad hack :/ override datepicker so it allows spaces and colon in the input field\r\n  */\n\n\n  $.datepicker._base_doKeyPress = $.datepicker._doKeyPress;\n\n  $.datepicker._doKeyPress = function (event) {\n    var inst = $.datepicker._getInst(event.target),\n        tp_inst = $.datepicker._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      if ($.datepicker._get(inst, 'constrainInput')) {\n        var ampm = tp_inst.support.ampm,\n            tz = tp_inst._defaults.showTimezone !== null ? tp_inst._defaults.showTimezone : tp_inst.support.timezone,\n            dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),\n            datetimeChars = tp_inst._defaults.timeFormat.toString().replace(/[hms]/g, '').replace(/TT/g, ampm ? 'APM' : '').replace(/Tt/g, ampm ? 'AaPpMm' : '').replace(/tT/g, ampm ? 'AaPpMm' : '').replace(/T/g, ampm ? 'AP' : '').replace(/tt/g, ampm ? 'apm' : '').replace(/t/g, ampm ? 'ap' : '') + \" \" + tp_inst._defaults.separator + tp_inst._defaults.timeSuffix + (tz ? tp_inst._defaults.timezoneList.join('') : '') + tp_inst._defaults.amNames.join('') + tp_inst._defaults.pmNames.join('') + dateChars,\n            chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);\n\n        return event.ctrlKey || chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1;\n      }\n    }\n\n    return $.datepicker._base_doKeyPress(event);\n  };\n  /*\r\n  * Fourth bad hack :/ override _updateAlternate function used in inline mode to init altField\r\n  * Update any alternate field to synchronise with the main field.\r\n  */\n\n\n  $.datepicker._base_updateAlternate = $.datepicker._updateAlternate;\n\n  $.datepicker._updateAlternate = function (inst) {\n    var tp_inst = this._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      var altField = tp_inst._defaults.altField;\n\n      if (altField) {\n        // update alternate field too\n        var altFormat = tp_inst._defaults.altFormat || tp_inst._defaults.dateFormat,\n            date = this._getDate(inst),\n            formatCfg = $.datepicker._getFormatConfig(inst),\n            altFormattedDateTime = '',\n            altSeparator = tp_inst._defaults.altSeparator ? tp_inst._defaults.altSeparator : tp_inst._defaults.separator,\n            altTimeSuffix = tp_inst._defaults.altTimeSuffix ? tp_inst._defaults.altTimeSuffix : tp_inst._defaults.timeSuffix,\n            altTimeFormat = tp_inst._defaults.altTimeFormat !== null ? tp_inst._defaults.altTimeFormat : tp_inst._defaults.timeFormat;\n\n        altFormattedDateTime += $.datepicker.formatTime(altTimeFormat, tp_inst, tp_inst._defaults) + altTimeSuffix;\n\n        if (!tp_inst._defaults.timeOnly && !tp_inst._defaults.altFieldTimeOnly && date !== null) {\n          if (tp_inst._defaults.altFormat) {\n            altFormattedDateTime = $.datepicker.formatDate(tp_inst._defaults.altFormat, date, formatCfg) + altSeparator + altFormattedDateTime;\n          } else {\n            altFormattedDateTime = tp_inst.formattedDate + altSeparator + altFormattedDateTime;\n          }\n        }\n\n        $(altField).val(inst.input.val() ? altFormattedDateTime : \"\");\n      }\n    } else {\n      $.datepicker._base_updateAlternate(inst);\n    }\n  };\n  /*\r\n  * Override key up event to sync manual input changes.\r\n  */\n\n\n  $.datepicker._base_doKeyUp = $.datepicker._doKeyUp;\n\n  $.datepicker._doKeyUp = function (event) {\n    var inst = $.datepicker._getInst(event.target),\n        tp_inst = $.datepicker._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      if (tp_inst._defaults.timeOnly && inst.input.val() !== inst.lastVal) {\n        try {\n          $.datepicker._updateDatepicker(inst);\n        } catch (err) {\n          $.timepicker.log(err);\n        }\n      }\n    }\n\n    return $.datepicker._base_doKeyUp(event);\n  };\n  /*\r\n  * override \"Today\" button to also grab the time and set it to input field.\r\n  */\n\n\n  $.datepicker._base_gotoToday = $.datepicker._gotoToday;\n\n  $.datepicker._gotoToday = function (id) {\n    var inst = this._getInst($(id)[0]);\n\n    this._base_gotoToday(id);\n\n    var tp_inst = this._get(inst, 'timepicker');\n\n    if (!tp_inst) {\n      return;\n    }\n\n    var tzoffset = $.timepicker.timezoneOffsetNumber(tp_inst.timezone);\n    var now = new Date();\n    now.setMinutes(now.getMinutes() + now.getTimezoneOffset() + parseInt(tzoffset, 10));\n\n    this._setTime(inst, now);\n\n    this._setDate(inst, now);\n\n    tp_inst._onSelectHandler();\n  };\n  /*\r\n  * Disable & enable the Time in the datetimepicker\r\n  */\n\n\n  $.datepicker._disableTimepickerDatepicker = function (target) {\n    var inst = this._getInst(target);\n\n    if (!inst) {\n      return;\n    }\n\n    var tp_inst = this._get(inst, 'timepicker');\n\n    $(target).datepicker('getDate'); // Init selected[Year|Month|Day]\n\n    if (tp_inst) {\n      inst.settings.showTimepicker = false;\n      tp_inst._defaults.showTimepicker = false;\n\n      tp_inst._updateDateTime(inst);\n    }\n  };\n\n  $.datepicker._enableTimepickerDatepicker = function (target) {\n    var inst = this._getInst(target);\n\n    if (!inst) {\n      return;\n    }\n\n    var tp_inst = this._get(inst, 'timepicker');\n\n    $(target).datepicker('getDate'); // Init selected[Year|Month|Day]\n\n    if (tp_inst) {\n      inst.settings.showTimepicker = true;\n      tp_inst._defaults.showTimepicker = true;\n\n      tp_inst._addTimePicker(inst); // Could be disabled on page load\n\n\n      tp_inst._updateDateTime(inst);\n    }\n  };\n  /*\r\n  * Create our own set time function\r\n  */\n\n\n  $.datepicker._setTime = function (inst, date) {\n    var tp_inst = this._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      var defaults = tp_inst._defaults; // calling _setTime with no date sets time to defaults\n\n      tp_inst.hour = date ? date.getHours() : defaults.hour;\n      tp_inst.minute = date ? date.getMinutes() : defaults.minute;\n      tp_inst.second = date ? date.getSeconds() : defaults.second;\n      tp_inst.millisec = date ? date.getMilliseconds() : defaults.millisec;\n      tp_inst.microsec = date ? date.getMicroseconds() : defaults.microsec; //check if within min/max times..\n\n      tp_inst._limitMinMaxDateTime(inst, true);\n\n      tp_inst._onTimeChange();\n\n      tp_inst._updateDateTime(inst);\n    }\n  };\n  /*\r\n  * Create new public method to set only time, callable as $().datepicker('setTime', date)\r\n  */\n\n\n  $.datepicker._setTimeDatepicker = function (target, date, withDate) {\n    var inst = this._getInst(target);\n\n    if (!inst) {\n      return;\n    }\n\n    var tp_inst = this._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      this._setDateFromField(inst);\n\n      var tp_date;\n\n      if (date) {\n        if (typeof date === \"string\") {\n          tp_inst._parseTime(date, withDate);\n\n          tp_date = new Date();\n          tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);\n          tp_date.setMicroseconds(tp_inst.microsec);\n        } else {\n          tp_date = new Date(date.getTime());\n          tp_date.setMicroseconds(date.getMicroseconds());\n        }\n\n        if (tp_date.toString() === 'Invalid Date') {\n          tp_date = undefined;\n        }\n\n        this._setTime(inst, tp_date);\n      }\n    }\n  };\n  /*\r\n  * override setDate() to allow setting time too within Date object\r\n  */\n\n\n  $.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;\n\n  $.datepicker._setDateDatepicker = function (target, _date) {\n    var inst = this._getInst(target);\n\n    var date = _date;\n\n    if (!inst) {\n      return;\n    }\n\n    if (typeof _date === 'string') {\n      date = new Date(_date);\n\n      if (!date.getTime()) {\n        this._base_setDateDatepicker.apply(this, arguments);\n\n        date = $(target).datepicker('getDate');\n      }\n    }\n\n    var tp_inst = this._get(inst, 'timepicker');\n\n    var tp_date;\n\n    if (date instanceof Date) {\n      tp_date = new Date(date.getTime());\n      tp_date.setMicroseconds(date.getMicroseconds());\n    } else {\n      tp_date = date;\n    } // This is important if you are using the timezone option, javascript's Date\n    // object will only return the timezone offset for the current locale, so we\n    // adjust it accordingly.  If not using timezone option this won't matter..\n    // If a timezone is different in tp, keep the timezone as is\n\n\n    if (tp_inst && tp_date) {\n      // look out for DST if tz wasn't specified\n      if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {\n        tp_inst.timezone = tp_date.getTimezoneOffset() * -1;\n      }\n\n      date = $.timepicker.timezoneAdjust(date, $.timepicker.timezoneOffsetString(-date.getTimezoneOffset()), tp_inst.timezone);\n      tp_date = $.timepicker.timezoneAdjust(tp_date, $.timepicker.timezoneOffsetString(-tp_date.getTimezoneOffset()), tp_inst.timezone);\n    }\n\n    this._updateDatepicker(inst);\n\n    this._base_setDateDatepicker.apply(this, arguments);\n\n    this._setTimeDatepicker(target, tp_date, true);\n  };\n  /*\r\n  * override getDate() to allow getting time too within Date object\r\n  */\n\n\n  $.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;\n\n  $.datepicker._getDateDatepicker = function (target, noDefault) {\n    var inst = this._getInst(target);\n\n    if (!inst) {\n      return;\n    }\n\n    var tp_inst = this._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      // if it hasn't yet been defined, grab from field\n      if (inst.lastVal === undefined) {\n        this._setDateFromField(inst, noDefault);\n      }\n\n      var date = this._getDate(inst);\n\n      var currDT = null;\n\n      if (tp_inst.$altInput && tp_inst._defaults.altFieldTimeOnly) {\n        currDT = tp_inst.$input.val() + ' ' + tp_inst.$altInput.val();\n      } else if (tp_inst.$input.get(0).tagName !== 'INPUT' && tp_inst.$altInput) {\n        /**\r\n         * in case the datetimepicker has been applied to a non-input tag for inline UI,\r\n         * and the user has not configured the plugin to display only time in altInput,\r\n         * pick current date time from the altInput (and hope for the best, for now, until \"ER1\" is applied)\r\n         *\r\n         * @todo ER1. Since altInput can have a totally difference format, convert it to standard format by reading input format from \"altFormat\" and \"altTimeFormat\" option values\r\n         */\n        currDT = tp_inst.$altInput.val();\n      } else {\n        currDT = tp_inst.$input.val();\n      }\n\n      if (date && tp_inst._parseTime(currDT, !inst.settings.timeOnly)) {\n        date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);\n        date.setMicroseconds(tp_inst.microsec); // This is important if you are using the timezone option, javascript's Date\n        // object will only return the timezone offset for the current locale, so we\n        // adjust it accordingly.  If not using timezone option this won't matter..\n\n        if (tp_inst.timezone != null) {\n          // look out for DST if tz wasn't specified\n          if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {\n            tp_inst.timezone = date.getTimezoneOffset() * -1;\n          }\n\n          date = $.timepicker.timezoneAdjust(date, tp_inst.timezone, $.timepicker.timezoneOffsetString(-date.getTimezoneOffset()));\n        }\n      }\n\n      return date;\n    }\n\n    return this._base_getDateDatepicker(target, noDefault);\n  };\n  /*\r\n  * override parseDate() because UI 1.8.14 throws an error about \"Extra characters\"\r\n  * An option in datapicker to ignore extra format characters would be nicer.\r\n  */\n\n\n  $.datepicker._base_parseDate = $.datepicker.parseDate;\n\n  $.datepicker.parseDate = function (format, value, settings) {\n    var date;\n\n    try {\n      date = this._base_parseDate(format, value, settings);\n    } catch (err) {\n      // Hack!  The error message ends with a colon, a space, and\n      // the \"extra\" characters.  We rely on that instead of\n      // attempting to perfectly reproduce the parsing algorithm.\n      if (err.indexOf(\":\") >= 0) {\n        date = this._base_parseDate(format, value.substring(0, value.length - (err.length - err.indexOf(':') - 2)), settings);\n        $.timepicker.log(\"Error parsing the date string: \" + err + \"\\ndate string = \" + value + \"\\ndate format = \" + format);\n      } else {\n        throw err;\n      }\n    }\n\n    return date;\n  };\n  /*\r\n  * override formatDate to set date with time to the input\r\n  */\n\n\n  $.datepicker._base_formatDate = $.datepicker._formatDate;\n\n  $.datepicker._formatDate = function (inst, day, month, year) {\n    var tp_inst = this._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      tp_inst._updateDateTime(inst);\n\n      return tp_inst.$input.val();\n    }\n\n    return this._base_formatDate(inst);\n  };\n  /*\r\n  * override options setter to add time to maxDate(Time) and minDate(Time). MaxDate\r\n  */\n\n\n  $.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;\n\n  $.datepicker._optionDatepicker = function (target, name, value) {\n    var inst = this._getInst(target),\n        name_clone;\n\n    if (!inst) {\n      return null;\n    }\n\n    var tp_inst = this._get(inst, 'timepicker');\n\n    if (tp_inst) {\n      var min = null,\n          max = null,\n          onselect = null,\n          overrides = tp_inst._defaults.evnts,\n          fns = {},\n          prop,\n          ret,\n          oldVal,\n          $target;\n\n      if (typeof name === 'string') {\n        // if min/max was set with the string\n        if (name === 'minDate' || name === 'minDateTime') {\n          min = value;\n        } else if (name === 'maxDate' || name === 'maxDateTime') {\n          max = value;\n        } else if (name === 'onSelect') {\n          onselect = value;\n        } else if (overrides.hasOwnProperty(name)) {\n          if (typeof value === 'undefined') {\n            return overrides[name];\n          }\n\n          fns[name] = value;\n          name_clone = {}; //empty results in exiting function after overrides updated\n        }\n      } else if (_typeof(name) === 'object') {\n        //if min/max was set with the JSON\n        if (name.minDate) {\n          min = name.minDate;\n        } else if (name.minDateTime) {\n          min = name.minDateTime;\n        } else if (name.maxDate) {\n          max = name.maxDate;\n        } else if (name.maxDateTime) {\n          max = name.maxDateTime;\n        }\n\n        for (prop in overrides) {\n          if (overrides.hasOwnProperty(prop) && name[prop]) {\n            fns[prop] = name[prop];\n          }\n        }\n      }\n\n      for (prop in fns) {\n        if (fns.hasOwnProperty(prop)) {\n          overrides[prop] = fns[prop];\n\n          if (!name_clone) {\n            name_clone = $.extend({}, name);\n          }\n\n          delete name_clone[prop];\n        }\n      }\n\n      if (name_clone && isEmptyObject(name_clone)) {\n        return;\n      }\n\n      if (min) {\n        //if min was set\n        if (min === 0) {\n          min = new Date();\n        } else {\n          min = new Date(min);\n        }\n\n        tp_inst._defaults.minDate = min;\n        tp_inst._defaults.minDateTime = min;\n      } else if (max) {\n        //if max was set\n        if (max === 0) {\n          max = new Date();\n        } else {\n          max = new Date(max);\n        }\n\n        tp_inst._defaults.maxDate = max;\n        tp_inst._defaults.maxDateTime = max;\n      } else if (onselect) {\n        tp_inst._defaults.onSelect = onselect;\n      } // Datepicker will override our date when we call _base_optionDatepicker when\n      // calling minDate/maxDate, so we will first grab the value, call\n      // _base_optionDatepicker, then set our value back.\n\n\n      if (min || max) {\n        $target = $(target);\n        oldVal = $target.datetimepicker('getDate');\n        ret = this._base_optionDatepicker.call($.datepicker, target, name_clone || name, value);\n        $target.datetimepicker('setDate', oldVal);\n        return ret;\n      }\n    }\n\n    if (value === undefined) {\n      return this._base_optionDatepicker.call($.datepicker, target, name);\n    }\n\n    return this._base_optionDatepicker.call($.datepicker, target, name_clone || name, value);\n  };\n  /*\r\n  * jQuery isEmptyObject does not check hasOwnProperty - if someone has added to the object prototype,\r\n  * it will return false for all objects\r\n  */\n\n\n  var isEmptyObject = function isEmptyObject(obj) {\n    var prop;\n\n    for (prop in obj) {\n      if (obj.hasOwnProperty(prop)) {\n        return false;\n      }\n    }\n\n    return true;\n  };\n  /*\r\n  * jQuery extend now ignores nulls!\r\n  */\n\n\n  var extendRemove = function extendRemove(target, props) {\n    $.extend(target, props);\n\n    for (var name in props) {\n      if (props[name] === null || props[name] === undefined) {\n        target[name] = props[name];\n      }\n    }\n\n    return target;\n  };\n  /*\r\n  * Determine by the time format which units are supported\r\n  * Returns an object of booleans for each unit\r\n  */\n\n\n  var detectSupport = function detectSupport(timeFormat) {\n    var tf = timeFormat.replace(/'.*?'/g, '').toLowerCase(),\n        // removes literals\n    isIn = function isIn(f, t) {\n      // does the format contain the token?\n      return f.indexOf(t) !== -1 ? true : false;\n    };\n\n    return {\n      hour: isIn(tf, 'h'),\n      minute: isIn(tf, 'm'),\n      second: isIn(tf, 's'),\n      millisec: isIn(tf, 'l'),\n      microsec: isIn(tf, 'c'),\n      timezone: isIn(tf, 'z'),\n      ampm: isIn(tf, 't') && isIn(timeFormat, 'h'),\n      iso8601: isIn(timeFormat, 'Z')\n    };\n  };\n  /*\r\n  * Converts 24 hour format into 12 hour\r\n  * Returns 12 hour without leading 0\r\n  */\n\n\n  var convert24to12 = function convert24to12(hour) {\n    hour %= 12;\n\n    if (hour === 0) {\n      hour = 12;\n    }\n\n    return String(hour);\n  };\n\n  var computeEffectiveSetting = function computeEffectiveSetting(settings, property) {\n    return settings && settings[property] ? settings[property] : $.timepicker._defaults[property];\n  };\n  /*\r\n  * Splits datetime string into date and time substrings.\r\n  * Throws exception when date can't be parsed\r\n  * Returns {dateString: dateString, timeString: timeString}\r\n  */\n\n\n  var splitDateTime = function splitDateTime(dateTimeString, timeSettings) {\n    // The idea is to get the number separator occurrences in datetime and the time format requested (since time has\n    // fewer unknowns, mostly numbers and am/pm). We will use the time pattern to split.\n    var separator = computeEffectiveSetting(timeSettings, 'separator'),\n        format = computeEffectiveSetting(timeSettings, 'timeFormat'),\n        timeParts = format.split(separator),\n        // how many occurrences of separator may be in our format?\n    timePartsLen = timeParts.length,\n        allParts = dateTimeString.split(separator),\n        allPartsLen = allParts.length;\n\n    if (allPartsLen > 1) {\n      return {\n        dateString: allParts.splice(0, allPartsLen - timePartsLen).join(separator),\n        timeString: allParts.splice(0, timePartsLen).join(separator)\n      };\n    }\n\n    return {\n      dateString: dateTimeString,\n      timeString: ''\n    };\n  };\n  /*\r\n  * Internal function to parse datetime interval\r\n  * Returns: {date: Date, timeObj: Object}, where\r\n  *   date - parsed date without time (type Date)\r\n  *   timeObj = {hour: , minute: , second: , millisec: , microsec: } - parsed time. Optional\r\n  */\n\n\n  var parseDateTimeInternal = function parseDateTimeInternal(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {\n    var date, parts, parsedTime;\n    parts = splitDateTime(dateTimeString, timeSettings);\n    date = $.datepicker._base_parseDate(dateFormat, parts.dateString, dateSettings);\n\n    if (parts.timeString === '') {\n      return {\n        date: date\n      };\n    }\n\n    parsedTime = $.datepicker.parseTime(timeFormat, parts.timeString, timeSettings);\n\n    if (!parsedTime) {\n      throw 'Wrong time format';\n    }\n\n    return {\n      date: date,\n      timeObj: parsedTime\n    };\n  };\n  /*\r\n  * Internal function to set timezone_select to the local timezone\r\n  */\n\n\n  var selectLocalTimezone = function selectLocalTimezone(tp_inst, date) {\n    if (tp_inst && tp_inst.timezone_select) {\n      var now = date || new Date();\n      tp_inst.timezone_select.val(-now.getTimezoneOffset());\n    }\n  };\n  /*\r\n  * Create a Singleton Instance\r\n  */\n\n\n  $.timepicker = new Timepicker();\n  /**\r\n   * Get the timezone offset as string from a date object (eg '+0530' for UTC+5.5)\r\n   * @param {number} tzMinutes if not a number, less than -720 (-1200), or greater than 840 (+1400) this value is returned\r\n   * @param {boolean} iso8601 if true formats in accordance to iso8601 \"+12:45\"\r\n   * @return {string}\r\n   */\n\n  $.timepicker.timezoneOffsetString = function (tzMinutes, iso8601) {\n    if (isNaN(tzMinutes) || tzMinutes > 840 || tzMinutes < -720) {\n      return tzMinutes;\n    }\n\n    var off = tzMinutes,\n        minutes = off % 60,\n        hours = (off - minutes) / 60,\n        iso = iso8601 ? ':' : '',\n        tz = (off >= 0 ? '+' : '-') + ('0' + Math.abs(hours)).slice(-2) + iso + ('0' + Math.abs(minutes)).slice(-2);\n\n    if (tz === '+00:00') {\n      return 'Z';\n    }\n\n    return tz;\n  };\n  /**\r\n   * Get the number in minutes that represents a timezone string\r\n   * @param  {string} tzString formatted like \"+0500\", \"-1245\", \"Z\"\r\n   * @return {number} the offset minutes or the original string if it doesn't match expectations\r\n   */\n\n\n  $.timepicker.timezoneOffsetNumber = function (tzString) {\n    var normalized = tzString.toString().replace(':', ''); // excuse any iso8601, end up with \"+1245\"\n\n    if (normalized.toUpperCase() === 'Z') {\n      // if iso8601 with Z, its 0 minute offset\n      return 0;\n    }\n\n    if (!/^(\\-|\\+)\\d{4}$/.test(normalized)) {\n      // possibly a user defined tz, so just give it back\n      return parseInt(tzString, 10);\n    }\n\n    return (normalized.substr(0, 1) === '-' ? -1 : 1) * ( // plus or minus\n    parseInt(normalized.substr(1, 2), 10) * 60 + // hours (converted to minutes)\n    parseInt(normalized.substr(3, 2), 10)); // minutes\n  };\n  /**\r\n   * No way to set timezone in js Date, so we must adjust the minutes to compensate. (think setDate, getDate)\r\n   * @param  {Date} date\r\n   * @param  {string} fromTimezone formatted like \"+0500\", \"-1245\"\r\n   * @param  {string} toTimezone formatted like \"+0500\", \"-1245\"\r\n   * @return {Date}\r\n   */\n\n\n  $.timepicker.timezoneAdjust = function (date, fromTimezone, toTimezone) {\n    var fromTz = $.timepicker.timezoneOffsetNumber(fromTimezone);\n    var toTz = $.timepicker.timezoneOffsetNumber(toTimezone);\n\n    if (!isNaN(toTz)) {\n      date.setMinutes(date.getMinutes() + -fromTz - -toTz);\n    }\n\n    return date;\n  };\n  /**\r\n   * Calls `timepicker()` on the `startTime` and `endTime` elements, and configures them to\r\n   * enforce date range limits.\r\n   * n.b. The input value must be correctly formatted (reformatting is not supported)\r\n   * @param  {Element} startTime\r\n   * @param  {Element} endTime\r\n   * @param  {Object} options Options for the timepicker() call\r\n   * @return {jQuery}\r\n   */\n\n\n  $.timepicker.timeRange = function (startTime, endTime, options) {\n    return $.timepicker.handleRange('timepicker', startTime, endTime, options);\n  };\n  /**\r\n   * Calls `datetimepicker` on the `startTime` and `endTime` elements, and configures them to\r\n   * enforce date range limits.\r\n   * @param  {Element} startTime\r\n   * @param  {Element} endTime\r\n   * @param  {Object} options Options for the `timepicker()` call. Also supports `reformat`,\r\n   *   a boolean value that can be used to reformat the input values to the `dateFormat`.\r\n   * @param  {string} method Can be used to specify the type of picker to be added\r\n   * @return {jQuery}\r\n   */\n\n\n  $.timepicker.datetimeRange = function (startTime, endTime, options) {\n    $.timepicker.handleRange('datetimepicker', startTime, endTime, options);\n  };\n  /**\r\n   * Calls `datepicker` on the `startTime` and `endTime` elements, and configures them to\r\n   * enforce date range limits.\r\n   * @param  {Element} startTime\r\n   * @param  {Element} endTime\r\n   * @param  {Object} options Options for the `timepicker()` call. Also supports `reformat`,\r\n   *   a boolean value that can be used to reformat the input values to the `dateFormat`.\r\n   * @return {jQuery}\r\n   */\n\n\n  $.timepicker.dateRange = function (startTime, endTime, options) {\n    $.timepicker.handleRange('datepicker', startTime, endTime, options);\n  };\n  /**\r\n   * Calls `method` on the `startTime` and `endTime` elements, and configures them to\r\n   * enforce date range limits.\r\n   * @param  {string} method Can be used to specify the type of picker to be added\r\n   * @param  {Element} startTime\r\n   * @param  {Element} endTime\r\n   * @param  {Object} options Options for the `timepicker()` call. Also supports `reformat`,\r\n   *   a boolean value that can be used to reformat the input values to the `dateFormat`.\r\n   * @return {jQuery}\r\n   */\n\n\n  $.timepicker.handleRange = function (method, startTime, endTime, options) {\n    options = $.extend({}, {\n      minInterval: 0,\n      // min allowed interval in milliseconds\n      maxInterval: 0,\n      // max allowed interval in milliseconds\n      start: {},\n      // options for start picker\n      end: {} // options for end picker\n\n    }, options); // for the mean time this fixes an issue with calling getDate with timepicker()\n\n    var timeOnly = false;\n\n    if (method === 'timepicker') {\n      timeOnly = true;\n      method = 'datetimepicker';\n    }\n\n    function checkDates(changed, other) {\n      var startdt = startTime[method]('getDate'),\n          enddt = endTime[method]('getDate'),\n          changeddt = changed[method]('getDate');\n\n      if (startdt !== null) {\n        var minDate = new Date(startdt.getTime()),\n            maxDate = new Date(startdt.getTime());\n        minDate.setMilliseconds(minDate.getMilliseconds() + options.minInterval);\n        maxDate.setMilliseconds(maxDate.getMilliseconds() + options.maxInterval);\n\n        if (options.minInterval > 0 && minDate > enddt) {\n          // minInterval check\n          endTime[method]('setDate', minDate);\n        } else if (options.maxInterval > 0 && maxDate < enddt) {\n          // max interval check\n          endTime[method]('setDate', maxDate);\n        } else if (startdt > enddt) {\n          other[method]('setDate', changeddt);\n        }\n      }\n    }\n\n    function selected(changed, other, option) {\n      if (!changed.val()) {\n        return;\n      }\n\n      var date = changed[method].call(changed, 'getDate');\n\n      if (date !== null && options.minInterval > 0) {\n        if (option === 'minDate') {\n          date.setMilliseconds(date.getMilliseconds() + options.minInterval);\n        }\n\n        if (option === 'maxDate') {\n          date.setMilliseconds(date.getMilliseconds() - options.minInterval);\n        }\n      }\n\n      if (date.getTime) {\n        other[method].call(other, 'option', option, date);\n      }\n    }\n\n    $.fn[method].call(startTime, $.extend({\n      timeOnly: timeOnly,\n      onClose: function onClose(dateText, inst) {\n        checkDates($(this), endTime);\n      },\n      onSelect: function onSelect(selectedDateTime) {\n        selected($(this), endTime, 'minDate');\n      }\n    }, options, options.start));\n    $.fn[method].call(endTime, $.extend({\n      timeOnly: timeOnly,\n      onClose: function onClose(dateText, inst) {\n        checkDates($(this), startTime);\n      },\n      onSelect: function onSelect(selectedDateTime) {\n        selected($(this), startTime, 'maxDate');\n      }\n    }, options, options.end));\n    checkDates(startTime, endTime);\n    selected(startTime, endTime, 'minDate');\n    selected(endTime, startTime, 'maxDate');\n    return $([startTime.get(0), endTime.get(0)]);\n  };\n  /**\r\n   * Log error or data to the console during error or debugging\r\n   * @param  {Object} err pass any type object to log to the console during error or debugging\r\n   * @return {void}\r\n   */\n\n\n  $.timepicker.log = function () {\n    // Older IE (9, maybe 10) throw error on accessing `window.console.log.apply`, so check first.\n    if (window.console && window.console.log && window.console.log.apply) {//window.console.log.apply(window.console, Array.prototype.slice.call(arguments));\n    }\n  };\n  /*\r\n   * Add util object to allow access to private methods for testability.\r\n   */\n\n\n  $.timepicker._util = {\n    _extendRemove: extendRemove,\n    _isEmptyObject: isEmptyObject,\n    _convert24to12: convert24to12,\n    _detectSupport: detectSupport,\n    _selectLocalTimezone: selectLocalTimezone,\n    _computeEffectiveSetting: computeEffectiveSetting,\n    _splitDateTime: splitDateTime,\n    _parseDateTimeInternal: parseDateTimeInternal\n  };\n  /*\r\n  * Microsecond support\r\n  */\n\n  if (!Date.prototype.getMicroseconds) {\n    Date.prototype.microseconds = 0;\n\n    Date.prototype.getMicroseconds = function () {\n      return this.microseconds;\n    };\n\n    Date.prototype.setMicroseconds = function (m) {\n      this.setMilliseconds(this.getMilliseconds() + Math.floor(m / 1000));\n      this.microseconds = m % 1000;\n      return this;\n    };\n  }\n  /*\r\n  * Keep up with the version\r\n  */\n\n\n  $.timepicker.version = \"@@version\";\n});\n\n//# sourceURL=webpack://rup/./src/core/ui/jquery-ui.timepicker.js?");

/***/ }),

/***/ "./src/core/ui/jquery.multiselect.js":
/*!*******************************************!*\
  !*** ./src/core/ui/jquery.multiselect.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */\n\n/*\r\n * jQuery MultiSelect UI Widget 1.13\r\n * Copyright (c) 2012 Eric Hynds\r\n *\r\n * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/\r\n *\r\n * Depends:\r\n *   - jQuery 1.4.2+\r\n *   - jQuery UI 1.8 widget factory\r\n *\r\n * Optional:\r\n *   - jQuery UI effects\r\n *   - jQuery UI position utility\r\n *\r\n * Dual licensed under the MIT and GPL licenses:\r\n *   http://www.opensource.org/licenses/mit-license.php\r\n *   http://www.gnu.org/licenses/gpl.html\r\n *\r\n*/\n\n/* global define */\n\n/* global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! jqueryUI */ \"./node_modules/jquery-ui-dist/jquery-ui.js\"), __webpack_require__(/*! ./jquery.ui.selectmenu */ \"./src/core/ui/jquery.ui.selectmenu.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  var multiselectID = 0;\n  $.widget('ech.multiselect', {\n    // default options\n    options: {\n      header: true,\n      height: 175,\n      minWidth: 225,\n      classes: '',\n      checkAllText: 'Check all',\n      uncheckAllText: 'Uncheck all',\n      noneSelectedText: 'Select options',\n      selectedText: '# selected',\n      selectedList: 0,\n      show: null,\n      hide: null,\n      autoOpen: false,\n      multiple: true,\n      position: {}\n    },\n    _create: function _create() {\n      var el = this.element.hide(),\n          o = this.options;\n      this.speed = $.fx.speeds._default; // default speed for effects\n\n      this._isOpen = false; // assume no\n\n      var //button = (this.button = $('<button type=\"button\"><span class=\"ui-icon ui-icon-triangle-2-n-s\"></span></button>'))\n      button = (this.button = $('<button type=\"button\"><span class=\"ui-icon ui-icon-triangle-1-s\"></span></button>')).addClass('ui-multiselect ui-widget ui-state-default ui-corner-all').addClass(o.classes).attr({\n        'title': el.attr('title'),\n        'aria-haspopup': true,\n        'tabIndex': el.attr('tabIndex')\n      }).insertAfter(el),\n          buttonlabel = (this.buttonlabel = $('<span></span>')).html(o.noneSelectedText).appendTo(button),\n          menu = (this.menu = $('<div></div>')).attr('id', 'rup-multiCombo_' + $(this.element).attr('id')).addClass('ui-multiselect-menu ui-widget ui-widget-content ui-corner-all').addClass(o.classes).appendTo(o.appendTo),\n          header = (this.header = $('<div></div>')).addClass('ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix').appendTo(menu),\n          headerLinkContainer = (this.headerLinkContainer = $('<ul></ul>')).addClass('ui-helper-reset').html(function () {\n        if (o.header === true) {\n          return '<li><a class=\"ui-multiselect-all\" href=\"#\"><span class=\"ui-icon ui-icon-check\"></span><span>' + o.checkAllText + '</span></a></li><li><a class=\"ui-multiselect-none\" href=\"#\"><span class=\"ui-icon ui-icon-closethick\"></span><span>' + o.uncheckAllText + '</span></a></li>';\n        } else if (typeof o.header === 'string') {\n          return '<li>' + o.header + '</li>';\n        } else {\n          return '';\n        }\n      }).append('<li class=\"ui-multiselect-close\"><a href=\"#\" class=\"ui-multiselect-close\"><span class=\"ui-icon ui-icon-circle-close\"></span></a></li>').appendTo(header),\n          checkboxContainer = (this.checkboxContainer = $('<ul></ul>')).addClass('ui-multiselect-checkboxes ui-helper-reset').appendTo(menu); // perform event bindings\n\n      this._bindEvents(); // build menu\n\n\n      this.refresh(true); // some addl. logic for single selects\n\n      if (!o.multiple) {\n        menu.addClass('ui-multiselect-single');\n      }\n    },\n    _init: function _init() {\n      if (this.options.header === false) {\n        this.header.hide();\n      }\n\n      if (!this.options.multiple) {\n        this.headerLinkContainer.find('.ui-multiselect-all, .ui-multiselect-none').hide();\n      }\n\n      if (this.options.autoOpen) {\n        this.open();\n      }\n\n      if (this.element.is(':disabled')) {\n        this.disable();\n      }\n    },\n    refresh: function refresh(init) {\n      var el = this.element,\n          o = this.options,\n          menu = this.menu,\n          checkboxContainer = this.checkboxContainer,\n          optgroups = [],\n          html = '',\n          id = el.attr('id') || multiselectID++; // unique ID for the label & option tags\n      // build items\n\n      el.find('option').each(function (i) {\n        var $this = $(this),\n            parent = this.parentNode,\n            title = this.innerHTML,\n            description = this.title,\n            value = this.value,\n            inputID = 'ui-multiselect-' + (this.id || id + '-option-' + i),\n            isDisabled = this.disabled,\n            isSelected = this.selected,\n            labelClasses = ['ui-corner-all'],\n            liClasses = (isDisabled ? 'ui-multiselect-disabled ' : ' ') + this.className,\n            optLabel; // is this an optgroup?\n\n        if (parent.tagName === 'OPTGROUP') {\n          optLabel = parent.getAttribute('label'); // has this optgroup been added already?\n\n          if ($.inArray(optLabel, optgroups) === -1) {\n            html += '<li class=\"ui-multiselect-optgroup-label ' + parent.className + '\"><a href=\"#\">' + optLabel + '</a></li>';\n            optgroups.push(optLabel);\n          }\n        }\n\n        if (isDisabled) {\n          labelClasses.push('ui-state-disabled');\n        } // browsers automatically select the first option\n        // by default with single selects\n\n\n        if (isSelected && !o.multiple) {\n          labelClasses.push('ui-state-active');\n        }\n\n        html += '<li class=\"' + liClasses + '\">'; // create the label\n\n        html += '<label for=\"' + inputID + '\" title=\"' + description + '\" class=\"' + labelClasses.join(' ') + '\">';\n        html += '<input id=\"' + inputID + '\" name=\"multiselect_' + id + '\" type=\"' + (o.multiple ? 'checkbox' : 'radio') + '\" value=\"' + value + '\" title=\"' + title + '\"'; // pre-selected?\n\n        if (isSelected) {\n          html += ' checked=\"checked\"';\n          html += ' aria-selected=\"true\"';\n        } // disabled?\n\n\n        if (isDisabled) {\n          html += ' disabled=\"disabled\"';\n          html += ' aria-disabled=\"true\"';\n        } // add the title and close everything off\n\n\n        html += ' /><span>' + title + '</span></label></li>';\n      }); // insert into the DOM\n\n      checkboxContainer.html(html); // cache some moar useful elements\n\n      this.labels = menu.find('label');\n      this.inputs = this.labels.children('input'); // set widths\n\n      this._setButtonWidth();\n\n      this._setMenuWidth(); // remember default value\n\n\n      this.button[0].defaultValue = this.update(); // broadcast refresh event; useful for widgets\n\n      if (!init) {\n        this._trigger('refresh');\n      }\n    },\n    // updates the button text. call refresh() to rebuild\n    update: function update() {\n      var o = this.options,\n          $inputs = this.inputs,\n          $checked = $inputs.filter(':checked'),\n          numChecked = $checked.length,\n          value;\n\n      if (numChecked === 0) {\n        value = o.noneSelectedText;\n      } else {\n        if (typeof o.selectedText === \"function\") {\n          value = o.selectedText.call(this, numChecked, $inputs.length, $checked.get());\n        } else if (/\\d/.test(o.selectedList) && o.selectedList > 0 && numChecked <= o.selectedList) {\n          value = $checked.map(function () {\n            return $(this).next().html();\n          }).get().join(', ');\n        } else {\n          value = o.selectedText.replace('#', numChecked).replace('#', $inputs.length);\n        }\n      }\n\n      this.buttonlabel.html(value);\n      return value;\n    },\n    // binds events\n    _bindEvents: function _bindEvents() {\n      var self = this,\n          button = this.button;\n\n      function clickHandler() {\n        self[self._isOpen ? 'close' : 'open']();\n        return false;\n      } // webkit doesn't like it when you click on the span :(\n\n\n      button.find('span').on('click.multiselect', clickHandler); // button events\n\n      button.on({\n        click: clickHandler,\n        keypress: function keypress(e) {\n          switch (e.which) {\n            case 27: // esc\n\n            case 38: // up\n\n            case 37:\n              // left\n              self.close();\n              break;\n\n            case 39: // right\n\n            case 40:\n              // down\n              self.open();\n              break;\n          }\n        },\n        mouseenter: function mouseenter() {\n          if (!button.hasClass('ui-state-disabled')) {\n            $(this).addClass('ui-state-hover');\n          }\n        },\n        mouseleave: function mouseleave() {\n          $(this).removeClass('ui-state-hover');\n        },\n        focus: function focus() {\n          if (!button.hasClass('ui-state-disabled')) {\n            $(this).addClass('ui-state-focus');\n          }\n        },\n        blur: function blur() {\n          $(this).removeClass('ui-state-focus');\n        }\n      }); // header links\n\n      this.header.on('a', 'click.multiselect', function (e) {\n        // close link\n        if ($(this).hasClass('ui-multiselect-close')) {\n          self.close(); // check all / uncheck all\n        } else {\n          self[$(this).hasClass('ui-multiselect-all') ? 'checkAll' : 'uncheckAll']();\n        }\n\n        e.preventDefault();\n      }); // optgroup label toggle support\n\n      this.menu.on('li.ui-multiselect-optgroup-label a', 'click.multiselect', function (e) {\n        e.preventDefault();\n        var $this = $(this),\n            $inputs = $this.parent().nextUntil('li.ui-multiselect-optgroup-label').find('input:visible:not(:disabled)'),\n            nodes = $inputs.get(),\n            label = $this.parent().text(); // trigger event and bail if the return is false\n        //if( self._trigger('beforeoptgrouptoggle', e, { inputs:nodes, label:label }) === false ){\n        //IE Fix: (Select - Disabled option)\n\n        if (self._trigger('beforeoptgrouptoggle', e, {\n          inputs: nodes,\n          label: label\n        }) === false || !nodes.length) {\n          return;\n        } // toggle inputs\n\n\n        self._toggleChecked($inputs.filter(':checked').length !== $inputs.length, $inputs);\n\n        self._trigger('optgrouptoggle', e, {\n          inputs: nodes,\n          label: label,\n          checked: nodes[0].checked\n        });\n      }).on('label', 'mouseenter.multiselect', function () {\n        if (!$(this).hasClass('ui-state-disabled')) {\n          self.labels.removeClass('ui-state-hover'); //$(this).addClass('ui-state-hover').find('input').focus();\n          //IE Fix: (Select - Disabled option)\n\n          $(this).addClass('ui-state-hover').find('input:not(:disabled)').focus();\n        }\n      }).on('label', 'keydown.multiselect', function (e) {\n        e.preventDefault();\n\n        switch (e.which) {\n          case 9: // tab\n\n          case 27:\n            // esc\n            self.close();\n            break;\n\n          case 38: // up\n\n          case 40: // down\n\n          case 37: // left\n\n          case 39:\n            // right\n            self._traverse(e.which, this);\n\n            break;\n\n          case 13:\n            // enter\n            $(this).find('input')[0].click();\n            break;\n        }\n      }).on('click.multiselect', 'input[type=\"checkbox\"], input[type=\"radio\"]', function (e) {\n        var $this = $(this),\n            val = this.value,\n            checked = this.checked,\n            tags = self.element.find('option'); // bail if this input is disabled or the event is cancelled\n\n        if (this.disabled || self._trigger('click', e, {\n          value: val,\n          text: this.title,\n          checked: checked\n        }) === false) {\n          e.preventDefault();\n          return;\n        } // make sure the input has focus. otherwise, the esc key\n        // won't close the menu after clicking an item.\n\n\n        $this.focus(); // toggle aria state\n\n        $this.attr('aria-selected', checked); // change state on the original option tags\n\n        tags.each(function () {\n          if (this.value === val) {\n            this.selected = checked;\n          } else if (!self.options.multiple) {\n            this.selected = false;\n          }\n        }); // some additional single select-specific logic\n\n        if (!self.options.multiple) {\n          self.labels.removeClass('ui-state-active');\n          $this.closest('label').toggleClass('ui-state-active', checked); // close menu\n\n          self.close();\n        } // fire change on the select box\n\n\n        self.element.trigger('change'); // setTimeout is to fix multiselect issue #14 and #47. caused by jQuery issue #3827\n        // http://bugs.jquery.com/ticket/3827\n\n        setTimeout(self.update.bind(self), 10);\n      }); // close each widget when clicking on any other element/anywhere else on the page\n\n      $(document).on('mousedown.multiselect', function (e) {\n        if (self._isOpen && !$.contains(self.menu[0], e.target) && !$.contains(self.button[0], e.target) && e.target !== self.button[0]) {\n          self.close();\n        }\n      }); // deal with form resets.  the problem here is that buttons aren't\n      // restored to their defaultValue prop on form reset, and the reset\n      // handler fires before the form is actually reset.  delaying it a bit\n      // gives the form inputs time to clear.\n\n      $(this.element[0].form).on('reset.multiselect', function () {\n        setTimeout(self.refresh.bind(self), 10);\n      });\n    },\n    // set button width\n    _setButtonWidth: function _setButtonWidth() {\n      var o = this.options;\n      var width;\n\n      if (typeof o.width === 'string' && o.width.indexOf('%') > -1) {\n        width = o.width;\n      } else {\n        width = this.element.outerWidth();\n\n        if (/\\d/.test(o.minWidth) && width < o.minWidth) {\n          width = o.minWidth;\n        }\n      } // set widths\n\n\n      this.button.width(width);\n    },\n    // set menu width\n    _setMenuWidth: function _setMenuWidth() {\n      var m = this.menu,\n          width = this.button.outerWidth() - parseInt(m.css('padding-left'), 10) - parseInt(m.css('padding-right'), 10) - parseInt(m.css('border-right-width'), 10) - parseInt(m.css('border-left-width'), 10);\n      m.width(width || this.button.outerWidth());\n    },\n    // move up or down within the menu\n    _traverse: function _traverse(which, start) {\n      var $start = $(start),\n          moveToLast = which === 38 || which === 37,\n          // select the first li that isn't an optgroup label / disabled\n      $next = $start.parent()[moveToLast ? 'prevAll' : 'nextAll']('li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)')[moveToLast ? 'last' : 'first'](); // if at the first/last element\n\n      if (!$next.length) {\n        var $container = this.menu.find('ul').last(); // move to the first/last\n\n        this.menu.find('label')[moveToLast ? 'last' : 'first']().trigger('mouseover'); // set scroll position\n\n        $container.scrollTop(moveToLast ? $container.height() : 0);\n      } else {\n        $next.find('label').trigger('mouseover');\n      }\n    },\n    // This is an internal function to toggle the checked property and\n    // other related attributes of a checkbox.\n    //\n    // The context of this function should be a checkbox; do not proxy it.\n    _toggleState: function _toggleState(prop, flag) {\n      return function () {\n        if (!this.disabled) {\n          this[prop] = flag;\n        }\n\n        if (flag) {\n          this.setAttribute('aria-selected', true);\n        } else {\n          this.removeAttribute('aria-selected');\n        }\n      };\n    },\n    _toggleChecked: function _toggleChecked(flag, group) {\n      //var $inputs = (group && group.length) ?  group : this.inputs,\n      //\tself = this;\n      //IE Fix: (Select - Disabled option)\n      var $inputs = group && group.length ? group : this.labels.find('input:enabled'),\n          self = this; // toggle state on inputs\n\n      $inputs.each(this._toggleState('checked', flag)); // give the first input focus\n\n      $inputs.eq(0).focus(); // update button text\n\n      this.update(); // gather an array of the values that actually changed\n\n      var values = $inputs.map(function () {\n        return this.value;\n      }).get(); // toggle state on original option tags\n\n      this.element.find('option').each(function () {\n        if (!this.disabled && $.inArray(this.value, values) > -1) {\n          self._toggleState('selected', flag).call(this);\n        }\n      }); // trigger the change event on the select\n\n      if ($inputs.length) {\n        this.element.trigger('change');\n      }\n    },\n    _toggleDisabled: function _toggleDisabled(flag) {\n      this.button.attr({\n        'disabled': flag,\n        'aria-disabled': flag\n      })[flag ? 'addClass' : 'removeClass']('ui-state-disabled');\n      var inputs = this.menu.find('input');\n      var key = 'ech-multiselect-disabled';\n\n      if (flag) {\n        // remember which elements this widget disabled (not pre-disabled)\n        // elements, so that they can be restored if the widget is re-enabled.\n        inputs = inputs.filter(':enabled').data(key, true);\n      } else {\n        inputs = inputs.filter(function () {\n          return $.data(this, key) === true;\n        }).removeData(key);\n      }\n\n      inputs.attr({\n        'disabled': flag,\n        'arial-disabled': flag\n      }).parent()[flag ? 'addClass' : 'removeClass']('ui-state-disabled');\n      this.element.attr({\n        'disabled': flag,\n        'aria-disabled': flag\n      });\n    },\n    // open the menu\n    open: function open(e) {\n      var self = this,\n          button = this.button,\n          menu = this.menu,\n          speed = this.speed,\n          o = this.options,\n          args = []; // bail if the multiselectopen event returns false, this widget is disabled, or is already open\n\n      if (this._trigger('beforeopen') === false || button.hasClass('ui-state-disabled') || this._isOpen) {\n        return;\n      }\n\n      var $container = menu.find('ul').last(),\n          effect = o.show,\n          pos = o.positionMenuByOffset ? button.offset() : button.position(); // figure out opening effects/speeds\n\n      if (Array.isArray(o.show)) {\n        effect = o.show[0];\n        speed = o.show[1] || self.speed;\n      } // if there's an effect, assume jQuery UI is in use\n      // build the arguments to pass to show()\n\n\n      if (effect) {\n        args = [effect, speed];\n      } // set the scroll of the checkbox container\n\n\n      $container.scrollTop(0).height(o.height); // position and show menu\n\n      if ($.ui.position && !$.isEmptyObject(o.position)) {\n        o.position.of = button || o.position.of; //al tener varios remotos que mantenga la posición.\n\n        menu.show().position(o.position).hide(); // if position utility is not available...\n      } else {\n        menu.css({\n          top: pos.top + button.outerHeight(),\n          left: pos.left\n        });\n      } // show the menu, maybe with a speed/effect combo\n      //$.fn.show.apply(menu, args);\n\n\n      menu.show(); // select the first option\n      // triggering both mouseover and mouseover because 1.4.2+ has a bug where triggering mouseover\n      // will actually trigger mouseenter.  the mouseenter trigger is there for when it's eventually fixed\n      //this.labels.eq(0).trigger('mouseover').trigger('mouseenter').find('input').trigger('focus');\n      //IE Fix: (Select - Disabled option)\n\n      this.labels.eq(0).trigger('mouseover').trigger('mouseenter').find('input:enabled').trigger('focus');\n      button.addClass('ui-state-active');\n      this._isOpen = true;\n\n      this._trigger('open');\n    },\n    // close the menu\n    close: function close() {\n      if (this._trigger('beforeclose') === false) {\n        return;\n      }\n\n      var o = this.options,\n          effect = o.hide,\n          speed = this.speed,\n          args = []; // figure out opening effects/speeds\n\n      if (Array.isArray(o.hide)) {\n        effect = o.hide[0];\n        speed = o.hide[1] || this.speed;\n      }\n\n      if (effect) {\n        args = [effect, speed];\n      }\n\n      $.fn.hide.apply(this.menu, args);\n      this.button.removeClass('ui-state-active').trigger('blur').trigger('mouseleave');\n      this._isOpen = false;\n\n      this._trigger('close');\n    },\n    enable: function enable() {\n      this._toggleDisabled(false);\n    },\n    disable: function disable() {\n      this._toggleDisabled(true);\n    },\n    checkAll: function checkAll(e) {\n      this._toggleChecked(true);\n\n      this._trigger('checkAll');\n    },\n    uncheckAll: function uncheckAll() {\n      this._toggleChecked(false);\n\n      this._trigger('uncheckAll');\n    },\n    getChecked: function getChecked() {\n      return this.menu.find('input').filter(':checked');\n    },\n    destroy: function destroy() {\n      // remove classes + data\n      $.Widget.prototype.destroy.call(this);\n      this.button.remove();\n      this.menu.remove();\n      this.element.show();\n      return this;\n    },\n    isOpen: function isOpen() {\n      return this._isOpen;\n    },\n    widget: function widget() {\n      return this.menu;\n    },\n    getButton: function getButton() {\n      return this.button;\n    },\n    // react to option changes after initialization\n    _setOption: function _setOption(key, value) {\n      var menu = this.menu;\n\n      switch (key) {\n        case 'header':\n          menu.find('div.ui-multiselect-header')[value ? 'show' : 'hide']();\n          break;\n\n        case 'checkAllText':\n          menu.find('a.ui-multiselect-all span').eq(-1).text(value);\n          break;\n\n        case 'uncheckAllText':\n          menu.find('a.ui-multiselect-none span').eq(-1).text(value);\n          break;\n\n        case 'height':\n          menu.find('ul').last().height(parseInt(value, 10));\n          break;\n\n        case 'minWidth':\n          this.options[key] = parseInt(value, 10);\n\n          this._setButtonWidth();\n\n          this._setMenuWidth();\n\n          break;\n\n        case 'selectedText':\n        case 'selectedList':\n        case 'noneSelectedText':\n          this.options[key] = value; // these all needs to update immediately for the update() call\n\n          this.update();\n          break;\n\n        case 'classes':\n          menu.add(this.button).removeClass(this.options.classes).addClass(value);\n          break;\n\n        case 'multiple':\n          menu.toggleClass('ui-multiselect-single', !value);\n          this.options.multiple = value;\n          this.element[0].multiple = value;\n          this.refresh();\n      }\n\n      $.Widget.prototype._setOption.apply(this, arguments);\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./src/core/ui/jquery.multiselect.js?");

/***/ }),

/***/ "./src/core/ui/jquery.ui.selectmenu.js":
/*!*********************************************!*\
  !*** ./src/core/ui/jquery.ui.selectmenu.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\n * jQuery UI Selectmenu version 1.5.0pre\r\n *\r\n * Copyright (c) 2009-2010 filament group, http://filamentgroup.com\r\n * Copyright (c) 2010-2014 Felix Nagel, http://www.felixnagel.com\r\n * Licensed under the MIT (MIT-LICENSE.txt)\r\n *\r\n * https://github.com/fnagel/jquery-ui/wiki/Selectmenu\r\n */\n\n/* global define */\n\n/* global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! jqueryUI */ \"./node_modules/jquery-ui-dist/jquery-ui.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.widget('ui.selectmenu', {\n    options: {\n      appendTo: 'body',\n      typeAhead: 1000,\n      style: 'dropdown',\n      positionOptions: null,\n      width: null,\n      menuWidth: null,\n      handleWidth: 26,\n      maxHeight: null,\n      icons: null,\n      format: null,\n      escapeHtml: false,\n      bgImage: function bgImage() {}\n    },\n    _create: function _create() {\n      var self = this,\n          o = this.options; // make / set unique id\n\n      var selectmenuId = this.element.uniqueId().attr('id'); // quick array of button and menu id's\n\n      this.ids = [selectmenuId, selectmenuId + '-button', selectmenuId + '-menu']; // define safe mouseup for future toggling\n\n      this._safemouseup = true;\n      this.isOpen = false; // create menu button wrapper\n\n      this.newelement = $('<a></a>', {\n        'class': 'ui-selectmenu ui-widget ui-state-default ui-corner-all',\n        'id': this.ids[1],\n        'role': 'button',\n        'href': '#nogo',\n        'tabindex': this.element.attr('disabled') ? 1 : 0,\n        'aria-haspopup': true,\n        'aria-owns': this.ids[2]\n      });\n      this.newelementWrap = $('<span></span>').append(this.newelement).insertAfter(this.element); // transfer tabindex\n\n      var tabindex = this.element.attr('tabindex');\n\n      if (tabindex) {\n        this.newelement.attr('tabindex', tabindex);\n      } // save reference to select in data for ease in calling methods\n\n\n      this.newelement.data('selectelement', this.element); // menu icon\n\n      this.selectmenuIcon = $('<span class=\"ui-selectmenu-icon ui-icon\"></span>').prependTo(this.newelement); // append status span to button\n\n      this.newelement.prepend('<span class=\"ui-selectmenu-status\"></span>'); // make associated form label trigger focus\n\n      this.element.on({\n        'click.selectmenu': function clickSelectmenu(event) {\n          self.newelement.focus();\n          event.preventDefault();\n        }\n      }); // click toggle for menu visibility\n\n      this.newelement.on('mousedown.selectmenu', function (event) {\n        self._toggle(event, true); // make sure a click won't open/close instantly\n\n\n        if (o.style == 'popup') {\n          self._safemouseup = false;\n          setTimeout(function () {\n            self._safemouseup = true;\n          }, 300);\n        }\n\n        event.preventDefault();\n      }).on('click.selectmenu', function (event) {\n        event.preventDefault();\n      }).on('keydown.selectmenu', function (event) {\n        var ret = false;\n\n        switch (event.keyCode) {\n          case $.ui.keyCode.ENTER:\n            ret = true;\n            break;\n\n          case $.ui.keyCode.SPACE:\n            self._toggle(event);\n\n            break;\n\n          case $.ui.keyCode.UP:\n            if (event.altKey) {\n              self.open(event);\n            } else {\n              self._moveSelection(-1);\n            }\n\n            break;\n\n          case $.ui.keyCode.DOWN:\n            if (event.altKey) {\n              self.open(event);\n            } else {\n              self._moveSelection(1);\n            }\n\n            break;\n\n          case $.ui.keyCode.LEFT:\n            self._moveSelection(-1);\n\n            break;\n\n          case $.ui.keyCode.RIGHT:\n            self._moveSelection(1);\n\n            break;\n\n          case $.ui.keyCode.TAB:\n            ret = true;\n            break;\n\n          case $.ui.keyCode.PAGE_UP:\n          case $.ui.keyCode.HOME:\n            self.index(0);\n            break;\n\n          case $.ui.keyCode.PAGE_DOWN:\n          case $.ui.keyCode.END:\n            self.index(self._optionLis.length);\n            break;\n\n          default:\n            ret = true;\n        }\n\n        return ret;\n      }).on('keypress.selectmenu', function (event) {\n        if (event.which > 0) {\n          self._typeAhead(event.which, 'mouseup');\n        }\n\n        return true;\n      }).on('mouseover.selectmenu', function () {\n        if (!o.disabled) $(this).addClass('ui-state-hover');\n      }).on('mouseout.selectmenu', function () {\n        if (!o.disabled) $(this).removeClass('ui-state-hover');\n      }).on('focus.selectmenu', function () {\n        if (!o.disabled) $(this).addClass('ui-state-focus');\n      }).on('blur.selectmenu', function () {\n        if (!o.disabled) $(this).removeClass('ui-state-focus');\n      }); // document click closes menu\n\n      $(document).on('mousedown.selectmenu-' + this.ids[0], function (event) {\n        //check if open and if the clicket targes parent is the same\n        if (self.isOpen && !$(event.target).closest('#' + self.ids[1]).length) {\n          self.close(event);\n        }\n      }); // change event on original selectmenu\n\n      this.element.on('click.selectmenu', function () {\n        self._refreshValue();\n      }) // FIXME: newelement can be null under unclear circumstances in IE8\n      // TODO not sure if this is still a problem (fnagel 20.03.11)\n      .on('focus.selectmenu', function () {\n        if (self.newelement) {\n          self.newelement[0].focus();\n        }\n      }); // set width when not set via options\n\n      if (!o.width) {\n        o.width = this.element.outerWidth();\n      } // set menu button width\n\n\n      this.newelement.width(o.width); // hide original selectmenu element\n\n      this.element.hide(); // create menu portion, append to body\n\n      this.list = $('<ul></ul>', {\n        'class': 'ui-widget ui-widget-content',\n        'aria-hidden': true,\n        'role': 'listbox',\n        'aria-labelledby': this.ids[1],\n        'id': this.ids[2]\n      });\n      this.listWrap = $('<div></div>', {\n        'class': 'ui-selectmenu-menu'\n      }).append(this.list).appendTo(o.appendTo); // transfer menu click to menu button\n\n      this.list.on('keydown.selectmenu', function (event) {\n        var ret = false;\n\n        switch (event.keyCode) {\n          case $.ui.keyCode.UP:\n            if (event.altKey) {\n              self.close(event, true);\n            } else {\n              self._moveFocus(-1);\n            }\n\n            break;\n\n          case $.ui.keyCode.DOWN:\n            if (event.altKey) {\n              self.close(event, true);\n            } else {\n              self._moveFocus(1);\n            }\n\n            break;\n\n          case $.ui.keyCode.LEFT:\n            self._moveFocus(-1);\n\n            break;\n\n          case $.ui.keyCode.RIGHT:\n            self._moveFocus(1);\n\n            break;\n\n          case $.ui.keyCode.HOME:\n            self._moveFocus(':first');\n\n            break;\n\n          case $.ui.keyCode.PAGE_UP:\n            self._scrollPage('up');\n\n            break;\n\n          case $.ui.keyCode.PAGE_DOWN:\n            self._scrollPage('down');\n\n            break;\n\n          case $.ui.keyCode.END:\n            self._moveFocus().last();\n\n            break;\n\n          case $.ui.keyCode.ENTER:\n          case $.ui.keyCode.SPACE:\n            self.close(event, true);\n            $(event.target).parents('li').eq(0).trigger('mouseup');\n            break;\n\n          case $.ui.keyCode.TAB:\n            ret = true;\n            self.close(event, true);\n            $(event.target).parents('li').eq(0).trigger('mouseup');\n            break;\n\n          case $.ui.keyCode.ESCAPE:\n            self.close(event, true);\n            break;\n\n          default:\n            ret = true;\n        }\n\n        return ret;\n      }).on('keypress.selectmenu', function (event) {\n        if (event.which > 0) {\n          self._typeAhead(event.which, 'focus');\n        }\n\n        return true;\n      }) // this allows for using the scrollbar in an overflowed list\n      .on('mousedown.selectmenu mouseup.selectmenu', function () {\n        return false;\n      }); // needed when window is resized\n\n      $(window).on('resize.selectmenu-' + this.ids[0], self.close.bind(this));\n    },\n    _init: function _init() {\n      var self = this,\n          o = this.options; // serialize selectmenu element options\n\n      var selectOptionData = [];\n      this.element.find('option').each(function () {\n        var opt = $(this);\n        selectOptionData.push({\n          value: opt.attr('value'),\n          text: self._formatText(opt.text(), opt),\n          selected: opt.attr('selected'),\n          disabled: opt.attr('disabled'),\n          classes: opt.attr('class'),\n          typeahead: opt.attr('typeahead'),\n          parentOptGroup: opt.parent('optgroup'),\n          bgImage: o.bgImage.call(opt)\n        });\n      }); // active state class is only used in popup style\n\n      var activeClass = self.options.style == 'popup' ? ' ui-state-active' : ''; // empty list so we can refresh the selectmenu via selectmenu()\n\n      this.list.html(''); // write li's\n\n      if (selectOptionData.length) {\n        for (var i = 0; i < selectOptionData.length; i++) {\n          var thisLiAttr = {\n            role: 'presentation'\n          };\n\n          if (selectOptionData[i].disabled) {\n            thisLiAttr['class'] = 'ui-state-disabled';\n          }\n\n          var thisAAttr = {\n            html: selectOptionData[i].text || '&nbsp;',\n            href: '#nogo',\n            tabindex: -1,\n            role: 'option',\n            'aria-selected': false\n          };\n\n          if (selectOptionData[i].disabled) {\n            thisAAttr['aria-disabled'] = true;\n          }\n\n          if (selectOptionData[i].typeahead) {\n            thisAAttr['typeahead'] = selectOptionData[i].typeahead;\n          }\n\n          var thisA = $('<a></a>', thisAAttr).on('focus.selectmenu', function () {\n            $(this).parent().mouseover();\n          }).on('blur.selectmenu', function () {\n            $(this).parent().mouseout();\n          });\n          var thisLi = $('<li></li>', thisLiAttr).append(thisA).data('index', i).addClass(selectOptionData[i].classes).data('optionClasses', selectOptionData[i].classes || '').on('mouseup.selectmenu', function (event) {\n            if (self._safemouseup && !self._disabled(event.currentTarget) && !self._disabled($(event.currentTarget).parents('ul > li.ui-selectmenu-group '))) {\n              self.index($(this).data('index'));\n              self.select(event);\n              self.close(event, true);\n            }\n\n            return false;\n          }).on('click.selectmenu', function () {\n            return false;\n          }).on('mouseover.selectmenu', function (e) {\n            // no hover if disabled\n            if (!$(this).hasClass('ui-state-disabled') && !$(this).parent('ul').parent('li').hasClass('ui-state-disabled')) {\n              if (self._typeAhead_timer === undefined) {\n                e.optionValue = self.element[0].options[$(this).data('index')].value;\n\n                self._trigger('hover', e, self._uiHash());\n\n                self._selectedOptionLi().addClass(activeClass);\n\n                self._focusedOptionLi().removeClass('ui-selectmenu-item-focus ui-state-hover');\n\n                $(this).removeClass('ui-state-active').addClass('ui-selectmenu-item-focus ui-state-hover');\n              }\n            }\n          }).on('mouseout.selectmenu', function (e) {\n            if ($(this).is(self._selectedOptionLi())) {\n              $(this).addClass(activeClass);\n            }\n\n            e.optionValue = self.element[0].options[$(this).data('index')].value;\n\n            self._trigger('blur', e, self._uiHash());\n\n            $(this).removeClass('ui-selectmenu-item-focus ui-state-hover');\n          }); // optgroup or not...\n\n          if (selectOptionData[i].parentOptGroup.length) {\n            var optGroupName = 'ui-selectmenu-group-' + this.element.find('optgroup').index(selectOptionData[i].parentOptGroup);\n\n            if (this.list.find('li.' + optGroupName).length) {\n              this.list.find('li.' + optGroupName).last().find('ul').append(thisLi);\n            } else {\n              $('<li role=\"presentation\" class=\"ui-selectmenu-group ' + optGroupName + (selectOptionData[i].parentOptGroup.attr('disabled') ? ' ' + 'ui-state-disabled\" aria-disabled=\"true\"' : '\"') + '><span class=\"ui-selectmenu-group-label\">' + selectOptionData[i].parentOptGroup.attr('label') + '</span><ul></ul></li>').appendTo(this.list).find('ul').append(thisLi);\n            }\n          } else {\n            thisLi.appendTo(this.list);\n          } // append icon if option is specified\n\n\n          if (o.icons) {\n            for (var j in o.icons) {\n              if (thisLi.is(o.icons[j].find)) {\n                thisLi.data('optionClasses', selectOptionData[i].classes + ' ui-selectmenu-hasIcon').addClass('ui-selectmenu-hasIcon');\n                var iconClass = o.icons[j].icon || '';\n                thisLi.find('a').eq(0).prepend('<span class=\"ui-selectmenu-item-icon ui-icon ' + iconClass + '\"></span>');\n\n                if (selectOptionData[i].bgImage) {\n                  thisLi.find('span').css('background-image', selectOptionData[i].bgImage);\n                }\n              }\n            }\n          }\n        }\n      } else {\n        $('<li role=\"presentation\"><a href=\"#nogo\" tabindex=\"-1\" role=\"option\"></a></li>').appendTo(this.list);\n      } // we need to set and unset the CSS classes for dropdown and popup style\n\n\n      var isDropDown = o.style == 'dropdown';\n      this.newelement.toggleClass('ui-selectmenu-dropdown', isDropDown).toggleClass('ui-selectmenu-popup', !isDropDown);\n      this.list.toggleClass('ui-selectmenu-menu-dropdown ui-corner-bottom', isDropDown).toggleClass('ui-selectmenu-menu-popup ui-corner-all', !isDropDown) // add corners to top and bottom menu items\n      .find('li').first().toggleClass('ui-corner-top', !isDropDown).end().find('li').last().addClass('ui-corner-bottom');\n      this.selectmenuIcon.toggleClass('ui-icon-triangle-1-s', isDropDown).toggleClass('ui-icon-triangle-2-n-s', !isDropDown); // set menu width to either menuWidth option value, width option value, or select width\n\n      if (o.style == 'dropdown') {\n        this.list.width(o.menuWidth ? o.menuWidth : o.width);\n      } else {\n        this.list.width(o.menuWidth ? o.menuWidth : o.width - o.handleWidth);\n      } // Android 2 (Gingerbread) doesn't support internal scrollable divs.\n      // Don't limit the menu height for that browser.\n\n\n      if (!navigator.userAgent.match(/Android 2/)) {\n        var listH = this.listWrap.height();\n        var winH = $(window).height(); // calculate default max height\n\n        var maxH = o.maxHeight ? Math.min(o.maxHeight, winH) : winH / 3;\n        if (listH > maxH) this.list.height(maxH);\n      } // save reference to actionable li's (not group label li's)\n\n\n      this._optionLis = this.list.find('li:not(.ui-selectmenu-group)'); // transfer disabled state\n\n      if (this.element.attr('disabled')) {\n        this.disable();\n      } else {\n        this.enable();\n      } // update value\n\n\n      this._refreshValue(); // set selected item so movefocus has intial state\n\n\n      this._selectedOptionLi().addClass('ui-selectmenu-item-focus'); // needed when selectmenu is placed at the very bottom / top of the page\n\n\n      clearTimeout(this.refreshTimeout);\n      this.refreshTimeout = window.setTimeout(function () {\n        self._refreshPosition();\n      }, 200);\n    },\n    destroy: function destroy() {\n      this.element.removeData(this.widgetName).removeClass('ui-selectmenu-disabled' + ' ' + 'ui-state-disabled').removeAttr('aria-disabled').off('.selectmenu');\n      $(window).off('.selectmenu-' + this.ids[0]);\n      $(document).off('.selectmenu-' + this.ids[0]);\n      this.newelementWrap.remove();\n      this.listWrap.remove(); // unbind click event and show original select\n\n      this.element.off('.selectmenu').show(); // call widget destroy function\n\n      $.Widget.prototype.destroy.apply(this, arguments);\n    },\n    _typeAhead: function _typeAhead(code, eventType) {\n      var self = this,\n          c = String.fromCharCode(code).toLowerCase(),\n          matchee = null,\n          nextIndex = null; // Clear any previous timer if present\n\n      if (self._typeAhead_timer) {\n        window.clearTimeout(self._typeAhead_timer);\n        self._typeAhead_timer = undefined;\n      } // Store the character typed\n\n\n      self._typeAhead_chars = (self._typeAhead_chars === undefined ? '' : self._typeAhead_chars).concat(c); // Detect if we are in cyciling mode or direct selection mode\n\n      if (self._typeAhead_chars.length < 2 || self._typeAhead_chars.substr(-2, 1) === c && self._typeAhead_cycling) {\n        self._typeAhead_cycling = true; // Match only the first character and loop\n\n        matchee = c;\n      } else {\n        // We won't be cycling anymore until the timer expires\n        self._typeAhead_cycling = false; // Match all the characters typed\n\n        matchee = self._typeAhead_chars;\n      } // We need to determine the currently active index, but it depends on\n      // the used context: if it's in the element, we want the actual\n      // selected index, if it's in the menu, just the focused one\n\n\n      var selectedIndex = (eventType !== 'focus' ? this._selectedOptionLi().data('index') : this._focusedOptionLi().data('index')) || 0;\n\n      for (var i = 0; i < this._optionLis.length; i++) {\n        var thisText = this._optionLis.eq(i).text().substr(0, matchee.length).toLowerCase();\n\n        if (thisText === matchee) {\n          if (self._typeAhead_cycling) {\n            if (nextIndex === null) nextIndex = i;\n\n            if (i > selectedIndex) {\n              nextIndex = i;\n              break;\n            }\n          } else {\n            nextIndex = i;\n            break;\n          }\n        }\n      }\n\n      if (nextIndex !== null) {\n        // Why using trigger() instead of a direct method to select the index? Because we don't what is the exact action to do,\n        // it depends if the user is typing on the element or on the popped up menu\n        this._optionLis.eq(nextIndex).find('a').trigger(eventType);\n      }\n\n      self._typeAhead_timer = window.setTimeout(function () {\n        self._typeAhead_timer = undefined;\n        self._typeAhead_chars = undefined;\n        self._typeAhead_cycling = undefined;\n      }, self.options.typeAhead);\n    },\n    // returns some usefull information, called by callbacks only\n    _uiHash: function _uiHash() {\n      var index = this.index();\n      return {\n        index: index,\n        option: $('option', this.element).get(index),\n        value: this.element[0].value\n      };\n    },\n    open: function open(event) {\n      if (this.newelement.attr('aria-disabled') != 'true') {\n        var self = this,\n            o = this.options,\n            selected = this._selectedOptionLi(),\n            link = selected.find('a');\n\n        self._closeOthers(event);\n\n        self.newelement.addClass('ui-state-active');\n        self.list.attr('aria-hidden', false);\n        self.listWrap.addClass('ui-selectmenu-open');\n\n        if (o.style == 'dropdown') {\n          self.newelement.removeClass('ui-corner-all').addClass('ui-corner-top');\n        } else {\n          // center overflow and avoid flickering\n          this.list.css('left', -5000).scrollTop(this.list.scrollTop() + selected.position().top - this.list.outerHeight() / 2 + selected.outerHeight() / 2).css('left', 'auto');\n        }\n\n        self._refreshPosition();\n\n        if (link.length) {\n          link[0].focus();\n        }\n\n        self.isOpen = true;\n\n        self._trigger('open', event, self._uiHash());\n      }\n    },\n    close: function close(event, retainFocus) {\n      if (this.newelement.is('.ui-state-active')) {\n        this.newelement.removeClass('ui-state-active');\n        this.listWrap.removeClass('ui-selectmenu-open');\n        this.list.attr('aria-hidden', true);\n\n        if (this.options.style == 'dropdown') {\n          this.newelement.removeClass('ui-corner-top').addClass('ui-corner-all');\n        }\n\n        if (retainFocus) {\n          this.newelement.focus();\n        }\n\n        this.isOpen = false;\n\n        this._trigger('close', event, this._uiHash());\n      }\n    },\n    change: function change(event) {\n      this.element.trigger('change');\n\n      this._trigger('change', event, this._uiHash());\n    },\n    select: function select(event) {\n      if (this._disabled(event.currentTarget)) {\n        return false;\n      }\n\n      this._trigger('select', event, this._uiHash());\n    },\n    widget: function widget() {\n      return this.listWrap.add(this.newelementWrap);\n    },\n    _closeOthers: function _closeOthers(event) {\n      $('.ui-selectmenu.ui-state-active').not(this.newelement).each(function () {\n        $(this).data('selectelement').selectmenu('close', event);\n      });\n      $('.ui-selectmenu.ui-state-hover').trigger('mouseout');\n    },\n    _toggle: function _toggle(event, retainFocus) {\n      if (this.isOpen) {\n        this.close(event, retainFocus);\n      } else {\n        this.open(event);\n      }\n    },\n    _formatText: function _formatText(text, opt) {\n      if (this.options.format) {\n        text = this.options.format(text, opt);\n      } else if (this.options.escapeHtml) {\n        text = $('<div></div>').text(text).html();\n      }\n\n      return text;\n    },\n    _selectedIndex: function _selectedIndex() {\n      return this.element[0].selectedIndex;\n    },\n    _selectedOptionLi: function _selectedOptionLi() {\n      return this._optionLis.eq(this._selectedIndex());\n    },\n    _focusedOptionLi: function _focusedOptionLi() {\n      return this.list.find('.ui-selectmenu-item-focus');\n    },\n    _moveSelection: function _moveSelection(amt, recIndex) {\n      // do nothing if disabled\n      if (!this.options.disabled) {\n        var currIndex = parseInt(this._selectedOptionLi().data('index') || 0, 10);\n        var newIndex = currIndex + amt; // do not loop when using up key\n\n        if (newIndex < 0) {\n          newIndex = 0;\n        }\n\n        if (newIndex > this._optionLis.length - 1) {\n          newIndex = this._optionLis.length - 1;\n        } // Occurs when a full loop has been made\n\n\n        if (newIndex === recIndex) {\n          return false;\n        }\n\n        if (this._optionLis.eq(newIndex).hasClass('ui-state-disabled')) {\n          // if option at newIndex is disabled, call _moveFocus, incrementing amt by one\n          amt > 0 ? ++amt : --amt;\n\n          this._moveSelection(amt, newIndex);\n        } else {\n          this._optionLis.eq(newIndex).trigger('mouseover').trigger('mouseup');\n        }\n      }\n    },\n    _moveFocus: function _moveFocus(amt, recIndex) {\n      if (!isNaN(amt)) {\n        var currIndex = parseInt(this._focusedOptionLi().data('index') || 0, 10);\n        var newIndex = currIndex + amt;\n      } else {\n        var newIndex = parseInt(this._optionLis.filter(amt).data('index'), 10);\n      }\n\n      if (newIndex < 0) {\n        newIndex = 0;\n      }\n\n      if (newIndex > this._optionLis.length - 1) {\n        newIndex = this._optionLis.length - 1;\n      } //Occurs when a full loop has been made\n\n\n      if (newIndex === recIndex) {\n        return false;\n      }\n\n      var activeID = 'ui-selectmenu-item-' + Math.round(Math.random() * 1000);\n\n      this._focusedOptionLi().find('a').eq(0).attr('id', '');\n\n      if (this._optionLis.eq(newIndex).hasClass('ui-state-disabled')) {\n        // if option at newIndex is disabled, call _moveFocus, incrementing amt by one\n        amt > 0 ? ++amt : --amt;\n\n        this._moveFocus(amt, newIndex);\n      } else {\n        this._optionLis.eq(newIndex).find('a').eq(0).attr('id', activeID).focus();\n      }\n\n      this.list.attr('aria-activedescendant', activeID);\n    },\n    _scrollPage: function _scrollPage(direction) {\n      var numPerPage = Math.floor(this.list.outerHeight() / this._optionLis.first().outerHeight());\n      numPerPage = direction == 'up' ? -numPerPage : numPerPage;\n\n      this._moveFocus(numPerPage);\n    },\n    _setOption: function _setOption(key, value) {\n      this.options[key] = value;\n\n      if (key == 'disabled') {\n        if (value) this.close();\n        this.element.add(this.newelement).add(this.list)[value ? 'addClass' : 'removeClass']('ui-selectmenu-disabled ' + 'ui-state-disabled').attr('aria-disabled', value).attr('tabindex', value ? 1 : 0);\n      }\n    },\n    disable: function disable(index, type) {\n      // if options is not provided, call the parents disable function\n      if (typeof index == 'undefined') {\n        this._setOption('disabled', true);\n      } else {\n        this._toggleEnabled(type || 'option', index, false);\n      }\n    },\n    enable: function enable(index, type) {\n      // if options is not provided, call the parents enable function\n      if (typeof index == 'undefined') {\n        this._setOption('disabled', false);\n      } else {\n        this._toggleEnabled(type || 'option', index, true);\n      }\n    },\n    _disabled: function _disabled(elem) {\n      return $(elem).hasClass('ui-state-disabled');\n    },\n    // true = enabled, false = disabled\n    _toggleEnabled: function _toggleEnabled(type, index, flag) {\n      var element = this.element.find(type).eq(index),\n          elements = type === 'optgroup' ? this.list.find('li.ui-selectmenu-group-' + index) : this._optionLis.eq(index);\n\n      if (elements) {\n        elements.toggleClass('ui-state-disabled', !flag).attr('aria-disabled', !flag);\n\n        if (flag) {\n          element.removeAttr('disabled');\n        } else {\n          element.attr('disabled', 'disabled');\n        }\n      }\n    },\n    index: function index(newIndex) {\n      if (arguments.length) {\n        if (!this._disabled($(this._optionLis[newIndex])) && newIndex != this._selectedIndex()) {\n          this.element[0].selectedIndex = newIndex;\n\n          this._refreshValue();\n\n          this.change();\n        } else {\n          return false;\n        }\n      } else {\n        return this._selectedIndex();\n      }\n    },\n    value: function value(newValue) {\n      if (arguments.length && newValue != this.element[0].value) {\n        this.element[0].value = newValue;\n\n        this._refreshValue();\n\n        this.change();\n      } else {\n        return this.element[0].value;\n      }\n    },\n    _refreshValue: function _refreshValue() {\n      var activeClass = this.options.style == 'popup' ? ' ui-state-active' : '';\n      var activeID = 'ui-selectmenu-item-' + Math.round(Math.random() * 1000); // deselect previous\n\n      this.list.find('.ui-selectmenu-item-selected').removeClass('ui-selectmenu-item-selected' + activeClass).find('a').attr('aria-selected', 'false').attr('id', ''); // select new\n\n      this._selectedOptionLi().addClass('ui-selectmenu-item-selected' + activeClass).find('a').attr('aria-selected', 'true').attr('id', activeID); // toggle any class brought in from option\n\n\n      var currentOptionClasses = this.newelement.data('optionClasses') ? this.newelement.data('optionClasses') : '';\n      var newOptionClasses = this._selectedOptionLi().data('optionClasses') ? this._selectedOptionLi().data('optionClasses') : '';\n      this.newelement.removeClass(currentOptionClasses).data('optionClasses', newOptionClasses).addClass(newOptionClasses).find('.ui-selectmenu-status').html(this._selectedOptionLi().find('a').eq(0).html());\n      this.list.attr('aria-activedescendant', activeID);\n    },\n    _refreshPosition: function _refreshPosition() {\n      var o = this.options,\n          positionDefault = {\n        of: this.newelement,\n        my: 'left top',\n        at: 'left bottom',\n        collision: 'flip'\n      }; // if its a pop-up we need to calculate the position of the selected li\n\n      if (o.style == 'popup') {\n        var selected = this._selectedOptionLi();\n\n        positionDefault.my = 'left top' + (this.list.offset().top - selected.offset().top - (this.newelement.outerHeight() + selected.outerHeight()) / 2);\n        positionDefault.collision = 'fit';\n      }\n\n      this.listWrap.removeAttr('style').css('z-index', this.element.css('z-index') + 2) //.zIndex( this.element.zIndex() + 2 )\n      .position($.extend(positionDefault, o.positionOptions));\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./src/core/ui/jquery.ui.selectmenu.js?");

/***/ }),

/***/ "./src/core/utils/form2object.js":
/*!***************************************!*\
  !*** ./src/core/utils/form2object.js ***!
  \***************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Copyright (c) 2010 Maxim Vasiliev\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n *\r\n * @author Maxim Vasiliev\r\n * Date: 09.09.2010\r\n * Time: 19:02:33\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  /**\r\n   * Returns form values represented as Javascript object\r\n   * \"name\" attribute defines structure of resulting object\r\n   *\r\n   * @param rootNode {Element|String} root form element (or it's id)\r\n   * @param delimiter {String} structure parts delimiter defaults to '.'\r\n   * @param skipEmpty {Boolean} should skip empty text values, defaults to true\r\n   */\n  window.form2object = function (rootNode, delimiter, skipEmpty) {\n    if (typeof skipEmpty == 'undefined' || skipEmpty == null) skipEmpty = true;\n    if (typeof delimiter == 'undefined' || delimiter == null) delimiter = '.';\n    rootNode = typeof rootNode == 'string' ? document.getElementById(rootNode) : rootNode;\n\n    if (rootNode) {}\n\n    var formValues = getFormValues(rootNode);\n    var result = {};\n    var arrays = {};\n\n    for (var i = 0; i < formValues.length; i++) {\n      var value = formValues[i].value;\n      if (skipEmpty && value === '') continue;\n      var name = formValues[i].name;\n\n      if (name) {\n        var nameParts = name.split(delimiter);\n        var currResult = result;\n\n        for (var j = 0; j < nameParts.length; j++) {\n          var namePart = nameParts[j];\n          var arrName;\n\n          if (namePart.indexOf('[]') > -1 && j == nameParts.length - 1) {\n            arrName = namePart.substr(0, namePart.indexOf('['));\n            if (!currResult[arrName]) currResult[arrName] = [];\n            currResult[arrName].push(value);\n          } else {\n            if (namePart.indexOf('[') > -1) {\n              arrName = namePart.substr(0, namePart.indexOf('['));\n              var arrIdx = namePart.replace(/^[a-z]+\\[|\\]$/gi, '');\n              /*\r\n               * Because arrIdx in field name can be not zero-based and step can be\r\n               * other than 1, we can't use them in target array directly.\r\n               * Instead we're making a hash where key is arrIdx and value is a reference to\r\n               * added array element\r\n               */\n\n              if (!arrays[arrName]) arrays[arrName] = {};\n              if (!currResult[arrName]) currResult[arrName] = [];\n\n              if (j == nameParts.length - 1) {\n                currResult[arrName].push(value);\n              } else {\n                if (!arrays[arrName][arrIdx]) {\n                  currResult[arrName].push({});\n                  arrays[arrName][arrIdx] = currResult[arrName][currResult[arrName].length - 1];\n                }\n              }\n\n              currResult = arrays[arrName][arrIdx];\n            } else {\n              if (j < nameParts.length - 1)\n                /* Not the last part of name - means object */\n                {\n                  if (!currResult[namePart]) currResult[namePart] = {};\n                  currResult = currResult[namePart];\n                } else {\n                var checkJSON = function checkJSON(m) {\n                  if (_typeof(m) == 'object') {\n                    try {\n                      m = JSON.stringify(m);\n                    } catch (err) {\n                      return false;\n                    }\n                  }\n\n                  if (typeof m == 'string') {\n                    try {\n                      m = JSON.parse(m);\n                    } catch (err) {\n                      return false;\n                    }\n                  }\n\n                  if (_typeof(m) != 'object') {\n                    return false;\n                  }\n\n                  return true;\n                };\n\n                if (currResult[namePart] && checkJSON(currResult[namePart])) {\n                  currResult[namePart] = Object.assign({}, currResult[namePart], value);\n                } else {\n                  currResult[namePart] = value;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return result;\n  };\n\n  function getFormValues(rootNode) {\n    var result = [],\n        name;\n\n    if (rootNode) {\n      var currentNode = rootNode.firstChild;\n\n      while (currentNode) {\n        if (currentNode.nodeName.match(/INPUT|SELECT|TEXTAREA|HIDDEN/i) || jQuery(currentNode).is('[ruptype=\\'tree\\']')) {\n          var fieldValue = getFieldValue(currentNode);\n\n          if (jQuery(currentNode).is('select') && currentNode.multiple || jQuery(currentNode).is('[ruptype=\\'tree\\']')) {\n            var nameParts = jQuery(currentNode).attr('name').split('.');\n            name = nameParts.length > 1 ? nameParts.slice(0, nameParts.length - 1).join('.') : nameParts[0];\n          } else {\n            name = jQuery(currentNode).attr('name');\n          }\n\n          if (fieldValue !== null) {\n            result.push({\n              name: name,\n              value: fieldValue\n            });\n          }\n        } else {\n          var subresult = getFormValues(currentNode);\n          result = result.concat(subresult);\n        }\n\n        currentNode = currentNode.nextSibling;\n      }\n    }\n\n    return result;\n  }\n\n  function getFieldValue(fieldNode) {\n    var ruptype = jQuery(fieldNode).attr('ruptype');\n\n    if (ruptype) {\n      return jQuery(fieldNode)['rup_' + ruptype]('getRupValue');\n    } else {\n      switch (fieldNode.nodeName) {\n        case 'HIDDEN':\n        case 'INPUT':\n        case 'TEXTAREA':\n          switch (fieldNode.type.toLowerCase()) {\n            case 'radio':\n            case 'checkbox':\n              if (fieldNode.checked) return fieldNode.value;\n              break;\n\n            case 'button':\n            case 'reset':\n            case 'submit':\n            case 'image':\n              return '';\n\n            default:\n              return fieldNode.value;\n          }\n\n          break;\n\n        case 'SELECT':\n          return getSelectedOptionValue(fieldNode);\n\n        default:\n          break;\n      }\n    }\n\n    return null;\n  }\n\n  function getSelectedOptionValue(selectNode) {\n    var multiple = selectNode.multiple;\n    if (!multiple) return selectNode.value;\n    var result = [];\n\n    for (var options = selectNode.getElementsByTagName('option'), i = 0, l = options.length; i < l; i++) {\n      var nameParts = selectNode.name.split('.');\n      nameParts[nameParts.length - 1]; //                        if (options[i].selected) result.push(options[i].value);\n\n      if (options[i].selected) {\n        var jsonObj = {};\n        jsonObj[nameParts[nameParts.length - 1]] = options[i].value;\n        result.push(jsonObj);\n      }\n    }\n\n    return result;\n  }\n  /**\r\n   * @deprecated Use form2object() instead\r\n   * @param rootNode\r\n   * @param delimiter\r\n   */\n\n\n  window.form2json = window.form2object;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/core/utils/form2object.js?");

/***/ }),

/***/ "./src/core/utils/jquery.fileDownload.js":
/*!***********************************************!*\
  !*** ./src/core/utils/jquery.fileDownload.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*\r\n* jQuery File Download Plugin v1.3.3\r\n*\r\n* http://www.johnculviner.com\r\n*\r\n* Copyright (c) 2012 - John Culviner\r\n*\r\n* Licensed under the MIT license:\r\n* http://www.opensource.org/licenses/mit-license.php\r\n*/\nvar $ = jQuery.noConflict();\n$.extend({\n  //\n  //$.fileDownload('/path/to/url/', options)\n  // see directly below for possible 'options'\n  fileDownload: function fileDownload(fileUrl, options) {\n    var defaultFailCallback = function defaultFailCallback(responseHtml, url) {\n      alert(\"A file download error has occurred, please try again.\");\n    }; //provide some reasonable defaults to any unspecified options below\n\n\n    var settings = $.extend({\n      //\n      //Requires jQuery UI: provide a message to display to the user when the file download is being prepared before the browser's dialog appears\n      //\n      preparingMessageHtml: null,\n      //\n      //Requires jQuery UI: provide a message to display to the user when a file download fails\n      //\n      failMessageHtml: null,\n      //\n      //the stock android browser straight up doesn't support file downloads initiated by a non GET: http://code.google.com/p/android/issues/detail?id=1780\n      //specify a message here to display if a user tries with an android browser\n      //if jQuery UI is installed this will be a dialog, otherwise it will be an alert\n      //\n      androidPostUnsupportedMessageHtml: \"Unfortunately your Android browser doesn't support this type of file download. Please try again with a different browser.\",\n      //\n      //Requires jQuery UI: options to pass into jQuery UI Dialog\n      //\n      dialogOptions: {\n        modal: true\n      },\n      //\n      //a function to call after a file download dialog/ribbon has appeared\n      //Args:\n      // url - the original url attempted\n      //\n      successCallback: function successCallback(url) {},\n      //\n      //a function to call after a file download dialog/ribbon has appeared\n      //Args:\n      // responseHtml - the html that came back in response to the file download. this won't necessarily come back depending on the browser.\n      // in less than IE9 a cross domain error occurs because 500+ errors cause a cross domain issue due to IE subbing out the\n      // server's error message with a \"helpful\" IE built in message\n      // url - the original url attempted\n      //\n      failCallback: defaultFailCallback,\n      //\n      // the HTTP method to use. Defaults to \"GET\".\n      //\n      httpMethod: \"GET\",\n      //\n      // if specified will perform a \"httpMethod\" request to the specified 'fileUrl' using the specified data.\n      // data must be an object (which will be $.param serialized) or already a key=value param string\n      //\n      data: null,\n      //\n      //a period in milliseconds to poll to determine if a successful file download has occured or not\n      //\n      checkInterval: 100,\n      //\n      //the cookie name to indicate if a file download has occured\n      //\n      cookieName: \"fileDownload\",\n      //\n      //the cookie value for the above name to indicate that a file download has occured\n      //\n      cookieValue: \"true\",\n      //\n      //the cookie path for above name value pair\n      //\n      cookiePath: \"/\",\n      //\n      //the title for the popup second window as a download is processing in the case of a mobile browser\n      //\n      popupWindowTitle: \"Initiating file download...\",\n      //\n      //Functionality to encode HTML entities for a POST, need this if data is an object with properties whose values contains strings with quotation marks.\n      //HTML entity encoding is done by replacing all &,<,>,',\",\\r,\\n characters.\n      //Note that some browsers will POST the string htmlentity-encoded whilst others will decode it before POSTing.\n      //It is recommended that on the server, htmlentity decoding is done irrespective.\n      //\n      encodeHTMLEntities: true\n    }, options); //Setup mobile browser detection: Partial credit: http://detectmobilebrowser.com/\n\n    var userAgent = (navigator.userAgent || navigator.vendor || window.opera).toLowerCase();\n    var isIos = false; //has full support of features in iOS 4.0+, uses a new window to accomplish this.\n\n    var isAndroid = false; //has full support of GET features in 4.0+ by using a new window. Non-GET is completely unsupported by the browser. See above for specifying a message.\n\n    var isOtherMobileBrowser = false; //there is no way to reliably guess here so all other mobile devices will GET and POST to the current window.\n\n    if (/ip(ad|hone|od)/.test(userAgent)) {\n      isIos = true;\n    } else if (userAgent.indexOf('android') != -1) {\n      isAndroid = true;\n    } else {\n      isOtherMobileBrowser = /avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|playbook|silk|iemobile|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|e\\-|e\\/|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\\-|2|g)|yas\\-|your|zeto|zte\\-/i.test(userAgent.substr(0, 4));\n    }\n\n    var httpMethodUpper = settings.httpMethod.toUpperCase();\n\n    if (isAndroid && httpMethodUpper != \"GET\") {\n      //the stock android browser straight up doesn't support file downloads initiated by non GET requests: http://code.google.com/p/android/issues/detail?id=1780\n      if ($().dialog) {\n        $(\"<div>\").html(settings.androidPostUnsupportedMessageHtml).dialog(settings.dialogOptions);\n      } else {\n        alert(settings.androidPostUnsupportedMessageHtml);\n      }\n\n      return;\n    } //wire up a jquery dialog to display the preparing message if specified\n\n\n    var $preparingDialog = null;\n\n    if (settings.preparingMessageHtml) {\n      $preparingDialog = $(\"<div>\").html(settings.preparingMessageHtml).dialog(settings.dialogOptions);\n    }\n\n    var internalCallbacks = {\n      onSuccess: function onSuccess(url) {\n        //remove the perparing message if it was specified\n        if ($preparingDialog) {\n          $preparingDialog.dialog('close');\n        }\n\n        ;\n        settings.successCallback(url);\n      },\n      onFail: function onFail(responseHtml, url) {\n        //remove the perparing message if it was specified\n        if ($preparingDialog) {\n          $preparingDialog.dialog('close');\n        }\n\n        ; //wire up a jquery dialog to display the fail message if specified\n\n        if (settings.failMessageHtml) {\n          $(\"<div>\").html(settings.failMessageHtml).dialog(settings.dialogOptions); //only run the fallcallback if the developer specified something different than default\n          //otherwise we would see two messages about how the file download failed\n\n          if (settings.failCallback != defaultFailCallback) {\n            settings.failCallback(responseHtml, url);\n          }\n        } else {\n          settings.failCallback(responseHtml, url);\n        }\n      }\n    }; //make settings.data a param string if it exists and isn't already\n\n    if (settings.data !== null && typeof settings.data !== \"string\") {\n      settings.data = $.param(settings.data);\n    }\n\n    var $iframe, downloadWindow, formDoc, $form;\n\n    if (httpMethodUpper === \"GET\") {\n      if (settings.data !== null) {\n        //need to merge any fileUrl params with the data object\n        var qsStart = fileUrl.indexOf('?');\n\n        if (qsStart != -1) {\n          //we have a querystring in the url\n          if (fileUrl.substring(fileUrl.length - 1) !== \"&\") {\n            fileUrl = fileUrl + \"&\";\n          }\n        } else {\n          fileUrl = fileUrl + \"?\";\n        }\n\n        fileUrl = fileUrl + settings.data;\n      }\n\n      if (isIos || isAndroid) {\n        downloadWindow = window.open(fileUrl);\n        downloadWindow.document.title = settings.popupWindowTitle;\n        window.focus();\n      } else if (isOtherMobileBrowser) {\n        window.location(fileUrl);\n      } else {\n        //create a temporary iframe that is used to request the fileUrl as a GET request\n        $iframe = $(\"<iframe>\").hide().attr(\"src\", fileUrl).appendTo(\"body\");\n      }\n    } else {\n      var formInnerHtml = \"\";\n\n      if (settings.data !== null) {\n        $.each(settings.data.replace(/\\+/g, ' ').split(\"&\"), function () {\n          var kvp = this.split(\"=\");\n          var key = settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[0])) : decodeURIComponent(kvp[0]);\n          if (!key) return;\n          var value = kvp[1] || '';\n          value = settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[1])) : decodeURIComponent(kvp[1]);\n          formInnerHtml += '<input type=\"hidden\" name=\"' + key + '\" value=\"' + value + '\" />';\n        });\n      }\n\n      if (isOtherMobileBrowser) {\n        $form = $(\"<form></form>\").appendTo(\"body\");\n        $form.hide().attr('method', settings.httpMethod).attr('action', fileUrl).html(formInnerHtml);\n      } else {\n        if (isIos) {\n          downloadWindow = window.open(\"about:blank\");\n          downloadWindow.document.title = settings.popupWindowTitle;\n          formDoc = downloadWindow.document;\n          window.focus();\n        } else {\n          $iframe = $(\"<iframe style='display: none' src='about:blank'></iframe>\").appendTo(\"body\");\n          formDoc = getiframeDocument($iframe);\n        }\n\n        formDoc.write(\"<html><head></head><body><form method='\" + settings.httpMethod + \"' action='\" + fileUrl + \"'>\" + formInnerHtml + \"</form>\" + settings.popupWindowTitle + \"</body></html>\");\n        $form = $(formDoc).find('form');\n      }\n\n      $form.submit();\n    } //check if the file download has completed every checkInterval ms\n\n\n    setTimeout(checkFileDownloadComplete, settings.checkInterval);\n\n    function checkFileDownloadComplete() {\n      //has the cookie been written due to a file download occuring?\n      if (document.cookie.indexOf(settings.cookieName + \"=\" + settings.cookieValue) != -1) {\n        //execute specified callback\n        internalCallbacks.onSuccess(fileUrl); //remove the cookie and iframe\n\n        var date = new Date(1000);\n        document.cookie = settings.cookieName + \"=; expires=\" + date.toUTCString() + \"; path=\" + settings.cookiePath;\n        cleanUp(false);\n        return;\n      } //has an error occured?\n      //if neither containers exist below then the file download is occuring on the current window\n\n\n      if (downloadWindow || $iframe) {\n        //has an error occured?\n        try {\n          var formDoc;\n\n          if (downloadWindow) {\n            formDoc = downloadWindow.document;\n          } else {\n            formDoc = getiframeDocument($iframe);\n          }\n\n          if (formDoc && formDoc.body != null && formDoc.body.innerHTML.length > 0) {\n            var isFailure = true;\n\n            if ($form && $form.length > 0) {\n              var $contents = $(formDoc.body).contents().first();\n\n              if ($contents.length > 0 && $contents[0] === $form[0]) {\n                isFailure = false;\n              }\n            }\n\n            if (isFailure) {\n              internalCallbacks.onFail(formDoc.body.innerHTML, fileUrl);\n              cleanUp(true);\n              return;\n            }\n          }\n        } catch (err) {\n          //500 error less than IE9\n          internalCallbacks.onFail('', fileUrl);\n          cleanUp(true);\n          return;\n        }\n      } //keep checking...\n\n\n      setTimeout(checkFileDownloadComplete, settings.checkInterval);\n    } //gets an iframes document in a cross browser compatible manner\n\n\n    function getiframeDocument($iframe) {\n      var iframeDoc = $iframe[0].contentWindow || $iframe[0].contentDocument;\n\n      if (iframeDoc.document) {\n        iframeDoc = iframeDoc.document;\n      }\n\n      return iframeDoc;\n    }\n\n    function cleanUp(isFailure) {\n      setTimeout(function () {\n        if (downloadWindow) {\n          if (isAndroid) {\n            downloadWindow.close();\n          }\n\n          if (isIos) {\n            if (isFailure) {\n              downloadWindow.focus(); //ios safari bug doesn't allow a window to be closed unless it is focused\n\n              downloadWindow.close();\n            } else {\n              downloadWindow.focus();\n            }\n          }\n        }\n      }, 0);\n    }\n\n    function htmlSpecialCharsEntityEncode(str) {\n      return str.replace(/&/gm, '&amp;').replace(/\\n/gm, \"&#10;\").replace(/\\r/gm, \"&#13;\").replace(/</gm, '&lt;').replace(/>/gm, '&gt;').replace(/\"/gm, '&quot;').replace(/'/gm, '&apos;'); //single quotes just to be safe\n    }\n  }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/core/utils/jquery.fileDownload.js?");

/***/ }),

/***/ "./src/core/utils/jquery.form.js":
/*!***************************************!*\
  !*** ./src/core/utils/jquery.form.js ***!
  \***************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\r\n * jQuery Form Plugin\r\n * version: 4.2.2\r\n * Requires jQuery v1.7.2 or later\r\n * Project repository: https://github.com/jquery-form/form\r\n * Copyright 2017 Kevin Morris\r\n * Copyright 2006 M. Alsup\r\n * Dual licensed under the LGPL-2.1+ or MIT licenses\r\n * https://github.com/jquery-form/form#license\r\n * This library is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU Lesser General Public\r\n * License as published by the Free Software Foundation; either\r\n * version 2.1 of the License, or (at your option) any later version.\r\n * This library is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n * Lesser General Public License for more details.\r\n */\n\n/* global ActiveXObject */\n\n/* eslint-disable */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  /* eslint-enable */\n  'use strict';\n  /*\r\n  \tUsage Note:\r\n  \t-----------\r\n  \tDo not use both ajaxSubmit and ajaxForm on the same form. These\r\n  \tfunctions are mutually exclusive. Use ajaxSubmit if you want\r\n  \tto bind your own submit handler to the form. For example,\r\n  \t$(document).ready(function() {\r\n  \t\t$('#myForm').on('submit', function(e) {\r\n  \t\t\te.preventDefault(); // <-- important\r\n  \t\t\t$(this).ajaxSubmit({\r\n  \t\t\t\ttarget: '#output'\r\n  \t\t\t});\r\n  \t\t});\r\n  \t});\r\n  \tUse ajaxForm when you want the plugin to manage all the event binding\r\n  \tfor you. For example,\r\n  \t$(document).ready(function() {\r\n  \t\t$('#myForm').ajaxForm({\r\n  \t\t\ttarget: '#output'\r\n  \t\t});\r\n  \t});\r\n  \tYou can also use ajaxForm with delegation (requires jQuery v1.7+), so the\r\n  \tform does not have to exist when you invoke ajaxForm:\r\n  \t$('#myForm').ajaxForm({\r\n  \t\tdelegation: true,\r\n  \t\ttarget: '#output'\r\n  \t});\r\n  \tWhen using ajaxForm, the ajaxSubmit function will be invoked for you\r\n  \tat the appropriate time.\r\n  */\n\n  var rCRLF = /\\r?\\n/g;\n  /**\r\n   * Feature detection\r\n   */\n\n  var feature = {};\n  feature.fileapi = $('<input type=\"file\">').get(0).files !== undefined;\n  feature.formdata = typeof window.FormData !== 'undefined';\n  var hasProp = !!$.fn.prop; // attr2 uses prop when it can but checks the return type for\n  // an expected string. This accounts for the case where a form\n  // contains inputs with names like \"action\" or \"method\"; in those\n  // cases \"prop\" returns the element\n\n  $.fn.attr2 = function () {\n    if (!hasProp) {\n      return this.attr.apply(this, arguments);\n    }\n\n    var val = this.prop.apply(this, arguments);\n\n    if (val && val.jquery || typeof val === 'string') {\n      return val;\n    }\n\n    return this.attr.apply(this, arguments);\n  };\n  /**\r\n   * ajaxSubmit() provides a mechanism for immediately submitting\r\n   * an HTML form using AJAX.\r\n   *\r\n   * @param\t{object|string}\toptions\t\tjquery.form.js parameters or custom url for submission\r\n   * @param\t{object}\t\tdata\t\textraData\r\n   * @param\t{string}\t\tdataType\tajax dataType\r\n   * @param\t{function}\t\tonSuccess\tajax success callback function\r\n   */\n\n\n  $.fn.ajaxSubmit = function (options, data, dataType, onSuccess) {\n    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)\n    if (!this.length) {\n      log('ajaxSubmit: skipping submit process - no element selected');\n      return this;\n    }\n    /* eslint consistent-this: [\"error\", \"$form\"] */\n\n\n    var method,\n        action,\n        url,\n        $form = this;\n\n    if (typeof options === 'function') {\n      options = {\n        success: options\n      };\n    } else if (typeof options === 'string' || options === false && arguments.length > 0) {\n      options = {\n        'url': options,\n        'data': data,\n        'dataType': dataType\n      };\n\n      if (typeof onSuccess === 'function') {\n        options.success = onSuccess;\n      }\n    } else if (typeof options === 'undefined') {\n      options = {};\n    }\n\n    method = options.method || options.type || this.attr2('method');\n    action = options.url || this.attr2('action');\n    url = typeof action === 'string' ? action.trim() : '';\n    url = url || window.location.href || '';\n\n    if (url) {\n      // clean url (don't include hash vaue)\n      url = (url.match(/^([^#]+)/) || [])[1];\n    }\n\n    options = $.extend(true, {\n      url: url,\n      success: $.ajaxSettings.success,\n      type: method || $.ajaxSettings.type,\n      iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' // eslint-disable-line no-script-url\n\n    }, options); // hook for manipulating the form data before it is extracted;\n    // convenient for use with rich editors like tinyMCE or FCKEditor\n\n    var veto = {};\n    this.trigger('form-pre-serialize', [this, options, veto]);\n\n    if (veto.veto) {\n      log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');\n      return this;\n    } // provide opportunity to alter form data before it is serialized\n\n\n    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {\n      log('ajaxSubmit: submit aborted via beforeSerialize callback');\n      return this;\n    }\n\n    var traditional = options.traditional;\n\n    if (typeof traditional === 'undefined') {\n      traditional = $.ajaxSettings.traditional;\n    }\n\n    var elements = [];\n    var qx,\n        a = this.formToArray(options.semantic, elements, options.filtering);\n\n    if (options.data) {\n      var optionsData = typeof options.data === \"function\" ? options.data(a) : options.data;\n      options.extraData = optionsData;\n      qx = $.param(optionsData, traditional);\n    } // give pre-submit callback an opportunity to abort the submit\n\n\n    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {\n      log('ajaxSubmit: submit aborted via beforeSubmit callback');\n      return this;\n    } // fire vetoable 'validate' event\n\n\n    this.trigger('form-submit-validate', [a, this, options, veto]);\n\n    if (veto.veto) {\n      log('ajaxSubmit: submit vetoed via form-submit-validate trigger');\n      return this;\n    }\n\n    var q = $.param(a, traditional);\n\n    if (qx) {\n      q = q ? q + '&' + qx : qx;\n    }\n\n    if (options.type.toUpperCase() === 'GET') {\n      options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;\n      options.data = null; // data is null for 'get'\n    } else {\n      options.data = q; // data is the query string for 'post'\n    }\n\n    var callbacks = [];\n\n    if (options.resetForm) {\n      callbacks.push(function () {\n        $form.resetForm();\n      });\n    }\n\n    if (options.clearForm) {\n      callbacks.push(function () {\n        $form.clearForm(options.includeHidden);\n      });\n    } // perform a load on the target only if dataType is not provided\n\n\n    if (!options.dataType && options.target) {\n      var oldSuccess = options.success || function () {};\n\n      callbacks.push(function (data, textStatus, jqXHR) {\n        var successArguments = arguments,\n            fn = options.replaceTarget ? 'replaceWith' : 'html';\n        $(options.target)[fn](data).each(function () {\n          oldSuccess.apply(this, successArguments);\n        });\n      });\n    } else if (options.success) {\n      if (Array.isArray(options.success)) {\n        $.merge(callbacks, options.success);\n      } else {\n        callbacks.push(options.success);\n      }\n    }\n\n    options.success = function (data, status, xhr) {\n      // jQuery 1.4+ passes xhr as 3rd arg\n      var context = options.context || this; // jQuery 1.4+ supports scope context\n\n      for (var i = 0, max = callbacks.length; i < max; i++) {\n        callbacks[i].apply(context, [data, status, xhr || $form, $form]);\n      }\n    };\n\n    if (options.error) {\n      var oldError = options.error;\n\n      options.error = function (xhr, status, error) {\n        var context = options.context || this;\n        oldError.apply(context, [xhr, status, error, $form]);\n      };\n    }\n\n    if (options.complete) {\n      var oldComplete = options.complete;\n\n      options.complete = function (xhr, status) {\n        var context = options.context || this;\n        oldComplete.apply(context, [xhr, status, $form]);\n      };\n    } // are there files to upload?\n    // [value] (issue #113), also see comment:\n    // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219\n\n\n    var fileInputs = $('input[type=file]:enabled', this);\n    var hasFileInputs = fileInputs.length > 0;\n    var mp = 'multipart/form-data';\n    var multipart = $form.attr('enctype') === mp || $form.attr('encoding') === mp;\n    var fileAPI = feature.fileapi && feature.formdata;\n    log('fileAPI :' + fileAPI);\n    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;\n    var jqxhr; // options.iframe allows user to force iframe mode\n    // 06-NOV-09: now defaulting to iframe mode if file input is detected\n\n    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {\n      // hack to fix Safari hang (thanks to Tim Molendijk for this)\n      // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d\n      if (options.closeKeepAlive) {\n        $.get(options.closeKeepAlive, function () {\n          jqxhr = fileUploadIframe(a);\n        });\n      } else {\n        jqxhr = fileUploadIframe(a);\n      }\n    } else if ((hasFileInputs || multipart) && fileAPI) {\n      jqxhr = fileUploadXhr(a);\n    } else {\n      jqxhr = $.ajax(options);\n    }\n\n    $form.removeData('jqxhr').data('jqxhr', jqxhr); // clear element array\n\n    for (var k = 0; k < elements.length; k++) {\n      elements[k] = null;\n    } // fire 'notify' event\n\n\n    this.trigger('form-submit-notify', [this, options]);\n    return this; // utility fn for deep serialization\n\n    function deepSerialize(extraData) {\n      var serialized = $.param(extraData, options.traditional).split('&');\n      var len = serialized.length;\n      var result = [];\n      var i, part;\n\n      for (i = 0; i < len; i++) {\n        // #252; undo param space replacement\n        serialized[i] = serialized[i].replace(/\\+/g, ' ');\n        part = serialized[i].split('='); // #278; use array instead of object storage, favoring array serializations\n\n        result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);\n      }\n\n      return result;\n    } // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)\n\n\n    function fileUploadXhr(a) {\n      var formdata = new FormData();\n\n      for (var i = 0; i < a.length; i++) {\n        formdata.append(a[i].name, a[i].value);\n      }\n\n      if (options.extraData) {\n        var serializedData = deepSerialize(options.extraData);\n\n        for (i = 0; i < serializedData.length; i++) {\n          if (serializedData[i]) {\n            formdata.append(serializedData[i][0], serializedData[i][1]);\n          }\n        }\n      }\n\n      options.data = null;\n      var s = $.extend(true, {}, $.ajaxSettings, options, {\n        contentType: false,\n        processData: false,\n        cache: false,\n        type: method || 'POST'\n      });\n\n      if (options.uploadProgress) {\n        // workaround because jqXHR does not expose upload property\n        s.xhr = function () {\n          var xhr = $.ajaxSettings.xhr();\n\n          if (xhr.upload) {\n            xhr.upload.addEventListener('progress', function (event) {\n              var percent = 0;\n              var position = event.loaded || event.position;\n              /* event.position is deprecated */\n\n              var total = event.total;\n\n              if (event.lengthComputable) {\n                percent = Math.ceil(position / total * 100);\n              }\n\n              options.uploadProgress(event, position, total, percent);\n            }, false);\n          }\n\n          return xhr;\n        };\n      }\n\n      s.data = null;\n      var beforeSend = s.beforeSend;\n\n      s.beforeSend = function (xhr, o) {\n        // Send FormData() provided by user\n        if (options.formData) {\n          o.data = options.formData;\n        } else {\n          o.data = formdata;\n        }\n\n        if (beforeSend) {\n          beforeSend.call(this, xhr, o);\n        }\n      };\n\n      return $.ajax(s);\n    } // private function for handling file uploads (hat tip to YAHOO!)\n\n\n    function fileUploadIframe(a) {\n      var form = $form[0],\n          el,\n          i,\n          s,\n          g,\n          id,\n          $io,\n          io,\n          xhr,\n          sub,\n          n,\n          timedOut,\n          timeoutHandle;\n      var deferred = $.Deferred(); // #341\n\n      deferred.abort = function (status) {\n        xhr.abort(status);\n      };\n\n      if (a) {\n        // ensure that every serialized input is still enabled\n        for (i = 0; i < elements.length; i++) {\n          el = $(elements[i]);\n\n          if (hasProp) {\n            el.prop('disabled', false);\n          } else {\n            el.removeAttr('disabled');\n          }\n        }\n      }\n\n      s = $.extend(true, {}, $.ajaxSettings, options);\n      s.context = s.context || s;\n      id = 'jqFormIO' + new Date().getTime();\n      var ownerDocument = form.ownerDocument;\n      var $body = $form.closest('body');\n\n      if (s.iframeTarget) {\n        $io = $(s.iframeTarget, ownerDocument);\n        n = $io.attr2('name');\n\n        if (!n) {\n          $io.attr2('name', id);\n        } else {\n          id = n;\n        }\n      } else {\n        $io = $('<iframe name=\"' + id + '\" src=\"' + s.iframeSrc + '\" ></iframe>', ownerDocument);\n        $io.css({\n          position: 'absolute',\n          top: '-1000px',\n          left: '-1000px'\n        });\n      }\n\n      io = $io[0];\n      xhr = {\n        // mock object\n        aborted: 0,\n        responseText: null,\n        responseXML: null,\n        status: 0,\n        statusText: 'n/a',\n        getAllResponseHeaders: function getAllResponseHeaders() {},\n        getResponseHeader: function getResponseHeader() {},\n        setRequestHeader: function setRequestHeader() {},\n        abort: function abort(status) {\n          var e = status === 'timeout' ? 'timeout' : 'aborted';\n          log('aborting upload... ' + e);\n          this.aborted = 1;\n\n          try {\n            // #214, #257\n            if (io.contentWindow.document.execCommand) {\n              io.contentWindow.document.execCommand('Stop');\n            }\n          } catch (ignore) {}\n\n          $io.attr('src', s.iframeSrc); // abort op in progress\n\n          xhr.error = e;\n\n          if (s.error) {\n            s.error.call(s.context, xhr, e, status);\n          }\n\n          if (g) {\n            $.event.trigger('ajaxError', [xhr, s, e]);\n          }\n\n          if (s.complete) {\n            s.complete.call(s.context, xhr, e);\n          }\n        }\n      };\n      g = s.global; // trigger ajax global events so that activity/block indicators work like normal\n\n      if (g && $.active++ === 0) {\n        $.event.trigger('ajaxStart');\n      }\n\n      if (g) {\n        $.event.trigger('ajaxSend', [xhr, s]);\n      }\n\n      if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {\n        if (s.global) {\n          $.active--;\n        }\n\n        deferred.reject();\n        return deferred;\n      }\n\n      if (xhr.aborted) {\n        deferred.reject();\n        return deferred;\n      } // add submitting element to data if we know it\n\n\n      sub = form.clk;\n\n      if (sub) {\n        n = sub.name;\n\n        if (n && !sub.disabled) {\n          s.extraData = s.extraData || {};\n          s.extraData[n] = sub.value;\n\n          if (sub.type === 'image') {\n            s.extraData[n + '.x'] = form.clk_x;\n            s.extraData[n + '.y'] = form.clk_y;\n          }\n        }\n      }\n\n      var CLIENT_TIMEOUT_ABORT = 1;\n      var SERVER_ABORT = 2;\n\n      function getDoc(frame) {\n        /* it looks like contentWindow or contentDocument do not\r\n         * carry the protocol property in ie8, when running under ssl\r\n         * frame.document is the only valid response document, since\r\n         * the protocol is know but not on the other two objects. strange?\r\n         * \"Same origin policy\" http://en.wikipedia.org/wiki/Same_origin_policy\r\n         */\n        var doc = null; // IE8 cascading access check\n\n        try {\n          if (frame.contentWindow) {\n            doc = frame.contentWindow.document;\n          }\n        } catch (err) {\n          // IE8 access denied under ssl & missing protocol\n          log('cannot get iframe.contentWindow document: ' + err);\n        }\n\n        if (doc) {\n          // successful getting content\n          return doc;\n        }\n\n        try {\n          // simply checking may throw in ie8 under ssl or mismatched protocol\n          doc = frame.contentDocument ? frame.contentDocument : frame.document;\n        } catch (err) {\n          // last attempt\n          log('cannot get iframe.contentDocument: ' + err);\n          doc = frame.document;\n        }\n\n        return doc;\n      } // Rails CSRF hack (thanks to Yvan Barthelemy)\n\n\n      var csrf_token = $('meta[name=csrf-token]').attr('content');\n      var csrf_param = $('meta[name=csrf-param]').attr('content');\n\n      if (csrf_param && csrf_token) {\n        s.extraData = s.extraData || {};\n        s.extraData[csrf_param] = csrf_token;\n      } // take a breath so that pending repaints get some cpu time before the upload starts\n\n\n      function doSubmit() {\n        // make sure form attrs are set\n        var t = $form.attr2('target'),\n            a = $form.attr2('action'),\n            mp = 'multipart/form-data',\n            et = $form.attr('enctype') || $form.attr('encoding') || mp; // update form attrs in IE friendly way\n\n        form.setAttribute('target', id);\n\n        if (!method || /post/i.test(method)) {\n          form.setAttribute('method', 'POST');\n        }\n\n        if (a !== s.url) {\n          form.setAttribute('action', s.url);\n        } // ie borks in some cases when setting encoding\n\n\n        if (!s.skipEncodingOverride && (!method || /post/i.test(method))) {\n          $form.attr({\n            encoding: 'multipart/form-data',\n            enctype: 'multipart/form-data'\n          });\n        } // support timout\n\n\n        if (s.timeout) {\n          timeoutHandle = setTimeout(function () {\n            timedOut = true;\n            cb(CLIENT_TIMEOUT_ABORT);\n          }, s.timeout);\n        } // look for server aborts\n\n\n        function checkState() {\n          try {\n            var state = getDoc(io).readyState;\n            log('state = ' + state);\n\n            if (state && state.toLowerCase() === 'uninitialized') {\n              setTimeout(checkState, 50);\n            }\n          } catch (e) {\n            log('Server abort: ', e, ' (', e.name, ')');\n            cb(SERVER_ABORT); // eslint-disable-line callback-return\n\n            if (timeoutHandle) {\n              clearTimeout(timeoutHandle);\n            }\n\n            timeoutHandle = undefined;\n          }\n        } // add \"extra\" data to form if provided in options\n\n\n        var extraInputs = [];\n\n        try {\n          if (s.extraData) {\n            for (var n in s.extraData) {\n              if (s.extraData.hasOwnProperty(n)) {\n                // if using the $.param format that allows for multiple values with the same name\n                if ($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {\n                  extraInputs.push($('<input type=\"hidden\" name=\"' + s.extraData[n].name + '\">', ownerDocument).val(s.extraData[n].value).appendTo(form)[0]);\n                } else {\n                  extraInputs.push($('<input type=\"hidden\" name=\"' + n + '\">', ownerDocument).val(s.extraData[n]).appendTo(form)[0]);\n                }\n              }\n            }\n          }\n\n          if (!s.iframeTarget) {\n            // add iframe to doc and submit the form\n            $io.appendTo($body);\n          }\n\n          if (io.attachEvent) {\n            io.attachEvent('onload', cb);\n          } else {\n            io.addEventListener('load', cb, false);\n          }\n\n          setTimeout(checkState, 15);\n\n          try {\n            form.submit();\n          } catch (err) {\n            // just in case form has element with name/id of 'submit'\n            var submitFn = document.createElement('form').submit;\n            submitFn.apply(form);\n          }\n        } finally {\n          // reset attrs and remove \"extra\" input elements\n          form.setAttribute('action', a);\n          form.setAttribute('enctype', et); // #380\n\n          if (t) {\n            form.setAttribute('target', t);\n          } else {\n            $form.removeAttr('target');\n          }\n\n          $(extraInputs).remove();\n        }\n      }\n\n      if (s.forceSync) {\n        doSubmit();\n      } else {\n        setTimeout(doSubmit, 10); // this lets dom updates render\n      }\n\n      var data,\n          doc,\n          domCheckCount = 50,\n          callbackProcessed;\n\n      function cb(e) {\n        if (xhr.aborted || callbackProcessed) {\n          return;\n        }\n\n        doc = getDoc(io);\n\n        if (!doc) {\n          log('cannot access response document');\n          e = SERVER_ABORT;\n        }\n\n        if (e === CLIENT_TIMEOUT_ABORT && xhr) {\n          xhr.abort('timeout');\n          deferred.reject(xhr, 'timeout');\n          return;\n        } else if (e === SERVER_ABORT && xhr) {\n          xhr.abort('server abort');\n          deferred.reject(xhr, 'error', 'server abort');\n          return;\n        }\n\n        if (!doc || doc.location.href === s.iframeSrc) {\n          // response not received yet\n          if (!timedOut) {\n            return;\n          }\n        }\n\n        if (io.detachEvent) {\n          io.detachEvent('onload', cb);\n        } else {\n          io.removeEventListener('load', cb, false);\n        }\n\n        var status = 'success',\n            errMsg;\n\n        try {\n          if (timedOut) {\n            throw 'timeout';\n          }\n\n          var isXml = s.dataType === 'xml' || doc.XMLDocument || $.isXMLDoc(doc);\n          log('isXml=' + isXml);\n\n          if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {\n            if (--domCheckCount) {\n              // in some browsers (Opera) the iframe DOM is not always traversable when\n              // the onload callback fires, so we loop a bit to accommodate\n              log('requeing onLoad callback, DOM not available');\n              setTimeout(cb, 250);\n              return;\n            } // let this fall through because server response could be an empty document\n            // log('Could not access iframe DOM after mutiple tries.');\n            // throw 'DOMException: not available';\n\n          } // log('response detected');\n\n\n          var docRoot = doc.body ? doc.body : doc.documentElement;\n          xhr.responseText = docRoot ? docRoot.innerHTML : null;\n          xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;\n\n          if (isXml) {\n            s.dataType = 'xml';\n          }\n\n          xhr.getResponseHeader = function (header) {\n            var headers = {\n              'content-type': s.dataType\n            };\n            return headers[header.toLowerCase()];\n          }; // support for XHR 'status' & 'statusText' emulation :\n\n\n          if (docRoot) {\n            xhr.status = Number(docRoot.getAttribute('status')) || xhr.status;\n            xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;\n          }\n\n          var dt = (s.dataType || '').toLowerCase();\n          var scr = /(json|script|text)/.test(dt);\n\n          if (scr || s.textarea) {\n            // see if user embedded response in textarea\n            var ta = doc.getElementsByTagName('textarea')[0];\n\n            if (ta) {\n              xhr.responseText = ta.value; // support for XHR 'status' & 'statusText' emulation :\n\n              xhr.status = Number(ta.getAttribute('status')) || xhr.status;\n              xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;\n            } else if (scr) {\n              // account for browsers injecting pre around json response\n              var pre = doc.getElementsByTagName('pre')[0];\n              var b = doc.getElementsByTagName('body')[0];\n\n              if (pre) {\n                xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;\n              } else if (b) {\n                xhr.responseText = b.textContent ? b.textContent : b.innerText;\n              }\n            }\n          } else if (dt === 'xml' && !xhr.responseXML && xhr.responseText) {\n            xhr.responseXML = toXml(xhr.responseText); // eslint-disable-line no-use-before-define\n          }\n\n          try {\n            data = httpData(xhr, dt, s); // eslint-disable-line no-use-before-define\n          } catch (err) {\n            status = 'parsererror';\n            xhr.error = errMsg = err || status;\n          }\n        } catch (err) {\n          log('error caught: ', err);\n          status = 'error';\n          xhr.error = errMsg = err || status;\n        }\n\n        if (xhr.aborted) {\n          log('upload aborted');\n          status = null;\n        }\n\n        if (xhr.status) {\n          // we've set xhr.status\n          status = xhr.status >= 200 && xhr.status < 300 || xhr.status === 304 ? 'success' : 'error';\n        } // ordering of these callbacks/triggers is odd, but that's how $.ajax does it\n\n\n        if (status === 'success') {\n          if (s.success) {\n            s.success.call(s.context, data, 'success', xhr);\n          }\n\n          deferred.resolve(xhr.responseText, 'success', xhr);\n\n          if (g) {\n            $.event.trigger('ajaxSuccess', [xhr, s]);\n          }\n        } else if (status) {\n          if (typeof errMsg === 'undefined') {\n            errMsg = xhr.statusText;\n          }\n\n          if (s.error) {\n            s.error.call(s.context, xhr, status, errMsg);\n          }\n\n          deferred.reject(xhr, 'error', errMsg);\n\n          if (g) {\n            $.event.trigger('ajaxError', [xhr, s, errMsg]);\n          }\n        }\n\n        if (g) {\n          $.event.trigger('ajaxComplete', [xhr, s]);\n        }\n\n        if (g && ! --$.active) {\n          $.event.trigger('ajaxStop');\n        }\n\n        if (s.complete) {\n          s.complete.call(s.context, xhr, status);\n        }\n\n        callbackProcessed = true;\n\n        if (s.timeout) {\n          clearTimeout(timeoutHandle);\n        } // clean up\n\n\n        setTimeout(function () {\n          if (!s.iframeTarget) {\n            $io.remove();\n          } else {\n            // adding else to clean up existing iframe response.\n            $io.attr('src', s.iframeSrc);\n          }\n\n          xhr.responseXML = null;\n        }, 100);\n      }\n\n      var toXml = $.parseXML || function (s, doc) {\n        // use parseXML if available (jQuery 1.5+)\n        if (window.ActiveXObject) {\n          doc = new ActiveXObject('Microsoft.XMLDOM');\n          doc.async = 'false';\n          doc.loadXML(s);\n        } else {\n          doc = new DOMParser().parseFromString(s, 'text/xml');\n        }\n\n        return doc && doc.documentElement && doc.documentElement.nodeName !== 'parsererror' ? doc : null;\n      };\n\n      var parseJSON = $.parseJSON || function (s) {\n        /* jslint evil:true */\n        return window['eval']('(' + s + ')'); // eslint-disable-line dot-notation\n      };\n\n      var httpData = function httpData(xhr, type, s) {\n        // mostly lifted from jq1.4.4\n        var ct = xhr.getResponseHeader('content-type') || '',\n            xml = (type === 'xml' || !type) && ct.indexOf('xml') >= 0,\n            data = xml ? xhr.responseXML : xhr.responseText;\n\n        if (xml && data.documentElement.nodeName === 'parsererror') {\n          if ($.error) {\n            $.error('parsererror');\n          }\n        }\n\n        if (s && s.dataFilter) {\n          data = s.dataFilter(data, type);\n        }\n\n        if (typeof data === 'string') {\n          if ((type === 'json' || !type) && ct.indexOf('json') >= 0) {\n            data = parseJSON(data);\n          } else if ((type === 'script' || !type) && ct.indexOf('javascript') >= 0) {\n            $.globalEval(data);\n          }\n        }\n\n        return data;\n      };\n\n      return deferred;\n    }\n  };\n  /**\r\n   * ajaxForm() provides a mechanism for fully automating form submission.\r\n   *\r\n   * The advantages of using this method instead of ajaxSubmit() are:\r\n   *\r\n   * 1: This method will include coordinates for <input type=\"image\"> elements (if the element\r\n   *\tis used to submit the form).\r\n   * 2. This method will include the submit element's name/value data (for the element that was\r\n   *\tused to submit the form).\r\n   * 3. This method binds the submit() method to the form for you.\r\n   *\r\n   * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely\r\n   * passes the options argument along after properly binding events for submit elements and\r\n   * the form itself.\r\n   */\n\n\n  $.fn.ajaxForm = function (options, data, dataType, onSuccess) {\n    if (typeof options === 'string' || options === false && arguments.length > 0) {\n      options = {\n        'url': options,\n        'data': data,\n        'dataType': dataType\n      };\n\n      if (typeof onSuccess === 'function') {\n        options.success = onSuccess;\n      }\n    }\n\n    options = options || {};\n    options.delegation = options.delegation && typeof $.fn.on === \"function\"; // in jQuery 1.3+ we can fix mistakes with the ready state\n\n    if (!options.delegation && this.length === 0) {\n      var o = {\n        s: this.selector,\n        c: this.context\n      };\n\n      if (!$.isReady && o.s) {\n        log('DOM not ready, queuing ajaxForm');\n        $(function () {\n          $(o.s, o.c).ajaxForm(options);\n        });\n        return this;\n      } // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()\n\n\n      log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));\n      return this;\n    }\n\n    if (options.delegation) {\n      $(document).off('submit.form-plugin', this.selector, doAjaxSubmit).off('click.form-plugin', this.selector, captureSubmittingElement).on('submit.form-plugin', this.selector, options, doAjaxSubmit).on('click.form-plugin', this.selector, options, captureSubmittingElement);\n      return this;\n    }\n\n    return this.ajaxFormUnbind().on('submit.form-plugin', options, doAjaxSubmit).on('click.form-plugin', options, captureSubmittingElement);\n  }; // private event handlers\n\n\n  function doAjaxSubmit(e) {\n    /* jshint validthis:true */\n    var options = e.data;\n\n    if (!e.isDefaultPrevented()) {\n      // if event has been canceled, don't proceed\n      e.preventDefault();\n      $(e.target).closest('form').ajaxSubmit(options); // #365\n    }\n  }\n\n  function captureSubmittingElement(e) {\n    /* jshint validthis:true */\n    var target = e.target;\n    var $el = $(target);\n\n    if (!$el.is('[type=submit],[type=image]')) {\n      // is this a child element of the submit el?  (ex: a span within a button)\n      var t = $el.closest('[type=submit]');\n\n      if (t.length === 0) {\n        return;\n      }\n\n      target = t[0];\n    }\n\n    var form = target.form;\n    form.clk = target;\n\n    if (target.type === 'image') {\n      if (typeof e.offsetX !== 'undefined') {\n        form.clk_x = e.offsetX;\n        form.clk_y = e.offsetY;\n      } else if (typeof $.fn.offset === 'function') {\n        var offset = $el.offset();\n        form.clk_x = e.pageX - offset.left;\n        form.clk_y = e.pageY - offset.top;\n      } else {\n        form.clk_x = e.pageX - target.offsetLeft;\n        form.clk_y = e.pageY - target.offsetTop;\n      }\n    } // clear form vars\n\n\n    setTimeout(function () {\n      form.clk = form.clk_x = form.clk_y = null;\n    }, 100);\n  } // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm\n\n\n  $.fn.ajaxFormUnbind = function () {\n    return this.off('submit.form-plugin click.form-plugin');\n  };\n  /**\r\n   * formToArray() gathers form element data into an array of objects that can\r\n   * be passed to any of the following ajax functions: $.get, $.post, or load.\r\n   * Each object in the array has both a 'name' and 'value' property. An example of\r\n   * an array for a simple login form might be:\r\n   *\r\n   * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]\r\n   *\r\n   * It is this array that is passed to pre-submit callback functions provided to the\r\n   * ajaxSubmit() and ajaxForm() methods.\r\n   */\n\n\n  $.fn.formToArray = function (semantic, elements, filtering) {\n    var a = [];\n\n    if (this.length === 0) {\n      return a;\n    }\n\n    var form = this[0];\n    var formId = this.attr('id');\n    var els = semantic || typeof form.elements === 'undefined' ? form.getElementsByTagName('*') : form.elements;\n    var els2;\n\n    if (els) {\n      els = $.makeArray(els); // convert to standard array\n    } // #386; account for inputs outside the form which use the 'form' attribute\n    // FinesseRus: in non-IE browsers outside fields are already included in form.elements.\n\n\n    if (formId && (semantic || /(Edge|Trident)\\//.test(navigator.userAgent))) {\n      els2 = $(':input[form=\"' + formId + '\"]').get(); // hat tip @thet\n\n      if (els2.length) {\n        els = (els || []).concat(els2);\n      }\n    }\n\n    if (!els || !els.length) {\n      return a;\n    }\n\n    if (typeof filtering === \"function\") {\n      els = $.map(els, filtering);\n    }\n\n    var i, j, n, v, el, max, jmax;\n\n    for (i = 0, max = els.length; i < max; i++) {\n      el = els[i];\n      n = el.name;\n\n      if (!n || el.disabled) {\n        continue;\n      }\n\n      if (semantic && form.clk && el.type === 'image') {\n        // handle image inputs on the fly when semantic == true\n        if (form.clk === el) {\n          a.push({\n            name: n,\n            value: $(el).val(),\n            type: el.type\n          });\n          a.push({\n            name: n + '.x',\n            value: form.clk_x\n          }, {\n            name: n + '.y',\n            value: form.clk_y\n          });\n        }\n\n        continue;\n      }\n\n      v = $.fieldValue(el, true);\n\n      if (v && v.constructor === Array) {\n        if (elements) {\n          elements.push(el);\n        }\n\n        for (j = 0, jmax = v.length; j < jmax; j++) {\n          a.push({\n            name: n,\n            value: v[j]\n          });\n        }\n      } else if (feature.fileapi && el.type === 'file') {\n        if (elements) {\n          elements.push(el);\n        }\n\n        var files = el.files;\n\n        if (files.length) {\n          for (j = 0; j < files.length; j++) {\n            a.push({\n              name: n,\n              value: files[j],\n              type: el.type\n            });\n          }\n        } else {\n          // #180\n          a.push({\n            name: n,\n            value: '',\n            type: el.type\n          });\n        }\n      } else if (v !== null && typeof v !== 'undefined') {\n        if (elements) {\n          elements.push(el);\n        }\n\n        a.push({\n          name: n,\n          value: v,\n          type: el.type,\n          required: el.required\n        });\n      }\n    }\n\n    if (!semantic && form.clk) {\n      // input type=='image' are not found in elements array! handle it here\n      var $input = $(form.clk),\n          input = $input[0];\n      n = input.name;\n\n      if (n && !input.disabled && input.type === 'image') {\n        a.push({\n          name: n,\n          value: $input.val()\n        });\n        a.push({\n          name: n + '.x',\n          value: form.clk_x\n        }, {\n          name: n + '.y',\n          value: form.clk_y\n        });\n      }\n    }\n\n    return a;\n  };\n  /**\r\n   * Serializes form data into a 'submittable' string. This method will return a string\r\n   * in the format: name1=value1&amp;name2=value2\r\n   */\n\n\n  $.fn.formSerialize = function (semantic) {\n    // hand off to jQuery.param for proper encoding\n    return $.param(this.formToArray(semantic));\n  };\n  /**\r\n   * Serializes all field elements in the jQuery object into a query string.\r\n   * This method will return a string in the format: name1=value1&amp;name2=value2\r\n   */\n\n\n  $.fn.fieldSerialize = function (successful) {\n    var a = [];\n    this.each(function () {\n      var n = this.name;\n\n      if (!n) {\n        return;\n      }\n\n      var v = $.fieldValue(this, successful);\n\n      if (v && v.constructor === Array) {\n        for (var i = 0, max = v.length; i < max; i++) {\n          a.push({\n            name: n,\n            value: v[i]\n          });\n        }\n      } else if (v !== null && typeof v !== 'undefined') {\n        a.push({\n          name: this.name,\n          value: v\n        });\n      }\n    }); // hand off to jQuery.param for proper encoding\n\n    return $.param(a);\n  };\n  /**\r\n   * Returns the value(s) of the element in the matched set. For example, consider the following form:\r\n   *\r\n   *\t<form><fieldset>\r\n   *\t\t<input name=\"A\" type=\"text\">\r\n   *\t\t<input name=\"A\" type=\"text\">\r\n   *\t\t<input name=\"B\" type=\"checkbox\" value=\"B1\">\r\n   *\t\t<input name=\"B\" type=\"checkbox\" value=\"B2\">\r\n   *\t\t<input name=\"C\" type=\"radio\" value=\"C1\">\r\n   *\t\t<input name=\"C\" type=\"radio\" value=\"C2\">\r\n   *\t</fieldset></form>\r\n   *\r\n   *\tvar v = $('input[type=text]').fieldValue();\r\n   *\t// if no values are entered into the text inputs\r\n   *\tv === ['','']\r\n   *\t// if values entered into the text inputs are 'foo' and 'bar'\r\n   *\tv === ['foo','bar']\r\n   *\r\n   *\tvar v = $('input[type=checkbox]').fieldValue();\r\n   *\t// if neither checkbox is checked\r\n   *\tv === undefined\r\n   *\t// if both checkboxes are checked\r\n   *\tv === ['B1', 'B2']\r\n   *\r\n   *\tvar v = $('input[type=radio]').fieldValue();\r\n   *\t// if neither radio is checked\r\n   *\tv === undefined\r\n   *\t// if first radio is checked\r\n   *\tv === ['C1']\r\n   *\r\n   * The successful argument controls whether or not the field element must be 'successful'\r\n   * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).\r\n   * The default value of the successful argument is true. If this value is false the value(s)\r\n   * for each element is returned.\r\n   *\r\n   * Note: This method *always* returns an array. If no valid value can be determined the\r\n   *\tarray will be empty, otherwise it will contain one or more values.\r\n   */\n\n\n  $.fn.fieldValue = function (successful) {\n    for (var val = [], i = 0, max = this.length; i < max; i++) {\n      var el = this[i];\n      var v = $.fieldValue(el, successful);\n\n      if (v === null || typeof v === 'undefined' || v.constructor === Array && !v.length) {\n        continue;\n      }\n\n      if (v.constructor === Array) {\n        $.merge(val, v);\n      } else {\n        val.push(v);\n      }\n    }\n\n    return val;\n  };\n  /**\r\n   * Returns the value of the field element.\r\n   */\n\n\n  $.fieldValue = function (el, successful) {\n    var n = el.name,\n        t = el.type,\n        tag = el.tagName.toLowerCase();\n\n    if (typeof successful === 'undefined') {\n      successful = true;\n    }\n    /* eslint-disable no-mixed-operators */\n\n\n    if (successful && (!n || el.disabled || t === 'reset' || t === 'button' || (t === 'checkbox' || t === 'radio') && !el.checked || (t === 'submit' || t === 'image') && el.form && el.form.clk !== el || tag === 'select' && el.selectedIndex === -1)) {\n      /* eslint-enable no-mixed-operators */\n      return null;\n    }\n\n    if (tag === 'select') {\n      var index = el.selectedIndex;\n\n      if (index < 0) {\n        return null;\n      }\n\n      var a = [],\n          ops = el.options;\n      var one = t === 'select-one';\n      var max = one ? index + 1 : ops.length;\n\n      for (var i = one ? index : 0; i < max; i++) {\n        var op = ops[i];\n\n        if (op.selected && !op.disabled) {\n          var v = op.value;\n\n          if (!v) {\n            // extra pain for IE...\n            v = op.attributes && op.attributes.value && !op.attributes.value.specified ? op.text : op.value;\n          }\n\n          if (one) {\n            return v;\n          }\n\n          a.push(v);\n        }\n      }\n\n      return a;\n    }\n\n    return $(el).val().replace(rCRLF, '\\r\\n');\n  };\n  /**\r\n   * Clears the form data. Takes the following actions on the form's input fields:\r\n   *  - input text fields will have their 'value' property set to the empty string\r\n   *  - select elements will have their 'selectedIndex' property set to -1\r\n   *  - checkbox and radio inputs will have their 'checked' property set to false\r\n   *  - inputs of type submit, button, reset, and hidden will *not* be effected\r\n   *  - button elements will *not* be effected\r\n   */\n\n\n  $.fn.clearForm = function (includeHidden) {\n    return this.each(function () {\n      $('input,select,textarea', this).clearFields(includeHidden);\n    });\n  };\n  /**\r\n   * Clears the selected form elements.\r\n   */\n\n\n  $.fn.clearFields = $.fn.clearInputs = function (includeHidden) {\n    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list\n\n    return this.each(function () {\n      var t = this.type,\n          tag = this.tagName.toLowerCase();\n\n      if (re.test(t) || tag === 'textarea') {\n        this.value = '';\n      } else if (t === 'checkbox' || t === 'radio') {\n        this.checked = false;\n      } else if (tag === 'select') {\n        this.selectedIndex = -1;\n      } else if (t === 'file') {\n        if (/MSIE/.test(navigator.userAgent)) {\n          $(this).replaceWith($(this).clone(true));\n        } else {\n          $(this).val('');\n        }\n      } else if (includeHidden) {\n        // includeHidden can be the value true, or it can be a selector string\n        // indicating a special test; for example:\n        // $('#myForm').clearForm('.special:hidden')\n        // the above would clean hidden inputs that have the class of 'special'\n        if (includeHidden === true && /hidden/.test(t) || typeof includeHidden === 'string' && $(this).is(includeHidden)) {\n          this.value = '';\n        }\n      }\n    });\n  };\n  /**\r\n   * Resets the form data or individual elements. Takes the following actions\r\n   * on the selected tags:\r\n   * - all fields within form elements will be reset to their original value\r\n   * - input / textarea / select fields will be reset to their original value\r\n   * - option / optgroup fields (for multi-selects) will defaulted individually\r\n   * - non-multiple options will find the right select to default\r\n   * - label elements will be searched against its 'for' attribute\r\n   * - all others will be searched for appropriate children to default\r\n   */\n\n\n  $.fn.resetForm = function () {\n    return this.each(function () {\n      var el = $(this);\n      var tag = this.tagName.toLowerCase();\n\n      switch (tag) {\n        case 'input':\n          this.checked = this.defaultChecked;\n        // fall through\n\n        case 'textarea':\n          this.value = this.defaultValue;\n          return true;\n\n        case 'option':\n        case 'optgroup':\n          var select = el.parents('select');\n\n          if (select.length && select[0].multiple) {\n            if (tag === 'option') {\n              this.selected = this.defaultSelected;\n            } else {\n              el.find('option').resetForm();\n            }\n          } else {\n            select.resetForm();\n          }\n\n          return true;\n\n        case 'select':\n          el.find('option').each(function (i) {\n            // eslint-disable-line consistent-return\n            this.selected = this.defaultSelected;\n\n            if (this.defaultSelected && !el[0].multiple) {\n              el[0].selectedIndex = i;\n              return false;\n            }\n          });\n          return true;\n\n        case 'label':\n          var forEl = $(el.attr('for'));\n          var list = el.find('input,select,textarea');\n\n          if (forEl[0]) {\n            list.unshift(forEl[0]);\n          }\n\n          list.resetForm();\n          return true;\n\n        case 'form':\n          // guard against an input with the name of 'reset'\n          // note that IE reports the reset function as an 'object'\n          if (typeof this.reset === 'function' || _typeof(this.reset) === 'object' && !this.reset.nodeType) {\n            this.reset();\n          }\n\n          return true;\n\n        default:\n          el.find('form,input,label,select,textarea').resetForm();\n          return true;\n      }\n    });\n  };\n  /**\r\n   * Enables or disables any matching elements.\r\n   */\n\n\n  $.fn.enable = function (b) {\n    if (typeof b === 'undefined') {\n      b = true;\n    }\n\n    return this.each(function () {\n      this.disabled = !b;\n    });\n  };\n  /**\r\n   * Checks/unchecks any matching checkboxes or radio buttons and\r\n   * selects/deselects and matching option elements.\r\n   */\n\n\n  $.fn.selected = function (select) {\n    if (typeof select === 'undefined') {\n      select = true;\n    }\n\n    return this.each(function () {\n      var t = this.type;\n\n      if (t === 'checkbox' || t === 'radio') {\n        this.checked = select;\n      } else if (this.tagName.toLowerCase() === 'option') {\n        var $sel = $(this).parent('select');\n\n        if (select && $sel[0] && $sel[0].type === 'select-one') {\n          // deselect all other options\n          $sel.find('option').selected(false);\n        }\n\n        this.selected = select;\n      }\n    });\n  }; // expose debug var\n\n\n  $.fn.ajaxSubmit.debug = false; // helper fn for console logging\n\n  function log() {\n    if (!$.fn.ajaxSubmit.debug) {\n      return;\n    }\n\n    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments, '');\n\n    if (window.console && window.console.log) {\n      window.console.log(msg);\n    } else if (window.opera && window.opera.postError) {\n      window.opera.postError(msg);\n    }\n  }\n});\n\n//# sourceURL=webpack://rup/./src/core/utils/jquery.form.js?");

/***/ }),

/***/ "./src/core/utils/jquery.iframe-transport.js":
/*!***************************************************!*\
  !*** ./src/core/utils/jquery.iframe-transport.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*\r\n * jQuery Iframe Transport Plugin 1.2.4\r\n * https://github.com/blueimp/jQuery-File-Upload\r\n *\r\n * Copyright 2011, Sebastian Tschan\r\n * https://blueimp.net\r\n *\r\n * Licensed under the MIT license:\r\n * http://creativecommons.org/licenses/MIT/\r\n */\n\n/*jslint unparam: true, nomen: true */\n\n/*global jQuery, document */\n(function ($) {\n  'use strict'; // Helper variable to create unique names for the transport iframes:\n\n  var counter = 0; // The iframe transport accepts three additional options:\n  // options.fileInput: a jQuery collection of file input fields\n  // options.paramName: the parameter name for the file form data,\n  //  overrides the name property of the file input field(s)\n  // options.formData: an array of objects with name and value properties,\n  //  equivalent to the return data of .serializeArray(), e.g.:\n  //  [{name: 'a', value: 1}, {name: 'b', value: 2}]\n\n  $.ajaxTransport('iframe', function (options) {\n    if (options.async && (options.type === 'POST' || options.type === 'GET')) {\n      var form, iframe;\n      return {\n        send: function send(_, completeCallback) {\n          form = $('<form style=\"display:none;\"></form>'); // javascript:false as initial iframe src\n          // prevents warning popups on HTTPS in IE6.\n          // IE versions below IE8 cannot set the name property of\n          // elements that have already been added to the DOM,\n          // so we set the name along with the iframe HTML markup:\n\n          if (options.url.indexOf('emulate_iframe_http_status') !== -1 && options.dataType.indexOf('iframe') !== -1) {\n            options.dataType = options.dataType.split(' ')[1];\n            options.dataTypes = options.dataTypes.slice(1);\n          }\n\n          var xhr = {\n            // mock object\n            aborted: 0,\n            responseText: null,\n            responseXML: null,\n            status: 200,\n            statusText: 'success',\n            getAllResponseHeaders: function getAllResponseHeaders() {},\n            getResponseHeader: function getResponseHeader() {},\n            setRequestHeader: function setRequestHeader() {},\n            abort: function abort(status) {\n              var e = status === 'timeout' ? 'timeout' : 'aborted';\n              log('aborting upload... ' + e);\n              this.aborted = 1;\n              $io.attr('src', s.iframeSrc); // abort op in progress\n\n              xhr.error = e;\n              s.error && s.error.call(s.context, xhr, e, status);\n              g && $.event.trigger('ajaxError', [xhr, s, e]);\n              s.complete && s.complete.call(s.context, xhr, e);\n            }\n          };\n          iframe = $('<iframe src=\"javascript:false;\" name=\"iframe-transport-' + (counter += 1) + '\"></iframe>').on('load', function () {\n            var fileInputClones;\n            iframe.off('load').on('load', function () {\n              var response; // Wrap in a try/catch block to catch exceptions thrown\n              // when trying to access cross-domain iframe contents:\n\n              try {\n                response = iframe.contents();\n                var frame = response;\n                var doc = frame;\n                var docRoot = $(document).find('body');\n                var documentContent, isTextArea; // see if user embedded response in textarea\n\n                try {\n                  documentContent = $($(doc).text());\n                  isTextArea = documentContent.is('textarea');\n                } catch (e) {\n                  isTextArea = false;\n                }\n\n                if (isTextArea) {\n                  //                \t\t\t\t\t\txhr.responseText = documentContent.text();\n                  // support for XHR 'status' & 'statusText' emulation :\n                  xhr.status = Number(documentContent.attr('status')) || xhr.status;\n                  xhr.statusText = documentContent.attr('statusText') || xhr.statusText;\n                  xhr.responseText = {\n                    'json': documentContent.text()\n                  };\n                } else {\n                  xhr.responseText = {\n                    'iframe': response\n                  }; // Google Chrome and Firefox do not throw an\n                  // exception when calling iframe.contents() on\n                  // cross-domain requests, so we unify the response:\n\n                  if (!response.length || !response[0].firstChild) {\n                    throw new Error();\n                  }\n                }\n              } catch (e) {\n                response = undefined;\n              } // The complete callback returns the\n              // iframe content document as response object:\n\n\n              completeCallback(xhr.status, xhr.statusText, xhr.responseText); // Fix for IE endless progress bar activity bug\n              // (happens on form submits to iframe targets):\n\n              $('<iframe src=\"javascript:false;\"></iframe>').appendTo(form);\n              form.remove();\n            });\n            form.prop('target', iframe.prop('name')).prop('action', options.url).prop('method', options.type);\n\n            if (options.formData) {\n              $.each(options.formData, function (index, field) {\n                $('<input type=\"hidden\"/>').prop('name', field.name).val(field.value).appendTo(form);\n              });\n            }\n\n            if (options.fileInput && options.fileInput.length && options.type === 'POST') {\n              fileInputClones = options.fileInput.clone(); // Insert a clone for each file input field:\n\n              options.fileInput.after(function (index) {\n                return fileInputClones[index];\n              });\n\n              if (options.paramName) {\n                options.fileInput.each(function () {\n                  $(this).prop('name', options.paramName);\n                });\n              } // Appending the file input fields to the hidden form\n              // removes them from their original location:\n\n\n              form.append(options.fileInput).prop('enctype', 'multipart/form-data') // enctype must be set as encoding for IE:\n              .prop('encoding', 'multipart/form-data');\n            }\n\n            form.submit(); // Insert the file input fields at their original location\n            // by replacing the clones with the originals:\n\n            if (fileInputClones && fileInputClones.length) {\n              options.fileInput.each(function (index, input) {\n                var clone = $(fileInputClones[index]);\n                $(input).prop('name', clone.prop('name'));\n                clone.replaceWith(input);\n              });\n            }\n          });\n          form.append(iframe).appendTo(document.body);\n        },\n        abort: function abort() {\n          if (iframe) {\n            // javascript:false as iframe src aborts the request\n            // and prevents warning popups on HTTPS in IE6.\n            // concat is used to avoid the \"Script URL\" JSLint error:\n            iframe.off('load').prop('src', 'javascript'.concat(':false;'));\n          }\n\n          if (form) {\n            form.remove();\n          }\n        }\n      };\n    }\n  }); // The iframe transport returns the iframe content document as response.\n  // The following adds converters from iframe to text, json, html, and script:\n\n  $.ajaxSetup({\n    converters: {\n      'iframe text': function iframeText(iframe) {\n        return iframe.find('body').text();\n      },\n      'iframe json': function iframeJson(iframe) {\n        return JSON.parse(iframe.find('body').text());\n      },\n      'iframe html': function iframeHtml(iframe) {\n        return iframe.find('body').html();\n      },\n      'iframe script': function iframeScript(iframe) {\n        return $.globalEval(iframe.find('body').text());\n      }\n    }\n  });\n})(jQuery);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/core/utils/jquery.iframe-transport.js?");

/***/ }),

/***/ "./src/core/utils/jquery.json-2.2.js":
/*!*******************************************!*\
  !*** ./src/core/utils/jquery.json-2.2.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*\r\n * jQuery JSON Plugin\r\n * version: 2.1 (2009-08-14)\r\n *\r\n * This document is licensed as free software under the terms of the\r\n * MIT License: http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org\r\n * website's http://www.json.org/json2.js, which proclaims:\r\n * \"NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\", a sentiment that\r\n * I uphold.\r\n *\r\n * It is also influenced heavily by MochiKit's serializeJSON, which is\r\n * copyrighted 2005 by Bob Ippolito.\r\n */\n;\n\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  /** jQuery.toJSON( json-serializble )\r\n      Converts the given argument into a JSON respresentation.\r\n        If an object has a \"toJSON\" function, that will be used to get the representation.\r\n      Non-integer/string keys are skipped in the object, as are keys that point to a function.\r\n        json-serializble:\r\n          The *thing* to be converted.\r\n   **/\n  $.toJSON = function (o) {\n    if ((typeof JSON === \"undefined\" ? \"undefined\" : _typeof(JSON)) == 'object' && JSON.stringify) return JSON.stringify(o);\n\n    var type = _typeof(o);\n\n    if (o === null) return \"null\";\n    if (type == \"undefined\") return undefined;\n    if (type == \"number\" || type == \"boolean\") return o + \"\";\n    if (type == \"string\") return $.quoteString(o);\n\n    if (type == 'object') {\n      if (typeof o.toJSON == \"function\") return $.toJSON(o.toJSON());\n\n      if (o.constructor === Date) {\n        var month = o.getUTCMonth() + 1;\n        if (month < 10) month = '0' + month;\n        var day = o.getUTCDate();\n        if (day < 10) day = '0' + day;\n        var year = o.getUTCFullYear();\n        var hours = o.getUTCHours();\n        if (hours < 10) hours = '0' + hours;\n        var minutes = o.getUTCMinutes();\n        if (minutes < 10) minutes = '0' + minutes;\n        var seconds = o.getUTCSeconds();\n        if (seconds < 10) seconds = '0' + seconds;\n        var milli = o.getUTCMilliseconds();\n        if (milli < 100) milli = '0' + milli;\n        if (milli < 10) milli = '0' + milli;\n        return '\"' + year + '-' + month + '-' + day + 'T' + hours + ':' + minutes + ':' + seconds + '.' + milli + 'Z\"';\n      }\n\n      if (o.constructor === Array) {\n        var ret = [];\n\n        for (var i = 0; i < o.length; i++) {\n          ret.push($.toJSON(o[i]) || \"null\");\n        }\n\n        return \"[\" + ret.join(\",\") + \"]\";\n      }\n\n      var pairs = [];\n\n      for (var k in o) {\n        var name;\n\n        var type = _typeof(k);\n\n        if (type == \"number\") name = '\"' + k + '\"';else if (type == \"string\") name = $.quoteString(k);else continue; //skip non-string or number keys\n\n        if (typeof o[k] == \"function\") continue; //skip pairs where the value is a function.\n\n        var val = $.toJSON(o[k]);\n        pairs.push(name + \":\" + val);\n      }\n\n      return \"{\" + pairs.join(\", \") + \"}\";\n    }\n  };\n  /** jQuery.evalJSON(src)\r\n      Evaluates a given piece of json source.\r\n   **/\n\n\n  $.evalJSON = function (src) {\n    if ((typeof JSON === \"undefined\" ? \"undefined\" : _typeof(JSON)) == 'object' && JSON.parse) return JSON.parse(src);\n    return eval(\"(\" + src + \")\");\n  };\n  /** jQuery.secureEvalJSON(src)\r\n      Evals JSON in a way that is *more* secure.\r\n  **/\n\n\n  $.secureEvalJSON = function (src) {\n    if ((typeof JSON === \"undefined\" ? \"undefined\" : _typeof(JSON)) == 'object' && JSON.parse) return JSON.parse(src);\n    var filtered = src;\n    filtered = filtered.replace(/\\\\[\"\\\\\\/bfnrtu]/g, '@');\n    filtered = filtered.replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']');\n    filtered = filtered.replace(/(?:^|:|,)(?:\\s*\\[)+/g, '');\n    if (/^[\\],:{}\\s]*$/.test(filtered)) return eval(\"(\" + src + \")\");else throw new SyntaxError(\"Error parsing JSON, source is not valid.\");\n  };\n  /** jQuery.quoteString(string)\r\n      Returns a string-repr of a string, escaping quotes intelligently.\r\n      Mostly a support function for toJSON.\r\n        Examples:\r\n          >>> jQuery.quoteString(\"apple\")\r\n          \"apple\"\r\n            >>> jQuery.quoteString('\"Where are we going?\", she asked.')\r\n          \"\\\"Where are we going?\\\", she asked.\"\r\n   **/\n\n\n  $.quoteString = function (string) {\n    if (string.match(_escapeable)) {\n      return '\"' + string.replace(_escapeable, function (a) {\n        var c = _meta[a];\n        if (typeof c === 'string') return c;\n        c = a.charCodeAt();\n        return \"\\\\u00\" + Math.floor(c / 16).toString(16) + (c % 16).toString(16);\n      }) + '\"';\n    }\n\n    return '\"' + string + '\"';\n  };\n\n  var _escapeable = /[\"\\\\\\x00-\\x1f\\x7f-\\x9f]/g;\n  var _meta = {\n    '\\b': '\\\\b',\n    '\\t': '\\\\t',\n    '\\n': '\\\\n',\n    '\\f': '\\\\f',\n    '\\r': '\\\\r',\n    '\"': '\\\\\"',\n    '\\\\': '\\\\\\\\'\n  };\n});\n\n//# sourceURL=webpack://rup/./src/core/utils/jquery.json-2.2.js?");

/***/ }),

/***/ "./src/core/utils/xbreadcrumbs.js":
/*!****************************************!*\
  !*** ./src/core/utils/xbreadcrumbs.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*\r\n\txBreadcrumbs (Extended Breadcrums) jQuery Plugin\r\n\t(c) 2009 ajaxBlender.com\r\n\tFor any questions please visit www.ajaxblender.com \r\n\tor email us at support@ajaxblender.com\r\n*/\n;\n\n(function ($) {\n  /*  Variables  */\n  $.fn.xBreadcrumbs = function (settings) {\n    var element = $(this);\n    var settings = $.extend({}, $.fn.xBreadcrumbs.defaults, settings);\n\n    function _build() {\n      if (settings.collapsible) {\n        var sz = element.children('LI').length;\n        element.children('LI').children('A').css('white-space', 'nowrap').css('float', 'left');\n        element.children('LI').children('A').each(function (i, el) {\n          if (i != sz - 1) {\n            $(this).css('overflow', 'hidden');\n            $(this).attr('init-width', $(this).width());\n            $(this).width(settings.collapsedWidth);\n          }\n        });\n      }\n\n      element.children('LI').mouseenter(function () {\n        if ($(this).hasClass('hover')) {\n          return;\n        }\n\n        _hideAllSubLevels();\n\n        if (!_subLevelExists($(this))) {\n          return;\n        } // Show sub-level\n\n\n        var subLevel = $(this).children('UL');\n\n        _showHideSubLevel(subLevel, true);\n\n        if (settings.collapsible && !$(this).hasClass('current')) {\n          var initWidth = $(this).children('A').attr('init-width');\n          $(this).children('A').animate({\n            width: initWidth\n          }, 'normal');\n        }\n      });\n      element.children('LI').mouseleave(function () {\n        var subLevel = $(this).children('UL');\n\n        _showHideSubLevel(subLevel, false);\n\n        if (settings.collapsible && !$(this).hasClass('current')) {\n          $(this).children('A').animate({\n            width: settings.collapsedWidth\n          }, 'fast');\n        }\n      });\n    }\n\n    ;\n\n    function _hideAllSubLevels() {\n      element.children('LI').children('UL').each(function () {\n        $(this).hide();\n        $(this).parent().removeClass('hover');\n      });\n    }\n\n    ;\n\n    function _showHideSubLevel(subLevel, isShow) {\n      if (isShow) {\n        subLevel.parent().addClass('hover');\n\n        if ($.browser.msie) {\n          var pos = subLevel.parent().position();\n          subLevel.css('left', parseInt(pos['left']));\n        }\n\n        if (settings.showSpeed != '') {\n          subLevel.fadeIn(settings.showSpeed);\n        } else {\n          subLevel.show();\n        }\n      } else {\n        subLevel.parent().removeClass('hover');\n\n        if (settings.hideSpeed != '') {\n          subLevel.fadeOut(settings.hideSpeed);\n        } else {\n          subLevel.hide();\n        }\n      }\n    }\n\n    ;\n\n    function _subLevelExists(obj) {\n      return obj.children('UL').length > 0;\n    }\n\n    ; //    Entry point\n\n    _build();\n  };\n  /*  Default Settings  */\n\n\n  $.fn.xBreadcrumbs.defaults = {\n    showSpeed: 'fast',\n    hideSpeed: '',\n    collapsible: false,\n    collapsedWidth: 10\n  };\n})(jQuery);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/core/utils/xbreadcrumbs.js?");

/***/ }),

/***/ "./src/external/bootstrap-calendar/js/calendar.js":
/*!********************************************************!*\
  !*** ./src/external/bootstrap-calendar/js/calendar.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/**\r\n * Bootstrap based calendar full view.\r\n *\r\n * https://github.com/Serhioromano/bootstrap-calendar\r\n *\r\n * User: Sergey Romanov <serg4172@mail.ru>\r\n */\n\n/* eslint-env jquery */\nDate.prototype.getWeek = function (dowOffset) {\n  'use strict';\n  /*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.meanfreepath.com */\n\n  dowOffset = typeof dowOffset == 'int' ? dowOffset : 0; //default dowOffset to zero\n\n  var newYear = new Date(this.getFullYear(), 0, 1);\n  var day = newYear.getDay() - dowOffset; //the day of week the year begins on\n\n  day = day >= 0 ? day : day + 7;\n  var daynum = Math.floor((this.getTime() - newYear.getTime() - (this.getTimezoneOffset() - newYear.getTimezoneOffset()) * 60000) / 86400000) + 1;\n  var weeknum; //if the year starts before the middle of a week\n\n  if (day < 4) {\n    weeknum = Math.floor((daynum + day - 1) / 7) + 1;\n\n    if (weeknum > 52) {\n      var nYear = new Date(this.getFullYear() + 1, 0, 1);\n      var nday = nYear.getDay() - dowOffset;\n      nday = nday >= 0 ? nday : nday + 7;\n      /*if the next year starts before the middle of\r\n      the week, it is week #1 of that year*/\n\n      weeknum = nday < 4 ? 1 : 53;\n    }\n  } else {\n    weeknum = Math.floor((daynum + day - 1) / 7);\n  }\n\n  return weeknum;\n};\n\nDate.prototype.getMonthFormatted = function () {\n  'use strict';\n\n  var month = this.getMonth() + 1;\n  return month < 10 ? '0' + month : month;\n};\n\nDate.prototype.getDateFormatted = function () {\n  'use strict';\n\n  var date = this.getDate();\n  return date < 10 ? '0' + date : date;\n};\n\nif (!String.prototype.format) {\n  String.prototype.format = function () {\n    var args = arguments;\n    return this.replace(/{(\\d+)}/g, function (match, number) {\n      return typeof args[number] != 'undefined' ? args[number] : match;\n    });\n  };\n}\n\nif (!String.prototype.formatNum) {\n  String.prototype.formatNum = function (decimal) {\n    var r = '' + this;\n\n    while (r.length < decimal) {\n      r = '0' + r;\n    }\n\n    return r;\n  };\n}\n\n(function ($) {\n  'use strict';\n\n  var defaults = {\n    // Container to append the tooltip\n    tooltip_container: 'body',\n    // Width of the calendar\n    width: '100%',\n    // Initial view (can be 'month', 'week', 'day')\n    view: 'month',\n    // Initial date. No matter month, week or day this will be a starting point. Can be 'now' or a date in format 'yyyy-mm-dd'\n    day: 'now',\n    // Enable cell navigation\n    cell_navigation: true,\n    // Day Start time and end time with time intervals. Time split 10, 15 or 30.\n    time_start: '06:00',\n    time_end: '22:00',\n    time_split: '30',\n    // Source of events data. It can be one of the following:\n    // - URL to return JSON list of events in special format.\n    //   {success:1, result: [....]} or for error {success:0, error:'Something terrible happened'}\n    //   events: [...] as described in events property description\n    //   The start and end variables will be sent to this url\n    // - A function that received the start and end date, and that\n    //   returns an array of events (as described in events property description)\n    // - An array containing the events\n    events_source: '',\n    // Static cache of events. If set to true, events will only be loaded once.\n    // Useful if response is not constrained by date.\n    events_cache: false,\n    // Set format12 to true if you want to use 12 Hour format instead of 24 Hour\n    format12: false,\n    am_suffix: 'AM',\n    pm_suffix: 'PM',\n    // Path to templates should end with slash /. It can be as relative\n    // /component/bootstrap-calendar/tmpls/\n    // or absolute\n    // http://localhost/component/bootstrap-calendar/tmpls/\n    tmpl_path: 'tmpls/',\n    tmpl_cache: true,\n    classes: {\n      months: {\n        inmonth: 'cal-day-inmonth',\n        outmonth: 'cal-day-outmonth',\n        saturday: 'cal-day-weekend',\n        sunday: 'cal-day-weekend',\n        holidays: 'cal-day-holiday',\n        today: 'cal-day-today'\n      },\n      week: {\n        workday: 'cal-day-workday',\n        saturday: 'cal-day-weekend',\n        sunday: 'cal-day-weekend',\n        holidays: 'cal-day-holiday',\n        today: 'cal-day-today'\n      }\n    },\n    // ID of the element of modal window. If set, events URLs will be opened in modal windows.\n    modal: null,\n    //\tmodal handling setting, one of \"iframe\", \"ajax\" or \"template\"\n    modal_type: 'iframe',\n    //\tfunction to set modal title, will be passed the event as a parameter\n    modal_title: null,\n    views: {\n      year: {\n        slide_events: 1,\n        enable: 1\n      },\n      month: {\n        slide_events: 1,\n        enable: 1\n      },\n      week: {\n        enable: 1\n      },\n      day: {\n        enable: 1\n      }\n    },\n    merge_holidays: false,\n    display_week_numbers: true,\n    weekbox: true,\n    //shows events which fits between time_start and time_end\n    show_events_which_fits_time: false,\n    // Headers defined for ajax call\n    headers: {},\n    // ------------------------------------------------------------\n    // CALLBACKS. Events triggered by calendar class. You can use\n    // those to affect you UI\n    // ------------------------------------------------------------\n    onAfterEventsLoad: function onAfterEventsLoad(events) {// Inside this function 'this' is the calendar instance\n    },\n    onBeforeEventsLoad: function onBeforeEventsLoad(next) {\n      // Inside this function 'this' is the calendar instance\n      next();\n    },\n    onAfterViewLoad: function onAfterViewLoad(view) {// Inside this function 'this' is the calendar instance\n    },\n    onAfterModalShown: function onAfterModalShown(events) {// Inside this function 'this' is the calendar instance\n    },\n    onAfterModalHidden: function onAfterModalHidden(events) {// Inside this function 'this' is the calendar instance\n    },\n    // -------------------------------------------------------------\n    // INTERNAL USE ONLY. DO NOT ASSIGN IT WILL BE OVERRIDDEN ANYWAY\n    // -------------------------------------------------------------\n    events: [],\n    templates: {\n      year: '',\n      month: '',\n      week: '',\n      day: ''\n    },\n    stop_cycling: false\n  };\n  var defaults_extended = {\n    first_day: 2,\n    week_numbers_iso_8601: false,\n    holidays: {\n      // January 1\n      '01-01': 'New Year\\'s Day',\n      // Third (+3*) Monday (1) in January (01)\n      '01+3*1': 'Birthday of Dr. Martin Luther King, Jr.',\n      // Third (+3*) Monday (1) in February (02)\n      '02+3*1': 'Washington\\'s Birthday',\n      // Last (-1*) Monday (1) in May (05)\n      '05-1*1': 'Memorial Day',\n      // July 4\n      '04-07': 'Independence Day',\n      // First (+1*) Monday (1) in September (09)\n      '09+1*1': 'Labor Day',\n      // Second (+2*) Monday (1) in October (10)\n      '10+2*1': 'Columbus Day',\n      // November 11\n      '11-11': 'Veterans Day',\n      // Fourth (+4*) Thursday (4) in November (11)\n      '11+4*4': 'Thanksgiving Day',\n      // December 25\n      '25-12': 'Christmas'\n    }\n  };\n  var strings = {\n    error_noview: 'Calendar: View {0} not found',\n    error_dateformat: 'Calendar: Wrong date format {0}. Should be either \"now\" or \"yyyy-mm-dd\"',\n    error_loadurl: 'Calendar: Event URL is not set',\n    error_where: 'Calendar: Wrong navigation direction {0}. Can be only \"next\" or \"prev\" or \"today\"',\n    error_timedevide: 'Calendar: Time split parameter should divide 60 without decimals. Something like 10, 15, 30',\n    no_events_in_day: 'No events in this day.',\n    title_year: '{0}',\n    title_month: '{0} {1}',\n    title_week: 'week {0} of {1}',\n    title_day: '{0} {1} {2}, {3}',\n    week: 'Week {0}',\n    all_day: 'All day',\n    time: 'Time',\n    events: 'Events',\n    before_time: 'Ends before timeline',\n    after_time: 'Starts after timeline',\n    m0: 'January',\n    m1: 'February',\n    m2: 'March',\n    m3: 'April',\n    m4: 'May',\n    m5: 'June',\n    m6: 'July',\n    m7: 'August',\n    m8: 'September',\n    m9: 'October',\n    m10: 'November',\n    m11: 'December',\n    ms0: 'Jan',\n    ms1: 'Feb',\n    ms2: 'Mar',\n    ms3: 'Apr',\n    ms4: 'May',\n    ms5: 'Jun',\n    ms6: 'Jul',\n    ms7: 'Aug',\n    ms8: 'Sep',\n    ms9: 'Oct',\n    ms10: 'Nov',\n    ms11: 'Dec',\n    d0: 'Sunday',\n    d1: 'Monday',\n    d2: 'Tuesday',\n    d3: 'Wednesday',\n    d4: 'Thursday',\n    d5: 'Friday',\n    d6: 'Saturday'\n  };\n  var browser_timezone = '';\n\n  try {\n    if ($.type(window.jstz) == 'object' && $.type(jstz.determine) == 'function') {\n      browser_timezone = jstz.determine().name();\n\n      if ($.type(browser_timezone) !== 'string') {\n        browser_timezone = '';\n      }\n    }\n  } catch (e) {\n    console.error('No se pudo determinar la zona horaria');\n  }\n\n  function buildEventsUrl(events_url, data) {\n    var separator, key, url;\n    url = events_url;\n    separator = events_url.indexOf('?') < 0 ? '?' : '&';\n\n    for (key in data) {\n      url += separator + key + '=' + encodeURIComponent(data[key]);\n      separator = '&';\n    }\n\n    return url;\n  }\n\n  function getExtentedOption(cal, option_name) {\n    var fromOptions = cal.options[option_name] != null ? cal.options[option_name] : null;\n    var fromLanguage = cal.locale[option_name] != null ? cal.locale[option_name] : null;\n\n    if (option_name == 'holidays' && cal.options.merge_holidays) {\n      var holidays = {};\n      $.extend(true, holidays, fromLanguage ? fromLanguage : defaults_extended.holidays);\n\n      if (fromOptions) {\n        $.extend(true, holidays, fromOptions);\n      }\n\n      return holidays;\n    } else {\n      if (fromOptions != null) {\n        return fromOptions;\n      }\n\n      if (fromLanguage != null) {\n        return fromLanguage;\n      }\n\n      return defaults_extended[option_name];\n    }\n  }\n\n  function getHolidays(cal, year) {\n    var hash = [];\n    var holidays_def = getExtentedOption(cal, 'holidays');\n\n    for (var k in holidays_def) {\n      hash.push(k + ':' + holidays_def[k]);\n    }\n\n    hash.push(year);\n    hash = hash.join('|');\n\n    if (hash in getHolidays.cache) {\n      return getHolidays.cache[hash];\n    }\n\n    var holidays = [];\n    $.each(holidays_def, function (key, name) {\n      var firstDay = null,\n          lastDay = null,\n          failed = false;\n      $.each(key.split('>'), function (i, chunk) {\n        var m,\n            date = null;\n\n        if (m = /^(\\d\\d)-(\\d\\d)$/.exec(chunk)) {\n          date = new Date(year, parseInt(m[2], 10) - 1, parseInt(m[1], 10));\n        } else if (m = /^(\\d\\d)-(\\d\\d)-(\\d\\d\\d\\d)$/.exec(chunk)) {\n          if (parseInt(m[3], 10) == year) {\n            date = new Date(year, parseInt(m[2], 10) - 1, parseInt(m[1], 10));\n          }\n        } else if (m = /^easter(([+\\-])(\\d+))?$/.exec(chunk)) {\n          date = getEasterDate(year, m[1] ? parseInt(m[1], 10) : 0);\n        } else if (m = /^(\\d\\d)([+\\-])([1-5])\\*([0-6])$/.exec(chunk)) {\n          var month = parseInt(m[1], 10) - 1;\n          var direction = m[2];\n          var offset = parseInt(m[3]);\n          var weekday = parseInt(m[4]);\n\n          switch (direction) {\n            case '+':\n              var d = new Date(year, month, 1 - 7);\n\n              while (d.getDay() != weekday) {\n                d = new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1);\n              }\n\n              date = new Date(d.getFullYear(), d.getMonth(), d.getDate() + 7 * offset);\n              break;\n\n            case '-':\n              var d = new Date(year, month + 1, 0 + 7);\n\n              while (d.getDay() != weekday) {\n                d = new Date(d.getFullYear(), d.getMonth(), d.getDate() - 1);\n              }\n\n              date = new Date(d.getFullYear(), d.getMonth(), d.getDate() - 7 * offset);\n              break;\n          }\n        }\n\n        if (!date) {\n          warn('Unknown holiday: ' + key);\n          failed = true;\n          return false;\n        }\n\n        switch (i) {\n          case 0:\n            firstDay = date;\n            break;\n\n          case 1:\n            if (date.getTime() <= firstDay.getTime()) {\n              warn('Unknown holiday: ' + key);\n              failed = true;\n              return false;\n            }\n\n            lastDay = date;\n            break;\n\n          default:\n            warn('Unknown holiday: ' + key);\n            failed = true;\n            return false;\n        }\n      });\n\n      if (!failed) {\n        var days = [];\n\n        if (lastDay) {\n          for (var date = new Date(firstDay.getTime()); date.getTime() <= lastDay.getTime(); date.setDate(date.getDate() + 1)) {\n            days.push(new Date(date.getTime()));\n          }\n        } else {\n          days.push(firstDay);\n        }\n\n        holidays.push({\n          name: name,\n          days: days\n        });\n      }\n    });\n    getHolidays.cache[hash] = holidays;\n    return getHolidays.cache[hash];\n  }\n\n  getHolidays.cache = {};\n\n  function warn(message) {\n    if ($.type(window.console) == 'object' && $.type(window.console.warn) == 'function') {\n      window.console.warn('[Bootstrap-Calendar] ' + message);\n    }\n  }\n\n  function Calendar(params, context) {\n    this.options = $.extend(true, {\n      position: {\n        start: new Date(),\n        end: new Date()\n      }\n    }, defaults, params);\n    this.setLanguage(this.options.language);\n    this.context = context;\n    context.css('width', this.options.width).addClass('cal-context');\n    this.view();\n    context.triggerHandler('initComplete');\n    return this;\n  }\n\n  Calendar.prototype.setOptions = function (object) {\n    $.extend(this.options, object);\n\n    if ('language' in object) {\n      this.setLanguage(object.language);\n    }\n\n    if ('modal' in object) {\n      this._update_modal();\n    }\n  };\n\n  Calendar.prototype.setLanguage = function (lang) {\n    if (window.calendar_languages && lang in window.calendar_languages) {\n      this.locale = $.extend(true, {}, strings, calendar_languages[lang]);\n      this.options.language = lang;\n    } else {\n      this.locale = strings;\n      delete this.options.language;\n    }\n  };\n\n  Calendar.prototype._render = function () {\n    $(this.context).trigger('beforeRender');\n    this.context.html('');\n\n    this._loadTemplate(this.options.view);\n\n    this.stop_cycling = false;\n    var data = {};\n    data.cal = $.extend({}, this);\n    data.day = 1; // Getting list of days in a week in correct order. Works for month and week views\n\n    if (getExtentedOption(this, 'first_day') == 1) {\n      data.days_name = [this.locale.d1, this.locale.d2, this.locale.d3, this.locale.d4, this.locale.d5, this.locale.d6, this.locale.d0];\n    } else {\n      data.days_name = [this.locale.d0, this.locale.d1, this.locale.d2, this.locale.d3, this.locale.d4, this.locale.d5, this.locale.d6];\n    } // Get all events between start and end\n\n\n    var start = parseInt(this.options.position.start.getTime());\n    var end = parseInt(this.options.position.end.getTime());\n    data.events = this.getEventsBetween(start, end);\n\n    switch (this.options.view) {\n      case 'month':\n        break;\n\n      case 'week':\n        this._calculate_hour_minutes(data);\n\n        break;\n\n      case 'day':\n        this._calculate_hour_minutes(data);\n\n        break;\n    }\n\n    data.start = new Date(this.options.position.start.getTime());\n    data.lang = this.locale;\n    this.context.append(this.options.templates[this.options.view](data));\n\n    this._update();\n\n    $(this.context).trigger('afterRender');\n  };\n\n  Calendar.prototype._format_hour = function (str_hour, leadingZero) {\n    var hour_split = str_hour.split(':');\n    var hour = parseInt(hour_split[0]);\n    var minutes = parseInt(hour_split[1]);\n    var leadingZero = leadingZero == 'undefined' ? true : false;\n    var hourLength = leadingZero ? 2 : 1;\n    var suffix = '';\n\n    if (this.options.format12) {\n      if (hour < 12) {\n        suffix = this.options.am_suffix;\n      } else {\n        suffix = this.options.pm_suffix;\n      }\n\n      hour = hour % 12;\n\n      if (hour == 0) {\n        hour = 12;\n      }\n    }\n\n    return hour.toString().formatNum(hourLength) + ':' + minutes.toString().formatNum(2) + suffix;\n  };\n\n  Calendar.prototype._format_time = function (datetime) {\n    return this._format_hour(datetime.getHours() + ':' + datetime.getMinutes());\n  };\n\n  Calendar.prototype._calculate_hour_minutes = function (data) {\n    var $self = this;\n    var time_split = parseInt(this.options.time_split);\n    var time_split_count = 60 / time_split;\n    var time_split_hour = Math.min(time_split_count, 1);\n\n    if (time_split_count >= 1 && time_split_count % 1 != 0 || time_split_count < 1 && 1440 / time_split % 1 != 0) {\n      $.error(this.locale.error_timedevide);\n    }\n\n    var time_start = this.options.time_start.split(':');\n    var time_end = this.options.time_end.split(':');\n    data.hours = (parseInt(time_end[0]) - parseInt(time_start[0])) * time_split_hour;\n    var lines = data.hours * time_split_count - parseInt(time_start[1]) / time_split;\n    var ms_per_line = 60000 * time_split;\n    var start = new Date(this.options.position.start.getTime());\n    start.setHours(time_start[0]);\n    start.setMinutes(time_start[1]);\n    var end = new Date(this.options.position.end.getTime() - 86400000);\n    end.setHours(time_end[0]);\n    end.setMinutes(time_end[1]);\n    data.all_day = [];\n    data.by_hour = [];\n    data.after_time = [];\n    data.before_time = [];\n    $.each(data.events, function (k, e) {\n      var s = new Date(parseInt(e.start));\n      var f = new Date(parseInt(e.end));\n      e.start_hour = $self._format_time(s);\n      e.end_hour = $self._format_time(f);\n\n      if (e.start < start.getTime()) {\n        warn(1);\n        e.start_hour = s.getDate() + ' ' + $self.locale['ms' + s.getMonth()] + ' ' + e.start_hour;\n      }\n\n      if (e.end > end.getTime()) {\n        warn(1);\n        e.end_hour = f.getDate() + ' ' + $self.locale['ms' + f.getMonth()] + ' ' + e.end_hour;\n      }\n\n      if (!$self.options.show_events_which_fits_time) {\n        if (e.start <= start.getTime() && e.end >= end.getTime()) {\n          data.all_day.push(e);\n          return;\n        }\n\n        if (e.end < start.getTime()) {\n          data.before_time.push(e);\n          return;\n        }\n\n        if (e.start > end.getTime()) {\n          data.after_time.push(e);\n          return;\n        }\n      } else {\n        if (e.start < start.getTime()) {\n          data.before_time.push(e);\n          return;\n        }\n\n        if (e.end > end.getTime()) {\n          data.after_time.push(e);\n          return;\n        }\n\n        if (e.start < start.getTime() && e.end < end.getTime()) {\n          data.all_day.push(e);\n          return;\n        }\n      }\n\n      var event_start = start.getTime() - e.start;\n\n      if (event_start >= 0) {\n        e.top = 0;\n      } else {\n        e.top = Math.abs(event_start) / ms_per_line;\n      }\n\n      var lines_left = Math.abs(lines - e.top);\n      var lines_in_event = (e.end - e.start) / ms_per_line;\n\n      if (event_start >= 0) {\n        lines_in_event = (e.end - start.getTime()) / ms_per_line;\n      }\n\n      e.lines = lines_in_event;\n\n      if (lines_in_event > lines_left) {\n        e.lines = lines_left;\n      }\n\n      data.by_hour.push(e);\n    });\n  };\n\n  Calendar.prototype._hour_min = function (hour) {\n    var time_start = this.options.time_start.split(':');\n    var time_split = parseInt(this.options.time_split);\n    var in_hour = 60 / time_split;\n    return hour == 0 ? in_hour - parseInt(time_start[1]) / time_split : in_hour;\n  };\n\n  Calendar.prototype._hour = function (hour, part) {\n    var time_start = this.options.time_start.split(':');\n    var time_split = parseInt(this.options.time_split);\n    var h = '' + (parseInt(time_start[0]) + hour * Math.max(time_split / 60, 1));\n    var m = '' + time_split * part;\n    return this._format_hour(h.formatNum(2) + ':' + m.formatNum(2));\n  };\n\n  Calendar.prototype._week = function (event) {\n    this._loadTemplate('week-days');\n\n    var t = {};\n    var start = parseInt(this.options.position.start.getTime());\n    var end = parseInt(this.options.position.end.getTime());\n    var events = [];\n    var self = this;\n    var first_day = getExtentedOption(this, 'first_day');\n    $.each(this.getEventsBetween(start, end), function (k, event) {\n      var eventStart = new Date(parseInt(event.start));\n      eventStart.setHours(0, 0, 0, 0);\n      var eventEnd = new Date(parseInt(event.end));\n      event.start_day = new Date(parseInt(eventStart.getTime())).getDay();\n\n      if (first_day == 1) {\n        event.start_day = (event.start_day + 6) % 7;\n      }\n\n      if (eventEnd.getTime() - eventStart.getTime() <= 86400000) {\n        event.days = 1;\n      } else {\n        event.days = (eventEnd.getTime() - eventStart.getTime()) / 86400000;\n      }\n\n      if (eventStart.getTime() < start) {\n        event.days = event.days - (start - eventStart.getTime()) / 86400000;\n        event.start_day = 0;\n      }\n\n      event.days = Math.ceil(event.days);\n\n      if (event.start_day + event.days > 7) {\n        event.days = 7 - event.start_day;\n      }\n\n      events.push(event);\n    });\n    t.events = events;\n    t.cal = this;\n    return self.options.templates['week-days'](t);\n  };\n\n  Calendar.prototype._month = function (month) {\n    this._loadTemplate('year-month');\n\n    var t = {\n      cal: this\n    };\n    var newmonth = month + 1;\n    t.data_day = this.options.position.start.getFullYear() + '-' + (newmonth < 10 ? '0' + newmonth : newmonth) + '-' + '01';\n    t.month_name = this.locale['m' + month];\n    var curdate = new Date(this.options.position.start.getFullYear(), month, 1, 0, 0, 0);\n    t.start = parseInt(curdate.getTime());\n    t.end = parseInt(new Date(this.options.position.start.getFullYear(), month + 1, 1, 0, 0, 0).getTime());\n    t.events = this.getEventsBetween(t.start, t.end);\n    return this.options.templates['year-month'](t);\n  };\n\n  Calendar.prototype._day = function (week, day) {\n    this._loadTemplate('month-day');\n\n    var t = {\n      tooltip: '',\n      cal: this\n    };\n    var cls = this.options.classes.months.outmonth;\n    var firstday = this.options.position.start.getDay();\n\n    if (getExtentedOption(this, 'first_day') == 2) {\n      firstday++;\n    } else {\n      firstday = firstday == 0 ? 7 : firstday;\n    }\n\n    day = day - firstday + 1;\n    var curdate = new Date(this.options.position.start.getFullYear(), this.options.position.start.getMonth(), day, 0, 0, 0); // if day of the current month\n\n    if (day > 0) {\n      cls = this.options.classes.months.inmonth;\n    } // stop cycling table rows;\n\n\n    var daysinmonth = new Date(this.options.position.end.getTime() - 1).getDate();\n\n    if (day + 1 > daysinmonth) {\n      this.stop_cycling = true;\n    } // if day of the next month\n\n\n    if (day > daysinmonth) {\n      day = day - daysinmonth;\n      cls = this.options.classes.months.outmonth;\n    }\n\n    cls = (cls + ' ' + this._getDayClass('months', curdate)).trim();\n\n    if (day <= 0) {\n      var daysinprevmonth = new Date(this.options.position.start.getFullYear(), this.options.position.start.getMonth(), 0).getDate();\n      day = daysinprevmonth - Math.abs(day);\n      cls += ' cal-month-first-row';\n    }\n\n    var holiday = this._getHoliday(curdate);\n\n    if (holiday !== false) {\n      t.tooltip = holiday;\n    } // Transformamos la fecha a local de existir  y la usamos para establecer los out of range.\n\n\n    if (this.options.date_range_start) {\n      var date = this.options.date_range_start;\n      var strDate = '' + date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear();\n      var start = $.datepicker.parseDate('dd/mm/yy', strDate);\n\n      if (curdate.getTime() < start.getTime()) {\n        cls += ' rup-out-of-range';\n      }\n    }\n\n    if (this.options.date_range_end) {\n      var date = this.options.date_range_end;\n      var strDate = '' + date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear();\n      var end = $.datepicker.parseDate('dd/mm/yy', strDate);\n\n      if (curdate.getTime() > end.getTime()) {\n        cls += ' rup-out-of-range';\n      }\n    }\n\n    t.data_day = curdate.getFullYear() + '-' + curdate.getMonthFormatted() + '-' + (day < 10 ? '0' + day : day);\n    t.cls = cls;\n    t.day = day;\n    t.start = parseInt(curdate.getTime());\n    t.end = parseInt(t.start + 86400000);\n    t.events = this.getEventsBetween(t.start, t.end);\n    return this.options.templates['month-day'](t);\n  };\n\n  Calendar.prototype._getHoliday = function (date) {\n    var result = false;\n    $.each(getHolidays(this, date.getFullYear()), function () {\n      var found = false;\n      $.each(this.days, function () {\n        if (this.toDateString() == date.toDateString()) {\n          found = true;\n          return false;\n        }\n      });\n\n      if (found) {\n        result = this.name;\n        return false;\n      }\n    });\n    return result;\n  };\n\n  Calendar.prototype._getHolidayName = function (date) {\n    var holiday = this._getHoliday(date);\n\n    return holiday === false ? '' : holiday;\n  };\n\n  Calendar.prototype._getDayClass = function (class_group, date) {\n    var self = this;\n\n    var addClass = function addClass(which, to) {\n      var cls;\n      cls = self.options.classes && class_group in self.options.classes && which in self.options.classes[class_group] ? self.options.classes[class_group][which] : '';\n\n      if (typeof cls == 'string' && cls.length) {\n        to.push(cls);\n      }\n    };\n\n    var classes = [];\n\n    if (date.toDateString() == new Date().toDateString()) {\n      addClass('today', classes);\n    }\n\n    var holiday = this._getHoliday(date);\n\n    if (holiday !== false) {\n      addClass('holidays', classes);\n    }\n\n    switch (date.getDay()) {\n      case 0:\n        addClass('sunday', classes);\n        break;\n\n      case 6:\n        addClass('saturday', classes);\n        break;\n    }\n\n    addClass(date.toDateString(), classes);\n    return classes.join(' ');\n  };\n\n  Calendar.prototype.view = function (view) {\n    $(this.context).triggerHandler('beforeChangeView', view);\n\n    if (view) {\n      if (!this.options.views[view].enable) {\n        return;\n      }\n\n      this.options.view = view;\n    }\n\n    this._init_position();\n\n    this._loadEvents();\n\n    this._render();\n\n    this.options.onAfterViewLoad.call(this, this.options.view);\n    $(this.context).triggerHandler('afterChangeView', view);\n  };\n\n  Calendar.prototype.navigate = function (where, next) {\n    var to = $.extend({}, this.options.position);\n    var originalTo = {\n      start: new Date(this.options.position.start.getTime()),\n      end: new Date(this.options.position.end.getTime())\n    };\n\n    if (where == 'next') {\n      switch (this.options.view) {\n        case 'year':\n          to.start.setFullYear(this.options.position.start.getFullYear() + 1);\n          break;\n\n        case 'month':\n          to.start.setMonth(this.options.position.start.getMonth() + 1);\n          break;\n\n        case 'week':\n          to.start.setDate(this.options.position.start.getDate() + 7);\n          break;\n\n        case 'day':\n          to.start.setDate(this.options.position.start.getDate() + 1);\n          break;\n      }\n    } else if (where == 'prev') {\n      switch (this.options.view) {\n        case 'year':\n          to.start.setFullYear(this.options.position.start.getFullYear() - 1);\n          break;\n\n        case 'month':\n          to.start.setMonth(this.options.position.start.getMonth() - 1);\n          break;\n\n        case 'week':\n          to.start.setDate(this.options.position.start.getDate() - 7);\n          break;\n\n        case 'day':\n          to.start.setDate(this.options.position.start.getDate() - 1);\n          break;\n      }\n    } else if (where == 'today') {\n      to.start.setTime(new Date().getTime());\n    } else {\n      $.error(this.locale.error_where.format(where));\n    }\n\n    var self = this;\n\n    var getEndDate = function getEndDate() {\n      var end = new Date(to.start.getTime());\n\n      switch (self.options.view) {\n        case 'year':\n          end.setFullYear(to.start.getFullYear() + 1);\n          break;\n\n        case 'month':\n          end.setMonth(to.start.getMonth() + 1);\n          break;\n\n        case 'week':\n          end.setDate(to.start.getDate() + 7);\n          break;\n\n        case 'day':\n          end.setDate(to.start.getDate() + 1);\n          break;\n      }\n\n      return end;\n    };\n\n    var stopNavigation = function stopNavigation() {\n      console.warn('Can´t navigate to an out of range time.');\n      self.options.position = originalTo;\n      self.options.day = originalTo.start.getFullYear() + '-' + originalTo.start.getMonthFormatted() + '-' + originalTo.start.getDateFormatted();\n      self.view();\n    };\n\n    if (this.options.date_range_start) {\n      var end = getEndDate();\n\n      if (end.getTime() < this.options.date_range_start.getTime()) {\n        stopNavigation();\n        return;\n      }\n    }\n\n    if (this.options.date_range_end) {\n      if (to.start.getTime() > this.options.date_range_end.getTime()) {\n        stopNavigation();\n        return;\n      }\n    }\n\n    this.options.day = to.start.getFullYear() + '-' + to.start.getMonthFormatted() + '-' + to.start.getDateFormatted();\n    this.view();\n\n    if (_.isFunction(next)) {\n      next();\n    }\n  };\n\n  Calendar.prototype._init_position = function () {\n    var year, month, day;\n\n    if (this.options.day == 'now') {\n      var date = new Date();\n      year = date.getFullYear();\n      month = date.getMonth();\n      day = date.getDate();\n    } else if (this.options.day.match(/^\\d{4}-\\d{2}-\\d{2}$/g)) {\n      var list = this.options.day.split('-');\n      year = parseInt(list[0], 10);\n      month = parseInt(list[1], 10) - 1;\n      day = parseInt(list[2], 10);\n    } else {\n      $.error(this.locale.error_dateformat.format(this.options.day));\n    }\n\n    switch (this.options.view) {\n      case 'year':\n        this.options.position.start.setTime(new Date(year, 0, 1).getTime());\n        this.options.position.end.setTime(new Date(year + 1, 0, 1).getTime());\n        break;\n\n      case 'month':\n        this.options.position.start.setTime(new Date(year, month, 1).getTime());\n        this.options.position.end.setTime(new Date(year, month + 1, 1).getTime());\n        break;\n\n      case 'day':\n        this.options.position.start.setTime(new Date(year, month, day).getTime());\n        this.options.position.end.setTime(new Date(year, month, day + 1).getTime());\n        break;\n\n      case 'week':\n        var curr = new Date(year, month, day);\n        var first;\n\n        if (getExtentedOption(this, 'first_day') == 1) {\n          first = curr.getDate() - (curr.getDay() + 6) % 7;\n        } else {\n          first = curr.getDate() - curr.getDay();\n        }\n\n        this.options.position.start.setTime(new Date(year, month, first).getTime());\n        this.options.position.end.setTime(new Date(year, month, first + 7).getTime());\n        break;\n\n      default:\n        $.error(this.locale.error_noview.format(this.options.view));\n    }\n\n    return this;\n  };\n\n  Calendar.prototype.getTitle = function () {\n    var p = this.options.position.start;\n\n    switch (this.options.view) {\n      case 'year':\n        return this.locale.title_year.format(p.getFullYear());\n        break;\n\n      case 'month':\n        return this.locale.title_month.format(this.locale['m' + p.getMonth()], p.getFullYear());\n        break;\n\n      case 'week':\n        return this.locale.title_week.format(p.getWeek(), p.getFullYear());\n        break;\n\n      case 'day':\n        return this.locale.title_day.format(this.locale['d' + p.getDay()], p.getDate(), this.locale['m' + p.getMonth()], p.getFullYear());\n        break;\n    }\n\n    return;\n  };\n\n  Calendar.prototype.getYear = function () {\n    var p = this.options.position.start;\n    return p.getFullYear();\n  };\n\n  Calendar.prototype.getMonth = function () {\n    var p = this.options.position.start;\n    return this.locale['m' + p.getMonth()];\n  };\n\n  Calendar.prototype.getDay = function () {\n    var p = this.options.position.start;\n    return this.locale['d' + p.getDay()];\n  };\n\n  Calendar.prototype.isToday = function () {\n    var now = new Date().getTime();\n\n    if (now > this.options.position.start.getTime() && now < this.options.position.end.getTime()) {\n      return true;\n    }\n\n    return false;\n  };\n\n  Calendar.prototype.getStartDate = function () {\n    return this.options.position.start;\n  };\n\n  Calendar.prototype.getEndDate = function () {\n    return this.options.position.end;\n  };\n\n  Calendar.prototype._loadEvents = function () {\n    var self = this;\n    var source = null;\n\n    if ('events_source' in this.options && this.options.events_source !== '') {\n      source = this.options.events_source;\n    } else if ('events_url' in this.options) {\n      source = this.options.events_url;\n      warn('The events_url option is DEPRECATED and it will be REMOVED in near future. Please use events_source instead.');\n    }\n\n    var loader;\n\n    switch ($.type(source)) {\n      case 'function':\n        loader = function loader() {\n          return source(self.options.position.start, self.options.position.end, browser_timezone);\n        };\n\n        break;\n\n      case 'array':\n        loader = function loader() {\n          return [].concat(source);\n        };\n\n        break;\n\n      case 'string':\n        if (source.length) {\n          loader = function loader() {\n            var events = [];\n            var d_from = self.options.position.start;\n            var d_to = self.options.position.end;\n            var params = {\n              from: d_from.getTime(),\n              to: d_to.getTime(),\n              utc_offset_from: d_from.getTimezoneOffset(),\n              utc_offset_to: d_to.getTimezoneOffset()\n            };\n\n            if (browser_timezone.length) {\n              params.browser_timezone = browser_timezone;\n            }\n\n            $.ajax({\n              url: buildEventsUrl(source, params),\n              dataType: 'json',\n              type: 'GET',\n              async: false,\n              headers: self.options.headers,\n              error: function error(e, a, s) {\n                $(self.context).triggerHandler('afterLoadEventsError', e);\n              },\n              success: function success(d) {\n                $(self.context).triggerHandler('afterLoadEventsSuccess', d);\n              }\n            }).done(function (json) {\n              if (!json.success) {\n                $.error(json.error);\n              }\n\n              if (json.result) {\n                events = json.result;\n                $(self.context).triggerHandler('afterLoadEventsSuccess');\n              }\n            });\n            return events;\n          };\n        }\n\n        break;\n    }\n\n    if (!loader) {\n      $.error(this.locale.error_loadurl);\n    } //Nos aseguramos de lanzar el evento beforeLoadEvents\n\n\n    var originalBEL = this.options.onBeforeEventsLoad;\n\n    this.options.onBeforeEventsLoad = function () {\n      $(self.context).triggerHandler('beforeLoadEvents');\n      originalBEL(arguments[0]);\n    };\n\n    this.options.onBeforeEventsLoad.call(this, function () {\n      if (!self.options.events.length || !self.options.events_cache) {\n        self.options.events = loader();\n        self.options.events.sort(function (a, b) {\n          var delta;\n          delta = a.start - b.start;\n\n          if (delta == 0) {\n            delta = a.end - b.end;\n          }\n\n          return delta;\n        });\n      }\n\n      var originalAEL = self.options.onAfterEventsLoad;\n\n      self.options.onAfterEventsLoad = function () {\n        $(self.context).triggerHandler('afterLoadEventsComplete');\n        originalAEL(arguments);\n      };\n\n      self.options.onAfterEventsLoad.call(self, self.options.events);\n    });\n  };\n\n  Calendar.prototype._templatePath = function (name) {\n    if (typeof this.options.tmpl_path == 'function') {\n      return this.options.tmpl_path(name);\n    } else {\n      return this.options.tmpl_path + name + '.html';\n    }\n  };\n\n  Calendar.prototype._loadTemplate = function (name) {\n    if (this.options.templates[name]) {\n      return;\n    }\n\n    var self = this;\n    $.ajax({\n      url: self._templatePath(name),\n      dataType: 'html',\n      type: 'GET',\n      async: false,\n      cache: this.options.tmpl_cache\n    }).done(function (html) {\n      self.options.templates[name] = _.template(html);\n    });\n  };\n\n  Calendar.prototype._update = function () {\n    var self = this;\n    $('*[data-toggle=\"tooltip\"]').tooltip({\n      container: this.options.tooltip_container,\n      html: true,\n      trigger: 'hover'\n    });\n\n    if (self.options.cell_navigation === true) {\n      $('*[data-cal-date]').click(function () {\n        var view = $(this).data('cal-view');\n        self.options.day = $(this).data('cal-date');\n        self.view(view);\n      });\n      $('.cal-cell').dblclick(function () {\n        var view = $('[data-cal-date]', this).data('cal-view');\n        self.options.day = $('[data-cal-date]', this).data('cal-date');\n        $('.tooltip').hide();\n        self.view(view);\n      }); // Los que estén fuera de rango los quitamos.\n\n      $('.rup-out-of-range').each(function (i, e) {\n        $(e).parent().off('dblclick');\n        $('span', $(e)).off('click');\n      });\n    }\n\n    this['_update_' + this.options.view]();\n\n    this._update_modal();\n  };\n\n  Calendar.prototype._update_modal = function () {\n    var self = this;\n    $('a[data-event-id]', this.context).unbind('click');\n\n    if (!self.options.modal) {\n      return;\n    }\n\n    var modal = $(self.options.modal);\n\n    if (!modal.length) {\n      return;\n    }\n\n    var ifrm = null;\n\n    if (self.options.modal_type == 'iframe') {\n      ifrm = $(document.createElement('iframe')).attr({\n        width: '100%',\n        frameborder: '0'\n      });\n    }\n\n    $('a[data-event-id]', this.context).on('click', function (event) {\n      event.preventDefault();\n      event.stopPropagation();\n      var url = $(this).attr('href');\n      var id = $(this).data('event-id');\n\n      var event = _.find(self.options.events, function (event) {\n        return event.id == id;\n      });\n\n      if (self.options.modal_type == 'iframe') {\n        ifrm.attr('src', url);\n        $('.modal-body', modal).html(ifrm);\n      }\n\n      if (!modal.data('handled.bootstrap-calendar') || modal.data('handled.bootstrap-calendar') && modal.data('handled.event-id') != event.id) {\n        modal.off('show.bs.modal').off('shown.bs.modal').off('hidden.bs.modal').on('show.bs.modal', function () {\n          var modal_body = $(this).find('.modal-body');\n\n          switch (self.options.modal_type) {\n            case 'iframe':\n              var height = modal_body.height() - parseInt(modal_body.css('padding-top'), 10) - parseInt(modal_body.css('padding-bottom'), 10);\n              $(this).find('iframe').height(Math.max(height, 50));\n              break;\n\n            case 'ajax':\n              $.ajax({\n                url: url,\n                dataType: 'html',\n                async: false,\n                success: function success(data) {\n                  modal_body.html(data);\n                }\n              });\n              break;\n\n            case 'template':\n              self._loadTemplate('modal'); //\talso serve calendar instance to underscore template to be able to access current language strings\n\n\n              modal_body.html(self.options.templates['modal']({\n                'event': event,\n                'calendar': self\n              }));\n              break;\n          } //\tset the title of the bootstrap modal\n\n\n          if (_.isFunction(self.options.modal_title)) {\n            modal.find('.modal-title').html(self.options.modal_title(event));\n          }\n        }).on('shown.bs.modal', function () {\n          self.options.onAfterModalShown.call(self, self.options.events);\n        }).on('hidden.bs.modal', function () {\n          self.options.onAfterModalHidden.call(self, self.options.events);\n        }).data('handled.bootstrap-calendar', true).data('handled.event-id', event.id);\n      }\n\n      modal.modal('show');\n    });\n  };\n\n  Calendar.prototype._update_day = function () {\n    $('#cal-day-panel').height($('#cal-day-panel-hour').height());\n  };\n\n  Calendar.prototype._update_week = function () {};\n\n  Calendar.prototype._update_year = function () {\n    this._update_month_year();\n  };\n\n  Calendar.prototype._update_month = function () {\n    this._update_month_year();\n\n    var self = this;\n\n    if (this.options.weekbox == true) {\n      var week = $(document.createElement('div')).attr('id', 'cal-week-box');\n      var start = this.options.position.start.getFullYear() + '-' + this.options.position.start.getMonthFormatted() + '-';\n      self.context.find('.cal-month-box .cal-row-fluid').on('mouseenter', function () {\n        $(self.context).trigger('beforeShowWeekBox');\n        var p = new Date(self.options.position.start);\n        var child = $('.cal-cell1:first-child .cal-month-day', this);\n        var day = child.hasClass('cal-month-first-row') ? 1 : $('[data-cal-date]', child).text();\n        p.setDate(parseInt(day));\n        day = day < 10 ? '0' + day : day;\n        week.html(self.locale.week.format(self.options.display_week_numbers == true ? p.getWeek() : ''));\n        week.attr('data-cal-week', start + day).show().appendTo(child);\n        $(self.context).trigger('afterShowWeekBox');\n      }).on('mouseleave', function () {\n        $(self.context).trigger('beforeHideWeekBox');\n        week.hide();\n        $(self.context).trigger('afterHideWeekBox');\n      });\n      week.click(function () {\n        self.options.day = $(this).data('cal-week');\n        self.view('week');\n      });\n    }\n\n    self.context.find('a.event').mouseenter(function () {\n      $('a[data-event-id=\"' + $(this).data('event-id') + '\"]').closest('.cal-cell1').addClass('day-highlight dh-' + $(this).data('event-class'));\n    });\n    self.context.find('a.event').mouseleave(function () {\n      $('div.cal-cell1').removeClass('day-highlight dh-' + $(this).data('event-class'));\n    });\n  };\n\n  Calendar.prototype._update_month_year = function () {\n    if (!this.options.views[this.options.view].slide_events) {\n      return;\n    }\n\n    var self = this;\n    var activecell = 0;\n    var downbox = $(document.createElement('div')).attr('id', 'cal-day-tick').html('<i class=\"mdi mdi-chevron-down\"></i>');\n    self.context.find('.cal-month-day, .cal-year-box .span3').on('mouseenter', function () {\n      if ($('.events-list', this).length == 0) {\n        return;\n      }\n\n      if ($(this).children('[data-cal-date]').text() == self.activecell) {\n        return;\n      }\n\n      downbox.show().appendTo(this);\n    }).on('mouseleave', function () {\n      downbox.hide();\n    }).on('click', function (event) {\n      if ($(event.target).hasClass('event')) {\n        return;\n      }\n\n      if ($('.events-list', this).length == 0) {\n        return;\n      }\n\n      if ($(this).children('[data-cal-date]').text() == self.activecell) {\n        return;\n      }\n\n      showEventsList(event, downbox, slider, self);\n    });\n    var slider = $(document.createElement('div')).attr('id', 'cal-slide-box');\n    slider.hide().click(function (event) {\n      event.stopPropagation();\n    });\n\n    this._loadTemplate('events-list');\n\n    downbox.click(function (event) {\n      showEventsList(event, $(this), slider, self);\n    });\n  };\n\n  Calendar.prototype.getEventsBetween = function (start, end) {\n    var events = [];\n    $.each(this.options.events, function () {\n      if (this.start == null) {\n        return true;\n      }\n\n      var event_end = this.end || this.start;\n\n      if (parseInt(this.start) < end && parseInt(event_end) > start) {\n        events.push(this);\n      }\n    });\n    return events;\n  };\n\n  function showEventsList(event, that, slider, self) {\n    event.stopPropagation();\n    var that = $(that);\n    var cell = that.closest('.cal-cell');\n    var row = cell.closest('.cal-before-eventlist');\n    var tick_position = cell.data('cal-row');\n    that.fadeOut('fast');\n    slider.slideUp('fast', function () {\n      var event_list = $('.events-list', cell);\n      slider.html(self.options.templates['events-list']({\n        cal: self,\n        events: self.getEventsBetween(parseInt(event_list.data('cal-start')), parseInt(event_list.data('cal-end')))\n      }));\n      row.after(slider);\n      self.activecell = $('[data-cal-date]', cell).text();\n      $('#cal-slide-tick').addClass('tick' + tick_position).show();\n      self.context.triggerHandler('beforeShowCell');\n      slider.slideDown('fast', function () {\n        $('body').one('click', function () {\n          self.context.trigger('beforeHideCell');\n          slider.slideUp('fast');\n          self.activecell = 0;\n          self.context.trigger('afterHideCell');\n        });\n        self.context.trigger('afterShowCell');\n      });\n    }); // Wait 400ms before updating the modal & attach the mouseenter&mouseleave(400ms is the time for the slider to fade out and slide up)\n\n    setTimeout(function () {\n      $('a.event-item').mouseenter(function () {\n        $('a[data-event-id=\"' + $(this).data('event-id') + '\"]').closest('.cal-cell1').addClass('day-highlight dh-' + $(this).data('event-class'));\n      });\n      $('a.event-item').mouseleave(function () {\n        $('div.cal-cell1').removeClass('day-highlight dh-' + $(this).data('event-class'));\n      });\n      $('a.event-item').parent().click(function () {\n        self.context.trigger('eventClick');\n      });\n      $('a.event-item').parent().dblclick(function () {\n        self.context.trigger('eventDoubleClick');\n      });\n\n      self._update_modal();\n    }, 400);\n  }\n\n  function getEasterDate(year, offsetDays) {\n    var a = year % 19;\n    var b = Math.floor(year / 100);\n    var c = year % 100;\n    var d = Math.floor(b / 4);\n    var e = b % 4;\n    var f = Math.floor((b + 8) / 25);\n    var g = Math.floor((b - f + 1) / 3);\n    var h = (19 * a + b - d - g + 15) % 30;\n    var i = Math.floor(c / 4);\n    var k = c % 4;\n    var l = (32 + 2 * e + 2 * i - h - k) % 7;\n    var m = Math.floor((a + 11 * h + 22 * l) / 451);\n    var n0 = h + l + 7 * m + 114;\n    var n = Math.floor(n0 / 31) - 1;\n    var p = n0 % 31 + 1;\n    return new Date(year, n, p + (offsetDays ? offsetDays : 0), 0, 0, 0);\n  }\n\n  $.fn.calendar = function (params) {\n    return new Calendar(params, this);\n  };\n})(jQuery);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/external/bootstrap-calendar/js/calendar.js?");

/***/ }),

/***/ "./src/external/dropdown.js":
/*!**********************************!*\
  !*** ./src/external/dropdown.js ***!
  \**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(jQuery) {/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./src/external/util.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n/**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap (v4.0.0-alpha.5): dropdown.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\n\nvar Dropdown = function ($) {\n  /**\r\n   * ------------------------------------------------------------------------\r\n   * Constants\r\n   * ------------------------------------------------------------------------\r\n   */\n  var NAME = 'dropdown';\n  var VERSION = '4.0.0-alpha.5';\n  var DATA_KEY = 'bs.dropdown';\n  var EVENT_KEY = \".\".concat(DATA_KEY);\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var Event = {\n    HIDE: \"hide\".concat(EVENT_KEY),\n    HIDDEN: \"hidden\".concat(EVENT_KEY),\n    SHOW: \"show\".concat(EVENT_KEY),\n    SHOWN: \"shown\".concat(EVENT_KEY),\n    CLICK: \"click\".concat(EVENT_KEY),\n    CLICK_DATA_API: \"click\".concat(EVENT_KEY).concat(DATA_API_KEY),\n    KEYDOWN_DATA_API: \"keydown\".concat(EVENT_KEY).concat(DATA_API_KEY)\n  };\n  var ClassName = {\n    BACKDROP: 'dropdown-backdrop',\n    DISABLED: 'disabled',\n    OPEN: 'open'\n  };\n  var Selector = {\n    BACKDROP: '.dropdown-backdrop',\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    ROLE_MENU: '[role=\"menu\"]',\n    ROLE_LISTBOX: '[role=\"listbox\"]',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '[role=\"menu\"] li:not(.disabled) a, ' + '[role=\"listbox\"] li:not(.disabled) a'\n  };\n  /**\r\n   * ------------------------------------------------------------------------\r\n   * Class Definition\r\n   * ------------------------------------------------------------------------\r\n   */\n\n  var Dropdown = /*#__PURE__*/function () {\n    function Dropdown(element) {\n      _classCallCheck(this, Dropdown);\n\n      this._element = element;\n\n      this._addEventListeners();\n    } // getters\n\n\n    _createClass(Dropdown, [{\n      key: \"toggle\",\n      value: // public\n      function toggle() {\n        if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n          return false;\n        }\n\n        var parent = Dropdown._getParentFromElement(this);\n\n        var isActive = $(parent).hasClass(ClassName.OPEN);\n\n        Dropdown._clearMenus();\n\n        if (isActive) {\n          return false;\n        }\n\n        if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {\n          // if mobile we use a backdrop because click events don't delegate\n          var dropdown = document.createElement('div');\n          dropdown.className = ClassName.BACKDROP;\n          $(dropdown).insertBefore(this);\n          $(dropdown).on('click', Dropdown._clearMenus);\n        }\n\n        var relatedTarget = {\n          relatedTarget: this\n        };\n        var showEvent = $.Event(Event.SHOW, relatedTarget);\n        $(parent).trigger(showEvent);\n\n        if (showEvent.isDefaultPrevented()) {\n          return false;\n        }\n\n        this.focus();\n        this.setAttribute('aria-expanded', 'true');\n        $(parent).toggleClass(ClassName.OPEN);\n        $(parent).trigger($.Event(Event.SHOWN, relatedTarget));\n        $(parent).trigger('toggleEnd');\n        return false;\n      }\n    }, {\n      key: \"dispose\",\n      value: function dispose() {\n        $.removeData(this._element, DATA_KEY);\n        $(this._element).off(EVENT_KEY);\n        this._element = null;\n      } // private\n\n    }, {\n      key: \"_addEventListeners\",\n      value: function _addEventListeners() {\n        $(this._element).on(Event.CLICK, this.toggle);\n      } // static\n\n    }], [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"_jQueryInterface\",\n      value: function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $(this).data(DATA_KEY);\n\n          if (!data) {\n            $(this).data(DATA_KEY, data = new Dropdown(this));\n          }\n\n          if (typeof config === 'string') {\n            if (data[config] === undefined) {\n              throw new Error(\"No method named \\\"\".concat(config, \"\\\"\"));\n            }\n\n            data[config].call(this);\n          }\n        });\n      }\n    }, {\n      key: \"_clearMenus\",\n      value: function _clearMenus(event) {\n        if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {\n          return;\n        }\n\n        var backdrop = $(Selector.BACKDROP)[0];\n\n        if (backdrop) {\n          backdrop.parentNode.removeChild(backdrop);\n        }\n\n        var toggles = $.makeArray($(Selector.DATA_TOGGLE));\n\n        for (var i = 0; i < toggles.length; i++) {\n          var parent = Dropdown._getParentFromElement(toggles[i]);\n\n          var relatedTarget = {\n            relatedTarget: toggles[i]\n          };\n\n          if (!$(parent).hasClass(ClassName.OPEN)) {\n            continue;\n          }\n\n          if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(parent, event.target)) {\n            continue;\n          }\n\n          var hideEvent = $.Event(Event.HIDE, relatedTarget);\n          $(parent).trigger(hideEvent);\n\n          if (hideEvent.isDefaultPrevented()) {\n            continue;\n          }\n\n          toggles[i].setAttribute('aria-expanded', 'false');\n          $(parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget)).trigger('toggleEnd');\n        }\n      }\n    }, {\n      key: \"_getParentFromElement\",\n      value: function _getParentFromElement(element) {\n        var parent;\n        var selector = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getSelectorFromElement(element);\n\n        if (selector) {\n          parent = $(selector)[0];\n        }\n\n        return parent || element.parentNode;\n      }\n    }, {\n      key: \"_dataApiKeydownHandler\",\n      value: function _dataApiKeydownHandler(event) {\n        if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {\n          return;\n        }\n\n        event.preventDefault();\n        event.stopPropagation();\n\n        if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n          return;\n        }\n\n        var parent = Dropdown._getParentFromElement(this);\n\n        var isActive = $(parent).hasClass(ClassName.OPEN);\n\n        if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {\n          if (event.which === ESCAPE_KEYCODE) {\n            var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];\n            $(toggle).trigger('focus');\n          }\n\n          $(this).trigger('click');\n          return;\n        }\n\n        var items = $.makeArray($(Selector.VISIBLE_ITEMS));\n        items = items.filter(function (item) {\n          return item.offsetWidth || item.offsetHeight;\n        });\n\n        if (!items.length) {\n          return;\n        }\n\n        var index = items.indexOf(event.target);\n\n        if (event.which === ARROW_UP_KEYCODE && index > 0) {\n          // up\n          index--;\n        }\n\n        if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n          // down\n          index++;\n        }\n\n        if (index < 0) {\n          index = 0;\n        }\n\n        items[index].focus();\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\r\n   * ------------------------------------------------------------------------\r\n   * Data Api implementation\r\n   * ------------------------------------------------------------------------\r\n   */\n\n\n  $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\r\n   * ------------------------------------------------------------------------\r\n   * jQuery\r\n   * ------------------------------------------------------------------------\r\n   */\n\n  $.fn[NAME] = Dropdown._jQueryInterface;\n  $.fn[NAME].Constructor = Dropdown;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Dropdown._jQueryInterface;\n  };\n\n  return Dropdown;\n}(jQuery);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Dropdown);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/external/dropdown.js?");

/***/ }),

/***/ "./src/external/modernizr.js":
/*!***********************************!*\
  !*** ./src/external/modernizr.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(module) {function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\n * modernizr v3.12.0\n * Build https://modernizr.com/download?-checked-json-supports-target-addtest-atrule-domprefixes-hasevent-load-mq-prefixed-prefixedcss-prefixes-printshiv-setclasses-testallprops-testprop-teststyles-dontmin\n *\n * Copyright (c)\n *  Faruk Ates\n *  Paul Irish\n *  Alex Sexton\n *  Ryan Seddon\n *  Patrick Kettner\n *  Stu Cox\n *  Richard Herrera\n *  Veeck\n\n * MIT License\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in the\n * current UA and makes the results available to you in two ways: as properties on\n * a global `Modernizr` object, and as classes on the `<html>` element. This\n * information allows you to progressively enhance your pages with a granular level\n * of control over the experience.\n*/\n;\n\n(function (scriptGlobalObject, window, document, undefined) {\n  var tests = [];\n  /**\n   * ModernizrProto is the constructor for Modernizr\n   *\n   * @class\n   * @access public\n   */\n\n  var ModernizrProto = {\n    _version: '3.12.0',\n    // Any settings that don't work as separate modules\n    // can go in here as configuration.\n    _config: {\n      'classPrefix': '',\n      'enableClasses': true,\n      'enableJSClass': true,\n      'usePrefixes': true\n    },\n    // Queue of tests\n    _q: [],\n    // Stub these for people who are listening\n    on: function on(test, cb) {\n      // I don't really think people should do this, but we can\n      // safe guard it a bit.\n      // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests.\n      // This is in case people listen to synchronous tests. I would leave it out,\n      // but the code to *disallow* sync tests in the real version of this\n      // function is actually larger than this.\n      var self = this;\n      setTimeout(function () {\n        cb(self[test]);\n      }, 0);\n    },\n    addTest: function addTest(name, fn, options) {\n      tests.push({\n        name: name,\n        fn: fn,\n        options: options\n      });\n    },\n    addAsyncTest: function addAsyncTest(fn) {\n      tests.push({\n        name: null,\n        fn: fn\n      });\n    }\n  }; // Fake some of Object.create so we can force non test results to be non \"own\" properties.\n\n  var Modernizr = function Modernizr() {};\n\n  Modernizr.prototype = ModernizrProto; // Leak modernizr globally when you `require` it rather than force it here.\n  // Overwrite name so constructor name is nicer :D\n\n  Modernizr = new Modernizr();\n  var classes = [];\n  /**\n   * is returns a boolean if the typeof an obj is exactly type.\n   *\n   * @access private\n   * @function is\n   * @param {*} obj - A thing we want to check the type of\n   * @param {string} type - A string to compare the typeof against\n   * @returns {boolean} true if the typeof the first parameter is exactly the specified type, false otherwise\n   */\n\n  function is(obj, type) {\n    return _typeof(obj) === type;\n  }\n\n  ;\n  /**\n   * Run through all tests and detect their support in the current UA.\n   *\n   * @access private\n   * @returns {void}\n   */\n\n  function testRunner() {\n    var featureNames;\n    var feature;\n    var aliasIdx;\n    var result;\n    var nameIdx;\n    var featureName;\n    var featureNameSplit;\n\n    for (var featureIdx in tests) {\n      if (tests.hasOwnProperty(featureIdx)) {\n        featureNames = [];\n        feature = tests[featureIdx]; // run the test, throw the return value into the Modernizr,\n        // then based on that boolean, define an appropriate className\n        // and push it into an array of classes we'll join later.\n        //\n        // If there is no name, it's an 'async' test that is run,\n        // but not directly added to the object. That should\n        // be done with a post-run addTest call.\n\n        if (feature.name) {\n          featureNames.push(feature.name.toLowerCase());\n\n          if (feature.options && feature.options.aliases && feature.options.aliases.length) {\n            // Add all the aliases into the names list\n            for (aliasIdx = 0; aliasIdx < feature.options.aliases.length; aliasIdx++) {\n              featureNames.push(feature.options.aliases[aliasIdx].toLowerCase());\n            }\n          }\n        } // Run the test, or use the raw value if it's not a function\n\n\n        result = is(feature.fn, 'function') ? feature.fn() : feature.fn; // Set each of the names on the Modernizr object\n\n        for (nameIdx = 0; nameIdx < featureNames.length; nameIdx++) {\n          featureName = featureNames[nameIdx]; // Support dot properties as sub tests. We don't do checking to make sure\n          // that the implied parent tests have been added. You must call them in\n          // order (either in the test, or make the parent test a dependency).\n          //\n          // Cap it to TWO to make the logic simple and because who needs that kind of subtesting\n          // hashtag famous last words\n\n          featureNameSplit = featureName.split('.');\n\n          if (featureNameSplit.length === 1) {\n            Modernizr[featureNameSplit[0]] = result;\n          } else {\n            // cast to a Boolean, if not one already or if it doesnt exist yet (like inputtypes)\n            if (!Modernizr[featureNameSplit[0]] || Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) {\n              Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]);\n            }\n\n            Modernizr[featureNameSplit[0]][featureNameSplit[1]] = result;\n          }\n\n          classes.push((result ? '' : 'no-') + featureNameSplit.join('-'));\n        }\n      }\n    }\n  }\n\n  ;\n  /**\n   * docElement is a convenience wrapper to grab the root element of the document\n   *\n   * @access private\n   * @returns {HTMLElement|SVGElement} The root element of the document\n   */\n\n  var docElement = document.documentElement;\n  /**\n   * A convenience helper to check if the document we are running in is an SVG document\n   *\n   * @access private\n   * @returns {boolean}\n   */\n\n  var isSVG = docElement.nodeName.toLowerCase() === 'svg';\n  /**\n   * setClasses takes an array of class names and adds them to the root element\n   *\n   * @access private\n   * @function setClasses\n   * @param {string[]} classes - Array of class names\n   */\n  // Pass in an and array of class names, e.g.:\n  //  ['no-webp', 'borderradius', ...]\n\n  function setClasses(classes) {\n    var className = docElement.className;\n    var classPrefix = Modernizr._config.classPrefix || '';\n\n    if (isSVG) {\n      className = className.baseVal;\n    } // Change `no-js` to `js` (independently of the `enableClasses` option)\n    // Handle classPrefix on this too\n\n\n    if (Modernizr._config.enableJSClass) {\n      var reJS = new RegExp('(^|\\\\s)' + classPrefix + 'no-js(\\\\s|$)');\n      className = className.replace(reJS, '$1' + classPrefix + 'js$2');\n    }\n\n    if (Modernizr._config.enableClasses) {\n      // Add the new classes\n      if (classes.length > 0) {\n        className += ' ' + classPrefix + classes.join(' ' + classPrefix);\n      }\n\n      if (isSVG) {\n        docElement.className.baseVal = className;\n      } else {\n        docElement.className = className;\n      }\n    }\n  }\n\n  ;\n  /**\n   * hasOwnProp is a shim for hasOwnProperty that is needed for Safari 2.0 support\n   *\n   * @author kangax\n   * @access private\n   * @function hasOwnProp\n   * @param {object} object - The object to check for a property\n   * @param {string} property - The property to check for\n   * @returns {boolean}\n   */\n  // hasOwnProperty shim by kangax needed for Safari 2.0 support\n\n  var hasOwnProp;\n\n  (function () {\n    var _hasOwnProperty = {}.hasOwnProperty;\n    /* istanbul ignore else */\n\n    /* we have no way of testing IE 5.5 or safari 2,\n     * so just assume the else gets hit */\n\n    if (!is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined')) {\n      hasOwnProp = function hasOwnProp(object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    } else {\n      hasOwnProp = function hasOwnProp(object, property) {\n        /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return property in object && is(object.constructor.prototype[property], 'undefined');\n      };\n    }\n  })(); // _l tracks listeners for async tests, as well as tests that execute after the initial run\n\n\n  ModernizrProto._l = {};\n  /**\n   * Modernizr.on is a way to listen for the completion of async tests. Being\n   * asynchronous, they may not finish before your scripts run. As a result you\n   * will get a possibly false negative `undefined` value.\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.on\n   * @access public\n   * @function on\n   * @param {string} feature - String name of the feature detect\n   * @param {Function} cb - Callback function returning a Boolean - true if feature is supported, false if not\n   * @returns {void}\n   * @example\n   *\n   * ```js\n   * Modernizr.on('flash', function( result ) {\n   *   if (result) {\n   *    // the browser has flash\n   *   } else {\n   *     // the browser does not have flash\n   *   }\n   * });\n   * ```\n   */\n\n  ModernizrProto.on = function (feature, cb) {\n    // Create the list of listeners if it doesn't exist\n    if (!this._l[feature]) {\n      this._l[feature] = [];\n    } // Push this test on to the listener list\n\n\n    this._l[feature].push(cb); // If it's already been resolved, trigger it on next tick\n\n\n    if (Modernizr.hasOwnProperty(feature)) {\n      // Next Tick\n      setTimeout(function () {\n        Modernizr._trigger(feature, Modernizr[feature]);\n      }, 0);\n    }\n  };\n  /**\n   * _trigger is the private function used to signal test completion and run any\n   * callbacks registered through [Modernizr.on](#modernizr-on)\n   *\n   * @memberOf Modernizr\n   * @name Modernizr._trigger\n   * @access private\n   * @function _trigger\n   * @param {string} feature - string name of the feature detect\n   * @param {Function|boolean} [res] - A feature detection function, or the boolean =\n   * result of a feature detection function\n   * @returns {void}\n   */\n\n\n  ModernizrProto._trigger = function (feature, res) {\n    if (!this._l[feature]) {\n      return;\n    }\n\n    var cbs = this._l[feature]; // Force async\n\n    setTimeout(function () {\n      var i, cb;\n\n      for (i = 0; i < cbs.length; i++) {\n        cb = cbs[i];\n        cb(res);\n      }\n    }, 0); // Don't trigger these again\n\n    delete this._l[feature];\n  };\n  /**\n   * addTest allows you to define your own feature detects that are not currently\n   * included in Modernizr (under the covers it's the exact same code Modernizr\n   * uses for its own [feature detections](https://github.com/Modernizr/Modernizr/tree/master/feature-detects)).\n   * Just like the official detects, the result\n   * will be added onto the Modernizr object, as well as an appropriate className set on\n   * the html element when configured to do so\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.addTest\n   * @optionName Modernizr.addTest()\n   * @optionProp addTest\n   * @access public\n   * @function addTest\n   * @param {string|object} feature - The string name of the feature detect, or an\n   * object of feature detect names and test\n   * @param {Function|boolean} test - Function returning true if feature is supported,\n   * false if not. Otherwise a boolean representing the results of a feature detection\n   * @returns {object} the Modernizr object to allow chaining\n   * @example\n   *\n   * The most common way of creating your own feature detects is by calling\n   * `Modernizr.addTest` with a string (preferably just lowercase, without any\n   * punctuation), and a function you want executed that will return a boolean result\n   *\n   * ```js\n   * Modernizr.addTest('itsTuesday', function() {\n   *  var d = new Date();\n   *  return d.getDay() === 2;\n   * });\n   * ```\n   *\n   * When the above is run, it will set Modernizr.itstuesday to `true` when it is tuesday,\n   * and to `false` every other day of the week. One thing to notice is that the names of\n   * feature detect functions are always lowercased when added to the Modernizr object. That\n   * means that `Modernizr.itsTuesday` will not exist, but `Modernizr.itstuesday` will.\n   *\n   *\n   *  Since we only look at the returned value from any feature detection function,\n   *  you do not need to actually use a function. For simple detections, just passing\n   *  in a statement that will return a boolean value works just fine.\n   *\n   * ```js\n   * Modernizr.addTest('hasjquery', 'jQuery' in window);\n   * ```\n   *\n   * Just like before, when the above runs `Modernizr.hasjquery` will be true if\n   * jQuery has been included on the page. Not using a function saves a small amount\n   * of overhead for the browser, as well as making your code much more readable.\n   *\n   * Finally, you also have the ability to pass in an object of feature names and\n   * their tests. This is handy if you want to add multiple detections in one go.\n   * The keys should always be a string, and the value can be either a boolean or\n   * function that returns a boolean.\n   *\n   * ```js\n   * var detects = {\n   *  'hasjquery': 'jQuery' in window,\n   *  'itstuesday': function() {\n   *    var d = new Date();\n   *    return d.getDay() === 2;\n   *  }\n   * }\n   *\n   * Modernizr.addTest(detects);\n   * ```\n   *\n   * There is really no difference between the first methods and this one, it is\n   * just a convenience to let you write more readable code.\n   */\n\n\n  function addTest(feature, test) {\n    if (_typeof(feature) === 'object') {\n      for (var key in feature) {\n        if (hasOwnProp(feature, key)) {\n          addTest(key, feature[key]);\n        }\n      }\n    } else {\n      feature = feature.toLowerCase();\n      var featureNameSplit = feature.split('.');\n      var last = Modernizr[featureNameSplit[0]]; // Again, we don't check for parent test existence. Get that right, though.\n\n      if (featureNameSplit.length === 2) {\n        last = last[featureNameSplit[1]];\n      }\n\n      if (typeof last !== 'undefined') {\n        // we're going to quit if you're trying to overwrite an existing test\n        // if we were to allow it, we'd do this:\n        //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n        //   docElement.className = docElement.className.replace( re, '' );\n        // but, no rly, stuff 'em.\n        return Modernizr;\n      }\n\n      test = typeof test === 'function' ? test() : test; // Set the value (this is the magic, right here).\n\n      if (featureNameSplit.length === 1) {\n        Modernizr[featureNameSplit[0]] = test;\n      } else {\n        // cast to a Boolean, if not one already\n        if (Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) {\n          Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]);\n        }\n\n        Modernizr[featureNameSplit[0]][featureNameSplit[1]] = test;\n      } // Set a single class (either `feature` or `no-feature`)\n\n\n      setClasses([(!!test && test !== false ? '' : 'no-') + featureNameSplit.join('-')]); // Trigger the event\n\n      Modernizr._trigger(feature, test);\n    }\n\n    return Modernizr; // allow chaining.\n  } // After all the tests are run, add self to the Modernizr prototype\n\n\n  Modernizr._q.push(function () {\n    ModernizrProto.addTest = addTest;\n  });\n  /**\n   * If the browsers follow the spec, then they would expose vendor-specific styles as:\n   *   elem.style.WebkitBorderRadius\n   * instead of something like the following (which is technically incorrect):\n   *   elem.style.webkitBorderRadius\n   *\n   * WebKit ghosts their properties in lowercase but Opera & Moz do not.\n   * Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n   *   erik.eae.net/archives/2008/03/10/21.48.10/\n   *\n   * More here: github.com/Modernizr/Modernizr/issues/issue/21\n   *\n   * @access private\n   * @returns {string} The string representing the vendor-specific style properties\n   */\n\n\n  var omPrefixes = 'Moz O ms Webkit';\n  var cssomPrefixes = ModernizrProto._config.usePrefixes ? omPrefixes.split(' ') : [];\n  ModernizrProto._cssomPrefixes = cssomPrefixes;\n  /**\n   * atRule returns a given CSS property at-rule (eg @keyframes), possibly in\n   * some prefixed form, or false, in the case of an unsupported rule\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.atRule\n   * @optionName Modernizr.atRule()\n   * @optionProp atRule\n   * @access public\n   * @function atRule\n   * @param {string} prop - String name of the @-rule to test for\n   * @returns {string|boolean} The string representing the (possibly prefixed)\n   * valid version of the @-rule, or `false` when it is unsupported.\n   * @example\n   * ```js\n   *  var keyframes = Modernizr.atRule('@keyframes');\n   *\n   *  if (keyframes) {\n   *    // keyframes are supported\n   *    // could be `@-webkit-keyframes` or `@keyframes`\n   *  } else {\n   *    // keyframes === `false`\n   *  }\n   * ```\n   */\n\n  var atRule = function atRule(prop) {\n    var length = prefixes.length;\n    var cssrule = window.CSSRule;\n    var rule;\n\n    if (typeof cssrule === 'undefined') {\n      return undefined;\n    }\n\n    if (!prop) {\n      return false;\n    } // remove literal @ from beginning of provided property\n\n\n    prop = prop.replace(/^@/, ''); // CSSRules use underscores instead of dashes\n\n    rule = prop.replace(/-/g, '_').toUpperCase() + '_RULE';\n\n    if (rule in cssrule) {\n      return '@' + prop;\n    }\n\n    for (var i = 0; i < length; i++) {\n      // prefixes gives us something like -o-, and we want O_\n      var prefix = prefixes[i];\n      var thisRule = prefix.toUpperCase() + '_' + rule;\n\n      if (thisRule in cssrule) {\n        return '@-' + prefix.toLowerCase() + '-' + prop;\n      }\n    }\n\n    return false;\n  };\n\n  ModernizrProto.atRule = atRule;\n  /**\n   * List of JavaScript DOM values used for tests\n   *\n   * @memberOf Modernizr\n   * @name Modernizr._domPrefixes\n   * @optionName Modernizr._domPrefixes\n   * @optionProp domPrefixes\n   * @access public\n   * @example\n   *\n   * Modernizr._domPrefixes is exactly the same as [_prefixes](#modernizr-_prefixes), but rather\n   * than hyphen-case properties, all properties are their Capitalized variant\n   *\n   * ```js\n   * Modernizr._domPrefixes === [ \"Moz\", \"O\", \"ms\", \"Webkit\" ];\n   * ```\n   */\n\n  var domPrefixes = ModernizrProto._config.usePrefixes ? omPrefixes.toLowerCase().split(' ') : [];\n  ModernizrProto._domPrefixes = domPrefixes;\n  /**\n   * createElement is a convenience wrapper around document.createElement. Since we\n   * use createElement all over the place, this allows for (slightly) smaller code\n   * as well as abstracting away issues with creating elements in contexts other than\n   * HTML documents (e.g. SVG documents).\n   *\n   * @access private\n   * @function createElement\n   * @returns {HTMLElement|SVGElement} An HTML or SVG element\n   */\n\n  function createElement() {\n    if (typeof document.createElement !== 'function') {\n      // This is the case in IE7, where the type of createElement is \"object\".\n      // For this reason, we cannot call apply() as Object is not a Function.\n      return document.createElement(arguments[0]);\n    } else if (isSVG) {\n      return document.createElementNS.call(document, 'http://www.w3.org/2000/svg', arguments[0]);\n    } else {\n      return document.createElement.apply(document, arguments);\n    }\n  }\n\n  ;\n  /**\n   * Modernizr.hasEvent() detects support for a given event\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.hasEvent\n   * @optionName Modernizr.hasEvent()\n   * @optionProp hasEvent\n   * @access public\n   * @function hasEvent\n   * @param {string|*} eventName - the name of an event to test for (e.g. \"resize\")\n   * @param {Element|string} [element=HTMLDivElement] - is the element|document|window|tagName to test on\n   * @returns {boolean}\n   * @example\n   *  `Modernizr.hasEvent` lets you determine if the browser supports a supplied event.\n   *  By default, it does this detection on a div element\n   *\n   * ```js\n   *  hasEvent('blur') // true;\n   * ```\n   *\n   * However, you are able to give an object as a second argument to hasEvent to\n   * detect an event on something other than a div.\n   *\n   * ```js\n   *  hasEvent('devicelight', window) // true;\n   * ```\n   */\n\n  var hasEvent = function () {\n    // Detect whether event support can be detected via `in`. Test on a DOM element\n    // using the \"blur\" event b/c it should always exist. bit.ly/event-detection\n    var needsFallback = !('onblur' in docElement);\n\n    function inner(eventName, element) {\n      var isSupported;\n\n      if (!eventName) {\n        return false;\n      }\n\n      if (!element || typeof element === 'string') {\n        element = createElement(element || 'div');\n      } // Testing via the `in` operator is sufficient for modern browsers and IE.\n      // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and\n      // \"resize\", whereas `in` \"catches\" those.\n\n\n      eventName = 'on' + eventName;\n      isSupported = eventName in element; // Fallback technique for old Firefox - bit.ly/event-detection\n\n      if (!isSupported && needsFallback) {\n        if (!element.setAttribute) {\n          // Switch to generic element if it lacks `setAttribute`.\n          // It could be the `document`, `window`, or something else.\n          element = createElement('div');\n        }\n\n        element.setAttribute(eventName, '');\n        isSupported = typeof element[eventName] === 'function';\n\n        if (element[eventName] !== undefined) {\n          // If property was created, \"remove it\" by setting value to `undefined`.\n          element[eventName] = undefined;\n        }\n\n        element.removeAttribute(eventName);\n      }\n\n      return isSupported;\n    }\n\n    return inner;\n  }();\n\n  ModernizrProto.hasEvent = hasEvent;\n  /**\n   * @optionName html5printshiv\n   * @optionProp html5printshiv\n   */\n  // Take the html5 variable out of the html5shiv scope so we can return it.\n\n  var html5;\n\n  if (!isSVG) {\n    /**\n     * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n     */\n    ;\n\n    (function (window, document) {\n      /*jshint evil:true */\n\n      /** version */\n      var version = '3.7.3';\n      /** Preset options */\n\n      var options = window.html5 || {};\n      /** Used to skip problem elements */\n\n      var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n      /** Not all elements can be cloned in IE **/\n\n      var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n      /** Detect whether the browser supports default html5 styles */\n\n      var supportsHtml5Styles;\n      /** Name of the expando, to work with multiple documents or to re-shiv one document */\n\n      var expando = '_html5shiv';\n      /** The id for the the documents expando */\n\n      var expanID = 0;\n      /** Cached data for each document */\n\n      var expandoData = {};\n      /** Detect whether the browser supports unknown elements */\n\n      var supportsUnknownElements;\n\n      (function () {\n        try {\n          var a = document.createElement('a');\n          a.innerHTML = '<xyz></xyz>'; //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n\n          supportsHtml5Styles = 'hidden' in a;\n\n          supportsUnknownElements = a.childNodes.length == 1 || function () {\n            // assign a false positive if unable to shiv\n            document.createElement('a');\n            var frag = document.createDocumentFragment();\n            return typeof frag.cloneNode == 'undefined' || typeof frag.createDocumentFragment == 'undefined' || typeof frag.createElement == 'undefined';\n          }();\n        } catch (e) {\n          // assign a false positive if detection fails => unable to shiv\n          supportsHtml5Styles = true;\n          supportsUnknownElements = true;\n        }\n      })();\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n\n\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n\n\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n      /**\n       * Extends the built-in list of html5 elements\n       * @memberOf html5\n       * @param {String|Array} newElements whitespace separated list or array of new element names to shiv\n       * @param {Document} ownerDocument The context document.\n       */\n\n\n      function addElements(newElements, ownerDocument) {\n        var elements = html5.elements;\n\n        if (typeof elements != 'string') {\n          elements = elements.join(' ');\n        }\n\n        if (typeof newElements != 'string') {\n          newElements = newElements.join(' ');\n        }\n\n        html5.elements = elements + ' ' + newElements;\n        shivDocument(ownerDocument);\n      }\n      /**\n       * Returns the data associated to the given document\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Object} An object of data.\n       */\n\n\n      function getExpandoData(ownerDocument) {\n        var data = expandoData[ownerDocument[expando]];\n\n        if (!data) {\n          data = {};\n          expanID++;\n          ownerDocument[expando] = expanID;\n          expandoData[expanID] = data;\n        }\n\n        return data;\n      }\n      /**\n       * returns a shived element for the given nodeName and document\n       * @memberOf html5\n       * @param {String} nodeName name of the element\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived element.\n       */\n\n\n      function createElement(nodeName, ownerDocument, data) {\n        if (!ownerDocument) {\n          ownerDocument = document;\n        }\n\n        if (supportsUnknownElements) {\n          return ownerDocument.createElement(nodeName);\n        }\n\n        if (!data) {\n          data = getExpandoData(ownerDocument);\n        }\n\n        var node;\n\n        if (data.cache[nodeName]) {\n          node = data.cache[nodeName].cloneNode();\n        } else if (saveClones.test(nodeName)) {\n          node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n        } else {\n          node = data.createElem(nodeName);\n        } // Avoid adding some elements to fragments in IE < 9 because\n        // * Attributes like `name` or `type` cannot be set/changed once an element\n        //   is inserted into a document/fragment\n        // * Link elements with `src` attributes that are inaccessible, as with\n        //   a 403 response, will cause the tab/window to crash\n        // * Script elements appended to fragments will execute when their `src`\n        //   or `text` property is set\n\n\n        return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;\n      }\n      /**\n       * returns a shived DocumentFragment for the given document\n       * @memberOf html5\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived DocumentFragment.\n       */\n\n\n      function createDocumentFragment(ownerDocument, data) {\n        if (!ownerDocument) {\n          ownerDocument = document;\n        }\n\n        if (supportsUnknownElements) {\n          return ownerDocument.createDocumentFragment();\n        }\n\n        data = data || getExpandoData(ownerDocument);\n        var clone = data.frag.cloneNode(),\n            i = 0,\n            elems = getElements(),\n            l = elems.length;\n\n        for (; i < l; i++) {\n          clone.createElement(elems[i]);\n        }\n\n        return clone;\n      }\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       * @param {Object} data of the document.\n       */\n\n\n      function shivMethods(ownerDocument, data) {\n        if (!data.cache) {\n          data.cache = {};\n          data.createElem = ownerDocument.createElement;\n          data.createFrag = ownerDocument.createDocumentFragment;\n          data.frag = data.createFrag();\n        }\n\n        ownerDocument.createElement = function (nodeName) {\n          //abort shiv\n          if (!html5.shivMethods) {\n            return data.createElem(nodeName);\n          }\n\n          return createElement(nodeName, ownerDocument, data);\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' + 'var n=f.cloneNode(),c=n.createElement;' + 'h.shivMethods&&(' + // unroll the `createElement` calls\n        getElements().join().replace(/[\\w\\-:]+/g, function (nodeName) {\n          data.createElem(nodeName);\n          data.frag.createElement(nodeName);\n          return 'c(\"' + nodeName + '\")';\n        }) + ');return n}')(html5, data.frag);\n      }\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n\n\n      function shivDocument(ownerDocument) {\n        if (!ownerDocument) {\n          ownerDocument = document;\n        }\n\n        var data = getExpandoData(ownerDocument);\n\n        if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n          data.hasCSS = !!addStyleSheet(ownerDocument, // corrects block display not defined in IE6/7/8/9\n          'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' + // adds styling not present in IE6/7/8/9\n          'mark{background:#FF0;color:#000}' + // hides non-rendered elements\n          'template{display:none}');\n        }\n\n        if (!supportsUnknownElements) {\n          shivMethods(ownerDocument, data);\n        }\n\n        return ownerDocument;\n      }\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n\n\n      var html5 = {\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',\n\n        /**\n         * current version of html5shiv\n         */\n        'version': version,\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': options.shivCSS !== false,\n\n        /**\n         * Is equal to true if a browser supports creating unknown/HTML5 elements\n         * @memberOf html5\n         * @type boolean\n         */\n        'supportsUnknownElements': supportsUnknownElements,\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': options.shivMethods !== false,\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument,\n        //creates a shived element\n        createElement: createElement,\n        //creates a shived documentFragment\n        createDocumentFragment: createDocumentFragment,\n        //extends list of elements\n        addElements: addElements\n      };\n      /*--------------------------------------------------------------------------*/\n      // expose html5\n\n      window.html5 = html5; // shiv the document\n\n      shivDocument(document);\n      /*------------------------------- Print Shiv -------------------------------*/\n\n      /** Used to filter media types */\n\n      var reMedia = /^$|\\b(?:all|print)\\b/;\n      /** Used to namespace printable elements */\n\n      var shivNamespace = 'html5shiv';\n      /** Detect whether the browser supports shivable style sheets */\n\n      var supportsShivableSheets = !supportsUnknownElements && function () {\n        // assign a false negative if unable to shiv\n        var docEl = document.documentElement;\n        return !(typeof document.namespaces == 'undefined' || typeof document.parentWindow == 'undefined' || typeof docEl.applyElement == 'undefined' || typeof docEl.removeNode == 'undefined' || typeof window.attachEvent == 'undefined');\n      }();\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Wraps all HTML5 elements in the given document with printable elements.\n       * (eg. the \"header\" element is wrapped with the \"html5shiv:header\" element)\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Array} An array wrappers added.\n       */\n\n\n      function addWrappers(ownerDocument) {\n        var node,\n            nodes = ownerDocument.getElementsByTagName('*'),\n            index = nodes.length,\n            reElements = RegExp('^(?:' + getElements().join('|') + ')$', 'i'),\n            result = [];\n\n        while (index--) {\n          node = nodes[index];\n\n          if (reElements.test(node.nodeName)) {\n            result.push(node.applyElement(createWrapper(node)));\n          }\n        }\n\n        return result;\n      }\n      /**\n       * Creates a printable wrapper for the given element.\n       * @private\n       * @param {Element} element The element.\n       * @returns {Element} The wrapper.\n       */\n\n\n      function createWrapper(element) {\n        var node,\n            nodes = element.attributes,\n            index = nodes.length,\n            wrapper = element.ownerDocument.createElement(shivNamespace + ':' + element.nodeName); // copy element attributes to the wrapper\n\n        while (index--) {\n          node = nodes[index];\n          node.specified && wrapper.setAttribute(node.nodeName, node.nodeValue);\n        } // copy element styles to the wrapper\n\n\n        wrapper.style.cssText = element.style.cssText;\n        return wrapper;\n      }\n      /**\n       * Shivs the given CSS text.\n       * (eg. header{} becomes html5shiv\\:header{})\n       * @private\n       * @param {String} cssText The CSS text to shiv.\n       * @returns {String} The shived CSS text.\n       */\n\n\n      function shivCssText(cssText) {\n        var pair,\n            parts = cssText.split('{'),\n            index = parts.length,\n            reElements = RegExp('(^|[\\\\s,>+~])(' + getElements().join('|') + ')(?=[[\\\\s,>+~#.:]|$)', 'gi'),\n            replacement = '$1' + shivNamespace + '\\\\:$2';\n\n        while (index--) {\n          pair = parts[index] = parts[index].split('}');\n          pair[pair.length - 1] = pair[pair.length - 1].replace(reElements, replacement);\n          parts[index] = pair.join('}');\n        }\n\n        return parts.join('{');\n      }\n      /**\n       * Removes the given wrappers, leaving the original elements.\n       * @private\n       * @params {Array} wrappers An array of printable wrappers.\n       */\n\n\n      function removeWrappers(wrappers) {\n        var index = wrappers.length;\n\n        while (index--) {\n          wrappers[index].removeNode();\n        }\n      }\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document for print.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n\n\n      function shivPrint(ownerDocument) {\n        var shivedSheet,\n            wrappers,\n            data = getExpandoData(ownerDocument),\n            namespaces = ownerDocument.namespaces,\n            ownerWindow = ownerDocument.parentWindow;\n\n        if (!supportsShivableSheets || ownerDocument.printShived) {\n          return ownerDocument;\n        }\n\n        if (typeof namespaces[shivNamespace] == 'undefined') {\n          namespaces.add(shivNamespace);\n        }\n\n        function removeSheet() {\n          clearTimeout(data._removeSheetTimer);\n\n          if (shivedSheet) {\n            shivedSheet.removeNode(true);\n          }\n\n          shivedSheet = null;\n        }\n\n        ownerWindow.attachEvent('onbeforeprint', function () {\n          removeSheet();\n          var imports,\n              length,\n              sheet,\n              collection = ownerDocument.styleSheets,\n              cssText = [],\n              index = collection.length,\n              sheets = Array(index); // convert styleSheets collection to an array\n\n          while (index--) {\n            sheets[index] = collection[index];\n          } // concat all style sheet CSS text\n\n\n          while (sheet = sheets.pop()) {\n            // IE does not enforce a same origin policy for external style sheets...\n            // but has trouble with some dynamically created stylesheets\n            if (!sheet.disabled && reMedia.test(sheet.media)) {\n              try {\n                imports = sheet.imports;\n                length = imports.length;\n              } catch (er) {\n                length = 0;\n              }\n\n              for (index = 0; index < length; index++) {\n                sheets.push(imports[index]);\n              }\n\n              try {\n                cssText.push(sheet.cssText);\n              } catch (er) {}\n            }\n          } // wrap all HTML5 elements with printable elements and add the shived style sheet\n\n\n          cssText = shivCssText(cssText.reverse().join(''));\n          wrappers = addWrappers(ownerDocument);\n          shivedSheet = addStyleSheet(ownerDocument, cssText);\n        });\n        ownerWindow.attachEvent('onafterprint', function () {\n          // remove wrappers, leaving the original elements, and remove the shived style sheet\n          removeWrappers(wrappers);\n          clearTimeout(data._removeSheetTimer);\n          data._removeSheetTimer = setTimeout(removeSheet, 500);\n        });\n        ownerDocument.printShived = true;\n        return ownerDocument;\n      }\n      /*--------------------------------------------------------------------------*/\n      // expose API\n\n\n      html5.type += ' print';\n      html5.shivPrint = shivPrint; // shiv for print\n\n      shivPrint(document);\n\n      if (( false ? undefined : _typeof(module)) == 'object' && module.exports) {\n        module.exports = html5;\n      }\n    })(typeof window !== \"undefined\" ? window : this, document);\n  }\n\n  ;\n\n  var err = function err() {};\n\n  var warn = function warn() {};\n\n  if (window.console) {\n    err = function err() {\n      var method = console.error ? 'error' : 'log';\n      window.console[method].apply(window.console, Array.prototype.slice.call(arguments));\n    };\n\n    warn = function warn() {\n      var method = console.warn ? 'warn' : 'log';\n      window.console[method].apply(window.console, Array.prototype.slice.call(arguments));\n    };\n  }\n  /**\n   * Previously, Modernizr.load was an alias for yepnope. Since yepnope was\n   * deprecated, we removed it as well. It is not available on the website builder,\n   * this is only included as an improved warning to those who build a custom\n   * version locally.\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.load\n   * @function load\n   * @returns {void}\n   */\n\n\n  ModernizrProto.load = function () {\n    if ('yepnope' in window) {\n      warn('yepnope.js (aka Modernizr.load) is no longer included as part of Modernizr. yepnope appears to be available on the page, so we’ll use it to handle this call to Modernizr.load, but please update your code to use yepnope directly.\\n See http://github.com/Modernizr/Modernizr/issues/1182 for more information.');\n      window.yepnope.apply(window, [].slice.call(arguments, 0));\n    } else {\n      err('yepnope.js (aka Modernizr.load) is no longer included as part of Modernizr. Get it from http://yepnopejs.com. See http://github.com/Modernizr/Modernizr/issues/1182 for more information.');\n    }\n  };\n  /**\n   * getBody returns the body of a document, or an element that can stand in for\n   * the body if a real body does not exist\n   *\n   * @access private\n   * @function getBody\n   * @returns {HTMLElement|SVGElement} Returns the real body of a document, or an\n   * artificially created element that stands in for the body\n   */\n\n\n  function getBody() {\n    // After page load injecting a fake body doesn't work so check if body exists\n    var body = document.body;\n\n    if (!body) {\n      // Can't use the real body create a fake one.\n      body = createElement(isSVG ? 'svg' : 'body');\n      body.fake = true;\n    }\n\n    return body;\n  }\n\n  ;\n  /**\n   * injectElementWithStyles injects an element with style element and some CSS rules\n   *\n   * @access private\n   * @function injectElementWithStyles\n   * @param {string} rule - String representing a css rule\n   * @param {Function} callback - A function that is used to test the injected element\n   * @param {number} [nodes] - An integer representing the number of additional nodes you want injected\n   * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes\n   * @returns {boolean} the result of the specified callback test\n   */\n\n  function injectElementWithStyles(rule, callback, nodes, testnames) {\n    var mod = 'modernizr';\n    var style;\n    var ret;\n    var node;\n    var docOverflow;\n    var div = createElement('div');\n    var body = getBody();\n\n    if (parseInt(nodes, 10)) {\n      // In order not to give false positives we create a node for each test\n      // This also allows the method to scale for unspecified uses\n      while (nodes--) {\n        node = createElement('div');\n        node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n        div.appendChild(node);\n      }\n    }\n\n    style = createElement('style');\n    style.type = 'text/css';\n    style.id = 's' + mod; // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n    // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n\n    (!body.fake ? div : body).appendChild(style);\n    body.appendChild(div);\n\n    if (style.styleSheet) {\n      style.styleSheet.cssText = rule;\n    } else {\n      style.appendChild(document.createTextNode(rule));\n    }\n\n    div.id = mod;\n\n    if (body.fake) {\n      //avoid crashing IE8, if background image is used\n      body.style.background = ''; //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n\n      body.style.overflow = 'hidden';\n      docOverflow = docElement.style.overflow;\n      docElement.style.overflow = 'hidden';\n      docElement.appendChild(body);\n    }\n\n    ret = callback(div, rule); // If this is done after page load we don't want to remove the body so check if body exists\n\n    if (body.fake && body.parentNode) {\n      body.parentNode.removeChild(body);\n      docElement.style.overflow = docOverflow; // Trigger layout so kinetic scrolling isn't disabled in iOS6+\n      // eslint-disable-next-line\n\n      docElement.offsetHeight;\n    } else {\n      div.parentNode.removeChild(div);\n    }\n\n    return !!ret;\n  }\n\n  ;\n  /**\n   * wrapper around getComputedStyle, to fix issues with Firefox returning null when\n   * called inside of a hidden iframe\n   *\n   * @access private\n   * @function computedStyle\n   * @param {HTMLElement|SVGElement} elem - The element we want to find the computed styles of\n   * @param {string|null} [pseudo] - An optional pseudo element selector (e.g. :before), of null if none\n   * @param {string} prop - A CSS property\n   * @returns {CSSStyleDeclaration} the value of the specified CSS property\n   */\n\n  function computedStyle(elem, pseudo, prop) {\n    var result;\n\n    if ('getComputedStyle' in window) {\n      result = getComputedStyle.call(window, elem, pseudo);\n      var console = window.console;\n\n      if (result !== null) {\n        if (prop) {\n          result = result.getPropertyValue(prop);\n        }\n      } else {\n        if (console) {\n          var method = console.error ? 'error' : 'log';\n          console[method].call(console, 'getComputedStyle returning null, its possible modernizr test results are inaccurate');\n        }\n      }\n    } else {\n      result = !pseudo && elem.currentStyle && elem.currentStyle[prop];\n    }\n\n    return result;\n  }\n\n  ;\n  /**\n   * Modernizr.mq tests a given media query, live against the current state of the window\n   * adapted from matchMedia polyfill by Scott Jehl and Paul Irish\n   * gist.github.com/786768\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.mq\n   * @optionName Modernizr.mq()\n   * @optionProp mq\n   * @access public\n   * @function mq\n   * @param {string} mq - String of the media query we want to test\n   * @returns {boolean}\n   * @example\n   * Modernizr.mq allows for you to programmatically check if the current browser\n   * window state matches a media query.\n   *\n   * ```js\n   *  var query = Modernizr.mq('(min-width: 900px)');\n   *\n   *  if (query) {\n   *    // the browser window is larger than 900px\n   *  }\n   * ```\n   *\n   * Only valid media queries are supported, therefore you must always include values\n   * with your media query\n   *\n   * ```js\n   * // good\n   *  Modernizr.mq('(min-width: 900px)');\n   *\n   * // bad\n   *  Modernizr.mq('min-width');\n   * ```\n   *\n   * If you would just like to test that media queries are supported in general, use\n   *\n   * ```js\n   *  Modernizr.mq('only all'); // true if MQ are supported, false if not\n   * ```\n   *\n   * Note that if the browser does not support media queries (e.g. old IE) mq will\n   * always return false.\n   */\n\n  var mq = function () {\n    var matchMedia = window.matchMedia || window.msMatchMedia;\n\n    if (matchMedia) {\n      return function (mq) {\n        var mql = matchMedia(mq);\n        return mql && mql.matches || false;\n      };\n    }\n\n    return function (mq) {\n      var bool = false;\n      injectElementWithStyles('@media ' + mq + ' { #modernizr { position: absolute; } }', function (node) {\n        bool = computedStyle(node, null, 'position') === 'absolute';\n      });\n      return bool;\n    };\n  }();\n\n  ModernizrProto.mq = mq;\n  /**\n   * contains checks to see if a string contains another string\n   *\n   * @access private\n   * @function contains\n   * @param {string} str - The string we want to check for substrings\n   * @param {string} substr - The substring we want to search the first string for\n   * @returns {boolean} true if and only if the first string 'str' contains the second string 'substr'\n   */\n\n  function contains(str, substr) {\n    return !!~('' + str).indexOf(substr);\n  }\n\n  ;\n  /**\n   * Create our \"modernizr\" element that we do most feature tests on.\n   *\n   * @access private\n   */\n\n  var modElem = {\n    elem: createElement('modernizr')\n  }; // Clean up this element\n\n  Modernizr._q.push(function () {\n    delete modElem.elem;\n  });\n\n  var mStyle = {\n    style: modElem.elem.style\n  }; // kill ref for gc, must happen before mod.elem is removed, so we unshift on to\n  // the front of the queue.\n\n  Modernizr._q.unshift(function () {\n    delete mStyle.style;\n  });\n  /**\n   * domToCSS takes a camelCase string and converts it to hyphen-case\n   * e.g. boxSizing -> box-sizing\n   *\n   * @access private\n   * @function domToCSS\n   * @param {string} name - String name of camelCase prop we want to convert\n   * @returns {string} The hyphen-case version of the supplied name\n   */\n\n\n  function domToCSS(name) {\n    return name.replace(/([A-Z])/g, function (str, m1) {\n      return '-' + m1.toLowerCase();\n    }).replace(/^ms-/, '-ms-');\n  }\n\n  ;\n  /**\n   * nativeTestProps allows for us to use native feature detection functionality if available.\n   * some prefixed form, or false, in the case of an unsupported rule\n   *\n   * @access private\n   * @function nativeTestProps\n   * @param {Array} props - An array of property names\n   * @param {string} value - A string representing the value we want to check via @supports\n   * @returns {boolean|undefined} A boolean when @supports exists, undefined otherwise\n   */\n  // Accepts a list of property names and a single value\n  // Returns `undefined` if native detection not available\n\n  function nativeTestProps(props, value) {\n    var i = props.length; // Start with the JS API: https://www.w3.org/TR/css3-conditional/#the-css-interface\n\n    if ('CSS' in window && 'supports' in window.CSS) {\n      // Try every prefixed variant of the property\n      while (i--) {\n        if (window.CSS.supports(domToCSS(props[i]), value)) {\n          return true;\n        }\n      }\n\n      return false;\n    } // Otherwise fall back to at-rule (for Opera 12.x)\n    else if ('CSSSupportsRule' in window) {\n      // Build a condition string for every prefixed variant\n      var conditionText = [];\n\n      while (i--) {\n        conditionText.push('(' + domToCSS(props[i]) + ':' + value + ')');\n      }\n\n      conditionText = conditionText.join(' or ');\n      return injectElementWithStyles('@supports (' + conditionText + ') { #modernizr { position: absolute; } }', function (node) {\n        return computedStyle(node, null, 'position') === 'absolute';\n      });\n    }\n\n    return undefined;\n  }\n\n  ;\n  /**\n   * cssToDOM takes a hyphen-case string and converts it to camelCase\n   * e.g. box-sizing -> boxSizing\n   *\n   * @access private\n   * @function cssToDOM\n   * @param {string} name - String name of hyphen-case prop we want to convert\n   * @returns {string} The camelCase version of the supplied name\n   */\n\n  function cssToDOM(name) {\n    return name.replace(/([a-z])-([a-z])/g, function (str, m1, m2) {\n      return m1 + m2.toUpperCase();\n    }).replace(/^-/, '');\n  }\n\n  ; // testProps is a generic CSS / DOM property test.\n  // In testing support for a given CSS property, it's legit to test:\n  //    `elem.style[styleName] !== undefined`\n  // If the property is supported it will return an empty string,\n  // if unsupported it will return undefined.\n  // We'll take advantage of this quick test and skip setting a style\n  // on our modernizr element, but instead just testing undefined vs\n  // empty string.\n  // Property names can be provided in either camelCase or hyphen-case.\n\n  function testProps(props, prefixed, value, skipValueTest) {\n    skipValueTest = is(skipValueTest, 'undefined') ? false : skipValueTest; // Try native detect first\n\n    if (!is(value, 'undefined')) {\n      var result = nativeTestProps(props, value);\n\n      if (!is(result, 'undefined')) {\n        return result;\n      }\n    } // Otherwise do it properly\n\n\n    var afterInit, i, propsLength, prop, before; // If we don't have a style element, that means we're running async or after\n    // the core tests, so we'll need to create our own elements to use.\n    // Inside of an SVG element, in certain browsers, the `style` element is only\n    // defined for valid tags. Therefore, if `modernizr` does not have one, we\n    // fall back to a less used element and hope for the best.\n    // For strict XHTML browsers the hardly used samp element is used.\n\n    var elems = ['modernizr', 'tspan', 'samp'];\n\n    while (!mStyle.style && elems.length) {\n      afterInit = true;\n      mStyle.modElem = createElement(elems.shift());\n      mStyle.style = mStyle.modElem.style;\n    } // Delete the objects if we created them.\n\n\n    function cleanElems() {\n      if (afterInit) {\n        delete mStyle.style;\n        delete mStyle.modElem;\n      }\n    }\n\n    propsLength = props.length;\n\n    for (i = 0; i < propsLength; i++) {\n      prop = props[i];\n      before = mStyle.style[prop];\n\n      if (contains(prop, '-')) {\n        prop = cssToDOM(prop);\n      }\n\n      if (mStyle.style[prop] !== undefined) {\n        // If value to test has been passed in, do a set-and-check test.\n        // 0 (integer) is a valid property value, so check that `value` isn't\n        // undefined, rather than just checking it's truthy.\n        if (!skipValueTest && !is(value, 'undefined')) {\n          // Needs a try catch block because of old IE. This is slow, but will\n          // be avoided in most cases because `skipValueTest` will be used.\n          try {\n            mStyle.style[prop] = value;\n          } catch (e) {} // If the property value has changed, we assume the value used is\n          // supported. If `value` is empty string, it'll fail here (because\n          // it hasn't changed), which matches how browsers have implemented\n          // CSS.supports()\n\n\n          if (mStyle.style[prop] !== before) {\n            cleanElems();\n            return prefixed === 'pfx' ? prop : true;\n          }\n        } // Otherwise just return true, or the property name if this is a\n        // `prefixed()` call\n        else {\n          cleanElems();\n          return prefixed === 'pfx' ? prop : true;\n        }\n      }\n    }\n\n    cleanElems();\n    return false;\n  }\n\n  ;\n  /**\n   * fnBind is a super small [bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) polyfill.\n   *\n   * @access private\n   * @function fnBind\n   * @param {Function} fn - a function you want to change `this` reference to\n   * @param {object} that - the `this` you want to call the function with\n   * @returns {Function} The wrapped version of the supplied function\n   */\n\n  function fnBind(fn, that) {\n    return function () {\n      return fn.apply(that, arguments);\n    };\n  }\n\n  ;\n  /**\n   * testDOMProps is a generic DOM property test; if a browser supports\n   *   a certain property, it won't return undefined for it.\n   *\n   * @access private\n   * @function testDOMProps\n   * @param {Array<string>} props - An array of properties to test for\n   * @param {object} obj - An object or Element you want to use to test the parameters again\n   * @param {boolean|object} elem - An Element to bind the property lookup again. Use `false` to prevent the check\n   * @returns {boolean|*} returns `false` if the prop is unsupported, otherwise the value that is supported\n   */\n\n  function testDOMProps(props, obj, elem) {\n    var item;\n\n    for (var i in props) {\n      if (props[i] in obj) {\n        // return the property name as a string\n        if (elem === false) {\n          return props[i];\n        }\n\n        item = obj[props[i]]; // let's bind a function\n\n        if (is(item, 'function')) {\n          // bind to obj unless overridden\n          return fnBind(item, elem || obj);\n        } // return the unbound function or obj or value\n\n\n        return item;\n      }\n    }\n\n    return false;\n  }\n\n  ;\n  /**\n   * testPropsAll tests a list of DOM properties we want to check against.\n   * We specify literally ALL possible (known and/or likely) properties on\n   * the element including the non-vendor prefixed one, for forward-\n   * compatibility.\n   *\n   * @access private\n   * @function testPropsAll\n   * @param {string} prop - A string of the property to test for\n   * @param {string|object} [prefixed] - An object to check the prefixed properties on. Use a string to skip\n   * @param {HTMLElement|SVGElement} [elem] - An element used to test the property and value against\n   * @param {string} [value] - A string of a css value\n   * @param {boolean} [skipValueTest] - An boolean representing if you want to test if value sticks when set\n   * @returns {string|boolean} returns the string version of the property, or `false` if it is unsupported\n   */\n\n  function testPropsAll(prop, prefixed, elem, value, skipValueTest) {\n    var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),\n        props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); // did they call .prefixed('boxSizing') or are we just testing a prop?\n\n    if (is(prefixed, 'string') || is(prefixed, 'undefined')) {\n      return testProps(props, prefixed, value, skipValueTest); // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n    } else {\n      props = (prop + ' ' + domPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n      return testDOMProps(props, prefixed, elem);\n    }\n  } // Modernizr.testAllProps() investigates whether a given style property,\n  // or any of its vendor-prefixed variants, is recognized\n  //\n  // Note that the property names must be provided in the camelCase variant.\n  // Modernizr.testAllProps('boxSizing')\n\n\n  ModernizrProto.testAllProps = testPropsAll;\n  /**\n   * prefixed returns the prefixed or nonprefixed property name variant of your input\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.prefixed\n   * @optionName Modernizr.prefixed()\n   * @optionProp prefixed\n   * @access public\n   * @function prefixed\n   * @param {string} prop - String name of the property to test for\n   * @param {object} [obj] - An object to test for the prefixed properties on\n   * @param {HTMLElement} [elem] - An element used to test specific properties against\n   * @returns {string|boolean} The string representing the (possibly prefixed) valid\n   * version of the property, or `false` when it is unsupported.\n   * @example\n   *\n   * Modernizr.prefixed takes a string css value in the DOM style camelCase (as\n   * opposed to the css style hyphen-case) form and returns the (possibly prefixed)\n   * version of that property that the browser actually supports.\n   *\n   * For example, in older Firefox...\n   * ```js\n   * prefixed('boxSizing')\n   * ```\n   * returns 'MozBoxSizing'\n   *\n   * In newer Firefox, as well as any other browser that support the unprefixed\n   * version would simply return `boxSizing`. Any browser that does not support\n   * the property at all, it will return `false`.\n   *\n   * By default, prefixed is checked against a DOM element. If you want to check\n   * for a property on another object, just pass it as a second argument\n   *\n   * ```js\n   * var rAF = prefixed('requestAnimationFrame', window);\n   *\n   * raf(function() {\n   *  renderFunction();\n   * })\n   * ```\n   *\n   * Note that this will return _the actual function_ - not the name of the function.\n   * If you need the actual name of the property, pass in `false` as a third argument\n   *\n   * ```js\n   * var rAFProp = prefixed('requestAnimationFrame', window, false);\n   *\n   * rafProp === 'WebkitRequestAnimationFrame' // in older webkit\n   * ```\n   *\n   * One common use case for prefixed is if you're trying to determine which transition\n   * end event to bind to, you might do something like...\n   * ```js\n   * var transEndEventNames = {\n   *     'WebkitTransition' : 'webkitTransitionEnd', * Saf 6, Android Browser\n   *     'MozTransition'    : 'transitionend',       * only for FF < 15\n   *     'transition'       : 'transitionend'        * IE10, Opera, Chrome, FF 15+, Saf 7+\n   * };\n   *\n   * var transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n   * ```\n   *\n   * If you want a similar lookup, but in hyphen-case, you can use [prefixedCSS](#modernizr-prefixedcss).\n   */\n\n  var prefixed = ModernizrProto.prefixed = function (prop, obj, elem) {\n    if (prop.indexOf('@') === 0) {\n      return atRule(prop);\n    }\n\n    if (prop.indexOf('-') !== -1) {\n      // Convert hyphen-case to camelCase\n      prop = cssToDOM(prop);\n    }\n\n    if (!obj) {\n      return testPropsAll(prop, 'pfx');\n    } else {\n      // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n      return testPropsAll(prop, obj, elem);\n    }\n  };\n  /**\n   * List of property values to set for css tests. See ticket #21\n   * https://github.com/modernizr/modernizr/issues/21\n   *\n   * @memberOf Modernizr\n   * @name Modernizr._prefixes\n   * @optionName Modernizr._prefixes\n   * @optionProp prefixes\n   * @access public\n   * @example\n   *\n   * Modernizr._prefixes is the internal list of prefixes that we test against\n   * inside of things like [prefixed](#modernizr-prefixed) and [prefixedCSS](#-code-modernizr-prefixedcss). It is simply\n   * an array of hyphen-case vendor prefixes you can use within your code.\n   *\n   * Some common use cases include\n   *\n   * Generating all possible prefixed version of a CSS property\n   * ```js\n   * var rule = Modernizr._prefixes.join('transform: rotate(20deg); ');\n   *\n   * rule === 'transform: rotate(20deg); webkit-transform: rotate(20deg); moz-transform: rotate(20deg); o-transform: rotate(20deg); ms-transform: rotate(20deg);'\n   * ```\n   *\n   * Generating all possible prefixed version of a CSS value\n   * ```js\n   * rule = 'display:' +  Modernizr._prefixes.join('flex; display:') + 'flex';\n   *\n   * rule === 'display:flex; display:-webkit-flex; display:-moz-flex; display:-o-flex; display:-ms-flex; display:flex'\n   * ```\n   */\n  // we use ['',''] rather than an empty array in order to allow a pattern of .`join()`ing prefixes to test\n  // values in feature detects to continue to work\n\n\n  var prefixes = ModernizrProto._config.usePrefixes ? ' -webkit- -moz- -o- -ms- '.split(' ') : ['', '']; // expose these for the plugin API. Look in the source for how to join() them against your input\n\n  ModernizrProto._prefixes = prefixes;\n  /**\n   * prefixedCSS is just like [prefixed](#modernizr-prefixed), but the returned values are in\n   * hyphen-case (e.g. `box-sizing`) rather than camelCase (boxSizing).\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.prefixedCSS\n   * @optionName Modernizr.prefixedCSS()\n   * @optionProp prefixedCSS\n   * @access public\n   * @function prefixedCSS\n   * @param {string} prop - String name of the property to test for\n   * @returns {string|boolean} The string representing the (possibly prefixed)\n   * valid version of the property, or `false` when it is unsupported.\n   * @example\n   *\n   * `Modernizr.prefixedCSS` is like `Modernizr.prefixed`, but returns the result\n   * in hyphenated form\n   *\n   * ```js\n   * Modernizr.prefixedCSS('transition') // '-moz-transition' in old Firefox\n   * ```\n   *\n   * Since it is only useful for CSS style properties, it can only be tested against\n   * an HTMLElement.\n   *\n   * Properties can be passed as both the DOM style camelCase or CSS style hyphen-case.\n   */\n\n  var prefixedCSS = ModernizrProto.prefixedCSS = function (prop) {\n    var prefixedProp = prefixed(prop);\n    return prefixedProp && domToCSS(prefixedProp);\n  };\n  /**\n   * testAllProps determines whether a given CSS property is supported in the browser\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.testAllProps\n   * @optionName Modernizr.testAllProps()\n   * @optionProp testAllProps\n   * @access public\n   * @function testAllProps\n   * @param {string} prop - String naming the property to test (either camelCase or hyphen-case)\n   * @param {string} [value] - String of the value to test\n   * @param {boolean} [skipValueTest=false] - Whether to skip testing that the value is supported when using non-native detection\n   * @returns {string|boolean} returns the string version of the property, or `false` if it is unsupported\n   * @example\n   *\n   * testAllProps determines whether a given CSS property, in some prefixed form,\n   * is supported by the browser.\n   *\n   * ```js\n   * testAllProps('boxSizing')  // true\n   * ```\n   *\n   * It can optionally be given a CSS value in string form to test if a property\n   * value is valid\n   *\n   * ```js\n   * testAllProps('display', 'block') // true\n   * testAllProps('display', 'penguin') // false\n   * ```\n   *\n   * A boolean can be passed as a third parameter to skip the value check when\n   * native detection (@supports) isn't available.\n   *\n   * ```js\n   * testAllProps('shapeOutside', 'content-box', true);\n   * ```\n   */\n\n\n  function testAllProps(prop, value, skipValueTest) {\n    return testPropsAll(prop, undefined, undefined, value, skipValueTest);\n  }\n\n  ModernizrProto.testAllProps = testAllProps;\n  /**\n   * testProp() investigates whether a given style property is recognized\n   * Property names can be provided in either camelCase or hyphen-case.\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.testProp\n   * @access public\n   * @optionName Modernizr.testProp()\n   * @optionProp testProp\n   * @function testProp\n   * @param {string} prop - Name of the CSS property to check\n   * @param {string} [value] - Name of the CSS value to check\n   * @param {boolean} [useValue] - Whether or not to check the value if @supports isn't supported\n   * @returns {boolean} an empty string if the property is supported, undefined if its unsupported\n   * @example\n   *\n   * Just like [testAllProps](#modernizr-testallprops), only it does not check any vendor prefixed\n   * version of the string.\n   *\n   * Note that the property name must be provided in camelCase (e.g. boxSizing not box-sizing)\n   *\n   * ```js\n   * Modernizr.testProp('pointerEvents')  // true\n   * ```\n   *\n   * You can also provide a value as an optional second argument to check if a\n   * specific value is supported\n   *\n   * ```js\n   * Modernizr.testProp('pointerEvents', 'none') // true\n   * Modernizr.testProp('pointerEvents', 'penguin') // false\n   * ```\n   */\n\n  var testProp = ModernizrProto.testProp = function (prop, value, useValue) {\n    return testProps([prop], undefined, value, useValue);\n  };\n  /**\n   * testStyles injects an element with style element and some CSS rules\n   *\n   * @memberOf Modernizr\n   * @name Modernizr.testStyles\n   * @optionName Modernizr.testStyles()\n   * @optionProp testStyles\n   * @access public\n   * @function testStyles\n   * @param {string} rule - String representing a css rule\n   * @param {Function} callback - A function that is used to test the injected element\n   * @param {number} [nodes] - An integer representing the number of additional nodes you want injected\n   * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes\n   * @returns {boolean}\n   * @example\n   *\n   * `Modernizr.testStyles` takes a CSS rule and injects it onto the current page\n   * along with (possibly multiple) DOM elements. This lets you check for features\n   * that can not be detected by simply checking the [IDL](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Interface_development_guide/IDL_interface_rules).\n   *\n   * ```js\n   * Modernizr.testStyles('#modernizr { width: 9px; color: papayawhip; }', function(elem, rule) {\n   *   // elem is the first DOM node in the page (by default #modernizr)\n   *   // rule is the first argument you supplied - the CSS rule in string form\n   *\n   *   addTest('widthworks', elem.style.width === '9px')\n   * });\n   * ```\n   *\n   * If your test requires multiple nodes, you can include a third argument\n   * indicating how many additional div elements to include on the page. The\n   * additional nodes are injected as children of the `elem` that is returned as\n   * the first argument to the callback.\n   *\n   * ```js\n   * Modernizr.testStyles('#modernizr {width: 1px}; #modernizr2 {width: 2px}', function(elem) {\n   *   document.getElementById('modernizr').style.width === '1px'; // true\n   *   document.getElementById('modernizr2').style.width === '2px'; // true\n   *   elem.firstChild === document.getElementById('modernizr2'); // true\n   * }, 1);\n   * ```\n   *\n   * By default, all of the additional elements have an ID of `modernizr[n]`, where\n   * `n` is its index (e.g. the first additional, second overall is `#modernizr2`,\n   * the second additional is `#modernizr3`, etc.).\n   * If you want to have more meaningful IDs for your function, you can provide\n   * them as the fourth argument, as an array of strings\n   *\n   * ```js\n   * Modernizr.testStyles('#foo {width: 10px}; #bar {height: 20px}', function(elem) {\n   *   elem.firstChild === document.getElementById('foo'); // true\n   *   elem.lastChild === document.getElementById('bar'); // true\n   * }, 2, ['foo', 'bar']);\n   * ```\n   */\n\n\n  var testStyles = ModernizrProto.testStyles = injectElementWithStyles;\n  /*!\n  {\n    \"name\": \"JSON\",\n    \"property\": \"json\",\n    \"caniuse\": \"json\",\n    \"notes\": [{\n      \"name\": \"MDN Docs\",\n      \"href\": \"https://developer.mozilla.org/en-US/docs/Glossary/JSON\"\n    }],\n    \"polyfills\": [\"json2\"]\n  }\n  !*/\n\n  /* DOC\n  Detects native support for JSON handling functions.\n  */\n  // this will also succeed if you've loaded the JSON2.js polyfill ahead of time\n  //   ... but that should be obvious. :)\n\n  Modernizr.addTest('json', 'JSON' in window && 'parse' in JSON && 'stringify' in JSON);\n  /*!\n  {\n    \"name\": \"CSS :checked pseudo-selector\",\n    \"caniuse\": \"css-sel3\",\n    \"property\": \"checked\",\n    \"tags\": [\"css\"],\n    \"notes\": [{\n      \"name\": \"Related Github Issue\",\n      \"href\": \"https://github.com/Modernizr/Modernizr/pull/879\"\n    }]\n  }\n  !*/\n\n  Modernizr.addTest('checked', function () {\n    return testStyles('#modernizr {position:absolute} #modernizr input {margin-left:10px} #modernizr :checked {margin-left:20px;display:block}', function (elem) {\n      var cb = createElement('input');\n      cb.setAttribute('type', 'checkbox');\n      cb.setAttribute('checked', 'checked');\n      elem.appendChild(cb);\n      return cb.offsetLeft === 20;\n    });\n  });\n  /*!\n  {\n    \"name\": \"CSS :target pseudo-class\",\n    \"caniuse\": \"css-sel3\",\n    \"property\": \"target\",\n    \"tags\": [\"css\"],\n    \"notes\": [{\n      \"name\": \"MDN Docs\",\n      \"href\": \"https://developer.mozilla.org/en-US/docs/Web/CSS/:target\"\n    }],\n    \"authors\": [\"@zachleat\"],\n    \"warnings\": [\"Opera Mini supports :target but doesn't update the hash for anchor links.\"]\n  }\n  !*/\n\n  /* DOC\n  Detects support for the ':target' CSS pseudo-class.\n  */\n  // querySelector\n\n  Modernizr.addTest('target', function () {\n    var doc = window.document;\n\n    if (!('querySelectorAll' in doc)) {\n      return false;\n    }\n\n    try {\n      doc.querySelectorAll(':target');\n      return true;\n    } catch (e) {\n      return false;\n    }\n  });\n  /*!\n  {\n    \"name\": \"CSS Supports\",\n    \"property\": \"supports\",\n    \"caniuse\": \"css-featurequeries\",\n    \"tags\": [\"css\"],\n    \"builderAliases\": [\"css_supports\"],\n    \"notes\": [{\n      \"name\": \"W3C Spec (The @supports rule)\",\n      \"href\": \"https://dev.w3.org/csswg/css3-conditional/#at-supports\"\n    }, {\n      \"name\": \"Related Github Issue\",\n      \"href\": \"https://github.com/Modernizr/Modernizr/issues/648\"\n    }, {\n      \"name\": \"W3C Spec (The CSSSupportsRule interface)\",\n      \"href\": \"https://dev.w3.org/csswg/css3-conditional/#the-csssupportsrule-interface\"\n    }]\n  }\n  !*/\n\n  var newSyntax = 'CSS' in window && 'supports' in window.CSS;\n  var oldSyntax = ('supportsCSS' in window);\n  Modernizr.addTest('supports', newSyntax || oldSyntax); // Run each test\n\n  testRunner(); // Remove the \"no-js\" class if it exists\n\n  setClasses(classes);\n  delete ModernizrProto.addTest;\n  delete ModernizrProto.addAsyncTest; // Run the things that are supposed to run after the tests\n\n  for (var i = 0; i < Modernizr._q.length; i++) {\n    Modernizr._q[i]();\n  } // Leak Modernizr namespace\n\n\n  scriptGlobalObject.Modernizr = Modernizr;\n  ;\n})(window, window, document);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://rup/./src/external/modernizr.js?");

/***/ }),

/***/ "./src/external/select2MultiCheckboxes.js":
/*!************************************************!*\
  !*** ./src/external/select2MultiCheckboxes.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {//# sourceURL=select2Multicheckboxes.js\n\n/**\r\n * jQuery Select2 Multi checkboxes\r\n * - allow to select multi values via normal dropdown control\r\n *\r\n * License     : MIT\r\n */\n(function ($) {\n  $.fn.select2.amd.define(\"CustomSelectionAdapter\", [\"select2/utils\", \"select2/selection/multiple\", \"select2/selection/placeholder\", \"select2/selection/eventRelay\", \"select2/selection/single\"], function (Utils, MultipleSelection, Placeholder, EventRelay, SingleSelection) {\n    // Here goes the code of this custom adapter\n    // Decorates MultipleSelection with Placeholder\n    var adapter = Utils.Decorate(MultipleSelection, Placeholder); // Decorates adapter with EventRelay - ensures events will continue to fire\n    // e.g. selected, changed\n\n    adapter = Utils.Decorate(adapter, EventRelay);\n\n    adapter.prototype.render = function () {\n      // Use selection-box from SingleSelection adapter\n      // This implementation overrides the default implementation\n      var $selection = SingleSelection.prototype.render.call(this);\n      return $selection;\n    };\n\n    adapter.prototype.update = function (data) {\n      // copy and modify SingleSelection adapter\n      this.clear();\n      var $rendered = this.$selection.find('.select2-selection__rendered');\n      var noItemsSelected = data.length === 0;\n      var formatted = \"\";\n\n      if (noItemsSelected) {\n        formatted = this.options.get(\"placeholder\") || \"\";\n      } else {\n        var itemsData = {};\n\n        if (this.options.options.url != null || this.$element.find(\"option\").length == 0) {\n          //remoto\n          itemsData = {\n            selected: data || [],\n            all: this.container.$results.find('li') || []\n          };\n        } else {\n          itemsData = {\n            selected: data || [],\n            all: this.$element.find(\"option\") || []\n          };\n        } // Pass selected and all items to display method\n        // which calls templateSelection\n\n\n        formatted = this.display(itemsData, $rendered);\n      }\n\n      $rendered.empty().append(formatted);\n      $rendered.prop('title', formatted);\n    };\n\n    return adapter;\n  });\n  $.fn.select2.amd.define(\"AutocompleteSelectionAdapter\", [\"select2/utils\", \"select2/selection/multiple\", \"select2/selection/placeholder\", \"select2/selection/eventRelay\", \"select2/selection/single\", \"select2/selection/search\"], function (Utils, MultipleSelection, Placeholder, EventRelay, SingleSelection, Search) {\n    // Here goes the code of this custom adapter\n    // Decorates MultipleSelection with Placeholder\n    var adapter = Utils.Decorate(MultipleSelection, Placeholder); // Decorates adapter with EventRelay - ensures events will continue to fire\n    // e.g. selected, changed\n\n    adapter = Utils.Decorate(adapter, EventRelay);\n\n    adapter.prototype.render = function () {\n      // Use selection-box from SingleSelection adapter\n      // This implementation overrides the default implementation\n      var $selection = SingleSelection.prototype.render.call(this);\n      return $selection;\n    };\n\n    adapter.prototype.update = function (data) {\n      // copy and modify SingleSelection adapter\n      var textoSearch = this.$selection.find('input').val();\n      this.clear();\n      var $options = this.options;\n      var $rendered = this.$selection.find('.select2-selection__rendered');\n      var $arrow = this.$selection.find('.select2-selection__arrow');\n      var sumador = 0;\n\n      if (data[0] != undefined && (data[0].id == '' || data[0].id == this.options.options.blank)) {\n        sumador = 1;\n      }\n\n      var noItemsSelected = data.length - sumador === 0;\n      var formatted = \"\"; //Construir\n\n      this.$selection.off('click');\n      $arrow.off('click');\n\n      if ($options.options.combo) {\n        var $container = this.container.$container;\n        $arrow.on('click', function () {\n          if ($container.hasClass('select2-container--open')) {\n            $('#' + $options.options.id).select2('close');\n          } else {\n            $('#' + $options.options.id).select2('open');\n            $('input.select2-search__field').addClass('d-none');\n          }\n        });\n      } else {\n        $arrow.addClass('rup-autocomplete_label ui-autocomplete-input');\n        var $bold = this.$selection.find('b');\n        $bold.addClass('d-none');\n      }\n\n      if (noItemsSelected) {\n        formatted = \"\";\n      } else {\n        var itemsData = {};\n\n        if (this.options.options.url != null || this.$element.find(\"option\").length == 0) {\n          //remoto\n          itemsData = {\n            selected: data || [],\n            all: this.container.$results.find('li') || []\n          };\n        } else {\n          itemsData = {\n            selected: data || [],\n            all: this.$element.find(\"option\") || []\n          };\n        } // Pass selected and all items to display method\n        // which calls templateSelection\n\n\n        formatted = this.display(itemsData, $rendered);\n      }\n\n      var input = $(\"<input/>\", {\n        type: \"text\",\n        placeholder: $options.options.placeholder,\n        \"class\": \"border-0\"\n      });\n\n      if (textoSearch != undefined && textoSearch != '') {\n        input.val(textoSearch);\n      } else {\n        input.val(formatted);\n      }\n\n      input.off('keyup');\n      input.on('keyup', delay(function () {\n        if (this.value.length >= $options.options.minimumResultsForSearch || this.value.length == 0 && $options.options.searchZero) {\n          var openLast = false;\n\n          if ($('#' + $options.options.id).select2('isOpen')) {\n            openLast = true;\n          }\n\n          $('#' + $options.options.id).select2('open');\n          $('input.select2-search__field').addClass('d-none');\n          $('input.select2-search__field').val(this.value);\n\n          if ($options.options.url == null || $options.options.url != null && openLast) {\n            //Si es local\n            $('input.select2-search__field').trigger('keyup');\n          }\n        }\n      }, 500));\n      $rendered.empty().append(input);\n      input.focus();\n      $rendered.prop('title', formatted);\n    };\n\n    return adapter;\n  });\n  $.fn.extend({\n    select2MultiCheckboxes: function select2MultiCheckboxes() {\n      var options = $.extend({\n        wrapClass: 'wrap'\n      }, arguments[0]);\n\n      if (!options.autocomplete) {\n        options = $.extend({\n          wrapClass: 'wrap',\n          minimumResultsForSearch: -1,\n          searchMatchOptGroups: true\n        }, arguments[0]);\n\n        options.templateSelection = function (datos, span) {\n          var cadena = getBlankLabel(options.id, options);\n          return cadena.replace('{0}', datos.selected.length).replace('{1}', datos.all.length);\n        };\n\n        options.selectionAdapter = $.fn.select2.amd.require(\"CustomSelectionAdapter\");\n\n        if (options.placeholder == undefined || options.placeholder == '') {\n          // si es vació se asigna el label\n          options.placeholder = options.templateSelection({\n            selected: [],\n            all: []\n          });\n        }\n      } else if (options.autocomplete) {\n        if (options.minimumResultsForSearch == undefined || options.minimumResultsForSearch == Infinity) {\n          options.minimumResultsForSearch = 3;\n        }\n\n        options.selectionAdapter = $.fn.select2.amd.require(\"AutocompleteSelectionAdapter\");\n\n        options.templateSelection = function (datos, span) {\n          if (!options.multiple) {\n            return datos.selected[0].text;\n          }\n\n          return ' Seleccionado(s) ' + datos.selected.length + ' de ' + datos.all.length;\n        };\n      }\n\n      $('#' + options.id).select2(options);\n    }\n  });\n\n  function delay(callback, ms) {\n    var timer = 0;\n    return function () {\n      var context = this,\n          args = arguments;\n      clearTimeout(timer);\n      timer = setTimeout(function () {\n        callback.apply(context, args);\n      }, ms || 0);\n    };\n  }\n\n  function getBlankLabel(id, options) {\n    var app = $.rup.i18n.app; // Comprueba si el select tiene su propio texto personalizado\n\n    if (app[id] && app[id]._blank) {\n      return app[id]._blank;\n    } // Comprueba si la aplicacion tiene un texto definido para todos los\n    // blank\n    else if (app.rup_select && app.rup_select.blank) {\n      return app.rup_select.blank;\n    } // Si no hay textos definidos para los blank obtiene el por defecto\n    // de UDA\n\n\n    if (options != undefined && options.multiple) {\n      return $.rup.i18n.base.rup_select.multiselect.selectedText;\n    }\n\n    return $.rup.i18n.base.rup_select.blankNotDefined;\n  }\n})(jQuery);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/external/select2MultiCheckboxes.js?");

/***/ }),

/***/ "./src/external/util.js":
/*!******************************!*\
  !*** ./src/external/util.js ***!
  \******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(jQuery) {/**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap (v4.0.0-alpha.5): util.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\nvar Util = function ($) {\n  /**\r\n   * ------------------------------------------------------------------------\r\n   * Private TransitionEnd Helpers\r\n   * ------------------------------------------------------------------------\r\n   */\n  var transition = false;\n  var MAX_UID = 1000000;\n  var TransitionEndEvent = {\n    WebkitTransition: 'webkitTransitionEnd',\n    MozTransition: 'transitionend',\n    OTransition: 'oTransitionEnd otransitionend',\n    transition: 'transitionend'\n  }; // shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-zA-Z]+)/)[1].toLowerCase();\n  }\n\n  function isElement(obj) {\n    return (obj[0] || obj).nodeType;\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: transition.end,\n      delegateType: transition.end,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined;\n      }\n    };\n  }\n\n  function transitionEndTest() {\n    if (window.QUnit) {\n      return false;\n    }\n\n    var el = document.createElement('bootstrap');\n\n    for (var name in TransitionEndEvent) {\n      if (el.style[name] !== undefined) {\n        return {\n          end: TransitionEndEvent[name]\n        };\n      }\n    }\n\n    return false;\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    transition = transitionEndTest();\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n\n    if (Util.supportsTransitionEnd()) {\n      $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n    }\n  }\n  /**\r\n   * --------------------------------------------------------------------------\r\n   * Public Util Api\r\n   * --------------------------------------------------------------------------\r\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        /* eslint-disable no-bitwise */\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n\n        /* eslint-enable no-bitwise */\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector) {\n        selector = element.getAttribute('href') || '';\n        selector = /^#[a-z]/i.test(selector) ? selector : null;\n      }\n\n      return selector;\n    },\n    reflow: function reflow(element) {\n      new Function('bs', 'return bs')(element.offsetHeight);\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(transition.end);\n    },\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(transition);\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (configTypes.hasOwnProperty(property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = void 0;\n\n          if (value && isElement(value)) {\n            valueType = 'element';\n          } else {\n            valueType = toType(value);\n          }\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(\"\".concat(componentName.toUpperCase(), \": \") + \"Option \\\"\".concat(property, \"\\\" provided type \\\"\").concat(valueType, \"\\\" \") + \"but expected type \\\"\".concat(expectedTypes, \"\\\".\"));\n          }\n        }\n      }\n    }\n  };\n  setTransitionEndSupport();\n  return Util;\n}(jQuery);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Util);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/external/util.js?");

/***/ }),

/***/ "./src/helper/handlebars-helper-i18n.js":
/*!**********************************************!*\
  !*** ./src/helper/handlebars-helper-i18n.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n * {{i18n}} <http://github.com/helpers/handlebars-helper-i18n>\r\n *\r\n * Copyright (c) 2014 Laurent Goderre <https://github.com/LaurentGoderre>\r\n * Licensed under the MIT License (MIT)\r\n */\n\n/**\r\n * @param  {String} `key` The name of the property to use as context.\r\n * @param  {Object} `options`\r\n * @return {Object}\r\n */\n\n/*global Handlebars */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! handlebars */ \"./node_modules/handlebars/dist/cjs/handlebars.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, Handlebars) {\n  Handlebars.i18n = {};\n  Handlebars.i18n.languages = [];\n  Handlebars.registerHelper('i18nLanguages', function (options) {\n    options.data.languages = [];\n  });\n  Handlebars.registerHelper('i18nLanguage', function (options) {\n    var langJSON = {};\n    langJSON[options.hash.lang] = JSON.parse('{' + options.fn(this) + '}');\n    options.data.languages = $.extend(true, {}, options.data.languages, langJSON);\n  });\n  Handlebars.registerHelper('i18n', function (key, options) {\n    options = options || {};\n    options.hash = options.hash || {};\n\n    if (typeof key !== 'string') {\n      throw '{{i18n}} helper: invalid key. Object keys must be formatted as strings.';\n    }\n\n    if (typeof options.hash.language === 'string') {\n      window.language = options.hash.language;\n    } else {\n      window.language = this.datosIdioma;\n    }\n\n    return $.rup.i18nParse($.rup.i18n.base, key);\n  });\n  return Handlebars;\n});\n\n//# sourceURL=webpack://rup/./src/helper/handlebars-helper-i18n.js?");

/***/ }),

/***/ "./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global, $) {/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var jquery_migrate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery-migrate */ \"./node_modules/jquery-migrate/dist/jquery-migrate.js\");\n/* harmony import */ var jquery_migrate__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery_migrate__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.js\");\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(bootstrap__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var bootstrap_scss_bootstrap_scss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! bootstrap/scss/bootstrap.scss */ \"./node_modules/bootstrap/scss/bootstrap.scss\");\n/* harmony import */ var _helper_handlebars_helper_i18n_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helper/handlebars-helper-i18n.js */ \"./src/helper/handlebars-helper-i18n.js\");\n/* harmony import */ var _helper_handlebars_helper_i18n_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_helper_handlebars_helper_i18n_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _rup_base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\");\n/* harmony import */ var _rup_base__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_rup_base__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _rup_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./rup.utils */ \"./src/rup.utils.js\");\n/* harmony import */ var _rup_utils__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_rup_utils__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _rup_accordion__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./rup.accordion */ \"./src/rup.accordion.js\");\n/* harmony import */ var _rup_accordion__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_rup_accordion__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _rup_autocomplete__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./rup.autocomplete */ \"./src/rup.autocomplete.js\");\n/* harmony import */ var _rup_autocomplete__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_rup_autocomplete__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _rup_breadCrumb__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./rup.breadCrumb */ \"./src/rup.breadCrumb.js\");\n/* harmony import */ var _rup_breadCrumb__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_rup_breadCrumb__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _rup_button__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./rup.button */ \"./src/rup.button.js\");\n/* harmony import */ var _rup_button__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_rup_button__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _rup_chart__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./rup.chart */ \"./src/rup.chart.js\");\n/* harmony import */ var _rup_chart__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_rup_chart__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _rup_combo__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./rup.combo */ \"./src/rup.combo.js\");\n/* harmony import */ var _rup_combo__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_rup_combo__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _rup_contextMenu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rup.contextMenu */ \"./src/rup.contextMenu.js\");\n/* harmony import */ var _rup_contextMenu__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_rup_contextMenu__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _rup_table_rup_table__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rup_table/rup.table */ \"./src/rup_table/rup.table.js\");\n/* harmony import */ var _rup_table_rup_table__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_rup_table_rup_table__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _rup_date__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./rup.date */ \"./src/rup.date.js\");\n/* harmony import */ var _rup_date__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_rup_date__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _rup_dav__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./rup.dav */ \"./src/rup.dav.js\");\n/* harmony import */ var _rup_dav__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_rup_dav__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _rup_dialog__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./rup.dialog */ \"./src/rup.dialog.js\");\n/* harmony import */ var _rup_dialog__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_rup_dialog__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var _rup_feedback__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./rup.feedback */ \"./src/rup.feedback.js\");\n/* harmony import */ var _rup_feedback__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_rup_feedback__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _rup_form__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./rup.form */ \"./src/rup.form.js\");\n/* harmony import */ var _rup_form__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_rup_form__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var _rup_lang__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./rup.lang */ \"./src/rup.lang.js\");\n/* harmony import */ var _rup_lang__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_rup_lang__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var _rup_menu__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./rup.menu */ \"./src/rup.menu.js\");\n/* harmony import */ var _rup_menu__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_rup_menu__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var _rup_message__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./rup.message */ \"./src/rup.message.js\");\n/* harmony import */ var _rup_message__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_rup_message__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var _rup_navbar__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./rup.navbar */ \"./src/rup.navbar.js\");\n/* harmony import */ var _rup_navbar__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_rup_navbar__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony import */ var _rup_progressbar__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./rup.progressbar */ \"./src/rup.progressbar.js\");\n/* harmony import */ var _rup_progressbar__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_rup_progressbar__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony import */ var _rup_report__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./rup.report */ \"./src/rup.report.js\");\n/* harmony import */ var _rup_report__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(_rup_report__WEBPACK_IMPORTED_MODULE_25__);\n/* harmony import */ var _rup_slider__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./rup.slider */ \"./src/rup.slider.js\");\n/* harmony import */ var _rup_slider__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(_rup_slider__WEBPACK_IMPORTED_MODULE_26__);\n/* harmony import */ var _rup_spinner__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./rup.spinner */ \"./src/rup.spinner.js\");\n/* harmony import */ var _rup_spinner__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(_rup_spinner__WEBPACK_IMPORTED_MODULE_27__);\n/* harmony import */ var _rup_sticky__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./rup.sticky */ \"./src/rup.sticky.js\");\n/* harmony import */ var _rup_sticky__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(_rup_sticky__WEBPACK_IMPORTED_MODULE_28__);\n/* harmony import */ var _rup_jqtable__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./rup.jqtable */ \"./src/rup.jqtable.js\");\n/* harmony import */ var _rup_jqtable__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(_rup_jqtable__WEBPACK_IMPORTED_MODULE_29__);\n/* harmony import */ var _rup_tabs__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./rup.tabs */ \"./src/rup.tabs.js\");\n/* harmony import */ var _rup_tabs__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(_rup_tabs__WEBPACK_IMPORTED_MODULE_30__);\n/* harmony import */ var _rup_time__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./rup.time */ \"./src/rup.time.js\");\n/* harmony import */ var _rup_time__WEBPACK_IMPORTED_MODULE_31___default = /*#__PURE__*/__webpack_require__.n(_rup_time__WEBPACK_IMPORTED_MODULE_31__);\n/* harmony import */ var _rup_toolbar__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./rup.toolbar */ \"./src/rup.toolbar.js\");\n/* harmony import */ var _rup_toolbar__WEBPACK_IMPORTED_MODULE_32___default = /*#__PURE__*/__webpack_require__.n(_rup_toolbar__WEBPACK_IMPORTED_MODULE_32__);\n/* harmony import */ var _rup_tooltip__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./rup.tooltip */ \"./src/rup.tooltip.js\");\n/* harmony import */ var _rup_tooltip__WEBPACK_IMPORTED_MODULE_33___default = /*#__PURE__*/__webpack_require__.n(_rup_tooltip__WEBPACK_IMPORTED_MODULE_33__);\n/* harmony import */ var _rup_tree__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./rup.tree */ \"./src/rup.tree.js\");\n/* harmony import */ var _rup_tree__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(_rup_tree__WEBPACK_IMPORTED_MODULE_34__);\n/* harmony import */ var _rup_upload__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./rup.upload */ \"./src/rup.upload.js\");\n/* harmony import */ var _rup_upload__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(_rup_upload__WEBPACK_IMPORTED_MODULE_35__);\n/* harmony import */ var _rup_validate__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./rup.validate */ \"./src/rup.validate.js\");\n/* harmony import */ var _rup_validate__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(_rup_validate__WEBPACK_IMPORTED_MODULE_36__);\n/* harmony import */ var _rup_wizard__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./rup.wizard */ \"./src/rup.wizard.js\");\n/* harmony import */ var _rup_wizard__WEBPACK_IMPORTED_MODULE_37___default = /*#__PURE__*/__webpack_require__.n(_rup_wizard__WEBPACK_IMPORTED_MODULE_37__);\n/* harmony import */ var _rup_list__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./rup.list */ \"./src/rup.list.js\");\n/* harmony import */ var _rup_calendar__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./rup.calendar */ \"./src/rup.calendar.js\");\n/* harmony import */ var _rup_select__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./rup.select */ \"./src/rup.select.js\");\n/* harmony import */ var _rup_select__WEBPACK_IMPORTED_MODULE_40___default = /*#__PURE__*/__webpack_require__.n(_rup_select__WEBPACK_IMPORTED_MODULE_40__);\n/* harmony import */ var _templates__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./templates */ \"./src/templates.js\");\n/* harmony import */ var _templates__WEBPACK_IMPORTED_MODULE_41___default = /*#__PURE__*/__webpack_require__.n(_templates__WEBPACK_IMPORTED_MODULE_41__);\n/* harmony import */ var _scss_rup_base_scss__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../scss/rup-base.scss */ \"./scss/rup-base.scss\");\n/* harmony import */ var _scss_rup_theme_scss__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../scss/rup-theme.scss */ \"./scss/rup-theme.scss\");\n/**\r\n * VENDOR\r\n */\n\n\n\n\n/**\r\n * RUP\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\r\n * GLOBAL DEFINITIONS\r\n */\n\nglobal.Rup = _templates__WEBPACK_IMPORTED_MODULE_41___default.a;\nglobal.$ = global.jQuery = $;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/index.js?");

/***/ }),

/***/ "./src/rup.accordion.js":
/*!******************************!*\
  !*** ./src/rup.accordion.js ***!
  \******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Tiene como objetivo presentar un contenido donde conceptos relacionados pueden agruparse (ej. secciones) de manera que el usuario puede mostrar u ocultar información sin perder el contexto del contenido principal.\r\n *\r\n * @summary Componente RUP Accordion.\r\n * @module rup_accordion\r\n * @see El componente está basado en el plugin {@link https://jqueryui.com/accordion/|jQuery UI Accordion}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://api.jqueryui.com/accordion/|aquí}.\r\n * @example\r\n * $(\".rup_accordion\").rup_accordion({\r\n *   animate: \"bounceslide\",\r\n *\tactive: false,\r\n *\tautoHeight: false,\r\n *\tcollapsible: true\r\n * });\r\n */\n\n/*global define */\n\n/*global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n  var rup_accordion = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_accordion', rup_accordion)); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  $.fn.rup_accordion('extend', {\n    /**\r\n    * Elimina completamente la funcionalidad del Accordion. Como resultado, se devuelven los\r\n    objetos html, tal y como estaban, antes de aplicar el componente Accordion.\r\n    *\r\n    * @function destroy\r\n    * @example\r\n    * $(\"#idAccordion\").rup_accordion(\"destroy\");\r\n    */\n    destroy: function destroy() {\n      $(this).removeData('settings');\n      $(this).accordion('destroy');\n    },\n\n    /**\r\n     * Deshabilita el componente Accordion.\r\n     *\r\n     * @function disable\r\n     * @example\r\n     * $(\"#idAccordion\").rup_accordion(\"disable\");\r\n     */\n    disable: function disable() {\n      $(this).accordion('disable');\n    },\n\n    /**\r\n     * Habilita el componente Accordion.\r\n     *\r\n     * @function enable\r\n     * @example\r\n     * $(\"#idAccordion\").rup_accordion(\"enable\");\r\n     */\n    enable: function enable() {\n      $(this).accordion('enable');\n    },\n\n    /**\r\n     * Dependiendo de si se informa un valor asociado a una parámetro o se introduce un json con relaciones variable-valor o no se pasan parámetros asociados a la opción especificada, la función asigna el nuevo valor al parámetro asociado o asigna el nuevo conjunto de valores a los parámetros asociados o devuelve el valor actual del parámetro especificado (actuando como un get), respectivamente..\r\n     *\r\n     * @function option\r\n     * @param {String | Object} opt - Nombre de la propiedad u objeto con varias propiedades.\r\n     * @param {*} [value] - Valor a asignar a la propiedad especificada por su nombre en el primer parámetro.\r\n     * @example\r\n     * // Asignar el valor \"bounceslide\" a la propiedad \"animate\"\r\n     * $(\"#idAccordion\").rup_accordion(\"option\", \"animate\", \"bounceslide\");\r\n     * // Se asignan valores a varias propiedades por medio de un objeto json.\r\n     * $(\"#idAccordion\").rup_accordion(\"option\",{active: false, collapsible : true});\r\n     * // Se recupera el valor de la propiedad \"animate\"\r\n     * $(\"#idAccordion\").rup_accordion(\"option\", \"animate\");\r\n     */\n    option: function option(opt, value) {\n      //Se establecen la propiedad o propiedades que reciben como parametro y se leen las que no vienen con una asignación.\n      if (value !== undefined) {\n        $(this).accordion('option', opt, value);\n      } else {\n        if (opt !== undefined) {\n          return $(this).accordion('option', opt);\n        } else {\n          return $(this).accordion('option');\n        }\n      }\n    },\n\n    /**\r\n     * Devuelve el elemento .ui-accordion:.\r\n     *\r\n     * @function widget\r\n     * @returns {object} - Objeto jQuery que contiene el accordion.\r\n     * @example\r\n     * $(\"#idAccordion\").rup_accordion(\"widget\");\r\n     */\n    widget: function widget() {\n      return $(this).accordion('widget');\n    },\n\n    /**\r\n     * Activación programática de la sección especificada por parámetro.\r\n     *\r\n     * @function activate\r\n     * @param {number | object | boolean} - Valor numérico diferente de cero que indique la sección seleccionada o un selector que determine el elemento activado. En caso de tener el collapsible activado, es posible pasar el valor false para que se cierren todas las secciones.\r\n     * @example\r\n     * // Activar la seción tercera.\r\n     * $(\"#idAccordion\").rup_accordion(\"activate\", 3);\r\n     * // Activar la seción identificada con el selector seccion3.\r\n     * $(\"#idAccordion\").rup_accordion(\"activate\", \"#seccion3\");\r\n     * // Colapsar todas las secciones.\r\n     * $(\"#idAccordion\").rup_accordion(\"activate\", false);\r\n     */\n    activate: function activate(index) {\n      $(this).accordion('option', 'active', index);\n    },\n\n    /**\r\n     * La función provoca el reajuste de los height (tamaño vertical) de las distintas secciones del Accordion. La ejecución de esta función solo tiene sentido si la opción fillSpace está activada y el height del contenedor cambia.\r\n     *\r\n     * @function resize\r\n     * @deprecated desde la version 2.5.0. Utilizar en su lugar el método refresh.\r\n     * @example\r\n     * $(\"#idAccordion\").rup_accordion(\"resize\");\r\n     */\n    resize: function resize() {\n      $(this).accordion('resize');\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  function create_default(event) {\n    $(event.target).addClass('rup_accordion_create');\n  }\n\n  $.fn.rup_accordion('extend', {\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18n.base.rup_global.initError + $(this).attr('id'));\n      } else {\n        var elements = this.children(),\n            elementsNum = elements.length / 2,\n            settings = $.extend({}, $.fn.rup_accordion.defaults, args[0]),\n            createUserEvent; //Se recogen y cruzan las paremetrizaciones del objeto\n        //Se tapa la creación del accordion para evitar visualizaciones inapropiadas\n        //Se recomienda que el componente, inicialmente, sea invisible. Para ello se dispone del estilo rup_accordion\n\n        this.removeClass('rup_accordion'); //Se almacenan los settings en el data del objeto\n\n        this.data('settings', settings); //Se sobreescribe uno de los eventos para hacer reaparecer, una vez creado, el accordion\n\n        createUserEvent = settings.create;\n\n        settings.create = function (event, ui) {\n          if (createUserEvent !== undefined) {\n            if (createUserEvent(event, ui) === false) {\n              return false;\n            }\n          } //Comportamiento por defecto del evento\n\n\n          create_default(event, ui);\n        }; //Se comprueba la corrección del html con el que se creara el accordion\n\n\n        if (settings.validation) {\n          if (parseInt(elementsNum) !== elementsNum) {\n            $.rup.errorGestor($.rup.i18n.base.rup_accordion.strucPairError);\n            return false;\n          } else {\n            elements.each(function (index, object) {\n              if (parseInt(index / 2) === index / 2 && $(object).find('a').length === 0) {\n                $.rup.errorGestor($.rup.i18n.base.rup_accordion.headFormatError);\n                return false;\n              }\n            });\n          }\n        } //Se invoca la creacion del accordion\n\n\n        this.accordion(settings); //Se audita el componente\n\n        $.rup.auditComponent('rup_accordion', 'init');\n      }\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  /**\r\n   * @description Opciones por defecto de configuración del componente.\r\n   * @name defaults\r\n   * @property {boolean} [validation=true] - Parámetro de configuración que determina la aplicación de la validación estructural asociada a las necesidades estructurales del Accordion.\r\n   * @property {boolean} [disabled=false]- Parámetro de configuración que determina si está habilitado (false) o deshabilitado (true) el componente Accordion. Por defecto el valor de este parámetro es false.\r\n   * @property { boolean| number} [active=0] - Determina la sección que está activa. Si se le especifica el valor false, el Accordion permanecerá totalmente cerrado (este caso requiere del parámetro collapsible true). Por defecto, su valor es la primera sección del Accordion.\r\n   * @property {boolean | number | String | Object}   [animate ={}]   - Elemento de configuración que determina el tipo de animación aplicada al pliegue y despliegue de las secciones del Accordion. Puede aceptar los distintos tipos de animaciones asociados a JQuery–Ui (https://api.jqueryui.com/easings/). Con un valor false se deshabilita la animación. El valor por defecto es linear.\r\n   * @property {boolean }[collapsible=false] - Parámetro que habilita la posibilidad de que todas las secciones del Accordion estén cerradas a la vez.\r\n   * @property {String} [event='click'] - Determina el tipo de evento necesario para que cada una de las secciones sea habilitada o deshabilitada.\r\n   * @property {selector}[header=function( elem ) { return elem.find( \"> li > :first-child\" ).add( elem.find( \"> :not(li)\" ).even() ); }] -  Selector que determina el objeto cabecera de cada una de las secciones del Accordion. Por defecto recoge como cabeceras los primeros elementos de cada pareja integrada en el Accordion.\r\n   * @property {Object} [icons='{\"header\": \"ui-icon-triangle-1-e\",\"activeHeader\": \"ui-icon-triangle-1-s\"}'] - Parámetro estructural que determina el icono utilizado para indicar el estado de sección abierta o cerrada. Se puede especificar tanto uno como otro como los dos. Por defecto se usan los iconos nativos del propio de JQuery-UI.\r\n   *\r\n   */\n\n  $.fn.rup_accordion.defaults = {\n    animate: 'linear',\n    validation: true,\n    heightStyle: \"content\",\n    icons: {\n      'header': 'mdi mdi-chevron-down',\n      'activeHeader': 'mdi mdi-arrow-expand'\n    }\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup.accordion.js?");

/***/ }),

/***/ "./src/rup.autocomplete.js":
/*!*********************************!*\
  !*** ./src/rup.autocomplete.js ***!
  \*********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function($) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permite al usuario recuperar un elemento de una gran lista de elementos o de varias listas dependientes de forma sencilla y ocupando poco espacio en la interfaz.\r\n *\r\n * @summary Componente RUP Autocomplete.\r\n * @module rup_autocomplete\r\n * @see El componente está basado en el plugin {@link https://jqueryui.com/autocomplete/|jQuery UI Autocomplete}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://api.jqueryui.com/autocomplete/|aquí}.\r\n * @example\r\n * $(\"#idAutocomplete\").rup_autocomplete({\r\n *\tsource : \"autocomplete/remote\",\r\n *\tsourceParam : {label:\"desc\"+$.rup_utils.capitalizedLang(), value:\"code\"}\r\n * });\r\n */\n\n/*global define */\n\n/*global jQuery */\n\n/*global $ */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./rup.tooltip */ \"./src/rup.tooltip.js\"), __webpack_require__(/*! ./rup.button */ \"./src/rup.button.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (jQuery) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_autocomplete = {};\n  $.extend($.ui.autocomplete.prototype, {\n    _renderMenu: function _renderMenu(ul, items) {\n      var settings = this.options;\n\n      if (settings.category) {\n        //categorización de los resultados\n        var that = this,\n            currentCategory = '';\n        $.each(items, function (index, item) {\n          var li;\n\n          if (item.category != currentCategory) {\n            ul.append('<li class=\\'ui-autocomplete-category\\'>' + item.category + '</li>');\n            currentCategory = item.category;\n          }\n\n          li = that._renderItemData(ul, item);\n\n          if (item.category) {\n            li.attr('aria-label', item.category + ' : ' + item.label);\n          }\n        });\n      } else {\n        var self = this;\n        $.each(items, function (index, item) {\n          self._renderItemData(ul, item);\n        });\n      }\n    },\n    _renderItem: function _renderItem(ul, item) {\n      // Replace the matched text with a custom span. This\n      // span uses the class found in the \"highlightClass\" option.\n      var re = new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(this.term) + ')(?![^<>]*>)(?![^&;]+;)', 'gi'),\n          cls = 'matched-text',\n          template = '<span class=\\'' + cls + '\\'>$1</span>',\n          label = item.label.replace(re, template),\n          $li = $('<li></li>').appendTo(ul); // Create and return the custom menu item content.\n\n      $('<a></a>').attr('href', '#').html(label).appendTo($li);\n      var settings = this.options;\n      $li.find('a').mousedown(function (event) {\n        var ui = {\n          item: {\n            label: item.label,\n            value: item.value\n          }\n        };\n        settings.select(event, ui);\n      });\n      return $li;\n    }\n  }); //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_autocomplete', rup_autocomplete)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_autocomplete('extend', {\n    /**\r\n           * Método utilizado para obtener el valor del componente. Este método es el utilizado\r\n          por el resto de componentes RUP para estandarizar la obtención del valor del Autocomplete.\r\n           *\r\n           * @function getRupValue\r\n           * @return {string | number} - Devuelve el valor actual del componente seleccionado por el usuario.\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"getRupValue\");\r\n           */\n    getRupValue: function getRupValue() {\n      return $(this).val();\n    },\n\n    /**\r\n       * Método utilizado para asignar el valor al componente. Este método es el utilizado por\r\n    el resto de componentes RUP para estandarizar la asignación del valor al Autocomplete.\r\n       *\r\n       * @function setRupValue\r\n       * @param {string | number} param - Valor que se va a asignar al componente.\r\n       * @example\r\n       * $(\"#idAutocomplete\").rup_autocomplete(\"setRupValue\", \"Si\");\r\n       */\n    setRupValue: function setRupValue(value) {\n      var $self = this,\n          data = $self.data('rup.autocomplete'),\n          loadObjects,\n          newObject = {};\n\n      if ($self[0] != undefined) {\n        var id = $self[0].id;\n\n        if (data) {\n          // Comprobamos si tiene la referencia al campo hidden\n          if (data.$hiddenField) {\n            data.$hiddenField.attr({\n              rup_autocomplete_label: value,\n              value: value\n            });\n            loadObjects = $self.data('loadObjects');\n            newObject[value] = data.$hiddenField.val();\n            $self.data('loadObjects', jQuery.extend(true, {}, loadObjects, newObject));\n            var labelFound = '';\n            var loadObjectsLabels = $('#' + data.$hiddenField.attr('id')).data('rup.autocomplete').$labelField.data('loadObjectsLabels');\n            $.each(loadObjectsLabels, function (label, key) {\n              if (key !== undefined) {\n                if (value === value) {\n                  labelFound = label;\n                  return;\n                }\n              }\n            });\n\n            if (labelFound !== '') {\n              $('#' + id + '_label').val(labelFound);\n            }\n          }\n\n          if (data.$labelField) {\n            loadObjects = data.$labelField.data('loadObjects');\n            newObject[$self.attr('rup_autocomplete_label')] = value;\n            data.$labelField.data('loadObjects', jQuery.extend(true, {}, loadObjects, newObject));\n\n            var _loadObjectsLabels = data.$labelField.data('loadObjectsLabels');\n\n            var _labelFound = '';\n            $.each(_loadObjectsLabels, function (label, key) {\n              if (key !== undefined) {\n                if (value === key) {\n                  _labelFound = label;\n                  return;\n                }\n              }\n            });\n            var settings = data.$labelField.data('settings');\n\n            if (_labelFound !== '') {\n              $('#' + id + '_label').val(_labelFound);\n            } else if (settings.showDefault) {\n              $('#' + id + '_label').val(value);\n            }\n          }\n        }\n\n        $(this).val(value);\n\n        if (id.includes('_label')) {\n          if (value == \"\") {\n            $('#' + id.substring(0, id.lastIndexOf('_label'))).val(value);\n          }\n\n          $self.triggerHandler('rupAutocomplete_change');\n        } else {\n          if (value == \"\") {\n            $('#' + id + '_label').val(value);\n          }\n\n          $('#' + id + '_label').triggerHandler('rupAutocomplete_change');\n        }\n      }\n    },\n\n    /**\r\n           * Elimina el autocomplete.\r\n           *\r\n           * @function destroy\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"destroy\");\r\n           */\n    destroy: function destroy() {\n      var self;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label');\n      }\n\n      self.autocomplete('destroy');\n    },\n\n    /**\r\n           * Deshabilita el autocomplete (solo la parte de sugerencias, el input sigue habilitado).\r\n           *\r\n           * @function off\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"off\");\r\n           */\n    off: function off() {\n      var self;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label');\n      }\n\n      self.storeEvents();\n    },\n\n    /**\r\n           * Habilita el autocomplete (solo la parte de sugerencias).\r\n           *\r\n           * @function on\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"on\");\r\n           */\n    on: function on() {\n      var self;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label');\n      }\n\n      self.restoreEvents();\n    },\n\n    /**\r\n           * Deshabilita el autocomplete. Internamente invoca al método {@link module:rup_autocomplete~off}.\r\n           *\r\n           * @function disable\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"disable\");\r\n           */\n    disable: function disable() {\n      var self, settings;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label');\n      }\n\n      settings = self.data('settings');\n\n      if (settings.combobox) {\n        settings.$comboboxToogle.button('disable');\n      }\n\n      self.attr('disabled', 'disabled');\n    },\n\n    /**\r\n           * Habilita el autocomplete. Internamente invoca al método {@link module:rup_autocomplete~on}.\r\n           *\r\n           * @function enable\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"enable\");\r\n           */\n    enable: function enable() {\n      var self, settings;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label');\n      }\n\n      settings = self.data('settings');\n\n      if (settings.combobox) {\n        settings.$comboboxToogle.button('enable');\n      }\n\n      self.removeAttr('disabled');\n    },\n\n    /**\r\n           * Permite consultar y modificar la configuración del componente.\r\n           *\r\n           * @param {string | object} optionName - Nombre de la propiedad que se desea gestionar o objeto de compuesto de varias propiedades.\r\n           * @param {*} [value] - Corresponde al valor de la propiedad en caso de haberse especificado el nombre de la misma en el primér parámetro.\r\n           * @param {*} aux - Parámetro extra de confirguración para la propiedad \"source\".\r\n           * @function option\r\n           * @example\r\n           * // Establecer una propiedad\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"option\", \"minLegth\", 2);\r\n           * // Establecer varias propiedad\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"option\", {minLegth:2, delay:1000});\r\n           */\n    option: function option(optionName, value, aux) {\n      var self;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label');\n      }\n\n      var settings = self.data('settings');\n\n      if (optionName === 'source') {\n        if (_typeof(value) === 'object') {\n          //LOCAL\n          if (aux !== undefined) {\n            settings.i18nId = aux;\n          } else {\n            settings.i18nId = settings.id;\n          }\n\n          self.autocomplete('option', optionName, this._sourceLOCAL);\n          self.autocomplete('option', 'minLength', settings.minLength !== undefined ? settings.minLength : 0);\n        } else {\n          if (aux !== undefined) {\n            if (optionName == 'data') {\n              self.autocomplete('option', 'data', aux);\n            } else {\n              //REMOTO\n              settings.sourceParam = aux; //Nos aseguramos que el número mínimo de teclas para búsquedas sea 3\n\n              self.autocomplete('option', optionName, this._sourceREMOTE);\n              self.autocomplete('option', 'minLength', settings.minLength > 3 ? settings.minLength : 3);\n            }\n          } else {\n            return undefined;\n          }\n        }\n\n        settings.data = value;\n        self.data('settings', settings);\n      } else if (optionName === 'combobox') {\n        var spanParent = self.parent();\n\n        if (value === true) {\n          if (!spanParent.hasClass('rup-combobox')) {\n            self.addClass('rup-combobox-input ui-corner-left');\n            var wasOpen = false;\n            self.wrap(jQuery('<span>').addClass('rup-combobox'));\n            var $wrapper = self.parent();\n            var $button = $('<a>').attr('tabIndex', -1).attr('title', $.rup.i18n.base.rup_autocomplete.showAllItems).rup_tooltip().rup_button({\n              icons: {\n                primary: 'ui-icon-triangle-1-s'\n              },\n              text: false\n            }).removeClass('ui-corner-all').addClass('rup-combobox-toggle ui-corner-right').mousedown(function () {\n              wasOpen = self.autocomplete('widget').is(':visible');\n            }).click(function () {\n              self.focus();\n\n              if (wasOpen) {\n                return true;\n              }\n\n              self.autocomplete('search', '');\n            });\n            $button.appendTo($wrapper);\n            settings.$comboboxToogle = $button;\n            self.rup_autocomplete('option', 'minLength', 0);\n          }\n        } else {\n          if (spanParent.hasClass('rup-combobox')) {\n            self.removeClass('rup-combobox-input ui-corner-left');\n            self.addClass('ui-autocomplete-input');\n            self.insertBefore(spanParent);\n            spanParent.remove();\n          }\n        }\n      } else if (optionName === 'contains') {\n        if (value === true) {\n          self.data('settings').contains = true;\n        } else {\n          self.data('settings').contains = false;\n        }\n      } else {\n        settings[optionName] = value;\n        self.data('settings', settings);\n        self.autocomplete('option', optionName, value);\n      }\n    },\n\n    /**\r\n       * Lanza una búsqueda en el autocomplete con el parámetro indicado y el foco va a parar al\r\n    input.\r\n       *\r\n       * @param {string} term - Cadena de texto utilizada para realizar la búsqueda.\r\n       * @function search\r\n       * @example\r\n       * $(\"#idAutocomplete\").rup_autocomplete(\"search\", \"java\");\r\n       */\n    search: function search(term) {\n      var self;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label'); //Si esta inicializado con una busqueda por defecto\n\n        if (self.length === 0) {\n          self = $(this);\n        }\n      } //Si tiene eventos (no está deshabilitado) se hace búsqueda\t\n\n\n      if ($._data(self[0], 'events') !== undefined) {\n        self.focus();\n        self.val(term);\n        self.autocomplete('search', term);\n      }\n    },\n\n    /**\r\n           * Oculta el autocomplete.\r\n           *\r\n           * @function close\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"close\");\r\n           */\n    close: function close() {\n      var self;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        self = $(this);\n      } else {\n        self = $('#' + $(this).attr('id') + '_label');\n      }\n\n      self.autocomplete('close');\n    },\n\n    /**\r\n           * Devuelve el valor del autocomplete. Este es el valor que se guarda en el campo oculto antes descrito al final del apartado 7.Para obtener la descripción (dato que se muestra en el input) se invocará a la función estándar de jQuery.\r\n           *\r\n           * @function val\r\n           * @example\r\n           * // Recuperar el valor\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"val\");\r\n           * // Recuperar la descripción\r\n           * $(\"#idAutocomplete\").val();\r\n           */\n    val: function val() {\n      return $('#' + $(this).attr('id')).val();\n    },\n\n    /**\r\n           * Método utilizado para asignar el valor y el literal al componente. El valor se almacena en el campo hidden creado por el componente. El contenido indicado en la propiedad label se mostrará en el campo input del componente.\r\n           *\r\n           * @function set\r\n           * @param {string | number} value - Valor que se va a almacenar en el campo hidden y que se corresponde con el value seleccionado.\r\n           * @param {string} label - Texto que se va a mostrar en el campo de texto del componente.\r\n           * @example\r\n           * $(\"#idAutocomplete\").rup_autocomplete(\"set\", \"48\", \"Bizkaia\");\r\n           */\n    set: function set(value, label) {\n      var $self;\n\n      if ($(this).attr('id').indexOf('_label') >= 0) {\n        var array = $(this).attr('id').split('_label');\n        $self = $('#' + array[0]);\n      } else {\n        $self = $(this);\n      }\n\n      var $selfLabel = jQuery('[id=\\'' + $self.attr('id') + '_label\\']'),\n          loadObjects,\n          newObject = {};\n      $self.val(value);\n      $self.attr('rup_autocomplete_label', label);\n      $selfLabel.val(label);\n      loadObjects = $selfLabel.data('loadObjects');\n      newObject[label] = value;\n      $selfLabel.data('loadObjects', jQuery.extend(true, {}, loadObjects, newObject));\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_autocomplete('extend', {\n    /**\r\n           * Procesa los elementos recibidos en la respuesta de la petición de búsqueda realizada.\r\n           *\r\n           * @function _parseResponse\r\n           * @private\r\n           * @param {string} term - Cadena de texto empleada para realizar la búsqueda.\r\n           * @param {string} label - Texto a mostrar del elemento enviado en la respuesta.\r\n           * @param {string | number} value - Valor del elemento enviado en la respuesta.\r\n           * @param {string} [category] - Texto identificador de la categoría del elemento en el caso de que exista.\r\n           */\n    _parseResponse: function _parseResponse(term, label, value, category) {\n      if (category === undefined) {\n        return {\n          label: label.replace(new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(term) + ')(?![^<>]*>)(?![^&;]+;)', 'gi'), '<strong>$1</strong>'),\n          value: value\n        };\n      } else {\n        return {\n          label: label.replace(new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(term) + ')(?![^<>]*>)(?![^&;]+;)', 'gi'), '<strong>$1</strong>'),\n          value: value,\n          category: category\n        };\n      }\n    },\n\n    /**\r\n           * Procesa la respuesta a partir de una petición de búsqueda sobre una fuente de datos local.\r\n           *\r\n           * @function _sourceLOCAL\r\n           * @private\r\n           * @param {object} request - Objeto que contiene la petición de búsqueda.\r\n           * @param {object} response - Objeto que contiene la respuesta a partir de la fuente de datos local.\r\n           */\n    _sourceLOCAL: function _sourceLOCAL(request, response) {\n      var settings,\n          loadObjects = {},\n          returnValue,\n          stock,\n          loadObjectsLabels = {};\n\n      if (this.element.data('settings') !== undefined) {\n        settings = this.element.data('settings');\n      } else {\n        settings = this.options;\n      }\n\n      if (settings.loadObjects !== undefined) {\n        stock = settings.loadObjects;\n      } else {\n        stock = settings.id;\n      }\n\n      var textoOrigen = request.term;\n\n      if (settings.accentFolding) {\n        textoOrigen = $.rup_utils.normalize(request.term);\n      }\n\n      var data,\n          matcher = settings.contains ? $.ui.autocomplete.escapeRegex(textoOrigen) : '^' + $.ui.autocomplete.escapeRegex(textoOrigen),\n          json_i18n = $.rup.i18n.app[settings.i18nId];\n      matcher = new RegExp(matcher, 'i'); // Detecta si es enlazado o no y lo gestiona\n\n      var dataSource = settings.data;\n\n      if (settings.parent) {\n        var parentsValues = settings.$self._getParentsValues(settings);\n\n        if (parentsValues.selectedSource in settings.data) {\n          dataSource = settings.data[parentsValues.selectedSource];\n        }\n      }\n\n      data = $.map(dataSource, function (item) {\n        var label = item,\n            value = item,\n            category;\n\n        if (_typeof(item) === 'object') {\n          //multi-idioma\n          if (item.i18nCaption !== undefined) {\n            label = $.rup.i18nParse(json_i18n, item.i18nCaption);\n          } else if (item.label !== undefined) {\n            label = item.label;\n          } else {\n            label = item.value;\n          }\n\n          value = item.value;\n          if (settings.category) category = item.category;\n        }\n\n        var labelLimpio = label;\n\n        if (settings.accentFolding) {\n          labelLimpio = $.rup_utils.normalize(label);\n        }\n\n        if (!request.term || matcher.test(labelLimpio)) {\n          var termLimpio = $.rup_utils.normalize(request.term);\n          if (settings.category) returnValue = settings._parseResponse(termLimpio, labelLimpio, value, category);else returnValue = settings._parseResponse(termLimpio, labelLimpio, value);\n          loadObjects[returnValue.label.replace(/<strong>/g, '').replace(/<\\/strong>/g, '')] = returnValue.value;\n          loadObjectsLabels[label] = returnValue.value;\n\n          if (settings.accentFolding && labelLimpio !== label) {\n            //limpiar acentos y mayúsculas\n            //parte delantera\n            //returnValue.label = literal.substr(0,nDelante)+label.substr(0,termLimpio.length)+literal.substr(nDelante+termLimpio.length);\n            var literal = returnValue.label;\n            var nDelante = literal.indexOf(termLimpio);\n            var n = labelLimpio.indexOf(termLimpio);\n            returnValue.label = literal.substr(0, nDelante) + label.substr(n, termLimpio.length) + literal.substr(nDelante + termLimpio.length); //parte trasera\n            //var nAtras = literal.indexOf(labelLimpio.substr(termLimpio.length));\n\n            var nAtras = literal.indexOf('</strong>') + 9;\n            literal = returnValue.label;\n            returnValue.label = literal.substr(0, nAtras) + label.substr(n + termLimpio.length);\n            var nStrong = literal.indexOf('<strong>');\n            returnValue.label = item.label.substr(0, nStrong) + '<strong>' + item.label.substr(nStrong, termLimpio.length) + '</strong>' + item.label.substr(nStrong + termLimpio.length);\n          }\n\n          return returnValue;\n        }\n      }); // Se almacenan los datos cargados\n\n      $('#' + stock).data('loadObjects', loadObjects);\n      $('#' + stock).data('loadObjectsLabels', loadObjectsLabels); // Eliminar elementos vacíos\n\n      data = $.grep(data, function (value) {\n        return value != undefined;\n      });\n      response(data);\n    },\n\n    /**\r\n           * Procesa la respuesta a partir de una petición de búsqueda sobre una fuente de datos remota.\r\n           *\r\n           * @function _sourceREMOTE\r\n           * @private\r\n           * @param {object} request - Objeto que contiene la petición de búsqueda.\r\n           * @param {object} response - Objeto que contiene la respuesta a partir de la fuente de datos remota.\r\n           */\n    _sourceREMOTE: function _sourceREMOTE(request, response) {\n      //Se escapan los comodines/wildcards de BD\n      var $self = this.element,\n          settings,\n          loadObjects = {},\n          returnValue,\n          stock,\n          term,\n          data,\n          lastTerm,\n          bckData,\n          $stock,\n          loadObjectsLabels = {};\n\n      if (this.element.data('settings') !== undefined) {\n        settings = this.element.data('settings');\n      } else {\n        settings = this.options;\n      }\n\n      if (settings.loadObjects !== undefined) {\n        stock = settings.loadObjects;\n      } else {\n        stock = settings.id;\n      }\n\n      $stock = jQuery('#' + stock); // Si tiene parent, envía su valor como parámetro extra\n\n      if (settings.parent) {\n        if (settings.extraParams === undefined) {\n          settings.extraParams = {};\n        }\n\n        $.each(settings.parent, function (position, item) {\n          var entityName = $('#' + item).attr('name');\n\n          if (entityName !== undefined && entityName !== '') {\n            settings.extraParams[entityName] = $('#' + item).rup_autocomplete('getRupValue');\n          }\n        });\n      }\n\n      term = request.term.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n      data = $.extend({\n        q: term,\n        c: settings.contains\n      }, settings.extraParams); // Comprobar si se puede cachear\n\n      lastTerm = $stock.data('tmp.loadObjects.term');\n\n      if (!settings.disabledCache && term.indexOf(lastTerm) === 0) {\n        $stock.data('tmp.loadObjects.term', term);\n        bckData = settings.data;\n        settings.data = $stock.data('tmp.data');\n\n        settings.$self._sourceLOCAL.bind(this, request, response)();\n\n        settings.data = bckData;\n      } else {\n        $.rup_ajax({\n          url: settings.data,\n          data: data,\n          dataType: 'json',\n          contentType: 'application/json',\n          //Cabecera RUP\n          beforeSend: function beforeSend(xhr) {\n            //LOADING...\n            $('#' + settings.id + '_label').addClass('rup-autocomplete_loading');\n            xhr.setRequestHeader('RUP', $.toJSON(settings.sourceParam));\n          },\n\n          /**\r\n                          *\r\n                          * @fires  {[event]} rupAutocomplete_beforeLoadComplete [description]\r\n                          */\n          success: function success(data) {\n            $self.triggerHandler('rupAutocomplete_beforeLoadComplete', [data]); //Si no hay datos en el autocomplete que se cierre\n\n            if (data.length === 0) {\n              jQuery('#' + settings.id + '_label').autocomplete('close');\n              return null;\n            }\n\n            response($.map(data, function (item) {\n              // Si se define un sourceParam se serializan los parámetros desde el cliente en vez de desde el bean.\n              if (settings.sourceParam !== undefined) {\n                if (settings.sourceParam.category === 'filter') {\n                  if (settings.sourceParam.label !== undefined) {\n                    item.label = item[settings.sourceParam.label];\n                  }\n\n                  if (settings.sourceParam.data !== undefined) {\n                    item.value = item[settings.sourceParam.data];\n                  }\n\n                  if (settings.sourceParam.category !== undefined) {\n                    item.category = item[settings.sourceParam.category];\n                  }\n                } else if (item.label === undefined && item[settings.sourceParam.label] !== undefined) {\n                  item.label = item[settings.sourceParam.label];\n                }\n              }\n\n              var labelLimpio = item.label;\n\n              if (settings.accentFolding) {\n                labelLimpio = $.rup_utils.normalize(item.label);\n              }\n\n              var termLimpio = $.rup_utils.normalize(request.term);\n\n              if (settings.category) {\n                returnValue = settings._parseResponse(termLimpio, labelLimpio, item.value, item.category);\n              } else {\n                returnValue = settings._parseResponse(termLimpio, labelLimpio, item.value);\n              } // Limpiar tildes\n\n\n              if (settings.accentFolding && labelLimpio !== item.label) {\n                // Parte delantera\n                var regex = new RegExp(termLimpio, 'i');\n                var literal = returnValue.label;\n                var nDelante = literal.search(regex);\n                var n = labelLimpio.search(regex);\n                returnValue.label = literal.substr(0, nDelante) + item.label.substr(n, termLimpio.length) + literal.substr(nDelante + termLimpio.length); // Parte trasera\n\n                var nAtras = literal.indexOf('</strong>') + 9;\n                literal = returnValue.label;\n                returnValue.label = literal.substr(0, nAtras) + item.label.substr(n + termLimpio.length);\n                var nStrong = literal.indexOf('<strong>');\n                returnValue.label = item.label.substr(0, nStrong) + '<strong>' + item.label.substr(nStrong, termLimpio.length) + '</strong>' + item.label.substr(nStrong + termLimpio.length);\n                loadObjectsLabels[returnValue.label] = returnValue.value;\n                loadObjects[$.rup_utils.normalize(returnValue.label.replace(/<strong>/g, '').replace(/<\\/strong>/g, ''))] = returnValue.value;\n              } else {\n                loadObjectsLabels[item.label] = returnValue.value;\n                loadObjects[returnValue.label.replace(/<strong>/g, '').replace(/<\\/strong>/g, '')] = returnValue.value;\n              }\n\n              return returnValue;\n            })); //se almacenan los datos cargados\n\n            $stock.data('loadObjects', loadObjects);\n            $stock.data('loadObjectsLabels', loadObjectsLabels);\n            $stock.data('tmp.loadObjects.term', term);\n            $stock.data('tmp.data', data);\n            $self.triggerHandler('rupAutocomplete_loadComplete', [data]);\n          },\n          error: function error(xhr, textStatus, errorThrown) {\n            if (settings.onLoadError !== null && typeof settings.onLoadError === 'function') {\n              jQuery(settings.onLoadError(xhr, textStatus, errorThrown));\n            } else {\n              $.rup.showErrorToUser($.rup.i18n.base.rup_autocomplete.ajaxError);\n            }\n          },\n          complete: function complete() {\n            //UNLOADING...\n            $('#' + settings.id + '_label').removeClass('rup-autocomplete_loading');\n          }\n        });\n      }\n    },\n\n    /**\r\n           * Función encargada de crear el control encargado de mostrar todos los resultados cuando el componente tiene activado el modo de funcionamiento combobox.\r\n           *\r\n           * @function _createShowAllButton\r\n           * @private\r\n           */\n    _createShowAllButton: function _createShowAllButton(settings) {\n      var input = this,\n          wasOpen = false;\n      input.wrap(jQuery('<span>').addClass('rup-combobox'));\n      var $wrapper = input.parent();\n      var $button = $('<a>').attr('tabIndex', -1).attr('title', $.rup.i18n.base.rup_autocomplete.showAllItems).rup_tooltip().rup_button({\n        icons: {\n          primary: 'ui-icon-triangle-1-s'\n        },\n        text: false\n      }).removeClass('ui-corner-all').addClass('rup-combobox-toggle ui-corner-right').mousedown(function () {\n        wasOpen = input.autocomplete('widget').is(':visible');\n      }).click(function () {\n        input.focus(); // Close if already visible\n\n        if (wasOpen) {\n          return true;\n        } // Pass empty string as value to search\n        // for, displaying all results\n\n\n        input.autocomplete('search', '');\n      });\n      $button.appendTo($wrapper);\n      settings.$comboboxToogle = $button;\n    },\n\n    /**\r\n           * Método que obtiene el valor del autocomplete padre (ya sea uno o varios).\r\n           *\r\n           * @function _getParentsValues\r\n           * @private\r\n        * @since UDA 5.0.0 (backported)\r\n     *\r\n           * @param {object} settings - Configuración general del componente.\r\n     *\r\n     * @return {object}\r\n           */\n    _getParentsValues: function _getParentsValues(settings) {\n      var parentsValues = {};\n      parentsValues.allParentsHaveValues = true;\n      parentsValues.selectedSource = '';\n      $.each(settings.parent, function (position, parentId) {\n        if ($(\"#\" + parentId).rup_autocomplete(\"getRupValue\") == '' || $(\"#\" + parentId + \"_label\").rup_autocomplete(\"getRupValue\") == '') {\n          parentsValues.allParentsHaveValues = false;\n          return false;\n        } // Obtener valor del padre\n\n\n        parentsValues.selectedSource += settings.$self._processHDIV($('#' + parentId + '_label').data('settings'), $(\"#\" + parentId).rup_autocomplete(\"getRupValue\")); // Comprobar si se trata de un autocomplete enlazado múltiple\n\n        if (settings.parent.length > 1 && position != settings.parent.length - 1) {\n          parentsValues.selectedSource += settings.multiValueToken;\n        }\n      });\n      return parentsValues;\n    },\n\n    /**\r\n           * Método que comprueba si el padre de un autocomplete local es remoto y usa HDIV. En caso afirmativo, se usará el NID en vez del ID, ya que este último, viene cifrado.\r\n           *\r\n           * @function _processHDIV\r\n           * @private\r\n        * @since UDA 5.0.0 (backported)\r\n     *\r\n           * @param {object} parentSettings - Configuración general del componente padre.\r\n           * @param {string} selectedSource - Valor del padre.\r\n     *\r\n     * @return {string}\r\n           */\n    _processHDIV: function _processHDIV(parentSettings, selectedSource) {\n      if (parentSettings !== undefined && parentSettings.source.name === '_sourceREMOTE' && $.fn.isHdiv(selectedSource)) {\n        var parentData = $(\"#\" + parentSettings.loadObjects).data('tmp.data');\n        var parentLabel = $(\"#\" + parentSettings.loadObjects).rup_autocomplete(\"getRupValue\");\n        var search = $.grep(parentData, function (row) {\n          return row.value === selectedSource && row.label === parentLabel;\n        });\n\n        if (search[0] !== undefined && search[0] !== '') {\n          var nid = search[0].nid;\n\n          if (nid) {\n            selectedSource = nid;\n          }\n        }\n      }\n\n      return selectedSource;\n    },\n\n    /**\r\n           * Método de inicialización del componente.\r\n           *\r\n           * @function _init\r\n           * @private\r\n           */\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        var _settings$loadValue;\n\n        //Se recogen y cruzan las paremetrizaciones del objeto\n        var $self = $(this),\n            settings = $.extend({}, $.fn.rup_autocomplete.defaults, args[0]),\n            name = $(this).attr('name'),\n            selected_value;\n        $(this).attr('ruptype', 'autocomplete'); //Recopilar datos necesarios\n\n        settings.id = $(this).attr('id');\n        settings.loadObjects = settings.id;\n        settings.data = settings.source; //Guardar los datos en \"data\" ya que source la emplea autocomplete internamente\n\n        settings._parseResponse = this._parseResponse; //Guardar referencia a rup.autocomplete para invocar las funciones privadas\n\n        settings._sourceLOCAL = this._sourceLOCAL; //Guardar referencia a rup.autocomplete para invocar las funciones privadas\n\n        settings.$self = this; //Guardar referencia a rup.autocomplete para invocar las funciones privadas\n        //Guardar valor del INPUT\n\n        settings.loadValue = (_settings$loadValue = settings.loadValue) !== null && _settings$loadValue !== void 0 ? _settings$loadValue : $('#' + settings.id).attr('value'); //Si no se recibe identificador para el acceso a literales se usa el ID del objeto\n\n        if (!settings.i18nId) {\n          settings.i18nId = settings.id;\n        } //Eventos\n        //*******\n        //Guardar referencia\n\n\n        settings._change = settings.change;\n        settings._select = settings.select;\n        settings._focus = settings.focus; //Sobrecargar tratamiento\n\n        settings.change = function (event, ui) {\n          if (selected_value != null) {\n            //Puede que se ejecute este evento sin ejecutarse el select. Con esta condición nos aseguramos\n            $('#' + event.target.id).val(selected_value);\n            $('#' + event.target.id).focus();\n          }\n\n          selected_value = null;\n\n          if (settings._change !== undefined) {\n            settings._change(event, ui);\n          }\n\n          $self.triggerHandler('rupAutocomplete_change');\n        };\n\n        settings.select = function (event, ui) {\n          selected_value = ui.item.label.replace(/<strong>/g, '').replace(/<\\/strong>/g, '');\n\n          if (settings._select !== undefined) {\n            $('#' + settings.id).val(ui.item.value);\n\n            settings._select(event, ui);\n          }\n\n          $('#' + settings.id).attr('rup_autocomplete_label', selected_value);\n          $('#' + settings.id).data('selected', true);\n          $('#' + settings.id).val(ui.item.value);\n          $self.triggerHandler('rupAutocomplete_select', [ui]);\n          event.stopPropagation();\n          return false;\n        };\n\n        settings.focus = function (event, ui) {\n          $('#' + event.target.id).val(ui.item.label.replace(/<strong>/g, '').replace(/<\\/strong>/g, ''));\n\n          if (settings._focus !== undefined) {\n            settings._focus(event, ui);\n          }\n\n          return false; //Evitar acciones jquery.autocomplete.js\n        }; //Generación de campo oculto para almacenar 'value' (en el input definido se guarda el 'label')\n\n\n        var $hidden = $('<input>').attr({\n          type: 'hidden',\n          id: settings.id + '_value',\n          name: settings.valueName === null ? name : settings.valueName,\n          ruptype: 'autocomplete'\n        });\n        $('#' + settings.id).after($hidden).attr('name', settings.labelName === null ? name + '_label' : settings.labelName).addClass('rup-autocomplete_label'); //\t\t\t\t\tsettings.$hidden = $hidden;\n\n        if (_typeof(settings.source) === 'object') {\n          //LOCAL\n          settings.source = this._sourceLOCAL;\n        } else {\n          //REMOTO\n          //Nos aseguramos que el número mínimo de teclas para búsquedas sea 3\n          settings.minLength = settings.minLength > 3 ? settings.minLength : 3;\n          settings.source = this._sourceREMOTE;\n        } //Se prepara el almacenaje de datos\n\n\n        $('#' + settings.id).data('loadObjects', {});\n\n        if (settings.combobox === true) {\n          $('#' + settings.id).addClass('rup-combobox-input ui-corner-left');\n          settings.minLength = 0;\n        }\n\n        jQuery(settings.appendTo).addClass('ui-front'); //Invocación al componente subyacente\n\n        jQuery('#' + settings.id).autocomplete(settings); //Se anyade un id al menu desplegable del autocomplete\n\n        settings.$menu = jQuery('#' + settings.id).data('ui-autocomplete').menu.element.attr('id', settings.id + '_menu');\n\n        if (settings.combobox === true) {\n          this._createShowAllButton(settings);\n        } // Evita en IE que el input pierda el foco al hacer click en el scroll de la capa de resultados\n\n\n        settings.$menu.on('scroll', function () {\n          jQuery('#' + settings.id + '_label').focus();\n          settings.$menu.show();\n        }); // Lanza el evento de change al seleccionar una de las opciones del menú\n\n        settings.$menu.on('mousedown', function (e) {\n          if ($(e.target).hasClass('ui-menu-item-wrapper')) {\n            settings.$menu.triggerHandler('blur');\n          }\n        }); // Altura del menu desplegable\n\n        jQuery('#' + settings.id).on('autocompleteopen', function () {\n          if (settings.menuMaxHeight !== false) {\n            settings.$menu.css('overflow-y', 'auto').css('overflow-x', 'hidden').css('max-height', settings.menuMaxHeight + 'px').css('width', jQuery('#' + settings.id + '_label').innerWidth());\n          }\n\n          jQuery('#' + settings.id + '_menu').css('z-index', '1000');\n          jQuery('#' + settings.id + '_menu').removeClass('ui-front');\n        }); // Buscar el UL del autocomplete y colocarlo tras el elemento sobre el que debe ir\n\n        if (settings.menuAppendTo != undefined) {\n          if (settings.menuAppendTo.length == 0 || settings.menuAppendTo.length == undefined) {\n            console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_autocomplete.menuAppendToError'), settings.id));\n            $('#' + settings.id).parent().append(settings.$menu);\n          } else {\n            jQuery(settings.menuAppendTo).append(settings.$menu);\n          }\n        } else {\n          $('#' + settings.id).parent().append(settings.$menu);\n        } //Deshabilitar\n        // if (settings.disabled===true) { $(\"#\"+settings.id).rup_autocomplete(\"disable\");\n        //     if (settings.combobox)\n        //         $('span').has('#'+settings.id+'_label').find(\"a\").attr(\"style\",\"display:none\");\n        //\n        // }else if (settings.disabled===false){ //habilitar\n        //     $(\"#\"+settings.id).rup_autocomplete(\"enable\");\n        //     if (settings.combobox){\n        //         $('span').has('#'+settings.id+'_label').find(\"a\").removeAttr(\"style\");\n        //     }\n        // }\n        // Valor por defecto\n\n\n        if (settings.defaultValue && settings.parent == undefined || settings.parent != undefined && settings.parent != '' && $(\"#\" + settings.parent + \"_label\").rup_autocomplete(\"getRupValue\") != '') {\n          $('#' + settings.id).rup_autocomplete('search', settings.defaultValue);\n        } // Valor pre-cargado\n\n\n        if (settings.loadValue) {\n          $('#' + settings.id).val(settings.loadValue);\n          $('#' + settings.id + '_value').val(settings.loadValue);\n        } // Modificar identificadores\n\n\n        settings.loadObjects = settings.id + '_label';\n        $('#' + settings.id).attr('id', settings.id + '_label');\n        $('#' + settings.id + '_value').attr('id', settings.id); //eventos internos de borrado y perdida de foco\n\n        $('#' + settings.id + '_menu').on('mousedown', function (event) {\n          var selected = $('#' + settings.id).data('selected'),\n              isShowingMenu = $('.ui-autocomplete:visible').length > 0 ? true : false;\n\n          if (!selected && isShowingMenu) {\n            $('#' + settings.id).data('ieIssueScrollVisible', true);\n            event.preventDefault();\n          }\n        });\n        $('#' + settings.id + '_label').on('keydown', function () {\n          $('#' + settings.id).data('ieIssueScrollVisible', false);\n        });\n        $('#' + settings.id + '_label').on('blur', function (event) {\n          //Obtener datos de si viene de seleccionar elemento o si el menú de selección está desplegado\n          var selected = $('#' + settings.id).data('selected'),\n              isShowingMenu = $('.ui-autocomplete:visible').length > 0 ? true : false; //Borrar índicador de que viene de seleccionar elemento\n\n          $('#' + settings.id).data('selected', false); //Si es un evento de teclado pero no es ENTER, omitir esta función\n\n          if (event.type === 'keydown' && event.keyCode !== 13) {\n            return true;\n          }\n\n          if ($('#' + settings.id).data('ieIssueScrollVisible') === true) {\n            $('#' + settings.id).focus();\n            event.stopPropagation();\n            $('#' + settings.id).data('ieIssueScrollVisible', false);\n            return true;\n          }\n\n          var autoCompObject = $(event.currentTarget),\n              loadObjects = $('#' + settings.loadObjects).data('loadObjects');\n\n          if (settings.getText) {\n            $('#' + settings.id).val(autoCompObject.val());\n            $('#' + settings.id).attr('rup_autocomplete_label', autoCompObject.val());\n          } else {\n            // Cuando la propiedad accentFolding = true\n            if (settings.accentFolding && loadObjects[$.rup_utils.normalize(autoCompObject.val())] !== undefined) {\n              $('#' + settings.id).val(loadObjects[$.rup_utils.normalize(autoCompObject.val())]);\n              $('#' + settings.id).attr('rup_autocomplete_label', loadObjects[$.rup_utils.normalize(autoCompObject.val())]);\n            } // Cuando la propiedad accentFolding = false\n            else if (!settings.accentFolding && loadObjects[autoCompObject.val()] !== undefined) {\n              $('#' + settings.id).val(loadObjects[autoCompObject.val()]);\n              $('#' + settings.id).attr('rup_autocomplete_label', loadObjects[autoCompObject.val()]);\n            } // Cuando el valor del autocomplete esta vacio\n            else {\n              $('#' + settings.id).val('');\n              $('#' + settings.id).attr('rup_autocomplete_label', '');\n              autoCompObject.val('');\n              autoCompObject.autocomplete('close');\n            }\n          } //Si el evento es ENTER y viene de seleccionar un elemento o el menú se estaba mostrando, omitir resto de funciones (ej. buscar)\n\n\n          if (event.type === 'keydown' && event.keyCode === 13 && (selected || isShowingMenu)) {\n            return false;\n          }\n        }); //se guarda la configuracion general (settings) del componente\n\n        $('#' + settings.id + '_label').data('settings', settings);\n\n        if (settings.loadObjectsAuto != undefined) {\n          $('#' + settings.id + '_label').data('loadObjects', settings.loadObjectsAuto);\n        }\n\n        $('#' + settings.id + '_label').data('rup.autocomplete', {\n          $hiddenField: $('#' + settings.id)\n        });\n        $('#' + settings.id).data('rup.autocomplete', {\n          $labelField: $('#' + settings.id + '_label')\n        }); //Deshabilitar\n\n        if (settings.disabled) {\n          $('#' + settings.id).rup_autocomplete('disable');\n        } else if (!settings.disabled) {\n          //habilitar\n          $('#' + settings.id).rup_autocomplete('enable');\n        }\n\n        if (settings.parent) {\n          $.map(settings.parent, function (item) {\n            var childsArray = $('#' + item).data('childs') === undefined ? [] : $('#' + item).data('childs');\n            childsArray[childsArray.length] = settings.id;\n            $('#' + item).data('childs', childsArray);\n            $('#' + item).data('childSelector', 0);\n          }); // Comprobar si tiene un padre o varios\n\n          if (settings.parent.length > 1) {\n            var allParentsHaveValues = true; // Se comprueba si todos los padres tienen valores asignados\n\n            $.each(settings.parent, function (position, parentId) {\n              if ($(\"#\" + parentId + \"_label\").rup_autocomplete(\"getRupValue\") == '') {\n                allParentsHaveValues = !allParentsHaveValues;\n                return false;\n              }\n            });\n\n            if (allParentsHaveValues) {\n              $('#' + settings.id).rup_autocomplete('enable');\n            } else {\n              $('#' + settings.id).rup_autocomplete('disable');\n              $('#' + settings.id).rup_autocomplete(\"setRupValue\", \"\");\n            }\n          } else {\n            if ($(\"#\" + settings.parent + \"_label\").rup_autocomplete(\"getRupValue\") != '') {\n              $('#' + settings.id).rup_autocomplete('enable');\n            } else {\n              $('#' + settings.id).rup_autocomplete('disable');\n              $('#' + settings.id).rup_autocomplete(\"setRupValue\", \"\");\n            }\n          } // Añadir evento para detectar los cambios en valores del padre/s\n\n\n          $.each(settings.parent, function (position, parentId) {\n            $(\"#\" + parentId + \"_label\").on(\"rupAutocomplete_change\", function (event) {\n              var autocompleteId = event.target.id.substring(0, event.target.id.indexOf(\"_label\"));\n              var childSelector = $(\"#\" + autocompleteId).data('childSelector');\n              var child = $(\"#\" + autocompleteId).data('childs')[childSelector];\n              var resourceIsCached = false;\n\n              var parentsValues = settings.$self._getParentsValues(settings);\n\n              var selectedSource = parentsValues.selectedSource;\n              var allParentsHaveValues = parentsValues.allParentsHaveValues;\n              var checkValueDeferred = $.Deferred(); // Comprobar valor para saber si habilitar o no el hijo\n\n              if (allParentsHaveValues) {\n                // Si es remoto hay que obtener los datos para poder hacer la siguiente comprobación de valores válidos\n                if (settings.source.name === '_sourceREMOTE') {\n                  var retrieveValueDeferred = $.Deferred();\n                  $('#' + child + '_label').on(\"autocompleteresponse\", function () {\n                    retrieveValueDeferred.resolve();\n                    return retrieveValueDeferred.promise();\n                  });\n                  $.when(retrieveValueDeferred).then(function () {\n                    resourceIsCached = false;\n                    allParentsHaveValues = false;\n                    var childData = $('#' + child + '_label').data('tmp.data');\n\n                    if (childData !== undefined && childData.length > 0) {\n                      allParentsHaveValues = true;\n                    }\n\n                    checkValueDeferred.resolve();\n                    return checkValueDeferred.promise();\n                  }); // Eliminar cache porque sino no realiza la búsquedas cuando se cambia el padre\n\n                  if (settings.$self.data('tmp.loadObjects.term') !== undefined) {\n                    settings.$self.removeData('tmp.loadObjects.term');\n                  } // Realizar búsqueda\n\n\n                  $('#' + child).rup_autocomplete('search', settings.defaultValue !== undefined ? settings.defaultValue : undefined); // Quitar foco del elemento para evitar desplegar los resultados automáticamente\n\n                  $('#' + child + '_label').trigger('blur');\n                } else if (settings.source.name === '_sourceLOCAL' && !(selectedSource in $('#' + child + '_label').data('settings').data)) {\n                  allParentsHaveValues = false;\n                  checkValueDeferred.resolve();\n                  checkValueDeferred.promise();\n                } else {\n                  checkValueDeferred.resolve();\n                  checkValueDeferred.promise();\n                }\n              } else {\n                checkValueDeferred.resolve();\n                checkValueDeferred.promise();\n              } // Cuando es enlazado, hay que comprobar si el valor seleccionado en el padre permite seleccionar algún valor en el hijo\n\n\n              $.when(checkValueDeferred).then(function () {\n                // Activar o desactivar dependiendo de si todos los parent tienen valores\n                if (allParentsHaveValues) {\n                  $('#' + child).rup_autocomplete('enable');\n                } else {\n                  $('#' + child).rup_autocomplete('disable');\n                } // Definir valor por defecto o vaciarlo en caso contrario\n\n\n                if (allParentsHaveValues && !resourceIsCached && settings.defaultValue != undefined) {\n                  $('#' + child).rup_autocomplete('search', settings.defaultValue);\n                } else {\n                  $('#' + child + \"_label\").val(\"\");\n                  $('#' + child).rup_autocomplete(\"setRupValue\", \"\");\n                } // Comprobar que hijo se usara la proxima vez\n\n\n                if ($(\"#\" + autocompleteId).data('childs').length - 1 > childSelector) {\n                  $('#' + autocompleteId).data('childSelector', childSelector + 1);\n                } else {\n                  $('#' + autocompleteId).data('childSelector', 0);\n                }\n              });\n            });\n          });\n        } // Se audita el componente\n\n\n        $.rup.auditComponent('rup_autocomplete', 'init');\n      }\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  /**\r\n      * Función a ejecutar en caso de producirse un error a la hora de obtener los elementos a mostrar.\r\n      *\r\n      * @callback module:rup_autocomplete~onLoadError\r\n      * @param {Object} xhr - Objeto XHR que contiene la respuesta de la petición realizada.\r\n      * @param {string} textStatus - Texto que identifica el error producido.\r\n      * @param {Object} errorThrown - Objeto error que contiene las propiedades del error devuelto en la petición.\r\n      */\n\n  /**\r\n      * @description Opciones por defecto de configuración del componente.\r\n      *\r\n      * @name defaults\r\n      *\r\n      * @property {module:rup_autocomplete~onLoadError} [onLoadError] - Función de callback a ejecutar en caso de que se produzca un error en la petición de obtención de la lista de elementos a mostrar.\r\n      * @property {boolean} [contains=true] - Valor que determina si la búsqueda debe ser del tipo “contiene” (se buscarán elementos que contengan en cualquier posición el literal introducido) o del tipo “comienza por” (se buscarán elementos que comiencen por el literal introducido).\r\n      * @property {string} [valueName=null] - Determina el valor de la propiedad name del campo que utilizará internamente el componente para almacenar el identificador del elemento seleccionado por el usuario. En caso de no especificarse, se tomará como valor el valor de la propiedad name del elemento sobre el cual se ha definido el componente.\r\n      * @property {string} [labelName=null] - Determina el valor de la propiedad name del campo que utilizará internamente el componente para almacenar el texto del elemento seleccionado por el usuario. En caso de no especificarse, se tomará como valor el valor de la propiedad name del elemento sobre el cual se ha definido el componente, añadiéndole el sufijo “_label”.\r\n      * @property {boolean} [getText=false] - En caso de ser true el componente devolverá como resultado seleccionado el texto en vez del value del elemento.\r\n      * @property {boolean} [combobox=false] - Habilita/deshabilita el modo de funcionamiento combobox.\r\n      * @property {number} [menuMaxHeight=false] - Determina la altura máxima que podrá tener la capa del menú desplegable antes de mostrar scroll.\r\n      * @property {object} [menuAppendTo=null] - Permite especificar mediante un selector de jQuery el elemento del DOM al que se añadirá el menú desplegable.\r\n      * @property {boolean} [disabled=false] - Determina si se deshabilita el componente Autocomplete sobre el input al que se aplica. De tal modo que por mucho que se interactué con el elemento no se hará una búsqueda.\r\n      * @property {string} [defaultValue] - Valor que se cargará por defecto en el input y con el que se lanzará una búsqueda para mostrar valores propuestos\r\n      * @property {string} [multiValueToken=\"##\"] - Define el separador a utilizar en combos enlazados locales. \r\n   */\n\n  $.fn.rup_autocomplete.defaults = {\n    onLoadError: null,\n    contains: true,\n    valueName: null,\n    labelName: null,\n    getText: false,\n    combobox: false,\n    menuMaxHeight: false,\n    menuAppendTo: null,\n    disabled: false,\n    accentFolding: true,\n    multiValueToken: '##'\n  };\n  /**\r\n      * Permite asociar una función que se ejecutará cuando se complete la carga de los registros correspondientes al texto de búsqueda introducido.\r\n      * @event module:rup_autocomplete#rupAutocomplete_loadComplete\r\n      * @example\r\n      * $(\"#autocomplete\").on(\"rupAutocomplete_loadComplete\", function(event, data){});\r\n      */\n\n  /**\r\n      * Permite asociar una función que se ejecutará cuando se produzca un cambio en el valor seleccionado del componente\r\n      * @event module:rup_autocomplete#rupAutocomplete_change\r\n      * @example\r\n      * $(\"#autocomplete\").on(\"rupAutocomplete_change\", function(event, data){});\r\n      */\n\n  /**\r\n      * Permite asociar una función que se ejecutará cuando se produzca la selección de un registro de entre la lista de resultados\r\n      * @event module:rup_autocomplete#rupAutocomplete_select\r\n      * @example\r\n      * $(\"#autocomplete\").on(\"rupAutocomplete_select\", function(event, data){});\r\n      */\n\n  /**\r\n      * Permite manipular la respuesta del servidor antes de construir la lista de resultados.\r\n      * @event module:rup_autocomplete#rupAutocomplete_beforeLoadComplete\r\n      * @example\r\n      * $(\"#autocomplete\").on(\"rupAutocomplete_beforeLoadComplete\", function(event, data){});\r\n      */\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.autocomplete.js?");

/***/ }),

/***/ "./src/rup.base.js":
/*!*************************!*\
  !*** ./src/rup.base.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/* jshint -W054 */\n\n/* eslint-disable no-useless-escape */\n\n/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANT�?AS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/*global define */\n\n/*global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.utils */ \"./src/rup.utils.js\"), __webpack_require__(/*! ./adapter/rup.adapter */ \"./src/adapter/rup.adapter.js\"), __webpack_require__(/*! ./external/modernizr */ \"./src/external/modernizr.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  // NO MODIFICAR: (AUTOGENERADO)\n  var rup_version = '4.5.0';\n  jQuery.migrateMute = true;\n  global.initRupI18nPromise = jQuery.Deferred();\n  /**\r\n  * jQuery definition to anchor JsDoc comments.\r\n  *\r\n  * @see http://jquery.com/\r\n  * @name jQuery\r\n  * @namespace jQuery\r\n  */\n\n  /**\r\n  * jQuery object type\r\n  * @namespace jQuery.rup\r\n  * @memberOf jQuery\r\n  */\n\n  /**\r\n  * The built in string object.\r\n  * @external String\r\n  * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String|String}\r\n  */\n\n  /**\r\n  * The File interface provides information about files and allows to access their content.\r\n  * @typedef File\r\n  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/File|File}\r\n  */\n\n  /**\r\n  * A Blob object represents a file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format.\r\n  * @typedef Blob\r\n  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Blob|Blob}\r\n  */\n\n  /**\r\n  * jQuery object type.\r\n  * @typedef {object} jQuery\r\n  */\n\n  /**\r\n  * Selector de jQuery para referenciar elementos del DOM.\r\n  * @typedef {object} Selector\r\n  * @see {@link http://api.jquery.com/Types/#Selector|Selector}\r\n  */\n\n  /**\r\n  * jQuery Event type object.\r\n  * @typedef {object} Event\r\n  */\n\n  /**\r\n  * Elemento del Document Object Model (DOM).\r\n  * @typedef {object} Element\r\n  */\n\n  /**\r\n  * Tipo de dato entero.\r\n  * @typedef {number} Integer\r\n  */\n  // [Ajuste para IE] función asociada a deficiencias de IE(msie). Cuando se deje de soportar este navegador, hay que eliminar este polyfill\n\n  if (!String.prototype.includes) {\n    //To check browser supports or not\n    String.prototype.includes = function (str) {\n      //Add method includes to String type\n      var returnValue = false;\n\n      if (this.indexOf(str) !== -1) {\n        returnValue = true;\n      }\n\n      return returnValue;\n    };\n  }\n\n  String.prototype.capitalize = function () {\n    return this.charAt(0).toUpperCase() + this.slice(1);\n  };\n\n  $.extend({\n    set_uda_ajax_mode_on: function set_uda_ajax_mode_on() {\n      // En caso de que la función $.ajax no haya sido sustituida aún.\n      if ($.ajax !== $.rup_ajax) {\n        // Almacenamos la función original $.ajax en $.ajaxUDA para poder restablecerla posteriormente.\n        $.ajaxUDA = $.ajax; // Sustituimos la función $.ajax por la función $.rup_ajax.\n\n        $.ajax = $.rup_ajax;\n      }\n    },\n    // Llamada ajax utilizada por los componentes RUP\n    rup_ajax: function rup_ajax(options) {\n      // Configuracion por defecto\n      var defaults = {\n        cache: false,\n        error: null\n      },\n          rup_ajax_settings = $.extend({}, defaults, options),\n          error_default,\n          error_user,\n          complete_user,\n          complete_default; // Callback de error especificado en la llamada a rup_ajax\n\n      error_user = rup_ajax_settings.error; // Funcion error generica\n\n      error_default = function error_default(xhr, textStatus, errorThrown) {\n        var errorText = $.rup.rupAjaxDefaultError(xhr, textStatus, errorThrown); // Si se ha producido un error de los tratados lo mostramos\n\n        if (error_user != null) {\n          $(error_user(xhr, textStatus, errorThrown));\n        } else {\n          if (errorText) {\n            $.rup.showErrorToUser(errorText);\n          }\n        }\n      }; // Callback de error especificado en la llamada a rup_ajax\n\n\n      complete_user = rup_ajax_settings.complete; // Function complete generica\n\n      complete_default = function complete_default(xhr, textStatus) {\n        // Restablecemos la función $.ajax original.\n        if ($.ajax === $.rup_ajax && $.ajaxUDA !== $.rup_ajax) {\n          $.ajax = $.ajaxUDA;\n        } // Se ejecuta el callback complete especificado por el usuario.\n\n\n        if (complete_user != null) {\n          complete_user(xhr, textStatus);\n        }\n      }; // Asociamos las funciones a las propiedades que van a utilizarse en la peticion AJAX\n\n\n      rup_ajax_settings.complete = complete_default;\n      rup_ajax_settings.error = error_default; //Se valida la presencia de portal y, llegados al caso, se adecuan las llamadas ajax para trabajar con portales\n\n      rup_ajax_settings.url = $.rup_utils.setNoPortalParam(rup_ajax_settings.url); // Se realiza la llamada ajax\n\n      if (typeof $.ajaxUDA === 'function') {\n        return $.ajaxUDA(rup_ajax_settings);\n      } else {\n        return $.ajax(rup_ajax_settings);\n      }\n    }\n  }); //Se crea el objeto base, que alberga toda la metódica y gestión de los componentes RUP, dentro de la jerarquía de JQuery\n\n  $.rup = $.rup || {};\n  $.extend($.rup, {\n    _uaMatch: function _uaMatch(ua) {\n      ua = ua.toLowerCase();\n      var match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) || /(webkit)[ \\/]([\\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) || /(msie) ([\\w.]+)/.exec(ua) || ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) || [];\n      return {\n        browser: match[1] || '',\n        version: match[2] || '0'\n      };\n    }\n  });\n\n  var matched = $.rup._uaMatch(navigator.userAgent);\n\n  var browser = {};\n\n  if (matched.browser) {\n    browser[matched.browser] = true;\n    browser.version = matched.version;\n  } // Chrome is Webkit, but Webkit is also Safari.\n\n\n  if (browser.chrome) {\n    browser.webkit = true;\n  } else if (browser.webkit) {\n    browser.safari = true;\n  }\n\n  $.rup._browser = browser;\n  $.browser = browser;\n  $.extend($.rup, {\n    i18n: {},\n    appResources: {},\n    //fichero de recursos de la aplicacion\n    lang: null,\n    version: rup_version,\n    //Funcion que rupera el idioma del navegador por defecto\n    getBrowserLenguage: function getBrowserLenguage() {\n      return (navigator.language || navigator.userLanguage).split('-')[0].toLowerCase();\n    },\n    browser: {\n      version: $.rup._browser.version,\n      versionNumber: $.rup_utils.isNumeric($.rup._browser.version) ? parseInt($.rup._browser.version) : undefined,\n      isIE: /Trident\\//.test(navigator.userAgent),\n      isSafari: $.rup._browser.safari && $.rup._browser.webkit ? true : false,\n      isChrome: $.rup._browser.safari && $.rup._browser.webkit ? true : false,\n      isFF: $.rup._browser.mozilla ? true : false,\n      isOpera: $.rup._browser.opera ? true : false,\n      xhrFileUploadSupport: new XMLHttpRequest().upload !== undefined ? true : false\n    },\n\n    /**********/\n\n    /** i18n **/\n\n    /**********/\n    //Funcion encargada de recargar, segun idioma definido en rup.lang, los literales a presentar en la pagina\n    setLiterals: function setLiterals(lang) {\n      if (lang !== undefined && lang !== null && lang !== '') {\n        $.rup.lang = lang;\n      } //Peticion ajax destinada a cargar el fichero  JSon de literales\n\n\n      return $.rup_ajax({\n        url: $.rup.RUP + '/resources/rup.i18n_' + $.rup.lang + '.json',\n        dataType: 'json',\n        type: 'GET',\n        contentType: 'application/x-www-form-urlencoded; charset=UTF-8',\n        success: function success(data) {\n          //Se cargan los literales generales de la aplicacion en RUP\n          $.rup.i18n.base = data; //Se cargan los literales de la tabla por separado (consecuencia de la naturalza de JqGrid)\n\n          $.jgrid = {};\n          $.extend($.jgrid, data.rup_jqtable);\n          $.jgrid.formatter.date.S = new Function('j', data.rup_jqtable.formatter.date.S);\n        },\n        error: function error(XMLHttpRequest, textStatus) {\n          //tratamiento de error\n          $.rup.errorGestor($.rup.i18nTemplate($.rup.i18n.base, 'rup_base.i18nRupJsonParseError', textStatus, textStatus, XMLHttpRequest.status, XMLHttpRequest.statusText));\n        }\n      });\n    },\n    //Funcion encargada de cargar el fichero i18n de la aplicación (síncrono)\n    getFile_i18n: function getFile_i18n() {\n      //Peticion ajax destinada a devolver el fichero JSON indicado\n      return $.rup_ajax({\n        url: $.rup.APP_STATICS + '/resources/' + $.rup.WAR_NAME + '.i18n_' + $.rup.lang + '.json',\n        dataType: 'json',\n        type: 'GET',\n        contentType: 'application/x-www-form-urlencoded; charset=UTF-8',\n        success: function success(data) {\n          //se carga la respuesta del servidor en la estructura I18n de RUP\n          $.rup.i18n.app = data;\n        },\n        error: function error(XMLHttpRequest, textStatus) {\n          $.rup.errorGestor($.rup.i18nTemplate($.rup.i18n.base, 'rup_base.i18nAppJsonParseError', textStatus, textStatus, XMLHttpRequest.status, XMLHttpRequest.statusText));\n        }\n      });\n    },\n    //Funcion encargada de cargar el fichero de la aplicación especificado (síncrono)\n    getFile: function getFile(file) {\n      if (file === undefined && file === null && file === '') {\n        $.rup.errorGestor('No se ha definido el fichero a cargar');\n      } else {\n        if (!$.rup.i18n[file]) {\n          //Peticion ajax destinada a devolver el fichero JSON indicado\n          $.rup_ajax({\n            url: $.rup.APP_STATICS + '/resources/' + file + '.json',\n            dataType: 'json',\n            type: 'GET',\n            async: false,\n            contentType: 'application/x-www-form-urlencoded; charset=UTF-8',\n            success: function success(data) {\n              //se carga la respuesta del servidor en la estructura I18n de RUP\n              $.rup.i18n[file] = data;\n            },\n            error: function error(XMLHttpRequest, textStatus, errorThrown) {\n              $.rup.errorGestor('Se ha producido un error en el parseo del fichero JSON de la aplicación => ' + textStatus + '.<br>' + 'Error devuelto:<br>' + errorThrown);\n            }\n          });\n        }\n      }\n    },\n\n    /**\r\n     * Método encargado de devolver el literal obtenido de estructura JSON (en caso de error devuelve el recurso establecido por defecto).\r\n     *\r\n     * @method i18nParse\r\n     * @param {Object.<string, *>} properties - Objeto que contiene el recurso idiomático a obtener.\r\n     * @param {string} i18nCaption - Clave del recurso a obtener.\r\n     * @param {string} defaultValue - Valor por defecto a usar cuando no se pueda devolver el recurso solicitado.\r\n     * @return {string} Recurso idiomático.\r\n     */\n    i18nParse: function i18nParse(properties, i18nCaption) {\n      var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'Error';\n\n      if (i18nCaption !== undefined && i18nCaption !== null && i18nCaption !== '') {\n        var i18nCaptionArr = i18nCaption.split('.'),\n            i18nValue = properties;\n\n        for (var i = 0; i < i18nCaptionArr.length; i++) {\n          //Navegar por las ramas JSON\n          if (!$.isEmptyObject(i18nValue)) {\n            i18nValue = i18nValue[i18nCaptionArr[i]]; //Existe objeto -> navegar\n          } else {\n            if (defaultValue === undefined || defaultValue === null || defaultValue === '') {\n              i18nValue = i18nCaption; //No existe objeto -> devolver clave\n            } else {\n              i18nValue = defaultValue; //No existe objeto -> devolver valor recibido por parametro\n            }\n\n            break;\n          }\n        }\n\n        return i18nValue == undefined ? i18nCaption : i18nValue;\n      } else {\n        return 'null_i18nCaption'; //retorno si no se recibe clave a buscar\n      }\n    },\n\n    /**\r\n     * Método encargado de devolver el literal obtenido de estructura JSON (en caso de error devuelve el recurso establecido por defecto).\r\n     *\r\n     * @method i18nTemplate\r\n     * @param {Object.<string, *>} properties - Objeto que contiene el recurso idiomático a procesar.\r\n     * @param {string} i18nCaption - Clave del recurso a procesar.\r\n     * @return {string} Recurso idiomático.\r\n     */\n    i18nTemplate: function i18nTemplate(properties, i18nCaption) {\n      var template = jQuery.rup.i18nParse(properties, i18nCaption),\n          args = $.makeArray(arguments).slice(2);\n\n      if (template === undefined) {\n        template = '';\n      }\n\n      return template.replace(/\\{(\\d+)\\}/g, function (m, i) {\n        return args[i];\n      });\n    },\n\n    /**********/\n    //Funcion encargada de presentar los errores\n    errorGestor: function errorGestor(message) {\n      var title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $.rup.i18nParse($.rup.i18n.base, 'rup_global.developerError');\n      $.rup_messages('msgError', {\n        title: title,\n        message: '<p>' + message + '</p>'\n      });\n      throw message;\n    },\n    //Funcion encargada de hacer las inicializaciones basicas de RUP\n    iniRup: function iniRup() {\n      //Inicializar variables de ficheros de recuros (rup y app)\n      $.rup.i18n.app = {};\n      $.rup.i18n.base = {}; //retrocompatibilidad\n\n      if (!window.LOCALE_COOKIE_NAME) {\n        window.LOCALE_COOKIE_NAME = 'language';\n      }\n\n      if (!window.LOCALE_PARAM_NAME) {\n        window.LOCALE_PARAM_NAME = 'locale';\n      } //Se cargan las variables generales del servidor (convertir variables js a variables internas de rup)\n\n\n      $.rup.APP_RESOURCES = window.APP_RESOURCES;\n      $.rup.APP_STATICS = window.STATICS + '/' + window.APP_RESOURCES;\n      $.rup.CTX_PATH = window.CTX_PATH;\n      $.rup.RUP = window.RUP;\n      $.rup.STATICS = window.STATICS;\n      $.rup.WAR_NAME = window.WAR_NAME; //model\n\n      $.rup.AVAILABLE_LANGS = window.AVAILABLE_LANGS;\n      $.rup.AVAILABLE_LANGS_ARRAY = $.map($.rup.AVAILABLE_LANGS.split(','), function (elem) {\n        return elem.replace(/^\\s*|\\s*$/g, '');\n      });\n      $.rup.DEFAULT_LANG = window.DEFAULT_LANG;\n      $.rup.LAYOUT = window.LAYOUT; //mvc-config.xml\n\n      $.rup.LOCALE_COOKIE_NAME = window.LOCALE_COOKIE_NAME;\n      $.rup.LOCALE_PARAM_NAME = window.LOCALE_PARAM_NAME; //metodos http permitidos en la emulacion xhr para el uso con iframes\n\n      $.rup.IFRAME_ONLY_SUPPORTED_METHODS = ['GET', 'POST']; //Auditoria\n\n      if (window.AUDIT_PATH) {\n        $.rup.AUDIT_PATH = window.AUDIT_PATH;\n      } else {\n        if ($.rup.CTX_PATH[$.rup.CTX_PATH.length - 1] === '/') {\n          $.rup.AUDIT_PATH = $.rup.CTX_PATH + 'audit';\n        } else {\n          $.rup.AUDIT_PATH = $.rup.CTX_PATH + '/audit';\n        }\n      }\n\n      if (window.IS_EJIE) {\n        $.rup.IS_EJIE = window.IS_EJIE;\n      } else {\n        $.rup.IS_EJIE = false;\n      } //Borrar las variables javascript externas\n      // delete APP_RESOURCES;\n      // delete CTX_PATH;\n      // delete RUP;\n      // delete STATICS;\n      // delete WAR_NAME;\n      //model\n      // delete AVAILABLE_LANGS;\n      // delete LAYOUT;\n      //mvc-config.xml\n      // delete LOCALE_COOKIE_NAME;\n      // delete LOCALE_PARAM_NAME;\n      // Obtención de la cookie de idioma.\n\n\n      var cookie = $.rup_utils.get($.rup.LOCALE_COOKIE_NAME);\n      var validCookieValue = $.inArray(cookie, $.rup.AVAILABLE_LANGS_ARRAY) !== -1 ? true : false;\n      this.lang = validCookieValue ? cookie : $.rup.DEFAULT_LANG; // Carga de los literales por defecto.\n\n      $.rup.setLiterals().then(function () {\n        // Carga de ficheros de literales de la aplicación.\n        if (jQuery.rup.WAR_NAME !== '') {\n          $.rup.getFile_i18n().then(function () {\n            global.initRupI18nPromise.resolve();\n          });\n        } else {\n          global.initRupI18nPromise.resolve();\n        }\n      }); // Esperar a que los recursos idiomáticos estén disponibles.\n\n      global.initRupI18nPromise.then(function () {\n        // Si la cookie no es válida o no existe, se lanzarán los mensajes de error correspondientes.\n        if (!validCookieValue) {\n          if (cookie) {\n            $.rup.errorGestor($.rup.i18nTemplate($.rup.i18n.base, 'rup_base.cookieLanguageNotSupportedError', $.rup.LOCALE_COOKIE_NAME), $.rup.i18nParse($.rup.i18n.base, 'rup_base.cookieLanguageNotSupportedErrorTitle'));\n\n            $.rup._avoidRUPFails();\n\n            return false;\n          } else {\n            $.rup.errorGestor($.rup.i18nTemplate($.rup.i18n.base, 'rup_base.cookieLanguageNotFoundError', $.rup.LOCALE_COOKIE_NAME), $.rup.i18nParse($.rup.i18n.base, 'rup_base.cookieLanguageNotFoundErrorTitle'));\n\n            $.rup._avoidRUPFails();\n\n            return false;\n          }\n        }\n      });\n    },\n    //Función encargada de cargar variables por defecto si no se han cargado los literales (ej. cookies deshabilitadas)\n    //NOTA: El que se entre en la función indica mala configuración/error en la aplicación\n    _avoidRUPFails: function _avoidRUPFails() {\n      //Forzar carga formato fecha si no se ha cargado (evitar fallos)\n      var dateFormat = $.rup.i18nParse($.rup.i18n.base, 'rup_date.dateFormat');\n\n      if (dateFormat === 'rup_date.dateFormat') {\n        $.rup.i18n.base.rup_date = {\n          dateFormat: 'dd/mm/yy'\n        };\n      }\n\n      $.jgrid = {\n        formatter: {\n          integer: {}\n        }\n      };\n    },\n    //Método gestor de invocación de un método expuesto por un componente o la creación del mismo (asociada a la metódica de invocación y gestión de los métodos públicos de un componente)\n    getAccessor: function getAccessor(obj, objName, expr) {\n      if (typeof expr === 'string') {\n        var fn = obj[expr];\n\n        if (fn === undefined) {\n          $.rup.errorGestor(objName + ' - No Existe el método \"' + expr + '\"  en el patrón.');\n        } else {\n          return fn;\n        }\n      } else {\n        if (typeof expr === 'function') {\n          $.rup.errorGestor(objName + ' - No es posible pasar funciones al patrón.');\n        }\n      }\n\n      return undefined;\n    },\n    rupAjaxDefaultError: function rupAjaxDefaultError(xhr) {\n      // Evaluamos el error que se ha producido\n      var errorText = null;\n\n      if (xhr.status == 0) {\n        errorText = $.rup.i18nParse($.rup.i18n.base, 'rup_ajax.httpStatus0');\n      } else if (xhr.status == 401) {\n        errorText = $.rup.i18nParse($.rup.i18n.base, 'rup_ajax.httpStatus401');\n      } else if (xhr.status == 404) {\n        errorText = $.rup.i18nParse($.rup.i18n.base, 'rup_ajax.httpStatus404');\n      } else if (xhr.status == 500) {\n        errorText = $.rup.i18nParse($.rup.i18n.base, 'rup_ajax.httpStatus500');\n      } else if (xhr.status == 503) {\n        errorText = $.rup.i18nParse($.rup.i18n.base, 'rup_ajax.httpStatus503');\n      } //Excepción\n      else if (xhr.status == 406) {\n        //Código de error de UDA\n        var obj = '';\n\n        try {\n          obj = JSON.parse(xhr.responseText);\n          errorText = obj;\n        } catch (error) {\n          errorText = xhr.responseText;\n        }\n      } else if (xhr.status == 413) {\n        // Error de Too Large Entity\n        var _obj = '';\n\n        try {\n          _obj = JSON.parse(xhr.responseText);\n          errorText = _obj.rupFeedback.message.label;\n        } catch (error) {\n          errorText = xhr.responseText;\n        }\n      }\n\n      return errorText;\n    },\n    //Función encargada de crear los patrones de RUP que se alberguen en el componente de JQuery directamente\n    //La estructura creada, proporciona proteccion a los metodos publicos y privados\n    rupObjectConstructor: function rupObjectConstructor(name, object) {\n      //Se crea el nuevo gestor del Pótron\n      if ($[name] === undefined) {\n        $[name] = function (opts) {\n          var options = opts,\n              isMethodCall = typeof options === 'string',\n              args = $.makeArray(arguments).slice(1),\n              returnValue = this; // prevent calls to internal methods\n\n          if (isMethodCall && options.charAt(0) === '_') {\n            return returnValue;\n          }\n\n          if (isMethodCall) {\n            if (options !== 'extend') {\n              var instance = $.isEmptyObject($.data(object)) ? $.data(object, object) : $.data(object),\n                  methodValue = instance && typeof instance[options] === \"function\" ? instance[options].apply(instance, args) : 'no-function';\n\n              if (methodValue === 'no-function') {\n                return false;\n              } else {\n                returnValue = methodValue;\n              }\n            } else {\n              object = $.extend.apply(null, [true, object].concat(args[0]));\n            }\n          } else {\n            var _instance = $.isEmptyObject($.data(object)) ? $.data(object, object) : $.data(object);\n\n            if (_instance && object._init !== undefined && object._init !== null) {\n              _instance._init($.makeArray(arguments));\n            }\n          }\n\n          return returnValue;\n        };\n      }\n    },\n    //Funcion encargada de crear los patrones de RUP que usen el selector de JQuery.\n    //La estructura creada, proporciona proteccion a los metodos publicos y privados\n    rupSelectorObjectConstructor: function rupSelectorObjectConstructor(name, object) {\n      //Se crea el nuevo gestor del Patrón\n      if ($.fn[name] === undefined) {\n        $.fn[name] = function (opts) {\n          var options = opts,\n              isMethodCall = typeof options === 'string',\n              args = $.makeArray(arguments).slice(1),\n              returnValue = this; // prevent calls to internal methods\n\n          if (isMethodCall && options.charAt(0) === '_') {\n            return returnValue;\n          }\n\n          if (isMethodCall) {\n            if (options !== 'extend') {\n              var instance = $.extend(this, object),\n                  methodValue = instance && typeof instance[options] === \"function\" ? instance[options].apply(instance, args) : 'no-function';\n\n              if (methodValue === 'no-function') {\n                return false;\n              } else {\n                returnValue = methodValue;\n              }\n            } else {\n              object = $.fn.extend.apply(null, [true, object].concat(args[0]));\n            }\n          } else {\n            var _instance2 = $.extend(this, object);\n\n            if (_instance2 && object._init !== undefined && object._init !== null) {\n              _instance2._init($.makeArray(arguments));\n            }\n          }\n\n          return returnValue;\n        };\n      }\n    },\n    //Funcion encargada de mostrar mediante el correspondiente canal el mensaje de error.\n    //La estructura creada, proporciona proteccion a los metodos publicos y privados\n    showErrorToUser: function showErrorToUser(errorText) {\n      if (errorText != null && errorText !== '') {\n        // Se comprueba si existe un dialog visible con una region de rup_feedbak\n        var dialog_feedbacks = $('.ui-dialog:visible .rup-feedback'),\n            feedbacks = dialog_feedbacks.length !== 0 ? dialog_feedbacks : $('.rup-feedback'); // Se comprueba si existe un rup_feedback en la pagina\n\n        if (feedbacks.length != 0) {\n          var feedback_props = {\n            delay: null\n          },\n              //Si existen rup_feedbacks cogemos el último, será el que se está mostrando.\n          feedback_principal = $('#' + feedbacks[feedbacks.length - 1].id); // Mostramos el error en el feedback\n\n          feedback_principal.rup_feedback('option', feedback_props);\n          feedback_principal.rup_feedback('set', errorText, 'error');\n          feedback_principal.rup_feedback('show');\n        } else {\n          // Si no hay feedback definido mostramos un mensaje\n          $.rup_messages('msgError', {\n            title: $.rup.i18nParse($.rup.i18n.base, 'rup_ajax.errorTitle'),\n            message: errorText\n          });\n        }\n      }\n    }\n  }); //Almacenar y restaurar eventos\n\n  $.fn.extend({\n    storeEvents: function storeEvents() {\n      this.each(function () {\n        $(this).data('storedEvents', $.extend(true, {}, $._data($(this)[0], 'events')));\n      });\n      $(this).off();\n      return this;\n    },\n    restoreEvents: function restoreEvents() {\n      this.each(function () {\n        var events = $.data(this, 'storedEvents');\n\n        if (events) {\n          $(this).off();\n\n          for (var type in events) {\n            for (var handler in events[type]) {\n              if (_typeof(events[type][handler]) === 'object') {\n                $.event.add(this, type, events[type][handler], events[type][handler].data);\n              }\n            }\n          }\n        }\n      });\n      return this;\n    }\n  });\n  /*\r\n  * EVENTOS PROPIOS\r\n  * mousestop: Detecta cuando el ratón para su desplazamiento\r\n  */\n\n  $.fn.mousestop = {};\n  $.fn.mousestop.defaults = {\n    delay: 300\n  };\n  $.event.special.mousestop = {\n    setup: function setup(data) {\n      var $self = $(this);\n      $self.data('mousestop', $.extend(true, {}, $.fn.mousestop.defaults, data));\n      $self.on({\n        'mouseenter.rup_mousestop': mouseenterHandler,\n        'mouseleave.rup_mousestop': mouseleaveHandler,\n        'mousemove.rup_mousestop': mousemoveHandler\n      });\n    },\n    teardown: function teardown() {\n      $(this).removeData('mousestop').off('.rup_mousestop');\n    }\n  };\n\n  function mouseenterHandler() {\n    var self = this;\n    clearTimeout(self.timeout);\n  }\n\n  function mouseleaveHandler() {\n    var self = this;\n    clearTimeout(self.timeout);\n  }\n\n  function mousemoveHandler(event) {\n    var self = this,\n        $self = $(this);\n    clearTimeout(self.timeout);\n    self.timeout = setTimeout(function () {\n      $self.trigger('mousestop', event);\n    }, $self.data('mousestop').delay);\n  } // Control de teclas especiales Ctrl y Shift\n\n\n  jQuery('body').on({\n    'keydown.rup': function keydownRup(event) {\n      var $body = jQuery('body'),\n          ret;\n\n      switch (event.which) {\n        case 16:\n          if ($body.data('tmp.multiselect.shiftPressed') !== true) {\n            $body.data('tmp.multiselect.shiftPressed', true);\n            ret = $body.triggerHandler('rup_shiftKeyDown');\n\n            if (ret === false) {\n              event.preventDefault();\n              return false;\n            }\n          }\n\n          break;\n\n        case 17:\n          if ($body.data('tmp.multiselect.ctrlPressed') !== true) {\n            $body.data('tmp.multiselect.ctrlPressed', true);\n            ret = $body.triggerHandler('rup_ctrlKeyDown');\n\n            if (ret === false) {\n              event.preventDefault();\n              return false;\n            }\n          }\n\n          break;\n      }\n    },\n    'keyup.rup': function keyupRup(event) {\n      var $body = jQuery('body'),\n          ret;\n\n      switch (event.which) {\n        case 16:\n          if ($body.data('tmp.multiselect.shiftPressed') !== false) {\n            $body.data('tmp.multiselect.shiftPressed', false);\n            ret = $body.triggerHandler('rup_shiftKeyUp');\n\n            if (ret === false) {\n              return false;\n            }\n          }\n\n          break;\n\n        case 17:\n          if ($body.data('tmp.multiselect.ctrlPressed') !== false) {\n            $body.data('tmp.multiselect.ctrlPressed', false);\n            ret = $body.triggerHandler('rup_ctrlKeyUp');\n\n            if (ret === false) {\n              return false;\n            }\n          }\n\n          break;\n\n        case 32:\n          /* Se aplicara a todos los navegadores que no sean Firefox.\r\n             Este evento permite que los checkboxes puedan ser seleccionados/deseleccionados con el teclado. */\n          if (typeof InstallTrigger == 'undefined' && $(event.target).is(':checkbox')) {\n            event.preventDefault();\n            $(event.target).prop('checked', function () {\n              return !this.checked;\n            });\n          }\n\n          break;\n      }\n    }\n  });\n  jQuery.extend($.rup, {\n    isCtrlPressed: function isCtrlPressed() {\n      return jQuery('body').data('tmp.multiselect.ctrlPressed') === true;\n    },\n    isShiftPressed: function isShiftPressed() {\n      return jQuery('body').data('tmp.multiselect.shiftPressed') === true;\n    }\n  });\n  /**\r\n  * Creamos la funcion que audita el componente\r\n  */\n\n  function prepareAuditData(compName, auditing) {\n    return {\n      'url': window.location.href,\n      'versionRup': $.rup.version,\n      'nombreComponente': compName,\n      'codApp': $.rup.APP_RESOURCES,\n      'timeStamp': Date.now(),\n      'auditing': auditing\n    };\n  }\n\n  function ajaxAudit(jsonPost) {\n    $.ajax($.rup.AUDIT_PATH, {\n      method: 'POST',\n      contentType: 'application/json',\n      data: JSON.stringify(jsonPost)\n    });\n  }\n\n  jQuery.extend($.rup, {\n    auditComponent: function auditComponent(compName, auditing) {\n      if ($.rup.IS_EJIE) {\n        ajaxAudit(prepareAuditData(compName, auditing));\n      }\n    }\n  }); //Ejemplo de extension de la funcion de inicio\n  //$.extend($.rup.iniRup, console.log(\"mundo\")) ;\n  //Inicializacion de las funciones de gestion de RUP en general\n\n  $.rup.iniRup();\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.base.js?");

/***/ }),

/***/ "./src/rup.breadCrumb.js":
/*!*******************************!*\
  !*** ./src/rup.breadCrumb.js ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * El componente de migas muestra a los usuarios la ruta de navegación que ha seguido por la aplicación permitiéndoles volver hacia niveles superiores hasta la página de inicio.\r\n *\r\n * @summary Componente RUP BeadCrumb.\r\n * @module rup_breadCrumb\r\n * @example\r\n * var properties = {\r\n *   logOutUrl: \"/x21aAppWar/logout\",\r\n *   breadCrumb: {\r\n *       \"patrones\" : {\r\n *           // Literal\r\n *\t\t    \"i18nCaption\" : \"patrones\",\r\n *\t\t    \"tabsMixto\" : {\"i18nCaption\":\"tabsMixto\"},\r\n *\t\t    \"grid\" : { \"i18nCaption\" : \"grid\" },\r\n *\t\t    // Submenu\r\n *\t\t    \"subLevel\":[\r\n *\t\t\t   {\"i18nCaption\":\"all\", \"url\": \"/x21aAppWar/patrones/all\" },\r\n *\t\t\t   {\"i18nCaption\":\"accordion\", \"url\": \"/x21aAppWar/patrones/accordion\" }\r\n *\t\t    ]\r\n *\t     },\r\n *\t     \"experimental\" : {\r\n *\t\t    // Literal\r\n *\t\t    \"i18nCaption\" : \"experimental\",\r\n *\t\t    \"maestro_detalle\" : { \"i18nCaption\" : \"maestro_detalle\" },\r\n *\t\t    \"mant_multi_entidad\": { \"i18nCaption\" : \"mant_multi_entidad\" },\"\r\n *        }\r\n *\t}\r\n * };\r\n * jQuery(\"#x21aAppWar_migas\").rup_breadCrumb(properties);\r\n */\n\n/*global define */\n\n/*global jQuery */\n\n/*global DESTROY_XLNETS_SESSION */\n\n/*global LOGGED_USER */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./core/utils/xbreadcrumbs */ \"./src/core/utils/xbreadcrumbs.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.widget('$.rup_breadCrumb', {\n    /**\r\n     * @description Opciones por defecto de configuración del widget.\r\n     *\r\n     * @name options\r\n     *\r\n     * @property {string}  [showSpeed=fast] - Propiedad que indica la velocidad de despliegue del subnivel en milisegundos o en términos de jQuery (posibles valores: “normal”,”slow”)..\r\n     * @property {string}  [hideSpeed=''] - Propiedad que indica la velocidad de colapso del subnivel en milisegundos o en términos de jQuery (posibles valores: “normal”,”slow”)..\r\n     * @property {boolean}  [collapsible=false] - Propiedad que indica si el primer nivel es plegable.\r\n     * @property {Number}  [collapsedWidth=10] - Propiedad de indica el tamaño del texto cuando está colapsado (en pixeles).\r\n     * @property {module:rup_breadCrumb~breadCrumb} breadCrumb - La estructura de las migas se define mediante un array en notación json cuyo nombre será el mismo que el identificador del elemento sobre el que se aplica el componente.\r\n     * @property {string} [initURL] -  Define la ruta a seguir cuando se pulse sobre el primer elemento (ej. “Inicio”). Tomará como valor la ruta del contexto (contextPath) y le concatenará el literal indicado. El literal se definirá sin barra ‘/’ inicial.\r\n     * @property {string} [i18nId] - Indica el identificador del objeto JSON para la resolución de los literales del componente. En caso de no definirse se tomará el ID del objeto sobre el que se crea el componente.\r\n     */\n\n    /**\r\n     * @description Configuración de la estructura de las migas\r\n     * @typedef breadCrumb\r\n     *\r\n     * @property {string}  [i18nCaption] - Texto que se mostrará como miga. Obtenido del fichero de literales de la aplicación.\r\n     * @property {string}  [literal] - Submiga (mapeada mediante la URL). Internamente tendrá una estructura definida con los atributos i18nCaption, literales (submigas) y sublevel.\r\n     * @property {module:rup_breadCrumb~sublevel}  [sublevel] - Define un submenú para la miga a la que se asocia.\r\n     */\n\n    /**\r\n     * @description Define un submenú para la miga a la que se asocia.\r\n     * @typedef sublevel\r\n     *\r\n     * @property {string} [i18nCaption] - Texto que se mostrará como elemento del menú obtenido del fichero de literales de la aplicación.\r\n     * @property {string} [url] - Define la ruta a seguir cuando se pulse sobre el elemento.\r\n     */\n    options: {\n      showSpeed: 'fast',\n      hideSpeed: '',\n      collapsible: false,\n      collapsedWidth: 10,\n      breadCrumb: $.rup.APP_RESOURCES + '.breadCrumb'\n    },\n\n    /**\r\n     * Función encargada de crear los elementos visuales e inicializar el componente.\r\n     *\r\n     * @name _create\r\n     * @function\r\n     * @private\r\n     */\n    _create: function _create() {\n      var _this = this;\n\n      window.initRupI18nPromise.then(function () {\n        var pathname = window.location.pathname,\n            breadCrumbEntry = pathname.substring($.rup.CTX_PATH.length),\n            breadCrumbElems = breadCrumbEntry.split('/'),\n            breadCrumbSpan = $('<div>').addClass('d-inline-flex col-auto p-0 mr-3'),\n            ulBreadCrumb = $('<ul>').addClass('rup-breadCrumb_main d-inline-flex'),\n            breadCrumbStruct = null,\n            lastCrum = null,\n            initURL = _this.options.initUrl !== undefined ? $.rup.CTX_PATH + _this.options.initUrl : $.rup.CTX_PATH,\n            i18nId = _this.options.i18nId === undefined ? _this.element.attr('id') : _this.options.i18nId,\n            idBreadCrumb = _this.element[0].id,\n            logoutUrl = $(\"div.rup-breadCrumb_root\").data(\"logoutUrl\");\n\n        _this.element.append(\"<div class='row'></div>\"); //Obtenemos la estructura del fichero que se recibe como parametro o el de por defecto del patrón\n\n\n        if (_this.options.breadCrumb instanceof Object) {\n          breadCrumbStruct = _this.options.breadCrumb;\n        } else {\n          $.rup.getFile(_this.options.breadCrumb);\n          breadCrumbStruct = $.rup.i18n[_this.options.breadCrumb];\n        }\n\n        if (!window.LOGGED_USER || window.LOGGED_USER === 'NULL') {\n          window.LOGGED_USER = '';\n        }\n\n        if (!window.DESTROY_XLNETS_SESSION) {\n          window.DESTROY_XLNETS_SESSION = 'false';\n        }\n\n        if (LOGGED_USER !== '') {\n          //Se añade el boton de desconexion si este fuera necesario\n          if (logoutUrl !== undefined) {\n            if (DESTROY_XLNETS_SESSION === 'false') {\n              //función encargada de poner el icono y el literal de salida\n              $(_this.element.children()[0]).append($('<div class=\\'rup-breadCrumb_logoutDiv col-2 order-last text-right\\'>').append($('<a>').addClass('rup-breadCrumb_link').attr('logOutHref', logoutUrl).on('click', function () {\n                $.rup_messages('msgConfirm', {\n                  message: $.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.menuDisconnectMessage'),\n                  title: $.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.menuDisconnectTitle'),\n                  OKFunction: function OKFunction() {\n                    $(window).attr('location', $('#' + idBreadCrumb + ' .rup-breadCrumb_link').attr('logOutHref'));\n                  }\n                });\n              }).html($.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.exit')).append($('<span>').addClass('ui-icon rup-icon rup-icon-door-out rup-breadCrumb_exitImg'))));\n            } else {\n              //función encargada de poner el icono y el literal de desconexion\n              $(_this.element.children()[0]).append($('<div class=\\'rup-breadCrumb_logoutDiv col-12 col-sm-3 order-last text-sm-right\\'>').append($('<a>').addClass('rup-breadCrumb_link').attr('logOutHref', logoutUrl).on('click', function () {\n                $.rup_messages('msgConfirm', {\n                  message: $.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.menuSecuritySystemDisconnectMessage'),\n                  title: $.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.menuDisconnectTitle'),\n                  OKFunction: function OKFunction() {\n                    $(window).attr('location', $('#' + idBreadCrumb + ' .rup-breadCrumb_link').attr('logOutHref'));\n                  }\n                });\n              }).mouseover(function () {\n                $(this).find('i.mdi').removeClass('mdi-lock-open').addClass('mdi-lock');\n              }).mouseleave(function () {\n                $(this).find('i.mdi').removeClass('mdi-lock').addClass('mdi-lock-open');\n              }).html($.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.disconnect')).prepend($('<i class=\"mdi mdi-lock-open align-baseline\" aria-hidden=\"true\"></i>'))));\n            }\n          } // Se añade el span con el texto de \"xxx esta aqui\"\n\n\n          breadCrumbSpan.append($('<span>').addClass('rup-breadCrumbs_span').text(LOGGED_USER + $.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.userAre')));\n        } else {\n          // Se añade el span con el texto de \"Usted esta aqui\"\n          breadCrumbSpan.append($('<span>').addClass('rup-breadCrumbs_span').text($.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.youAre')));\n        } //se le añade el link de Inicio\n\n\n        ulBreadCrumb.append(_this._createLI($.rup.i18nParse($.rup.i18n.base, 'rup_breadCrumb.start'), initURL)); //nos recorremos los elementos del path y los buscamos en el fichero json de migas para crear los enlaces\n\n        for (var i = 0; i < breadCrumbElems.length; i++) {\n          //Si encontramos dentro del fichero de estructura de las migas el parte de la url\n          if (breadCrumbStruct[breadCrumbElems[i]]) {\n            //Generamos su miga de actualimos la estructura en la que buscar, devolviendo las estructura del nivel que se ha añadido\n            breadCrumbStruct = _this._createBreadCrumb(breadCrumbStruct[breadCrumbElems[i]], breadCrumbElems[i], ulBreadCrumb, i18nId);\n          }\n        } //se le añade al ultimo elemento el estilo current\n        //$(\"li:last-child\", ulBreadCrumb).addClass(\"rup-breadCrumb_current\");\n        //$(ulBreadCrumb).find(\"li\").last().addClass(\"rup-breadCrumb_current\");\n\n\n        $(ulBreadCrumb.children()[ulBreadCrumb.children().length - 1]).addClass('rup-breadCrumb_current').find('img.rup-icon, span.mdi').remove(); //el último elemento no es navegable\n        //lastCrum = $(ulBreadCrumb).find(\"li\").last().find(\"a\");\n\n        lastCrum = $(ulBreadCrumb.children()[ulBreadCrumb.children().length - 1]).find('a').first();\n        lastCrum.replaceWith($('<span>').text(lastCrum.text()).css({\n          'font-weight': 'bold',\n          'color': '#333333'\n        })); // delete lastCrum;\n        //y por ultimo se añade el span, todo el ul a un nuevo div que lo contenga\n\n        $(_this.element.children()[0]).append('<div class=\"breadCrumb_where_is col-12 col-sm-9 order-first\"></div>');\n        $('#' + idBreadCrumb + ' .breadCrumb_where_is').append([breadCrumbSpan, ulBreadCrumb]);\n        $(ulBreadCrumb).wrap($('<div>').addClass('d-inline-flex col-auto px-0 pb-1'));\n        ulBreadCrumb.xBreadcrumbs();\n        $(_this.element).trigger('afterInit'); //Se audita el componente\n\n        $.rup.auditComponent('rup_breadCrumb', 'init');\n      });\n    },\n\n    /**\r\n     * Funcion que crea el li correspondiente de la miga accediendo al fichero de lenguage correspondiente.\r\n     *\r\n     * @name _createLI\r\n     * @function\r\n     * @private\r\n     * @param {string} i18nCaption - Key del recurso i18n a buscar en los ficheros idiomáticos correspondientes.\r\n     * @param {string} href - Url a la que debe navegar la miga.\r\n     * @param {boolean} [separator] - Indica si se debe de pintar un separador posterior a la miga actual.\r\n     * @return {object} - Devuelve el li resultante correspondiente a la miga que se está procesando.\r\n     */\n    _createLI: function _createLI(i18nCaption, href, separator) {\n      var li = $('<li>'),\n          a = $('<a>').attr('href',\n      /*$.rup.CTX_PATH + */\n      href).text(i18nCaption);\n      li.append(a);\n\n      if (separator !== false) {\n        li.append($('<span>').addClass('mdi mdi-chevron-right pr-1 pl-1'));\n      }\n\n      return li;\n    },\n\n    /**\r\n     * Funcion que añade al ul el li correspondiente en cada nivel y devuelve la nueva entructura en la que seguir iterando.\r\n     *\r\n     * @name _createBreadCrumb\r\n     * @function\r\n     * @private\r\n     * @param {object} breadCrumbStruct - Objeto que contiene la estructura de migas de pan que se están creando.\r\n     * @param {object} elem - Elemento actual que se está procesando.\r\n     * @param {object} parentUl - Referencia al ul padre donde insertar la li correspondiente.\r\n     * @param {string} i18nId - Key del recurso i18n a buscar en los ficheros idiomáticos correspondientes.\r\n     * @return {object} - Devuelve la nueva entructura en la que seguir iterando.\r\n     */\n    _createBreadCrumb: function _createBreadCrumb(breadCrumbStruct, elem, parentUl, i18nId) {\n      var _this2 = this;\n\n      //nos recorremos la entrada correspondiente\n      var createdLI,\n          subLevelUL = $('<ul>');\n\n      if (breadCrumbStruct.i18nCaption) {\n        //si tengo i18nCaption es que es elemento final\n        createdLI = this._createLI($.rup.i18nParse($.rup.i18n.app[i18nId], breadCrumbStruct.i18nCaption), breadCrumbStruct.url ? $.rup.CTX_PATH + breadCrumbStruct.url : '#');\n      } //si tengo subLevel se crearan hijo como si fuesen un menu\n\n\n      if (breadCrumbStruct.subLevel) {\n        var _loop = function _loop() {\n          // Definir URL a usar en los enlaces\n          var breadCrumbLinkURL = '#';\n\n          if (breadCrumbStruct.subLevel[i].url) {\n            breadCrumbLinkURL = breadCrumbStruct.subLevel[i].url;\n            var menuLinkURL = $('nav.rup-navbar ul.nav a[href^=\"' + breadCrumbStruct.subLevel[i].url + '\"]'); // Comprobar si más de un elemento contiene la URL buscada. Se busca al comienzo para evitar que no encuentre nada cuando las URLs contienen parámetros\n\n            if (menuLinkURL.length > 1) {\n              $.each(menuLinkURL, function (key, element) {\n                var elementURL = $(element).attr('href'); // Comprobar la URL obtenida con la definida por el usuario. Cuando la URL obtenida contiene parámetros, se eliminan para poder hacer una correcta comparación\n\n                if ((elementURL.indexOf('?') != -1 ? elementURL.substring(0, elementURL.indexOf('?')) : elementURL) === breadCrumbLinkURL) {\n                  menuLinkURL = elementURL;\n                  return false;\n                }\n              });\n            } else {\n              menuLinkURL = menuLinkURL.attr('href');\n            }\n\n            if (menuLinkURL != undefined) {\n              breadCrumbLinkURL = menuLinkURL;\n            }\n          } //creamos cada li y se lo añadimos al ul nuevo\n\n\n          subLevelUL.append(_this2._createLI($.rup.i18nParse($.rup.i18n.app[i18nId], breadCrumbStruct.subLevel[i].i18nCaption), breadCrumbLinkURL, false).css('background', 'none'));\n        };\n\n        //nos recorremos todos los submenus\n        for (var i = 0; i < breadCrumbStruct.subLevel.length; i++) {\n          _loop();\n        } //añadimos al li padre el nuevo ul con todos li de los sublevels\n\n\n        createdLI.append(subLevelUL);\n        $(createdLI).on('mouseover', function () {\n          $(this).find('a').eq(1).focus();\n        });\n        createdLI.on('keydown', function (event) {\n          switch (event.keyCode) {\n            case $.ui.keyCode.UP:\n              var enlaces = $(this).find('li > a');\n\n              for (var i = 0; i <= enlaces.length; i++) {\n                if (enlaces[i].text === $(event.target).text()) {\n                  break;\n                }\n              }\n\n              if ($(enlaces[i - 1]).length > 0) {\n                $(enlaces[i - 1]).focus();\n              } else {\n                $(this).find('li > a').last().focus();\n              }\n\n              break;\n\n            case $.ui.keyCode.DOWN:\n              // var enlaces = $(this).find('li > a');\n              for (var j = 0; j <= enlaces.length; j++) {\n                if (enlaces[j].text === $(event.target).text()) {\n                  break;\n                }\n              }\n\n              if ($(enlaces[i + 1]).length > 0) {\n                $(enlaces[i + 1]).focus();\n              } else {\n                $(this).find('li > a').first().focus();\n              }\n\n              break;\n\n            case $.ui.keyCode.ESCAPE:\n              $(this).children('ul').hide();\n              break;\n\n            default:\n          }\n        });\n      }\n\n      parentUl.append(createdLI);\n      return breadCrumbStruct;\n    },\n\n    /**\r\n     * Modifica las opciones de configuración del componente.\r\n     *\r\n     * @name _setOption\r\n     * @function\r\n     * @private\r\n     * @param {string} key - Nombre de la propiedad.\r\n     * @param {*} value - Valor que se desea asignar a la propiedad.\r\n     */\n    _setOption: function _setOption() {\n      $.Widget.prototype._setOption.apply(this, arguments);\n    },\n\n    /**\r\n     * Elimina los componenes visuales generados para el widget así como las estructuras internas.\r\n     *\r\n     * @name destroy\r\n     * @function\r\n     * @example\r\n     * // Elimina el feedback\r\n     * jQuery(\"#breadCrumb\").rup_breadCrumb(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      $.Widget.prototype.destroy.apply(this, arguments);\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./src/rup.breadCrumb.js?");

/***/ }),

/***/ "./src/rup.button.js":
/*!***************************!*\
  !*** ./src/rup.button.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n *\r\n * Presenta un control de interación con el usuario. Se trata de extender los botones estandar del HTML para dotarles de mayores funcionalidades con las que mejorar la usabilidad de la aplicación.\r\n *\r\n * @summary Componente RUP Button.\r\n * @module rup_button\r\n * @example\r\n * // Botón por defecto\r\n * $(\"#idButton\").rup_button({});\r\n * // Botón desplegable\r\n * $(\"#idButtonDrop\").rup_button({\r\n *\t  dropdown:{\r\n *\t\t  dropdownListId:\"dropdownHtmlList\"\r\n *\t  }\r\n * });\r\n */\n\n/*global define */\n\n/*global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./rup.dialog */ \"./src/rup.dialog.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_button = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_button', rup_button)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_button('extend', {\n    addButtonToDropdown: function addButtonToDropdown() {}\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_button('extend', {\n    _doDropdownListById: function _doDropdownListById($dropdownButton, $container, dropdownSettings) {\n      var $dropdownList = jQuery('#' + dropdownSettings.dropdownListId);\n      dropdownSettings.$dropdownList = $dropdownList;\n      $container.append($dropdownList);\n      $dropdownButton.on('click.rup_dopdown', function (event) {\n        $dropdownList.toggleClass('open');\n        event.stopPropagation();\n      });\n      $dropdownList.on('click.rup_dopdown', function (event) {\n        event.stopPropagation();\n      });\n      jQuery(document).on('click.rup_dopdown.close', function () {\n        $dropdownList.removeClass('open');\n      });\n    },\n    _doDropdownByDialog: function _doDropdownByDialog($dropdownButton, $container, dropdownSettings) {\n      var $dropdownDialog = jQuery('#' + dropdownSettings.dropdownDialog).rup_dialog(dropdownSettings.dropdownDialogConfig);\n      jQuery.extend(dropdownSettings.dropdownDialogConfig, {\n        autoOpen: false,\n        position: {\n          my: 'right top',\n          at: 'right bottom',\n          of: $container\n        }\n      }); // Estilos\n\n      $dropdownDialog.parent().addClass('rup-dropdown-dialog');\n      $dropdownButton.on('click', function () {\n        $dropdownDialog.rup_dialog('open');\n      });\n    },\n    _doDropdownByButtons: function _doDropdownByButtons($dropdownButton, $container, dropdownSettings) {\n      var $self = this,\n          $ul = $('<ul>'),\n          $li,\n          buttons = dropdownSettings.buttons;\n      $ul.attr({\n        id: $self.attr('id') + '_dropdownList'\n      }).addClass('rup-dropdown-option-list rup-toolbar_menuButtonContainer');\n\n      for (var i = 0; i < buttons.length; i++) {\n        $li = $('<li>');\n\n        $self._addButtonToDropdown($li, buttons[i]);\n\n        $ul.append($li);\n      }\n\n      $dropdownButton.on('click.rup_dopdown', function (event) {\n        $ul.toggleClass('open');\n        event.stopPropagation();\n      });\n      $ul.on('click.rup_dropdown', function (event) {\n        event.stopPropagation();\n      });\n      jQuery(document).on('click.rup_dopdown.close', function () {\n        $ul.removeClass('open');\n      });\n      $container.append($ul);\n    },\n    _addButtonToDropdown: function _addButtonToDropdown($base, obj, json_i18n) {\n      //añade a la toolbar un 'mbutton' (sin botones)\n      var boton = '',\n          buttonId;\n\n      if (obj.id === undefined) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_button.mbuttonsIdError'));\n        boton = null;\n      } else {\n        buttonId = obj.id; // Se comprueba si el id del boton contiene el identificador de la botonera. En caso de no existir se añade al principio.\n\n        if (buttonId.indexOf($(this).attr('id')) !== 0) {\n          buttonId = $(this).attr('id') + '##' + obj.id;\n        }\n\n        boton = $('<a></a>').attr('id', buttonId).text($.rup.i18nParse(json_i18n, obj.i18nCaption)).addClass('rup-toolbar_button'); //Si no se define un estilo especial se aplica por defecto\n\n        if (obj.css === undefined) {\n          obj.css = 'rup-toolbar_menuButtonIcon';\n        }\n\n        boton.button().button('option', 'icons', {\n          primary: obj.css,\n          secondary: null\n        });\n      }\n\n      $base.append(boton); //Añadir evento keydown\n\n      this._setKeyDown(boton);\n\n      if (obj.click) {\n        //Añadir eventos\n        boton.click({\n          i18nCaption: obj.i18nCaption\n        }, obj.click);\n      }\n\n      return boton;\n    },\n    _setKeyDown: function _setKeyDown(boton) {\n      boton.on('keydown', function (event) {\n        var object = $(event.currentTarget),\n            objectParent = object.parent(),\n            nextObject;\n\n        switch (event.keyCode) {\n          case $.ui.keyCode.TAB:\n            if (!event.shiftKey) {\n              if (object.next().attr('id') !== objectParent.attr('id') + '-rightButtons') {\n                //Siguiente boton\n                nextObject = object.next(':focusable');\n              } else {\n                //Primer botón de los alineados derecha\n                nextObject = object.next().children(':focusable').first();\n              } //Navegar entre botones\n\n\n              if (nextObject.length === 1) {\n                nextObject.focus();\n                $.rup_toolbar.focusedExternally[objectParent.attr('id')] = true;\n                return false;\n              }\n            }\n\n        }\n      });\n    }\n  }); //*******************************\n  // MÉTODO DE INICIALIZACION\n  //*******************************\n\n  $.fn.rup_button('extend', {\n    /**\r\n     * Método de inicialización del componente.\r\n     *\r\n     * @function _init\r\n     * @private\r\n     */\n    _init: function _init(args) {\n      var settings = $.extend(true, {}, $.fn.rup_button.defaults, $(this).data(), args[0]);\n      return this.each(function () {\n        var self = this,\n            $self = $(this),\n            $dropdownList,\n            $container,\n            dropdownSettings = {};\n        self._ADAPTER = $.rup.adapter[settings.adapter];\n\n        if (settings.fab === true) {\n          $self.addClass('rup-button-fab');\n\n          if (settings.fixed === true) {\n            $self.addClass('rup-button-fixed');\n          }\n\n          if (settings.fixed === true) {\n            $self.addClass('rup-button-fixed');\n          }\n\n          if (settings.list !== null || settings.layer !== null) {\n            var $fabGroupDiv = $('<div>').addClass('rup-button-fab-group'); //$self.wrap($fabListDiv);\n\n            $self.add($('#' + settings.list)).wrapAll($fabGroupDiv);\n\n            if (settings.list !== null) {\n              $('#' + settings.list).addClass('rup-button-fab-list');\n              $('button', '#' + settings.list).addClass('rup-button-fab-sm').rup_button();\n            }\n\n            if (settings.layer !== null) {\n              $('#' + settings.layer).addClass('rup-button-fab-layer');\n            }\n          }\n        } // Se envuelve el texto en un span\n\n\n        if ($self.find(settings.labelBaseCss).length === 0) {\n          $self.contents().filter(function () {\n            return this.nodeType === Node.TEXT_NODE && /\\S/.test(this.nodeValue);\n          }).wrap($('<span>').addClass(settings.labelBaseCss));\n        } // Se añade los css al label\n\n\n        if (settings.labelCss) {\n          $self.find('.' + settings.labelBaseCss).addClass(settings.labelCss);\n        } // Se añade el icono al botón\n\n\n        if (settings.iconCss) {\n          $self.prepend($('<i>').attr('aria-hidden', 'true').addClass(settings.iconCss));\n        } // Se gestiona el evento del click\n\n\n        if (settings.click && typeof settings.click === \"function\") {\n          $self.on('click', settings.click);\n        }\n\n        if (settings.dropdown === undefined || settings.dropdown === false) {\n          // Botón normal\n          $self.button(settings);\n          $self.addClass('rup-button').removeClass('ui-button ui-corner-all ui-widget');\n\n          if (settings.mbutton === true) {\n            // Configuramos el mbutton\n            var $mbuttonContainer = $self.siblings('[aria-labelledby=\\'' + $self.attr('id') + '\\']');\n\n            if ($mbuttonContainer) {\n              $self.on('click.rup_mbutton', function (event) {\n                $mbuttonContainer.addClass('rup-mbutton-open');\n                event.stopPropagation();\n              });\n              $mbuttonContainer.on('click.rup_mbutton', function (event) {\n                event.stopPropagation();\n              });\n              jQuery(document).on('click.rup_mbutton.close', function () {\n                $mbuttonContainer.removeClass('rup-mbutton-open');\n              });\n            }\n          }\n        } else {\n          // Inicialización del dropdown\n          $.extend(true, dropdownSettings, $.fn.rup_button.dropdown_defaults, args[0].dropdown);\n          $self.addClass('rup-button rup-dropdown'); // Wrap into div\n\n          $container = jQuery('<div>').attr('class', 'rup-dropdown-btn-group');\n          $container = $self.wrap($container).parent();\n          dropdownSettings.$container = $container;\n          $self.button({});\n          $self.addClass('rup-dropdown');\n\n          var $dropdownButton = self._ADAPTER.createDropdownButton.bind($self)(settings);\n\n          $self.after($dropdownButton);\n\n          if (dropdownSettings.dropdownListId) {\n            $dropdownList = jQuery('#' + dropdownSettings.dropdownListId);\n            dropdownSettings.$dropdownList = $dropdownList;\n            $container.append($dropdownList);\n            $dropdownButton.on('click.rup_dopdown', function (event) {\n              $dropdownList.toggleClass('open');\n              event.stopPropagation();\n            });\n            $dropdownList.on('click.rup_dopdown', function (event) {\n              event.stopPropagation();\n            });\n            jQuery(document).on('click.rup_dopdown.close', function () {\n              $dropdownList.removeClass('open');\n            });\n          } else if (dropdownSettings.dropdownDialog) {\n            // Configuracion del dropdown con un RUP dialog\n            jQuery.extend(dropdownSettings.dropdownDialogConfig, {\n              autoOpen: false,\n              position: {\n                my: 'right top',\n                at: 'right bottom',\n                of: $container\n              }\n            });\n            var $dropdownDialog = jQuery('#' + dropdownSettings.dropdownDialog).rup_dialog(dropdownSettings.dropdownDialogConfig); // Estilos\n\n            $dropdownDialog.parent().addClass('rup-dropdown-dialog');\n            $dropdownButton.on('click', function () {\n              $dropdownDialog.rup_dialog('open');\n            });\n          } else if (dropdownSettings.buttons) {\n            // Configuración del dropdown a partir de buttons\n            $self._doDropdownByButtons($dropdownButton, $container, dropdownSettings);\n          }\n        } //Se audita el componente\n\n\n        $.rup.auditComponent('rup_button', 'init');\n      }); // TODO : Invocación al plugin\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  /**\r\n   * Opciones por defecto de configuración del componente.\r\n   *\r\n   * @function defaults\r\n   * @property {boolean | Object} [dropdown=false] - Determina si el botón va a contar con un menú desplegable de acciones secundarias. En caso de mostrar un desplegable esta propiedad contendrá el objeto de configuración del mismo.\r\n   */\n\n  $.fn.rup_button.defaults = {\n    adapter: 'button_material',\n    dropdown: false,\n    fab: false,\n    fixed: false,\n    list: null,\n    layer: null,\n    iconCss: undefined,\n    labelCss: undefined,\n    mbutton: false,\n    click: undefined,\n    labelBaseCss: 'rup-ui-button-text'\n  };\n  /**\r\n   * @description Opciones por defecto del objeto de configuración del menú desplegable asociado al botón.\r\n   *\r\n   * @name dropdown_defaults\r\n   */\n\n  $.fn.rup_button.dropdown_defaults = {\n    dropdownListId: undefined,\n    dropdownDialog: undefined,\n    dropdownDialogConfig: {\n      type: $.rup.dialog.DIV\n    }\n  };\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.button.js?");

/***/ }),

/***/ "./src/rup.calendar.js":
/*!*****************************!*\
  !*** ./src/rup.calendar.js ***!
  \*****************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($, global) {/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! underscore */ \"./node_modules/underscore/modules/index-all.js\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var rup_base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rup.base */ \"./src/rup.base.js\");\n/* harmony import */ var rup_base__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(rup_base__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var popper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! popper.js */ \"./node_modules/popper.js/dist/esm/popper.js\");\n/* harmony import */ var _external_bootstrap_calendar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./external/bootstrap-calendar */ \"./src/external/bootstrap-calendar/js/calendar.js\");\n/* harmony import */ var _external_bootstrap_calendar__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_external_bootstrap_calendar__WEBPACK_IMPORTED_MODULE_4__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/* eslint-env jquery,amd */\n\n/* eslint-disable no-console */\n\n\n\n\n\n/**\r\n * Componente de calendario para la visualización de eventos sobre una interfaz dinámica y personalizable.\r\n *\r\n * @summary Componente RUP Calendar.\r\n * @module rup_calendar\r\n * @example\r\n * var properties = {\r\n *  day: 'now',\r\n * \tclasses: {\r\n *\t\tmonths: {\r\n *\t\t\tinmonth: 'cal-day-inmonth',\r\n *\t\t\toutmonth: 'cal-day-outmonth',\r\n *\t\t\tsaturday: 'cal-day-weekend',\r\n *\t\t\tsunday: 'cal-day-weekend',\r\n *\t\t\tholidays: 'cal-day-holiday',\r\n *\t\t\ttoday: 'cal-day-today'\r\n *\t\t},\r\n *\t\tweek: {\r\n *\t\t\tworkday: 'cal-day-workday',\r\n *\t\t\tsaturday: 'cal-day-weekend',\r\n *\t\t\tsunday: 'cal-day-weekend',\r\n *\t\t\tholidays: 'cal-day-holiday',\r\n *\t\t\ttoday: 'cal-day-today'\r\n *\t\t}\r\n *  },\r\n *  weekbox: true\r\n * };\r\n *\r\n * $('#calendar').rup_calendar(properties);\r\n */\n//****************************************************************************************************************\n// DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n//****************************************************************************************************************\n\nvar rup_calendar = {};\nvar calObj = {};\n\nvar errorstr = function errorstr(str) {\n  var estr = 'Cannot call methods on rup_calendar before init. tried to call method ' + str;\n  throw ReferenceError(estr);\n};\n\nvar self; ////El componente subyacente requiere underscore en el scope de window\n\nwindow._ = underscore__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n$.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_calendar', rup_calendar)); //*******************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//*******************************\n\n$.fn.rup_calendar('extend', {\n  /**\r\n       * Navega en el calendario al punto especificado\r\n       * Si el parámetro es un string las únicas opciones son:\r\n       *  - next\r\n       *  - prev\r\n       *  - today\r\n       *\r\n       * @name navigate\r\n       * @param {(string|Date)} navigation Hacia dónde navegar\r\n       * @function\r\n       * @example\r\n       * $(\"#calendar\").rup_calendar('navigate','next');\r\n       */\n  navigate: function navigate(navigation) {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('navigate');\n    } // Si el valor es un objeto Date en función navegamos hasta la posición indicada\n\n\n    if (navigation instanceof Date) {\n      if ($(ctx).data('cal').options.date_range_start !== undefined) {\n        if (navigation.getTime() < $(ctx).data('cal').options.date_range_start.getTime()) {\n          console.warn('Can´t navigate to an out of range time.');\n          return;\n        }\n      }\n\n      if ($(ctx).data('cal').options.date_range_end !== undefined) {\n        if (navigation.getTime() > $(ctx).data('cal').options.date_range_end.getTime()) {\n          console.warn('Can´t navigate to an out of range time.');\n          return;\n        }\n      }\n\n      var pos = $.extend({}, $(ctx).data('cal').options.position);\n      pos.start.setTime(navigation.getTime());\n      $(ctx).data('cal').options.day = pos.start.getFullYear() + '-' + pos.start.getMonthFormatted() + '-' + pos.start.getDateFormatted();\n      $(ctx).data('cal').view();\n      return;\n    } // Si no hay valor se considera que por defecto es \"today\"\n\n\n    navigation = navigation ? navigation : 'today';\n\n    if ($.inArray(navigation, ['next', 'prev', 'today']) < 0) {\n      throw Error('Parámetro inválido');\n    }\n\n    $(ctx).data('cal').navigate(navigation);\n  },\n\n  /**\r\n       * Confirma si en la vista está el día actual.\r\n       * @name isToday\r\n       * @returns {boolean} true si el dia actual está en la vista. false en caso contrario\r\n       * @function\r\n       * @example\r\n       * $(\"#calendar\").rup_calendar('isToday');\r\n       */\n  isToday: function isToday() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('isToday');\n    }\n\n    return $(ctx).data('cal').isToday();\n  },\n\n  /**\r\n       * Devuelve la instancia del subyacente bootstrap-calendar\r\n       * \r\n       * @name instance\r\n       * @returns {object} instancia del calendar subyacente\r\n       * @function\r\n       * @example\r\n       * $(\"#calendar\").rup_calendar('instance');\r\n       */\n  instance: function instance() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('instance');\n    }\n\n    return $(ctx).data('cal');\n  },\n\n  /**\r\n       * Oculta el menú contextual.\r\n       *\r\n       * @name setView\r\n       * @param {string} viewmode El modo de visualizacion a establecer\r\n       * @function\r\n       * @example\r\n       * $(\"#calendar\").rup_calendar('setView','day');\r\n       */\n  setView: function setView(viewmode) {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('setView');\n    } // El valor por defecto es month.\n\n\n    viewmode = viewmode ? viewmode : 'month';\n\n    if ($.inArray(viewmode, ['year', 'month', 'week', 'day']) < 0) {\n      throw Error('Parámetro inválido');\n    }\n\n    $(ctx).data('cal').view(viewmode);\n  },\n\n  /**\r\n       * Obtiene el modo de visualización actual.\r\n       * \r\n       * @name getView\r\n       * @returns {string} modo de visualización\r\n       * @function\r\n       * @example\r\n       * $('#calendar').rup_calendar('getView');\r\n       */\n  getView: function getView() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getView');\n    }\n\n    return $(ctx).data('cal').options.view;\n  },\n\n  /**\r\n       * Obtiene el año del calendario\r\n       * @name getYear\r\n       * @returns {number} el año del calendario\r\n       * @example\r\n       * $('#calendar').rup_calendar('getYear');\r\n       */\n  getYear: function getYear() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getYear');\n    }\n\n    return $(ctx).data('cal').getYear();\n  },\n\n  /**\r\n       * Obtiene el mes del calendario (Enero, Febrero, ..., Diciembre)\r\n       * @name getMonth\r\n       * @returns {string} el mes del calendario\r\n       * @example\r\n       * $('#calendar').rup_calendar('getMonth');\r\n       */\n  getMonth: function getMonth() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getMonth');\n    }\n\n    return $(ctx).data('cal').getMonth();\n  },\n\n  /**\r\n       * Obtiene la semana del calendario\r\n       * @name getWeek\r\n       * @returns {number} la semana del calendario\r\n       * @example\r\n       * $('#calendar').rup_calendar('getWeek');\r\n       */\n  getWeek: function getWeek() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getWeek');\n    }\n\n    var date = new Date($(ctx).data('cal').getStartDate());\n    return date.getWeek();\n  },\n\n  /**\r\n       * Obtiene el día de la semana (Lunes - Domingo)\r\n       * @name getDay\r\n       * @returns {string} el día de la semana\r\n       * @example\r\n       * $('#calendar').rup_calendar('getDay');\r\n       */\n  getDay: function getDay() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getDay');\n    }\n\n    return $(ctx).data('cal').getDay();\n  },\n\n  /**\r\n       * Obtiene el título de la vista de calendario.\r\n       *\r\n       * @name getTitle\r\n       * @function\r\n       * @returns {string} título de la vista\r\n       * @example\r\n       * $(\"#calendar\").rup_calendar(\"getTitle\");\r\n       */\n  'getTitle': function getTitle() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getTitle');\n    }\n\n    return $(ctx).data('cal').getTitle();\n  },\n\n  /**\r\n       * Obtiene la fecha desde la que se muestra el calendario\r\n       * @name getStartDate\r\n       * @function\r\n       * @returns {Date} fecha\r\n       * @example\r\n       * $(\"#calendar\").rup_calendar(\"getStartDate\");\r\n       */\n  getStartDate: function getStartDate() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getStartDate');\n    }\n\n    return $(ctx).data('cal').getStartDate();\n  },\n\n  /**\r\n       * Obtiene la fecha hasta la que se muestra el calendario\r\n       * @name getEndDate\r\n       * @function\r\n       * @returns {Date} fecha\r\n       * @example\r\n       * $(\"#calendar\").rup_calendar(\"getEndDate\");\r\n       */\n  getEndDate: function getEndDate() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getEndDate');\n    }\n\n    return $(ctx).data('cal').getEndDate();\n  },\n\n  /**\r\n       * Método que establece y recarga las opciones\r\n       * \r\n       * @name option\r\n       * @function\r\n       * @param {string|object} opción Opcion a consultar/establecer u objeto para establecer las propiedades\r\n       * @param {any} value Si el primer parametro asigna este valor a la opción especificada\r\n       * @example\r\n       * $('#calendar').rup_calendar('weekbox', true);\r\n       * $('#calendar').rup_calendar({weekbox:true, view:'month'});\r\n       */\n  option: function option(opt, val) {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('option');\n    }\n\n    if (_typeof(opt) === 'object') {\n      var optNames = Object.keys(opt);\n      $.each(optNames, function (i, e) {\n        $(ctx).data('cal').options[e] = opt[e];\n\n        $(ctx).data('cal')._render();\n      });\n      return;\n    }\n\n    if (val === undefined) {\n      return $(ctx).data('cal').options[opt];\n    } else {\n      $(ctx).data('cal').options[opt] = val;\n\n      $(ctx).data('cal')._render();\n    }\n  },\n\n  /**\r\n       * Devuelve un listado de eventos entre las dos fechas introducidas\r\n       * \r\n       * @name getEventsBetween\r\n       * @function\r\n       * @param {Date} fechaDesde\r\n       * @param {Date} fechaHasta\r\n       * @returns {Array} listado de Eventos entre las fechas\r\n       */\n  getEventsBetween: function getEventsBetween(desde, hasta) {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('getEventsBetween');\n    }\n\n    return $(ctx).data('cal').getEventsBetween(desde, hasta);\n  },\n\n  /**\r\n       * Muestra los eventos de la casilla con la fecha especificada.\r\n       * @name showCell\r\n       * @function\r\n       * @param {Date} fecha fecha a consultar\r\n       * @returns {boolean} true si había eventos. false en caso contrario.\r\n       * @example\r\n       * $('#calendar').rup_calendar('showCell', new Date('2000-01-01'));\r\n       */\n  showCell: function showCell(date) {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('showCell');\n    }\n\n    if (!(date instanceof Date)) {\n      throw TypeError('Se requiere un Date como parámetro');\n    }\n\n    var getCell = function getCell(date) {\n      var ts = date.getTime();\n      var col = $('.events-list');\n      var sel = col.filter(function (i, e) {\n        return $(e).attr('data-cal-start') <= ts && $(e).attr('data-cal-end') > ts;\n      });\n\n      if (sel.length === 0) {\n        return false;\n      }\n\n      return $(sel).parent();\n    };\n\n    var cell = getCell(date);\n\n    if (cell) {\n      if ($('#cal-slide-box').css('display') === undefined || $('#cal-slide-box').css('display') === 'none') {\n        $(ctx).trigger('beforeShowCell');\n        cell.mouseover();\n        cell.click();\n      }\n    } else {\n      return false;\n    }\n  },\n\n  /**\r\n       * Oculta el div con los eventos si está desplegado\r\n       * @name hideCells\r\n       * @function\r\n       * @example\r\n       * $('#calendar').rup_calendar('hideCells');\r\n       */\n  hideCells: function hideCells() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('showCell');\n    }\n\n    $(ctx).trigger('beforeHideCell');\n    $('#cal-slide-box').css('display', 'none');\n    $(ctx).trigger('afterHideCell');\n  },\n\n  /**\r\n       * Recarga los eventos y aplica las opciones cambiadas\r\n       * \r\n       * @name refresh\r\n       * @function\r\n       * @example\r\n       * $('#calendar').rup_calendar('refresh');\r\n       */\n  refresh: function refresh() {\n    var ctx = this;\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('refresh');\n    } //Primero actualizamos las opciones (Por si se cambia events_source)\n\n\n    $(ctx).data('cal')._render(); //Actualizamos los eventos\n\n\n    $(ctx).data('cal')._loadEvents();\n\n    $(ctx).data('cal')._render();\n\n    setTimeout(function () {\n      $(ctx).trigger('afterRefresh');\n    }, 400);\n  },\n\n  /**\r\n       * Elimina el calendario y retorna a la estructura HTML anterior a la creación del calendario.\r\n       *\r\n       * @name destroy\r\n       * @function\r\n       * @example\r\n       * $(\"#contextMenu\").rup_calendar(\"destroy\");\r\n       */\n  destroy: function destroy() {\n    var ctx = this;\n\n    if ($(ctx).data('cal') === undefined) {\n      errorstr('destroy');\n    }\n\n    if (!$(ctx).data('cal').options) {\n      errorstr('destroy');\n    }\n\n    $(ctx).data('cal').options.selector = undefined;\n    $(ctx).removeClass('cal-context');\n    $(ctx).removeData();\n    $(ctx).children().remove();\n    $(ctx).trigger('afterDestroy');\n  }\n}); //*******************************\n// DEFINICIÓN DE MÉTODOS PRIVADOS\n//*******************************\n\n$.fn.rup_calendar('extend', {\n  _callIfFunction: function _callIfFunction() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    if (args.length === 0) return false;\n\n    if (args.length > 1) {\n      var fnc = args[0];\n      var params = args.slice(1);\n\n      if (fnc !== undefined && typeof fnc === 'function') {\n        return fnc.apply(this, params);\n      } else {\n        return false;\n      }\n    } else {\n      if (args !== undefined && typeof args === 'function') {\n        return args.call(this);\n      }\n    }\n  },\n\n  /**\r\n       * Método de inicialización del componente.\r\n       *\r\n       * @name _init\r\n       * @function\r\n       * @private\r\n       * @param {object} args - Parámetros de inicialización del componente.\r\n       */\n  _init: function _init(args) {\n    if (args.length > 1) {\n      $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n    } else {\n      //Se recogen y cruzan las paremetrizaciones del objeto\n      self = this;\n      var customSettings = args[0];\n      var settings = $.extend({}, $.fn.rup_calendar.defaults, customSettings);\n      self._ADAPTER = $.rup.adapter[settings.adapter];\n\n      settings.onAfterEventsLoad = function () {\n        for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          args[_key2] = arguments[_key2];\n        }\n\n        self._callIfFunction.call(this, $.fn.rup_calendar.defaults.onAfterEventsLoad, args);\n\n        self._callIfFunction.call(this, customSettings.rupAfterEventsLoad, args);\n\n        $(self).trigger('afterEventsLoad');\n      };\n\n      settings.onAfterViewLoad = function () {\n        for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n          args[_key3] = arguments[_key3];\n        }\n\n        self._callIfFunction.call(this, $.fn.rup_calendar.defaults.onAfterViewLoad, args);\n\n        self._callIfFunction.call(this, customSettings.rupAfterViewLoad, args);\n\n        $(self).trigger('afterViewLoad');\n      }; // if ($.rup_utils.aplicatioInPortal()) {\n      // \tsettings.appendTo = '.r01gContainer';\n      // }\n      //El componente subyacente requiere i18n en una variable del scope de window\n\n\n      if (!window.calendar_languages) {\n        window.calendar_languages = {};\n      }\n\n      window.calendar_languages[settings.language] = $.rup.i18n.base.rup_calendar; //Lanzar el plugin subyaciente\n\n      calObj = new $(self).calendar(settings);\n      this.data('cal', calObj);\n      this.trigger('afterInitCalendar'); // Se audita el componente\n\n      $.rup.auditComponent('rup_calendar', 'init');\n    }\n  }\n}); //******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//******************************************************\n\n/**\r\n     * @description Propiedades de configuración del componente. Todas son opcionales. Se puede crear un calendario con la funcionalidad básica sin especificar ninguna de estas opciones.\r\n     *\r\n     * @name defaults\r\n     * @property {string} tooltip_container - Container al que se le añade el tooltip.\r\n     * @property {(string|function|object)} events_source - Origen de los eventos a añadir en el calendario.\r\n     * @property {string} width - Ancho que ocupara el calendario.\r\n     * @property {string} view - vista que se mostrara por defecto (year/month/week/day).\r\n     * @property {string} day - Punto de inicio del calendario. puede ser 'now' o una fecha en formato (yyyy-mm-dd).\r\n     * @property {string} time_start - La hora a la que empieza la vista de día.\r\n     * @property {string} time_end - La hora a la que acaba la vista de day.\r\n     * @property {string} time_split - Cada cuantos minutos se muestra un separador en la vista de día.\r\n     * @property {boolean} format12 - Especifica si se usa o no el formato de 12H en lugar del de 24H.\r\n     * @property {string} am_suffix - En el formato de 12H especifica el sufijo para la mañana (default: AM).\r\n     * @property {string} pm_suffix - En el formato de 12H especifica el sufijo para la tarde (default: PM).\r\n     * @property {string} tmpl_path - Path a la ubicación de las tempaltes de calendar (Debe terminar en '/').\r\n     * @property {boolean} tmpl_cache - Indica si cachea o no las templates (default: true).\r\n     * @property {object} classes - Establece las clases para cada celda en funcion de la vista.\r\n     * @property {(string|null)} modal - ID de la ventana modal. Si se establece las url en los eventos se abrirán en la modal.\r\n     * @property {string} modal_type - Modo en el que aparece el modal (iframe/ajax/template).\r\n     * @property {function} modal_title - Función para establecer el título del modal. Recibe el evento como parámetro.\r\n     * @property {object} views - configuración de las vistas.\r\n     * @property {boolean} merge_holidays - Añade al calendario algunas festividades como año nuevo o el día de la independencia americana.\r\n     * @property {boolean} display_week_numbers - Determina si se muestra el número de la semana.\r\n     * @property {boolean} weekbox - Determina si se muestra o no un div con el número de la semana en la vista de mes.\r\n     * @property {object} headers - Cabeceras para las llamadas ajax realizadas desde el calendario.\r\n     * @property {boolean} cell_navigation - Determina si se cambia la vista al día o mes haciendo doble click en la celda o click en el número de dia o nombre de mes.\r\n     * @property {number} date_range_start - Indica la fecha mínima del rango de operación permitido del calendario. Para retirar esta opcion mediante el método 'options' hay que pasar el valor null.\r\n     * @property {number} date_range_end - Indica la fecha máxima del rango de operación permitido del calendario. Para retirar esta opcion mediante el método 'options' hay que padar el valor null.\r\n     * @property {function} onAfterEventsLoad - Callback que se ejecuta tras cargar los eventos (Recibe los eventos como parámetros).\r\n     * @property {function} onBeforeEventsLoad - Callback que se ejecuta antes de cargar los eventos.\r\n     * @property {function} onAfterViewLoad - Callback que se ejecuta tras cargar una nueva vista (Recibe la vista como parámetro).\r\n     * @property {function} onAfterModalShow - Callback que se ejecuta tras mostrar el modal (Recibe los eventos como parámetros).\r\n     * @property {function} onAfterModalHidden - Callback que se ejecuta tras esconder el modal.(Recibe los eventos como parámetros).\r\n     */\n\n/**\r\n     * @description Propiedades del objeto 'classes'\r\n     * \r\n     * @name classes\r\n     * \r\n     * @property {object} classes.month - Establece las clases en la vista de mes.\r\n     * @property {string} classes.month.inmonth - Establece las clases para las celdas que representan días del mes actual.\r\n     * @property {string} classes.month.outmonth - Establece las clases para las celdas que representan días ajenos al mes actual.\r\n     * @property {string} classes.month.saturday - Establece las clases para las celdas que representan los sábados.\r\n     * @property {string} classes.month.sunday - Establece las clases para las celdas que representan los domingos.\r\n     * @property {string} classes.month.holidays - Establece las clases para las celdas que representan los festivos.\r\n     * @property {string} classes.month.today - Establece las clases para la celda que representan el día actual.\r\n     * @property {object} classes.week - Establece las clases en la vista de semana.\r\n     * @property {string} classes.week.workday - Establece las clases para las celdas que representan días entre semana.\r\n     * @property {string} classes.week.saturday - Establece las clases para las celdas que representan los sábados.\r\n     * @property {string} classes.week.sunday - Establece las clases para las celdas que representan los domingos.\r\n     * @property {string} classes.week.holidays - Establece las clases para las celdas que representan los festivos.\r\n     * @property {string} classes.week.today - Establece las clases para la celda que representan el día actual.\r\n     */\n\n/**\r\n     * @description Propiedades del objeto 'views'\r\n     * \r\n     * @name views\r\n     * \r\n     * @property {object} views.year - Establece las opciones para la vista anual.\r\n     * @property {integer} views.year.slide_events - Si el valor es 1 permite desplegar los eventos desde las celdas.\r\n     * @property {integer} views.year.enable - Si el valor es 1 habilita la vista.\r\n     * @property {object} views.month - Establece las opciones para la vista mensual.\r\n     * @property {integer} views.month.slide_events - Si el valor es 1 permite desplegar los eventos desde las celdas.\r\n     * @property {integer} views.month.enable - Si el valor es 1 habilita la vista.\r\n     * @property {object} views.week - Establece las opciones para la vista semanal.\r\n     * @property {integer} views.week.enable - Si el valor es 1 habilita la vista.\r\n     * @property {object} views.day - Establece las opciones para la vista diaria.\r\n     * @property {integer} views.day.enable - Si el valor es 1 habilita la vista.\r\n     */\n\n/**\r\n      * @description Ya sea desde local o remoto el JSON con los eventos es un array de objetos en el que\r\n      *  cada objeto tiene las siguientes propiedades:\r\n      * \r\n      * @name Eventos\r\n      * \r\n      * @property {string} id identificador único del evento.\r\n      * @property {string} title texto o html que aparecerá al desplegar la celda con el evento.\r\n      * @property {string} start la fecha en la que inicia el evento (En milisegundos).\r\n      * @property {string} class clase a añadir al evento (Sirve para la visualización del evento).\r\n      * @property {string} end la fecha en la que finaliza el evento.\r\n      * @property {string} url ruta a la que llevar cuando se haga click sobre el evento.\r\n      * \r\n      */\n\n$.fn.rup_calendar.defaults = {\n  events_source: function events_source() {\n    return [];\n  },\n  language: $.rup.lang,\n  view: 'month',\n  tmpl_path: global.STATICS + '/rup/html/templates/rup_calendar/',\n  tmpl_cache: false,\n  day: 'now',\n  weekbox: false,\n  classes: {\n    months: {\n      general: 'label'\n    }\n  },\n  onAfterEventsLoad: function onAfterEventsLoad() {},\n  onAfterViewLoad: function onAfterViewLoad() {},\n  adapter: 'calendar_bootstrap'\n};\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.calendar.js?");

/***/ }),

/***/ "./src/rup.chart.js":
/*!**************************!*\
  !*** ./src/rup.chart.js ***!
  \**************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2014 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Herramientas para mostrar gráficas atractivas para mostrar\r\n * informacón al usuario de forma atractiva.\r\n *\r\n * @summary Componente RUP Chart.\r\n * @module rup_chart\r\n * @see El componente está basado en el plugin {@link http://www.chartjs.org/|Chart.js}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://www.chartjs.org/docs/|aquí}.\r\n */\n\n/*global Chart */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! chart.js */ \"./node_modules/chart.js/dist/Chart.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá\n  // los métodos y la función de jQuery)\n  var rup_chart = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_chart', rup_chart)); // DEFINICIÓN DE MÉTODOS PÚBLICOS\n\n  $.fn.rup_chart('extend', {\n    /**\r\n     * Destruye la instancia del grafico creado, limpia cualquier referencia almacenada del componente. Debe ser utilizado antes de usar el canvas para un nuevo gráfico]\r\n     * @function destroy\r\n     */\n    destroy: function destroy() {\n      var grafico = this.data('chart');\n      grafico.destroy();\n      this.data('chart', '');\n      this.data('settings', '');\n    },\n\n    /**\r\n     * Método utilizado para actualizar los datos de los gráficos en caliente, tanto los labels como los datos numéricos\r\n     * @function updateData\r\n     * @param  {Object} param - Estructura de datos de rup_chart\r\n     * @param  {array} param.datasets - Valores númericos a representar en el gráfico\r\n     * @param  {array} param.labels - Etiquetas de literales asociados al dataset de datos\r\n     */\n    updateData: function updateData(param) {\n      var settings = this.data('settings');\n      var grafico = this.data('chart');\n      grafico.data.datasets = param.datasets;\n      grafico.data.labels = param.labels;\n      grafico.update();\n      settings.data = param; //actualizo los datos del componente rup\n\n      this.data('settings', settings);\n    },\n\n    /**\r\n     * Método que actualiza los labels asociados a los datos\r\n     * @function  updateLabels\r\n     * @param  {array} param - Los labels a actualizar\r\n     */\n    updateLabels: function updateLabels(param) {\n      var settings = this.data('settings');\n      var grafico = this.data('chart'); //actualizar grafico\n\n      grafico.data.labels = param;\n      grafico.update(); //actualizar datos del componente\n\n      settings.data.labels = param;\n    },\n\n    /**\r\n     * Método que actualiza los datasets con los valores numéricos a representar por el gráfico\r\n     * @function  updateDatasets\r\n     * @param  {array} param - Los datasets a actualizar\r\n     */\n    updateDatasets: function updateDatasets(param) {\n      var settings = this.data('settings');\n      var grafico = this.data('chart'); //actualizar grafico\n\n      grafico.data.datasets = param;\n      grafico.update(); //actualizar datos del componente\n\n      settings.data.datasets = param;\n    },\n\n    /**\r\n     * Método que devuelve los datasets de datos del gráfico\r\n     * @function  getDatasets\r\n     * @return {object} - El conjunto de datasets de datos del componente\r\n     */\n    getDatasets: function getDatasets() {\n      return this.data('settings').data.datasets;\n    },\n\n    /**\r\n     * Método que devuelve los labels asociados a los datasets del gráfico\r\n     * @function  getLabels\r\n     * @return {object}  - El conjunto de labels del componente\r\n     */\n    getLabels: function getLabels() {\n      return this.data('settings').data.labels;\n    },\n\n    /**\r\n     * Método que devuelve la estructura de datos de datasets y labels que definen el gráfico\r\n     * @function  getData\r\n     * @return {object} - [El conjunto de datos del componente]\r\n     */\n    getData: function getData() {\n      return this.data('settings').data;\n    },\n\n    /**\r\n     * Devuelve la instancia del objeto chart.js\r\n     * @function  getChart\r\n     * @return {object} - la instancia del objecto\r\n     */\n    getChart: function getChart() {\n      return this.data('chart');\n    },\n\n    /**\r\n     * Devuelve el grafico en un string base64\r\n     * @function  toBase64Image\r\n     * @return {object} -  string en base64 del gráfico\r\n     */\n    toBase64Image: function toBase64Image() {\n      var grafico = this.data('chart');\n      return grafico.toBase64Image();\n    }\n  }); // DEFINICIÓN DE MÉTODOS PRIVADOS\n\n  $.fn.rup_chart('extend', {}); // methodo INICIALIZACION\n\n  $.fn.rup_chart('extend', {\n    _init: function _init(args) {\n      var settings = $.extend({}, $.fn.rup_chart.defaults, args[0]);\n      settings.id = $(this).attr('id');\n      var $self = this;\n      var ctx = document.getElementById(settings.id).getContext('2d');\n      var grafico;\n\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        if (settings.options !== undefined) {\n          grafico = new Chart(ctx, {\n            type: settings.type,\n            data: settings.data,\n            options: settings.options\n          });\n        } else {\n          grafico = new Chart(ctx, {\n            type: settings.type,\n            data: settings.data\n          });\n        }\n\n        $self.attr('role', 'graphics-data');\n        $self.addClass('rup-chart'); //atributo ruptype\n\n        $self.attr('ruptype', 'chart'); //Almacenar los settings\n\n        $('#' + settings.id).data('settings', settings); //almacenar el Objecto Chart\n\n        $('#' + settings.id).data('chart', grafico);\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_chart', 'init');\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  $.fn.rup_chart.defaults = {};\n});\n\n//# sourceURL=webpack://rup/./src/rup.chart.js?");

/***/ }),

/***/ "./src/rup.combo.js":
/*!**************************!*\
  !*** ./src/rup.combo.js ***!
  \**************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/* eslint-disable no-useless-escape */\n\n/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n//Modificado \"jquery.ui.selectmenu.js\" línea 70\n//Modificado \"jquery.ui.selectmenu.js\" línea 438-442\n//Modificado \"jquery.ui.selectmenu.js\" línea 270 [jQuery 1.8 compatible]\n//Modificado \"jquery.multiselect.js\" línea 53 [Estilo flecha como combos\n//Añadido\t \"jquery.multiselect.js\" línea 65 [Id al componete]\n//Modificado \"jquery.multiselect.js\" línea 581 [jQuery 1.8 compatible]\n//Modificadro \"IE Fixes\" (evitar problemas con elementos deshabilitados en IE)\n//Arregos para resaltado con el teclado (UDA - focus): líneas 446-448, 494-496, 519-522\n\n/**\r\n * Permite al usuario recuperar un elemento de una gran lista de elementos o de varias listas dependientes de forma sencilla y ocupando poco espacio en la interfaz.\r\n *\r\n * @summary Componente RUP Combo.\r\n * @module rup_combo\r\n * @see El componente está basado en el plugin {@link http://jqueryui.com/selectmenu/|jQuery UI Selectmenu}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://api.jqueryui.com/selectmenu/|aquí}.\r\n * @example\r\n * $(\"#idCombo\").rup_combo({\r\n *\tsource : \"comboSimple/remote\",\r\n *\tsourceParam : {label:\"desc\"+$.rup_utils.capitalizedLang(), value:\"code\", style:\"css\"}\r\n * });\r\n */\n\n/*global define */\n\n/*global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./core/ui/jquery.ui.selectmenu */ \"./src/core/ui/jquery.ui.selectmenu.js\"), __webpack_require__(/*! ./core/ui/jquery.multiselect */ \"./src/core/ui/jquery.multiselect.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÁN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_combo = {};\n  var FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE = $.rup.i18nParse($.rup.i18n.base, 'rup_global.functionNotSupportedError');\n  var FUNCTION_NOT_SUPPORTED_ERROR_TITLE = $.rup.i18nParse($.rup.i18n.base, 'rup_global.error'); //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_combo', rup_combo)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_combo('extend', {\n    /**\r\n     * Método utilizado para obtener el valor del componente. Este método es el utilizado por el resto de componentes RUP para estandarizar la obtención del valor del Combo.\r\n     *\r\n     * @function  getRupValue\r\n     * @return {string | number} - Devuelve el valor actual del componente seleccionado por el usuario.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"getRupValue\");\r\n     */\n    getRupValue: function getRupValue() {\n      var $self = $(this),\n          settings = $self.data('settings'),\n          retObj,\n          arrayTMP,\n          wrapObj = {},\n          name;\n      name = $self.attr('name');\n\n      if (name) {\n        arrayTMP = $self.attr('name').split('.');\n      }\n\n      if (settings.submitAsJSON) {\n        //\t\t\t\t\tarrayTMP = $self.attr(\"name\").split(\".\");\n        //\t\t\t\t\tprop = arrayTMP[arrayTMP.length-1];\n        //\t\t\t\t\tvalueArray = $self.rup_combo(\"value\");\n        //\t\t\t\t\tvalueArray_length = valueArray.length;\n        //\t\t\t\t\treturnArray = [];\n        //\t\t\t\tfor(var i=0; i<valueArray_length; i++){\n        //\t\t\t\t\tvar map = {};\n        //\t\t\t\t\tmap[prop] = valueArray[i];\n        //\t\t\t\t\treturnArray.push(map);\n        //\t\t\t\t}\n        return jQuery.rup_utils.getRupValueAsJson(name, $self.rup_combo('value'));\n      }\n\n      retObj = settings.submitAsString ? $self.rup_combo('value').toString() : $self.rup_combo('value');\n\n      if (arrayTMP !== undefined && arrayTMP !== null && settings.multiselect) {\n        wrapObj[arrayTMP[arrayTMP.length - 1]] = retObj;\n      }\n\n      return settings.multiselect === true && arrayTMP !== undefined && arrayTMP.length > 1 && settings.legacyWrapMode === false ? wrapObj : retObj;\n    },\n\n    /**\r\n     * Método utilizado para asignar el valor al componente. Este método es el utilizado por \r\n     * el resto de componentes RUP para estandarizar la asignación del valor al Combo.\r\n     *\r\n     * @function  setRupValue\r\n     * @param {string | number} param - Valor que se va a asignar al componente.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"setRupValue\", \"Si\");\r\n     */\n    setRupValue: function setRupValue(param) {\n      var $self = $(this),\n          settings = $self.data('settings'); //Tipo de combo\n\n      if (this.length === 0 || settings !== undefined && !settings.multiselect) {\n        //Simple > selectmenu\n        $.data(this[0], 'setRupValue', param.toString());\n        $(this).rup_combo('select', param.toString());\n      } else {\n        //Multiple > multiselect\n        $(this).multiselect('uncheckAll');\n        $(this).rup_combo('select', settings.readAsString === true ? param.split(',') : param);\n        $(this).multiselect('refresh');\n      }\n    },\n\n    /**\r\n     * Método que limpia el valor seleccionado en el combo. En el caso de selección múltiple los valores seleccionados.\r\n     *\r\n     * @function clear\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"clear\");\r\n     */\n    clear: function clear() {\n      //Tipo de combo\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        //Simple > selectmenu\n        $(this).rup_combo('select', 0);\n      } else {\n        //Multiple > multiselect\n        $(this).multiselect('uncheckAll');\n      }\n    },\n\n    /**\r\n     * Método que lanza el evento change del componente.\r\n     *\r\n     * @function change\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"change\");\r\n     */\n    change: function change() {\n      //Tipo de combo\n      if ($(this).data('settings').change) {\n        $(this).data('settings').change();\n      }\n    },\n\n    /**\r\n     * Realiza una reinicizalización del estado del componente.\r\n     *\r\n     * @function  reset\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"reset\");\r\n     */\n    reset: function reset() {\n      var $self = $(this);\n      $self.rup_combo('select', $self.find('option[selected]').attr('value'));\n    },\n\n    /**\r\n     * Reinicia por completo el componente, incluyendo sus ajustes. \r\n     *\r\n     * @function hardReset\r\n     * @since UDA 5.0.3\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"hardReset\");\r\n     */\n    hardReset: function hardReset() {\n      var $self = $(this),\n          settings = $self.data('settings');\n      settings.disabled = undefined;\n      settings.selected = undefined;\n      settings.ultimaLlamada = undefined;\n      settings.ultimosValores = undefined;\n      $self.rup_combo('select', '');\n    },\n\n    /**\r\n     * Selecciona todos los elementos en el caso de tratarse de un combo multilesección.\r\n     *\r\n     * @function  checkAll\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"checkAll\");\r\n     */\n    checkAll: function checkAll() {\n      //Tipo de combo\n      if ($(this).data('settings').multiselect) {\n        //Multiple > multiselect\n        $(this).multiselect('checkAll');\n      } else {\n        //Simple > selectmenu\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Selecciona el elemento enviado como parámetro. En caso de ser un numérico se selecciona por la posición (comenzando en 0) y si es un literal se selecciona por el valor. En el caso de selección múltiple el parámetro será un array.\r\n     *\r\n     * @function  select\r\n     * @param {string | number | string[] | number[]} param - Parámetro utilzado para determinar los elementos a seleccionar.\r\n     * @example\r\n     * // Simple\r\n     * $(\"#idCombo\").rup_combo(\"select\", 2);\r\n     * // Multiple\r\n     * $(\"#idCombo\").rup_combo(\"select\", [0,2]);\r\n     */\n    select: function select(param) {\n      var data = $(this).data(); // Cuando el identificador está cifrado por Hdiv, hay que asegurarse de tener siempre el valor obtenido a partir de la fuente definida en la inicialización del componente\n\n      if (data.values != undefined && $.fn.isHdiv(param) && (data.selectedValueKey == undefined || param != data.values[data.selectedValueKey].value)) {\n        $.each(data.values, function (key, obj) {\n          if ($.fn.getStaticHdivID(obj.value) === $.fn.getStaticHdivID(param)) {\n            data.setRupValue = obj.value;\n            data.settings.selected = obj.value;\n            param = obj.value; // Para evitar iteraciones innecesarias en el futuro, se guarda la posición del valor en el array para facilitar su comprobación\n\n            data.selectedValueKey = key;\n          }\n        });\n      } // Asigna el valor recibido como el seleccionado (evita problemas con los enlazados).\n      else if (param != undefined && param != '') {\n        data.setRupValue = param;\n        data.settings.selected = param;\n      } //Tipo de combo\n\n\n      if (this.length === 0 || !data.settings.multiselect) {\n        //Simple > selectmenu\n        this._setElement($(this), param); //Cargar elemento\n\n      } else {\n        //Multiple > multiselect\n        this._setElement($(this), param, true);\n      }\n    },\n\n    /**\r\n     * Selecciona el elemento del combo que contiene como texto el indicado. En caso de no existir el texto a buscar el combo no sufrirá cambios En el caso de selección múltiple el parámetro será un array.\r\n     *\r\n     * @function  selectLabel\r\n     * @param {string | string[]} param - Parámetro utilzado para determinar los elementos a seleccionar.\r\n     * @example\r\n     * // Simple\r\n     * $(\"#idCombo\").rup_combo(\"selectLabel\", \"No\");\r\n     * // Multiple\r\n     * $(\"#idCombo\").rup_combo(\"selectLabel\", [\"No\",\"Si\"]);\r\n     */\n    selectLabel: function selectLabel(param) {\n      //Tipo de combo\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        //Simple > selectmenu\n        var elementSet = this._selectLabel($(this), param, true); //Cargar elemento\n        //Si se ha cargado un elemento válido\n\n\n        if (elementSet) {\n          //Lanzar cambio para que se recarguen hijos\n          var hijos = $(this).data('childs');\n\n          if (hijos !== undefined) {\n            for (var i = 0; i < hijos.length; i = i + 1) {\n              $('#' + hijos[i]).rup_combo('reload');\n            }\n          }\n        }\n      } else {\n        //Multiple > multiselect\n        for (var _i = 0; _i < param.length; _i++) {\n          $('input[name=\\'multiselect_' + $(this).attr('id') + '\\'][title=\\'' + param[_i] + '\\']').attr('checked', true);\n        } //Actualizar literal de elementos seleccionados\n\n\n        $(this).multiselect('update');\n      }\n    },\n\n    /**\r\n     * Método que devuelve el valor seleccionado en el combo. En caso de ser el valor vació, o sin selección, el valor devuelto es el asociado al “blank”. En el caso de la selección múltiple se devolverá un array.\r\n     *\r\n     * @function  value\r\n     * @return {string | string[]} - Valor del elemento o elementos seleccionados.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"value\");\r\n     */\n    value: function value() {\n      //Tipo de combo\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        //Simple > selectmenu\n        return $(this).selectmenu('value');\n      } else {\n        //Multiple > multiselect\n        var retorno = [],\n            checked = $(this).multiselect('getChecked');\n\n        for (var i = 0; i < checked.length; i++) {\n          retorno.push($(checked[i]).val());\n        }\n\n        return retorno;\n      }\n    },\n\n    /**\r\n     * Método que devuelve el label asociado al valor seleccionado en el combo. En el caso de la selección múltiple se devolverá un array.\r\n     *\r\n     * @function  label\r\n     * @return {string | string[]} - Texto del elemento o elementos seleccionado.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"label\");\r\n     */\n    label: function label() {\n      //Tipo de combo\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        return this[0].options[$(this).selectmenu('index')].text;\n      } else {\n        //Multiple > multiselect\n        var retorno = [],\n            checked = $(this).multiselect('getChecked');\n\n        for (var i = 0; i < checked.length; i++) {\n          retorno.push($(checked[i]).next().text());\n        }\n\n        return retorno;\n      }\n    },\n\n    /**\r\n     * Devuelve el índice de la opción seleccionada en el combo (empezando en 0). En el caso de la selección múltiple se devolverá un array.\r\n     *\r\n     * @function  index\r\n     * @return {number | number[]} - Índice del elemento o elementos seleccionados.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"index\");\r\n     */\n    index: function index() {\n      //Tipo de combo\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        //Simple > selectmenu\n        return $(this).selectmenu('index');\n      } else {\n        //Multiple > multiselect\n        var retorno = [],\n            checked = $(this).rup_combo('value'),\n            options = $(this).find('option');\n\n        for (var i = 0; i < options.length; i++) {\n          if ($.inArray($(options[i]).val(), checked) !== -1) {\n            retorno.push(i);\n          }\n        }\n\n        return retorno;\n      }\n    },\n\n    /**\r\n     * Deshabilita el combo.\r\n     *\r\n     * @function  disable\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"disable\");\r\n     */\n    disable: function disable() {\n      //Tipo de combo\n      var $self = $(this);\n      $('#' + $(this).attr('id') + '-button').attr('tabindex', -1); // Añadimos el handler del evento focus para evitar que adquiera el foco cuando está deshabilitado\n\n      $('#' + $(this).attr('id') + '-button').on('focus.rup_combo', function () {\n        $('#' + $self.attr('id') + '-button').blur();\n        return false;\n      });\n\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        //Simple > selectmenu\n        $(this).selectmenu('disable');\n      } else {\n        //Multiple > multiselect\n        $(this).multiselect('disable');\n      }\n    },\n\n    /**\r\n     * Habilita el combo.\r\n     *\r\n     * @function  enable\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"enable\");\r\n     */\n    enable: function enable() {\n      //Tipo de combo\n      var settings = $(this).data('settings'); // Eliminamos el handler del evento focus para evitar que adquiera el foco cuando está deshabilitado\n\n      $('#' + $(this).attr('id') + '-button').off('focus.rup_combo');\n      $('#' + $(this).attr('id') + '-button').attr('tabindex', settings.tabindex ? settings.tabindex : 0);\n\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        //Simple > selectmenu\n        $(this).selectmenu('enable');\n      } else {\n        //Multiple > multiselect\n        $(this).multiselect('enable');\n      }\n    },\n\n    /**\r\n     * Indica si el combo está deshabilitado o no.\r\n     *\r\n     * @function  isDisabled\r\n     * @param {boolean} - Devuelve si el combo está deshabilitado o no.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"isDisabled\");\r\n     */\n    isDisabled: function isDisabled() {\n      if ($(this).attr('aria-disabled') === 'false') {\n        return false;\n      } else {\n        return true;\n      }\n    },\n\n    /**\r\n     * Indica si un rup_combo ya ha sido inicializado sobre el elemento con el identificador provisto.\r\n     *\r\n     * @function isInitialized\r\n     * @since UDA 5.0.3\r\n     * @return {boolean} - Indica si ya ha sido inicializado un combo sobre el elemento.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"isInitialized\");\r\n     */\n    isInitialized: function isInitialized() {\n      return $(this).attr('ruptype') === 'combo' ? true : false;\n    },\n\n    /**\r\n     * Vacía y deshabilita el combo sobre el que se aplica así como todos los combos que depende de él. Su uso principalmente es interno para las peticiones remotas.\r\n     *\r\n     * @function  disableChild\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"disableChild\");\r\n     */\n    disableChild: function disableChild() {\n      if ($(this).hasClass('rup_combo')) {\n        if ($(this).attr('multiple') === 'multiple') {\n          $(this).rup_combo('setRupValue', []);\n        } else {\n          $(this).rup_combo('setRupValue', '');\n        }\n      } //Vaciar combo, deshabilitarlo\n\n\n      $(this).empty().append('<option></option>').rup_combo('disable'); // Eliminar valor seleccionado.\n\n      $(this).data('settings').selected = undefined; //Eliminar texto que se muestra\n\n      $('#' + $(this).attr('id') + '-button span:first-child').text(''); //Propagar evento de selección a hijos (recursivo)\n\n      var hijos = $(this).data('childs');\n\n      if (hijos !== undefined) {\n        for (var i = 0; i < hijos.length; i = i + 1) {\n          $('#' + hijos[i]).rup_combo('disableChild');\n        }\n      }\n    },\n\n    /**\r\n     * Deshabilita una opción de un combo multiselección.\r\n     *\r\n     * @function  disableOpt\r\n     * @param {string} optValue - Value del option que queremos deshabilitar.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"disableOpt\", \"opt1\");\r\n     */\n    disableOpt: function disableOpt(optValue) {\n      if ($(this).data('settings').multiselect) {\n        //Deshabilitar select\n        this.find('[value=\\'' + optValue + '\\']').attr('disabled', 'disabled');\n        var obj = $('#rup-multiCombo_' + $(this).attr('id')).find('[value=\\'' + optValue + '\\']'); //Deshabilitar input\n\n        obj.attr('disabled', 'disabled'); //Estilos línea (label)\n\n        obj.parent().css('color', 'grey'); //Si pertenece a OptGroup y es el último en deshabilitarse > Cambiar estilos optGroupLabel\n\n        if ($(this).data('settings').sourceGroup != undefined) {\n          //Obtener inicio optGroup\n          var li = obj.parentsUntil('ul').last().prevAll('li.ui-multiselect-optgroup-label').first(),\n              inputs = li.nextUntil('li.ui-multiselect-optgroup-label').find('input'),\n              allDisabled = true;\n\n          for (var i = 0; i < inputs.length; i++) {\n            if (!inputs[i].disabled) {\n              allDisabled = false;\n              break;\n            }\n          }\n\n          if (allDisabled) {\n            //Estilos optGroup\n            li.css('color', 'grey');\n            li.children('a').remove();\n            li.children('span').not('.rup-combo_multiOptgroupLabel').remove();\n          }\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Deshabilita varias opciones del combo. Las opciones se identifican mediante un array.\r\n     *\r\n     * @function disableOptArr\r\n     * @param {string[]} optValueArr - Array en el que se indican los values de las opciones a deshabilitar.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"disableOptArr\", [\"opt1\",\"opt2\"]);\r\n     */\n    disableOptArr: function disableOptArr(optValueArr) {\n      if ($(this).data('settings').multiselect) {\n        for (var i = 0; i < optValueArr.length; i++) {\n          $(this).rup_combo('disableOpt', optValueArr[i]);\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Habilita una opción de un combo multiselección.\r\n     *\r\n     * @function enableOpt\r\n     * @param {string} enableOpt - Value del option que queremos habilitar.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"enableOpt\", \"opt1\");\r\n     */\n    enableOpt: function enableOpt(optValue) {\n      if ($(this).data('settings').multiselect) {\n        //Habilitar select\n        this.find('[value=\\'' + optValue + '\\']').removeAttr('disabled');\n        var obj = $('#rup-multiCombo_' + $(this).attr('id')).find('[value=\\'' + optValue + '\\']'); //Habilitar input\n\n        obj.removeAttr('disabled'); //Estilos línea (label)\n\n        obj.parent().css('color', 'black'); //Si pertenece a OptGroup y es el primero en habilitarse > Cambiar estilos optGroupLabel\n\n        if ($(this).data('settings').sourceGroup != undefined) {\n          //Obtener inicio optGroup\n          var li = obj.parentsUntil('ul').last().prevAll('li.ui-multiselect-optgroup-label').first(); //Estilos optGroup\n\n          if (li.children('a').length === 0) {\n            li.css('color', 'black');\n\n            this._generateOptGroupLabel(li, $(this).data('settings').multiOptgroupIconText);\n          }\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Habilita varias opciones del combo. Las opciones se identifican mediante un array.\r\n     *\r\n     * @function enableOptArr\r\n     * @param {string[]} optValueArr - Array en el que se indican los values de las opciones a habilitar.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"enableOptArr\", [\"opt1\",\"opt2\"]);\r\n     */\n    enableOptArr: function enableOptArr(optValueArr) {\n      if ($(this).data('settings').multiselect) {\n        for (var i = 0; i < optValueArr.length; i++) {\n          $(this).rup_combo('enableOpt', optValueArr[i]);\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Refresca los valores asociados al combo.\r\n     *\r\n     * @function  refresh\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"refresh\");\r\n     */\n    refresh: function refresh() {\n      //Tipo de combo\n      if (this.length === 0 || !$(this).data('settings').multiselect) {\n        //Simple > selectmenu\n        return $(this).selectmenu();\n      } else {\n        //Multiple > multiselect\n        $(this).multiselect('refresh'); //Modificar literal en optgroups y asociarle el evento de \"seleccionar/deseleccionar\"\n\n        var multiOptgroupIconText = $(this).data('settings').multiOptgroupIconText,\n            self = this;\n        $.each($('#rup-multiCombo_' + $(this).attr('id')).find('.ui-multiselect-optgroup-label'), function (index, object) {\n          self._generateOptGroupLabel(object, multiOptgroupIconText);\n        }); //Titles de botones por defecto\n\n        $('#rup-multiCombo_' + $(this).attr('id')).find('.ui-multiselect-all').attr('title', $.rup.i18n.base.rup_combo.multiselect.checkAllTitle).rup_tooltip();\n        $('#rup-multiCombo_' + $(this).attr('id')).find('.ui-multiselect-none').attr('title', $.rup.i18n.base.rup_combo.multiselect.uncheckAllTitle).rup_tooltip(); //Deseleccionar todos\n\n        return $(this).multiselect('uncheckAll');\n      }\n    },\n\n    /**\r\n     * Realiza una recarga de los combos.\r\n     *\r\n     * @function   reload\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"reload\");\r\n     */\n    reload: function reload() {\n      if (this.length !== 0) {\n        var settings = $(this).data('settings'),\n            source,\n            setRupValue,\n            wasInited = false;\n        $('#' + settings.id).removeClass('inited');\n        wasInited = !!1; // Vaciar, quitar el valor y deshabilitar el combo.\n\n        if (!$('#' + settings.id).rup_combo('isDisabled')) {\n          $('#' + settings.id).rup_combo('disableChild');\n        }\n\n        if (_typeof(settings.source) === 'object' || _typeof(settings.sourceGroup) === 'object') {\n          //LOCAL\n          $('#' + settings.id).removeClass('inited');\n          source = settings.source[this._getParentsValues(settings.parent, false, settings.multiValueToken)];\n\n          if (source !== undefined) {\n            if (settings.blank != null) {\n              var isOptgroup = false; // Comprobamos si el value es un objeto. En caso de serlo esto nos indicara que se trata de un combo tipo 'optgroup'.\n\n              $.each(settings.sourceGroup, function (key, value) {\n                if (_typeof(value) === 'object' && value !== null) {\n                  isOptgroup = true;\n                  return false;\n                }\n              }); // Si es un combo tipo 'optgroup' se establece una propiedad para que despues \n              // en el metodo '_parseOptGroupLOCAL' se gestione correctamente.\n\n              if (isOptgroup) {\n                settings.blankDone = false;\n              }\n            } //Parsear datos\n\n\n            this._parseLOCAL(source, settings, $('#' + settings.id)); //Crear combo\n\n\n            this._makeCombo(settings); // Evento de finalizacion de carga (necesario para trabajar con el manteniminto)\n\n\n            if (settings.onLoadSuccess !== null) {\n              jQuery(settings.onLoadSuccess($('#' + settings.id)));\n            } //Lanzar cambio para que se recarguen hijos\n\n\n            $('#' + settings.id).rup_combo('change');\n            setRupValue = $.data($('#' + settings.id)[0], 'setRupValue');\n\n            if (setRupValue) {\n              //Vaciar combo, quitarle valor y deshabilitar\n              $('#' + settings.id).rup_combo('select', setRupValue);\n            }\n          }\n\n          multiChange(settings);\n\n          if (wasInited) {\n            $('#' + settings.id).addClass('inited');\n          }\n        } else if (typeof settings.source === 'string' || typeof settings.sourceGroup === 'string') {\n          //REMOTO\n          var data = this._getParentsValues(settings.parent, true),\n              rupCombo = this;\n\n          if (data === null) {\n            return false;\n          } //Se para la petición porque algún padre no tiene el dato cargado\n\n\n          if (settings.ultimaLlamada === undefined || settings.ultimaLlamada === '' || settings.ultimaLlamada !== data || settings.disabledCache) {\n            //si es la misma busqueda, no tiene sentido volver a intentarlo.\n            $.rup_ajax({\n              url: settings.source ? settings.source : settings.sourceGroup,\n              data: data,\n              dataType: 'json',\n              contentType: 'application/json',\n              beforeSend: function beforeSend(xhr) {\n                rupCombo._ajaxBeforeSend(xhr, settings);\n\n                $('#' + settings.id).removeClass('inited');\n              },\n              success: function success(data) {\n                if (settings.blank != null) {\n                  var isOptgroup = false; // Comprobamos si el value es un objeto. En caso de serlo esto nos indicara que se trata de un combo tipo 'optgroup'.\n\n                  $.each(data[0], function (key, value) {\n                    if (_typeof(value) === 'object' && value !== null) {\n                      isOptgroup = true;\n                      return false;\n                    }\n                  }); // Si es un combo tipo 'optgroup' se establece una propiedad para que despues \n                  // en el metodo '_parseOptGroupREMOTE' se gestione correctamente.\n\n                  if (isOptgroup) {\n                    settings.blankDone = false;\n                  }\n                }\n\n                rupCombo._ajaxSuccess(data, settings, $('#' + settings.id)); // Evento de finalizacion de carga (necesario para trabajar con el manteniminto)\n\n\n                if (settings.onLoadSuccess !== null) {\n                  jQuery(settings.onLoadSuccess($('#' + settings.id)));\n                }\n\n                multiChange(settings);\n\n                if (wasInited) {\n                  $('#' + settings.id).addClass('inited');\n                }\n\n                settings.ultimosValores = data;\n                $('#' + settings.id).triggerHandler('comboAjaxSuccess', [data]);\n              },\n              error: function error(xhr, textStatus, errorThrown) {\n                if (settings.onLoadError !== null) {\n                  jQuery(settings.onLoadError(xhr, textStatus, errorThrown));\n                } else {\n                  rupCombo._ajaxError(xhr, textStatus, errorThrown);\n                }\n              }\n            });\n            settings.ultimaLlamada = data;\n          } else if (settings.ultimosValores !== undefined) {\n            //Si la ultima llamada cogio los datos, no hace falta ir al controller los coge del componente.\n            if (settings.blank != null) {\n              var isOptgroup = false; // Comprobamos si el value es un objeto. En caso de serlo esto nos indicara que se trata de un combo tipo 'optgroup'.\n\n              $.each(settings.ultimosValores[0], function (key, value) {\n                if (_typeof(value) === 'object' && value !== null) {\n                  isOptgroup = true;\n                  return false;\n                }\n              }); // Si es un combo tipo 'optgroup' se establece una propiedad para que despues \n              // en el metodo '_parseOptGroupREMOTE' se gestione correctamente.\n\n              if (isOptgroup) {\n                settings.blankDone = false;\n              }\n            }\n\n            rupCombo._ajaxSuccess(settings.ultimosValores, settings, $('#' + settings.id)); // Evento de finalizacion de carga (necesario para trabajar con el manteniminto)\n\n\n            if (settings.onLoadSuccess !== null) {\n              jQuery(settings.onLoadSuccess($('#' + settings.id)));\n            }\n\n            multiChange(settings);\n\n            if (wasInited) {\n              $('#' + settings.id).addClass('inited');\n            }\n\n            $('#' + settings.id).triggerHandler('comboAjaxSuccess', [settings.ultimosValores]);\n          } //delete rupCombo;\n\n        } else if (typeof settings.source === 'function' || typeof settings.sourceGroup === 'function') {\n          //Se lanza la funcion que obtiene los valores a mostrar\n          $('#' + settings.id).removeClass('inited');\n          jQuery(settings.source);\n\n          this._makeCombo(settings);\n\n          multiChange(settings);\n\n          if (wasInited) {\n            $('#' + settings.id).addClass('inited');\n          }\n        }\n      }\n    },\n\n    /**\r\n     * Ordena alfanumericamente y en orden ascendente el combo sobre el que se aplica. Se invoca por defecto al cargarse los combos a no ser que se cambie el valor del atributo ordered en la creación.\r\n     *\r\n     * @function  order\r\n     * @param {boolean} orderedByValue - Indica si la búsqueda es por texto (por defecto) o si la búsqueda es por el valor.\r\n     * @param {boolean} orderAsNumber - Indica si se debe ordenar como valores numéricos en vez de alfabéticos.\r\n     * @param {boolean} skipFirst - Determina si se debe obviar el primer elemento.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"order\", orderedByValue, orderAsNumber, skipFirst);\r\n     */\n    order: function order(orderedByValue, orderAsNumber, skipFirst) {\n      var combo = $(this),\n          options = $('option', combo),\n          arrVals = [],\n          skippedValue = null; //Comprobar que se ha obtenido el combo deseado\n\n      if (combo.length > 0) {\n        //Guardar elemento seleccionado\n        var selectedVal = combo.rup_combo('value'); //Obtener elementos combo\n\n        options.each(function () {\n          //Omitir posible opción vacía\n          if (skipFirst) {\n            skipFirst = false;\n            skippedValue = {\n              val: $(this).val(),\n              text: $(this).text()\n            };\n            return true;\n          }\n\n          arrVals.push({\n            val: $(this).val(),\n            text: $(this).text(),\n            clazz: $(this).attr('class')\n          });\n        }); //Ordenar elementos (segun parametros, por defecto de texto)\n\n        if (!orderedByValue) {\n          if (!orderAsNumber) {\n            arrVals.sort(function (a, b) {\n              return a.text.localeCompare(b.text);\n            });\n          } else {\n            arrVals.sort(function (a, b) {\n              return a.text - b.text;\n            });\n          }\n        } else {\n          if (!orderAsNumber) {\n            arrVals.sort(function (a, b) {\n              if (a.val > b.val) {\n                return 1;\n              } else if (a.val == b.val) {\n                return 0;\n              } else {\n                return -1;\n              }\n            });\n          } else {\n            arrVals.sort(function (a, b) {\n              return a.val - b.val;\n            });\n          }\n        } //Actualizar combo con elementos ordenados\n\n\n        for (var i = 0, l = arrVals.length; i < l; i++) {\n          $(options[i]).val(arrVals[i].val).text(arrVals[i].text);\n\n          if (arrVals[i].clazz) {\n            $(options[i]).attr('class', arrVals[i].clazz);\n          }\n        } //Añadir opción vacía al inicio\n\n\n        if (skippedValue) {\n          combo.prepend($('<option>').attr('value', skippedValue.val).text(skippedValue.text)); //Añadir opción vacía\n\n          $(options[arrVals.length]).remove(); //Eliminar ultimo elemento\n        } //Regenerar combo\n\n\n        combo.rup_combo('refresh'); //Restaurar elemento seleccionado\n\n        this._setElement($(this), selectedVal, $(this).data('settings').multiselect); //Eliminar referencias\n        // delete combo;\n        // delete options;\n        // delete arrVals;\n\n      }\n    },\n\n    /**\r\n     * Cambia el source del combo y recarga el componente para que este comience a usarlo.\r\n     *\r\n     * @function setSource\r\n     * @param {string} source - Source desde el cual se obtendran los datos a mostrar.\r\n     * @example\r\n     * $(\"#idCombo\").rup_combo(\"setSource\", source);\r\n     */\n    setSource: function setSource(source) {\n      if (source != undefined && source != '') {\n        var combo = $(this);\n        combo.data().settings.source = source;\n        combo.rup_combo('reload');\n      }\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_combo('extend', {\n    /**\r\n     * Establece un elemento del combo por posición o valor.\r\n     *\r\n     * @function  _setElement\r\n     * @private\r\n     * @param {object} selector - Referencia al objeto jQuery del combo.\r\n     * @param {object} param - Value correspondiente.\r\n     * @param {boolean} multicombo - Indica si el combo permite la multiselección.\r\n     * @param {boolean} markOptSelected - Determina si se debe marcar como seleccionado el elemento.\r\n     */\n    _setElement: function _setElement(selector, param, multicombo, markOptSelected) {\n      if (multicombo !== true) {\n        //Simple > selectmenu\n        if (typeof param === 'string') {\n          if ($('option[value=\\'' + param + '\\']', selector).length > 0) {\n            //Controlamos que se intenten seleccionar un valor existente\n            if (markOptSelected === true) {\n              $('option[value=\\'' + param + '\\']', selector).attr('selected', 'selected');\n            }\n\n            $(selector).selectmenu('value', param);\n            $(selector).trigger('_setElement');\n          } else {\n            return false;\n          }\n        } else if (typeof param === 'number') {\n          if ($('option', selector).length >= param) {\n            //Controlamos que se intenten seleccionar una posición existente\n            if (markOptSelected === true) {\n              $(selector).find('option').eq(param).attr('selected', 'selected');\n            }\n\n            $(selector).selectmenu('index', param);\n            $(selector).trigger('_setElement');\n          } else {\n            return false;\n          }\n        } else {\n          $(selector).selectmenu('index', 0);\n          $(selector).trigger('_setElement');\n        }\n\n        return true;\n      } else {\n        //Multiple > multiselect\n        if (param !== null && _typeof(param) === 'object') {\n          //Recorrer array parametros\n          for (var i = 0; i < param.length; i++) {\n            if (typeof param[i] === 'number') {\n              //Acceso por posición\n              $($('input[name=\\'multiselect_' + $(this).attr('id') + '\\']')[param[i]]).attr('checked', true);\n            } else if (typeof param[i] === 'string') {\n              //Acceso por valor\n              $('input[name=\\'multiselect_' + $(this).attr('id') + '\\'][value=\\'' + param[i] + '\\']').attr('checked', true);\n            }\n          } // Se altualiza el valor almacenado en el objeto HTML select.\n\n\n          $(selector).val(param).trigger('_setElement'); //Actualizar literal de elementos seleccionados\n\n          $(selector).multiselect('update');\n        }\n\n        return true;\n      }\n    },\n\n    /**\r\n     * Selecciona el elemento correspondiente al label indicado\r\n     *\r\n     * @function  _selectLabel\r\n     * @private\r\n     * @param {object} selector - Referencia al objeto jQuery del combo.\r\n     * @param {object} param - Value correspondiente.\r\n     */\n    _selectLabel: function _selectLabel(selector, param) {\n      var $option;\n\n      for (var i = 0; i < $('option', selector).length; i = i + 1) {\n        $option = jQuery(selector).find('option').eq(i);\n\n        if (jQuery(selector).find('option').eq(i).text() === param) {\n          $(selector).selectmenu('index', $option.prop('index'));\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    /**\r\n     * Obtener la opción vacía a partir del fichero de internacionalización de la aplicación o del fichero por defecto.\r\n     *\r\n     * @function  _getBlankLabel\r\n     * @private\r\n     * @param {string} id - Identificador del fichero\r\n     */\n    _getBlankLabel: function _getBlankLabel(id) {\n      var app = $.rup.i18n.app; // Comprueba si el combo tiene su propio texto personalizado\n\n      if (app[id] && app[id]._blank) {\n        return app[id]._blank;\n      } // Comprueba si la aplicacion tiene un texto definido para todos los blank\n      else if (app.rup_combo && app.rup_combo.blank) {\n        return app.rup_combo.blank;\n      } // Si no hay textos definidos para los blank obtiene el por defecto de UDA\n\n\n      return $.rup.i18n.base.rup_combo.blankNotDefined;\n    },\n\n    /**\r\n     * Realiza el formateo de los registros que se muestran en la lista desplegable del combo.\r\n     *\r\n     * @function  _defaultFormatting\r\n     * @private\r\n     */\n    _defaultFormatting: function _defaultFormatting(text) {\n      var findreps = [{\n        find: /^([^\\-]+) \\- /g,\n        rep: '<span class=\"ui-selectmenu-item-header\">$1</span>'\n      }, {\n        find: /([^\\|><]+) \\| /g,\n        rep: '<span class=\"ui-selectmenu-item-content\">$1</span>'\n      }, {\n        find: /([^\\|><\\(\\)]+) (\\()/g,\n        rep: '<span class=\"ui-selectmenu-item-content\">$1</span>$2'\n      }, {\n        find: /([^\\|><\\(\\)]+)$/g,\n        rep: '<span class=\"ui-selectmenu-item-content\">$1</span>'\n      }, {\n        find: /(\\([^\\|><]+\\))$/g,\n        rep: '<span class=\"ui-selectmenu-item-footer\">$1</span>'\n      }];\n\n      for (var i in findreps) {\n        text = text.replace(findreps[i].find, findreps[i].rep);\n      }\n\n      return text;\n    },\n\n    /**\r\n     * Obtener valores de los combos padres (si no están cargados o valores 'vacíos' devuelve null). En caso de disponer de varios combos padres se devolverán separados por un caracter delimitador.\r\n     *\r\n     * @function  _getParentsValues\r\n     * @private\r\n     * @param {object[]} array - Array con los elementos a mostrar.\r\n     * @param {boolean} remote - Determina si la fuente de datos es remota o no.\r\n     * @param {string} multiValueToken - Caracter separador en el caso de devolver varios elementos.\r\n     * @return {string} - Devuelve los values seleccionados de los combos padres.\r\n     */\n    _getParentsValues: function _getParentsValues(array, remote, multiValueToken) {\n      var retorno = '',\n          id,\n          texto,\n          multiValueTokenAux = multiValueToken != null ? multiValueToken : '',\n          parentBlankValue; //Puede que se lance una recarga de un combo sin padres\n\n      if (array === undefined) {\n        return retorno;\n      }\n\n      for (var i = 0; i < array.length; i = i + 1) {\n        id = array[i];\n        var settings = $('#' + id).data('settings'),\n            lastLoop = i + 1 === array.length; //Si tiene seleccionado la primera opción puede que está seleccionada opción vacia\n\n        if ($('#' + id).rup_combo('index') === 0) {\n          texto = $('#' + id + '-button span:first-child').text(); //Comprobar si tiene valor por defecto (bien propio o valor base por no haberlo definido)\n\n          if (texto === $.rup.i18n.base.rup_combo.blankNotDefined || $.rup.i18n.app[id] !== undefined && texto === $.rup.i18n.app[array[i]]._blank) {\n            return null;\n          }\n        } //Si el valor de algún padre es null (no se ha cargado aún)\n\n\n        if (settings.blank !== undefined && settings.blank !== null) {\n          parentBlankValue = settings.blank;\n        } else {\n          parentBlankValue = '';\n        }\n\n        if ($('#' + id).val() === null || $('#' + id).val() === parentBlankValue) {\n          return null;\n        } // Cuando el componente se use en la edición en línea de la tabla, se utilizará el campo definido por esta. También se evita la inserción de \"&\" o \"multiValueTokenAux\" en el último bucle.\n\n\n        if (remote) {\n          var _settings$inlineEditF;\n\n          retorno += ((_settings$inlineEditF = settings.inlineEditFieldName) !== null && _settings$inlineEditF !== void 0 ? _settings$inlineEditF : $('#' + id).attr('name')) + '=' + $('#' + id).val() + (lastLoop ? '' : '&');\n        } else {\n          retorno += $('#' + id).val() + (lastLoop ? '' : multiValueTokenAux);\n        }\n      }\n\n      return retorno;\n    },\n\n    /**\r\n     * Función principal en el proceso de crear un combo. Genera todos los elementos html y objetos js internos necesarios para el funcionamiento del mismo.\r\n     *\r\n     * @function  _makeCombo\r\n     * @private\r\n     * @param {object} settings - Parametros de configuración con los que se ha inicializado el combo.\r\n     */\n    _makeCombo: function _makeCombo(settings) {\n      //Opción vacía\n      if (settings.blank != null && $('#' + settings.id + ' option[value=\"' + settings.blank + '\"]').length == 0) {\n        $('#' + settings.id).prepend($('<option>').attr('value', settings.blank).text(this._getBlankLabel(settings.id)));\n      } //Gestionar Imagenes\n\n\n      if (settings.imgs) {\n        var icons = [],\n            values = [];\n        $.map(settings.imgs, function (item) {\n          $.each(item, function (key, elemImg) {\n            if (key.indexOf('###') == -1) {\n              $('#' + settings.id + ' [value=\\'' + key + '\\']').addClass(elemImg);\n              icons[icons.length] = {\n                find: '.' + elemImg\n              };\n            } else {\n              values = key.split('###');\n              $('#' + settings.id + ' > [label=\\'' + values[0] + '\\'] > [value=\\'' + values[1] + '\\']').addClass(item[values[0] + '###' + values[1]]);\n              icons[icons.length] = {\n                find: '.' + item[values[0] + '###' + values[1]]\n              };\n            }\n          });\n        });\n        settings.icons = icons;\n      } //Formato texto\n\n\n      settings.format = settings.format === 'default' ? this._defaultFormatting : settings.format; //Almacenar los settings\n\n      $('#' + settings.id).data('settings', settings); //Añadir evento change\n      // if (settings.change) {\n      // \t$('#' + settings.id).on('change', settings.change);\n      // }\n      //Tipo de combo\n\n      if (!settings.multiselect) {\n        var _settings$selected;\n\n        // Simple > selectmenu\n        $('#' + settings.id).selectmenu(settings);\n        $('#' + settings.id).rup_combo('setRupValue', (_settings$selected = settings.selected) !== null && _settings$selected !== void 0 ? _settings$selected : '');\n      } else {\n        //Multiple > multiselect\n        $('#' + settings.id).width('0'); //Iniciar a tamaño cero para que el multiselect calcule el tamaño\n        // Si tiene porcentaje\n\n        if ((typeof settings.width === 'string' || settings.width instanceof String) && settings.width.includes('%')) {\n          settings.minWidth = $('#' + settings.id).parent().width() * (parseInt(settings.width.slice(0, -1)) / 100);\n        } else {\n          settings.minWidth = settings.width;\n        }\n\n        $('#' + settings.id).multiselect(settings);\n        $('#' + settings.id).data('echMultiselect').button.attr('id', settings.id + '-button');\n        $('#' + settings.id).rup_combo('refresh'); //Actualizar cambios (remotos)\n\n        $('#' + settings.id).attr('multiple', 'multiple'); // Asignación de eventos de teclado\n\n        var self = this;\n        $('#' + settings.id).data('echMultiselect').button.on('keypress.selectmenu', function (event) {\n          if (event.which > 0) {\n            self._typeAheadMultiselect(event.which, 'focus', settings);\n          }\n\n          return true;\n        }); //\t\t\t\t\t\t$(\"#rup-multiCombo_remoteGroup_comboHijo\").on('keypress', function(event) {\n\n        $('#' + settings.id).data('echMultiselect').menu.on('label', 'keydown.multiselect', function (event) {\n          if (event.which > 0) {\n            self._typeAheadMultiselect(event.which, 'focus', settings);\n          }\n\n          return true;\n        });\n      } //Buscar el UL del combo y colocarlo tras el elemento sobre el que debe ir\n\n\n      if ($.rup_utils.aplicatioInPortal()) {\n        if (!settings.multiselect) {\n          //Simple > selectmenu\n          $('div.r01gContainer').append($('#' + settings.id + '-menu').parent());\n        } else {\n          //Multiple > multiselect\n          $('div.r01gContainer').append($('#rup-multiCombo_' + settings.id));\n        }\n      } //Ordenar elementos del combo\n\n\n      if (settings.ordered) {\n        $('#' + settings.id).rup_combo('order', settings.orderedByValue, settings.orderAsNumber, settings.blank);\n      } //Seleccionar elemento (valor del input, valor settings combo)\n\n\n      if (!settings.loadFromSelect && (settings.inputValue === undefined || settings.inputValue === '') || settings.loadFromSelect && settings.selected !== undefined) {\n        this._setElement($('#' + settings.id), settings.selected, settings.multiselect, true);\n      } else {\n        if (settings.multiselect) {\n          //Convertir inputValue en array\n          if (Array.isArray(settings.inputValue) === false) {\n            settings.inputValue = settings.inputValue.split('##');\n          }\n        }\n\n        this._setElement($('#' + settings.id), settings.inputValue, settings.multiselect, true);\n      } //Habilitar/Deshabilitar combo\n\n\n      if (!settings.disabled) {\n        $('#' + settings.id).rup_combo('enable');\n      } else {\n        $('#' + settings.id).rup_combo('disable');\n      } //Habilitar/Deshabilitar elementos (multicombo)\n\n\n      if (settings.multiselect) {\n        if (settings.disabledOpts !== undefined) {\n          $('#' + settings.id).rup_combo('disableOptArr', settings.disabledOpts);\n        }\n\n        if (settings.enabledOpts !== undefined) {\n          $('#' + settings.id).rup_combo('enableOptArr', settings.enabledOpts);\n        }\n\n        $('#' + settings.id).multiselect('refresh');\n      } //Si los padres están deshabilitados, se deshabilita el combo\n\n\n      var padres = settings.parent;\n\n      if (padres !== undefined) {\n        $.each(padres, function (index, object) {\n          if ($('#' + object).rup_combo('isDisabled')) {\n            $('#' + settings.id).rup_combo('disable');\n            return;\n          }\n        });\n      } //Clases para el pijama\n\n\n      if (settings.rowStriping) {\n        if (!settings.multiselect) {\n          $('#' + settings.id + '-menu li:nth-child(2n+1):not(.ui-selectmenu-group)').addClass('rup-combo_odd');\n          $('#' + settings.id + '-menu li:nth-child(2n):not(.ui-selectmenu-group)').addClass('rup-combo_even');\n          $('#' + settings.id + '-menu li:nth-child(2n+1).ui-selectmenu-group').addClass('rup-combo_groupOdd');\n          $('#' + settings.id + '-menu li:nth-child(2n).ui-selectmenu-group').addClass('rup-combo_groupEven');\n        } else {\n          $('#rup-multiCombo_' + settings.id + ' .ui-multiselect-checkboxes li:nth-child(2n+1):not(.ui-multiselect-optgroup-label)').addClass('rup-combo_odd');\n          $('#rup-multiCombo_' + settings.id + ' .ui-multiselect-checkboxes li:nth-child(2n):not(.ui-multiselect-optgroup-label)').addClass('rup-combo_even');\n          $.each($('#rup-multiCombo_' + settings.id + ' .ui-multiselect-optgroup-label'), function (index, value) {\n            if (index % 2 == 0) {\n              $(value).addClass('rup-combo_groupOdd');\n            } else {\n              $(value).addClass('rup-combo_groupEven');\n            }\n          });\n        }\n      } // Añade clases personalizadas establecidas en los parametros de configuración.\n\n\n      if (settings.customClasses) {\n        $.each(settings.customClasses, function (index, value) {\n          $('#' + settings.id + '-button' + ', #' + settings.id + '-menu').addClass(value);\n          $('[for=' + settings.id + ']').addClass(value);\n        });\n      }\n    },\n\n    /**\r\n     * Procesa el conjunto de registros devueltos por una petición sobre un origen de datos local.\r\n     *\r\n     * @function  _parseLOCAL\r\n     * @private\r\n     * @param {object[]} array - Array de registros obtenidos a partir del origen de datos.\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @param {jQuery} html - Referencia al objeto jQuery que contiene los elementos.\r\n     */\n    _parseLOCAL: function _parseLOCAL(array, settings, html) {\n      var imgs = settings.imgs ? settings.imgs : [],\n          label,\n          value;\n\n      for (var i = 0; i < array.length; i = i + 1) {\n        label = value = array[i];\n\n        if (_typeof(array[i]) === 'object') {\n          //multi-idioma\n          if (array[i].i18nCaption) {\n            label = $.rup.i18nParse($.rup.i18n.app[settings.i18nId], array[i].i18nCaption);\n          } else {\n            label = array[i].label;\n          }\n\n          value = array[i].value;\n        }\n\n        if (array[i] != undefined && array[i].style) {\n          imgs[imgs.length] = {};\n          imgs[imgs.length - 1][value] = array[i].style;\n          settings.imgs = imgs;\n        }\n\n        html.append($('<option>').attr('value', value).text(settings.showValue ? value + settings.token + label : label));\n      }\n    },\n\n    /**\r\n     * Procesa el conjunto de registros devueltos por una petición sobre un origen de datos local. Este método se emplea en el caso de existir agrupación de los mismos.\r\n     *\r\n     * @function  _parseOptGroupLOCAL\r\n     * @private\r\n     * @param {object[]} arrayGroup - Array de registros obtenidos a partir del origen de datos.\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @param {jQuery} html - Referencia al objeto jQuery que contiene los elementos.\r\n     */\n    _parseOptGroupLOCAL: function _parseOptGroupLOCAL(arrayGroup, settings, html) {\n      var optGroup,\n          self = this; // En caso de que se haya especificado la propiedad 'blank' en la llamada a 'rup_combo',\n      // añadimos una opcion en la primera posicion de la lista del combo.\n\n      if (!settings.blankDone && settings.blankDone != undefined) {\n        html.append($('<option>').attr('value', settings.blank).text(settings.blank));\n        settings.blankDone = true;\n      }\n\n      for (var i = 0; i < arrayGroup.length; i = i + 1) {\n        optGroup = arrayGroup[i];\n        html = optGroupHTML($, optGroup, html, settings, self);\n      }\n    },\n\n    /**\r\n     * Procesa el conjunto de registros devueltos por una petición sobre un origen de datos remoto.\r\n     *\r\n     * @function  _parseREMOTE\r\n     * @private\r\n     * @param {object[]} array - Array de registros obtenidos a partir del origen de datos.\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @param {jQuery} html - Referencia al objeto jQuery que contiene los elementos.\r\n     * @param {string} optGroupKey - Identificador del optionGroup al que pertenece.\r\n     */\n    _parseREMOTE: function _parseREMOTE(array, settings, html, optGroupKey) {\n      var remoteImgs = settings.imgs ? settings.imgs : [],\n          item;\n\n      for (var i = 0; i < array.length; i = i + 1) {\n        item = array[i];\n\n        if (array[i].label == undefined || array[i].label == null) {\n          item.label = item[settings.sourceParam.label];\n        }\n\n        if (item.style) {\n          remoteImgs[remoteImgs.length] = {};\n\n          if (optGroupKey == null) {\n            remoteImgs[remoteImgs.length - 1][item.value] = item.style;\n          } else {\n            remoteImgs[remoteImgs.length - 1][optGroupKey + '###' + item.value] = item.style;\n          }\n\n          settings.imgs = remoteImgs;\n        }\n\n        html.append($('<option>').attr('value', item.value).text(settings.showValue ? item.value + settings.token + item.label : item.label));\n      }\n    },\n\n    /**\r\n     * Procesa el conjunto de registros devueltos por una petición sobre un origen de datos remoto. Este método se emplea en el caso de existir agrupación de los mismos.\r\n     *\r\n     * @function  _parseOptGroupREMOTE\r\n     * @private\r\n     * @param {object[]} arrayGroup - Array de registros obtenidos a partir del origen de datos.\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @param {jQuery} html - Referencia al objeto jQuery que contiene los elementos.\r\n     */\n    _parseOptGroupREMOTE: function _parseOptGroupREMOTE(arrayGroup, settings, html) {\n      var optGroup,\n          self = this; // En caso de que se haya especificado la propiedad 'blank' en la llamada a 'rup_combo',\n      // añadimos una opcion en la primera posicion de la lista del combo.\n\n      if (!settings.blankDone && settings.blankDone != undefined) {\n        html.append($('<option>').attr('value', settings.blank).text(settings.blank));\n        settings.blankDone = true;\n      }\n\n      for (var i = 0; i < arrayGroup.length; i = i + 1) {\n        optGroup = arrayGroup[i];\n        html = optGroupRemoteHTML($, optGroup, html, self, settings);\n      }\n    },\n\n    /**\r\n     * Prepara la petición AJAX que se va a realizar para obtener los registros a partir de un origen remoto. Se añaden las cabeceras RUP correspondientes para realizar la serialización json de manera correcta.\r\n     *\r\n     * @function  _ajaxBeforeSend\r\n     * @private\r\n     * @param {object} xhr - Objeto xhr que se va a enviar en la petición\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @param {jQuery} html - Referencia al objeto jQuery que contiene los elementos.\r\n     */\n    _ajaxBeforeSend: function _ajaxBeforeSend(xhr, settings, html) {\n      //Crear combo (vacío) y deshabilitarlo\n      if (html !== undefined) {\n        $('#' + settings.id).replaceWith(html);\n      } //Si no es 'reload' se debe inicializar vacío\n\n\n      this._makeCombo(settings);\n\n      $('#' + settings.id).rup_combo('disable'); //LOADING...\n\n      $('#' + settings.id + '-button span:first-child').removeClass(\"ui-icon ui-icon-triangle-1-s\").addClass('rup-combo_loadingText').text($.rup.i18n.base.rup_combo.loadingText);\n      var icon = $('#' + settings.id + '-button span:last-child');\n      $(icon).removeClass('ui-icon-triangle-1-s');\n      $(icon).text(''); // Evita errores de visualización con el icono\n\n      $(icon).addClass('rup-combo_loading'); //Cabecera RUP\n\n      xhr.setRequestHeader('RUP', $.toJSON(settings.sourceParam));\n    },\n\n    /**\r\n     * Procesa la respuesta de la petición AJAX en el caso de que esta haya finalizado correctamente.\r\n     *\r\n     * @function  _ajaxSuccess\r\n     * @private\r\n     * @param {object} data - Objeto enviado en la respuesta.\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @param {jQuery} html - Referencia al objeto jQuery que contiene los elementos.\r\n     */\n    _ajaxSuccess: function _ajaxSuccess(data, settings, html) {\n      //UNLOADING...\n      $('#' + settings.id + '-button span:first-child').removeClass('rup-combo_loadingText').text('');\n      var icon = $('#' + settings.id + '-button span:last-child');\n      $(icon).removeClass('rup-combo_loading');\n      $(icon).addClass('ui-icon-triangle-1-s');\n      var isInited = $('#' + settings.id).is('.inited');\n      $('#' + settings.id).removeClass('inited'); //Vaciar combo\n\n      $('#' + settings.id).empty(); //Cargar combo (si se reciben datos)\n\n      if (data.length > 0) {\n        // Se guardan los datos para poder obtener siempre el elemento original cifrado por Hdiv\n        $('#' + settings.id).data('values', data);\n\n        if (settings.source) {\n          if (settings.blank != null && $('#' + settings.id + ' option[value=\"' + settings.blank + '\"]').length == 0) {\n            $('#' + settings.id).prepend($('<option>').attr('value', settings.blank).text(this._getBlankLabel(settings.id)));\n          }\n\n          this._parseREMOTE(data, settings, html);\n        } else {\n          settings.ordered = false;\n\n          this._parseOptGroupREMOTE(data, settings, html);\n        } //Crear combo\n\n\n        this._makeCombo(settings);\n\n        var setRupValue = $.data($('#' + settings.id)[0], 'setRupValue');\n\n        if (setRupValue) {\n          //Vaciar combo, quitarle valor y deshabilitar\n          $('#' + settings.id).rup_combo('select', setRupValue);\n\n          if ($('#' + settings.id).rup_combo('getRupValue') != settings.selected && settings.blank != null) {\n            $('#' + settings.id).rup_combo('setRupValue', settings.blank);\n          }\n        } else {\n          //Lanzar cambio para que se recarguen hijos\n          $('#' + settings.id).trigger('change');\n        }\n      } else {\n        $('#' + settings.id).append('<option></option>');\n      }\n\n      if (isInited) {\n        $('#' + settings.id).removeClass('inited');\n      }\n    },\n\n    /**\r\n     * Procesa la respuesta de la petición AJAX en el caso de que se haya producido un error en la misma.\r\n     *\r\n     * @function  _ajaxError\r\n     * @private\r\n     * @param {object} xhr - Objeto xhr enviado en la respuesta.\r\n     * @param {string} textStatus - Cadena identificadora del error que se ha producido en la petición.\r\n     * @param {object} errorThrown - Objeto error correspondiente al que se ha producido en la petición.\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     */\n    _ajaxError: function _ajaxError(xhr) {\n      if (xhr.responseText !== null) {\n        $.rup.showErrorToUser(xhr.responseText);\n      } else {\n        $.rup.showErrorToUser($.rup.i18n.base.rup_combo.ajaxError);\n      }\n    },\n\n    /**\r\n     * Crea la etiqueta correspondiente a una agrupación.\r\n     *\r\n     * @function  _generateOptGroupLabel\r\n     * @private\r\n     * @param {jQuery} object - Referencia al propio componente.\r\n     * @param {string} multiOptgroupIconText - Prefijo de los option group.\r\n     */\n    _generateOptGroupLabel: function _generateOptGroupLabel(object, multiOptgroupIconText) {\n      //Texto A > SPAN\n      $(object).append($('<span></span>').text($(object).children('a').text()).addClass('rup-combo_multiOptgroupLabel'));\n      $(object).children('a').remove();\n      $(object).append($('<span></span>').text(' ['));\n      $(object).append($('<a></a>').text(multiOptgroupIconText ? $.rup.i18n.base.rup_combo.multiselect.optGroupSelect : '').prepend($('<span></span>').addClass('ui-icon ui-icon-check rup-combo_multiOptgroupIcon')).attr('title', $.rup.i18n.base.rup_combo.multiselect.optGroupSelectTitle).rup_tooltip({\n        applyToPortal: true\n      }).click(function () {\n        var inputs = $(object).nextUntil('li.ui-multiselect-optgroup-label').find('input');\n\n        for (var i = 0; i < inputs.length; i++) {\n          if (!inputs[i].disabled) {\n            inputs[i].checked = false;\n          }\n        }\n      }));\n      $(object).append($('<span></span>').text(' | '));\n      $(object).append($('<a></a>').text(multiOptgroupIconText ? $.rup.i18n.base.rup_combo.multiselect.optGroupDeselect : '').prepend($('<span></span>').addClass('ui-icon ui-icon-closethick rup-combo_multiOptgroupIcon')).attr('title', $.rup.i18n.base.rup_combo.multiselect.optGroupDeselectTitle).rup_tooltip({\n        applyToPortal: true\n      }).click(function () {\n        var inputs = $(object).nextUntil('li.ui-multiselect-optgroup-label').find('input');\n\n        for (var i = 0; i < inputs.length; i++) {\n          if (!inputs[i].disabled) {\n            inputs[i].checked = true;\n          }\n        }\n      }));\n      $(object).append($('<span></span>').text(' ]'));\n    },\n\n    /**\r\n     * Devuelve los li de los elementos seleccionados en un combo multiselección.\r\n     *\r\n     * @function  _selectedOptionLiMultiselect\r\n     * @private\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @return {jQuery | jQuery[]} - Objetos jQuery con referencias a los elementos seleccionados.\r\n     */\n    _selectedOptionLiMultiselect: function _selectedOptionLiMultiselect() {\n      return this._optionLis.eq(this._selectedIndex());\n    },\n\n    /**\r\n     * Devuelve el li del elemento que contiene el foco en un combo multiselección.\r\n     *\r\n     * @function  _focusedOptionLiMultiselect\r\n     * @private\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     * @return {jQuery} - Objeto jQuery con referencia al elemento que contiene el foco.\r\n     */\n    _focusedOptionLiMultiselect: function _focusedOptionLiMultiselect(settings) {\n      var multiselectSettings = $('#' + settings.id).data('echMultiselect');\n      var $elem;\n      jQuery.each(multiselectSettings.inputs, function (index, elem) {\n        if ($(elem).parent().has('.ui-state-hover')) {\n          $elem = $(elem);\n        }\n      });\n      return $elem;\n    },\n\n    /**\r\n     * Procesa los eventos de introducción de caracteres de teclado por parte del usuario.\r\n     *\r\n     * @function  _typeAheadMultiselect\r\n     * @private\r\n     * @param {number} code - Código ASCII correspondiente al caracter introducido por el usuario.\r\n     * @param {object} eventType - Objeto event de jQuery.\r\n     * @param {object} settings - Objeto de propiedades de configuración con el que se ha inicializado el componente.\r\n     */\n    _typeAheadMultiselect: function _typeAheadMultiselect(code, eventType, settings) {\n      var self = this,\n          c = String.fromCharCode(code).toLowerCase(),\n          matchee = null,\n          nextIndex = null; // Clear any previous timer if present\n\n      if (self._typeAhead_timer) {\n        window.clearTimeout(self._typeAhead_timer);\n        self._typeAhead_timer = undefined;\n      } // Store the character typed\n\n\n      self._typeAhead_chars = (self._typeAhead_chars === undefined ? '' : self._typeAhead_chars).concat(c); // Detect if we are in cyciling mode or direct selection mode\n\n      if (self._typeAhead_chars.length < 2 || self._typeAhead_chars.substr(-2, 1) === c && self._typeAhead_cycling) {\n        self._typeAhead_cycling = true; // Match only the first character and loop\n\n        matchee = c;\n      } else {\n        // We won't be cycling anymore until the timer expires\n        self._typeAhead_cycling = false; // Match all the characters typed\n\n        matchee = self._typeAhead_chars;\n      } // We need to determine the currently active index, but it depends on\n      // the used context: if it's in the element, we want the actual\n      // selected index, if it's in the menu, just the focused one\n      // I copied this code from _moveSelection() and _moveFocus()\n      // respectively --thg2k\n\n\n      var selectedIndex = (eventType !== 'focus' ? this._selectedOptionLiMultiselect(settings).data('index') : this._focusedOptionLiMultiselect(settings).data('index')) || 0;\n      var multiselectSettings = $('#' + settings.id).data('echMultiselect');\n\n      for (var i = 0; i < multiselectSettings.inputs.length; i++) {\n        var thisText = multiselectSettings.inputs.eq(i).next('span').text().substr(0, matchee.length).toLowerCase();\n\n        if (thisText === matchee) {\n          if (self._typeAhead_cycling) {\n            if (nextIndex === null) nextIndex = i;\n\n            if (i > selectedIndex) {\n              nextIndex = i;\n              break;\n            }\n          } else {\n            nextIndex = i;\n          }\n        }\n      }\n\n      if (nextIndex !== null) {\n        // Why using trigger() instead of a direct method to select the\n        // index? Because we don't what is the exact action to do, it\n        // depends if the user is typing on the element or on the popped\n        // up menu\n        multiselectSettings.inputs.eq(nextIndex).parent().trigger('mouseover');\n        multiselectSettings.inputs.eq(nextIndex).trigger(eventType);\n      }\n\n      self._typeAhead_timer = window.setTimeout(function () {\n        self._typeAhead_timer = undefined;\n        self._typeAhead_chars = undefined;\n        self._typeAhead_cycling = undefined;\n      }, settings.typeAhead);\n    },\n\n    /**\r\n     * Método de inicialización del componente.\r\n     *\r\n     * @function  _init\r\n     * @private\r\n     * @param {object} args - Parámetros de inicialización del componente.\r\n     */\n    _init: function _init(args) {\n      var _this = this;\n\n      global.initRupI18nPromise.then(function () {\n        if (args.length > 1) {\n          $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(_this).attr('id'));\n        } else {\n          //Se recogen y cruzan las paremetrizaciones del objeto\n          var settings = $.extend({}, $.fn.rup_combo.defaults, args[0]),\n              html,\n              loadAsLocal = false,\n              isValidableElem = false,\n              attrsJson = {},\n              attrs; // Cargar el identificador del padre del patrón.\n\n          settings.id = $.rup_utils.escapeId($(_this).attr('id'));\n          settings.name = $(_this).attr('name'); // Comprobar en caso de ser enlazado, que los combos sobre los que depende hayan sido inicializados.\n\n          if (settings.parent && Array.isArray(settings.parent) && !settings.parentsInitialized) {\n            var parentsDeferred = [];\n            var parentsInitialized = true;\n            $.each(settings.parent, function (key, id) {\n              if (!$('#' + id).rup_combo(\"isInitialized\")) {\n                var parentDeferred = $.Deferred();\n                parentsDeferred.push(parentDeferred); // Inicializarse cuando el padre o padres lo hayan hecho. El evento se adjunta al label en vez de al combo porque este último es convertido más adelante y pierde el evento.\n\n                $('label[for=\"' + id + '\"]').on('comboIsInitialized', function () {\n                  // Desligar evento del elemento.\n                  $(this).off('comboIsInitialized'); // Resolver promesa.\n\n                  parentDeferred.resolve();\n                });\n                parentsInitialized = false;\n              }\n            });\n\n            if (!parentsInitialized) {\n              $.when.apply($, parentsDeferred).done(function () {\n                // Añadir parámetro para indicar que la inicialización del componente ya puede llevarse a cabo de manera segura.\n                settings.parentsInitialized = true; // Inicializar componente.\n\n                $('#' + settings.id).rup_combo(settings);\n              });\n              return false;\n            }\n          } // Se sobreescribe el change:\n\n\n          if (settings.change) {\n            settings.userChange = settings.change;\n          }\n\n          if (settings.userChange) {\n            settings.change = function () {\n              if ($('#' + settings.id).is('.inited')) {\n                settings.userChange();\n              }\n            };\n          } //Se recoge el tabindex indicado en el elemento\n\n\n          settings.tabindex = $(_this).attr('tabindex'); //Sobreescribir literales por defecto para multicombo\n\n          $.extend($.ech.multiselect.prototype.options, $.rup.i18n.base.rup_combo.multiselect); // Definir el elemento del DOM sobre el que se añadirá el componente siempre y cuando no se haya definido ya en los parámetros de inicialización\n\n          if (settings.appendTo != undefined) {\n            if (settings.appendTo.length == 0 || settings.appendTo.length == undefined) {\n              console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_combo.appendToError'), settings.id));\n              settings.appendTo = $('#' + settings.id).parent();\n            }\n          } else {\n            settings.appendTo = $('#' + settings.id).parent();\n          } //Si no se recibe identificador para el acceso a literales se usa el ID del objeto\n\n\n          if (!settings.i18nId) {\n            settings.i18nId = settings.id;\n          } //Guardar valor del INPUT\n\n\n          settings.inputValue = $('#' + settings.id).val() === null ? $('#' + settings.id).prop('value') : $('#' + settings.id).val();\n          attrs = $(_this).prop('attributes');\n\n          for (var i = 0; i < attrs.length; i++) {\n            attrsJson[attrs[i].name] = attrs[i].value;\n          }\n\n          $.extend(attrsJson, {\n            name: settings.name,\n            ruptype: 'combo'\n          }); //Contenido combo\n\n          html = $('<select>').attr(attrsJson).addClass('rup_combo');\n\n          if ($(_this).hasClass('validableElem')) {\n            isValidableElem = true;\n            html.addClass('validableElem');\n          }\n\n          if ($(_this).hasClass('customelement')) {\n            isValidableElem = true;\n            html.addClass('customelement');\n          }\n\n          if (settings.firstLoad === null && $(_this).is('select') && settings.loadFromSelect) {\n            loadAsLocal = true;\n          }\n\n          if (settings.parent) {\n            //DEPENDIENTE\n            //Guardar referencia a hijos en cada uno de los padres (propagación de carga)\n            $.map(settings.parent, function (item) {\n              var childsArray = $('#' + item).data('childs') === undefined ? [] : $('#' + item).data('childs');\n              childsArray[childsArray.length] = settings.id;\n              $('#' + item).data('childs', childsArray);\n            });\n\n            if (settings.loadFromSelect === false) {\n              if (settings.firstLoad !== null) {\n                _this._parseLOCAL(settings.firstLoad, settings, html);\n              } //Crear combo y deshabilitarlo\n\n\n              $('#' + settings.id).replaceWith(html);\n            } else {\n              $('#' + settings.id).attr('ruptype', 'combo').removeClass().addClass('rup_combo');\n\n              if (isValidableElem) {\n                $('#' + settings.id).removeClass().addClass('validableElem');\n              }\n            }\n\n            _this._makeCombo(settings);\n\n            if (!($(_this).is('select') && settings.loadFromSelect)) {\n              $('#' + settings.id).rup_combo('disable');\n            } else {\n              var options = $(_this).find('option');\n              var vacio = true;\n\n              for (var _i2 = 0; _i2 < options.length; _i2 = _i2 + 1) {\n                if ($(options[_i2]).attr('value') !== '') {\n                  vacio = false;\n                  break;\n                }\n              }\n\n              if (vacio) {\n                $('#' + settings.id).rup_combo('disable');\n              }\n            } //Almacenar los settings\n\n\n            $('#' + settings.id).data('settings', settings); //Comprobar si los padres ya tienen datos seleccionados (si son LOCALES puede suceder)\n\n            if (_this._getParentsValues(settings.parent) !== null && settings.firstLoad === null && settings.loadFromSelect === false) {\n              $('#' + settings.id).rup_combo('reload');\n            }\n\n            multiChange(settings);\n            $('#' + settings.id).addClass('inited');\n          } else if (_typeof(settings.source) === 'object' || _typeof(settings.sourceGroup) === 'object' || loadAsLocal) {\n            //LOCAL\n            if (settings.blank != null) {\n              var isOptgroup = false; // Comprobamos si el value es un objeto. En caso de serlo esto nos indicara que se trata de un combo tipo 'optgroup'.\n\n              $.each(settings.sourceGroup, function (key, value) {\n                if (_typeof(value) === 'object' && value !== null) {\n                  isOptgroup = true;\n                  return false;\n                }\n              }); // Si es un combo tipo 'optgroup' se establece una propiedad para que despues \n              // en el metodo '_parseOptGroupLOCAL' se gestione correctamente.\n\n              if (isOptgroup) {\n                settings.blankDone = false;\n              }\n            } //Parsear datos\n\n\n            if (settings.loadFromSelect === false) {\n              if (settings.source) {\n                _this._parseLOCAL(settings.firstLoad !== null ? settings.firstLoad : settings.source, settings, html);\n              } else {\n                settings.ordered = false;\n\n                _this._parseOptGroupLOCAL(settings.firstLoad !== null ? settings.firstLoad : settings.sourceGroup, settings, html);\n              }\n\n              $('#' + settings.id).replaceWith(html);\n            } else {\n              $('#' + settings.id).attr('ruptype', 'combo').removeClass().addClass('rup_combo');\n\n              if (isValidableElem) {\n                $('#' + settings.id).removeClass().addClass('validableElem');\n              }\n            } //Crear combo\n\n\n            _this._makeCombo(settings);\n\n            if (settings.onLoadSuccess !== null) {\n              jQuery(settings.onLoadSuccess($('#' + settings.id)));\n            } //Almacenar los settings\n\n\n            $('#' + settings.id).data('settings', settings);\n            multiChange(settings);\n            $('#' + settings.id).addClass('inited');\n          } else if (typeof settings.source === 'string' || typeof settings.sourceGroup === 'string') {\n            //REMOTO\n            var url = settings.source ? settings.source : settings.sourceGroup,\n                rupCombo = _this,\n                self = _this;\n            $.rup_ajax({\n              url: url,\n              dataType: 'json',\n              contentType: 'application/json',\n              beforeSend: function beforeSend(xhr) {\n                rupCombo._ajaxBeforeSend(xhr, settings, html);\n              },\n              success: function success(data) {\n                if (settings.blank != null) {\n                  var isOptgroup = false; // Comprobamos si el value es un objeto. En caso de serlo esto nos indicara que se trata de un combo tipo 'optgroup'.\n\n                  $.each(data[0], function (key, value) {\n                    if (_typeof(value) === 'object' && value !== null) {\n                      isOptgroup = true;\n                      return false;\n                    }\n                  }); // Si es un combo tipo 'optgroup' se establece una propiedad para que despues \n                  // en el metodo '_parseOptGroupREMOTE' se gestione correctamente.\n\n                  if (isOptgroup) {\n                    settings.blankDone = false;\n                  }\n                }\n\n                rupCombo._ajaxSuccess(data, settings, html);\n\n                if (settings.onLoadSuccess !== null) {\n                  jQuery(settings.onLoadSuccess($('#' + settings.id)));\n                }\n\n                multiChange(settings);\n                $('#' + settings.id).addClass('inited'); // Evento que se ejecuta cuando la carga de datos ha sido satisfactoria.\n\n                $('#' + settings.id).triggerHandler('comboAjaxLoadSuccess', [data]);\n              },\n              error: function error(xhr, textStatus, errorThrown) {\n                if (settings.onLoadError !== null) {\n                  jQuery(settings.onLoadError(xhr, textStatus, errorThrown));\n                } else {\n                  self._ajaxError(xhr, textStatus, errorThrown);\n                }\n              }\n            }); // delete rupCombo;\n            //Almacenar los settings\n\n            $('#' + settings.id).data('settings', settings);\n          } else if (typeof settings.source === 'function' || typeof settings.sourceGroup === 'function') {\n            jQuery(settings.source);\n\n            _this._makeCombo(settings); //Almacenar los settings\n\n\n            $('#' + settings.id).data('settings', settings);\n            multiChange(settings);\n            $('#' + settings.id).addClass('inited');\n          } //Asociar evento CHANGE para propagar cambios a los hijos\n\n\n          $('#' + settings.id).on('change', function () {\n            // En caso de modificarse el valor del select, se actualiza el valor del rup.combo (con esta accion se recargan tambien los hijos)\n            if (!settings.multiselect) {\n              $('#' + settings.id).rup_combo('select', $('#' + settings.id).val());\n            } else {\n              $('#' + settings.id).rup_combo('select', $('#' + settings.id).rup_combo('getRupvalue'));\n            } //Lanzar cambio para que se recarguen hijos, si los tiene\n\n\n            var hijos = $(this).data('childs');\n\n            if (hijos !== undefined) {\n              for (var _i3 = 0; _i3 < hijos.length; _i3 = _i3 + 1) {\n                $('#' + hijos[_i3]).rup_combo('reload');\n              }\n            }\n          }); //Borrar referencia\n          // delete html;\n          //Ocultar posibles elementos de fechas/horas\n\n          $('#' + settings.id).next('a').click(function () {\n            $('#ui-datepicker-div').hide();\n          }); //Se audita el componente\n\n          $.rup.auditComponent('rup_combo', 'init'); // Comunicar la inicialización del componente.\n\n          $('label[for=\"' + settings.id + '\"]').triggerHandler('comboIsInitialized');\n        }\n      })[\"catch\"](function (error) {\n        console.error('Error al inicializar el componente:\\n', error);\n      });\n    }\n  }); // Creamos un método para añadir el change a los multiselect\n\n  var multiChange = function multiChange(settings) {\n    if (settings.multiselect) {\n      $('#' + settings.id).on('multiselectopen', function () {\n        if (!settings.opened) {\n          settings.lastMultiValue = $('#' + settings.id).rup_combo('getRupValue');\n        }\n\n        settings.opened = !!1;\n      });\n      $('#' + settings.id).on('multiselectclose', function () {\n        var changed = settings.lastMultiValue.toString() != $('#' + settings.id).rup_combo('getRupValue').toString();\n\n        if (settings.change && changed && settings.opened) {\n          settings.change();\n        }\n\n        settings.opened = !!0;\n      });\n    }\n  }; //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  /**\r\n   * Función a ejecutar en caso de producirse un error a la hora de obtener los elementos a mostrar.\r\n   *\r\n   * @callback jQuery.rup_combo~onLoadError\r\n   * @param {Object} xhr - Objeto XHR que contiene la respuesta de la petición realizada.\r\n   * @param {string} textStatus - Texto que identifica el error producido.\r\n   * @param {Object} errorThrown - Objeto error que contiene las propiedades del error devuelto en la petición.\r\n   */\n\n  /**\r\n   * Función a ejecutar en caso de producirse un error a la hora de obtener los elementos a mostrar.\r\n   *\r\n   * @callback jQuery.rup_combo~onLoadSuccess\r\n   * @param {jQuery} self - Referencia al objeto jQuery del propio combo.\r\n   */\n\n  /**\r\n   * @description Opciones por defecto de configuración del componente.\r\n   *\r\n   * @name defaults\r\n   *\r\n   * @property {jQuery.rup_combo~onLoadError} [onLoadError] - Función de callback a ejecutar en caso de que se produzca un error en la petición de obtención de la lista de elementos a mostrar.\r\n   * @property {number} [width=200] - Determina el tamaño del combo. Su valor por defecto es 200 para la selección simple. En el caso de selección múltiple su declaración es obligatoria. Puede establecerse un porcentaje para que el combo sea responsivo.\r\n   * @property {string} [blank=null] - Se utiliza para declarar un valor independiente de la lógica de negocio y en ocasiones se representa como \"Seleccione un elemento\". Permite establecer un mensaje independiente por cada combo haciendo uso de $.rup.i18n.app.id._blank (sustituyendo id por el propio de cada combo) o uno genérico por aplicación haciendo uso de $.rup.i18n.app.rup_combo.blank. En caso de no definir ninguno, se usará el genérico de UDA, $.rup.i18n.base.rup_combo.blankNotDefined.\r\n   * @property {string} [style=dropdown] - Tipo de visualización de la lista de opciones del combo.\r\n   * @property {boolean} [showValue=false] - Determina si el combo debe mostrar el valor asociado concatenado al literal (sólo selección simple).\r\n   * @property {string} [token=\"|\"] - Define el separador a utilizar cuando se muestra el valor asociado al combo concatenado al literal.\r\n   * @property {string} [multiValueToken=\"##\"] - Define el separador a utilizar en combos enlazados locales.\r\n   * @property {boolean} [ordered=true] - Indica si el combo debe ordenarse.\r\n   * @property {boolean} [orderedByValue=false] - Indica si el la ordenación del combo debe realizarse por el valor de los elementos en lugar de por el texto.\r\n   * @property {jQuery.rup_combo~onLoadSuccess} [onLoadSuccess=null] - Función de callback a ejecutar en el caso de que la petición de carga de datos se haya producido correctamente.\r\n   * @property {boolean} [loadFromSelect=false] - Determina si se debe de utilizar los elementos option del elemento html sobre el que se inicializa el componente para inicializar los datos del elemento.\r\n   * @property {boolean} [multiselect=false] - Indica si el combo permite la selección múltiple.\r\n   * @property {boolean} [multiOptgroupIconText=false] - Indica si se desea que en la selección múltiple con grupos, el nombre del grupo tenga descripción en los iconos para seleccionar/deseleccionar los elementos del grupo.\r\n   * @property {object} [position={my: 'left top', at: 'left bottom', of: $(\"#comboMulti\")}] - Define la posición del menú. La tercera opción hace referencia al elemento sobre el que se posicionará el menú y su uso es opcional (se usará el botón del combo por defecto si no se define). Más información en https://github.com/ehynds/jquery-ui-multiselect-widget/wiki/Options#available-options.\r\n   * @property {boolean} [positionMenuByOffset=false] - Ofrece la posibilidad de posicionar el menú del combo con multiselección a partir del método .offset() en caso de ser 'true' o por el método .position() en caso de ser 'false'. Esta propiedad sólo será usada si la propiedad 'position' es definida con un valor vacío.\r\n   * @property {boolean} [submitAsString=false] - Indica si el envío de los elementos seleccionados en la selección múltiple se realiza como un literal separados por coma.\r\n   * @property {boolean} [submitAsJSON=false] - Indica si el envío de los elementos seleccionados en la selección múltiple se realiza como un array JSON donde el nombre del mapa será el nombre del combo. En el caso de que el nombre contenga notación dot se tomará el último literal. Ej: [{id:1}, {id:2}, …].\r\n   * @property {boolean} [readAsString=false] - Determina si la asignación de un valor inicial se va a realizar a partir de un string con los ids de los elementos separados por comas en vez de un array de json.\r\n   * @property {boolean} [rowStriping=false] - Indica si se debe aplicar un estilo diferente a las filas pares e impares para poder distinguirlas mediante un color diferente.\r\n   * @property {number} [typeAhead=false] - Especifica en milisegundos el tiempo de espera que toma el componente antes de procesar los eventos de escritura realizados por el usuario.\r\n   * @property {number} [legacyWrapMode=false] - Determina si se emplea el método obsoleto a la hora de empaquetar en objetos json los elementos seleccionados. Su propósito es mantener la retrocompatibilidad.\r\n   * @property {function} [open=function( event, ui )] - Calcula el ancho del combo y se lo aplica al menú que despliega al pulsar sobre el.\r\n   */\n\n\n  $.fn.rup_combo.defaults = {\n    onLoadError: null,\n    width: 200,\n    blank: null,\n    style: 'dropdown',\n    showValue: false,\n    token: '|',\n    multiValueToken: '##',\n    ordered: true,\n    orderedByValue: false,\n    firstLoad: null,\n    onLoadSuccess: null,\n    loadFromSelect: false,\n    multiselect: false,\n    multiOptgroupIconText: true,\n    position: {\n      my: 'left top',\n      at: 'left bottom'\n    },\n    positionMenuByOffset: false,\n    submitAsString: false,\n    submitAsJSON: false,\n    readAsString: false,\n    rowStriping: false,\n    typeAhead: 1000,\n    legacyWrapMode: false,\n    open: function open(event) {\n      var comboId = $.rup_utils.escapeId(this.id);\n      var anchoCombo = $('#' + comboId + '-button').outerWidth(); // Si es un combo multiselect\n\n      if (this.multiple) {\n        $('#rup-multiCombo_' + comboId).outerWidth(anchoCombo);\n      } // Si es un combo normal\n      else {\n        $('#' + comboId + '-menu').parent('div').outerWidth(anchoCombo);\n        $('#' + comboId + '-menu').outerWidth(anchoCombo);\n      }\n\n      event.stopPropagation();\n    }\n  };\n});\n\nfunction optGroupRemoteHTML($, optGroup, html, self, settings) {\n  $.each(optGroup, function (key, elemGroup) {\n    html.append($('<optgroup>').attr('label', key));\n    html = $(html).children('optgroup:last-child');\n\n    self._parseREMOTE(elemGroup, settings, html, key);\n\n    html = $(html).parent();\n  });\n  return html;\n}\n\nfunction optGroupHTML($, optGroup, html, settings, self) {\n  $.each(optGroup, function (key, elemGroup) {\n    if (typeof elemGroup[0] !== 'string') {\n      html.append($('<optgroup>').attr('label', $.rup.i18nParse($.rup.i18n.app[settings.i18nId], key)));\n    } else {\n      html.append($('<optgroup>').attr('label', key));\n    }\n\n    html = $(html).children('optgroup:last-child');\n\n    self._parseLOCAL(elemGroup, settings, html);\n\n    html = $(html).parent();\n  });\n  return html;\n}\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.combo.js?");

/***/ }),

/***/ "./src/rup.contextMenu.js":
/*!********************************!*\
  !*** ./src/rup.contextMenu.js ***!
  \********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Un menú contextual consta de un menú dentro de una interfaz gráfica que se muestra a partir de una interacción del usuario. El menú contextual muestra una serie de opciones disponibles en el contexto o estado actual de la aplicación.\r\n *\r\n * @summary Componente RUP ContextMenu.\r\n * @module rup_contextMenu\r\n * @example\r\n * var properties = {\r\n *  items : {\r\n *       \"edit\": {name: \"Edit\", icon: \"edit\"},\r\n *       \"cut\": {name: \"Cut\", icon: \"cut\"},\r\n *       \"copy\": {name: \"Copy\", icon: \"copy\"},\r\n *       \"paste\": {name: \"Paste\", icon: \"paste\"},\r\n *       \"delete\": {name: \"Delete\", icon: \"delete\"},\r\n *       \"sep1\": \"---------\",\r\n *       \"quit\": {name: \"Quit\", icon: \"quit\"}\r\n *   }\r\n * };\r\n *\r\n * $('#contextMenu').rup_contextMenu(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! jquery-contextmenu */ \"./node_modules/jquery-contextmenu/dist/jquery.contextMenu.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_contextMenu = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_contextMenu', rup_contextMenu)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_contextMenu('extend', {\n    /**\r\n    * Muestra el menú contextual.\r\n    *\r\n    * @name show\r\n    * @function\r\n    * @example\r\n    * $(\"#contextMenu\").rup_contextMenu(\"show\");\r\n    */\n    show: function show(position) {\n      $(this).contextMenu(position);\n    },\n\n    /**\r\n    * Oculta el menú contextual.\r\n    *\r\n    * @name jQuery.rup_contextMenu#hide\r\n    * @function\r\n    * @example\r\n    * $(\"#contextMenu\").rup_contextMenu(\"hide\");\r\n    */\n    hide: function hide() {\n      $(this).contextMenu('hide');\n    },\n\n    /**\r\n    * Habilita el menú contextual. El menú se mostrará al lanzarse el evento asociado.\r\n    *\r\n    * @name enable\r\n    * @function\r\n    * @example\r\n    * $(\"#contextMenu\").rup_contextMenu(\"enable\");\r\n    */\n    enable: function enable() {\n      $(this).contextMenu(true);\n    },\n\n    /**\r\n    * Deshabilita el menú contextual. El menú no se mostrará aunque se lance el evento asociado.\r\n    *\r\n    * @name disable\r\n    * @function\r\n    * @example\r\n    * $(\"#contextMenu\").rup_contextMenu(\"disable\");\r\n    */\n    disable: function disable() {\n      $(this).contextMenu(false);\n    },\n\n    /**\r\n    * Elimina el menú contextual.\r\n    *\r\n    * @name destroy\r\n    * @function\r\n    * @param {string} selector - Selector a usar en la eliminación del componente.\r\n    * @example\r\n    * $(\"#contextMenu\").rup_contextMenu(\"destroy\", \"#contextMenu\");\r\n    */\n    destroy: function destroy(selector) {\n      $.contextMenu('destroy', selector);\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_contextMenu('extend', {\n    /**\r\n    * Método de inicialización del componente.\r\n    *\r\n    * @name _init\r\n    * @function\r\n    * @private\r\n    * @param {object} args - Parámetros de inicialización del componente.\r\n    */\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        //Se recogen y cruzan las paremetrizaciones del objeto\n        var $self = this,\n            settings = $.extend({}, $.fn.rup_contextMenu.defaults, args[0]); //Asociar el selector - DEPRECATED - Ahora debe validarse su especificación al crear el componente           \n        //settings.selector = $self.selector;\n\n        if (!settings.selector || $(settings.selector).length === 0) {\n          $.rup_messages('msgAlert', {\n            message: $.rup.i18nParse($.rup.i18n.base, 'rup_global.selectorError')\n          });\n          return;\n        } //TODO:ejemplo de title en el contextMenu\n        //Procesar items para i18n\n\n\n        if ($.rup_utils.aplicatioInPortal()) {\n          settings.appendTo = '.r01gContainer';\n        } //Lanzar el plugin subyaciente\n\n\n        jQuery.contextMenu(settings);\n        /* Añadir el estilo para la modificación del estilo del puntero del ratón */\n\n        $self.addClass('context-menu-cursor');\n\n        if (jQuery.rup.browser.isIE) {\n          $self.css('cursor', settings.msieCursorCss);\n        }\n        /* Adecuar los cssSprites */\n\n\n        $.each($('.context-menu-list.context-menu-root'), function (index, elem) {\n          var $elem = jQuery(elem);\n\n          if ($elem.data('contextMenuRoot').selector === settings.selector) {\n            $elem.attr('id', $elem.data('contextMenuRoot').ns.substring(1));\n            $.each($('.context-menu-item'), function (index, item) {\n              var $item = jQuery(item),\n                  contextMenuKey = $item.data('contextMenuKey'),\n                  cssSprite,\n                  itemCfg;\n\n              if (contextMenuKey !== undefined) {\n                itemCfg = settings.items[contextMenuKey];\n\n                if (itemCfg !== undefined) {\n                  cssSprite = itemCfg.cssSprite;\n\n                  if (cssSprite !== undefined && !$item.hasClass('rup-css-sprite')) {\n                    $item.addClass('rup-css-sprite');\n                    $item.prepend($('<span>').addClass(cssSprite));\n                  }\n\n                  if (itemCfg.id !== undefined) {\n                    $item.attr('id', itemCfg.id);\n                  } // Añade el icono especificado en su configuracion\n\n\n                  if (itemCfg.icon != undefined) {\n                    // Para cuando son iconos de la liberia @mdi/font\n                    if (itemCfg.icon.indexOf('mdi') >= 0) {\n                      $item.prepend('<i class=\"mdi ' + itemCfg.icon + ' mr-2\"></i>');\n                    } // Para cuando se usan otras librerias de iconos\n                    else {\n                      $item.prepend('<i class=\"' + itemCfg.icon + ' mr-2\"></i>');\n                    }\n                  }\n                }\n              }\n            });\n          }\n        }); //Se audita el componente\n\n        $.rup.auditComponent('rup_contextMenu', 'init');\n      }\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  /**\r\n  * Función de callback a ejecutar cuando se muestra el menú contextual.\r\n  *\r\n  * @callback jQuery.rup_contextMenu~onShowEvent\r\n  * @param {object} opt - Opciones de configuración.\r\n  * @return {boolean} - En caso de devolver false no se termina mostrando el menú.\r\n  */\n\n  /**\r\n  * Función de callback a ejecutar cuando se oculta el menú contextual.\r\n  *\r\n  * @callback jQuery.rup_contextMenu~onHideEvent\r\n  * @param {object} opt - Opciones de configuración.\r\n  * @return {boolean} - En caso de devolver false no se termina ocultando el menú.\r\n  */\n\n  /**\r\n  * Función de callback a ejecutar a partir de los eventos indicados en la propiedad trigger.\r\n  *\r\n  * @callback jQuery.rup_contextMenu~position\r\n  * @param {jQuery} $menu - Referencia jQuery al objeto propio.\r\n  * @param {number} x - Coordenada x proporcionada por el evento de mostrar el menú.\r\n  * @param {number} y - Coordenada y proporcionada por el evento de mostrar el menú.\r\n  */\n\n  /**\r\n  * Esta propiedad permite especificar una función de callback por defecto para aquellos ítems que no hayan especificado una función propia.\r\n  *\r\n  * @callback jQuery.rup_contextMenu~callback\r\n  * @param {string} key - Key de la opción seleccionada.\r\n  * @param {number} options - Opciones de configuración con los que se ha inicializado el componente.\r\n  * @example\r\n  * callback: function(key, options) {\r\n  *    alert(\"clicked: \" + key);\r\n  * }\r\n  */\n\n  /**\r\n  * Función de callback que devuelve el objeto de configuración del componente.\r\n  *\r\n  * @callback jQuery.rup_contextMenu~build\r\n  * @param {jQuery} $trigger - Referencia jQuery del objeto disparador del callback.\r\n  * @param {object} e - Objeto event correspondiente al evento que desencadena el callback.\r\n  * @return {object} - Objeto de configuración del componente.\r\n  * @example\r\n  * $(\".contextMenu-other\").rup_contextMenu({\r\n  *      trigger: 'none',\r\n  *      build: function($trigger, e) {\r\n  *          return {\r\n  *              callback: function(key, options) {\r\n  *              alert(\"clicked: \" + key);\r\n  *          },\r\n  *          items: {\r\n  *              \"edit\": {name: \"Edit\", icon: \"edit\"},\r\n  *              \"cut\": {name: \"Cut\", icon: \"cut\"},\r\n  *              \"copy\": {name: \"Copy\", icon: \"copy\"},\r\n  *              \"paste\": {name: \"Paste\", icon: \"paste\"},\r\n  *              \"delete\": {name: \"Delete\", icon: \"delete\"},\r\n  *              \"sep1\": \"---------\",\r\n  *              \"quit\": {name: \"Quit\", icon: \"quit\"}\r\n  *          }\r\n  *      };\r\n  *  }\r\n  * });\r\n  */\n\n  /**\r\n  * @description Propiedades de configuración del componente.\r\n  *\r\n  * @name defaults\r\n  * @property {object} items - Objeto que define los elementos que van a mostrarse en el menú contextual. En el siguiente apartado se explicará más en detalle como realizar esta definición.\r\n  * @property {string} [appendTo] - Selector de jQuery que identifica el elemento del DOM a partir del cual se va a añadir el menú contextual generado.\r\n  * @property {string} [trigger] - Determina el evento que va a lanzar la visualización del menú contextual. (\"right\",\"left\", \"hover\", \"none\").\r\n  * @property {boolean} [reposition] - Determina si un menú debe ser reposicionado (true) o reconstruido (false) en el caso de que el evento que lanza la visualización del menú contextual se ejecute por segunda vez.\r\n  * @property {number} [delay=200] - Determina el tiempo de retardo antes de mostrar el menú contextual. Solo se aplica sobre el evento “hover”.\r\n  * @property {boolean} [autoHide=false] - Indica si el menú contextual debe de ocultarse automáticamente cuando el cursor del ratón abandona la posición del menú contextual y el elemento que lo lanza.\r\n  * @property {number} [zIndex=1] - Especifica el desplazamiento de zIndex que se aplica al calculado.\r\n  * @property {string} [className] - Nombres de clases adicionales que se van a aplicar al menú contextual.\r\n  * @property {object} animation - Determina la animación que se va a aplicar a la hora de mostrar/ocultar el menúcontextual. La configuración es la misma que la que utiliza para realizar la de los métodos show y hide de jQuery.\r\n  * @property {object} [events] - Los eventos show y hide se ejecutan antes de el menú se muestre o se oculte. Mediante esta propiedad es posible indicar funciones de callback para ser ejecutadas en estos casos. Permiten devolver false para evitar continuar con el evento.\r\n  * @property {jQuery.rup_contextMenu~onShowEvent} events.show - Función a ejecutar antes de que se muestre el menú.\r\n  * @property {jQuery.rup_contextMenu~onHideEvent} events.hide - Función a ejecutar antes de que se oculte el menú.\r\n  * @property {jQuery.rup_contextMenu~position} position - Función de callback que se ejecuta a partir de los eventos indicados en la propiedad trigger.\r\n  * @property {string} determinePosition - Determina la posición del menú contextual de acuerdo al elemento disparador.\r\n  * @property {jQuery.rup_contextMenu~callback} [callback] - Esta propiedad permite especificar una función de callback por defecto para aquellos ítems que no hayan especificado una función propia.\r\n  * @property {jQuery.rup_contextMenu~build} [build] - Función de callback que devuelve el objeto de configuración del componente. En caso de especificar una función para la propiedad build la creación del menú no se realiza inicialmente sino que se demora hasta que se ejecuta el evento que lo muestra.\r\n  * @property {boolean} [showCursor=true] - Determina si se va a modificar el estilo del puntero del ratón al posicionarse sobre el elemento que dispone de menú contextual. El tipo de puntero se determina mediante la clase CSS context-menu-cursor.\r\n  * @property {string} [msieCursorCss=\"url(\"+$.rup.RUP+\"/css/cursors/context-menu.cur),default\"] - Esta propiedad se emplea para poder modificar la apariencia del cursor en Internet Explorer al posicionarse sobre un elemento que dispone de un menú contextual. Esto es debido a que el modo en el que hay que realizar la asignación del nuevo cursor no se puede realizar mediante un class\r\n  */\n\n  $.fn.rup_contextMenu.defaults = {\n    autoHide: true,\n    showCursor: true,\n    msieCursorCss: 'url(' + $.rup.RUP + '/css/cursors/context-menu.cur),default'\n  };\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.contextMenu.js?");

/***/ }),

/***/ "./src/rup.date.js":
/*!*************************!*\
  !*** ./src/rup.date.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permite al usuario introducir y seleccionar una fecha, tanto de forma manual como visual, \r\n * moviéndose fácilmente por días, meses y años. Además, para minimizar las posibilidades de \r\n * introducir una fecha incorrecta, ofrece al usuario ayudas y sugerencias de formato. <br/>\r\n * <br/> Además, este sistema permite la introducción de fechas independiente de dispositivo \r\n * y flexible, ya que tanto los usuarios avanzados como los novatos podrán utilizarlo sin problemas.\r\n *\r\n * @summary Componente RUP Date.\r\n * @module rup_date\r\n * @see El componente está basado en el plugin {@link http://jqueryui.com/datepicker/|jQuery UI DatePicker}. \r\n * Para mas información acerca de las funcionalidades y opciones de configuración pinche \r\n * {@link http://api.jqueryui.com/datepicker/|aquí}.\r\n * @example\r\n * // Ejemplo de selector de fecha simple.\r\n * $(\"#fecha\").rup_date({\r\n *\tlabelMaskId : \"fecha-mask\",\r\n *\tshowButtonPanel : true,\r\n *\tshowOtherMonths : true,\r\n *\tnoWeekend : true\r\n * });\r\n *\r\n * // Ejemplo de selector de fecha simple que permite seleccionar tres fechas.\r\n * $(\"#fecha_multi\").rup_date({\r\n *\tmultiSelect: 3,\r\n *\tlabelMaskId : \"fecha_multi-mask\",\r\n *\tbuttonImage : \"/rup/css/images/exclamation.png\"\r\n * });\r\n *\r\n * // Ejemplo de selectores de fecha desde y hasta\r\n * $.rup_date({\r\n *\tfrom: \"desde\",\r\n *\tto: \"hasta\",\r\n *\t//Resto igual que en date\r\n *\tlabelMaskId : \"intervalo-mask\",\r\n *\tnumberOfMonths: 3\r\n * });\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./core/ui/jquery-ui.timepicker */ \"./src/core/ui/jquery-ui.timepicker.js\"), __webpack_require__(/*! ./core/ui/jquery-ui.multidatespicker */ \"./src/core/ui/jquery-ui.multidatespicker.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  //DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_date = {};\n  var rup_interval = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_date', rup_date));\n  $.extend($.rup.iniRup, $.rup.rupObjectConstructor('rup_date', rup_interval)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_date('extend', {\n    /**\r\n     * Método utilizado para obtener el valor del componente. Este método es el utilizado por el \r\n     * resto de componentes RUP para estandarizar la obtención del valor del componente fecha.\r\n     *\r\n     * @function  getRupValue\r\n     * @return {string | array} - Devuelve el valor actual del componente seleccionado por el usuario.\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"getRupValue\");\r\n     */\n    getRupValue: function getRupValue() {\n      if ($(this).data('datepicker').settings.datetimepicker) {\n        var tmpDate = $(this).datepicker('getDate');\n\n        if (tmpDate === null || tmpDate.toString() === 'Invalid Date') {\n          return '';\n        }\n\n        var fechaArray = $(this).rup_date('getDate').split(' ');\n        var formattedTime = $(this).data('datepicker').settings.timeFormat;\n        var separator = formattedTime[2];\n        var tmpTime = fechaArray[1].split(separator).join(':');\n        var dateFormat = $(this).data('datepicker').settings.dateFormat;\n        return $.datepicker.formatDate(dateFormat, tmpDate) + ' ' + tmpTime;\n      } else {\n        return $(this).rup_date('getDate');\n      }\n    },\n\n    /**\r\n     * Método utilizado para asignar el valor al componente. Este método es el utilizado por\r\n     *  el resto de componentes RUP para estandarizar la asignación del valor al componente fecha.\r\n     *\r\n     * @function  setRupValue\r\n     * @param {string | array} param - Valor que se va a asignar al componente. En caso de tratarse \r\n     * de uan configuración en la que se permite seleccionar varias fechas se indicará mediante un array.\r\n     * @example\r\n     * // Fecha simple\r\n     * $(\"#idDate\").rup_date(\"setRupValue\", \"21/06/2015\");\r\n     * // Varias fechas\r\n     * $(\"#idDate\").rup_date(\"setRupValue\", [\"21/06/2015\", \"22/06/2015\"]);\r\n     */\n    setRupValue: function setRupValue() {\n      var param = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      if (param === '') {\n        return param;\n      }\n\n      var $this = $(this);\n      var element = this;\n      var settings = $this.data('datepicker').settings;\n      var date;\n\n      if (settings.datetimepicker) {\n        var fechaArray = element._splitDate(param);\n\n        fechaArray[0] = element._defineCorrectFormat(fechaArray[0]);\n\n        if (fechaArray[1] !== undefined) {\n          var dateString = fechaArray[0] + ' ' + fechaArray[1];\n          date = new Date(dateString);\n        } else {\n          date = new Date(fechaArray[0]);\n        }\n      } else if (settings.multiSelect) {\n        date = [];\n\n        for (var index = 0; index < settings.multiSelect; index++) {\n          var newValue = new Date(element._defineCorrectFormat(element._splitDate(param[index])[0]));\n\n          if (newValue.toString() === 'Invalid Date') {\n            console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_date.errors.invalidDate')), settings.id);\n          } else {\n            date.push(newValue);\n          }\n        }\n\n        if (date.length > 0 && param.length > settings.multiSelect) {\n          console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_date.errors.multiSelectLimitExceeded')), param.length, settings.multiSelect, param);\n        }\n      } else {\n        date = new Date(element._defineCorrectFormat(param));\n      }\n\n      if (!settings.multiSelect && date.toString() === 'Invalid Date') {\n        console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_date.errors.invalidDate')), settings.id);\n        return '';\n      }\n\n      if (settings.datetimepicker) {\n        $.datepicker._setDateDatepicker($(\"#\" + settings.id)[0], date);\n      } else if (settings.multiSelect) {\n        if (date.length > 0) {\n          $this.multiDatesPicker('resetDates');\n          $this.multiDatesPicker('addDates', date);\n        }\n      } else {\n        $.datepicker._setDate($.datepicker._getInst($(\"#\" + settings.id)[0]), date);\n      }\n    },\n\n    /**\r\n     * Elimina el componente de la pantalla. En caso de tener máscara también se restaura el label \r\n     * con un texto vacío\r\n     *\r\n     * @function  destroy\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      //Eliminar máscara\n      var labelMaskId = $(this).data('datepicker').settings.labelMaskId;\n\n      if (labelMaskId) {\n        $('#' + labelMaskId).text('');\n      } //delete labelMaskId;\n\n\n      $(this).datepicker('destroy');\n    },\n\n    /**\r\n     * Deshabilita el componente en pantalla no pudiendo introducirse ninguna fecha ni se despliega\r\n     *  el calendario.\r\n     *\r\n     * @function  disable\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"disable\");\r\n     */\n    disable: function disable() {\n      $(this).datepicker('option', 'showOn', 'button');\n      $(this).next('button').prop('disabled', true);\n      $(this).prop('readonly', true);\n    },\n\n    /**\r\n     * Habilita el componente permitiendo introducir la fecha tanto mediante teclado como mediante el \r\n     * desplegable del calendario\r\n     *\r\n     * @function  enable\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"enable\");\r\n     */\n    enable: function enable() {\n      $(this).next('button').prop('disabled', false);\n      $(this).datepicker('option', 'showOn', 'both');\n      $(this).prop('readonly', false);\n    },\n\n    /**\r\n     * Indica si el componente se encuentra deshabilitado o no.\r\n     *\r\n     * @function  isDisabled\r\n     * @return {boolean} - Devuelve si el componente está deshabilitado o no.\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"isDisabled\");\r\n     */\n    isDisabled: function isDisabled() {\n      return $(this).prop('readonly');\n    },\n\n    /**\r\n     * Oculta el calendario para seleccionar una fecha.\r\n     *\r\n     * @function  hide\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"hide\");\r\n     */\n    hide: function hide() {\n      $(this).datepicker('hide');\n    },\n\n    /**\r\n     * Muestra el calendario para seleccionar una fecha.\r\n     *\r\n     * @function  show\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"show\");\r\n     */\n    show: function show() {\n      $(this).datepicker('show');\n    },\n\n    /**\r\n     * Devuelve la fecha seleccionada, si no se ha seleccionado nada devuelve vacío.\r\n     *\r\n     * @function  getDate\r\n     * @return {date} - Fecha seleccionada.\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"getDate\");\r\n     */\n    getDate: function getDate() {\n      return $(this).val();\n    },\n\n    /**\r\n     * Establece la fecha del componente. El parámetro debe ser un objeto date.\r\n     *\r\n     * @param {date} - Fecha que se desea asignar.\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"setDate\", new Date());\r\n     */\n    setDate: function setDate(date) {\n      $(this).datepicker('setDate', date);\n    },\n\n    /**\r\n     * Refresca el calendario desplegado por si ha habido algún cambio.\r\n     *\r\n     * @function  refresh\r\n     * @example\r\n     * $(\"#idDate\").rup_date(\"refresh\");\r\n     */\n    refresh: function refresh() {\n      $(this).datepicker('refresh');\n    },\n\n    /**\r\n     * Permite consultar y modificar la configuración del componente.\r\n     *\r\n     * @function option\r\n     * @param {string | object} optionName - Nombre de la propiedad que se desea gestionar o objeto de \r\n     * compuesto de varias propiedades.\r\n     * @param  [value] - Corresponde al valor de la propiedad en caso de haberse especificado el nombre \r\n     * de la misma en el primér parámetro.\r\n     * @example\r\n     * // Consultar una propiedad\r\n     * $(\"#idCombo\").rup_date(\"option\", \"multiselect\");\r\n     * // Establecer una propiedad\r\n     * $(\"#idCombo\").rup_date(\"option\", \"multiselect\", 2);\r\n     * // Establecer varias propiedad\r\n     * $(\"#idCombo\").rup_date(\"option\", {datetimepicker:true, multiselect:3});\r\n     */\n    option: function option(optionName, value) {\n      if (value !== undefined) {\n        $(this).datepicker('option', optionName, value);\n      } else {\n        return $(this).datepicker('option', optionName);\n      }\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_date('extend', {\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        //Se recogen y cruzan las paremetrizaciones del objeto\n        var settings = $.extend({}, $.fn.rup_date.defaults, args[0]); // Se carga el adapter\n\n        this._ADAPTER = $.rup.adapter[settings.adapter]; //Eventos\n        //Guardar referencia\n\n        settings._onClose = settings.onClose;\n\n        settings.onClose = function (event, ui) {\n          if (settings._onClose !== undefined) {\n            settings._onClose(event, ui);\n          }\n\n          if (!$.rup.browser.isIE) {\n            $(this).focus();\n          }\n        };\n\n        if (settings.multiSelect) {\n          settings._beforeShow = settings.beforeShow;\n\n          settings.beforeShow = function (ui, obj) {\n            if (settings._beforeShow !== undefined) {\n              settings._beforeShow(ui, obj);\n            }\n\n            var $dateInput = $(ui),\n                dateValue = $dateInput.attr('value'),\n                dates;\n\n            if (dateValue !== undefined && dateValue !== '') {\n              dates = dateValue.split(',');\n\n              if (dates.length > 1) {\n                $dateInput.multiDatesPicker('addDates', dates);\n              }\n            }\n          };\n        } //Se carga el identificador del padre del patron\n\n\n        settings.id = $(this).attr('id');\n        $(this).attr('ruptype', 'date'); //Carga de propiedades/literales\n        //var literales = $.extend($.rup.i18n.base.rup_time,$.rup.i18n.base.rup_date);\n\n        var literales = $.rup.i18n.base.rup_date;\n\n        for (var key in literales) {\n          if (settings[key] === undefined) {\n            settings[key] = literales[key];\n          }\n        } //Mostrar máscara\n\n\n        if (settings.labelMaskId) {\n          if (settings.datetimepicker) {\n            if (settings.showSecond) {\n              $('#' + settings.labelMaskId).text($.rup.i18nParse($.rup.i18n.base, 'rup_date.maskDateTimeSec') + ' ');\n            } else {\n              $('#' + settings.labelMaskId).text($.rup.i18nParse($.rup.i18n.base, 'rup_date.maskDateTime') + ' ');\n            }\n          } else {\n            $('#' + settings.labelMaskId).text($.rup.i18nParse($.rup.i18n.base, 'rup_date.mask') + ' ');\n          }\n        } //Mostrar placeholder\n\n\n        if (settings.placeholderMask) {\n          if (settings.datetimepicker) {\n            if (settings.showSecond) {\n              $(this).attr('placeholder', $.rup.i18nParse($.rup.i18n.base, 'rup_date.maskDateTimeSec') + ' ');\n            } else {\n              $(this).attr('placeholder', $.rup.i18nParse($.rup.i18n.base, 'rup_date.maskDateTime') + ' ');\n            }\n          } else {\n            $(this).attr('placeholder', $.rup.i18nParse($.rup.i18n.base, 'rup_date.mask') + ' ');\n          }\n        } //Fix: Arregla problema tamaño capa cuando selector es DIV y meses es array [X,1]\n\n\n        if ($('#' + settings.id).is('div') && settings.numberOfMonths[1] === 1) {\n          if (!settings.showWeek) {\n            $('#' + settings.id).css('width', '15.4em');\n          } else {\n            $('#' + settings.id).css('width', '17.1em');\n          }\n        } //Sab-Dom deshabilitados\n\n\n        if (settings.noWeekend) {\n          settings.beforeShowDay = $.datepicker.noWeekends;\n        }\n\n        this._ADAPTER.initIconTrigger(settings); //Datepicker\n\n\n        if (!settings.multiSelect) {\n          if (settings.datetimepicker) {\n            if (settings.showSecond) {\n              this.attr('maxlength', '19');\n            } else {\n              this.attr('maxlength', '16');\n            } //i18n datetimepicker\n\n\n            settings.timeText = $.rup.i18nParse($.rup.i18n.base, 'rup_time.timeText');\n            settings.hourText = $.rup.i18nParse($.rup.i18n.base, 'rup_time.hourText');\n            settings.minuteText = $.rup.i18nParse($.rup.i18n.base, 'rup_time.minuteText');\n            settings.secondText = $.rup.i18nParse($.rup.i18n.base, 'rup_time.secondText');\n            settings.millisecText = $.rup.i18nParse($.rup.i18n.base, 'rup_time.millisecText');\n            settings.microsecText = $.rup.i18nParse($.rup.i18n.base, 'rup_time.microsecText');\n            $('#' + settings.id).datetimepicker(settings);\n          } else {\n            this.attr('maxlength', '10');\n            $('#' + settings.id).datepicker(settings);\n          }\n        } else {\n          var maxlength = 0;\n\n          if (typeof settings.multiSelect === 'number') {\n            settings.mode = {\n              modeName: 'normal',\n              options: {\n                maxPicks: settings.multiSelect\n              }\n            };\n            settings.maxPicks = settings.multiSelect;\n            maxlength = 10 * settings.multiSelect + (settings.multiSelect - 1);\n          } else if (_typeof(settings.multiSelect) === 'object') {\n            settings.mode = {\n              modeName: 'daysRange',\n              options: {\n                autoselectRange: settings.multiSelect\n              }\n            };\n            maxlength = settings.multiSelect[1] - settings.multiSelect[0];\n            maxlength = 10 * maxlength + (maxlength - 1);\n          }\n\n          this.attr('maxlength', maxlength); //Sobreescribir valores por defecto para multiselección\n\n          $.datepicker._defaults.dateFormat = settings.dateFormat;\n          $('#' + settings.id).multiDatesPicker(settings); //Permitir separador de intervalos (coma)\n\n          $(this).keypress(function (event) {\n            if (event.charCode === 44) {\n              var value = $(event.currentTarget).val(),\n                  cursorPosStart = event.originalEvent.originalTarget.selectionStart,\n                  cursorPosEnd = event.originalEvent.originalTarget.selectionEnd,\n                  begin = value.substring(0, cursorPosStart),\n                  end = value.substring(cursorPosEnd); //Si no tiene tamaño máximo o tiene selección de caracteres\n\n              if (value.length < $(event.currentTarget).attr('maxlength') || cursorPosStart !== cursorPosEnd) {\n                $(event.currentTarget).val(begin + ',' + end);\n                event.originalEvent.originalTarget.selectionStart = cursorPosStart + 1;\n                event.originalEvent.originalTarget.selectionEnd = cursorPosStart + 1;\n              }\n            }\n          });\n        }\n\n        this._ADAPTER.postConfigure.bind($(this))(settings); // Cuando el campo contiene un valor (posiblemente definido desde el modelo), se aplica.\n\n\n        if ($('#' + settings.id).val() != \"\") {\n          $('#' + settings.id).rup_date(\"setRupValue\", $('#' + settings.id).val());\n        } //Ajuste para el comportamiento de portales\n\n\n        if ($.rup_utils.aplicatioInPortal() && !$('#' + settings.id).is('div')) {\n          $('.r01gContainer').append($('.ui-datepicker:not(.r01gContainer .ui-datepicker)'));\n        } // Se aplica el tooltip\n\n\n        $(this).parent().find('[title]').rup_tooltip({\n          'applyToPortal': true\n        }); //Deshabilitar\n\n        if (settings.disabled) {\n          $('#' + settings.id).rup_date('disable');\n        } //Callback create\n\n\n        if (settings.create) {\n          settings.create();\n        } //Se audita el componente\n\n\n        $.rup.auditComponent('rup_date', 'init');\n      }\n    },\n    _defineCorrectFormat: function _defineCorrectFormat(dateString) {\n      // Verificar si la fecha está en el formato yyyy/mm/dd o yyyy-mm-dd.\n      var formatoCorrecto = /^\\d{4}(-|\\/)\\d{2}(-|\\/)\\d{2}$/.test(dateString);\n\n      if (!formatoCorrecto) {\n        dateString = $.rup_utils.formatoFecha(\"yyyy/mm/dd\", dateString.replaceAll(\"-\", \"/\"))[0];\n      }\n\n      return dateString;\n    },\n    _splitDate: function _splitDate(dateString) {\n      if (dateString.includes(\"T\")) {\n        return dateString.split('T');\n      } else {\n        return dateString.split(' ');\n      }\n    }\n  });\n  $.rup_date('extend', {\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        //Se recogen y cruzan las paremetrizaciones del objeto (duplicado de objetos)\n        var settings = $.extend({}, $.fn.rup_date.defaults, args[0]),\n            from_settings = $.extend(true, {}, settings),\n            to_settings = $.extend(true, {}, settings); //Gestionar intervalo del campo desde\n\n        from_settings.onClose = function (dateText, inst) {\n          //\t\t\t\t        var endDateTextBox = $(\"#\"+settings.to);\n          var $endDateTextBox = $('#' + settings.to),\n              $startDateTextBox = inst.input,\n              startDateData,\n              toDateData,\n              testStartDate,\n              testEndDate;\n\n          if ($endDateTextBox.attr('value') != '') {\n            startDateData = $startDateTextBox.data('datepicker');\n            toDateData = $endDateTextBox.data('datepicker');\n\n            if (startDateData.settings.timepicker !== undefined) {\n              testStartDate = new Date(startDateData.selectedYear, startDateData.selectedMonth, startDateData.selectedDay, startDateData.settings.hour, startDateData.settings.minute, startDateData.settings.second);\n            } else {\n              testStartDate = new Date(startDateData.selectedYear, startDateData.selectedMonth, startDateData.selectedDay);\n            }\n\n            if (toDateData.settings.timepicker !== undefined) {\n              testEndDate = new Date(toDateData.selectedYear, toDateData.selectedMonth, toDateData.selectedDay, toDateData.settings.hour, toDateData.settings.minute, toDateData.settings.second);\n            } else {\n              testEndDate = new Date(toDateData.selectedYear, toDateData.selectedMonth, toDateData.selectedDay);\n            }\n\n            if (testStartDate > testEndDate) {\n              $endDateTextBox.attr('value', dateText);\n            }\n          } else if (!settings.autoFillToField) {\n            $endDateTextBox.attr('value', dateText);\n          }\n\n          if (settings.onClose !== undefined) {\n            settings.onClose(dateText, inst);\n          }\n        };\n\n        from_settings.onSelect = to_settings.beforeShow = function (selectedDate) {\n          var start = $('#' + settings.from).datetimepicker('getDate'),\n              startDate;\n          startDate = start !== null ? new Date(start.getTime()) : null;\n          $('#' + settings.to).datetimepicker('option', 'minDate', startDate);\n\n          if (settings.datetimepicker) {\n            $('#' + settings.to).datetimepicker('option', 'minDateTime', startDate);\n          }\n\n          if (settings.onSelect !== undefined) {\n            settings.onSelect(selectedDate);\n          }\n        }; //Gestionar intervalo del campo hasta\n\n\n        to_settings.onClose = function (dateText, inst) {\n          var $startDateTextBox = $('#' + settings.from),\n              $endDateTextBox = inst.input,\n              startDateData,\n              toDateData,\n              testStartDate,\n              testEndDate;\n\n          if ($startDateTextBox.attr('value') != '') {\n            startDateData = $startDateTextBox.data('datepicker');\n            toDateData = $endDateTextBox.data('datepicker');\n\n            if (startDateData.settings.timepicker !== undefined) {\n              testStartDate = new Date(startDateData.selectedYear, startDateData.selectedMonth, startDateData.selectedDay, startDateData.settings.hour, startDateData.settings.minute, startDateData.settings.second);\n            } else {\n              testStartDate = new Date(startDateData.selectedYear, startDateData.selectedMonth, startDateData.selectedDay);\n            }\n\n            if (toDateData.settings.timepicker !== undefined) {\n              testEndDate = new Date(toDateData.selectedYear, toDateData.selectedMonth, toDateData.selectedDay, toDateData.settings.hour, toDateData.settings.minute, toDateData.settings.second);\n            } else {\n              testEndDate = new Date(toDateData.selectedYear, toDateData.selectedMonth, toDateData.selectedDay);\n            }\n\n            if (testStartDate > testEndDate) {\n              $startDateTextBox.attr('value', dateText);\n            }\n          } else if (!settings.autoFillFromField) {\n            $startDateTextBox.attr('value', dateText);\n          }\n\n          if (settings.onClose !== undefined) {\n            settings.onClose(dateText, inst);\n          }\n        };\n\n        to_settings.onSelect = from_settings.beforeShow = function (selectedDate) {\n          var end = $('#' + settings.to).datetimepicker('getDate'),\n              endDate;\n          endDate = end !== null ? new Date(end.getTime()) : null;\n          $('#' + settings.from).datetimepicker('option', 'maxDate', endDate);\n\n          if (settings.datetimepicker) {\n            $('#' + settings.from).datetimepicker('option', 'maxDateTime', endDate);\n          }\n\n          if (settings.onSelect !== undefined) {\n            settings.onSelect(selectedDate);\n          }\n        }; //Lanzar componente\n\n\n        $('#' + settings.from).rup_date(from_settings);\n        $('#' + settings.to).rup_date(to_settings);\n      }\n    }\n  });\n  $.extend($.datepicker, {\n    // Corrección para el botón que establece la fecha y hora actual.\n    _gotoToday: function _gotoToday(id) {\n      var inst = this._getInst($(id)[0]);\n\n      this._base_gotoToday(id);\n\n      var tzoffset = $.timepicker.timezoneOffsetNumber(inst.settings.timezoneOffset);\n      var now = new Date();\n      now.setMinutes(now.getMinutes() + now.getTimezoneOffset() + parseInt(tzoffset, 10));\n\n      this._setTime(inst, now);\n\n      this._setDate(inst, now);\n\n      this._onSelectHandler(inst);\n    },\n    _onSelectHandler: function _onSelectHandler(inst) {\n      var onSelect = inst.settings.onSelect;\n      var inputEl = inst.input ? inst.input[0] : null;\n\n      if (onSelect && inputEl) {\n        onSelect.apply(inputEl, [inputEl.value, inst]);\n      }\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  /**\r\n   * A continuación se muestran los posibles parámetros de configuración que recibe el componente.\r\n   * @name options\r\n   * @property {boolean} [datetimepicker=false] - Indica si el componente permite introducir la hora además de la fecha\r\n   * @property {boolean} [disabled=false] - Indica si el componente debe aparecer deshabilitado o no.\r\n   * @property {string} altField - Identificador de un campo adicional para que muestre la fecha en otro formato.\r\n   * @property {string} altFormat - Formato que debe seguir la fecha en el campo adicional\r\n   * @property {string} appendText - Texto que se puede añadir detrás de cada campo de fecha. Se recomienda el uso del atributo “labelMaskId” que se detalla a continuación en lugar de este atributo.\r\n   * @property {string} labelMaskId - Identificador del label que contendrá la máscara que indica el formato de la fecha.\r\n   * @property {string} mask - Texto empleado para la máscara de la fecha. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {boolean} [autoSize=false] - Booleano que indica si el campo para la fecha se tiene que redimensionar automáticamente para adaptares al texto introducido\r\n   * @property {string} buttonImage - Ruta a la imagen que se muestra junto al campo de la fecha y que sirve para desplegar el calendario pulsando sobre ella. Por defecto se muestra una imagen incluida en los ficheros de RUP.\r\n   * @property {string} buttonText - Texto alternativo de la imagen que se muestra junto al campo de la fecha. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {boolean} [changeMonth=true] - Indica si se muestra un combo que en la cabecera que facilita el cambio de mes\r\n   * @property {boolean} [changeYear=true] - indica si se muestra un combo que en la cabecera que facilita el cambio de año\r\n   * @property {string} [closeText] - Texto a mostrar en el botón que se muestra en el panel inferior (requiere el activarlo mediante el atributo showButtonPanel) para cerrar el calendario. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {string} currentText - Texto a mostrar en el botón que se muestra en el panel inferior (requiere el activarlo mediante el atributo showButtonPanel) para seleccionar la fecha actual en el calendario. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {string} dateFormat - Formato de la fecha a introducir (ej: dd/mm/yy para 20/01/2011). Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {array} dayNames - Literales para los días [array]. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {array} dayNamesMin - Literales para los días (mínimos) [array]. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {array} \tdayNamesShort - Literales para los días (corto) [array]. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {date|string|number} defaultDate  - fecha que se muestra por defecto destacada cuando se abre el calendario y no hay ninguna fecha escrita. El tipo de parámetro puede ser Date, String o Number (ver la explicación al final de este apartado). Por defecto se destaca la fecha del día.\r\n   * @property {string|number} [duration=normal] - Velocidad a la que aparece el calendario en pantalla (animación). Sus posibles valores son: ‘slow’, ‘normal’ y ‘fast’ o un valor numérico (milisegundos).\r\n   * @property {number} firstDay -Número que indica en qué día de la semana debe empezar el calendario. El valor 0 equivale al domingo, el 1 al lunes y así sucesivamente.\r\n   * @property {boolean} [hideIfNoPrevNext=false] - Oculta los enlaces de siguiente/anterior mes cuando no se puede navegar. En caso contrario, los enlaces se deshabilitan\r\n   * @property {date|string|number} maxDate - Fecha máxima que se puede seleccionar (límite superior). Por defecto no hay límite.\r\n   * @property {date|string|number} minDate - Fecha mínima que se puede seleccionar (límite inferior). Por defecto no hay límite.\r\n   * @property {array} monthNames - Literales para los meses [array]. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {array} monthNamesShort - Literales para los meses (corto) [array]. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {string} nextText - Literal a mostrar en el enlace de siguiente. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {number|array} [numberOfMonths=1] -Puede definirse como un numérico (ej. 2) o como un array indicando filas y columnas (ej. [2, 3]).\r\n   * @property {string} prevText - Literal a mostrar en el enlace de anterior. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {boolean} [selectOtherMonths=false] - Permite seleccionar los días del meses anterior/posterior del que se muesta. Requiere que estén activos dichos días mediante el parámetro showOtherMonths\r\n   * @property {string} [showAnim=show] - Indica el tipo de animación que se emplea para mostrar el calendario en pantalla.\r\n   * @property {boolean} [showButtonPanel=false] - Indica si se muestran los botones de la parte inferior (hoy y cerrar).\r\n   * @property {number} [showCurrentAtPos=0] - Cuando se muestra más de un mes, indica la posición que ocupa el mes actual.\r\n   * @property {boolean} showMonthAfterYear - Intercambia la posición del mes y del año en la cabecera del calendario.\r\n   * @property {object} showOptions - Objeto que determina las propiedades de la animación del calendario. Para más información ver la siguiente  {@link http://api.jqueryui.com/datepicker/#option-showAnim|página} .\r\n   * @property {boolean} [showWeek=false] - Indica si se debe mostrar el número de semana.\r\n   * @property {number} stepMonths - Indica el número de meses que se avanzan al pulsar los enlaces anterior/siguiente.\r\n   * @property {string} weekHeader - Literal que aparece sobre los números de semana. Su valor por defecto se obtiene del fichero de idioma.\r\n   * @property {string}  yearRange - Determina el rango de años a mostrar en el combo de la cabecera del calendario. No implica que sea el límite de años a seleccionar. Se debe definir como un literal que indique el inicio y el fin separado por dos puntos ej. 2001:2011. Puede usarse el la letra c como valor actual restándole y sumándole un numérico ej. c-10:c+10. Su valor por defecto es c-10:c+10\r\n   * @property {string} yearSuffix - Texto adicional a mostrar en la cabecera del calendario junto al año.\r\n   * @property {booelan} \t[noWeekend=false] - Indica si se muestran o no los días del fin de semana (sábado y domingo).\r\n   * @property {string} from - Indica el selector del campo inicial en los intervalos de fechas\r\n   * @property {string} to - Indica el selector del campo final en los intervalos de fechas\r\n   * @property {array|number} \tmultiselect - Atributo que indica si se permite la multiselección de fechas y el modo en el que se aplica.\r\n   * @property {boolean} [autoFillToField=true] - Atributo que indica si se auto rellena el campo hasta\r\n   * @property {boolean} [autoFillFromField=true] - Atributo que indica si se auto rellena el campo desde\r\n   * @property {number} [timezoneOffset=0] - Permite ajustar el huso horario\r\n   */\n\n  $.fn.rup_date.defaults = {\n    adapter: 'date_material',\n    placeholderMask: false,\n    datetimepicker: false,\n    multiSelect: false,\n    changeMonth: true,\n    changeYear: true,\n    noWeekend: false,\n    showSecond: true,\n    autoFillToField: true,\n    autoFillFromField: true,\n    showMillisec: false,\n    showMicrosec: false,\n    timezoneOffset: 60\n  }; //EVENTOS\n\n  /**\r\n   * Función que se lanza cuando se crea el calendario. La invocación es automática por parte del componente\r\n   * @event module:rup_date#create\r\n   * @example\r\n   * $(selector).rup_date({ create: function(){...} });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará antes de que se muestre el calendario. Los parámetros recibidos son el campo del calendario y la instancia del componente.\r\n   * @event module:rup_date#beforeShow\r\n   * @example\r\n   * $(selector).rup_date({ beforeShow: function(input, inst){...} });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará cuando se cambie de mes o de año en el calendario. Los parámetros recibidos son el año y mes seleccionados así como la instancia del componente\r\n   * @event module:rup_date#onChangeMonthYear\r\n   * @example\r\n   * $(selector).rup_date({onChangeMonthYear: function(y,m,inst){...} });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará cuando se seleccione un valor del calendario. Los parámetros recibidos son la fecha seleccionada (texto) y la instancia del componente.\r\n   * @event module:rup_date#onSelect\r\n   * @example\r\n   * $(selector).rup_date({ onSelect: function(dateText, inst){...} });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará cuando se oculte el calendario. Los parámetros recibidos son la fecha seleccionada (texto) y la instancia del componente.\r\n   *  @event module:rup_date#onClose\r\n   *  @example\r\n   *  $(selector).rup_date({ onClose: function(dateText, inst){...} });\r\n   */\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.date.js?");

/***/ }),

/***/ "./src/rup.dav.js":
/*!************************!*\
  !*** ./src/rup.dav.js ***!
  \************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * @fileOverview Implementa el patrón RUP Dav.\r\n * @author EJIE\r\n * @version 2.4.8\r\n */\n\n/* global ActiveXObject */\n(function ($) {\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n\n  /**\r\n  * Permite al usuario editar online documentos almacenados en el servidor de aplicaciones.\r\n  *\r\n  * @summary Componente RUP Dav.\r\n  * @namespace jQuery.rup_dav\r\n  * @memberOf jQuery\r\n  * @tutorial rup_dav\r\n  * @example\r\n  * jQuery.rup_dav.editOnline({\r\n  *\turl:\"webdavServlet/webdav.doc\",\r\n  *\txlnetsAuth:true,\r\n  *\tdownloadOnError:true,\r\n  *\talternateDownloadURL:\"../upload?fileName=webdav.doc\"\r\n  * });\r\n  */\n  jQuery.rup_dav = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n  //\t$.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor(\"rup_dav\", rup_dav));\n\n  $.extend(jQuery.rup_dav, {\n    /**\r\n     * TODO\r\n     *\r\n     * @name jQuery.rup_dav#editOnline\r\n     * @function\r\n     */\n    editOnline: function editOnline(args) {\n      var settings;\n\n      if (typeof args === 'string') {\n        settings = jQuery.extend({}, jQuery.rup_dav.defaults, {\n          url: args\n        });\n      } else {\n        settings = jQuery.extend({}, jQuery.rup_dav.defaults, args);\n      } // Se comprueba y completa la url\n\n\n      jQuery.rup_dav._checkUrl(settings); // En caso de necesitarse se aplica\n\n\n      if (settings.xlnetsAuth) {\n        jQuery.rup_dav._xlnetsAuth(settings);\n      }\n\n      if ($.browser.msie === true) {\n        jQuery.rup_dav._editOnlineIE(settings);\n      } else {\n        jQuery.rup_dav._editOnlineFF(settings);\n      }\n    }\n  });\n  $.extend(jQuery.rup_dav, {\n    _checkUrl: function _checkUrl(settings) {\n      var tmpUrl = '';\n\n      if (settings.url.indexOf(location.protocol) === -1) {\n        // Se añade la sección de protocolo (http, https...)\n        tmpUrl += location.protocol + '//';\n\n        if (settings.url.indexOf(location.host) === -1) {\n          // Se añade la sección del host\n          tmpUrl += location.host;\n        }\n\n        if (settings.url.indexOf(window.CTX_PATH) === -1) {\n          // Se añade la sección del host\n          tmpUrl += window.CTX_PATH;\n        }\n\n        settings.url = tmpUrl + settings.url;\n      }\n    },\n    _xlnetsAuth: function _xlnetsAuth(settings) {\n      var n38UidSesionCookie = $.rup_utils.readCookie('n38UidSesion'),\n          n38DominioUidCookie = $.rup_utils.readCookie('n38DominioUid'),\n          urlParams = {};\n\n      if (n38UidSesionCookie !== undefined && n38UidSesionCookie !== null && n38UidSesionCookie !== '') {\n        jQuery.extend(true, urlParams, {\n          n38UidSesion: n38UidSesionCookie\n        });\n      }\n\n      if (n38DominioUidCookie !== undefined && n38DominioUidCookie !== null && n38DominioUidCookie !== '') {\n        jQuery.extend(true, urlParams, {\n          n38DominioUid: n38DominioUidCookie\n        });\n      }\n\n      if (!jQuery.isEmptyObject(urlParams)) {\n        settings.url += '?' + settings.xlnetsAuthParam + '=' + jQuery.rup_utils.base64.encode(jQuery.param(urlParams));\n      }\n    },\n    _editOnlineIE: function _editOnlineIE(settings) {\n      var obj; // Gestión para Internet Explorer\n\n      try {\n        // Microsoft Office 2007 y superiores\n        obj = new ActiveXObject('SharePoint.OpenDocuments.3');\n        obj.EditDocument(encodeURI(settings.url));\n      } catch (e) {\n        try {\n          // Microsoft Office 2003 e inferiores\n          obj = new ActiveXObject('Word.Application');\n          obj.Visible = true;\n          obj.Documents.Open(encodeURI(settings.url));\n        } catch (e) {\n          if (settings.downloadOnError === true) {\n            // No se puede editar en línea, se descarga el archivo\n            window.open(encodeURI(settings.alternateDownloadURL), '_blank');\n          }\n\n          if (typeof settings.fncErrorOnEditOnline === \"function\") {\n            settings.fncErrorOnEditOnline.bind(settings);\n          }\n        }\n      }\n    },\n    _editOnlineFF: function _editOnlineFF(settings) {\n      var hownowPlugin, version; // Gestión para Firefox y Chrome\n\n      try {\n        // Microsoft Office 2007 y superiores\n        hownowPlugin = document.getElementById('winFirefoxPlugin');\n        version = hownowPlugin.GetOfficeVersion();\n        hownowPlugin.EditDocument(settings.url, version);\n      } catch (e) {\n        if (settings.downloadOnError === true) {\n          // No se puede editar en línea, se descarga el archivo\n          window.open(encodeURI(settings.alternateDownloadURL), '_blank');\n        }\n\n        if (typeof settings.fncErrorOnEditOnline === \"function\") {\n          settings.fncErrorOnEditOnline.bind(settings);\n        }\n      }\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  $.rup_dav.defaults = {\n    xlnetsAuth: false,\n    xlnetsAuthParam: 'c',\n    downloadOnError: false,\n    alternateDownloadURL: null,\n    fncErrorOnEditOnline: null\n  };\n})(jQuery);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.dav.js?");

/***/ }),

/***/ "./src/rup.dialog.js":
/*!***************************!*\
  !*** ./src/rup.dialog.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n///* Evento del evento de antes de la carga de los datos */\n//\t\tvar loadBeforeSendUserEvent = settings.loadBeforeSend;\n//\t\tsettings.loadBeforeSend = function(xhr){\n//\t\t\tif(loadBeforeSendUserEvent !== null){\n//\t\t        if(loadBeforeSendUserEvent(xhr) === false){\n//\t\t            return false;\n//\t\t        }\n//\t\t    }\n//\t\t\t//console.log(\"loadBeforeSend\");\n//\t\t\t//Comportamiento por defecto del evento\n//\t\t\tloadBeforeSend_default(xhr);\n//\t\t};\n\n/**\r\n * Permite lanzar un subproceso o un mensaje de confirmación dentro de un proceso principal sin salirse de este. <br/><br/>Es una evolución del patrón mensaje.\r\n *\r\n * @summary Componente RUP Dialog.\r\n * @module rup_dialog\r\n * @see El componente está basado en el plugin {@link https://jqueryui.com/dialog/|jQuery UI Dialog}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://api.jqueryui.com/dialog/|aquí}.\r\n * @example\r\n * var properties = {\r\n *   type: $.rup.dialog.TEXT,\r\n *   autoOpen: true,\r\n *   modal: true,\r\n *   resizable: true,\r\n *   title: \"Título del dialog (text) \",\r\n *   message: \"Se esta creando un div con el mensaje puesto por parametro.\"\r\n * };\r\n *\r\n * $(\"#selector\").rup_dialog(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! block-ui */ \"./node_modules/block-ui/jquery.blockUI.js\"), __webpack_require__(/*! ./rup.message */ \"./src/rup.message.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //*********************************************\n  // ESPECIFICACÍON DE LOS TIPOS BASE DEL PATRÓN\n  //*********************************************\n  $.extend($.rup, {\n    /**\r\n     * Dialogo creado a partir de un diálogo existente.\r\n     * @typedef {string} module:rup_dialog~DIV\r\n     * @example\r\n     * $.rup.dialog.DIV\r\n     *\r\n     */\n\n    /**\r\n     *  Dialogo creado a partir de un texto.\r\n     * @typedef {string} module:rup_dialog~TEXT\r\n     * @example\r\n     * $.rup.dialog.TEXT\r\n     */\n\n    /**\r\n     *  Dialogo creado a partir de la respuesta de una petición AJAX.\r\n     * @typedef {string} module:rup_dialog~AJAX\r\n     * @example\r\n     * $.rup.dialog.AJAX\r\n     */\n\n    /**\r\n     *   Dialogo creado a partir del contenido de un enlace estático.\r\n     * @typedef {string} module:rup_dialog~LINK\r\n     * @example\r\n     * $.rup.dialog.LINK\r\n     */\n    dialog: {\n      DIV: 'dialogDIV',\n      TEXT: 'textDialog',\n      AJAX: 'ajaxDialog',\n      LINK: 'linkButton'\n    }\n  }); //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n\n  var rup_dialog = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_dialog', rup_dialog));\n  $.widget('ui.dialog', $.ui.dialog, {\n    _title: function _title(title) {\n      if (this.options.title) {\n        title.html(this.options.title);\n      } else {\n        title.html('&#160;');\n      }\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  $.fn.rup_dialog('extend', {\n    /**\r\n     * Abre el diálogo y estable el foco en el primer botón.\r\n     *\r\n     * @function  open\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"open\");\r\n     */\n    open: function open() {\n      //abre el dialogo y estable el foco en el primer botón.\n      if ($(this).hasClass('disabled')) {\n        return undefined;\n      }\n\n      var settings = $.extend({}, $(this).dialog('option')),\n          $overlayEl; //Guardar el elemento que tenía el foco antes de abrir el diálogo\n\n      $(this).data('focus', $(document.activeElement));\n      var docHeight = $(document).height(),\n          docWidth = $(document).width();\n\n      if ($(this).dialog('option', 'ajaxCache') === false) {\n        settings.id = $(this).attr('id');\n        settings.autoOpen = true;\n\n        settings.complete = function () {\n          $(this).trigger('rupDialog_open');\n        };\n\n        this._ajaxLoad(settings);\n      } else {\n        $(this).dialog('open');\n        $(this).trigger('rupDialog_open');\n      } //Ajuste para portales\n\n\n      if ($.rup_utils.aplicatioInPortal()) {\n        if ($(this).data('uiDialog').overlay !== null) {\n          $overlayEl = $(this).data('uiDialog').overlay;\n          $('.r01gContainer').append($overlayEl);\n          $overlayEl.css('height', docHeight).css('width', docWidth);\n        }\n\n        if (settings.position === undefined || settings.position === null) {\n          $(this).data('uiDialog').uiDialog.css('position', 'absolute').css('top', docHeight / 2 - $('div[aria-describedby=' + this[0].id + ']').height() / 2);\n        }\n      }\n\n      $('div.ui-dialog-buttonpane button').last().trigger('focus');\n    },\n\n    /**\r\n     * Borra el dialogo si este estubiera oculto o visible.\r\n     *\r\n     * @function  destroy\r\n     *\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      $(this).dialog('destroy');\n    },\n\n    /**\r\n     * Función que deshabilita el dialogo sobre el que se aplica.\r\n     *\r\n     * @function  disable\r\n     *\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"disable\");\r\n     */\n    disable: function disable() {\n      if (!$(this).hasClass('disabled')) {\n        $(this).addClass('disabled');\n      } // $(this).dialog('disable');\n\n    },\n\n    /**\r\n     * Funcion que, en caso de estar desahibilitado, habilita el dialogo sobre el que se aplica.\r\n     *\r\n     * @function  enable\r\n     *\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"enable\");\r\n     */\n    enable: function enable() {\n      if ($(this).hasClass('disabled')) {\n        $(this).removeClass('disabled');\n      }\n    },\n    widget: function widget() {\n      return $(this).dialog('widget');\n    },\n\n    /**\r\n     * Funcion encargada de poner por encima de todos los dialogos al dialogo sobre el que se aplica. Puede ser muy util se se tiene mas de un dialog abierto a la vez.\r\n     *\r\n     * @function  moveToTop\r\n     *\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"moveToTop\");\r\n     */\n    moveToTop: function moveToTop() {\n      if ($(this).hasClass('disabled')) {\n        return undefined;\n      }\n\n      $(this).dialog('moveToTop');\n    },\n\n    /**\r\n     * Cierra el dialogo.\r\n     *\r\n     * @function  close\r\n     *\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"close\");\r\n     */\n    close: function close() {\n      //Cierra el dialogo.\n      if ($(this).hasClass('disabled')) {\n        return undefined;\n      }\n\n      var toClose = $(this).triggerHandler('onBeforeClose');\n\n      if (toClose !== false) {\n        $(this).dialog('close');\n      }\n    },\n\n    /**\r\n     * Función que devuelve si el dialogo esta abierto o no.\r\n     *\r\n     * @function   isOpen\r\n     * @returns {boolean} - Determina si el diálogo está abierto o no.\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"isOpen\");\r\n     */\n    isOpen: function isOpen() {\n      //Función que devuelve si el dialogo esta abierto.\n      return $(this).dialog('isOpen');\n    },\n\n    /**\r\n     * Obtiene la propiedad que recibe como parametro.\r\n     *\r\n     * @function  getOption\r\n     * @param {string} opt - Nombre de la propiedad.\r\n     * @returns {Object} - Valor de la propiedad especificada.\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"getOption\",\"width\");\r\n     */\n    getOption: function getOption(opt) {\n      //Obtiene la propiedad que recibe como parametro.\n      return $(this).dialog('option', opt);\n    },\n\n    /**\r\n     * Establece la propiedad que recibe como parametro.\r\n     *\r\n     * @function  setOption\r\n     * @param {string} opt - Nombre de la propiedad.\r\n     * @param {object} value - Valor de la propiedad a establecer.\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"setOption\",\"width\", 200);\r\n     */\n    setOption: function setOption(opt, value) {\n      //Establece la propiedad que recibe como parametro.\n      if (opt === 'buttons') {\n        //si establecemos los botones tenemos que tener encuenta lo de los links\n        var btnsLength = value.length,\n            linkButtons = [],\n            linkButtonsLength; //tamaño inicial de los botones sean o no enlaces\n\n        if (btnsLength > 1) {\n          //si tenemos mas de un boton buscamos cual es el link\n          for (var i = 0; i < value.length; i++) {\n            //se usa el length y no una variable porque se eliminan botones y el tamaño varia\n            if (value[i].btnType === $.rup.dialog.LINK) {\n              linkButtons.push(value.splice(i, 1));\n            }\n          }\n        }\n\n        linkButtonsLength = linkButtons.length; // Si tiene mas de dos botones y ninguno de ellos es de tipo link, entonces se mostrara una alerta diciendo que no cumple la arista.\n\n        if (btnsLength > 1 && linkButtonsLength === 0\n        /*&& settings.rupCheckStyle*/\n        ) {\n          $.rup_messages('msgAlert', {\n            message: $.rup.i18nParse($.rup.i18n, 'base.rup_global.rupCheckStyleError')\n          });\n          return false;\n        }\n\n        $(this).dialog('option', opt, value);\n\n        if (linkButtonsLength > 0) {\n          //si tenemos enlaces los añadimos\n          for (var _i = 0; _i < linkButtonsLength; _i++) {\n            this.createBtnLinks(linkButtons[_i][0], this[0].id);\n          }\n        }\n        /* Se aplican las clases definidas en el adapter excepto a los botones definidos como enlaces \r\n        (la excepcion solo es valida para los enlaces si no usan las clases 'ui-button ui-corner-all ui-widget') */\n\n\n        if (btnsLength > 0) {\n          $('#' + this[0].id).closest('div.rup-dialog').find('button.ui-button.ui-corner-all.ui-widget:not(.ui-datepicker-trigger)').addClass($.rup.adapter[$.fn.rup_dialog.defaults.adapter].classComponent()).removeClass('ui-button ui-corner-all ui-widget');\n        }\n\n        return;\n      } else {\n        if (value !== undefined) {\n          $(this).dialog('option', opt, value);\n        } else {\n          $(this).dialog('option', opt);\n        }\n      }\n    },\n\n    /**\r\n     * Función que crea los botones y se los añade al panel de botones al final de los botones.\r\n     *\r\n     * @function  createBtnLinks\r\n     * @param {object} btn - Objeto de definición del botón.\r\n     * @param {object} id - Identificador del diálogo.\r\n     * @example\r\n     * $(\"#selector\").rup_dialog(\"createBtnLinks\", btnObj, \"idDialog\");\r\n     */\n    createBtnLinks: function createBtnLinks(btn, id) {\n      if ($(this).hasClass('disabled')) {\n        return undefined;\n      }\n      /**\r\n       * Función que crea los botones y se los añade al panel de botones al final de los botones\r\n       */\n\n\n      var buttonHREF = $('<button></button>').attr('type', 'button').attr('id', 'rup_dialog' + btn.text).addClass($.rup.adapter[$.fn.rup_dialog.defaults.adapter].classComponent()).html(btn.text).click(btn.click);\n      $('div[aria-describedby=' + id + '] .ui-dialog-buttonset ').prepend(buttonHREF);\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  $.fn.rup_dialog('extend', {\n    /**\r\n     * Método de inicialización del componente\r\n     *\r\n     * @function  _init\r\n     * @private\r\n     */\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError' + $(this).attr('id')));\n      } else {\n        //Se recogen y cruzan las paremetrizaciones del objeto\n        var settings = $.extend({}, $.fn.rup_dialog.defaults, args[0]),\n            dialog = this,\n            msgDiv; //Sobrecargar close para recuperar foco en elemento que ha lanzado el diálogo\n\n        settings._close = settings.close;\n\n        settings.close = function (event, ui) {\n          if ($(this).data('focus') !== undefined) {\n            $(this).data('focus').focus();\n          }\n\n          if (settings._close !== undefined) {\n            settings._close(event, ui);\n          }\n        }; //Añadimos el callback onBeforeClose\n\n\n        if (settings.onBeforeClose && typeof settings.onBeforeClose === 'function') {\n          $(this).on('onBeforeClose', function () {\n            return settings.onBeforeClose();\n          });\n        } //Se verifica que el selector solo contenga un diálogo\n\n\n        if (settings.type !== null && $(this).length > 0) {\n          $.each($(this), function () {\n            var $self = $(this);\n\n            if ($self.attr('id') !== undefined) {\n              settings.id = $self.attr('id');\n            } else {\n              settings.id = 'rup_' + settings.type + 'DIV';\n              msgDiv = $('<div></div>').attr('id', settings.id);\n              msgDiv.appendTo('body');\n            }\n\n            var autopen = false,\n                linkButtons = [],\n                btnsLength,\n                linkButtonsLength = 0,\n                i,\n                j,\n                created = false,\n                codeEventCreate; //Se determina la ubicación del dialogo físicamente (dentro de la pagina html). Por defecto se ubica en el body de la página pero puede determinarse una ubicación específica.\n            //En caso de encontrarnos en portales (Ejie), y no determinar una ubicación específica, se ubica dentro de los rangos apropiados.\n\n            if ($('div[aria-describedby=' + settings.id + ']').length > 0) {\n              //comprobamos que no se haya ya creado el dialog sobre ese div para evitar problemas de sobreescritura de propiedades, como el tiulo...\n              created = true;\n            } else {\n              if ($('body #' + settings.id).not('.ui-dialog-content').length > 1) {\n                $($('body #' + settings.id).not('.ui-dialog-content')[1]).remove();\n              }\n\n              if (settings.specificLocation !== '') {\n                codeEventCreate = function codeEventCreate() {\n                  $self.parent('.ui-dialog').insertAfter($('#' + settings.specificLocation));\n                };\n              } else if ($.rup_utils.aplicatioInPortal()) {\n                //Ajuste para portales\n                codeEventCreate = function codeEventCreate() {\n                  $('.r01gContainer').append($('.ui-dialog'));\n                };\n              }\n            } //Evento de create (respetando las opciones de los usuarios)\n\n\n            if (codeEventCreate !== undefined) {\n              /* Gestion del evento create */\n              var createUserEvent = settings.create;\n\n              settings.create = function (event, ui) {\n                if (createUserEvent !== undefined && createUserEvent !== null) {\n                  if (createUserEvent.call(event, ui) === false) {\n                    return false;\n                  }\n                } //Comportamiento por defecto del evento\n\n\n                codeEventCreate(event, ui);\n              };\n            }\n\n            switch (settings.type) {\n              case $.rup.dialog.DIV:\n                //si el dialog es de tipo DIV se utilizara el div creado por el desarrollador para crear el ui dialog\n                if (settings.clone !== undefined) {\n                  $self.clone(true).attr('id', settings.clone).insertAfter($self);\n                  settings.id = settings.clone;\n                }\n\n                break;\n\n              case $.rup.dialog.TEXT:\n                $self.html(settings.message);\n                break;\n\n              case $.rup.dialog.AJAX:\n                dialog._ajaxLoad(settings);\n\n                break;\n            } //Para que no se abra hasta que terminemos con todas nuestra acciones\n\n\n            if (settings.autoOpen === true) {\n              autopen = true;\n              settings.autoOpen = false;\n            } //controlar que existan los botones\n\n\n            if (settings.buttons && settings.buttons !== null) {\n              btnsLength = settings.buttons.length; //tamaño incial de los botones se o no enlaces\n\n              if (btnsLength > 1) {\n                //si tenemos mas de un boton buscamos cual es el link\n                for (i = 0; i < settings.buttons.length; i++) {\n                  //se usa el length y no una variable porque se eliminan botones y el tamaño varia\n                  if (settings.buttons[i].btnType === $.rup.dialog.LINK) {\n                    linkButtons.push(settings.buttons.splice(i, 1));\n                    i--;\n                  }\n                }\n\n                i = null;\n              }\n\n              linkButtonsLength = linkButtons.length; //Si tiene mas de dos botones y ninguno de ellos es de tipo link, entonces le mostrar una alerta diciendo que no cumple arista.\n\n              if (btnsLength > 1 && linkButtonsLength === 0 && settings.rupCheckStyle) {\n                $.rup_messages('msgAlert', {\n                  message: $.rup.i18nParse($.rup.i18n.base, 'rup_global.rupCheckStyleError')\n                });\n                settings.stack = false;\n                settings.modal = false;\n                settings.zIndex = 9999;\n              }\n            }\n\n            if (!created) {\n              //si ha sido creado no hace falta volver a añadir el enlace de cierre\n              $self.dialog(settings); // Estilos RUP\n\n              $self.data('uiDialog').uiDialog.addClass('rup-dialog'); // Se setea el valor del maxWidth definido en caso de haber sido configurado.\n\n              if (settings.maxWidth != undefined && settings.maxWidth != false && settings.maxWidth != \"\") {\n                // Si tiene porcentaje\n                if ((typeof settings.maxWidth === 'string' || settings.maxWidth instanceof String) && settings.maxWidth.includes('%')) {\n                  $self.parent().css('max-width', '' + settings.maxWidth + '');\n                } else {\n                  $self.parent().css('max-width', '' + settings.maxWidth + 'px');\n                }\n              }\n\n              if ($.fn.rup_dialog.defaults.adapter === 'dialog_material') {\n                $self.data('uiDialog').uiDialogTitlebar.addClass($.rup.adapter[$.fn.rup_dialog.defaults.adapter].titlebarColor());\n              } //Se comprueba que no existe el aspa.\n\n\n              if ($('#' + settings.id + '_close').length === 0) {\n                $self.prev('div').append('<a class=\"float-right text-white\" href=\"#0\"><i id=\"' + settings.id + '_close\" class=\"mdi mdi-close\" aria-hidden=\"true\"></i></a>').on('click', 'a', function () {\n                  $self.dialog('close');\n                  return false;\n                });\n              }\n\n              if (linkButtonsLength > 0) {\n                //si tenemos enlaces los añadimos\n                for (j = 0; j < linkButtonsLength; j++) {\n                  $(this).rup_dialog('createBtnLinks', linkButtons[j][0], settings.id);\n                }\n\n                j = null;\n              }\n            } else {\n              //borramos todos los posibles enlances que se hayan creado para esa capa\n              $('div[aria-describedby=' + settings.id + '] .ui-dialog-buttonset a').remove();\n\n              if (settings.title) {\n                $('div[aria-describedby=' + settings.id + '] .ui-dialog-title').text(settings.title);\n              }\n            } // Limpieza del componente y añadidas clases restantes de los botones\n\n\n            $self.data('uiDialog').uiDialog.find('button.ui-dialog-titlebar-close').remove();\n            $self.data('uiDialog').uiDialog.find('button:not(.ui-datepicker-trigger)').addClass($.rup.adapter[$.fn.rup_dialog.defaults.adapter].classComponent()).removeClass('ui-button ui-corner-all ui-widget');\n\n            if (autopen) {\n              //si se auto abría lo mostramos\n              if (settings.type !== $.rup.dialog.AJAX) {\n                $self.rup_dialog('open'); //le establecemos el foco\n\n                $('div[aria-describedby=' + settings.id + '] .ui-dialog-buttonpane button').last().focus();\n              } else {\n                settings.autoOpen = true;\n              }\n            }\n          });\n        } else {\n          if ($(this).length === 0) {\n            $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.selectorError'));\n          } else {\n            $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.dialogTypeError'));\n          }\n        } //Se audita el componente\n\n\n        $.rup.auditComponent('rup_dialog', 'init');\n      }\n    },\n\n    /**\r\n     * Realiza la carga del contenido del diálogo a partir de una petición AJAX.\r\n     *\r\n     * @function  _ajaxLoad\r\n     * @private\r\n     * @param {object} settings - Propiedades de configuración del componente.\r\n     */\n    _ajaxLoad: function _ajaxLoad(settings) {\n      //Si el tipo de dialogo es AJAX y no se establece url se muestra un error y se devuelve el control\n      if (!settings.url || settings.url === null || settings.url === '') {\n        $.rup_messages('msgAlert', {\n          title: $.rup.i18nParse($.rup.i18n.base, 'rup_global.error'),\n          message: $.rup.i18nParse($.rup.i18n.base, 'rup_dialog.noURL')\n        });\n        return false;\n      }\n\n      if (settings.showLoading && settings.autoOpen === true) {\n        //si hay que mostrar la capa de cargando por defecto a false\n        $.blockUI({\n          message: '<img src=\"' + $.rup.RUP + '/css/images/rup.ajaxLoader.gif\" style=\"position:absolute;top:12px;left:15px;\" alt=\"' + $.rup.i18nParse($.rup.i18n.base, 'rup_blockUI.cargando') + '\" ><h1 class=\"loading\">' + $.rup.i18nParse($.rup.i18n.base, 'rup_blockUI.cargando') + '...' + '</h1>'\n        });\n      } //Especificación de las opciones asociadas a las llamada Ajax que carga el diálogo\n\n\n      var ajaxOptions = $.extend({}, settings.ajaxOptions);\n\n      ajaxOptions.success = function (data, textStatus, XMLHttpRequest) {\n        if (data !== '' || data !== null) {\n          //si nos devuelve datos los mostramos como HTML y desbloqueamos el ui\n          $('#' + settings.id).html(data);\n          $.unblockUI();\n\n          if (settings.autoOpen === true) {\n            $('#' + settings.id).rup_dialog('open'); //le establecemos el foco\n\n            $('div[aria-describedby=' + settings.id + '] .ui-dialog-buttonpane button').last().focus();\n          }\n        }\n\n        if (settings.ajaxOptions && settings.ajaxOptions.success !== undefined && settings.ajaxOptions.success !== null && typeof settings.ajaxOptions.success === 'function') {\n          settings.ajaxOptions.success(data, textStatus, XMLHttpRequest);\n        }\n      };\n\n      ajaxOptions.error = function (XMLHttpRequest, textStatus, errorThrown) {\n        //en caso de error mostramos un mensaje de alerta\n        $.unblockUI();\n\n        if (settings.ajaxOptions && settings.ajaxOptions.error !== undefined && settings.ajaxOptions.error !== null && typeof settings.ajaxOptions.error === 'function') {\n          settings.ajaxOptions.error(XMLHttpRequest, textStatus, errorThrown);\n        } else {\n          $.rup_messages('msgAlert', {\n            message: $.rup.i18nParse($.rup.i18n.base, 'rup_dialog.errorLoadingData')\n          });\n        }\n      };\n\n      ajaxOptions.url = $.rup_utils.setNoPortalParam(settings.url);\n      ajaxOptions.type = 'GET';\n      ajaxOptions.cache = false;\n      ajaxOptions.dataType = 'text'; //Peticion ajax para obtener los datos a mostrar\n\n      $.rup_ajax(ajaxOptions);\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  /**\r\n   * Propiedades de configuración de la petición Ajax.\r\n   *\r\n   * @typedef {object} ajaxOptions\r\n   * @see {@link http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings|jQuery Ajax Settings}\r\n   */\n\n  /**\r\n   * Evento que se lanza cuando se abre el diálogo.\r\n   *\r\n   * @see {@link http://api.jqueryui.com/dialog/#event-open jQueryUI Dialog}\r\n   * @callback onOpen\r\n   * @param {Event} event - Fecha seleccionada\r\n   * @param {object} ui - Objeto de jQueryUI correspondiente a la interfaz del diálogo.\r\n   * @example\r\n   * $(\"#idDialog\").rup_dialog({\r\n   *  open: function(event, ui) { ... }\r\n   * });\r\n   */\n\n  /**\r\n   * Evento que se lanza a la hora de cerrar el diálogo.\r\n   *\r\n   * @see {@link http://api.jqueryui.com/dialog/#event-open jQueryUI Dialog}\r\n   * @callback jQuery.rup_dialog~onClose\r\n   * @param {Event} event - Fecha seleccionada\r\n   * @param {object} ui - Objeto de jQueryUI correspondiente a la interfaz del diálogo.\r\n   * @example\r\n   * $(\"#idDialog\").rup_dialog({\r\n   *  close: function(event, ui) { ... }\r\n   * });\r\n   */\n\n  /**\r\n   * Evento que se lanza justo antes de que se cierre el dialogo, si este evento devuelve false se anulará las acción de cierre y el dialogo seguirá abierto\r\n   *\r\n   * @see {@link http://api.jqueryui.com/dialog/#event-beforeClose jQueryUI Dialog}\r\n   * @callback onBeforeClose\r\n   * @param {Event} event - Fecha seleccionada\r\n   * @param {object} ui - Objeto de jQueryUI correspondiente a la interfaz del diálogo.\r\n   * @return {boolean} - Si devuelve false se anulará las acción de cierre y el dialogo seguirá abierto.\r\n   * @example\r\n   * $(\"#idDialog\").rup_dialog({\r\n   *  onBeforeClose: function(event, ui) { ... }\r\n   * });\r\n   */\n\n  /**\r\n   * Opciones por defecto de configuración del componente.\r\n   * @name defaults\r\n   *\r\n   * @property {string} [url] - Url de donde se obtendrá el contenido del diálogo.\r\n   * @property {boolean} [rupCheckStyle=true] Propiedad definida por el componentes base, si está a true se mostraran los mensajes específicos del componente base marcados por la guía de estilos, es decir, que si el desarrollador no cumple con la guisa de estilos o desarrollo el objeto base mostrará los mensajes advirtiendo su incumplimiento, si se pone a false no se mostraran. Esta acción queda bajo la responsabilidad de la aplicación, ya que esta propiedad no debería modificarse.\r\n   * @property {module:rup_dialog~DIV | module:rup_dialog~TEXT | module:rup_dialog~AJAX |module:rup_dialog~LINK } type - Propiedad que establece el tipo de diálogo a mostrar.\r\n   * @property {jQuery.rup_dialog~ajaxOptions} ajaxOptions - Establece las todas las propiedades para configurar la petición ajax.\r\n   * @property {boolean} [showLoading=true] - Esta propiedad mostrará una capa de cargando datos en los diálogos de tipo Ajax durante la carga del mismo.\r\n   * @property {boolean} [disabled=false] - Propiedad que deshabilita o no el diálogo.\r\n   * @property {boolean} [autoOpen=true] - Si esta propiedad esta a true el diálogo se abrirá automáticamente cuando se cree, en el caso de que su valor sea false, el diálogo se mantendrá oculto hasta que se invoque a la función “open” (.rup_dialog(“open”)).\r\n   * @property {Object} [buttons] - Define los botones (literales y funciones a las que invocan) que contendrá el diálogo. La propiedad sería de tipo Array. Donde cada elemento del array debe ser un objeto que define las propiedades de cada botón y el tipo del mismo.\r\n   * @property {boolean} [closeOnEscape=true] - Especifica si se debe cerrar el diálogo cuando el tenga el foco y el usuario pulse la tecla ESC.\r\n   * @property {string} dialogClass - Propiedad que establece el/los estilos que se añadirán al dialogo para dotar al dialogo de estilos diferentes.\r\n   * @property {boolean} [draggable=true] - Si su valor es true el diáologo sera dragable pinchando sobre el título.\r\n   * @property {string | number} [height=auto] - Establece el alto del diálogo en pixeles.\r\n   * @property {string} [hide=null] - Efecto utilizado cuando se cierra el diálogo.\r\n   * @property {boolean | number} [maxHeight=false] - Alto máximo en pixeles al que se puede llegar a redimensionar el diálogo.\r\n   * @property {boolean | number | percentage} [maxWidth=false] - Ancho máximo en pixeles o en porcentaje al que se puede llegar a redimensionar el diálogo.\r\n   * @property {boolean | number} [minHeight=100] - Alto mínimo en pixeles al que se puede llegar a redimensionar el diálogo.\r\n   * @property {boolean | number} [minWidth=150] - Ancho mínimo en pixeles al que se puede llegar a redimensionar el diálogo.\r\n   * @property {boolean} [modal=false] - Si se establece esta propiedad a true el diálogo se abrirá de forma modal, por encima del resto de elementos.\r\n   * @property {string | string[] | number[]} position - Esta propiedad especifica donde debe mostrarse el diálogo. Sus posibles valores son: Un simple String representando la posición. 'center', 'left', 'right', 'top', 'bottom'. Un array con las coordenadas x, y en pixles (e. [350,100]). Un array con string que representan la posición (e. ['right','top']).\r\n   * @property {boolean} [resizable=true] - Si se establece esta propiedad a true el diálogo se redimensionable.\r\n   * @property {string} [show] - Efecto a realizar cuando se abre el diálogo.\r\n   * @property {string} [title] - Establece el título de la ventana. Puede ser cualquier html válido.\r\n   * @property {number} [width=300] - Establece el ancho del diálogo en pixeles.\r\n   * @property {jQuery.rup_dialog~onOpen} open - Evento que se lanza cuando se abre el diálogo.\r\n   * @property {jQuery.rup_dialog~onClose} close - Evento que se lanza a la hora de cerrar el diálogo.\r\n   * @property {jQuery.rup_dialog~onBeforeClose} beforeClose - Evento que se lanza justo antes de que se cierre el dialogo, si este evento devuelve false se anulará las acción de cierre y el dialogo seguirá abierto.\r\n   * @property {string} adapter - Permite cambiar el aspecto visual del componente.\r\n   */\n\n  $.fn.rup_dialog.defaults = {\n    rupCheckStyle: true,\n    type: null,\n    url: null,\n    minHeight: 100,\n    maxWidth: false,\n    ajaxCache: true,\n    specificLocation: '',\n    clone: undefined,\n    adapter: 'dialog_material'\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup.dialog.js?");

/***/ }),

/***/ "./src/rup.feedback.js":
/*!*****************************!*\
  !*** ./src/rup.feedback.js ***!
  \*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Se informa al usuario de cómo interactuar con los elementos de la aplicación y del resultado de cualquier acción que realice o cualquier problema que tenga y de cómo solucionarlo.\r\n *\r\n * @summary Componente RUP Feedback.\r\n * @module rup_feedback\r\n * @example\r\n * var properties = {\r\n *   type: \"ok\",\r\n *   delay: 500,\r\n *   fadeSpeed: 600,\r\n *   gotoTop: false,\r\n *   block: false,\r\n *   closeLink: true\r\n * };\r\n * $(\"#id_capa\").rup_feedback (properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./rup.tooltip */ \"./src/rup.tooltip.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.widget('$.rup_feedback', {\n    /**\r\n     * @description Opciones por defecto de configuración del widget.\r\n     * @name options\r\n     *\r\n     * @property {string}  [type=null] - Tipo de feedback a mostrar [ok, alert, error].\r\n     * @property {string}  [message]  -  Mensaje que se mostrará en el feedback. Si no se define simplemente se creará el objeto donde se mostrarán los mensajes\r\n     * @property {Number}  [imgClass=null] - Clase que determina el estilo que se va a aplicar en el icono del feedback.\r\n     * @property {Number}  [delay=null] - Espera (ms) que va a aplicarse antes de ocultar el feedback.\r\n     * @property {Number}  [fadeSpeed=null] - Tiempo (ms) que va a durar la animación de ocultación del feedback.\r\n     * @property {boolean} [gotoTop=true] - Drmina si cuando se muestre el feedback se debe desplazar la\r\n     * @property {boolean} [customGoTo=null] - Drmina si cuando se muestre el feedback donde se debe desplazar la página.\r\n     * @property {boolean}  [block=true] - Indica si la capa que contendrá el mensaje de feedback debe tener o\r\n    no un espacio fijo en la pantalla.\r\n     * @property {closeLink}  [closeLink=true] - Indica si la capa de feedback tendrá un enlace para que el usuario\r\n    de la aplicación pueda cerrar la capa manualmente.\r\n     */\n    options: {\n      type: null,\n      //[ok, alert, error]\n      imgClass: null,\n      delay: null,\n      fadeSpeed: null,\n      gotoTop: true,\n      block: true,\n      closeLink: true,\n      //uso privado\n      _idFeedback: null,\n      _divClose: null,\n      customGoTo: null\n    },\n\n    /**\r\n    * @function\t_setOption\r\n    * @private\r\n    * @description Modifica las opciones de configuración del componente.\r\n    */\n    _setOption: function _setOption(key, value) {\n      var opciones = this.options,\n          element = this.element;\n\n      switch (key) {\n        case 'type':\n          //Eliminar imagenes anteriores y poner el tipo indicado\n          if (value !== null) {\n            element.removeClass(opciones.imgClass + ' rup-feedback_image_' + opciones.type);\n            element.addClass('rup-feedback_image rup-feedback_image_' + value);\n          } else {\n            element.removeClass('rup-feedback_image rup-feedback_image_' + opciones.type);\n          }\n\n          break;\n\n        case 'imgClass':\n          //Eliminar imagenes anteriores y poner la personal\n          if (value !== null) {\n            element.removeClass(opciones.imgClass + ' rup-feedback_image rup-feedback_image_' + opciones.type);\n            element.addClass(value);\n          } else {\n            element.removeClass(opciones.imgClass);\n          }\n\n          break;\n\n        case 'closeLink':\n          //Gestionar capa enlace cierre\n          if (value) {\n            this._addCloseLink();\n          } else {\n            $('#' + this.options._idFeedback + '_closeDiv').remove();\n          }\n\n          break;\n      }\n\n      $.Widget.prototype._setOption.apply(this, arguments);\n    },\n\n    /**\r\n    * @function\t_create\r\n    * @private\r\n    * @description Crea en el DOM los elementos que conforman el componente.\r\n    */\n    _create: function _create() {\n      var opciones = this.options;\n      opciones._idFeedback = this.element.addClass($.rup.adapter[$.fn.rup_feedback.defaults.adapter].containerClass()).addClass(opciones.imgClass != null ? opciones.imgClass : opciones.type != null ? 'rup-feedback_image rup-feedback_image_' + opciones.type : '').attr({\n        role: 'alert'\n      }).css('display', opciones.block ? 'block' : 'none').css('visibility', 'hidden').append($.rup.adapter[$.fn.rup_feedback.defaults.adapter].feedbackIcon(opciones.type)).attr('id'); //Crear capa cierre\n\n      opciones._divClose = $('<div></div>').html($.rup.adapter[$.fn.rup_feedback.defaults.adapter].closeIcon()).attr('id', opciones._idFeedback + '_closeDiv').attr('title', $.rup.i18nParse($.rup.i18n.base, 'rup_feedback.closingLiteral')).addClass('rup-feedback_closeLink').addClass($.rup.adapter[$.fn.rup_feedback.defaults.adapter].classComponent()); //Si se define texto sacarlo\n\n      if (opciones.message) {\n        this.set(opciones.message, opciones.type, opciones.imgClass);\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_feedback', 'init');\n    },\n\n    /**\r\n    * @description Añade el enlace de cierre.\r\n    *\r\n    * @function\t_addCloseLink\r\n    * @private\r\n    */\n    _addCloseLink: function _addCloseLink() {\n      var opciones = this.options;\n\n      opciones._divClose.click(function () {\n        $('#' + opciones._idFeedback).rup_feedback('close');\n      });\n\n      this.element.prepend(opciones._divClose);\n    },\n\n    /**\r\n    * Elimina las modificaciones realizadas sobre la capa para convertirla en feedback volviendo a ser una simple capa.\r\n    *\r\n    * @function\tdestroy\r\n    * @example\r\n    * // Elimina el feedback\r\n    * jQuery(\"#feedback\").rup_feedback(\"destroy\");\r\n    */\n    destroy: function destroy() {\n      this.element.removeClass().removeAttr('role').css('cssText', '').html('').stop().animate({\n        opacity: '100'\n      }); //Por si está desapareciendo (hide)\n\n      $.Widget.prototype.destroy.apply(this, arguments);\n    },\n\n    /**\r\n    * Establece el texto (msg) a mostrar en el feedback, que podrá ser tanto texto plano como html. <br/><br/>\r\n    * En caso de sólo definirse el parámetro msg, se mostrará como imagen aquella definida anteriormente ya sea de un tipo por defecto o de una imagen con estilo personalizado (si es que se había definido). <br/><br/>\r\n    * En caso de que se envíe el parámetro type informado de modificará la capa para mostrar la imagen por defecto asociada al tipo, borrando algún posible estilos personalizado establecido anteriormente. <br/><br/>\r\n    * Por último para realizar el cambio a un estilo personalizado se pasará como parámetro type null y como imgClass la clase con el estilo a establecer.\r\n    * @function\tset\r\n    * @param {string} message - Texto del mensaje que se va a mostrar en el feedback.\r\n    * @param {string} type - Identificador del tipo de feedback [ok, alert, error].\r\n    * @param {string} imgClass - Clase que determina el estilo que se va a aplicar en el icono del feedback.\r\n    * @example <caption>Feedback simple:</caption>\r\n    * $(\"#id_capa\").rup_feedback(\"set\",\"Texto a mostrar\");\r\n    * @example <caption>Feedback cambiando a imagen de un tipo por defecto (Ej. error):</caption>\r\n    * $(\"#id_capa\").rup_feedback(\"set\", \"...\", \"error\");\r\n    * @example <caption>Feedback estableciendo un estilo personalizado:</caption>\r\n    * $(\"#id_capa\").rup_feedback(\"set\", \"...\", null, \"imgPropio\");\r\n    */\n    set: function set(message, type, imgClass) {\n      var element = this.element,\n          opciones = this.options; //En caso de que está desapareciendo parar animación\n\n      element.stop().animate({\n        opacity: '100'\n      }); //Gestión 'type'\n\n      if (type != undefined) {\n        element.removeClass(opciones.imgClass); //Si se recibe type xxx se eliminan posibles tipo anterior y se establece ese\n\n        if (opciones.type != null) {\n          element.removeClass('rup-feedback_image_' + opciones.type);\n        } else {\n          element.addClass('rup-feedback_image');\n        }\n\n        type = type.toLowerCase();\n        element.find('i').not('.mdi.mdi-close').eq(0).remove();\n        element.prepend($.rup.adapter[$.fn.rup_feedback.defaults.adapter].feedbackIcon(type));\n        element.addClass('rup-feedback_image_' + type);\n        opciones.type = type;\n      } else if (type === null) {\n        //Si se recibe type 'null' se eliminan posibles tipos anteriores\n        element.removeClass('rup-feedback_image rup-feedback_image_' + opciones.type);\n        opciones.type = null;\n      } //Gestión 'imgClass'\n\n\n      if (imgClass != undefined) {\n        if (opciones.imgClass != null) {\n          element.removeClass(opciones.imgClass);\n        }\n\n        element.addClass(imgClass);\n        opciones.imgClass = imgClass;\n      } //Sacar mensaje\n\n\n      $('#' + opciones._idFeedback + '_content').remove();\n      element.append($('<div></div>').attr('id', opciones._idFeedback + '_content').html(message)); //Añadir cierre (evento y capa)\n\n      if (opciones.closeLink) {\n        this._addCloseLink();\n      }\n\n      this.show();\n      var scrollTop = '0px';\n\n      if (opciones.customGoTo !== null && opciones.customGoTo !== undefined) {\n        if (typeof opciones.customGoTo === \"function\") {\n          scrollTop = opciones.customGoTo();\n        } else {\n          scrollTop = opciones.customGoTo;\n        }\n      } //Ir al inicio\n\n\n      if (opciones.gotoTop) {\n        $('html, body').animate({\n          scrollTop: scrollTop\n        }, 0);\n      } //Ocultacion mensaje\n\n\n      if (opciones.delay != null) {\n        this.hide();\n      }\n\n      $('#' + this.options._idFeedback).trigger('rupFeedback_afterSet');\n    },\n\n    /**\r\n    * Oculta la capa del feedback con una animación. <br/><br/>\r\n    * Si no se definen los parámetros se tomaran los definidos con anterioridad (creación del feedback por ejemplo) o si no los valores por defecto (null, null) que implica una animación sin espera con una “velocidad” de 400 ms.\r\n    *\r\n    * @function\thide\r\n    * @param {Number} [delay] - Espera (ms) que va a aplicarse antes de ocultar el feedback.\r\n    * @param {Number} [fadeSpeed] - Tiempo (ms) que va a durar la animación de ocultación del feedback.\r\n    *\r\n    * @example\r\n    * // Ocultar el feedback.\r\n    * jQuery(\"#feedback\").rup_feedback(\"hide\");\r\n    * @example\r\n    * // Ocultar el feedback. Se realiza con una demora de 1000ms y la transición dura 500ms.\r\n    * jQuery(\"#feedback\").rup_feedback(\"hide\",1000,500);\r\n    */\n    hide: function hide(delay, fadeSpeed) {\n      var opciones = this.options,\n          element = this.element; //Si no se reciben parámetros se toman los valores de la configuración inicial\n\n      if (delay == undefined) {\n        delay = opciones.delay;\n      }\n\n      if (fadeSpeed == undefined) {\n        fadeSpeed = opciones.fadeSpeed;\n      }\n\n      element.delay(delay).fadeOut(eval(fadeSpeed), function () {\n        $('#' + opciones._idFeedback).rup_feedback('close', true);\n      });\n      $('#' + this.options._idFeedback + '_closeDiv').hide();\n    },\n\n    /**\r\n    * Oculta la capa del feedback sin animación alguna.<br/>\r\n    * Esta función será invocada por el enlace de cierre (parámetro closeLink) en caso de que se muestre.\r\n    *\r\n    * @function\tclose\r\n    * @param {boolean} [notEmpty=false] - Determina si se debe ejecutar empty() sobre el feedback.\r\n    *\r\n    * @example\r\n    * // Cierra el feedback.\r\n    * jQuery(\"#feedback\").rup_feedback(\"close\");\r\n    */\n    close: function close(notEmpty) {\n      var element = this.element;\n      element.css('display', this.options.block ? 'block' : 'none');\n      element.css('visibility', 'hidden');\n\n      if (notEmpty === undefined) {\n        element.empty();\n      }\n    },\n\n    /**\r\n    * Muestra la capa del feedback.\r\n    * Esta función será invocada automáticamente cada vez que se invoque la función set(…)\r\n    *\r\n    * @function show\r\n    * @fires module:rup_feedback#rupFeedback_show\r\n    * @example\r\n    * // Muestra el feedback.\r\n    * jQuery(\"#feedback\").rup_feedback(\"show\");\r\n    */\n    show: function show() {\n      var element = this.element;\n      element.css('display', 'block');\n      element.css('visibility', 'visible'); // Se comprueba si ya esta el icono material\n\n      if ($('.mdi', element).length === 0) {\n        element.prepend('<i class=\\'mdi\\'>');\n      } // Se aplica el tooltip\n\n\n      this.element.find('[title]').rup_tooltip({\n        position: {\n          at: 'bottom center',\n          my: 'top center'\n        },\n        applyToPortal: true\n      });\n      $('#' + this.options._idFeedback + '_closeDiv').show();\n      $('#' + this.options._idFeedback).trigger('rupFeedback_show');\n      /**\r\n      * Permite asociar una función que se ejecutará cuando se muestre el feedback.\r\n      * @event module:rup_feedback#rupFeedback_show\r\n      * @example\r\n      * $(\"#feedback\").on(\"rupFeedback_show\", function(event){});\r\n      */\n\n      jQuery(this.element).triggerHandler('rupFeedback_show');\n    } //*******************************************************\n    // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n    //*******************************************************\n\n    /*  $.fn.rup_feedback.defaults = {\r\n    adapter = \"feedback_material\"\r\n    };*/\n\n    /**\r\n    * Permite cambiar las propiedades definidas en el feedback.<br/><br/>\r\n    * Puede invocarase antes que la funcion set(…) para modificar cualquiera de los parámetros del mensaje a mostar: icono, imagen personalizada, tiempo de espera hasta desaparecer…\r\n    *\r\n    * @name jQuery.rup_feedback#option\r\n    * @function\r\n    * @param {Object|string} param1 - Primer parámetro de invocación.<br/>\r\n    * Puede tratarse de un Object que contenga varios parámetros o un string que indica el nombre del parámetro.\r\n    * @param {*} [param2] - Segundo parámetro de invocación.<br/>\r\n    * En caso de que el primer parámetro sea un string este será el valor correspondiente del parámetro identificado con el nombre de param1.\r\n    * @example\r\n    * // Feedback cambio propiedad simple\r\n    * $(\"#id_capa\").rup_feedback(\"option\",\"closeLink\", false);\r\n    * @example\r\n    * //Feedback cambio varias propiedades\r\n    * var properties = {\"closeLink\":false, \"block\":false};\r\n    * $(\"#id_capa\").rup_feedback(\"option\", properties);\r\n    */\n\n  });\n  /*  $.fn.rup_feedback.defaults = {\r\n    adapter = \"feedback_material\"\r\n  };*/\n\n  var rup_feedback = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_feedback', rup_feedback));\n  $.fn.rup_feedback.defaults = {\n    adapter: 'feedback_material'\n  };\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.feedback.js?");

/***/ }),

/***/ "./src/rup.form.js":
/*!*************************!*\
  !*** ./src/rup.form.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function($, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permite al usuario introducir datos en una serie de campos para ser enviados al servidor y ser procesados.\r\n *\r\n * @summary Componente RUP Form.\r\n * @module   rup_form\r\n * @example\r\n * var properties={\r\n *   // Propiedades de configuración\r\n * };\r\n *\r\n * $(\"#formulario\").rup_form(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./core/utils/jquery.form */ \"./src/core/utils/jquery.form.js\"), __webpack_require__(/*! ./core/utils/form2object */ \"./src/core/utils/form2object.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./rup.validate */ \"./src/rup.validate.js\"), __webpack_require__(/*! ./rup.message */ \"./src/rup.message.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (jQuery) {\n  //*********************************************\n  // ESPECIFICACÍON DE LOS TIPOS BASE DEL PATRÓN\n  //*********************************************\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n  var rup_form = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_form', rup_form)); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  $.fn.rup_form('extend', {\n    /**\r\n     * Realiza la misma función que ajaxSubmit. Se mantiene para asegurar la retrocompatibilidad con versiones anteriores.\r\n     *\r\n     * @function  ajaxFormSubmit\r\n     * @param {object} options - Opciones de configuración.\r\n     * @example\r\n     * var options = {};\r\n     * jQuery(\"#form\").rup_form(\"ajaxFormSubmit\", options);\r\n     */\n    ajaxFormSubmit: function ajaxFormSubmit(options) {\n      var $self = this; // Actiavamos la gestión de las peticiones AJAX mediante la función $.rup_ajax.\n\n      $.set_uda_ajax_mode_on();\n      $self.ajaxSubmit(options);\n    },\n\n    /**\r\n     * Realiza el envío del formulario. La configuración de este método es la misma que la de ajaxForm.\r\n     *\r\n     * @function  ajaxSubmit\r\n     * @param {object} argOptions - Opciones de configuración.\r\n     * @example\r\n     * var options = {};\r\n     * jQuery(\"#form\").rup_form(\"ajaxSubmit\", options);\r\n     */\n    ajaxSubmit: function ajaxSubmit(argOptions) {\n      var $self = this,\n          options = $.extend(true, {}, $.fn.rup_form.defaults, argOptions); // Actiavamos la gestión de las peticiones AJAX mediante la función $.rup_ajax.\n\n      $.set_uda_ajax_mode_on();\n      $self.rup_form('configureOptions', options);\n\n      if (options.formValidationRequired) {\n        $self.rup_validate(options.validate);\n\n        if ($self.valid()) {\n          $(this).ajaxSubmit(options);\n        }\n      } else {\n        // Necesario utilizar $(this) para invocar al ajaxSubmit del plugin subyacente\n        $(this).ajaxSubmit(options);\n      }\n    },\n\n    /**\r\n     * Realiza el envío del formulario. La configuración de este método es la misma que la de ajaxForm.\r\n     *\r\n     * @function  ajaxNotSubmit\r\n     * @param {object} argOptions - Opciones de configuración.\r\n     * @example\r\n     * var options = {};\r\n     * jQuery(\"#form\").rup_form(\"ajaxNotSubmit\", options);\r\n     */\n    ajaxNotSubmit: function ajaxNotSubmit(argOptions) {\n      var $self = this,\n          options = $.extend(true, {}, $.fn.rup_form.defaults, argOptions); // Actiavamos la gestión de las peticiones AJAX mediante la función $.rup_ajax.\n\n      $.set_uda_ajax_mode_on();\n      $self.rup_form('configureOptions', options);\n\n      if (options.formValidationRequired) {\n        $self.submit();\n\n        if ($self.valid()) {\n          $(this).ajaxSubmit(options);\n        }\n      } else {\n        // Necesario utilizar $(this) para invocar al ajaxSubmit del plugin subyacente\n        $(this).ajaxSubmit(options);\n      }\n    },\n\n    /**\r\n     * Elimina la configuración realizada por el componente sobre el formulario html.\r\n     *\r\n     * @function  destroy\r\n     * @example\r\n     * var options = {};\r\n     * jQuery(\"#form\").rup_form(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      var $self = this;\n      $self.removeClass('rup_form');\n      $.removeData($self[0]);\n      $self.ajaxFormUnbind();\n      $self.off();\n    },\n\n    /**\r\n     * Serializa el contenido del formulario en un query string.\r\n     *\r\n     * @function  formSerialize\r\n     * @return {string} - Retorna una cadena de texto con el formato nombre1=valor1&nombre2=valor2.\r\n     * @example\r\n     * jQuery(\"#form\").rup_form(\"formSerialize\");\r\n     */\n    formSerialize: function formSerialize() {\n      var $self = this,\n          element,\n          ruptype,\n          fieldArray = [];\n      $.each($self.formToArray(), function (key, obj) {\n        element = $('[name=\\'' + obj.name + '\\']', self);\n        ruptype = element.attr('ruptype');\n\n        if (ruptype !== undefined) {\n          obj.value = element['rup_' + ruptype]('getRupValue');\n          fieldArray.push(obj);\n        } else {\n          fieldArray.push(obj);\n        }\n      });\n      return $.param(fieldArray);\n    },\n\n    /**\r\n     * Realiza la serialización de campos del formulario en un objeto json.\r\n     *\r\n     * @function  formToJson\r\n     * @return {string} - Retorna un objeto con el formato {nombre1:valor1, nombre2:valor2…nombreN:valorN}.\r\n     * @example\r\n     * jQuery(\"#form\").rup_form(\"formToJson\");\r\n     */\n    formToJson: function formToJson() {\n      if (this[0]) {\n        return window.form2object(this[0]);\n      } else {\n        return {};\n      }\n    },\n\n    /**\r\n     * Realiza la serialización de campos del formulario en un query string\r\n     *\r\n     * @function  fieldSerialize\r\n     * @return {string} - Retorna una cadena de texto con el formato nombre1=valor1&nombre2=valor2.\r\n     * @example\r\n     * jQuery(\"#form .specialFields\").rup_form(\"fieldSerialize\");\r\n     */\n    fieldSerialize: function fieldSerialize() {\n      var a = [];\n      this.each(function () {\n        var n = $(this).attr('name');\n\n        if (!n) {\n          return;\n        }\n\n        var v = $(this).rup_form('fieldValue');\n\n        if (v && v.constructor == Array) {\n          for (var i = 0, max = v.length; i < max; i++) {\n            a.push({\n              name: n,\n              value: v[i]\n            });\n          }\n        } else if (v !== null && typeof v != 'undefined') {\n          a.push({\n            name: $(this).attr('name'),\n            value: v\n          });\n        }\n      });\n      return $.param(a);\n    },\n\n    /**\r\n     * Devuelve un array con el valor de los campos indicados.\r\n     *\r\n     * @function  fieldValue\r\n     * @return {string[]} - Retorna una cadena de texto con el formato nombre1=valor1&nombre2=valor2.\r\n     * @example\r\n     * jQuery(\"#form .specialFields\").rup_form(\"fieldValue\");\r\n     */\n    fieldValue: function fieldValue() {\n      var valuesArray = [],\n          value;\n      this.each(function () {\n        var ruptype = $(this).attr('ruptype');\n\n        if (ruptype !== undefined) {\n          value = $(this)['rup_' + ruptype]('getRupValue');\n          valuesArray.push(value);\n        } else {\n          $.merge(valuesArray, $(this).fieldValue());\n        }\n      });\n      return valuesArray;\n    },\n\n    /**\r\n     * Inicializa el formulario con su estado inicial invocando al método reset nativo.\r\n     *\r\n     * @function  resetForm\r\n     * @return {jQuery} - Retorna el propio componente.\r\n     * @example\r\n     * jQuery(\"#form\").rup_form(\"resetForm\");\r\n     */\n    resetForm: function resetForm() {\n      return this.each(function () {\n        $(this).resetForm();\n      });\n    },\n\n    /**\r\n     * Limpia los elementos del formulario.\r\n     *\r\n     * @function  clearForm\r\n     * @param {boolean} includeHidden - Determina si se deben de limpiar también los elementos hidden que existen en el formulario.\r\n     * @return {jQuery} - Retorna el propio componente.\r\n     * @example\r\n     * // Limpiar los campos del formulario\r\n     * jQuery(\"#form\").rup_form(\"clearForm\");\r\n     * // Limpiar los campos del formulario inlcuyendo los campos hidden\r\n     * jQuery(\"#form\").rup_form(\"clearForm\", true);\r\n     */\n    clearForm: function clearForm(includeHidden) {\n      return this.each(function () {\n        $('input,select,textarea', this).rup_form('clearFields', includeHidden);\n      });\n    },\n\n    /**\r\n     * Limpia los campos especificados mediante el selector de jQuery.\r\n     *\r\n     * @function  clearFields\r\n     * @param {boolean} includeHidden - Determina si se deben de limpiar también los elementos hidden que existen en el formulario.\r\n     * @return {jQuery} - Retorna el propio componente.\r\n     * @example\r\n     * // Limpiar los campos del formulario\r\n     * jQuery(\"#form .specialFields\").rup_form(\"clearFields\");\r\n     * // Limpiar los campos del formulario inlcuyendo los campos hidden\r\n     * jQuery(\"#form .specialFields\").rup_form(\"clearFields\", true);\r\n     */\n    clearFields: function clearFields(includeHidden) {\n      return this.each(function () {\n        var ruptype = $(this).attr('ruptype');\n\n        if (ruptype === undefined || ruptype !== 'combo') {\n          $(this).clearFields(includeHidden);\n        } else {\n          $(this).rup_combo('clear');\n        }\n      });\n    },\n\n    /**\r\n     * Función de inicialización del componente. Es un método de uso interno. No debería de invocarse de manera directa.\r\n     *\r\n     * @function  configureOptions\r\n     * @param {object} settings - Propiedades de configuración\r\n     */\n    configureOptions: function configureOptions(settings) {\n      var $self = this,\n          hasFileInputs,\n          beforeSendUserEvent,\n          beforeSubmitUserEvent;\n\n      if (settings.url !== null) {\n        $self.attr('action', settings.url);\n      }\n\n      hasFileInputs = $('input[type=file]:enabled', $self).length > 0;\n\n      if (settings.useJsonIfPossible && !hasFileInputs) {\n        settings.contentType = 'application/json';\n      } else {\n        settings.contentType = 'multipart/form-data';\n      } // BeforeSend\n\n\n      beforeSendUserEvent = settings.beforeSend;\n\n      settings.beforeSend = function (xhr, ajaxOptions) {\n        var ret = true;\n\n        if (typeof beforeSendUserEvent === \"function\") {\n          ret = beforeSendUserEvent.call(this, xhr, ajaxOptions);\n        }\n\n        if (ret === false) {\n          return false;\n        } else if (ret !== 'skip') {\n          if (ajaxOptions.contentType !== false && ajaxOptions.contentType.indexOf('application/json') !== -1) {\n            var jsonData = $self.rup_form('formToJson');\n\n            if (settings.multimodel !== null) {\n              xhr.setRequestHeader('RUP_MULTI_ENTITY', 'true');\n              jsonData.rupEntityMapping = settings.multimodel;\n            }\n\n            if (ajaxOptions.extraData !== undefined && ajaxOptions.extraData !== null) {\n              $.extend(jsonData, ajaxOptions.extraData);\n            }\n\n            ajaxOptions.data = $.toJSON(jsonData);\n          }\n        }\n      }; // BeforeSubmit\n\n\n      beforeSubmitUserEvent = settings.beforeSubmit;\n\n      settings.beforeSubmit = function (arr, $form, options) {\n        var httpMethod, error_user, hasFileInputs;\n\n        if (typeof beforeSubmitUserEvent === \"function\") {\n          if (beforeSubmitUserEvent.call(this, arr, $form, options) === false) {\n            return false;\n          }\n        }\n\n        hasFileInputs = jQuery('input:file', $form).length > 0; // Implementacion para realizar la emulacion de xhr al utilizar iframes\n\n        if (!$.rup.browser.xhrFileUploadSupport && hasFileInputs || options.iframe === true) {\n          // Configuracion necesaria para permitir con iframes el uso de metodos http diferentes a GET o POST\n          httpMethod = settings.type !== undefined ? settings.type : options.type;\n\n          if ($.inArray(httpMethod.toUpperCase(), $.rup.IFRAME_ONLY_SUPPORTED_METHODS) === -1) {\n            options.extraData = $.extend({}, options.extraData, {\n              '_method': httpMethod.toUpperCase()\n            });\n          } //Se valida la presencia de portal y, llegados al caso, se adecuan las llamadas ajax para trabajar con portales\n\n\n          options.url = $.rup_utils.setNoPortalParam(options.url); // Envio del parametro emulate_iframe_http_status para activar la emulacion en el lado servidor\n\n          options.extraData = $.extend({}, options.extraData, {\n            '_emulate_iframe_http_status': 'true'\n          });\n          options.url = options.url + (options.url.match('\\\\?') === null ? '?' : '&') + '_emulate_iframe_http_status=true'; // Callback de error por defecto a ejecutar cuando se produzca un error al utilizar la emulacion\n\n          error_user = options.error;\n\n          options.error = function (xhr, textStatus, errorThrown) {\n            var errorText = $.rup.rupAjaxDefaultError(xhr, textStatus, errorThrown); // Si se ha producido un error de los tratados lo mostramos\n\n            if (error_user != null) {\n              $(error_user(xhr, textStatus, errorThrown));\n            } else {\n              if (errorText) {\n                $.rup.showErrorToUser(errorText);\n              }\n            }\n          };\n        }\n      };\n\n      settings.formValidationRequired = settings.validate !== undefined; // Configuracion de las validaciones\n\n      if (settings.formValidationRequired) {\n        if (settings.error === undefined) {\n          settings.error = function (a) {\n            try {\n              var json = JSON.parse(a.responseText);\n              $self.validate().invalid = json.rupErrorFields;\n              $self.validate().submited = json.rupErrorFields;\n              $self.validate().showErrors(json.rupErrorFields);\n\n              if (json.rupFeedback !== undefined && $self.validate().settings.feedback !== undefined) {\n                $self.validate().settings.feedback.rup_feedback('set', $.rup_utils.printMsg(json.rupFeedback.message), json.rupFeedback.style !== undefined ? json.rupFeedback.style : null);\n              }\n            } catch (ex) {\n              $self.validate().settings.feedback.rup_feedback('set', a.responseText, 'error');\n            }\n          };\n        }\n\n        settings.validate.submitHandler = function (form) {\n          jQuery(form).ajaxSubmit($(form).data('ajaxSettings'));\n        };\n\n        settings.validate.feedback = settings.feedback;\n      }\n\n      $self.data('ajaxSettings', settings);\n      $self.data('settings', settings);\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  $.fn.rup_form('extend', {});\n  $.fn.rup_form('extend', {\n    /**\r\n     * Función de inicialización del componente.\r\n     *\r\n     * @function  _init\r\n     * @private\r\n     * @param {object} args - Propiedades de configuración.\r\n     */\n    _init: function _init(args) {\n      var _this = this;\n\n      global.initRupI18nPromise.then(function () {\n        var $self = _this,\n            settings; // Determinamos si se ha introducido configuracion para el componente validacion.\n        // Settings de configuracion\n\n        settings = $.extend(true, {}, $.fn.rup_form.defaults, args[0]); // Anadimos al formulario el class rup_form para identificarlo como componente formulario.\n\n        $self.addClass('rup_form');\n        $self.attr('ruptype', 'form');\n        $self.rup_form('configureOptions', settings); // En caso de que no sehaya configurado el componente validacion se realiza la llamada al plugin jquery.form.\n\n        if (settings.formValidationRequired) {\n          $self.rup_validate(settings.validate);\n        } else {\n          $self.ajaxForm(settings);\n        } //Se audita el componente\n\n\n        $.rup.auditComponent('rup_form', 'init');\n      })[\"catch\"](function (error) {\n        console.error('Error al inicializar el componente:\\n', error);\n      });\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  /**\r\n   * Función de callback que será invocada antes de realizarse la serialización del formulario.\r\n   *\r\n   * @callback jQuery.rup_form~beforeSerialize\r\n   * @param {jQuery} $form - Referencia del objeto jQuery del formulario.\r\n   * @param {object} options - Opciones de configuración con las que se ha inicializado el componente.\r\n   * @return {boolean} - En caso de devolver false se cancela el envío del formulario.\r\n   * @example\r\n   * $(\"#form\").rup_form({\r\n   *  beforeSerialize: function($form, options) { ... }\r\n   * });\r\n   */\n\n  /**\r\n   * Función de callback que será invocada antes de realizarse el envío del formulario.\r\n   *\r\n   * @callback jQuery.rup_form~beforeSubmit\r\n   * @param {object[]} arr - Array que contiene la información introducida en el formulario. El array tiene el siguiente formato : [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]\r\n   * @param {jQuery} $form - Referencia del objeto jQuery del formulario.\r\n   * @param {object} options - Opciones de configuración con las que se ha inicializado el componente.\r\n   * @return {boolean} - En caso de devolver false se cancela el envío del formulario.\r\n   * @example\r\n   * $(\"#form\").rup_form({\r\n   *  beforeSubmit: function(arr, $form, options) { ... }\r\n   * });\r\n   */\n\n  /**\r\n   * Función de callback que será invocada cuando se produzca un error.\r\n   *\r\n   * @callback jQuery.rup_form~error\r\n   * @example\r\n   * $(\"#form\").rup_form({\r\n   *  error: function() { ... }\r\n   * });\r\n   */\n\n  /**\r\n   * Función de callback que será invocado cuando se reciba la respuesta del formulario.\r\n   *\r\n   * @callback jQuery.rup_form~suceess\r\n   * @param {string} responseText - Texto identificador de la respuesta obtenida.\r\n   * @param {string} statusText - Código de respuesta http.\r\n   * @param {object} xhr - Objeto xhr con la respuesta enviada del servidor.\r\n   * @param {jQuery} $form - Referencia jQuery al componente formulario.\r\n   * @example\r\n   * $(\"#form\").rup_form({\r\n   *  suceess: function(responseText, statusText, xhr, $form) { ... }\r\n   * });\r\n   */\n\n  /**\r\n   * Función de callback que será invocado cuando se reciba la respuesta del formulario.\r\n   *\r\n   * @callback jQuery.rup_form~uploadProgress\r\n   * @param {Event} event - Objeto Event procedente del navegador.\r\n   * @param {Integer} position - Numero que determina el contenido enviado.\r\n   * @param {Integer} total - Numero que identifica el total del contenido a enviar.\r\n   * @param {Integer} percentComplete - Numero que identifica el porcentaje actual completado en el proceso de envío.\r\n   * @example\r\n   * $(\"#form\").rup_form({\r\n   *  uploadProgress: function(event, position, total, percentComplete) { ... }\r\n   * });\r\n   */\n\n  /**\r\n  * Opciones por defecto de configuración del componente.\r\n  * @name defaults\r\n  *\r\n  * @property {jQuery.rup_form~beforeSerialize} [beforeSerialize=null] - Función de callback que será invocada antes de realizarse la serialización del formulario. Permite la modificación de los datos del formulario antes de que estos sean recuperados para su procesado por el componente.\r\n  * @property {jQuery.rup_form~beforeSubmit} [beforeSubmit=null] - Función de callback que será invocada antes de realizarse el envío del formulario. Permite acceder a la información que será enviada al formulario. En caso de retornar false no se realizará en envío.\r\n  * @property {boolean} [clearForm=null] - Propiedad booleana que determina si el formulario debe de limpiarse después de realizar el envío.\r\n  * @property {object} [data] - Mediante esta propiedad es posible especificar parámetros extra que sean enviados alservidor.\r\n  * @property {string} [dataType] - Tipo de datos esperados en la respuesta. Los valores posibles son null, xml, json y script.\r\n  * @property {jQuery.rup_form~error} [error] - Función de callback que será invocada cuando se produzca un error.\r\n  * @property {boolean} [forceSync=false] - Propiedad booleana. En caso de ser true elimina la corta espera que se produce antes de enviar el formulario cuando se envían ficheros o se utiliza la opción de iframe. La espera se utiliza para permitir al navegador actualizar modificaciones realizadas en el DOM antes de que se realice el\r\n  envío de los datos.\r\n  * @property {boolean} [iframe=false] - Determina si el formulario debe de ser enviado siempre mediante un iframe.\r\n  * @property {string} [iframeSrc] - Propiedad de texto que deberá ser utlizada siempre en conjunción con la propiedad iframe. Por defecto, about:blank. Por defecto para páginas que utlicen el protocolo https, javascript:false.\r\n  * @property {string} [iframeTarget=null] - Identifica el iframe que será utilizado como target en la respuesta en los envíos de ficheros. Por defecto, el componente creará un iframe temporal para capturar la respuesta del envío de ficheros.\r\n  * @property {boolean | object} [multimodel=false] - Permite especificar la configuración que se deberá de aplicar a la hora de realizar el envío de varias entidades en la misma petición. La configuración de este parámetro se detalla en el apartado 9.2.\r\n  * @property {boolean} [replaceTarget=false] - Opcionalmente se utililiza junto con la opción target. En caso de ser true el elemento identificado en la opción target será reemplazado. En caso de ser false solo su contenido será reemplazado.\r\n  * @property {boolean} [resetForm=false] - Propiedad booleana que determina si el formulario debe ser inicializado al realizarse el envío del mismo.\r\n  * @property {bolean} [semantic=false] - Propiedad booleana que determina si los campos del formulario deben ser enviado en estricto orden semántico. Por defecto la serialización normal del formulario se realiza en orden semántico exceptuando los campos img.\r\n  * @property {jQuery.rup_form~suceess} [suceess] - Método callback que será invocado cuando se reciba la respuesta del formulario.\r\n  * @property {string | jQuery | Element} [target] - Identifica los elementos de la página que deberán ser actualizados con la respuesta del servidor. El target puede ser indicado mediante un selector de jQuery, un objeto de jQuery o un objeto DOM.\r\n  * @property {string} [type] - Detemina el método con el que se enviará el formulario, GET o POST. Por defecto el valor de la propiedad method indicada en el formulario o GET en caso de no encontrarse.\r\n  * @property {jQuery.rup_form~uploadProgress} [uploadProgress=null] - Método que será invocado con información de progreso del envío del formulario (en caso de estar soportado por el navegador).\r\n  * @property {string} [url] - URL a la cual se realizará en envío del formulario. Por defecto el valor indicado en la propiedad action del formulario.\r\n  * @property {boolean} [useJsonIfPossible=true] - Mediante este parámetro se especifica al componente que debe de utilizar el formato application/json como prioridad (siempre que sea posible) al realizar el envío del formulario.\r\n  */\n\n  $.fn.rup_form.defaults = {\n    ajaxForm: null,\n    feedback: null,\n    multimodel: null,\n    useJsonIfPossible: true // En caso de ser posible realizar en envío mediante json se enviarán los datos en este formato.\n\n  };\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.form.js?");

/***/ }),

/***/ "./src/rup.jqtable.js":
/*!****************************!*\
  !*** ./src/rup.jqtable.js ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj){\"@babel/helpers - typeof\";return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj;}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj;},_typeof(obj);}(function(factory){if(true){// AMD. Register as an anonymous module.\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"),__webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"),__webpack_require__(/*! ./rup.form */ \"./src/rup.form.js\"),__webpack_require__(/*! ./rup.contextMenu */ \"./src/rup.contextMenu.js\"),__webpack_require__(/*! ./rup.toolbar */ \"./src/rup.toolbar.js\"),__webpack_require__(/*! ./rup.report */ \"./src/rup.report.js\"),__webpack_require__(/*! ./core/utils/form2object */ \"./src/core/utils/form2object.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));}else{}})(function($){initRupI18nPromise.then(function(){// ==ClosureCompiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n/*\r\n * @license jqGrid  4.4.4  - jQuery Grid\r\n * Copyright (c) 2008, Tony Tomov, tony@trirand.com\r\n * Dual licensed under the MIT and GPL licenses\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n * Date: 2013-01-30\r\n */ //jsHint options\n/*jshint evil:true, eqeqeq:false, eqnull:true, devel:true */ /*global jQuery, DOMParser, ActiveXObject */var rp_ge={};(function($){'use strict';$.jgrid=$.jgrid||{};$.extend($.jgrid,{version:'4.4.4',htmlDecode:function htmlDecode(value){if(value&&(value=='&nbsp;'||value=='&#160;'||value.length===1&&value.charCodeAt(0)===160)){return'';}return!value?value:String(value).replace(/&gt;/g,'>').replace(/&lt;/g,'<').replace(/&quot;/g,'\"').replace(/&amp;/g,'&');},htmlEncode:function htmlEncode(value){return!value?value:String(value).replace(/&/g,'&amp;').replace(/\\\"/g,'&quot;').replace(/</g,'&lt;').replace(/>/g,'&gt;');},format:function format(_format){//jqgformat\nvar args=$.makeArray(arguments).slice(1);if(_format==null){_format='';}return _format.replace(/\\{(\\d+)\\}/g,function(m,i){return args[i];});},msie:navigator.appName=='Microsoft Internet Explorer',msiever:function msiever(){var rv=-1;var ua=navigator.userAgent;var re=new RegExp('MSIE ([0-9]{1,}[\\.0-9]{0,})');if(re.exec(ua)!=null){rv=parseFloat(RegExp.$1);}return rv;},getCellIndex:function getCellIndex(cell){var c=$(cell);if(c.is('tr')){return-1;}c=(!c.is('td')&&!c.is('th')?c.closest('td,th'):c)[0];if($.jgrid.msie){return $.inArray(c,c.parentNode.cells);}return c.cellIndex;},stripHtml:function stripHtml(v){v=String(v);var regexp=/<(\"[^\"]*\"|'[^']*'|[^'\">])*>/gi;if(v){v=v.replace(regexp,'');return v&&v!=='&nbsp;'&&v!=='&#160;'?v.replace(/\\\"/g,'\\''):'';}return v;},stripPref:function stripPref(pref,id){var obj=$.type(pref);if(obj=='string'||obj=='number'){pref=String(pref);id=pref!==''?String(id).replace(String(pref),''):id;}return id;},stringToDoc:function stringToDoc(xmlString){var xmlDoc;if(typeof xmlString!=='string'){return xmlString;}try{var parser=new DOMParser();xmlDoc=parser.parseFromString(xmlString,'text/xml');}catch(e){xmlDoc=new ActiveXObject('Microsoft.XMLDOM');xmlDoc.async=false;xmlDoc.loadXML(xmlString);}return xmlDoc&&xmlDoc.documentElement&&xmlDoc.documentElement.tagName!='parsererror'?xmlDoc:null;},parse:function parse(jsonString){var js=jsonString;if(js.substr(0,9)=='while(1);'){js=js.substr(9);}if(js.substr(0,2)=='/*'){js=js.substr(2,js.length-4);}if(!js){js='{}';}return $.jgrid.useJSON===true&&(typeof JSON===\"undefined\"?\"undefined\":_typeof(JSON))==='object'&&typeof JSON.parse==='function'?JSON.parse(js):eval('('+js+')');},parseDate:function parseDate(format,date){var tsp={m:1,d:1,y:1970,h:0,i:0,s:0,u:0},k,hl,dM,regdate=/[\\\\\\/:_;.,\\t\\T\\s-]/;if(date&&date!=null){date=$.trim(date);date=date.split(regdate);if($.jgrid.formatter.date.masks[format]!==undefined){format=$.jgrid.formatter.date.masks[format];}format=format.split(regdate);var dfmt=$.jgrid.formatter.date.monthNames;var afmt=$.jgrid.formatter.date.AmPm;var h12to24=function h12to24(ampm,h){if(ampm===0){if(h===12){h=0;}}else{if(h!==12){h+=12;}}return h;};for(k=0,hl=format.length;k<hl;k++){if(format[k]=='M'){dM=$.inArray(date[k],dfmt);if(dM!==-1&&dM<12){date[k]=dM+1;tsp.m=date[k];}}if(format[k]=='F'){dM=$.inArray(date[k],dfmt);if(dM!==-1&&dM>11){date[k]=dM+1-12;tsp.m=date[k];}}if(format[k]=='a'){dM=$.inArray(date[k],afmt);if(dM!==-1&&dM<2&&date[k]==afmt[dM]){date[k]=dM;tsp.h=h12to24(date[k],tsp.h);}}if(format[k]=='A'){dM=$.inArray(date[k],afmt);if(dM!==-1&&dM>1&&date[k]==afmt[dM]){date[k]=dM-2;tsp.h=h12to24(date[k],tsp.h);}}if(format[k]==='g'){tsp.h=parseInt(date[k],10);}if(date[k]!==undefined){tsp[format[k].toLowerCase()]=parseInt(date[k],10);}}tsp.m=parseInt(tsp.m,10)-1;var ty=tsp.y;if(ty>=70&&ty<=99){tsp.y=1900+tsp.y;}else if(ty>=0&&ty<=69){tsp.y=2000+tsp.y;}if(tsp.j!==undefined){tsp.d=tsp.j;}if(tsp.n!==undefined){tsp.m=parseInt(tsp.n,10)-1;}}return new Date(tsp.y,tsp.m,tsp.d,tsp.h,tsp.i,tsp.s,tsp.u);},jqID:function jqID(sid){return String(sid).replace(/[!\"#$%&'()*+,.\\/:; <=>?@\\[\\\\\\]\\^`{|}~]/g,'\\\\$&');},guid:1,uidPref:'jqg',randId:function randId(prefix){return(prefix||$.jgrid.uidPref)+$.jgrid.guid++;},getAccessor:function getAccessor(obj,expr){var ret,p,prm=[],i;if(typeof expr==='function'){return expr(obj);}ret=obj[expr];if(ret===undefined){try{if(typeof expr==='string'){prm=expr.split('.');}i=prm.length;if(i){ret=obj;while(ret&&i--){p=prm.shift();ret=ret[p];}}}catch(e){}}return ret;},getXmlData:function getXmlData(obj,expr,returnObj){var ret,m=typeof expr==='string'?expr.match(/^(.*)\\[(\\w+)\\]$/):null;if(typeof expr==='function'){return expr(obj);}if(m&&m[2]){// m[2] is the attribute selector\n// m[1] is an optional element selector\n// examples: \"[id]\", \"rows[page]\"\nreturn m[1]?$(m[1],obj).attr(m[2]):$(obj).attr(m[2]);}ret=$(expr,obj);if(returnObj){return ret;}//$(expr, obj).filter(':last'); // we use ':last' to be more compatible with old version of jqGrid\nreturn ret.length>0?$(ret).text():undefined;},cellWidth:function cellWidth(){var $testDiv=$('<div class=\\'ui-jqgrid\\' style=\\'left:10000px\\'><table class=\\'ui-jqgrid-btable\\' style=\\'width:5px;\\'><tr class=\\'jqgrow\\'><td style=\\'width:5px;\\'></td></tr></table></div>'),testCell=$testDiv.appendTo('body').find('td').width();$testDiv.remove();return testCell!==5;},cell_width:true,ajaxOptions:{},from:function from(source){// Original Author Hugo Bonacci\n// License MIT http://jlinq.codeplex.com/license\nvar QueryObject=function QueryObject(d,q){if(typeof d==='string'){d=$.data(d);}var self=this,_data=d,_usecase=true,_trim=false,_query=q,_stripNum=/[\\$,%]/g,_lastCommand=null,_lastField=null,_orDepth=0,_negate=false,_queuedOperator='',_sorting=[],_useProperties=true;if(_typeof(d)==='object'&&d.push){if(d.length>0){if(_typeof(d[0])!=='object'){_useProperties=false;}else{_useProperties=true;}}}else{throw'data provides is not an array';}this._hasData=function(){return _data===null?false:_data.length===0?false:true;};this._getStr=function(s){var phrase=[];if(_trim){phrase.push('jQuery.trim(');}phrase.push('String('+s+')');if(_trim){phrase.push(')');}if(!_usecase){phrase.push('.toLowerCase()');}return phrase.join('');};this._strComp=function(val){if(typeof val==='string'){return'.toString()';}return'';};this._group=function(f,u){return{field:f.toString(),unique:u,items:[]};};this._toStr=function(phrase){if(_trim){phrase=$.trim(phrase);}phrase=phrase.toString().replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"');return _usecase?phrase:phrase.toLowerCase();};this._funcLoop=function(func){var results=[];$.each(_data,function(i,v){results.push(func(v));});return results;};this._append=function(s){var i;if(_query===null){_query='';}else{_query+=_queuedOperator===''?' && ':_queuedOperator;}for(i=0;i<_orDepth;i++){_query+='(';}if(_negate){_query+='!';}_query+='('+s+')';_negate=false;_queuedOperator='';_orDepth=0;};this._setCommand=function(f,c){_lastCommand=f;_lastField=c;};this._resetNegate=function(){_negate=false;};this._repeatCommand=function(f,v){if(_lastCommand===null){return self;}if(f!==null&&v!==null){return _lastCommand(f,v);}if(_lastField===null){return _lastCommand(f);}if(!_useProperties){return _lastCommand(f);}return _lastCommand(_lastField,f);};this._equals=function(a,b){return self._compare(a,b,1)===0;};this._compare=function(a,b,d){var toString=Object.prototype.toString;if(d===undefined){d=1;}if(a===undefined){a=null;}if(b===undefined){b=null;}if(a===null&&b===null){return 0;}if(a===null&&b!==null){return 1;}if(a!==null&&b===null){return-1;}if(toString.call(a)==='[object Date]'&&toString.call(b)==='[object Date]'){if(a<b){return-d;}if(a>b){return d;}return 0;}if(!_usecase&&typeof a!=='number'&&typeof b!=='number'){a=String(a);b=String(b);}if(a<b){return-d;}if(a>b){return d;}return 0;};this._performSort=function(){if(_sorting.length===0){return;}_data=self._doSort(_data,0);};this._doSort=function(d,q){var by=_sorting[q].by,dir=_sorting[q].dir,type=_sorting[q].type,dfmt=_sorting[q].datefmt;if(q==_sorting.length-1){return self._getOrder(d,by,dir,type,dfmt);}q++;var values=self._getGroup(d,by,dir,type,dfmt),results=[],i,j,sorted;for(i=0;i<values.length;i++){sorted=self._doSort(values[i].items,q);for(j=0;j<sorted.length;j++){results.push(sorted[j]);}}return results;};this._getOrder=function(data,by,dir,type,dfmt){var sortData=[],_sortData=[],newDir=dir=='a'?1:-1,i,ab,j,findSortKey;if(type===undefined){type='text';}if(type=='float'||type=='number'||type=='currency'||type=='numeric'){findSortKey=function findSortKey($cell){var key=parseFloat(String($cell).replace(_stripNum,''));return isNaN(key)?0.00:key;};}else if(type=='int'||type=='integer'){findSortKey=function findSortKey($cell){return $cell?parseFloat(String($cell).replace(_stripNum,'')):0;};}else if(type=='date'||type=='datetime'){findSortKey=function findSortKey($cell){return $.jgrid.parseDate(dfmt,$cell).getTime();};}else if($.isFunction(type)){findSortKey=type;}else{findSortKey=function findSortKey($cell){$cell=$cell?$.trim(String($cell)):'';return _usecase?$cell:$cell.toLowerCase();};}$.each(data,function(i,v){ab=by!==''?$.jgrid.getAccessor(v,by):v;if(ab===undefined){ab='';}ab=findSortKey(ab,v);_sortData.push({'vSort':ab,'index':i});});_sortData.sort(function(a,b){a=a.vSort;b=b.vSort;return self._compare(a,b,newDir);});j=0;var nrec=data.length;// overhead, but we do not change the original data.\nwhile(j<nrec){i=_sortData[j].index;sortData.push(data[i]);j++;}return sortData;};this._getGroup=function(data,by,dir,type,dfmt){var results=[],group=null,last=null,val;$.each(self._getOrder(data,by,dir,type,dfmt),function(i,v){val=$.jgrid.getAccessor(v,by);if(val==null){val='';}if(!self._equals(last,val)){last=val;if(group!==null){results.push(group);}group=self._group(by,val);}group.items.push(v);});if(group!==null){results.push(group);}return results;};this.ignoreCase=function(){_usecase=false;return self;};this.useCase=function(){_usecase=true;return self;};this.trim=function(){_trim=true;return self;};this.noTrim=function(){_trim=false;return self;};this.execute=function(){var match=_query,results=[];if(match===null){return self;}$.each(_data,function(){if(eval(match)){results.push(this);}});_data=results;return self;};this.data=function(){return _data;};this.select=function(f){self._performSort();if(!self._hasData()){return[];}self.execute();if($.isFunction(f)){var results=[];$.each(_data,function(i,v){results.push(f(v));});return results;}return _data;};this.hasMatch=function(){if(!self._hasData()){return false;}self.execute();return _data.length>0;};this.andNot=function(f,v,x){_negate=!_negate;return self.and(f,v,x);};this.orNot=function(f,v,x){_negate=!_negate;return self.or(f,v,x);};this.not=function(f,v,x){return self.andNot(f,v,x);};this.and=function(f,v,x){_queuedOperator=' && ';if(f===undefined){return self;}return self._repeatCommand(f,v,x);};this.or=function(f,v,x){_queuedOperator=' || ';if(f===undefined){return self;}return self._repeatCommand(f,v,x);};this.orBegin=function(){_orDepth++;return self;};this.orEnd=function(){if(_query!==null){_query+=')';}return self;};this.isNot=function(f){_negate=!_negate;return self.is(f);};this.is=function(f){self._append('this.'+f);self._resetNegate();return self;};this._compareValues=function(func,f,v,how,t){var fld;if(_useProperties){fld='jQuery.jgrid.getAccessor(this,\\''+f+'\\')';}else{fld='this';}if(v===undefined){v=null;}//var val=v===null?f:v,\nvar val=v,swst=t.stype===undefined?'text':t.stype;if(v!==null){switch(swst){case'int':case'integer':val=isNaN(Number(val))||val===''?'0':val;// To be fixed with more inteligent code\nfld='parseInt('+fld+',10)';val='parseInt('+val+',10)';break;case'float':case'number':case'numeric':val=String(val).replace(_stripNum,'');val=isNaN(Number(val))||val===''?'0':val;// To be fixed with more inteligent code\nfld='parseFloat('+fld+')';val='parseFloat('+val+')';break;case'date':case'datetime':val=String($.jgrid.parseDate(t.newfmt||'Y-m-d',val).getTime());fld='jQuery.jgrid.parseDate(\"'+t.srcfmt+'\",'+fld+').getTime()';break;default:fld=self._getStr(fld);val=self._getStr('\"'+self._toStr(val)+'\"');}}self._append(fld+' '+how+' '+val);self._setCommand(func,f);self._resetNegate();return self;};this.equals=function(f,v,t){return self._compareValues(self.equals,f,v,'==',t);};this.notEquals=function(f,v,t){return self._compareValues(self.equals,f,v,'!==',t);};this.isNull=function(f,v,t){return self._compareValues(self.equals,f,null,'===',t);};this.greater=function(f,v,t){return self._compareValues(self.greater,f,v,'>',t);};this.less=function(f,v,t){return self._compareValues(self.less,f,v,'<',t);};this.greaterOrEquals=function(f,v,t){return self._compareValues(self.greaterOrEquals,f,v,'>=',t);};this.lessOrEquals=function(f,v,t){return self._compareValues(self.lessOrEquals,f,v,'<=',t);};this.startsWith=function(f,v){var val=v==null?f:v,length=_trim?$.trim(val.toString()).length:val.toString().length;if(_useProperties){self._append(self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.substr(0,'+length+') == '+self._getStr('\"'+self._toStr(v)+'\"'));}else{length=_trim?$.trim(v.toString()).length:v.toString().length;self._append(self._getStr('this')+'.substr(0,'+length+') == '+self._getStr('\"'+self._toStr(f)+'\"'));}self._setCommand(self.startsWith,f);self._resetNegate();return self;};this.endsWith=function(f,v){var val=v==null?f:v,length=_trim?$.trim(val.toString()).length:val.toString().length;if(_useProperties){self._append(self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.substr('+self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.length-'+length+','+length+') == \"'+self._toStr(v)+'\"');}else{self._append(self._getStr('this')+'.substr('+self._getStr('this')+'.length-\"'+self._toStr(f)+'\".length,\"'+self._toStr(f)+'\".length) == \"'+self._toStr(f)+'\"');}self._setCommand(self.endsWith,f);self._resetNegate();return self;};this.contains=function(f,v){if(_useProperties){self._append(self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.indexOf(\"'+self._toStr(v)+'\",0) > -1');}else{self._append(self._getStr('this')+'.indexOf(\"'+self._toStr(f)+'\",0) > -1');}self._setCommand(self.contains,f);self._resetNegate();return self;};this.groupBy=function(by,dir,type,datefmt){if(!self._hasData()){return null;}return self._getGroup(_data,by,dir,type,datefmt);};this.orderBy=function(by,dir,stype,dfmt){dir=dir==null?'a':$.trim(dir.toString().toLowerCase());if(stype==null){stype='text';}if(dfmt==null){dfmt='Y-m-d';}if(dir=='desc'||dir=='descending'){dir='d';}if(dir=='asc'||dir=='ascending'){dir='a';}_sorting.push({by:by,dir:dir,type:stype,datefmt:dfmt});return self;};return self;};return new QueryObject(source,null);},getMethod:function getMethod(name){return this.getAccessor($.fn.jqGrid,name);},extend:function extend(methods){$.extend($.fn.jqGrid,methods);if(!this.no_legacy_api){$.fn.extend(methods);}}});$.fn.jqGrid=function(pin){if(typeof pin==='string'){var fn=$.jgrid.getMethod(pin);if(!fn){throw'jqGrid - No such method: '+pin;}var args=$.makeArray(arguments).slice(1);return fn.apply(this,args);}return this.each(function(){if(this.grid){return;}var p=$.extend(true,{url:'',height:150,page:1,rowNum:20,rowTotal:null,records:0,pager:'',pgbuttons:true,pginput:true,colModel:[],rowList:[],colNames:[],sortorder:'asc',sortname:'',datatype:'xml',mtype:'GET',altRows:false,selarrrow:[],savedRow:[],shrinkToFit:true,xmlReader:{},jsonReader:{},subGrid:false,subGridModel:[],reccount:0,lastpage:0,lastsort:0,selrow:null,beforeSelectRow:null,onSelectRow:null,onSortCol:null,ondblClickRow:null,onRightClickRow:null,onPaging:null,onSelectAll:null,onInitGrid:null,loadComplete:null,gridComplete:null,loadError:null,loadBeforeSend:null,afterInsertRow:null,beforeRequest:null,beforeProcessing:null,onHeaderClick:null,viewrecords:false,loadonce:false,multiselect:false,multikey:false,editurl:null,search:false,caption:'',hidegrid:true,hiddengrid:false,postData:{},userData:{},treeGrid:false,treeGridModel:'nested',treeReader:{},treeANode:-1,ExpandColumn:null,tree_root_level:0,prmNames:{page:'page',rows:'rows',sort:'sidx',order:'sord',search:'_search',nd:'nd',id:'id',oper:'oper',editoper:'edit',addoper:'add',deloper:'del',subgridid:'id',npage:null,totalrows:'totalrows'},forceFit:false,gridstate:'visible',cellEdit:false,cellsubmit:'remote',nv:0,loadui:'enable',toolbar:[false,''],scroll:false,multiboxonly:false,deselectAfterSort:true,scrollrows:false,autowidth:false,scrollOffset:18,cellLayout:5,subGridWidth:20,multiselectWidth:20,gridview:false,rownumWidth:25,rownumbers:false,pagerpos:'center',recordpos:'right',footerrow:false,userDataOnFooter:false,hoverrows:true,altclass:'ui-priority-secondary',viewsortcols:[false,'vertical',true],resizeclass:'',autoencode:false,remapColumns:[],ajaxGridOptions:{},direction:'ltr',toppager:false,headertitles:false,scrollTimeout:40,data:[],_index:{},grouping:false,groupingView:{groupField:[],groupOrder:[],groupText:[],groupColumnShow:[],groupSummary:[],showSummaryOnHide:false,sortitems:[],sortnames:[],summary:[],summaryval:[],plusicon:'ui-icon-circlesmall-plus',minusicon:'ui-icon-circlesmall-minus',displayField:[]},ignoreCase:false,cmTemplate:{},idPrefix:''},$.jgrid.defaults,pin||{});var ts=this,grid={headers:[],cols:[],footers:[],dragStart:function dragStart(i,x,y){this.resizing={idx:i,startX:x.clientX,sOL:y[0]};this.hDiv.style.cursor='col-resize';this.curGbox=$('#rs_m'+$.jgrid.jqID(p.id),'#gbox_'+$.jgrid.jqID(p.id));this.curGbox.css({display:'block',left:y[0],top:y[1],height:y[2]});$(ts).triggerHandler('jqGridResizeStart',[x,i]);if($.isFunction(p.resizeStart)){p.resizeStart.call(this,x,i);}document.onselectstart=function(){return false;};},dragMove:function dragMove(x){if(this.resizing){var diff=x.clientX-this.resizing.startX,h=this.headers[this.resizing.idx],newWidth=p.direction==='ltr'?h.width+diff:h.width-diff,hn,nWn;if(newWidth>33){this.curGbox.css({left:this.resizing.sOL+diff});if(p.forceFit===true){hn=this.headers[this.resizing.idx+p.nv];nWn=p.direction==='ltr'?hn.width-diff:hn.width+diff;if(nWn>33){h.newWidth=newWidth;hn.newWidth=nWn;}}else{this.newWidth=p.direction==='ltr'?p.tblwidth+diff:p.tblwidth-diff;h.newWidth=newWidth;}}}},dragEnd:function dragEnd(){this.hDiv.style.cursor='default';if(this.resizing){var idx=this.resizing.idx,nw=this.headers[idx].newWidth||this.headers[idx].width;nw=parseInt(nw,10);this.resizing=false;$('#rs_m'+$.jgrid.jqID(p.id)).css('display','none');p.colModel[idx].width=nw;this.headers[idx].width=nw;this.headers[idx].el.style.width=nw+'px';this.cols[idx].style.width=nw+'px';if(this.footers.length>0){this.footers[idx].style.width=nw+'px';}if(p.forceFit===true){nw=this.headers[idx+p.nv].newWidth||this.headers[idx+p.nv].width;this.headers[idx+p.nv].width=nw;this.headers[idx+p.nv].el.style.width=nw+'px';this.cols[idx+p.nv].style.width=nw+'px';if(this.footers.length>0){this.footers[idx+p.nv].style.width=nw+'px';}p.colModel[idx+p.nv].width=nw;}else{p.tblwidth=this.newWidth||p.tblwidth;$('table:first',this.bDiv).css('width',p.tblwidth+'px');$('table:first',this.hDiv).css('width',p.tblwidth+'px');this.hDiv.scrollLeft=this.bDiv.scrollLeft;if(p.footerrow){$('table:first',this.sDiv).css('width',p.tblwidth+'px');this.sDiv.scrollLeft=this.bDiv.scrollLeft;}}$(ts).triggerHandler('jqGridResizeStop',[nw,idx]);if($.isFunction(p.resizeStop)){p.resizeStop.call(this,nw,idx);}}this.curGbox=null;document.onselectstart=function(){return true;};},populateVisible:function populateVisible(){if(grid.timer){clearTimeout(grid.timer);}grid.timer=null;var dh=$(grid.bDiv).height();if(!dh){return;}var table=$('table:first',grid.bDiv);var rows,rh;if(table[0].rows.length){try{rows=table[0].rows[1];rh=rows?$(rows).outerHeight()||grid.prevRowHeight:grid.prevRowHeight;}catch(pv){rh=grid.prevRowHeight;}}if(!rh){return;}grid.prevRowHeight=rh;var rn=p.rowNum;var scrollTop=grid.scrollTop=grid.bDiv.scrollTop;var ttop=Math.round(table.position().top)-scrollTop;var tbot=ttop+table.height();var div=rh*rn;var page,npage,empty;if(tbot<dh&&ttop<=0&&(p.lastpage===undefined||parseInt((tbot+scrollTop+div-1)/div,10)<=p.lastpage)){npage=parseInt((dh-tbot+div-1)/div,10);if(tbot>=0||npage<2||p.scroll===true){page=Math.round((tbot+scrollTop)/div)+1;ttop=-1;}else{ttop=1;}}if(ttop>0){page=parseInt(scrollTop/div,10)+1;npage=parseInt((scrollTop+dh)/div,10)+2-page;empty=true;}if(npage){if(p.lastpage&&(page>p.lastpage||p.lastpage==1||page===p.page&&page===p.lastpage)){return;}if(grid.hDiv.loading){grid.timer=setTimeout(grid.populateVisible,p.scrollTimeout);}else{p.page=page;if(empty){grid.selectionPreserver(table[0]);grid.emptyRows.call(table[0],false,false);}grid.populate(npage);}}},scrollGrid:function scrollGrid(e){if(p.scroll){var scrollTop=grid.bDiv.scrollTop;if(grid.scrollTop===undefined){grid.scrollTop=0;}if(scrollTop!=grid.scrollTop){grid.scrollTop=scrollTop;if(grid.timer){clearTimeout(grid.timer);}grid.timer=setTimeout(grid.populateVisible,p.scrollTimeout);}}grid.hDiv.scrollLeft=grid.bDiv.scrollLeft;if(p.footerrow){grid.sDiv.scrollLeft=grid.bDiv.scrollLeft;}if(e){e.stopPropagation();}},selectionPreserver:function selectionPreserver(ts){var p=ts.p,sr=p.selrow,sra=p.selarrrow?$.makeArray(p.selarrrow):null,left=ts.grid.bDiv.scrollLeft,restoreSelection=function restoreSelection(){var i;p.selrow=null;p.selarrrow=[];if(p.multiselect&&sra&&sra.length>0){for(i=0;i<sra.length;i++){if(sra[i]!=sr){$(ts).jqGrid('setSelection',sra[i],false,null);}}}if(sr){$(ts).jqGrid('setSelection',sr,false,null);}ts.grid.bDiv.scrollLeft=left;$(ts).unbind('.selectionPreserver',restoreSelection);};$(ts).bind('jqGridGridComplete.selectionPreserver',restoreSelection);}};if(this.tagName.toUpperCase()!='TABLE'){alert('Element is not a table');return;}if(document.documentMode!==undefined){// IE only\nif(document.documentMode<=5){alert('Grid can not be used in this (\\'quirks\\') mode!');return;}}$(this).empty().attr('tabindex','0');this.p=p;this.p.useProp=!!$.fn.prop;var i,dir;if(this.p.colNames.length===0){for(i=0;i<this.p.colModel.length;i++){this.p.colNames[i]=this.p.colModel[i].label||this.p.colModel[i].name;}}if(this.p.colNames.length!==this.p.colModel.length){alert($.jgrid.errors.model);return;}var gv=$('<div class=\\'ui-jqgrid-view\\'></div>'),isMSIE=$.jgrid.msie;ts.p.direction=$.trim(ts.p.direction.toLowerCase());if($.inArray(ts.p.direction,['ltr','rtl'])==-1){ts.p.direction='ltr';}dir=ts.p.direction;$(gv).insertBefore(this);$(this).removeClass('scroll').appendTo(gv);var eg=$('<div class=\\'ui-jqgrid ui-widget ui-widget-content ui-corner-all\\'></div>');$(eg).attr({'id':'gbox_'+this.id,'dir':dir}).insertBefore(gv);$(gv).attr('id','gview_'+this.id).appendTo(eg);$('<div class=\\'ui-widget-overlay jqgrid-overlay\\' id=\\'lui_'+this.id+'\\'></div>').insertBefore(gv);$('<div class=\\'loading ui-state-default ui-state-active\\' id=\\'load_'+this.id+'\\'>'+this.p.loadtext+'</div>').insertBefore(gv);$(this).attr({cellspacing:'0',cellpadding:'0',border:'0','role':'grid','aria-multiselectable':!!this.p.multiselect,'aria-labelledby':'gbox_'+this.id});var sortkeys=['shiftKey','altKey','ctrlKey'],intNum=function intNum(val,defval){val=parseInt(val,10);if(isNaN(val)){return defval||0;}return val;},formatCol=function formatCol(pos,rowInd,tv,rawObject,rowId,rdata){var cm=ts.p.colModel[pos],ral=cm.align,result='style=\"',clas=cm.classes,nm=cm.name,celp,acp=[];if(ral){result+='text-align:'+ral+';';}if(cm.hidden===true){result+='display:none;';}if(rowInd===0){result+='width: '+grid.headers[pos].width+'px;';}else if(cm.cellattr&&$.isFunction(cm.cellattr)){celp=cm.cellattr.call(ts,rowId,tv,rawObject,cm,rdata);if(celp&&typeof celp==='string'){celp=celp.replace(/style/i,'style').replace(/title/i,'title');if(celp.indexOf('title')>-1){cm.title=false;}if(celp.indexOf('class')>-1){clas=undefined;}acp=celp.split('style');if(acp.length===2){acp[1]=$.trim(acp[1].replace('=',''));if(acp[1].indexOf('\\'')===0||acp[1].indexOf('\"')===0){acp[1]=acp[1].substring(1);}result+=acp[1].replace(/'/gi,'\"');}else{result+='\"';}}}if(!acp.length){acp[0]='';result+='\"';}result+=(clas!==undefined?' class=\"'+clas+'\"':'')+(cm.title&&tv?' title=\"'+$.jgrid.stripHtml(tv)+'\"':'');result+=' aria-describedby=\"'+ts.p.id+'_'+nm+'\"';return result+acp[0];},cellVal=function cellVal(val){return val==null||val===''?'&#160;':ts.p.autoencode?$.jgrid.htmlEncode(val):String(val);},formatter=function formatter(rowId,cellval,colpos,rwdat,_act){var cm=ts.p.colModel[colpos],v;if(cm.formatter!==undefined){rowId=String(ts.p.idPrefix)!==''?$.jgrid.stripPref(ts.p.idPrefix,rowId):rowId;var opts={rowId:rowId,colModel:cm,gid:ts.p.id,pos:colpos};if($.isFunction(cm.formatter)){v=cm.formatter.call(ts,cellval,opts,rwdat,_act);}else if($.fmatter){v=$.fn.fmatter.call(ts,cm.formatter,cellval,opts,rwdat,_act);}else{v=cellVal(cellval);}}else{v=cellVal(cellval);}return v;},addCell=function addCell(rowId,cell,pos,irow,srvr,rdata){var v,prp;v=formatter(rowId,cell,pos,srvr,'add');prp=formatCol(pos,irow,v,srvr,rowId,rdata);return'<td role=\"gridcell\" '+prp+'>'+v+'</td>';},addMulti=function addMulti(rowid,pos,irow,checked){var v='<input role=\"checkbox\" type=\"checkbox\"'+' id=\"jqg_'+ts.p.id+'_'+rowid+'\" class=\"cbox\" name=\"jqg_'+ts.p.id+'_'+rowid+'\"'+(checked?'checked=\"checked\"':'')+'/>',prp=formatCol(pos,irow,'',null,rowid,true);return'<td role=\"gridcell\" '+prp+'>'+v+'</td>';},addRowNum=function addRowNum(pos,irow,pG,rN){var v=(parseInt(pG,10)-1)*parseInt(rN,10)+1+irow,prp=formatCol(pos,irow,v,null,irow,true);return'<td role=\"gridcell\" class=\"ui-state-default jqgrid-rownum\" '+prp+'>'+v+'</td>';},reader=function reader(datatype){var field,f=[],j=0,i;for(i=0;i<ts.p.colModel.length;i++){field=ts.p.colModel[i];if(field.name!=='cb'&&field.name!=='subgrid'&&field.name!=='rn'){f[j]=datatype=='local'?field.name:datatype=='xml'||datatype==='xmlstring'?field.xmlmap||field.name:field.jsonmap||field.name;j++;}}return f;},orderedCols=function orderedCols(offset){var order=ts.p.remapColumns;if(!order||!order.length){order=$.map(ts.p.colModel,function(v,i){return i;});}if(offset){order=$.map(order,function(v){return v<offset?null:v-offset;});}return order;},emptyRows=function emptyRows(scroll,locdata){var firstrow;if(this.p.deepempty){$(this.rows).slice(1).remove();}else{firstrow=this.rows.length>0?this.rows[0]:null;$(this.firstChild).empty().append(firstrow);}if(scroll&&this.p.scroll){$(this.grid.bDiv.firstChild).css({height:'auto'});$(this.grid.bDiv.firstChild.firstChild).css({height:0,display:'none'});if(this.grid.bDiv.scrollTop!==0){this.grid.bDiv.scrollTop=0;}}if(locdata===true&&this.p.treeGrid){this.p.data=[];this.p._index={};}},refreshIndex=function refreshIndex(){var datalen=ts.p.data.length,idname,i,val,ni=ts.p.rownumbers===true?1:0,gi=ts.p.multiselect===true?1:0,si=ts.p.subGrid===true?1:0;if(ts.p.keyIndex===false||ts.p.loadonce===true){idname=ts.p.localReader.id;}else{idname=ts.p.colModel[ts.p.keyIndex+gi+si+ni].name;}for(i=0;i<datalen;i++){val=$.jgrid.getAccessor(ts.p.data[i],idname);if(val===undefined){val=String(i+1);}ts.p._index[val]=i;}},constructTr=function constructTr(id,hide,altClass,rd,cur,selected){var tabindex='-1',restAttr='',attrName,style=hide?'display:none;':'',classes='ui-widget-content jqgrow ui-row-'+ts.p.direction+altClass+(selected?' ui-state-highlight':''),rowAttrObj=$.isFunction(ts.p.rowattr)?ts.p.rowattr.call(ts,rd,cur):{};if(!$.isEmptyObject(rowAttrObj)){if(rowAttrObj.hasOwnProperty('id')){id=rowAttrObj.id;delete rowAttrObj.id;}if(rowAttrObj.hasOwnProperty('tabindex')){tabindex=rowAttrObj.tabindex;delete rowAttrObj.tabindex;}if(rowAttrObj.hasOwnProperty('style')){style+=rowAttrObj.style;delete rowAttrObj.style;}if(rowAttrObj.hasOwnProperty('class')){classes+=' '+rowAttrObj['class'];delete rowAttrObj['class'];}// dot't allow to change role attribute\ntry{delete rowAttrObj.role;}catch(ra){}for(attrName in rowAttrObj){if(rowAttrObj.hasOwnProperty(attrName)){restAttr+=' '+attrName+'='+rowAttrObj[attrName];}}}return'<tr role=\"row\" id=\"'+id+'\" tabindex=\"'+tabindex+'\" class=\"'+classes+'\"'+(style===''?'':' style=\"'+style+'\"')+restAttr+'>';},addXmlData=function addXmlData(xml,t,rcnt,more,adjust){var startReq=new Date(),locdata=ts.p.datatype!='local'&&ts.p.loadonce||ts.p.datatype=='xmlstring',xmlid='_id_',xmlRd=ts.p.xmlReader,frd=ts.p.datatype=='local'?'local':'xml';if(locdata){ts.p.data=[];ts.p._index={};ts.p.localReader.id=xmlid;}ts.p.reccount=0;if($.isXMLDoc(xml)){if(ts.p.treeANode===-1&&!ts.p.scroll){emptyRows.call(ts,false,true);rcnt=1;}else{rcnt=rcnt>1?rcnt:1;}}else{return;}var self=$(ts),i,fpos,ir=0,v,gi=ts.p.multiselect===true?1:0,si=0,addSubGridCell,ni=ts.p.rownumbers===true?1:0,idn,getId,f=[],F,rd={},xmlr,rid,rowData=[],cn=ts.p.altRows===true?' '+ts.p.altclass:'',cn1;if(ts.p.subGrid===true){si=1;addSubGridCell=$.jgrid.getMethod('addSubGridCell');}if(!xmlRd.repeatitems){f=reader(frd);}if(ts.p.keyIndex===false){idn=$.isFunction(xmlRd.id)?xmlRd.id.call(ts,xml):xmlRd.id;}else{idn=ts.p.keyIndex;}if(f.length>0&&!isNaN(idn)){if(ts.p.remapColumns&&ts.p.remapColumns.length){idn=$.inArray(idn,ts.p.remapColumns);}idn=f[idn];}if(String(idn).indexOf('[')===-1){if(f.length){getId=function getId(trow,k){return $(idn,trow).text()||k;};}else{getId=function getId(trow,k){return $(xmlRd.cell,trow).eq(idn).text()||k;};}}else{getId=function getId(trow,k){return trow.getAttribute(idn.replace(/[\\[\\]]/g,''))||k;};}ts.p.userData={};ts.p.page=$.jgrid.getXmlData(xml,xmlRd.page)||ts.p.page||0;ts.p.lastpage=$.jgrid.getXmlData(xml,xmlRd.total);if(ts.p.lastpage===undefined){ts.p.lastpage=1;}ts.p.records=$.jgrid.getXmlData(xml,xmlRd.records)||0;if($.isFunction(xmlRd.userdata)){ts.p.userData=xmlRd.userdata.call(ts,xml)||{};}else{$.jgrid.getXmlData(xml,xmlRd.userdata,true).each(function(){ts.p.userData[this.getAttribute('name')]=$(this).text();});}var gxml=$.jgrid.getXmlData(xml,xmlRd.root,true);gxml=$.jgrid.getXmlData(gxml,xmlRd.row,true);if(!gxml){gxml=[];}var gl=gxml.length,j=0,grpdata=[],rn=parseInt(ts.p.rowNum,10),br=ts.p.scroll?$.jgrid.randId():1,altr;if(gl>0&&ts.p.page<=0){ts.p.page=1;}if(gxml&&gl){if(adjust){rn*=adjust+1;}var afterInsRow=$.isFunction(ts.p.afterInsertRow),hiderow=false,groupingPrepare;if(ts.p.grouping){hiderow=ts.p.groupingView.groupCollapse===true;groupingPrepare=$.jgrid.getMethod('groupingPrepare');}while(j<gl){xmlr=gxml[j];rid=getId(xmlr,br+j);rid=ts.p.idPrefix+rid;altr=rcnt===0?0:rcnt+1;cn1=(altr+j)%2==1?cn:'';var iStartTrTag=rowData.length;rowData.push('');if(ni){rowData.push(addRowNum(0,j,ts.p.page,ts.p.rowNum));}if(gi){rowData.push(addMulti(rid,ni,j,false));}if(si){rowData.push(addSubGridCell.call(self,gi+ni,j+rcnt));}if(xmlRd.repeatitems){if(!F){F=orderedCols(gi+si+ni);}var cells=$.jgrid.getXmlData(xmlr,xmlRd.cell,true);$.each(F,function(k){var cell=cells[this];if(!cell){return false;}v=cell.textContent||cell.text;rd[ts.p.colModel[k+gi+si+ni].name]=v;rowData.push(addCell(rid,v,k+gi+si+ni,j+rcnt,xmlr,rd));});}else{for(i=0;i<f.length;i++){v=$.jgrid.getXmlData(xmlr,f[i]);rd[ts.p.colModel[i+gi+si+ni].name]=v;rowData.push(addCell(rid,v,i+gi+si+ni,j+rcnt,xmlr,rd));}}rowData[iStartTrTag]=constructTr(rid,hiderow,cn1,rd,xmlr,false);rowData.push('</tr>');if(ts.p.grouping){grpdata=groupingPrepare.call(self,rowData,grpdata,rd,j);rowData=[];}if(locdata||ts.p.treeGrid===true){rd[xmlid]=rid;ts.p.data.push(rd);ts.p._index[rid]=ts.p.data.length-1;}if(ts.p.gridview===false){$('tbody:first',t).append(rowData.join(''));self.triggerHandler('jqGridAfterInsertRow',[rid,rd,xmlr]);if(afterInsRow){ts.p.afterInsertRow.call(ts,rid,rd,xmlr);}rowData=[];}rd={};ir++;j++;if(ir==rn){break;}}}if(ts.p.gridview===true){fpos=ts.p.treeANode>-1?ts.p.treeANode:0;if(ts.p.grouping){self.jqGrid('groupingRender',grpdata,ts.p.colModel.length);grpdata=null;}else if(ts.p.treeGrid===true&&fpos>0){$(ts.rows[fpos]).after(rowData.join(''));}else{$('tbody:first',t).append(rowData.join(''));}}if(ts.p.subGrid===true){try{self.jqGrid('addSubGrid',gi+ni);}catch(_){}}ts.p.totaltime=new Date()-startReq;if(ir>0){if(ts.p.records===0){ts.p.records=gl;}}rowData=null;if(ts.p.treeGrid===true){try{self.jqGrid('setTreeNode',fpos+1,ir+fpos+1);}catch(e){}}if(!ts.p.treeGrid&&!ts.p.scroll){ts.grid.bDiv.scrollTop=0;}ts.p.reccount=ir;ts.p.treeANode=-1;if(ts.p.userDataOnFooter){self.jqGrid('footerData','set',ts.p.userData,true);}if(locdata){ts.p.records=gl;ts.p.lastpage=Math.ceil(gl/rn);}if(!more){ts.updatepager(false,true);}if(locdata){while(ir<gl){xmlr=gxml[ir];rid=getId(xmlr,ir+br);rid=ts.p.idPrefix+rid;if(xmlRd.repeatitems){if(!F){F=orderedCols(gi+si+ni);}var cells2=$.jgrid.getXmlData(xmlr,xmlRd.cell,true);$.each(F,function(k){var cell=cells2[this];if(!cell){return false;}v=cell.textContent||cell.text;rd[ts.p.colModel[k+gi+si+ni].name]=v;});}else{for(i=0;i<f.length;i++){v=$.jgrid.getXmlData(xmlr,f[i]);rd[ts.p.colModel[i+gi+si+ni].name]=v;}}rd[xmlid]=rid;ts.p.data.push(rd);ts.p._index[rid]=ts.p.data.length-1;rd={};ir++;}}},addJSONData=function addJSONData(data,t,rcnt,more,adjust){var startReq=new Date();if(data){if(ts.p.treeANode===-1&&!ts.p.scroll){emptyRows.call(ts,false,true);rcnt=1;}else{rcnt=rcnt>1?rcnt:1;}}else{return;}var dReader,locid='_id_',frd,locdata=ts.p.datatype!='local'&&ts.p.loadonce||ts.p.datatype=='jsonstring';if(locdata){ts.p.data=[];ts.p._index={};ts.p.localReader.id=locid;}ts.p.reccount=0;if(ts.p.datatype=='local'){dReader=ts.p.localReader;frd='local';}else{dReader=ts.p.jsonReader;frd='json';}var self=$(ts),ir=0,v,i,j,f=[],F,cur,gi=ts.p.multiselect?1:0,si=0,addSubGridCell,ni=ts.p.rownumbers===true?1:0,len,drows,idn,rd={},fpos,idr,rowData=[],cn=ts.p.altRows===true?' '+ts.p.altclass:'',cn1,lp;ts.p.page=$.jgrid.getAccessor(data,dReader.page)||ts.p.page||0;lp=$.jgrid.getAccessor(data,dReader.total);if(ts.p.subGrid===true){si=1;addSubGridCell=$.jgrid.getMethod('addSubGridCell');}ts.p.lastpage=lp===undefined?1:lp;ts.p.records=$.jgrid.getAccessor(data,dReader.records)||0;ts.p.userData=$.jgrid.getAccessor(data,dReader.userdata)||{};if(!dReader.repeatitems){F=f=reader(frd);}if(ts.p.keyIndex===false){idn=$.isFunction(dReader.id)?dReader.id.call(ts,data):dReader.id;}else{idn=ts.p.keyIndex;}if(f.length>0&&!isNaN(idn)){if(ts.p.remapColumns&&ts.p.remapColumns.length){idn=$.inArray(idn,ts.p.remapColumns);}idn=f[idn];}drows=$.jgrid.getAccessor(data,dReader.root);if(!drows){drows=[];}len=drows.length;i=0;if(len>0&&ts.p.page<=0){ts.p.page=1;}var rn=parseInt(ts.p.rowNum,10),br=ts.p.scroll?$.jgrid.randId():1,altr,selected=false,selr;if(adjust){rn*=adjust+1;}if(ts.p.datatype==='local'&&!ts.p.deselectAfterSort){selected=true;}var afterInsRow=$.isFunction(ts.p.afterInsertRow),grpdata=[],hiderow=false,groupingPrepare;if(ts.p.grouping){hiderow=ts.p.groupingView.groupCollapse===true;groupingPrepare=$.jgrid.getMethod('groupingPrepare');}while(i<len){cur=drows[i];idr=$.jgrid.getAccessor(cur,idn);if(idr===undefined){idr=br+i;if(f.length===0){if(dReader.cell){var ccur=$.jgrid.getAccessor(cur,dReader.cell);idr=ccur!==undefined?ccur[idn]||idr:idr;ccur=null;}}}idr=ts.p.idPrefix+idr;altr=rcnt===1?0:rcnt;cn1=(altr+i)%2==1?cn:'';if(selected){if(ts.p.multiselect){selr=$.inArray(idr,ts.p.selarrrow)!==-1;}else{selr=idr===ts.p.selrow;}}var iStartTrTag=rowData.length;rowData.push('');if(ni){rowData.push(addRowNum(0,i,ts.p.page,ts.p.rowNum));}if(gi){rowData.push(addMulti(idr,ni,i,selr));}if(si){rowData.push(addSubGridCell.call(self,gi+ni,i+rcnt));}if(dReader.repeatitems){if(dReader.cell){cur=$.jgrid.getAccessor(cur,dReader.cell);}if(!F){F=orderedCols(gi+si+ni);}}for(j=0;j<F.length;j++){v=$.jgrid.getAccessor(cur,F[j]);rd[ts.p.colModel[j+gi+si+ni].name]=v;rowData.push(addCell(idr,v,j+gi+si+ni,i+rcnt,cur,rd));}rowData[iStartTrTag]=constructTr(idr,hiderow,cn1,rd,cur,selr);rowData.push('</tr>');if(ts.p.grouping){grpdata=groupingPrepare.call(self,rowData,grpdata,rd,i);rowData=[];}if(locdata||ts.p.treeGrid===true){rd[locid]=idr;ts.p.data.push(rd);ts.p._index[idr]=ts.p.data.length-1;}if(ts.p.gridview===false){$('#'+$.jgrid.jqID(ts.p.id)+' tbody:first').append(rowData.join(''));self.triggerHandler('jqGridAfterInsertRow',[idr,rd,cur]);if(afterInsRow){ts.p.afterInsertRow.call(ts,idr,rd,cur);}rowData=[];//ari=0;\n}rd={};ir++;i++;if(ir==rn){break;}}if(ts.p.gridview===true){fpos=ts.p.treeANode>-1?ts.p.treeANode:0;if(ts.p.grouping){self.jqGrid('groupingRender',grpdata,ts.p.colModel.length);grpdata=null;}else if(ts.p.treeGrid===true&&fpos>0){$(ts.rows[fpos]).after(rowData.join(''));}else{$('#'+$.jgrid.jqID(ts.p.id)+' tbody:first').append(rowData.join(''));}}if(ts.p.subGrid===true){try{self.jqGrid('addSubGrid',gi+ni);}catch(_){}}ts.p.totaltime=new Date()-startReq;if(ir>0){if(ts.p.records===0){ts.p.records=len;}}rowData=null;if(ts.p.treeGrid===true){try{self.jqGrid('setTreeNode',fpos+1,ir+fpos+1);}catch(e){}}if(!ts.p.treeGrid&&!ts.p.scroll){ts.grid.bDiv.scrollTop=0;}ts.p.reccount=ir;ts.p.treeANode=-1;if(ts.p.userDataOnFooter){self.jqGrid('footerData','set',ts.p.userData,true);}if(locdata){ts.p.records=len;ts.p.lastpage=Math.ceil(len/rn);}if(!more){ts.updatepager(false,true);}if(locdata){while(ir<len&&drows[ir]){cur=drows[ir];idr=$.jgrid.getAccessor(cur,idn);if(idr===undefined){idr=br+ir;if(f.length===0){if(dReader.cell){var ccur2=$.jgrid.getAccessor(cur,dReader.cell);idr=ccur2[idn]||idr;ccur2=null;}}}if(cur){idr=ts.p.idPrefix+idr;if(dReader.repeatitems){if(dReader.cell){cur=$.jgrid.getAccessor(cur,dReader.cell);}if(!F){F=orderedCols(gi+si+ni);}}for(j=0;j<F.length;j++){v=$.jgrid.getAccessor(cur,F[j]);rd[ts.p.colModel[j+gi+si+ni].name]=v;}rd[locid]=idr;ts.p.data.push(rd);ts.p._index[idr]=ts.p.data.length-1;rd={};}ir++;}}},addLocalData=function addLocalData(){var st,fndsort=false,cmtypes={},grtypes=[],grindexes=[],srcformat,sorttype,newformat;if(!$.isArray(ts.p.data)){return;}var grpview=ts.p.grouping?ts.p.groupingView:false,lengrp,gin;$.each(ts.p.colModel,function(){sorttype=this.sorttype||'text';if(sorttype=='date'||sorttype=='datetime'){if(this.formatter&&typeof this.formatter==='string'&&this.formatter=='date'){if(this.formatoptions&&this.formatoptions.srcformat){srcformat=this.formatoptions.srcformat;}else{srcformat=$.jgrid.formatter.date.srcformat;}if(this.formatoptions&&this.formatoptions.newformat){newformat=this.formatoptions.newformat;}else{newformat=$.jgrid.formatter.date.newformat;}}else{srcformat=newformat=this.datefmt||'Y-m-d';}cmtypes[this.name]={'stype':sorttype,'srcfmt':srcformat,'newfmt':newformat};}else{cmtypes[this.name]={'stype':sorttype,'srcfmt':'','newfmt':''};}if(ts.p.grouping){for(gin=0,lengrp=grpview.groupField.length;gin<lengrp;gin++){if(this.name==grpview.groupField[gin]){var grindex=this.name;if(this.index){grindex=this.index;}grtypes[gin]=cmtypes[grindex];grindexes[gin]=grindex;}}}if(!fndsort&&(this.index==ts.p.sortname||this.name==ts.p.sortname)){st=this.name;// ???\nfndsort=true;}});if(ts.p.treeGrid){$(ts).jqGrid('SortTree',st,ts.p.sortorder,cmtypes[st].stype,cmtypes[st].srcfmt);return;}var compareFnMap={'eq':function eq(queryObj){return queryObj.equals;},'ne':function ne(queryObj){return queryObj.notEquals;},'lt':function lt(queryObj){return queryObj.less;},'le':function le(queryObj){return queryObj.lessOrEquals;},'gt':function gt(queryObj){return queryObj.greater;},'ge':function ge(queryObj){return queryObj.greaterOrEquals;},'cn':function cn(queryObj){return queryObj.contains;},'nc':function nc(queryObj,op){return op==='OR'?queryObj.orNot().contains:queryObj.andNot().contains;},'bw':function bw(queryObj){return queryObj.startsWith;},'bn':function bn(queryObj,op){return op==='OR'?queryObj.orNot().startsWith:queryObj.andNot().startsWith;},'en':function en(queryObj,op){return op==='OR'?queryObj.orNot().endsWith:queryObj.andNot().endsWith;},'ew':function ew(queryObj){return queryObj.endsWith;},'ni':function ni(queryObj,op){return op==='OR'?queryObj.orNot().equals:queryObj.andNot().equals;},'in':function _in(queryObj){return queryObj.equals;},'nu':function nu(queryObj){return queryObj.isNull;},'nn':function nn(queryObj,op){return op==='OR'?queryObj.orNot().isNull:queryObj.andNot().isNull;}},query=$.jgrid.from(ts.p.data);if(ts.p.ignoreCase){query=query.ignoreCase();}function tojLinq(group){var s=0,index,gor,ror,opr,rule;if(group.groups!=null){gor=group.groups.length&&group.groupOp.toString().toUpperCase()==='OR';if(gor){query.orBegin();}for(index=0;index<group.groups.length;index++){if(s>0&&gor){query.or();}try{tojLinq(group.groups[index]);}catch(e){alert(e);}s++;}if(gor){query.orEnd();}}if(group.rules!=null){//if(s>0) {\n//\tvar result = query.select();\n//\tquery = $.jgrid.from( result);\n//\tif (ts.p.ignoreCase) { query = query.ignoreCase(); }\n//}\ntry{ror=group.rules.length&&group.groupOp.toString().toUpperCase()==='OR';if(ror){query.orBegin();}for(index=0;index<group.rules.length;index++){rule=group.rules[index];opr=group.groupOp.toString().toUpperCase();if(compareFnMap[rule.op]&&rule.field){if(s>0&&opr&&opr==='OR'){query=query.or();}query=compareFnMap[rule.op](query,opr)(rule.field,rule.data,cmtypes[rule.field]);}s++;}if(ror){query.orEnd();}}catch(g){alert(g);}}}if(ts.p.search===true){var srules=ts.p.postData.filters;if(srules){if(typeof srules==='string'){srules=$.jgrid.parse(srules);}tojLinq(srules);}else{try{query=compareFnMap[ts.p.postData.searchOper](query)(ts.p.postData.searchField,ts.p.postData.searchString,cmtypes[ts.p.postData.searchField]);}catch(se){}}}if(ts.p.grouping){for(gin=0;gin<lengrp;gin++){query.orderBy(grindexes[gin],grpview.groupOrder[gin],grtypes[gin].stype,grtypes[gin].srcfmt);}}if(st&&ts.p.sortorder&&fndsort){if(ts.p.sortorder.toUpperCase()=='DESC'){query.orderBy(ts.p.sortname,'d',cmtypes[st].stype,cmtypes[st].srcfmt);}else{query.orderBy(ts.p.sortname,'a',cmtypes[st].stype,cmtypes[st].srcfmt);}}var queryResults=query.select(),recordsperpage=parseInt(ts.p.rowNum,10),total=queryResults.length,page=parseInt(ts.p.page,10),totalpages=Math.ceil(total/recordsperpage),retresult={};queryResults=queryResults.slice((page-1)*recordsperpage,page*recordsperpage);query=null;cmtypes=null;retresult[ts.p.localReader.total]=totalpages;retresult[ts.p.localReader.page]=page;retresult[ts.p.localReader.records]=total;retresult[ts.p.localReader.root]=queryResults;retresult[ts.p.localReader.userdata]=ts.p.userData;queryResults=null;return retresult;},updatepager=function updatepager(rn,dnd){var cp,last,base,from,to,tot,fmt,pgboxes='',sppg,tspg=ts.p.pager?'_'+$.jgrid.jqID(ts.p.pager.substr(1)):'',tspg_t=ts.p.toppager?'_'+ts.p.toppager.substr(1):'';base=parseInt(ts.p.page,10)-1;if(base<0){base=0;}base=base*parseInt(ts.p.rowNum,10);to=base+ts.p.reccount;if(ts.p.scroll){var rows=$('tbody:first > tr:gt(0)',ts.grid.bDiv);base=to-rows.length;ts.p.reccount=rows.length;var rh=rows.outerHeight()||ts.grid.prevRowHeight;if(rh){var top=base*rh;var height=parseInt(ts.p.records,10)*rh;$('>div:first',ts.grid.bDiv).css({height:height}).children('div:first').css({height:top,display:top?'':'none'});}ts.grid.bDiv.scrollLeft=ts.grid.hDiv.scrollLeft;}pgboxes=ts.p.pager||'';pgboxes+=ts.p.toppager?pgboxes?','+ts.p.toppager:ts.p.toppager:'';if(pgboxes){fmt=$.jgrid.formatter.integer||{};cp=intNum(ts.p.page);last=intNum(ts.p.lastpage);$('.selbox',pgboxes)[this.p.useProp?'prop':'attr']('disabled',false);if(ts.p.pginput===true){$('.ui-pg-input',pgboxes).val(ts.p.page);sppg=ts.p.toppager?'#sp_1'+tspg+',#sp_1'+tspg_t:'#sp_1'+tspg;$(sppg).html($.fmatter?$.fmatter.util.NumberFormat(ts.p.lastpage,fmt):ts.p.lastpage);}if(ts.p.viewrecords){if(ts.p.reccount===0){$('.ui-paging-info',pgboxes).html(ts.p.emptyrecords);}else{from=base+1;tot=ts.p.records;if($.fmatter){from=$.fmatter.util.NumberFormat(from,fmt);to=$.fmatter.util.NumberFormat(to,fmt);tot=$.fmatter.util.NumberFormat(tot,fmt);}$('.ui-paging-info',pgboxes).html($.jgrid.format(ts.p.recordtext,from,to,tot));}}if(ts.p.pgbuttons===true){if(cp<=0){cp=last=0;}if(cp==1||cp===0){$('#first'+tspg+', #prev'+tspg).addClass('ui-state-disabled').removeClass('ui-state-hover');if(ts.p.toppager){$('#first_t'+tspg_t+', #prev_t'+tspg_t).addClass('ui-state-disabled').removeClass('ui-state-hover');}}else{$('#first'+tspg+', #prev'+tspg).removeClass('ui-state-disabled');if(ts.p.toppager){$('#first_t'+tspg_t+', #prev_t'+tspg_t).removeClass('ui-state-disabled');}}if(cp==last||cp===0){$('#next'+tspg+', #last'+tspg).addClass('ui-state-disabled').removeClass('ui-state-hover');if(ts.p.toppager){$('#next_t'+tspg_t+', #last_t'+tspg_t).addClass('ui-state-disabled').removeClass('ui-state-hover');}}else{$('#next'+tspg+', #last'+tspg).removeClass('ui-state-disabled');if(ts.p.toppager){$('#next_t'+tspg_t+', #last_t'+tspg_t).removeClass('ui-state-disabled');}}}}if(rn===true&&ts.p.rownumbers===true){$('td.jqgrid-rownum',ts.rows).each(function(i){$(this).html(base+1+i);});}if(dnd&&ts.p.jqgdnd){$(ts).jqGrid('gridDnD','updateDnD');}$(ts).triggerHandler('jqGridGridComplete');if($.isFunction(ts.p.gridComplete)){ts.p.gridComplete.call(ts);}$(ts).triggerHandler('jqGridAfterGridComplete');},beginReq=function beginReq(){ts.grid.hDiv.loading=true;if(ts.p.hiddengrid){return;}switch(ts.p.loadui){case'disable':break;case'enable':$('#load_'+$.jgrid.jqID(ts.p.id)).show();break;case'block':$('#lui_'+$.jgrid.jqID(ts.p.id)).show();$('#load_'+$.jgrid.jqID(ts.p.id)).show();break;}},endReq=function endReq(){ts.grid.hDiv.loading=false;switch(ts.p.loadui){case'disable':break;case'enable':$('#load_'+$.jgrid.jqID(ts.p.id)).hide();break;case'block':$('#lui_'+$.jgrid.jqID(ts.p.id)).hide();$('#load_'+$.jgrid.jqID(ts.p.id)).hide();break;}},populate=function populate(npage){if(!ts.grid.hDiv.loading){var pvis=ts.p.scroll&&npage===false,prm={},dt,dstr,pN=ts.p.prmNames;if(ts.p.page<=0){ts.p.page=1;}if(pN.search!==null){prm[pN.search]=ts.p.search;}if(pN.nd!==null){prm[pN.nd]=new Date().getTime();}if(pN.rows!==null){prm[pN.rows]=ts.p.rowNum;}if(pN.page!==null){prm[pN.page]=ts.p.page;}if(pN.sort!==null){prm[pN.sort]=ts.p.sortname;}if(pN.order!==null){prm[pN.order]=ts.p.sortorder;}if(ts.p.rowTotal!==null&&pN.totalrows!==null){prm[pN.totalrows]=ts.p.rowTotal;}var lcf=$.isFunction(ts.p.loadComplete),lc=lcf?ts.p.loadComplete:null;var adjust=0;npage=npage||1;if(npage>1){if(pN.npage!==null){prm[pN.npage]=npage;adjust=npage-1;npage=1;}else{lc=function lc(req){ts.p.page++;ts.grid.hDiv.loading=false;if(lcf){ts.p.loadComplete.call(ts,req);}populate(npage-1);};}}else if(pN.npage!==null){delete ts.p.postData[pN.npage];}if(ts.p.grouping){$(ts).jqGrid('groupingSetup');var grp=ts.p.groupingView,gi,gs='';for(gi=0;gi<grp.groupField.length;gi++){var index=grp.groupField[gi];$.each(ts.p.colModel,function(cmIndex,cmValue){if(cmValue.name==index&&cmValue.index){index=cmValue.index;}});gs+=index+' '+grp.groupOrder[gi]+', ';}prm[pN.sort]=gs+prm[pN.sort];}$.extend(ts.p.postData,prm);var rcnt=!ts.p.scroll?1:ts.rows.length-1;var bfr=$(ts).triggerHandler('jqGridBeforeRequest');if(bfr===false||bfr==='stop'){return;}if($.isFunction(ts.p.datatype)){ts.p.datatype.call(ts,ts.p.postData,'load_'+ts.p.id);return;}if($.isFunction(ts.p.beforeRequest)){bfr=ts.p.beforeRequest.call(ts);if(bfr===undefined){bfr=true;}if(bfr===false){return;}}dt=ts.p.datatype.toLowerCase();switch(dt){case'json':case'jsonp':case'xml':case'script':$.ajax($.extend({url:ts.p.url,type:ts.p.mtype,dataType:dt,data:$.isFunction(ts.p.serializeGridData)?ts.p.serializeGridData.call(ts,ts.p.postData):ts.p.postData,success:function success(data,st,xhr){if($.isFunction(ts.p.beforeProcessing)){if(ts.p.beforeProcessing.call(ts,data,st,xhr)===false){endReq();return;}}if(dt==='xml'){addXmlData(data,ts.grid.bDiv,rcnt,npage>1,adjust);}else{addJSONData(data,ts.grid.bDiv,rcnt,npage>1,adjust);}$(ts).triggerHandler('jqGridLoadComplete',[data]);if(lc){lc.call(ts,data);}$(ts).triggerHandler('jqGridAfterLoadComplete',[data]);if(pvis){ts.grid.populateVisible();}if(ts.p.loadonce||ts.p.treeGrid){ts.p.datatype='local';}data=null;if(npage===1){endReq();}},error:function error(xhr,st,err){if($.isFunction(ts.p.loadError)){ts.p.loadError.call(ts,xhr,st,err);}if(npage===1){endReq();}xhr=null;},beforeSend:function beforeSend(xhr,settings){var gotoreq=true;if($.isFunction(ts.p.loadBeforeSend)){gotoreq=ts.p.loadBeforeSend.call(ts,xhr,settings);}if(gotoreq===undefined){gotoreq=true;}if(gotoreq===false){return false;}beginReq();}},$.jgrid.ajaxOptions,ts.p.ajaxGridOptions));break;case'xmlstring':beginReq();dstr=$.jgrid.stringToDoc(ts.p.datastr);addXmlData(dstr,ts.grid.bDiv);$(ts).triggerHandler('jqGridLoadComplete',[dstr]);if(lcf){ts.p.loadComplete.call(ts,dstr);}$(ts).triggerHandler('jqGridAfterLoadComplete',[dstr]);ts.p.datatype='local';ts.p.datastr=null;endReq();break;case'jsonstring':beginReq();if(typeof ts.p.datastr==='string'){dstr=$.jgrid.parse(ts.p.datastr);}else{dstr=ts.p.datastr;}addJSONData(dstr,ts.grid.bDiv);$(ts).triggerHandler('jqGridLoadComplete',[dstr]);if(lcf){ts.p.loadComplete.call(ts,dstr);}$(ts).triggerHandler('jqGridAfterLoadComplete',[dstr]);ts.p.datatype='local';ts.p.datastr=null;endReq();break;case'local':case'clientside':beginReq();ts.p.datatype='local';var req=addLocalData();addJSONData(req,ts.grid.bDiv,rcnt,npage>1,adjust);$(ts).triggerHandler('jqGridLoadComplete',[req]);if(lc){lc.call(ts,req);}$(ts).triggerHandler('jqGridAfterLoadComplete',[req]);if(pvis){ts.grid.populateVisible();}endReq();break;}}},setHeadCheckBox=function setHeadCheckBox(checked){$('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.hDiv)[ts.p.useProp?'prop':'attr']('checked',checked);var fid=ts.p.frozenColumns?ts.p.id+'_frozen':'';if(fid){$('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.fhDiv)[ts.p.useProp?'prop':'attr']('checked',checked);}},setPager=function setPager(pgid,tp){// TBD - consider escaping pgid with pgid = $.jgrid.jqID(pgid);\nvar sep='<td class=\\'ui-pg-button ui-state-disabled\\' style=\\'width:4px;\\'><span class=\\'ui-separator\\'></span></td>',pginp='',pgl='<table cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\' style=\\'table-layout:auto;\\' class=\\'ui-pg-table\\'><tbody><tr>',str='',pgcnt,lft,cent,rgt,twd,tdw,i,clearVals=function clearVals(onpaging){var ret;if($.isFunction(ts.p.onPaging)){ret=ts.p.onPaging.call(ts,onpaging);}ts.p.selrow=null;if(ts.p.multiselect){ts.p.selarrrow=[];setHeadCheckBox(false);}ts.p.savedRow=[];if(ret=='stop'){return false;}return true;};pgid=pgid.substr(1);tp+='_'+pgid;pgcnt='pg_'+pgid;lft=pgid+'_left';cent=pgid+'_center';rgt=pgid+'_right';$('#'+$.jgrid.jqID(pgid)).append('<div id=\\''+pgcnt+'\\' class=\\'ui-pager-control\\' role=\\'group\\'><table cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\' class=\\'ui-pg-table\\' style=\\'width:100%;table-layout:fixed;height:100%;\\' role=\\'row\\'><tbody><tr><td id=\\''+lft+'\\' align=\\'left\\'></td><td id=\\''+cent+'\\' align=\\'center\\' style=\\'white-space:pre;\\'></td><td id=\\''+rgt+'\\' align=\\'right\\'></td></tr></tbody></table></div>').attr('dir','ltr');//explicit setting\nif(ts.p.rowList.length>0){str='<td dir=\\''+dir+'\\'>';str+='<select class=\\'ui-pg-selbox\\' role=\\'listbox\\'>';for(i=0;i<ts.p.rowList.length;i++){str+='<option role=\"option\" value=\"'+ts.p.rowList[i]+'\"'+(ts.p.rowNum==ts.p.rowList[i]?' selected=\"selected\"':'')+'>'+ts.p.rowList[i]+'</option>';}str+='</select></td>';}if(dir=='rtl'){pgl+=str;}if(ts.p.pginput===true){pginp='<td dir=\\''+dir+'\\'>'+$.jgrid.format(ts.p.pgtext||'','<input class=\\'ui-pg-input\\' type=\\'text\\' size=\\'2\\' maxlength=\\'7\\' value=\\'0\\' role=\\'textbox\\'/>','<span id=\\'sp_1_'+$.jgrid.jqID(pgid)+'\\'></span>')+'</td>';}if(ts.p.pgbuttons===true){var po=['first'+tp,'prev'+tp,'next'+tp,'last'+tp];if(dir=='rtl'){po.reverse();}pgl+='<td id=\\''+po[0]+'\\' class=\\'ui-pg-button ui-corner-all\\'><span class=\\'ui-icon ui-icon-seek-first\\'></span></td>';pgl+='<td id=\\''+po[1]+'\\' class=\\'ui-pg-button ui-corner-all\\'><span class=\\'ui-icon ui-icon-seek-prev\\'></span></td>';pgl+=pginp!==''?sep+pginp+sep:'';pgl+='<td id=\\''+po[2]+'\\' class=\\'ui-pg-button ui-corner-all\\'><span class=\\'ui-icon ui-icon-seek-next\\'></span></td>';pgl+='<td id=\\''+po[3]+'\\' class=\\'ui-pg-button ui-corner-all\\'><span class=\\'ui-icon ui-icon-seek-end\\'></span></td>';}else if(pginp!==''){pgl+=pginp;}if(dir=='ltr'){pgl+=str;}pgl+='</tr></tbody></table>';if(ts.p.viewrecords===true){$('td#'+pgid+'_'+ts.p.recordpos,'#'+pgcnt).append('<div dir=\\''+dir+'\\' style=\\'text-align:'+ts.p.recordpos+'\\' class=\\'ui-paging-info\\'></div>');}$('td#'+pgid+'_'+ts.p.pagerpos,'#'+pgcnt).append(pgl);tdw=$('.ui-jqgrid').css('font-size')||'11px';$(document.body).append('<div id=\\'testpg\\' class=\\'ui-jqgrid ui-widget ui-widget-content\\' style=\\'font-size:'+tdw+';visibility:hidden;\\' ></div>');twd=$(pgl).clone().appendTo('#testpg').width();$('#testpg').remove();if(twd>0){if(pginp!==''){twd+=50;}//should be param\n$('td#'+pgid+'_'+ts.p.pagerpos,'#'+pgcnt).width(twd);}ts.p._nvtd=[];ts.p._nvtd[0]=twd?Math.floor((ts.p.width-twd)/2):Math.floor(ts.p.width/3);ts.p._nvtd[1]=0;pgl=null;$('.ui-pg-selbox','#'+pgcnt).bind('change',function(){if(!clearVals('records')){return false;}ts.p.page=Math.round(ts.p.rowNum*(ts.p.page-1)/this.value-0.5)+1;ts.p.rowNum=this.value;if(ts.p.pager){$('.ui-pg-selbox',ts.p.pager).val(this.value);}if(ts.p.toppager){$('.ui-pg-selbox',ts.p.toppager).val(this.value);}populate();return false;});if(ts.p.pgbuttons===true){$('.ui-pg-button','#'+pgcnt).hover(function(){if($(this).hasClass('ui-state-disabled')){this.style.cursor='default';}else{$(this).addClass('ui-state-hover');this.style.cursor='pointer';}},function(){if(!$(this).hasClass('ui-state-disabled')){$(this).removeClass('ui-state-hover');this.style.cursor='default';}});$('#first'+$.jgrid.jqID(tp)+', #prev'+$.jgrid.jqID(tp)+', #next'+$.jgrid.jqID(tp)+', #last'+$.jgrid.jqID(tp)).click(function(){var cp=intNum(ts.p.page,1),last=intNum(ts.p.lastpage,1),selclick=false,fp=true,pp=true,np=true,lp=true;if(last===0||last===1){fp=false;pp=false;np=false;lp=false;}else if(last>1&&cp>=1){if(cp===1){fp=false;pp=false;}//else if( cp>1 && cp <last){ }\nelse if(cp===last){np=false;lp=false;}}else if(last>1&&cp===0){np=false;lp=false;cp=last-1;}if(!clearVals(this.id)){return false;}if(this.id==='first'+tp&&fp){ts.p.page=1;selclick=true;}if(this.id==='prev'+tp&&pp){ts.p.page=cp-1;selclick=true;}if(this.id==='next'+tp&&np){ts.p.page=cp+1;selclick=true;}if(this.id==='last'+tp&&lp){ts.p.page=last;selclick=true;}if(selclick){populate();}return false;});}if(ts.p.pginput===true){$('input.ui-pg-input','#'+pgcnt).keypress(function(e){var key=e.charCode||e.keyCode||0;if(key==13){if(!clearVals('user')){return false;}ts.p.page=$(this).val()>0?$(this).val():ts.p.page;populate();return false;}return this;});}},sortData=function sortData(index,idxcol,reload,sor){if(!ts.p.colModel[idxcol].sortable){return;}var so;if(ts.p.savedRow.length>0){return;}if(!reload){if(ts.p.lastsort==idxcol){if(ts.p.sortorder=='asc'){ts.p.sortorder='desc';}else if(ts.p.sortorder=='desc'){ts.p.sortorder='asc';}}else{ts.p.sortorder=ts.p.colModel[idxcol].firstsortorder||'asc';}ts.p.page=1;}if(sor){if(ts.p.lastsort==idxcol&&ts.p.sortorder==sor&&!reload){return;}ts.p.sortorder=sor;}var previousSelectedTh=ts.grid.headers[ts.p.lastsort].el,newSelectedTh=ts.grid.headers[idxcol].el;$('span.ui-grid-ico-sort',previousSelectedTh).addClass('ui-state-disabled');$(previousSelectedTh).attr('aria-selected','false');$('span.ui-icon-'+ts.p.sortorder,newSelectedTh).removeClass('ui-state-disabled');$(newSelectedTh).attr('aria-selected','true');if(!ts.p.viewsortcols[0]){if(ts.p.lastsort!=idxcol){$('span.s-ico',previousSelectedTh).hide();$('span.s-ico',newSelectedTh).show();}}index=index.substring(5+ts.p.id.length+1);// bad to be changed!?!\nts.p.sortname=ts.p.colModel[idxcol].index||index;so=ts.p.sortorder;if($(ts).triggerHandler('jqGridSortCol',[index,idxcol,so])==='stop'){ts.p.lastsort=idxcol;return;}if($.isFunction(ts.p.onSortCol)){if(ts.p.onSortCol.call(ts,index,idxcol,so)=='stop'){ts.p.lastsort=idxcol;return;}}if(ts.p.datatype=='local'){if(ts.p.deselectAfterSort){$(ts).jqGrid('resetSelection');}}else{ts.p.selrow=null;if(ts.p.multiselect){setHeadCheckBox(false);}ts.p.selarrrow=[];ts.p.savedRow=[];}if(ts.p.scroll){var sscroll=ts.grid.bDiv.scrollLeft;emptyRows.call(ts,true,false);ts.grid.hDiv.scrollLeft=sscroll;}if(ts.p.subGrid&&ts.p.datatype=='local'){$('td.sgexpanded','#'+$.jgrid.jqID(ts.p.id)).each(function(){$(this).trigger('click');});}populate();ts.p.lastsort=idxcol;if(ts.p.sortname!=index&&idxcol){ts.p.lastsort=idxcol;}},setColWidth=function setColWidth(){var initwidth=0,brd=$.jgrid.cell_width?0:intNum(ts.p.cellLayout,0),vc=0,lvc,scw=intNum(ts.p.scrollOffset,0),cw,hs=false,aw,gw=0,cl=0,cr;$.each(ts.p.colModel,function(){if(this.hidden===undefined){this.hidden=false;}if(ts.p.grouping&&ts.p.autowidth){var ind=$.inArray(this.name,ts.p.groupingView.groupField);if(ind!==-1){this.hidden=!ts.p.groupingView.groupColumnShow[ind];}}this.widthOrg=cw=intNum(this.width,0);if(this.hidden===false){initwidth+=cw+brd;if(this.fixed){gw+=cw+brd;}else{vc++;}cl++;}});if(isNaN(ts.p.width)){ts.p.width=initwidth+(ts.p.shrinkToFit===false&&!isNaN(ts.p.height)?scw:0);}grid.width=ts.p.width;ts.p.tblwidth=initwidth;if(ts.p.shrinkToFit===false&&ts.p.forceFit===true){ts.p.forceFit=false;}if(ts.p.shrinkToFit===true&&vc>0){aw=grid.width-brd*vc-gw;if(!isNaN(ts.p.height)){aw-=scw;hs=true;}initwidth=0;$.each(ts.p.colModel,function(i){if(this.hidden===false&&!this.fixed){cw=Math.round(aw*this.width/(ts.p.tblwidth-brd*vc-gw));this.width=cw;initwidth+=cw;lvc=i;}});cr=0;if(hs){if(grid.width-gw-(initwidth+brd*vc)!==scw){cr=grid.width-gw-(initwidth+brd*vc)-scw;}}else if(!hs&&Math.abs(grid.width-gw-(initwidth+brd*vc))!==1){cr=grid.width-gw-(initwidth+brd*vc);}ts.p.colModel[lvc].width+=cr;ts.p.tblwidth=initwidth+cr+brd*vc+gw;if(ts.p.tblwidth>ts.p.width){ts.p.colModel[lvc].width-=ts.p.tblwidth-parseInt(ts.p.width,10);ts.p.tblwidth=ts.p.width;}}},nextVisible=function nextVisible(iCol){var ret=iCol,j=iCol,i;for(i=iCol+1;i<ts.p.colModel.length;i++){if(ts.p.colModel[i].hidden!==true){j=i;break;}}return j-ret;},getOffset=function getOffset(iCol){var i,ret=[0],brd1=$.jgrid.cell_width?0:ts.p.cellLayout;for(i=0;i<=iCol;i++){if(ts.p.colModel[i].hidden===false){ret[0]+=ts.p.colModel[i].width+brd1;}}if(ts.p.direction=='rtl'){ret[0]=ts.p.width-ret[0];}ret[0]-=ts.grid.bDiv.scrollLeft;ret.push($(ts.grid.hDiv).position().top);ret.push($(ts.grid.bDiv).offset().top-$(ts.grid.hDiv).offset().top+$(ts.grid.bDiv).height());return ret;},getColumnHeaderIndex=function getColumnHeaderIndex(th){var i,headers=ts.grid.headers,ci=$.jgrid.getCellIndex(th);for(i=0;i<headers.length;i++){if(th===headers[i].el){ci=i;break;}}return ci;};this.p.id=this.id;if($.inArray(ts.p.multikey,sortkeys)==-1){ts.p.multikey=false;}ts.p.keyIndex=false;for(i=0;i<ts.p.colModel.length;i++){ts.p.colModel[i]=$.extend(true,{},ts.p.cmTemplate,ts.p.colModel[i].template||{},ts.p.colModel[i]);if(ts.p.keyIndex===false&&ts.p.colModel[i].key===true){ts.p.keyIndex=i;}}ts.p.sortorder=ts.p.sortorder.toLowerCase();$.jgrid.cell_width=$.jgrid.cellWidth();if(ts.p.grouping===true){ts.p.scroll=false;ts.p.rownumbers=false;//ts.p.subGrid = false; expiremental\n//\t\t\tts.p.treeGrid = false;\nts.p.gridview=true;}if(this.p.treeGrid===true){try{$(this).jqGrid('setTreeGrid');}catch(_){}if(ts.p.datatype!='local'){ts.p.localReader={id:'_id_'};}}if(this.p.subGrid){try{$(ts).jqGrid('setSubGrid');}catch(s){}}if(this.p.multiselect){this.p.colNames.unshift('<input role=\\'checkbox\\' id=\\'cb_'+this.p.id+'\\' class=\\'cbox\\' type=\\'checkbox\\'/>');this.p.colModel.unshift({name:'cb',width:$.jgrid.cell_width?ts.p.multiselectWidth+ts.p.cellLayout:ts.p.multiselectWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true});}if(this.p.rownumbers){this.p.colNames.unshift('');this.p.colModel.unshift({name:'rn',width:ts.p.rownumWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true});}ts.p.xmlReader=$.extend(true,{root:'rows',row:'row',page:'rows>page',total:'rows>total',records:'rows>records',repeatitems:true,cell:'cell',id:'[id]',userdata:'userdata',subgrid:{root:'rows',row:'row',repeatitems:true,cell:'cell'}},ts.p.xmlReader);ts.p.jsonReader=$.extend(true,{root:'rows',page:'page',total:'total',records:'records',repeatitems:true,cell:'cell',id:'id',userdata:'userdata',subgrid:{root:'rows',repeatitems:true,cell:'cell'}},ts.p.jsonReader);ts.p.localReader=$.extend(true,{root:'rows',page:'page',total:'total',records:'records',repeatitems:false,cell:'cell',id:'id',userdata:'userdata',subgrid:{root:'rows',repeatitems:true,cell:'cell'}},ts.p.localReader);if(ts.p.scroll){ts.p.pgbuttons=false;ts.p.pginput=false;ts.p.rowList=[];}if(ts.p.data.length){refreshIndex();}var thead='<thead><tr class=\\'ui-jqgrid-labels\\' role=\\'rowheader\\'>',tdc,idn,w,res,sort,td,ptr,tbody,imgs,iac='',idc='';if(ts.p.shrinkToFit===true&&ts.p.forceFit===true){for(i=ts.p.colModel.length-1;i>=0;i--){if(!ts.p.colModel[i].hidden){ts.p.colModel[i].resizable=false;break;}}}if(ts.p.viewsortcols[1]=='horizontal'){iac=' ui-i-asc';idc=' ui-i-desc';}tdc=isMSIE?'class=\\'ui-th-div-ie\\'':'';imgs='<span class=\\'s-ico\\' style=\\'display:none\\'><span sort=\\'asc\\' class=\\'ui-grid-ico-sort ui-icon-asc'+iac+' ui-state-disabled ui-icon ui-icon-triangle-1-n ui-sort-'+dir+'\\'></span>';imgs+='<span sort=\\'desc\\' class=\\'ui-grid-ico-sort ui-icon-desc'+idc+' ui-state-disabled ui-icon ui-icon-triangle-1-s ui-sort-'+dir+'\\'></span></span>';for(i=0;i<this.p.colNames.length;i++){var tooltip=ts.p.headertitles?' title=\"'+$.jgrid.stripHtml(ts.p.colNames[i])+'\"':'';thead+='<th id=\\''+ts.p.id+'_'+ts.p.colModel[i].name+'\\' role=\\'columnheader\\' class=\\'ui-state-default ui-th-column ui-th-'+dir+'\\''+tooltip+'>';idn=ts.p.colModel[i].index||ts.p.colModel[i].name;thead+='<div id=\\'jqgh_'+ts.p.id+'_'+ts.p.colModel[i].name+'\\' '+tdc+'>'+ts.p.colNames[i];if(!ts.p.colModel[i].width){ts.p.colModel[i].width=150;}else{ts.p.colModel[i].width=parseInt(ts.p.colModel[i].width,10);}if(typeof ts.p.colModel[i].title!=='boolean'){ts.p.colModel[i].title=true;}if(idn==ts.p.sortname){ts.p.lastsort=i;}thead+=imgs+'</div></th>';}thead+='</tr></thead>';imgs=null;$(this).append(thead);$('thead tr:first th',this).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});if(this.p.multiselect){var emp=[],chk;$('#cb_'+$.jgrid.jqID(ts.p.id),this).bind('click',function(){ts.p.selarrrow=[];var froz=ts.p.frozenColumns===true?ts.p.id+'_frozen':'';if(this.checked){$(ts.rows).each(function(i){if(i>0){if(!$(this).hasClass('ui-subgrid')&&!$(this).hasClass('jqgroup')&&!$(this).hasClass('ui-state-disabled')){$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+$.jgrid.jqID(this.id))[ts.p.useProp?'prop':'attr']('checked',true);$(this).addClass('ui-state-highlight').attr('aria-selected','true');ts.p.selarrrow.push(this.id);ts.p.selrow=this.id;if(froz){$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+$.jgrid.jqID(this.id),ts.grid.fbDiv)[ts.p.useProp?'prop':'attr']('checked',true);$('#'+$.jgrid.jqID(this.id),ts.grid.fbDiv).addClass('ui-state-highlight');}}}});chk=true;emp=[];}else{$(ts.rows).each(function(i){if(i>0){if(!$(this).hasClass('ui-subgrid')&&!$(this).hasClass('ui-state-disabled')){$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+$.jgrid.jqID(this.id))[ts.p.useProp?'prop':'attr']('checked',false);$(this).removeClass('ui-state-highlight').attr('aria-selected','false');emp.push(this.id);if(froz){$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+$.jgrid.jqID(this.id),ts.grid.fbDiv)[ts.p.useProp?'prop':'attr']('checked',false);$('#'+$.jgrid.jqID(this.id),ts.grid.fbDiv).removeClass('ui-state-highlight');}}}});ts.p.selrow=null;chk=false;}$(ts).triggerHandler('jqGridSelectAll',[chk?ts.p.selarrrow:emp,chk]);if($.isFunction(ts.p.onSelectAll)){ts.p.onSelectAll.call(ts,chk?ts.p.selarrrow:emp,chk);}});}if(ts.p.autowidth===true){var pw=$(eg).innerWidth();ts.p.width=pw>0?pw:'nw';}setColWidth();$(eg).css('width',grid.width+'px').append('<div class=\\'ui-jqgrid-resize-mark\\' id=\\'rs_m'+ts.p.id+'\\'>&#160;</div>');$(gv).css('width',grid.width+'px');thead=$('thead:first',ts).get(0);var tfoot='';if(ts.p.footerrow){tfoot+='<table role=\\'grid\\' style=\\'width:'+ts.p.tblwidth+'px\\' class=\\'ui-jqgrid-ftable\\' cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\'><tbody><tr role=\\'row\\' class=\\'ui-widget-content footrow footrow-'+dir+'\\'>';}var thr=$('tr:first',thead),firstr='<tr class=\\'jqgfirstrow\\' role=\\'row\\' style=\\'height:auto\\'>';ts.p.disableClick=false;$('th',thr).each(function(j){w=ts.p.colModel[j].width;if(ts.p.colModel[j].resizable===undefined){ts.p.colModel[j].resizable=true;}if(ts.p.colModel[j].resizable){res=document.createElement('span');$(res).html('&#160;').addClass('ui-jqgrid-resize ui-jqgrid-resize-'+dir).css('cursor','col-resize');$(this).addClass(ts.p.resizeclass);}else{res='';}$(this).css('width',w+'px').prepend(res);var hdcol='';if(ts.p.colModel[j].hidden){$(this).css('display','none');hdcol='display:none;';}firstr+='<td role=\\'gridcell\\' style=\\'height:0px;width:'+w+'px;'+hdcol+'\\'></td>';grid.headers[j]={width:w,el:this};sort=ts.p.colModel[j].sortable;if(typeof sort!=='boolean'){ts.p.colModel[j].sortable=true;sort=true;}var nm=ts.p.colModel[j].name;if(!(nm=='cb'||nm=='subgrid'||nm=='rn')){if(ts.p.viewsortcols[2]){$('>div',this).addClass('ui-jqgrid-sortable');}}if(sort){if(ts.p.viewsortcols[0]){$('div span.s-ico',this).show();if(j==ts.p.lastsort){$('div span.ui-icon-'+ts.p.sortorder,this).removeClass('ui-state-disabled');}}else if(j==ts.p.lastsort){$('div span.s-ico',this).show();$('div span.ui-icon-'+ts.p.sortorder,this).removeClass('ui-state-disabled');}}if(ts.p.footerrow){tfoot+='<td role=\\'gridcell\\' '+formatCol(j,0,'',null,'',false)+'>&#160;</td>';}}).mousedown(function(e){if($(e.target).closest('th>span.ui-jqgrid-resize').length!=1){return;}var ci=getColumnHeaderIndex(this);if(ts.p.forceFit===true){ts.p.nv=nextVisible(ci);}grid.dragStart(ci,e,getOffset(ci));return false;}).click(function(e){if(ts.p.disableClick){ts.p.disableClick=false;return false;}var s='th>div.ui-jqgrid-sortable',r,d;if(!ts.p.viewsortcols[2]){s='th>div>span>span.ui-grid-ico-sort';}var t=$(e.target).closest(s);if(t.length!=1){return;}var ci=getColumnHeaderIndex(this);if(!ts.p.viewsortcols[2]){r=true;d=t.attr('sort');}sortData($('div',this)[0].id,ci,r,d);return false;});if(ts.p.sortable&&$.fn.sortable){try{$(ts).jqGrid('sortableColumns',thr);}catch(e){}}if(ts.p.footerrow){tfoot+='</tr></tbody></table>';}firstr+='</tr>';tbody=document.createElement('tbody');this.appendChild(tbody);$(this).addClass('ui-jqgrid-btable').append(firstr);firstr=null;var hTable=$('<table class=\\'ui-jqgrid-htable\\' style=\\'width:'+ts.p.tblwidth+'px\\' role=\\'grid\\' aria-labelledby=\\'gbox_'+this.id+'\\' cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\'></table>').append(thead),hg=ts.p.caption&&ts.p.hiddengrid===true?true:false,hb=$('<div class=\\'ui-jqgrid-hbox'+(dir=='rtl'?'-rtl':'')+'\\'></div>');thead=null;grid.hDiv=document.createElement('div');$(grid.hDiv).css({width:grid.width+'px'}).addClass('ui-state-default ui-jqgrid-hdiv').append(hb);$(hb).append(hTable);hTable=null;if(hg){$(grid.hDiv).hide();}if(ts.p.pager){// TBD -- escape ts.p.pager here?\nif(typeof ts.p.pager==='string'){if(ts.p.pager.substr(0,1)!='#'){ts.p.pager='#'+ts.p.pager;}}else{ts.p.pager='#'+$(ts.p.pager).attr('id');}$(ts.p.pager).css({width:grid.width+'px'}).addClass('ui-state-default ui-jqgrid-pager ui-corner-bottom').appendTo(eg);if(hg){$(ts.p.pager).hide();}setPager(ts.p.pager,'');}if(ts.p.cellEdit===false&&ts.p.hoverrows===true){$(ts).bind('mouseover',function(e){ptr=$(e.target).closest('tr.jqgrow');if($(ptr).attr('class')!=='ui-subgrid'){$(ptr).addClass('ui-state-hover');}}).bind('mouseout',function(e){ptr=$(e.target).closest('tr.jqgrow');$(ptr).removeClass('ui-state-hover');});}var ri,ci,tdHtml;$(ts).before(grid.hDiv).click(function(e){td=e.target;ptr=$(td,ts.rows).closest('tr.jqgrow');if($(ptr).length===0||ptr[0].className.indexOf('ui-state-disabled')>-1||($(td,ts).closest('table.ui-jqgrid-btable').attr('id')||'').replace('_frozen','')!==ts.id){return this;}var scb=$(td).hasClass('cbox'),cSel=$(ts).triggerHandler('jqGridBeforeSelectRow',[ptr[0].id,e]);cSel=cSel===false||cSel==='stop'?false:true;if(cSel&&$.isFunction(ts.p.beforeSelectRow)){cSel=ts.p.beforeSelectRow.call(ts,ptr[0].id,e);}if(td.tagName=='A'||(td.tagName=='INPUT'||td.tagName=='TEXTAREA'||td.tagName=='OPTION'||td.tagName=='SELECT')&&!scb){return;}if(cSel===true){ri=ptr[0].id;ci=$.jgrid.getCellIndex(td);tdHtml=$(td).closest('td,th').html();$(ts).triggerHandler('jqGridCellSelect',[ri,ci,tdHtml,e]);if($.isFunction(ts.p.onCellSelect)){ts.p.onCellSelect.call(ts,ri,ci,tdHtml,e);}if(ts.p.cellEdit===true){if(ts.p.multiselect&&scb){$(ts).jqGrid('setSelection',ri,true,e);}else{ri=ptr[0].rowIndex;try{$(ts).jqGrid('editCell',ri,ci,true);}catch(_){}}}else if(!ts.p.multikey){if(ts.p.multiselect&&ts.p.multiboxonly){if(scb){$(ts).jqGrid('setSelection',ri,true,e);}else{var frz=ts.p.frozenColumns?ts.p.id+'_frozen':'';$(ts.p.selarrrow).each(function(i,n){var ind=ts.rows.namedItem(n);$(ind).removeClass('ui-state-highlight');$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+$.jgrid.jqID(n))[ts.p.useProp?'prop':'attr']('checked',false);if(frz){$('#'+$.jgrid.jqID(n),'#'+$.jgrid.jqID(frz)).removeClass('ui-state-highlight');$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+$.jgrid.jqID(n),'#'+$.jgrid.jqID(frz))[ts.p.useProp?'prop':'attr']('checked',false);}});ts.p.selarrrow=[];$(ts).jqGrid('setSelection',ri,true,e);}}else{$(ts).jqGrid('setSelection',ri,true,e);}}else{if(e[ts.p.multikey]){$(ts).jqGrid('setSelection',ri,true,e);}else if(ts.p.multiselect&&scb){scb=$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+ri).is(':checked');$('#jqg_'+$.jgrid.jqID(ts.p.id)+'_'+ri)[ts.p.useProp?'prop':'attr']('checked',scb);}}}}).bind('reloadGrid',function(e,opts){if(ts.p.treeGrid===true){ts.p.datatype=ts.p.treedatatype;}if(opts&&opts.current){ts.grid.selectionPreserver(ts);}if(ts.p.datatype=='local'){$(ts).jqGrid('resetSelection');if(ts.p.data.length){refreshIndex();}}else if(!ts.p.treeGrid){ts.p.selrow=null;if(ts.p.multiselect){ts.p.selarrrow=[];setHeadCheckBox(false);}ts.p.savedRow=[];}if(ts.p.scroll){emptyRows.call(ts,true,false);}if(opts&&opts.page){var page=opts.page;if(page>ts.p.lastpage){page=ts.p.lastpage;}if(page<1){page=1;}ts.p.page=page;if(ts.grid.prevRowHeight){ts.grid.bDiv.scrollTop=(page-1)*ts.grid.prevRowHeight*ts.p.rowNum;}else{ts.grid.bDiv.scrollTop=0;}}if(ts.grid.prevRowHeight&&ts.p.scroll){delete ts.p.lastpage;ts.grid.populateVisible();}else{ts.grid.populate();}if(ts.p._inlinenav===true){$(ts).jqGrid('showAddEditButtons');}return false;}).dblclick(function(e){td=e.target;ptr=$(td,ts.rows).closest('tr.jqgrow');if($(ptr).length===0){return;}ri=ptr[0].rowIndex;ci=$.jgrid.getCellIndex(td);$(ts).triggerHandler('jqGridDblClickRow',[$(ptr).attr('id'),ri,ci,e]);if($.isFunction(this.p.ondblClickRow)){ts.p.ondblClickRow.call(ts,$(ptr).attr('id'),ri,ci,e);}}).bind('contextmenu',function(e){td=e.target;ptr=$(td,ts.rows).closest('tr.jqgrow');if($(ptr).length===0){return;}if(!ts.p.multiselect){$(ts).jqGrid('setSelection',ptr[0].id,true,e);}ri=ptr[0].rowIndex;ci=$.jgrid.getCellIndex(td);$(ts).triggerHandler('jqGridRightClickRow',[$(ptr).attr('id'),ri,ci,e]);if($.isFunction(this.p.onRightClickRow)){ts.p.onRightClickRow.call(ts,$(ptr).attr('id'),ri,ci,e);}});grid.bDiv=document.createElement('div');if(isMSIE){if(String(ts.p.height).toLowerCase()==='auto'){ts.p.height='100%';}}$(grid.bDiv).append($('<div style=\"position:relative;'+(isMSIE&&$.jgrid.msiever()<8?'height:0.01%;':'')+'\"></div>').append('<div></div>').append(this)).addClass('ui-jqgrid-bdiv').css({height:ts.p.height+(isNaN(ts.p.height)?'':'px'),width:grid.width+'px'}).scroll(grid.scrollGrid);$('table:first',grid.bDiv).css({width:ts.p.tblwidth+'px'});if(!$.support.tbody){//IE\nif($('tbody',this).length==2){$('tbody:gt(0)',this).remove();}}if(ts.p.multikey){if($.jgrid.msie){$(grid.bDiv).bind('selectstart',function(){return false;});}else{$(grid.bDiv).bind('mousedown',function(){return false;});}}if(hg){$(grid.bDiv).hide();}grid.cDiv=document.createElement('div');var arf=ts.p.hidegrid===true?$('<a role=\\'link\\' href=\\'javascript:void(0)\\'></a>').addClass('ui-jqgrid-titlebar-close HeaderButton').hover(function(){arf.addClass('ui-state-hover');},function(){arf.removeClass('ui-state-hover');}).append('<span class=\\'ui-icon ui-icon-circle-triangle-n\\'></span>').css(dir=='rtl'?'left':'right','0px'):'';$(grid.cDiv).append(arf).append('<span class=\\'ui-jqgrid-title'+(dir=='rtl'?'-rtl':'')+'\\'>'+ts.p.caption+'</span>').addClass('ui-jqgrid-titlebar ui-widget-header ui-corner-top ui-helper-clearfix');$(grid.cDiv).insertBefore(grid.hDiv);if(ts.p.toolbar[0]){grid.uDiv=document.createElement('div');if(ts.p.toolbar[1]=='top'){$(grid.uDiv).insertBefore(grid.hDiv);}else if(ts.p.toolbar[1]=='bottom'){$(grid.uDiv).insertAfter(grid.hDiv);}if(ts.p.toolbar[1]=='both'){grid.ubDiv=document.createElement('div');$(grid.uDiv).addClass('ui-userdata ui-state-default').attr('id','t_'+this.id).insertBefore(grid.hDiv);$(grid.ubDiv).addClass('ui-userdata ui-state-default').attr('id','tb_'+this.id).insertAfter(grid.hDiv);if(hg){$(grid.ubDiv).hide();}}else{$(grid.uDiv).width(grid.width).addClass('ui-userdata ui-state-default').attr('id','t_'+this.id);}if(hg){$(grid.uDiv).hide();}}if(ts.p.toppager){ts.p.toppager=$.jgrid.jqID(ts.p.id)+'_toppager';grid.topDiv=$('<div id=\\''+ts.p.toppager+'\\'></div>')[0];ts.p.toppager='#'+ts.p.toppager;$(grid.topDiv).addClass('ui-state-default ui-jqgrid-toppager').width(grid.width).insertBefore(grid.hDiv);setPager(ts.p.toppager,'_t');}if(ts.p.footerrow){grid.sDiv=$('<div class=\\'ui-jqgrid-sdiv\\'></div>')[0];hb=$('<div class=\\'ui-jqgrid-hbox'+(dir=='rtl'?'-rtl':'')+'\\'></div>');$(grid.sDiv).append(hb).width(grid.width).insertAfter(grid.hDiv);$(hb).append(tfoot);grid.footers=$('.ui-jqgrid-ftable',grid.sDiv)[0].rows[0].cells;if(ts.p.rownumbers){grid.footers[0].className='ui-state-default jqgrid-rownum';}if(hg){$(grid.sDiv).hide();}}hb=null;if(ts.p.caption){var tdt=ts.p.datatype;if(ts.p.hidegrid===true){$('.ui-jqgrid-titlebar-close',grid.cDiv).click(function(e){var onHdCl=$.isFunction(ts.p.onHeaderClick),elems='.ui-jqgrid-bdiv, .ui-jqgrid-hdiv, .ui-jqgrid-pager, .ui-jqgrid-sdiv',counter,self=this;if(ts.p.toolbar[0]===true){if(ts.p.toolbar[1]=='both'){elems+=', #'+$(grid.ubDiv).attr('id');}elems+=', #'+$(grid.uDiv).attr('id');}counter=$(elems,'#gview_'+$.jgrid.jqID(ts.p.id)).length;if(ts.p.gridstate=='visible'){$(elems,'#gbox_'+$.jgrid.jqID(ts.p.id)).slideUp('fast',function(){counter--;if(counter===0){$('span',self).removeClass('ui-icon-circle-triangle-n').addClass('ui-icon-circle-triangle-s');ts.p.gridstate='hidden';if($('#gbox_'+$.jgrid.jqID(ts.p.id)).hasClass('ui-resizable')){$('.ui-resizable-handle','#gbox_'+$.jgrid.jqID(ts.p.id)).hide();}$(ts).triggerHandler('jqGridHeaderClick',[ts.p.gridstate,e]);if(onHdCl){if(!hg){ts.p.onHeaderClick.call(ts,ts.p.gridstate,e);}}}});}else if(ts.p.gridstate=='hidden'){$(elems,'#gbox_'+$.jgrid.jqID(ts.p.id)).slideDown('fast',function(){counter--;if(counter===0){$('span',self).removeClass('ui-icon-circle-triangle-s').addClass('ui-icon-circle-triangle-n');if(hg){ts.p.datatype=tdt;populate();hg=false;}ts.p.gridstate='visible';if($('#gbox_'+$.jgrid.jqID(ts.p.id)).hasClass('ui-resizable')){$('.ui-resizable-handle','#gbox_'+$.jgrid.jqID(ts.p.id)).show();}$(ts).triggerHandler('jqGridHeaderClick',[ts.p.gridstate,e]);if(onHdCl){if(!hg){ts.p.onHeaderClick.call(ts,ts.p.gridstate,e);}}}});}return false;});if(hg){ts.p.datatype='local';$('.ui-jqgrid-titlebar-close',grid.cDiv).trigger('click');}}}else{$(grid.cDiv).hide();}$(grid.hDiv).after(grid.bDiv).mousemove(function(e){if(grid.resizing){grid.dragMove(e);return false;}});$('.ui-jqgrid-labels',grid.hDiv).bind('selectstart',function(){return false;});$(document).mouseup(function(){if(grid.resizing){grid.dragEnd();return false;}return true;});ts.formatCol=formatCol;ts.sortData=sortData;ts.updatepager=updatepager;ts.refreshIndex=refreshIndex;ts.setHeadCheckBox=setHeadCheckBox;ts.constructTr=constructTr;ts.formatter=function(rowId,cellval,colpos,rwdat,act){return formatter(rowId,cellval,colpos,rwdat,act);};$.extend(grid,{populate:populate,emptyRows:emptyRows});this.grid=grid;ts.addXmlData=function(d){addXmlData(d,ts.grid.bDiv);};ts.addJSONData=function(d){addJSONData(d,ts.grid.bDiv);};this.grid.cols=this.rows[0].cells;$(ts).triggerHandler('jqGridInitGrid');if($.isFunction(ts.p.onInitGrid)){ts.p.onInitGrid.call(ts);}populate();ts.p.hiddengrid=false;});};$.jgrid.extend({getGridParam:function getGridParam(pName){var $t=this[0];if(!$t||!$t.grid){return;}if(!pName){return $t.p;}return $t.p[pName]!==undefined?$t.p[pName]:null;},setGridParam:function setGridParam(newParams){return this.each(function(){if(this.grid&&_typeof(newParams)==='object'){$.extend(true,this.p,newParams);}});},getDataIDs:function getDataIDs(){var ids=[],i=0,len,j=0;this.each(function(){len=this.rows.length;if(len&&len>0){while(i<len){if($(this.rows[i]).hasClass('jqgrow')){ids[j]=this.rows[i].id;j++;}i++;}}});return ids;},setSelection:function setSelection(selection,onsr,e){return this.each(function(){var $t=this,stat,pt,ner,ia,tpsr,fid;if(selection===undefined){return;}onsr=onsr===false?false:true;pt=$t.rows.namedItem(String(selection));if(!pt||!pt.className||pt.className.indexOf('ui-state-disabled')>-1){return;}function scrGrid(iR){var ch=$($t.grid.bDiv)[0].clientHeight,st=$($t.grid.bDiv)[0].scrollTop,rpos=$($t.rows[iR]).position().top,rh=$t.rows[iR].clientHeight;if(rpos+rh>=ch+st){$($t.grid.bDiv)[0].scrollTop=rpos-(ch+st)+rh+st;}else if(rpos<ch+st){if(rpos<st){$($t.grid.bDiv)[0].scrollTop=rpos;}}}if($t.p.scrollrows===true){ner=$t.rows.namedItem(selection).rowIndex;if(ner>=0){scrGrid(ner);}}if($t.p.frozenColumns===true){fid=$t.p.id+'_frozen';}if(!$t.p.multiselect){if(pt.className!=='ui-subgrid'){if($t.p.selrow!=pt.id){$($t.rows.namedItem($t.p.selrow)).removeClass('ui-state-highlight').attr({'aria-selected':'false','tabindex':'-1'});$(pt).addClass('ui-state-highlight').attr({'aria-selected':'true','tabindex':'0'});//.focus();\nif(fid){$('#'+$.jgrid.jqID($t.p.selrow),'#'+$.jgrid.jqID(fid)).removeClass('ui-state-highlight');$('#'+$.jgrid.jqID(selection),'#'+$.jgrid.jqID(fid)).addClass('ui-state-highlight');}stat=true;}else{stat=false;}$t.p.selrow=pt.id;$($t).triggerHandler('jqGridSelectRow',[pt.id,stat,e]);if($t.p.onSelectRow&&onsr){$t.p.onSelectRow.call($t,pt.id,stat,e);}}}else{//unselect selectall checkbox when deselecting a specific row\n$t.setHeadCheckBox(false);$t.p.selrow=pt.id;ia=$.inArray($t.p.selrow,$t.p.selarrrow);if(ia===-1){if(pt.className!=='ui-subgrid'){$(pt).addClass('ui-state-highlight').attr('aria-selected','true');}stat=true;$t.p.selarrrow.push($t.p.selrow);}else{if(pt.className!=='ui-subgrid'){$(pt).removeClass('ui-state-highlight').attr('aria-selected','false');}stat=false;$t.p.selarrrow.splice(ia,1);tpsr=$t.p.selarrrow[0];$t.p.selrow=tpsr===undefined?null:tpsr;}$('#jqg_'+$.jgrid.jqID($t.p.id)+'_'+$.jgrid.jqID(pt.id))[$t.p.useProp?'prop':'attr']('checked',stat);if(fid){if(ia===-1){$('#'+$.jgrid.jqID(selection),'#'+$.jgrid.jqID(fid)).addClass('ui-state-highlight');}else{$('#'+$.jgrid.jqID(selection),'#'+$.jgrid.jqID(fid)).removeClass('ui-state-highlight');}$('#jqg_'+$.jgrid.jqID($t.p.id)+'_'+$.jgrid.jqID(selection),'#'+$.jgrid.jqID(fid))[$t.p.useProp?'prop':'attr']('checked',stat);}$($t).triggerHandler('jqGridSelectRow',[pt.id,stat,e]);if($t.p.onSelectRow&&onsr){$t.p.onSelectRow.call($t,pt.id,stat,e);}}});},resetSelection:function resetSelection(rowid){return this.each(function(){var t=this,ind,sr,fid;if(t.p.frozenColumns===true){fid=t.p.id+'_frozen';}if(rowid!==undefined){sr=rowid===t.p.selrow?t.p.selrow:rowid;$('#'+$.jgrid.jqID(t.p.id)+' tbody:first tr#'+$.jgrid.jqID(sr)).removeClass('ui-state-highlight').attr('aria-selected','false');if(fid){$('#'+$.jgrid.jqID(sr),'#'+$.jgrid.jqID(fid)).removeClass('ui-state-highlight');}if(t.p.multiselect){$('#jqg_'+$.jgrid.jqID(t.p.id)+'_'+$.jgrid.jqID(sr),'#'+$.jgrid.jqID(t.p.id))[t.p.useProp?'prop':'attr']('checked',false);if(fid){$('#jqg_'+$.jgrid.jqID(t.p.id)+'_'+$.jgrid.jqID(sr),'#'+$.jgrid.jqID(fid))[t.p.useProp?'prop':'attr']('checked',false);}t.setHeadCheckBox(false);}sr=null;}else if(!t.p.multiselect){if(t.p.selrow){$('#'+$.jgrid.jqID(t.p.id)+' tbody:first tr#'+$.jgrid.jqID(t.p.selrow)).removeClass('ui-state-highlight').attr('aria-selected','false');if(fid){$('#'+$.jgrid.jqID(t.p.selrow),'#'+$.jgrid.jqID(fid)).removeClass('ui-state-highlight');}t.p.selrow=null;}}else{$(t.p.selarrrow).each(function(i,n){ind=t.rows.namedItem(n);$(ind).removeClass('ui-state-highlight').attr('aria-selected','false');$('#jqg_'+$.jgrid.jqID(t.p.id)+'_'+$.jgrid.jqID(n))[t.p.useProp?'prop':'attr']('checked',false);if(fid){$('#'+$.jgrid.jqID(n),'#'+$.jgrid.jqID(fid)).removeClass('ui-state-highlight');$('#jqg_'+$.jgrid.jqID(t.p.id)+'_'+$.jgrid.jqID(n),'#'+$.jgrid.jqID(fid))[t.p.useProp?'prop':'attr']('checked',false);}});t.setHeadCheckBox(false);t.p.selarrrow=[];}if(t.p.cellEdit===true){if(parseInt(t.p.iCol,10)>=0&&parseInt(t.p.iRow,10)>=0){$('td:eq('+t.p.iCol+')',t.rows[t.p.iRow]).removeClass('edit-cell ui-state-highlight');$(t.rows[t.p.iRow]).removeClass('selected-row ui-state-hover');}}t.p.savedRow=[];});},getRowData:function getRowData(rowid){var res={},resall,getall=false,len,j=0;this.each(function(){var $t=this,nm,ind;if(rowid===undefined){getall=true;resall=[];len=$t.rows.length;}else{ind=$t.rows.namedItem(rowid);if(!ind){return res;}len=2;}while(j<len){if(getall){ind=$t.rows[j];}if($(ind).hasClass('jqgrow')){$('td[role=\"gridcell\"]',ind).each(function(i){nm=$t.p.colModel[i].name;if(nm!=='cb'&&nm!=='subgrid'&&nm!=='rn'){if($t.p.treeGrid===true&&nm==$t.p.ExpandColumn){res[nm]=$.jgrid.htmlDecode($('span:first',this).html());}else{try{res[nm]=$.unformat.call($t,this,{rowId:ind.id,colModel:$t.p.colModel[i]},i);}catch(e){res[nm]=$.jgrid.htmlDecode($(this).html());}}}});if(getall){resall.push(res);res={};}}j++;}});return resall||res;},delRowData:function delRowData(rowid){var success=false,rowInd,ia,ri;this.each(function(){var $t=this;rowInd=$t.rows.namedItem(rowid);if(!rowInd){return false;}ri=rowInd.rowIndex;$(rowInd).remove();$t.p.records--;$t.p.reccount--;$t.updatepager(true,false);success=true;if($t.p.multiselect){ia=$.inArray(rowid,$t.p.selarrrow);if(ia!=-1){$t.p.selarrrow.splice(ia,1);}}if($t.p.multiselect&&$t.p.selarrrow.length>0){$t.p.selrow=$t.p.selarrrow[$t.p.selarrrow.length-1];}else{$t.p.selrow=null;}if($t.p.datatype=='local'){var id=$.jgrid.stripPref($t.p.idPrefix,rowid),pos=$t.p._index[id];if(pos!==undefined){$t.p.data.splice(pos,1);$t.refreshIndex();}}if($t.p.altRows===true&&success){var cn=$t.p.altclass;$($t.rows).each(function(i){if(i%2==1){$(this).addClass(cn);}else{$(this).removeClass(cn);}});}});return success;},setRowData:function setRowData(rowid,data,cssp){var nm,success=true,title;this.each(function(){if(!this.grid){return false;}var t=this,vl,ind,cp=_typeof(cssp),lcdata={};ind=t.rows.namedItem(rowid);if(!ind){return false;}if(data){try{$(this.p.colModel).each(function(i){nm=this.name;if(data[nm]!==undefined){lcdata[nm]=this.formatter&&typeof this.formatter==='string'&&this.formatter=='date'?$.unformat.date.call(t,data[nm],this):data[nm];vl=t.formatter(rowid,data[nm],i,data,'edit');title=this.title?{'title':$.jgrid.stripHtml(vl)}:{};if(t.p.treeGrid===true&&nm==t.p.ExpandColumn){$('td[role=\\'gridcell\\']:eq('+i+') > span:first',ind).html(vl).attr(title);}else{$('td[role=\\'gridcell\\']:eq('+i+')',ind).html(vl).attr(title);}}});if(t.p.datatype=='local'){var id=$.jgrid.stripPref(t.p.idPrefix,rowid),pos=t.p._index[id],key;if(t.p.treeGrid){for(key in t.p.treeReader){if(t.p.treeReader.hasOwnProperty(key)){delete lcdata[t.p.treeReader[key]];}}}if(pos!==undefined){t.p.data[pos]=$.extend(true,t.p.data[pos],lcdata);}lcdata=null;}}catch(e){success=false;}}if(success){if(cp==='string'){$(ind).addClass(cssp);}else if(cp==='object'){$(ind).css(cssp);}$(t).triggerHandler('jqGridAfterGridComplete');}});return success;},addRowData:function addRowData(rowid,rdata,pos,src){if(!pos){pos='last';}var success=false,nm,row,gi,si,ni,sind,i,v,prp='',aradd,cnm,cn,data,cm,id;if(rdata){if($.isArray(rdata)){aradd=true;pos='last';cnm=rowid;}else{rdata=[rdata];aradd=false;}this.each(function(){var t=this,datalen=rdata.length;ni=t.p.rownumbers===true?1:0;gi=t.p.multiselect===true?1:0;si=t.p.subGrid===true?1:0;if(!aradd){if(rowid!==undefined){rowid=String(rowid);}else{rowid=$.jgrid.randId();if(t.p.keyIndex!==false){cnm=t.p.colModel[t.p.keyIndex+gi+si+ni].name;if(rdata[0][cnm]!==undefined){rowid=rdata[0][cnm];}}}}cn=t.p.altclass;var k=0,cna='',lcdata={},air=$.isFunction(t.p.afterInsertRow)?true:false;while(k<datalen){data=rdata[k];row=[];if(aradd){try{rowid=data[cnm];if(rowid===undefined){rowid=$.jgrid.randId();}}catch(e){rowid=$.jgrid.randId();}cna=t.p.altRows===true?(t.rows.length-1)%2===0?cn:'':'';}id=rowid;rowid=t.p.idPrefix+rowid;if(ni){prp=t.formatCol(0,1,'',null,rowid,true);row[row.length]='<td role=\"gridcell\" class=\"ui-state-default jqgrid-rownum\" '+prp+'>0</td>';}if(gi){v='<input role=\"checkbox\" type=\"checkbox\"'+' id=\"jqg_'+t.p.id+'_'+rowid+'\" class=\"cbox\"/>';prp=t.formatCol(ni,1,'',null,rowid,true);row[row.length]='<td role=\"gridcell\" '+prp+'>'+v+'</td>';}if(si){row[row.length]=$(t).jqGrid('addSubGridCell',gi+ni,1);}for(i=gi+si+ni;i<t.p.colModel.length;i++){cm=t.p.colModel[i];nm=cm.name;lcdata[nm]=data[nm];v=t.formatter(rowid,$.jgrid.getAccessor(data,nm),i,data);prp=t.formatCol(i,1,v,data,rowid,lcdata);row[row.length]='<td role=\"gridcell\" '+prp+'>'+v+'</td>';}row.unshift(t.constructTr(rowid,false,cna,lcdata,data,false));row[row.length]='</tr>';if(t.rows.length===0){$('table:first',t.grid.bDiv).append(row.join(''));}else{switch(pos){case'last':$(t.rows[t.rows.length-1]).after(row.join(''));sind=t.rows.length-1;break;case'first':$(t.rows[0]).after(row.join(''));sind=1;break;case'after':sind=t.rows.namedItem(src);if(sind){if($(t.rows[sind.rowIndex+1]).hasClass('ui-subgrid')){$(t.rows[sind.rowIndex+1]).after(row);}else{$(sind).after(row.join(''));}}sind++;break;case'before':sind=t.rows.namedItem(src);if(sind){$(sind).before(row.join(''));sind=sind.rowIndex;}sind--;break;}}if(t.p.subGrid===true){$(t).jqGrid('addSubGrid',gi+ni,sind);}t.p.records++;t.p.reccount++;$(t).triggerHandler('jqGridAfterInsertRow',[rowid,data,data]);if(air){t.p.afterInsertRow.call(t,rowid,data,data);}k++;if(t.p.datatype=='local'){lcdata[t.p.localReader.id]=id;t.p._index[id]=t.p.data.length;t.p.data.push(lcdata);lcdata={};}}if(t.p.altRows===true&&!aradd){if(pos=='last'){if((t.rows.length-1)%2==1){$(t.rows[t.rows.length-1]).addClass(cn);}}else{$(t.rows).each(function(i){if(i%2==1){$(this).addClass(cn);}else{$(this).removeClass(cn);}});}}t.updatepager(true,true);success=true;});}return success;},footerData:function footerData(action,data,format){var nm,success=false,res={},title;function isEmpty(obj){var i;for(i in obj){if(obj.hasOwnProperty(i)){return false;}}return true;}if(action===undefined){action='get';}if(typeof format!=='boolean'){format=true;}action=action.toLowerCase();this.each(function(){var t=this,vl;if(!t.grid||!t.p.footerrow){return false;}if(action=='set'){if(isEmpty(data)){return false;}}success=true;$(this.p.colModel).each(function(i){nm=this.name;if(action=='set'){if(data[nm]!==undefined){vl=format?t.formatter('',data[nm],i,data,'edit'):data[nm];title=this.title?{'title':$.jgrid.stripHtml(vl)}:{};$('tr.footrow td:eq('+i+')',t.grid.sDiv).html(vl).attr(title);success=true;}}else if(action=='get'){res[nm]=$('tr.footrow td:eq('+i+')',t.grid.sDiv).html();}});});return action=='get'?res:success;},showHideCol:function showHideCol(colname,show){return this.each(function(){var $t=this,fndh=false,brd=$.jgrid.cell_width?0:$t.p.cellLayout,cw;if(!$t.grid){return;}if(typeof colname==='string'){colname=[colname];}show=show!='none'?'':'none';var sw=show===''?true:false,gh=$t.p.groupHeader&&(_typeof($t.p.groupHeader)==='object'||$.isFunction($t.p.groupHeader));if(gh){$($t).jqGrid('destroyGroupHeader',false);}$(this.p.colModel).each(function(i){if($.inArray(this.name,colname)!==-1&&this.hidden===sw){if($t.p.frozenColumns===true&&this.frozen===true){return true;}$('tr',$t.grid.hDiv).each(function(){$(this.cells[i]).css('display',show);});$($t.rows).each(function(){if(!$(this).hasClass('jqgroup')){$(this.cells[i]).css('display',show);}});if($t.p.footerrow){$('tr.footrow td:eq('+i+')',$t.grid.sDiv).css('display',show);}cw=parseInt(this.width,10);if(show==='none'){$t.p.tblwidth-=cw+brd;}else{$t.p.tblwidth+=cw+brd;}this.hidden=!sw;fndh=true;$($t).triggerHandler('jqGridShowHideCol',[sw,this.name,i]);}});if(fndh===true){if($t.p.shrinkToFit===true&&!isNaN($t.p.height)){$t.p.tblwidth+=parseInt($t.p.scrollOffset,10);}$($t).jqGrid('setGridWidth',$t.p.shrinkToFit===true?$t.p.tblwidth:$t.p.width);}if(gh){$($t).jqGrid('setGroupHeaders',$t.p.groupHeader);}});},hideCol:function hideCol(colname){return this.each(function(){$(this).jqGrid('showHideCol',colname,'none');});},showCol:function showCol(colname){return this.each(function(){$(this).jqGrid('showHideCol',colname,'');});},remapColumns:function remapColumns(permutation,updateCells,keepHeader){function resortArray(a){var ac;if(a.length){ac=$.makeArray(a);}else{ac=$.extend({},a);}$.each(permutation,function(i){a[i]=ac[this];});}var ts=this.get(0);function resortRows(parent,clobj){$('>tr'+(clobj||''),parent).each(function(){var row=this;var elems=$.makeArray(row.cells);$.each(permutation,function(){var e=elems[this];if(e){row.appendChild(e);}});});}resortArray(ts.p.colModel);resortArray(ts.p.colNames);resortArray(ts.grid.headers);resortRows($('thead:first',ts.grid.hDiv),keepHeader&&':not(.ui-jqgrid-labels)');if(updateCells){resortRows($('#'+$.jgrid.jqID(ts.p.id)+' tbody:first'),'.jqgfirstrow, tr.jqgrow, tr.jqfoot');}if(ts.p.footerrow){resortRows($('tbody:first',ts.grid.sDiv));}if(ts.p.remapColumns){if(!ts.p.remapColumns.length){ts.p.remapColumns=$.makeArray(permutation);}else{resortArray(ts.p.remapColumns);}}ts.p.lastsort=$.inArray(ts.p.lastsort,permutation);if(ts.p.treeGrid){ts.p.expColInd=$.inArray(ts.p.expColInd,permutation);}$(ts).triggerHandler('jqGridRemapColumns',[permutation,updateCells,keepHeader]);},setGridWidth:function setGridWidth(nwidth,shrink){return this.each(function(){if(!this.grid){return;}var $t=this,cw,initwidth=0,brd=$.jgrid.cell_width?0:$t.p.cellLayout,lvc,vc=0,hs=false,scw=$t.p.scrollOffset,aw,gw=0,cl=0,cr;if(typeof shrink!=='boolean'){shrink=$t.p.shrinkToFit;}if(isNaN(nwidth)){return;}nwidth=parseInt(nwidth,10);$t.grid.width=$t.p.width=nwidth;$('#gbox_'+$.jgrid.jqID($t.p.id)).css('width',nwidth+'px');$('#gview_'+$.jgrid.jqID($t.p.id)).css('width',nwidth+'px');$($t.grid.bDiv).css('width',nwidth+'px');$($t.grid.hDiv).css('width',nwidth+'px');if($t.p.pager){$($t.p.pager).css('width',nwidth+'px');}if($t.p.toppager){$($t.p.toppager).css('width',nwidth+'px');}if($t.p.toolbar[0]===true){$($t.grid.uDiv).css('width',nwidth+'px');if($t.p.toolbar[1]=='both'){$($t.grid.ubDiv).css('width',nwidth+'px');}}if($t.p.footerrow){$($t.grid.sDiv).css('width',nwidth+'px');}if(shrink===false&&$t.p.forceFit===true){$t.p.forceFit=false;}if(shrink===true){$.each($t.p.colModel,function(){if(this.hidden===false){cw=this.widthOrg;initwidth+=cw+brd;if(this.fixed){gw+=cw+brd;}else{vc++;}cl++;}});if(vc===0){return;}$t.p.tblwidth=initwidth;aw=nwidth-brd*vc-gw;if(!isNaN($t.p.height)){if($($t.grid.bDiv)[0].clientHeight<$($t.grid.bDiv)[0].scrollHeight||$t.rows.length===1){hs=true;aw-=scw;}}initwidth=0;var cle=$t.grid.cols.length>0;$.each($t.p.colModel,function(i){if(this.hidden===false&&!this.fixed){cw=this.widthOrg;cw=Math.round(aw*cw/($t.p.tblwidth-brd*vc-gw));if(cw<0){return;}this.width=cw;initwidth+=cw;$t.grid.headers[i].width=cw;$t.grid.headers[i].el.style.width=cw+'px';if($t.p.footerrow){$t.grid.footers[i].style.width=cw+'px';}if(cle){$t.grid.cols[i].style.width=cw+'px';}lvc=i;}});if(!lvc){return;}cr=0;if(hs){if(nwidth-gw-(initwidth+brd*vc)!==scw){cr=nwidth-gw-(initwidth+brd*vc)-scw;}}else if(Math.abs(nwidth-gw-(initwidth+brd*vc))!==1){cr=nwidth-gw-(initwidth+brd*vc);}$t.p.colModel[lvc].width+=cr;$t.p.tblwidth=initwidth+cr+brd*vc+gw;if($t.p.tblwidth>nwidth){var delta=$t.p.tblwidth-parseInt(nwidth,10);$t.p.tblwidth=nwidth;cw=$t.p.colModel[lvc].width=$t.p.colModel[lvc].width-delta;}else{cw=$t.p.colModel[lvc].width;}$t.grid.headers[lvc].width=cw;$t.grid.headers[lvc].el.style.width=cw+'px';if(cle){$t.grid.cols[lvc].style.width=cw+'px';}if($t.p.footerrow){$t.grid.footers[lvc].style.width=cw+'px';}}if($t.p.tblwidth){$('table:first',$t.grid.bDiv).css('width',$t.p.tblwidth+'px');$('table:first',$t.grid.hDiv).css('width',$t.p.tblwidth+'px');$t.grid.hDiv.scrollLeft=$t.grid.bDiv.scrollLeft;if($t.p.footerrow){$('table:first',$t.grid.sDiv).css('width',$t.p.tblwidth+'px');}}});},setGridHeight:function setGridHeight(nh){return this.each(function(){var $t=this;if(!$t.grid){return;}var bDiv=$($t.grid.bDiv);bDiv.css({height:nh+(isNaN(nh)?'':'px')});if($t.p.frozenColumns===true){//follow the original set height to use 16, better scrollbar width detection\n$('#'+$.jgrid.jqID($t.p.id)+'_frozen').parent().height(bDiv.height()-16);}$t.p.height=nh;if($t.p.scroll){$t.grid.populateVisible();}});},setCaption:function setCaption(newcap){return this.each(function(){this.p.caption=newcap;$('span.ui-jqgrid-title, span.ui-jqgrid-title-rtl',this.grid.cDiv).html(newcap);$(this.grid.cDiv).show();});},setLabel:function setLabel(colname,nData,prop,attrp){return this.each(function(){var $t=this,pos=-1;if(!$t.grid){return;}if(colname!==undefined){$($t.p.colModel).each(function(i){if(this.name==colname){pos=i;return false;}});}else{return;}if(pos>=0){var thecol=$('tr.ui-jqgrid-labels th:eq('+pos+')',$t.grid.hDiv);if(nData){var ico=$('.s-ico',thecol);$('[id^=jqgh_]',thecol).empty().html(nData).append(ico);$t.p.colNames[pos]=nData;}if(prop){if(typeof prop==='string'){$(thecol).addClass(prop);}else{$(thecol).css(prop);}}if(_typeof(attrp)==='object'){$(thecol).attr(attrp);}}});},setCell:function setCell(rowid,colname,nData,cssp,attrp,forceupd){return this.each(function(){var $t=this,pos=-1,v,title;if(!$t.grid){return;}if(isNaN(colname)){$($t.p.colModel).each(function(i){if(this.name==colname){pos=i;return false;}});}else{pos=parseInt(colname,10);}if(pos>=0){var ind=$t.rows.namedItem(rowid);if(ind){var tcell=$('td:eq('+pos+')',ind);if(nData!==''||forceupd===true){v=$t.formatter(rowid,nData,pos,ind,'edit');title=$t.p.colModel[pos].title?{'title':$.jgrid.stripHtml(v)}:{};if($t.p.treeGrid&&$('.tree-wrap',$(tcell)).length>0){$('span',$(tcell)).html(v).attr(title);}else{$(tcell).html(v).attr(title);}if($t.p.datatype=='local'){var cm=$t.p.colModel[pos],index;nData=cm.formatter&&typeof cm.formatter==='string'&&cm.formatter=='date'?$.unformat.date.call($t,nData,cm):nData;index=$t.p._index[rowid];if(index!==undefined){$t.p.data[index][cm.name]=nData;}}}if(typeof cssp==='string'){$(tcell).addClass(cssp);}else if(cssp){$(tcell).css(cssp);}if(_typeof(attrp)==='object'){$(tcell).attr(attrp);}}}});},getCell:function getCell(rowid,col){var ret=false;this.each(function(){var $t=this,pos=-1;if(!$t.grid){return;}if(isNaN(col)){$($t.p.colModel).each(function(i){if(this.name===col){pos=i;return false;}});}else{pos=parseInt(col,10);}if(pos>=0){var ind=$t.rows.namedItem(rowid);if(ind){try{ret=$.unformat.call($t,$('td:eq('+pos+')',ind),{rowId:ind.id,colModel:$t.p.colModel[pos]},pos);}catch(e){ret=$.jgrid.htmlDecode($('td:eq('+pos+')',ind).html());}}}});return ret;},getCol:function getCol(col,obj,mathopr){var ret=[],val,sum=0,min,max,v;obj=typeof obj!=='boolean'?false:obj;if(mathopr===undefined){mathopr=false;}this.each(function(){var $t=this,pos=-1;if(!$t.grid){return;}if(isNaN(col)){$($t.p.colModel).each(function(i){if(this.name===col){pos=i;return false;}});}else{pos=parseInt(col,10);}if(pos>=0){var ln=$t.rows.length,i=0;if(ln&&ln>0){while(i<ln){if($($t.rows[i]).hasClass('jqgrow')){try{val=$.unformat.call($t,$($t.rows[i].cells[pos]),{rowId:$t.rows[i].id,colModel:$t.p.colModel[pos]},pos);}catch(e){val=$.jgrid.htmlDecode($t.rows[i].cells[pos].innerHTML);}if(mathopr){v=parseFloat(val);sum+=v;if(max===undefined){max=min=v;}min=Math.min(min,v);max=Math.max(max,v);}else if(obj){ret.push({id:$t.rows[i].id,value:val});}else{ret.push(val);}}i++;}if(mathopr){switch(mathopr.toLowerCase()){case'sum':ret=sum;break;case'avg':ret=sum/ln;break;case'count':ret=ln;break;case'min':ret=min;break;case'max':ret=max;break;}}}}});return ret;},clearGridData:function clearGridData(clearfooter){return this.each(function(){var $t=this;if(!$t.grid){return;}if(typeof clearfooter!=='boolean'){clearfooter=false;}if($t.p.deepempty){$('#'+$.jgrid.jqID($t.p.id)+' tbody:first tr:gt(0)').remove();}else{var trf=$('#'+$.jgrid.jqID($t.p.id)+' tbody:first tr:first')[0];$('#'+$.jgrid.jqID($t.p.id)+' tbody:first').empty().append(trf);}if($t.p.footerrow&&clearfooter){$('.ui-jqgrid-ftable td',$t.grid.sDiv).html('&#160;');}$t.p.selrow=null;$t.p.selarrrow=[];$t.p.savedRow=[];$t.p.records=0;$t.p.page=1;$t.p.lastpage=0;$t.p.reccount=0;$t.p.data=[];$t.p._index={};$t.updatepager(true,false);});},getInd:function getInd(rowid,rc){var ret=false,rw;this.each(function(){rw=this.rows.namedItem(rowid);if(rw){ret=rc===true?rw:rw.rowIndex;}});return ret;},bindKeys:function bindKeys(settings){var o=$.extend({onEnter:null,onSpace:null,onLeftKey:null,onRightKey:null,scrollingRows:true},settings||{});return this.each(function(){var $t=this;if(!$('body').is('[role]')){$('body').attr('role','application');}$t.p.scrollrows=o.scrollingRows;$($t).keydown(function(event){var target=$($t).find('tr[tabindex=0]')[0],id,r,mind,expanded=$t.p.treeReader.expanded_field;//check for arrow keys\nif(target){mind=$t.p._index[target.id];if(event.keyCode===37||event.keyCode===38||event.keyCode===39||event.keyCode===40){// up key\nif(event.keyCode===38){r=target.previousSibling;id='';if(r){if($(r).is(':hidden')){while(r){r=r.previousSibling;if(!$(r).is(':hidden')&&$(r).hasClass('jqgrow')){id=r.id;break;}}}else{id=r.id;}}$($t).jqGrid('setSelection',id,true,event);event.preventDefault();}//if key is down arrow\nif(event.keyCode===40){r=target.nextSibling;id='';if(r){if($(r).is(':hidden')){while(r){r=r.nextSibling;if(!$(r).is(':hidden')&&$(r).hasClass('jqgrow')){id=r.id;break;}}}else{id=r.id;}}$($t).jqGrid('setSelection',id,true,event);event.preventDefault();}// left\nif(event.keyCode===37){if($t.p.treeGrid&&$t.p.data[mind][expanded]){$(target).find('div.treeclick').trigger('click');}$($t).triggerHandler('jqGridKeyLeft',[$t.p.selrow]);if($.isFunction(o.onLeftKey)){o.onLeftKey.call($t,$t.p.selrow);}}// right\nif(event.keyCode===39){if($t.p.treeGrid&&!$t.p.data[mind][expanded]){$(target).find('div.treeclick').trigger('click');}$($t).triggerHandler('jqGridKeyRight',[$t.p.selrow]);if($.isFunction(o.onRightKey)){o.onRightKey.call($t,$t.p.selrow);}}}//check if enter was pressed on a grid or treegrid node\nelse if(event.keyCode===13){$($t).triggerHandler('jqGridKeyEnter',[$t.p.selrow]);if($.isFunction(o.onEnter)){o.onEnter.call($t,$t.p.selrow);}}else if(event.keyCode===32){$($t).triggerHandler('jqGridKeySpace',[$t.p.selrow]);if($.isFunction(o.onSpace)){o.onSpace.call($t,$t.p.selrow);}}}});});},unbindKeys:function unbindKeys(){return this.each(function(){$(this).unbind('keydown');});},getLocalRow:function getLocalRow(rowid){var ret=false,ind;this.each(function(){if(rowid!==undefined){ind=this.p._index[rowid];if(ind>=0){ret=this.p.data[ind];}}});return ret;}});})(jQuery);/*jshint eqeqeq:false */ /*global jQuery */(function($){/**\r\n * jqGrid extension for custom methods\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n *\r\n * Wildraid wildraid@mail.ru\r\n * Oleg Kiriljuk oleg.kiriljuk@ok-soft-gmbh.com\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n**/'use strict';$.jgrid.extend({getColProp:function getColProp(colname){var ret={},$t=this[0];if(!$t.grid){return false;}var cM=$t.p.colModel,i;for(i=0;i<cM.length;i++){if(cM[i].name==colname){ret=cM[i];break;}}return ret;},setColProp:function setColProp(colname,obj){//do not set width will not work\nreturn this.each(function(){if(this.grid){if(obj){var cM=this.p.colModel,i;for(i=0;i<cM.length;i++){if(cM[i].name==colname){$.extend(true,this.p.colModel[i],obj);break;}}}}});},sortGrid:function sortGrid(colname,reload,sor){return this.each(function(){var $t=this,idx=-1,i;if(!$t.grid){return;}if(!colname){colname=$t.p.sortname;}for(i=0;i<$t.p.colModel.length;i++){if($t.p.colModel[i].index==colname||$t.p.colModel[i].name==colname){idx=i;break;}}if(idx!=-1){var sort=$t.p.colModel[idx].sortable;if(typeof sort!=='boolean'){sort=true;}if(typeof reload!=='boolean'){reload=false;}if(sort){$t.sortData('jqgh_'+$t.p.id+'_'+colname,idx,reload,sor);}}});},clearBeforeUnload:function clearBeforeUnload(){return this.each(function(){var grid=this.grid;grid.emptyRows.call(this,true,true);// this work quick enough and reduce the size of memory leaks if we have someone\n//$(document).unbind(\"mouseup\"); // TODO add namespace\n$(grid.hDiv).unbind('mousemove');// TODO add namespace\n$(this).unbind();grid.dragEnd=null;grid.dragMove=null;grid.dragStart=null;grid.emptyRows=null;grid.populate=null;grid.populateVisible=null;grid.scrollGrid=null;grid.selectionPreserver=null;grid.bDiv=null;grid.cDiv=null;grid.hDiv=null;grid.cols=null;var i,l=grid.headers.length;for(i=0;i<l;i++){grid.headers[i].el=null;}this.formatCol=null;this.sortData=null;this.updatepager=null;this.refreshIndex=null;this.setHeadCheckBox=null;this.constructTr=null;this.formatter=null;this.addXmlData=null;this.addJSONData=null;});},GridDestroy:function GridDestroy(){return this.each(function(){if(this.grid){if(this.p.pager){// if not part of grid\n$(this.p.pager).remove();}try{$(this).jqGrid('clearBeforeUnload');$('#gbox_'+$.jgrid.jqID(this.id)).remove();}catch(_){}}});},GridUnload:function GridUnload(){return this.each(function(){if(!this.grid){return;}var defgrid={id:$(this).attr('id'),cl:$(this).attr('class')};if(this.p.pager){$(this.p.pager).empty().removeClass('ui-state-default ui-jqgrid-pager corner-bottom');}var newtable=document.createElement('table');$(newtable).attr({id:defgrid.id});newtable.className=defgrid.cl;var gid=$.jgrid.jqID(this.id);$(newtable).removeClass('ui-jqgrid-btable');if($(this.p.pager).parents('#gbox_'+gid).length===1){$(newtable).insertBefore('#gbox_'+gid).show();$(this.p.pager).insertBefore('#gbox_'+gid);}else{$(newtable).insertBefore('#gbox_'+gid).show();}$(this).jqGrid('clearBeforeUnload');$('#gbox_'+gid).remove();});},setGridState:function setGridState(state){return this.each(function(){if(!this.grid){return;}var $t=this;if(state=='hidden'){$('.ui-jqgrid-bdiv, .ui-jqgrid-hdiv','#gview_'+$.jgrid.jqID($t.p.id)).slideUp('fast');if($t.p.pager){$($t.p.pager).slideUp('fast');}if($t.p.toppager){$($t.p.toppager).slideUp('fast');}if($t.p.toolbar[0]===true){if($t.p.toolbar[1]=='both'){$($t.grid.ubDiv).slideUp('fast');}$($t.grid.uDiv).slideUp('fast');}if($t.p.footerrow){$('.ui-jqgrid-sdiv','#gbox_'+$.jgrid.jqID($t.p.id)).slideUp('fast');}$('.ui-jqgrid-titlebar-close span',$t.grid.cDiv).removeClass('ui-icon-circle-triangle-n').addClass('ui-icon-circle-triangle-s');$t.p.gridstate='hidden';}else if(state=='visible'){$('.ui-jqgrid-hdiv, .ui-jqgrid-bdiv','#gview_'+$.jgrid.jqID($t.p.id)).slideDown('fast');if($t.p.pager){$($t.p.pager).slideDown('fast');}if($t.p.toppager){$($t.p.toppager).slideDown('fast');}if($t.p.toolbar[0]===true){if($t.p.toolbar[1]=='both'){$($t.grid.ubDiv).slideDown('fast');}$($t.grid.uDiv).slideDown('fast');}if($t.p.footerrow){$('.ui-jqgrid-sdiv','#gbox_'+$.jgrid.jqID($t.p.id)).slideDown('fast');}$('.ui-jqgrid-titlebar-close span',$t.grid.cDiv).removeClass('ui-icon-circle-triangle-s').addClass('ui-icon-circle-triangle-n');$t.p.gridstate='visible';}});},filterToolbar:function filterToolbar(p){p=$.extend({autosearch:true,searchOnEnter:true,beforeSearch:null,afterSearch:null,beforeClear:null,afterClear:null,searchurl:'',stringResult:false,groupOp:'AND',defaultSearch:'bw'},p||{});return this.each(function(){var $t=this;if(this.ftoolbar){return;}var triggerToolbar=function triggerToolbar(){var sdata={},j=0,v,nm,sopt={},so;$.each($t.p.colModel,function(){nm=this.index||this.name;so=this.searchoptions&&this.searchoptions.sopt?this.searchoptions.sopt[0]:this.stype=='select'?'eq':p.defaultSearch;v=$('#gs_'+$.jgrid.jqID(this.name),this.frozen===true&&$t.p.frozenColumns===true?$t.grid.fhDiv:$t.grid.hDiv).val();if(v){sdata[nm]=v;sopt[nm]=so;j++;}else{try{delete $t.p.postData[nm];}catch(z){}}});var sd=j>0?true:false;if(p.stringResult===true||$t.p.datatype=='local'){var ruleGroup='{\"groupOp\":\"'+p.groupOp+'\",\"rules\":[';var gi=0;$.each(sdata,function(i,n){if(gi>0){ruleGroup+=',';}ruleGroup+='{\"field\":\"'+i+'\",';ruleGroup+='\"op\":\"'+sopt[i]+'\",';n+='';ruleGroup+='\"data\":\"'+n.replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"')+'\"}';gi++;});ruleGroup+=']}';$.extend($t.p.postData,{filters:ruleGroup});$.each(['searchField','searchString','searchOper'],function(i,n){if($t.p.postData.hasOwnProperty(n)){delete $t.p.postData[n];}});}else{$.extend($t.p.postData,sdata);}var saveurl;if($t.p.searchurl){saveurl=$t.p.url;$($t).jqGrid('setGridParam',{url:$t.p.searchurl});}var bsr=$($t).triggerHandler('jqGridToolbarBeforeSearch')==='stop'?true:false;if(!bsr&&$.isFunction(p.beforeSearch)){bsr=p.beforeSearch.call($t);}if(!bsr){$($t).jqGrid('setGridParam',{search:sd}).trigger('reloadGrid',[{page:1}]);}if(saveurl){$($t).jqGrid('setGridParam',{url:saveurl});}$($t).triggerHandler('jqGridToolbarAfterSearch');if($.isFunction(p.afterSearch)){p.afterSearch.call($t);}};var clearToolbar=function clearToolbar(trigger){var sdata={},j=0,nm;trigger=typeof trigger!=='boolean'?true:trigger;$.each($t.p.colModel,function(){var v;if(this.searchoptions&&this.searchoptions.defaultValue!==undefined){v=this.searchoptions.defaultValue;}nm=this.index||this.name;switch(this.stype){case'select':$('#gs_'+$.jgrid.jqID(this.name)+' option',this.frozen===true&&$t.p.frozenColumns===true?$t.grid.fhDiv:$t.grid.hDiv).each(function(i){if(i===0){this.selected=true;}if($(this).val()==v){this.selected=true;return false;}});if(v!==undefined){// post the key and not the text\nsdata[nm]=v;j++;}else{try{delete $t.p.postData[nm];}catch(e){}}break;case'text':$('#gs_'+$.jgrid.jqID(this.name),this.frozen===true&&$t.p.frozenColumns===true?$t.grid.fhDiv:$t.grid.hDiv).val(v);if(v!==undefined){sdata[nm]=v;j++;}else{try{delete $t.p.postData[nm];}catch(y){}}break;}});var sd=j>0?true:false;if(p.stringResult===true||$t.p.datatype=='local'){var ruleGroup='{\"groupOp\":\"'+p.groupOp+'\",\"rules\":[';var gi=0;$.each(sdata,function(i,n){if(gi>0){ruleGroup+=',';}ruleGroup+='{\"field\":\"'+i+'\",';ruleGroup+='\"op\":\"'+'eq'+'\",';n+='';ruleGroup+='\"data\":\"'+n.replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"')+'\"}';gi++;});ruleGroup+=']}';$.extend($t.p.postData,{filters:ruleGroup});$.each(['searchField','searchString','searchOper'],function(i,n){if($t.p.postData.hasOwnProperty(n)){delete $t.p.postData[n];}});}else{$.extend($t.p.postData,sdata);}var saveurl;if($t.p.searchurl){saveurl=$t.p.url;$($t).jqGrid('setGridParam',{url:$t.p.searchurl});}var bcv=$($t).triggerHandler('jqGridToolbarBeforeClear')==='stop'?true:false;if(!bcv&&$.isFunction(p.beforeClear)){bcv=p.beforeClear.call($t);}if(!bcv){if(trigger){$($t).jqGrid('setGridParam',{search:sd}).trigger('reloadGrid',[{page:1}]);}}if(saveurl){$($t).jqGrid('setGridParam',{url:saveurl});}$($t).triggerHandler('jqGridToolbarAfterClear');if($.isFunction(p.afterClear)){p.afterClear();}};var toggleToolbar=function toggleToolbar(){var trow=$('tr.ui-search-toolbar',$t.grid.hDiv),trow2=$t.p.frozenColumns===true?$('tr.ui-search-toolbar',$t.grid.fhDiv):false;if(trow.css('display')=='none'){trow.show();if(trow2){trow2.show();}}else{trow.hide();if(trow2){trow2.hide();}}};// create the row\nvar tr=$('<tr class=\\'ui-search-toolbar\\' role=\\'rowheader\\'></tr>');var timeoutHnd;$.each($t.p.colModel,function(){var cm=this,thd,th,soptions,surl,self;th=$('<th role=\\'columnheader\\' class=\\'ui-state-default ui-th-column ui-th-'+$t.p.direction+'\\'></th>');thd=$('<div style=\\'position:relative;height:100%;padding-right:0.3em;\\'></div>');if(this.hidden===true){$(th).css('display','none');}this.search=this.search===false?false:true;if(this.stype===undefined){this.stype='text';}soptions=$.extend({},this.searchoptions||{});if(this.search){switch(this.stype){case'select':surl=this.surl||soptions.dataUrl;if(surl){// data returned should have already constructed html select\n// primitive jQuery load\nself=thd;$.ajax($.extend({url:surl,dataType:'html',success:function success(res){if(soptions.buildSelect!==undefined){var d=soptions.buildSelect(res);if(d){$(self).append(d);}}else{$(self).append(res);}if(soptions.defaultValue!==undefined){$('select',self).val(soptions.defaultValue);}$('select',self).attr({name:cm.index||cm.name,id:'gs_'+cm.name});if(soptions.attr){$('select',self).attr(soptions.attr);}$('select',self).css({width:'100%'});// preserve autoserch\n$.jgrid.bindEv($('select',self)[0],soptions,$t);if(p.autosearch===true){$('select',self).change(function(){triggerToolbar();return false;});}res=null;}},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions||{}));}else{var oSv,sep,delim;if(cm.searchoptions){oSv=cm.searchoptions.value===undefined?'':cm.searchoptions.value;sep=cm.searchoptions.separator===undefined?':':cm.searchoptions.separator;delim=cm.searchoptions.delimiter===undefined?';':cm.searchoptions.delimiter;}else if(cm.editoptions){oSv=cm.editoptions.value===undefined?'':cm.editoptions.value;sep=cm.editoptions.separator===undefined?':':cm.editoptions.separator;delim=cm.editoptions.delimiter===undefined?';':cm.editoptions.delimiter;}if(oSv){var elem=document.createElement('select');elem.style.width='100%';$(elem).attr({name:cm.index||cm.name,id:'gs_'+cm.name});var so,sv,ov,key,k;if(typeof oSv==='string'){so=oSv.split(delim);for(k=0;k<so.length;k++){sv=so[k].split(sep);ov=document.createElement('option');ov.value=sv[0];ov.innerHTML=sv[1];elem.appendChild(ov);}}else if(_typeof(oSv)==='object'){for(key in oSv){if(oSv.hasOwnProperty(key)){ov=document.createElement('option');ov.value=key;ov.innerHTML=oSv[key];elem.appendChild(ov);}}}if(soptions.defaultValue!==undefined){$(elem).val(soptions.defaultValue);}if(soptions.attr){$(elem).attr(soptions.attr);}$.jgrid.bindEv(elem,soptions,$t);$(thd).append(elem);if(p.autosearch===true){$(elem).change(function(){triggerToolbar();return false;});}}}break;case'text':var df=soptions.defaultValue!==undefined?soptions.defaultValue:'';$(thd).append('<input type=\\'text\\' style=\\'width:95%;padding:0px;\\' name=\\''+(cm.index||cm.name)+'\\' id=\\'gs_'+cm.name+'\\' value=\\''+df+'\\'/>');if(soptions.attr){$('input',thd).attr(soptions.attr);}$.jgrid.bindEv($('input',thd)[0],soptions,$t);if(p.autosearch===true){if(p.searchOnEnter){$('input',thd).keypress(function(e){var key=e.charCode||e.keyCode||0;if(key==13){triggerToolbar();return false;}return this;});}else{$('input',thd).keydown(function(e){var key=e.which;switch(key){case 13:return false;case 9:case 16:case 37:case 38:case 39:case 40:case 27:break;default:if(timeoutHnd){clearTimeout(timeoutHnd);}timeoutHnd=setTimeout(function(){triggerToolbar();},500);}});}}break;}}$(th).append(thd);$(tr).append(th);});$('table thead',$t.grid.hDiv).append(tr);this.ftoolbar=true;this.triggerToolbar=triggerToolbar;this.clearToolbar=clearToolbar;this.toggleToolbar=toggleToolbar;});},destroyFilterToolbar:function destroyFilterToolbar(){return this.each(function(){if(!this.ftoolbar){return;}this.triggerToolbar=null;this.clearToolbar=null;this.toggleToolbar=null;this.ftoolbar=false;$(this.grid.hDiv).find('table thead tr.ui-search-toolbar').remove();});},destroyGroupHeader:function destroyGroupHeader(nullHeader){if(nullHeader===undefined){nullHeader=true;}return this.each(function(){var $t=this,$tr,i,l,headers,$th,$resizing,grid=$t.grid,thead=$('table.ui-jqgrid-htable thead',grid.hDiv),cm=$t.p.colModel,hc;if(!grid){return;}$(this).unbind('.setGroupHeaders');$tr=$('<tr>',{role:'rowheader'}).addClass('ui-jqgrid-labels');headers=grid.headers;for(i=0,l=headers.length;i<l;i++){hc=cm[i].hidden?'none':'';$th=$(headers[i].el).width(headers[i].width).css('display',hc);try{$th.removeAttr('rowSpan');}catch(rs){//IE 6/7\n$th.attr('rowSpan',1);}$tr.append($th);$resizing=$th.children('span.ui-jqgrid-resize');if($resizing.length>0){// resizable column\n$resizing[0].style.height='';}$th.children('div')[0].style.top='';}$(thead).children('tr.ui-jqgrid-labels').remove();$(thead).prepend($tr);if(nullHeader===true){$($t).jqGrid('setGridParam',{'groupHeader':null});}});},setGroupHeaders:function setGroupHeaders(o){o=$.extend({useColSpanStyle:false,groupHeaders:[]},o||{});return this.each(function(){this.p.groupHeader=o;var ts=this,i,cmi,skip=0,$tr,$colHeader,th,$th,thStyle,iCol,cghi,//startColumnName,\nnumberOfColumns,titleText,cVisibleColumns,colModel=ts.p.colModel,cml=colModel.length,ths=ts.grid.headers,$htable=$('table.ui-jqgrid-htable',ts.grid.hDiv),$trLabels=$htable.children('thead').children('tr.ui-jqgrid-labels:last').addClass('jqg-second-row-header'),$thead=$htable.children('thead'),$theadInTable,$firstHeaderRow=$htable.find('.jqg-first-row-header');if($firstHeaderRow[0]===undefined){$firstHeaderRow=$('<tr>',{role:'row','aria-hidden':'true'}).addClass('jqg-first-row-header').css('height','auto');}else{$firstHeaderRow.empty();}var $firstRow,inColumnHeader=function inColumnHeader(text,columnHeaders){var length=columnHeaders.length,i;for(i=0;i<length;i++){if(columnHeaders[i].startColumnName===text){return i;}}return-1;};$(ts).prepend($thead);$tr=$('<tr>',{role:'rowheader'}).addClass('ui-jqgrid-labels jqg-third-row-header');for(i=0;i<cml;i++){th=ths[i].el;$th=$(th);cmi=colModel[i];// build the next cell for the first header row\nthStyle={height:'0px',width:ths[i].width+'px',display:cmi.hidden?'none':''};$('<th>',{role:'gridcell'}).css(thStyle).addClass('ui-first-th-'+ts.p.direction).appendTo($firstHeaderRow);th.style.width='';// remove unneeded style\niCol=inColumnHeader(cmi.name,o.groupHeaders);if(iCol>=0){cghi=o.groupHeaders[iCol];numberOfColumns=cghi.numberOfColumns;titleText=cghi.titleText;// caclulate the number of visible columns from the next numberOfColumns columns\nfor(cVisibleColumns=0,iCol=0;iCol<numberOfColumns&&i+iCol<cml;iCol++){if(!colModel[i+iCol].hidden){cVisibleColumns++;}}// The next numberOfColumns headers will be moved in the next row\n// in the current row will be placed the new column header with the titleText.\n// The text will be over the cVisibleColumns columns\n$colHeader=$('<th>').attr({role:'columnheader'}).addClass('ui-state-default ui-th-column-header ui-th-'+ts.p.direction).css({'height':'22px','border-top':'0px none'}).html(titleText);if(cVisibleColumns>0){$colHeader.attr('colspan',String(cVisibleColumns));}if(ts.p.headertitles){$colHeader.attr('title',$colHeader.text());}// hide if not a visible cols\nif(cVisibleColumns===0){$colHeader.hide();}$th.before($colHeader);// insert new column header before the current\n$tr.append(th);// move the current header in the next row\n// set the coumter of headers which will be moved in the next row\nskip=numberOfColumns-1;}else{if(skip===0){if(o.useColSpanStyle){// expand the header height to two rows\n$th.attr('rowspan','2');}else{$('<th>',{role:'columnheader'}).addClass('ui-state-default ui-th-column-header ui-th-'+ts.p.direction).css({'display':cmi.hidden?'none':'','border-top':'0px none'}).insertBefore($th);$tr.append(th);}}else{// move the header to the next row\n//$th.css({\"padding-top\": \"2px\", height: \"19px\"});\n$tr.append(th);skip--;}}}$theadInTable=$(ts).children('thead');$theadInTable.prepend($firstHeaderRow);$tr.insertAfter($trLabels);$htable.append($theadInTable);if(o.useColSpanStyle){// Increase the height of resizing span of visible headers\n$htable.find('span.ui-jqgrid-resize').each(function(){var $parent=$(this).parent();if($parent.is(':visible')){this.style.cssText='height: '+$parent.height()+'px !important; cursor: col-resize;';}});// Set position of the sortable div (the main lable)\n// with the column header text to the middle of the cell.\n// One should not do this for hidden headers.\n$htable.find('div.ui-jqgrid-sortable').each(function(){var $ts=$(this),$parent=$ts.parent();if($parent.is(':visible')&&$parent.is(':has(span.ui-jqgrid-resize)')){$ts.css('top',($parent.height()-$ts.outerHeight())/2+'px');}});}$firstRow=$theadInTable.find('tr.jqg-first-row-header');$(ts).bind('jqGridResizeStop.setGroupHeaders',function(e,nw,idx){$firstRow.find('th').eq(idx).width(nw);});});},setFrozenColumns:function setFrozenColumns(){return this.each(function(){if(!this.grid){return;}var $t=this,cm=$t.p.colModel,i=0,len=cm.length,maxfrozen=-1,frozen=false;// TODO treeGrid and grouping  Support\nif($t.p.subGrid===true||$t.p.treeGrid===true||$t.p.cellEdit===true||$t.p.sortable||$t.p.scroll||$t.p.grouping){return;}if($t.p.rownumbers){i++;}if($t.p.multiselect){i++;}// get the max index of frozen col\nwhile(i<len){// from left, no breaking frozen\nif(cm[i].frozen===true){frozen=true;maxfrozen=i;}else{break;}i++;}if(maxfrozen>=0&&frozen){var top=$t.p.caption?$($t.grid.cDiv).outerHeight():0,hth=$('.ui-jqgrid-htable','#gview_'+$.jgrid.jqID($t.p.id)).height();//headers\nif($t.p.toppager){top=top+$($t.grid.topDiv).outerHeight();}if($t.p.toolbar[0]===true){if($t.p.toolbar[1]!='bottom'){top=top+$($t.grid.uDiv).outerHeight();}}$t.grid.fhDiv=$('<div style=\"position:absolute;left:0px;top:'+top+'px;height:'+hth+'px;\" class=\"frozen-div ui-state-default ui-jqgrid-hdiv\"></div>');$t.grid.fbDiv=$('<div style=\"position:absolute;left:0px;top:'+(parseInt(top,10)+parseInt(hth,10)+1)+'px;overflow-y:hidden\" class=\"frozen-bdiv ui-jqgrid-bdiv\"></div>');$('#gview_'+$.jgrid.jqID($t.p.id)).append($t.grid.fhDiv);var htbl=$('.ui-jqgrid-htable','#gview_'+$.jgrid.jqID($t.p.id)).clone(true);// groupheader support - only if useColSpanstyle is false\nif($t.p.groupHeader){$('tr.jqg-first-row-header, tr.jqg-third-row-header',htbl).each(function(){$('th:gt('+maxfrozen+')',this).remove();});var swapfroz=-1,fdel=-1;$('tr.jqg-second-row-header th',htbl).each(function(){var cs=parseInt($(this).attr('colspan'),10);if(cs){swapfroz=swapfroz+cs;fdel++;}if(swapfroz===maxfrozen){return false;}});if(swapfroz!==maxfrozen){fdel=maxfrozen;}$('tr.jqg-second-row-header',htbl).each(function(){$('th:gt('+fdel+')',this).remove();});}else{$('tr',htbl).each(function(){$('th:gt('+maxfrozen+')',this).remove();});}$(htbl).width(1);// resizing stuff\n$($t.grid.fhDiv).append(htbl).mousemove(function(e){if($t.grid.resizing){$t.grid.dragMove(e);return false;}});$($t).bind('jqGridResizeStop.setFrozenColumns',function(e,w,index){var rhth=$('.ui-jqgrid-htable',$t.grid.fhDiv);$('th:eq('+index+')',rhth).width(w);var btd=$('.ui-jqgrid-btable',$t.grid.fbDiv);$('tr:first td:eq('+index+')',btd).width(w);});// sorting stuff\n$($t).bind('jqGridOnSortCol.setFrozenColumns',function(index,idxcol){var previousSelectedTh=$('tr.ui-jqgrid-labels:last th:eq('+$t.p.lastsort+')',$t.grid.fhDiv),newSelectedTh=$('tr.ui-jqgrid-labels:last th:eq('+idxcol+')',$t.grid.fhDiv);$('span.ui-grid-ico-sort',previousSelectedTh).addClass('ui-state-disabled');$(previousSelectedTh).attr('aria-selected','false');$('span.ui-icon-'+$t.p.sortorder,newSelectedTh).removeClass('ui-state-disabled');$(newSelectedTh).attr('aria-selected','true');if(!$t.p.viewsortcols[0]){if($t.p.lastsort!=idxcol){$('span.s-ico',previousSelectedTh).hide();$('span.s-ico',newSelectedTh).show();}}});// data stuff\n//TODO support for setRowData\n$('#gview_'+$.jgrid.jqID($t.p.id)).append($t.grid.fbDiv);$($t.grid.bDiv).scroll(function(){$($t.grid.fbDiv).scrollTop($(this).scrollTop());});if($t.p.hoverrows===true){$('#'+$.jgrid.jqID($t.p.id)).unbind('mouseover').unbind('mouseout');}$($t).bind('jqGridAfterGridComplete.setFrozenColumns',function(){$('#'+$.jgrid.jqID($t.p.id)+'_frozen').remove();$($t.grid.fbDiv).height($($t.grid.bDiv).height()-16);var btbl=$('#'+$.jgrid.jqID($t.p.id)).clone(true);$('tr',btbl).each(function(){$('td:gt('+maxfrozen+')',this).remove();});$(btbl).width(1).attr('id',$t.p.id+'_frozen');$($t.grid.fbDiv).append(btbl);if($t.p.hoverrows===true){$('tr.jqgrow',btbl).hover(function(){$(this).addClass('ui-state-hover');$('#'+$.jgrid.jqID(this.id),'#'+$.jgrid.jqID($t.p.id)).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');$('#'+$.jgrid.jqID(this.id),'#'+$.jgrid.jqID($t.p.id)).removeClass('ui-state-hover');});$('tr.jqgrow','#'+$.jgrid.jqID($t.p.id)).hover(function(){$(this).addClass('ui-state-hover');$('#'+$.jgrid.jqID(this.id),'#'+$.jgrid.jqID($t.p.id)+'_frozen').addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');$('#'+$.jgrid.jqID(this.id),'#'+$.jgrid.jqID($t.p.id)+'_frozen').removeClass('ui-state-hover');});}btbl=null;});$t.p.frozenColumns=true;}});},destroyFrozenColumns:function destroyFrozenColumns(){return this.each(function(){if(!this.grid){return;}if(this.p.frozenColumns===true){var $t=this;$($t.grid.fhDiv).remove();$($t.grid.fbDiv).remove();$t.grid.fhDiv=null;$t.grid.fbDiv=null;$(this).unbind('.setFrozenColumns');if($t.p.hoverrows===true){var ptr;$('#'+$.jgrid.jqID($t.p.id)).bind('mouseover',function(e){ptr=$(e.target).closest('tr.jqgrow');if($(ptr).attr('class')!=='ui-subgrid'){$(ptr).addClass('ui-state-hover');}}).bind('mouseout',function(e){ptr=$(e.target).closest('tr.jqgrow');$(ptr).removeClass('ui-state-hover');});}this.p.frozenColumns=false;}});}});})(jQuery);/*\r\n * jqModal - Minimalist Modaling with jQuery\r\n *   (http://dev.iceburg.net/jquery/jqmodal/)\r\n *\r\n * Copyright (c) 2007,2008 Brice Burgess <bhb@iceburg.net>\r\n * Dual licensed under the MIT and GPL licenses:\r\n *   http://www.opensource.org/licenses/mit-license.php\r\n *   http://www.gnu.org/licenses/gpl.html\r\n *\r\n * $Version: 07/06/2008 +r13\r\n */(function($){$.fn.jqm=function(o){var p={overlay:50,closeoverlay:true,overlayClass:'jqmOverlay',closeClass:'jqmClose',trigger:'.jqModal',ajax:F,ajaxText:'',target:F,modal:F,toTop:F,onShow:F,onHide:F,onLoad:F};return this.each(function(){if(this._jqm)return H[this._jqm].c=$.extend({},H[this._jqm].c,o);s++;this._jqm=s;H[s]={c:$.extend(p,$.jqm.params,o),a:F,w:$(this).addClass('jqmID'+s),s:s};if(p.trigger)$(this).jqmAddTrigger(p.trigger);});};$.fn.jqmAddClose=function(e){return hs(this,e,'jqmHide');};$.fn.jqmAddTrigger=function(e){return hs(this,e,'jqmShow');};$.fn.jqmShow=function(t){return this.each(function(){$.jqm.open(this._jqm,t);});};$.fn.jqmHide=function(t){return this.each(function(){$.jqm.close(this._jqm,t);});};$.jqm={hash:{},open:function open(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=parseInt(h.w.css('z-index'));z=z>0?z:3000;var o=$('<div></div>').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});if(h.a)return F;h.t=t;h.a=true;h.w.css('z-index',z);if(c.modal){if(!A[0])setTimeout(function(){L('bind');},1);A.push(s);}else if(c.overlay>0){if(c.closeoverlay)h.w.jqmAddClose(o);}else o=F;h.o=o?o.addClass(c.overlayClass).prependTo('body'):F;if(c.ajax){var r=c.target||h.w,u=c.ajax;r=typeof r=='string'?$(r,h.w):$(r);u=u.substr(0,1)=='@'?$(t).attr(u.substring(1)):u;r.html(c.ajaxText).load(u,function(){if(c.onLoad)c.onLoad.call(this,h);if(cc)h.w.jqmAddClose($(cc,h.w));e(h);});}else if(cc)h.w.jqmAddClose($(cc,h.w));if(c.toTop&&h.o)h.w.before('<span id=\"jqmP'+h.w[0]._jqm+'\"></span>').insertAfter(h.o);c.onShow?c.onShow(h):h.w.show();e(h);return F;},close:function close(s){var h=H[s];if(!h.a)return F;h.a=F;if(A[0]){A.pop();if(!A[0])L('unbind');}if(h.c.toTop&&h.o)$('#jqmP'+h.w[0]._jqm).after(h.w).remove();if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove();}return F;},params:{}};var s=0,H=$.jqm.hash,A=[],F=false,e=function e(h){f(h);},f=function f(h){try{$(':input:visible',h.w)[0].focus();}catch(_){}},L=function L(t){$(document)[t]('keypress',m)[t]('keydown',m)[t]('mousedown',m);},m=function m(e){var h=H[A[A.length-1]],r=!$(e.target).parents('.jqmID'+h.s)[0];if(r)f(h);return!r;},hs=function hs(w,t,c){return w.each(function(){var s=this._jqm;$(t).each(function(){if(!this[c]){this[c]=[];$(this).click(function(){for(var i in{jqmShow:1,jqmHide:1}){for(var s in this[i]){if(H[this[i][s]])H[this[i][s]].w[i](this);}}return F;});}this[c].push(s);});});};})(jQuery);/*\r\n * jqDnR - Minimalistic Drag'n'Resize for jQuery.\r\n *\r\n * Copyright (c) 2007 Brice Burgess <bhb@iceburg.net>, http://www.iceburg.net\r\n * Licensed under the MIT License:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * $Version: 2007.08.19 +r2\r\n */(function($){$.fn.jqDrag=function(h){return i(this,h,'d');};$.fn.jqResize=function(h,ar){return i(this,h,'r',ar);};$.jqDnR={dnr:{},e:0,drag:function drag(v){if(M.k=='d'){E.css({left:M.X+v.pageX-M.pX,top:M.Y+v.pageY-M.pY});}else{E.css({width:Math.max(v.pageX-M.pX+M.W,0),height:Math.max(v.pageY-M.pY+M.H,0)});if(M1){E1.css({width:Math.max(v.pageX-M1.pX+M1.W,0),height:Math.max(v.pageY-M1.pY+M1.H,0)});}}return false;},stop:function stop(){//E.css('opacity',M.o);\n$(document).unbind('mousemove',J.drag).unbind('mouseup',J.stop);}};var J=$.jqDnR,M=J.dnr,E=J.e,E1,M1,i=function i(e,h,k,aR){return e.each(function(){h=h?$(h,e):e;h.bind('mousedown',{e:e,k:k},function(v){var d=v.data,p={};E=d.e;E1=aR?$(aR):false;// attempt utilization of dimensions plugin to fix IE issues\nif(E.css('position')!='relative'){try{E.position(p);}catch(e){}}M={X:p.left||f('left')||0,Y:p.top||f('top')||0,W:f('width')||E[0].scrollWidth||0,H:f('height')||E[0].scrollHeight||0,pX:v.pageX,pY:v.pageY,k:d.k//o:E.css('opacity')\n};// also resize\nif(E1&&d.k!='d'){M1={X:p.left||f1('left')||0,Y:p.top||f1('top')||0,W:E1[0].offsetWidth||f1('width')||0,H:E1[0].offsetHeight||f1('height')||0,pX:v.pageX,pY:v.pageY,k:d.k};}else{M1=false;}//E.css({opacity:0.8});\nif($('input.hasDatepicker',E[0])[0]){try{$('input.hasDatepicker',E[0]).datepicker('hide');}catch(dpe){}}$(document).mousemove($.jqDnR.drag).mouseup($.jqDnR.stop);return false;});});},f=function f(k){return parseInt(E.css(k),10)||false;},f1=function f1(k){return parseInt(E1.css(k),10)||false;};})(jQuery);/*\r\n\tThe below work is licensed under Creative Commons GNU LGPL License.\r\n\r\n\tOriginal work:\r\n\r\n\tLicense:     http://creativecommons.org/licenses/LGPL/2.1/\r\n\tAuthor:      Stefan Goessner/2006\r\n\tWeb:         http://goessner.net/\r\n\r\n\tModifications made:\r\n\r\n\tVersion:     0.9-p5\r\n\tDescription: Restructured code, JSLint validated (no strict whitespaces),\r\n\t             added handling of empty arrays, empty strings, and int/floats values.\r\n\tAuthor:      Michael Schøler/2008-01-29\r\n\tWeb:         http://michael.hinnerup.net/blog/2008/01/26/converting-json-to-xml-and-xml-to-json/\r\n\r\n\tDescription: json2xml added support to convert functions as CDATA\r\n\t             so it will be easy to write characters that cause some problems when convert\r\n\tAuthor:      Tony Tomov\r\n*/ /*global alert */var xmlJsonClass={// Param \"xml\": Element or document DOM node.\n// Param \"tab\": Tab or indent string for pretty output formatting omit or use empty string \"\" to supress.\n// Returns:     JSON string\nxml2json:function xml2json(xml,tab){if(xml.nodeType===9){// document node\nxml=xml.documentElement;}var nws=this.removeWhite(xml);var obj=this.toObj(nws);var json=this.toJson(obj,xml.nodeName,'\\t');return'{\\n'+tab+(tab?json.replace(/\\t/g,tab):json.replace(/\\t|\\n/g,''))+'\\n}';},// Param \"o\":   JavaScript object\n// Param \"tab\": tab or indent string for pretty output formatting omit or use empty string \"\" to supress.\n// Returns:     XML string\njson2xml:function json2xml(o,tab){var toXml=function toXml(v,name,ind){var xml='';var i,n;if(v instanceof Array){if(v.length===0){xml+=ind+'<'+name+'>__EMPTY_ARRAY_</'+name+'>\\n';}else{for(i=0,n=v.length;i<n;i+=1){var sXml=ind+toXml(v[i],name,ind+'\\t')+'\\n';xml+=sXml;}}}else if(_typeof(v)==='object'){var hasChild=false;xml+=ind+'<'+name;var m;for(m in v){if(v.hasOwnProperty(m)){if(m.charAt(0)==='@'){xml+=' '+m.substr(1)+'=\"'+v[m].toString()+'\"';}else{hasChild=true;}}}xml+=hasChild?'>':'/>';if(hasChild){for(m in v){if(v.hasOwnProperty(m)){if(m==='#text'){xml+=v[m];}else if(m==='#cdata'){xml+='<![CDATA['+v[m]+']]>';}else if(m.charAt(0)!=='@'){xml+=toXml(v[m],m,ind+'\\t');}}}xml+=(xml.charAt(xml.length-1)==='\\n'?ind:'')+'</'+name+'>';}}else if(typeof v==='function'){xml+=ind+'<'+name+'>'+'<![CDATA['+v+']]>'+'</'+name+'>';}else{if(v===undefined){v='';}if(v.toString()==='\"\"'||v.toString().length===0){xml+=ind+'<'+name+'>__EMPTY_STRING_</'+name+'>';}else{xml+=ind+'<'+name+'>'+v.toString()+'</'+name+'>';}}return xml;};var xml='';var m;for(m in o){if(o.hasOwnProperty(m)){xml+=toXml(o[m],m,'');}}return tab?xml.replace(/\\t/g,tab):xml.replace(/\\t|\\n/g,'');},// Internal methods\ntoObj:function toObj(xml){var o={};var FuncTest=/function/i;if(xml.nodeType===1){// element node ..\nif(xml.attributes.length){// element with attributes ..\nvar i;for(i=0;i<xml.attributes.length;i+=1){o['@'+xml.attributes[i].nodeName]=(xml.attributes[i].nodeValue||'').toString();}}if(xml.firstChild){// element has child nodes ..\nvar textChild=0,cdataChild=0,hasElementChild=false;var n;for(n=xml.firstChild;n;n=n.nextSibling){if(n.nodeType===1){hasElementChild=true;}else if(n.nodeType===3&&n.nodeValue.match(/[^ \\f\\n\\r\\t\\v]/)){// non-whitespace text\ntextChild+=1;}else if(n.nodeType===4){// cdata section node\ncdataChild+=1;}}if(hasElementChild){if(textChild<2&&cdataChild<2){// structured element with evtl. a single text or/and cdata node ..\nthis.removeWhite(xml);for(n=xml.firstChild;n;n=n.nextSibling){if(n.nodeType===3){// text node\no['#text']=this.escape(n.nodeValue);}else if(n.nodeType===4){// cdata node\nif(FuncTest.test(n.nodeValue)){o[n.nodeName]=[o[n.nodeName],n.nodeValue];}else{o['#cdata']=this.escape(n.nodeValue);}}else if(o[n.nodeName]){// multiple occurence of element ..\nif(o[n.nodeName]instanceof Array){o[n.nodeName][o[n.nodeName].length]=this.toObj(n);}else{o[n.nodeName]=[o[n.nodeName],this.toObj(n)];}}else{// first occurence of element ..\no[n.nodeName]=this.toObj(n);}}}else{// mixed content\nif(!xml.attributes.length){o=this.escape(this.innerXml(xml));}else{o['#text']=this.escape(this.innerXml(xml));}}}else if(textChild){// pure text\nif(!xml.attributes.length){o=this.escape(this.innerXml(xml));if(o==='__EMPTY_ARRAY_'){o='[]';}else if(o==='__EMPTY_STRING_'){o='';}}else{o['#text']=this.escape(this.innerXml(xml));}}else if(cdataChild){// cdata\nif(cdataChild>1){o=this.escape(this.innerXml(xml));}else{for(n=xml.firstChild;n;n=n.nextSibling){if(FuncTest.test(xml.firstChild.nodeValue)){o=xml.firstChild.nodeValue;break;}else{o['#cdata']=this.escape(n.nodeValue);}}}}}if(!xml.attributes.length&&!xml.firstChild){o=null;}}else if(xml.nodeType===9){// document.node\no=this.toObj(xml.documentElement);}else{alert('unhandled node type: '+xml.nodeType);}return o;},toJson:function toJson(o,name,ind,wellform){if(wellform===undefined)wellform=true;var json=name?'\"'+name+'\"':'',tab='\\t',newline='\\n';if(!wellform){tab='';newline='';}if(o==='[]'){json+=name?':[]':'[]';}else if(o instanceof Array){var n,i,ar=[];for(i=0,n=o.length;i<n;i+=1){ar[i]=this.toJson(o[i],'',ind+tab,wellform);}json+=(name?':[':'[')+(ar.length>1?newline+ind+tab+ar.join(','+newline+ind+tab)+newline+ind:ar.join(''))+']';}else if(o===null){json+=(name&&':')+'null';}else if(_typeof(o)==='object'){var arr=[],m;for(m in o){if(o.hasOwnProperty(m)){arr[arr.length]=this.toJson(o[m],m,ind+tab,wellform);}}json+=(name?':{':'{')+(arr.length>1?newline+ind+tab+arr.join(','+newline+ind+tab)+newline+ind:arr.join(''))+'}';}else if(typeof o==='string'){/*\r\n\t\t\tvar objRegExp  = /(^-?\\d+\\.?\\d*$)/;\r\n\t\t\tvar FuncTest = /function/i;\r\n\t\t\tvar os = o.toString();\r\n\t\t\tif (objRegExp.test(os) || FuncTest.test(os) || os===\"false\" || os===\"true\") {\r\n\t\t\t\t// int or float\r\n\t\t\t\tjson += (name && \":\")  + \"\\\"\" +os + \"\\\"\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t*/json+=(name&&':')+'\"'+o.replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"')+'\"';//}\n}else{json+=(name&&':')+o.toString();}return json;},innerXml:function innerXml(node){var s='';if('innerHTML'in node){s=node.innerHTML;}else{var asXml=function asXml(n){var s='',i;if(n.nodeType===1){s+='<'+n.nodeName;for(i=0;i<n.attributes.length;i+=1){s+=' '+n.attributes[i].nodeName+'=\"'+(n.attributes[i].nodeValue||'').toString()+'\"';}if(n.firstChild){s+='>';for(var c=n.firstChild;c;c=c.nextSibling){s+=asXml(c);}s+='</'+n.nodeName+'>';}else{s+='/>';}}else if(n.nodeType===3){s+=n.nodeValue;}else if(n.nodeType===4){s+='<![CDATA['+n.nodeValue+']]>';}return s;};for(var c=node.firstChild;c;c=c.nextSibling){s+=asXml(c);}}return s;},escape:function escape(txt){return txt.replace(/[\\\\]/g,'\\\\\\\\').replace(/[\\\"]/g,'\\\\\"').replace(/[\\n]/g,'\\\\n').replace(/[\\r]/g,'\\\\r');},removeWhite:function removeWhite(e){e.normalize();var n;for(n=e.firstChild;n;){if(n.nodeType===3){// text node\nif(!n.nodeValue.match(/[^ \\f\\n\\r\\t\\v]/)){// pure whitespace text node\nvar nxt=n.nextSibling;e.removeChild(n);n=nxt;}else{n=n.nextSibling;}}else if(n.nodeType===1){// element node\nthis.removeWhite(n);n=n.nextSibling;}else{// any other node\nn=n.nextSibling;}}return e;}};/*\r\n**\r\n * formatter for values but most of the values if for jqGrid\r\n * Some of this was inspired and based on how YUI does the table datagrid but in jQuery fashion\r\n * we are trying to keep it as light as possible\r\n * Joshua Burnett josh@9ci.com\r\n * http://www.greenbill.com\r\n *\r\n * Changes from Tony Tomov tony@trirand.com\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n *\r\n**/ /*jshint eqeqeq:false */ /*global jQuery */(function($){'use strict';$.fmatter={};//opts can be id:row id for the row, rowdata:the data for the row, colmodel:the column model for this column\n//example {id:1234,}\n$.extend($.fmatter,{isBoolean:function isBoolean(o){return typeof o==='boolean';},isObject:function isObject(o){return o&&(_typeof(o)==='object'||$.isFunction(o))||false;},isString:function isString(o){return typeof o==='string';},isNumber:function isNumber(o){return typeof o==='number'&&isFinite(o);},isNull:function isNull(o){return o===null;},isUndefined:function isUndefined(o){return o===undefined;},isValue:function isValue(o){return this.isObject(o)||this.isString(o)||this.isNumber(o)||this.isBoolean(o);},isEmpty:function isEmpty(o){if(!this.isString(o)&&this.isValue(o)){return false;}if(!this.isValue(o)){return true;}o=$.trim(o).replace(/\\&nbsp\\;/ig,'').replace(/\\&#160\\;/ig,'');return o==='';}});$.fn.fmatter=function(formatType,cellval,opts,rwd,act){// build main options before element iteration\nvar v=cellval;opts=$.extend({},$.jgrid.formatter,opts);try{v=$.fn.fmatter[formatType].call(this,cellval,opts,rwd,act);}catch(fe){}return v;};$.fmatter.util={// Taken from YAHOO utils\nNumberFormat:function NumberFormat(nData,opts){if(!$.fmatter.isNumber(nData)){nData*=1;}if($.fmatter.isNumber(nData)){var bNegative=nData<0;var sOutput=String(nData);var sDecimalSeparator=opts.decimalSeparator||'.';var nDotIndex;if($.fmatter.isNumber(opts.decimalPlaces)){// Round to the correct decimal place\nvar nDecimalPlaces=opts.decimalPlaces;var nDecimal=Math.pow(10,nDecimalPlaces);sOutput=String(Math.round(nData*nDecimal)/nDecimal);nDotIndex=sOutput.lastIndexOf('.');if(nDecimalPlaces>0){// Add the decimal separator\nif(nDotIndex<0){sOutput+=sDecimalSeparator;nDotIndex=sOutput.length-1;}// Replace the \".\"\nelse if(sDecimalSeparator!=='.'){sOutput=sOutput.replace('.',sDecimalSeparator);}// Add missing zeros\nwhile(sOutput.length-1-nDotIndex<nDecimalPlaces){sOutput+='0';}}}if(opts.thousandsSeparator){var sThousandsSeparator=opts.thousandsSeparator;nDotIndex=sOutput.lastIndexOf(sDecimalSeparator);nDotIndex=nDotIndex>-1?nDotIndex:sOutput.length;var sNewOutput=sOutput.substring(nDotIndex);var nCount=-1,i;for(i=nDotIndex;i>0;i--){nCount++;if(nCount%3===0&&i!==nDotIndex&&(!bNegative||i>1)){sNewOutput=sThousandsSeparator+sNewOutput;}sNewOutput=sOutput.charAt(i-1)+sNewOutput;}sOutput=sNewOutput;}// Prepend prefix\nsOutput=opts.prefix?opts.prefix+sOutput:sOutput;// Append suffix\nsOutput=opts.suffix?sOutput+opts.suffix:sOutput;return sOutput;}return nData;},// Tony Tomov\n// PHP implementation. Sorry not all options are supported.\n// Feel free to add them if you want\nDateFormat:function DateFormat(format,date,newformat,opts){var token=/\\\\.|[dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU]/g,timezone=/\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g,timezoneClip=/[^-+\\dA-Z]/g,msDateRegExp=new RegExp('^\\/Date\\\\((([-+])?[0-9]+)(([-+])([0-9]{2})([0-9]{2}))?\\\\)\\/$'),msMatch=typeof date==='string'?date.match(msDateRegExp):null,pad=function pad(value,length){value=String(value);length=parseInt(length,10)||2;while(value.length<length){value='0'+value;}return value;},ts={m:1,d:1,y:1970,h:0,i:0,s:0,u:0},timestamp=0,dM,k,hl,dateFormat=['i18n'];// Internationalization strings\ndateFormat.i18n={dayNames:opts.dayNames,monthNames:opts.monthNames};if(opts.masks.hasOwnProperty(format)){format=opts.masks[format];}if(!isNaN(date-0)&&String(format).toLowerCase()=='u'){//Unix timestamp\ntimestamp=new Date(parseFloat(date)*1000);}else if(date.constructor===Date){timestamp=date;// Microsoft date format support\n}else if(msMatch!==null){timestamp=new Date(parseInt(msMatch[1],10));if(msMatch[3]){var offset=Number(msMatch[5])*60+Number(msMatch[6]);offset*=msMatch[4]=='-'?1:-1;offset-=timestamp.getTimezoneOffset();timestamp.setTime(Number(Number(timestamp)+offset*60*1000));}}else{date=String(date).split(/[\\\\\\/:_;.,\\t\\T\\s-]/);format=format.split(/[\\\\\\/:_;.,\\t\\T\\s-]/);// parsing for month names\nfor(k=0,hl=format.length;k<hl;k++){if(format[k]=='M'){dM=$.inArray(date[k],dateFormat.i18n.monthNames);if(dM!==-1&&dM<12){date[k]=dM+1;}}if(format[k]=='F'){dM=$.inArray(date[k],dateFormat.i18n.monthNames);if(dM!==-1&&dM>11){date[k]=dM+1-12;}}if(date[k]){ts[format[k].toLowerCase()]=parseInt(date[k],10);}}if(ts.f){ts.m=ts.f;}if(ts.m===0&&ts.y===0&&ts.d===0){return'&#160;';}ts.m=parseInt(ts.m,10)-1;var ty=ts.y;if(ty>=70&&ty<=99){ts.y=1900+ts.y;}else if(ty>=0&&ty<=69){ts.y=2000+ts.y;}timestamp=new Date(ts.y,ts.m,ts.d,ts.h,ts.i,ts.s,ts.u);}if(opts.masks.hasOwnProperty(newformat)){newformat=opts.masks[newformat];}else if(!newformat){newformat='Y-m-d';}var G=timestamp.getHours(),i=timestamp.getMinutes(),j=timestamp.getDate(),n=timestamp.getMonth()+1,o=timestamp.getTimezoneOffset(),s=timestamp.getSeconds(),u=timestamp.getMilliseconds(),w=timestamp.getDay(),Y=timestamp.getFullYear(),N=(w+6)%7+1,z=(new Date(Y,n-1,j)-new Date(Y,0,1))/86400000,flags={// Day\nd:pad(j),D:dateFormat.i18n.dayNames[w],j:j,l:dateFormat.i18n.dayNames[w+7],N:N,S:opts.S(j),//j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th',\nw:w,z:z,// Week\nW:N<5?Math.floor((z+N-1)/7)+1:Math.floor((z+N-1)/7)||((new Date(Y-1,0,1).getDay()+6)%7<4?53:52),// Month\nF:dateFormat.i18n.monthNames[n-1+12],m:pad(n),M:dateFormat.i18n.monthNames[n-1],n:n,t:'?',// Year\nL:'?',o:'?',Y:Y,y:String(Y).substring(2),// Time\na:G<12?opts.AmPm[0]:opts.AmPm[1],A:G<12?opts.AmPm[2]:opts.AmPm[3],B:'?',g:G%12||12,G:G,h:pad(G%12||12),H:pad(G),i:pad(i),s:pad(s),u:u,// Timezone\ne:'?',I:'?',O:(o>0?'-':'+')+pad(Math.floor(Math.abs(o)/60)*100+Math.abs(o)%60,4),P:'?',T:(String(timestamp).match(timezone)||['']).pop().replace(timezoneClip,''),Z:'?',// Full Date/Time\nc:'?',r:'?',U:Math.floor(timestamp/1000)};return newformat.replace(token,function($0){return flags.hasOwnProperty($0)?flags[$0]:$0.substring(1);});}};$.fn.fmatter.defaultFormat=function(cellval,opts){return $.fmatter.isValue(cellval)&&cellval!==''?cellval:opts.defaultValue||'&#160;';};$.fn.fmatter.email=function(cellval,opts){if(!$.fmatter.isEmpty(cellval)){return'<a href=\"mailto:'+cellval+'\">'+cellval+'</a>';}return $.fn.fmatter.defaultFormat(cellval,opts);};$.fn.fmatter.checkbox=function(cval,opts){var op=$.extend({},opts.checkbox),ds;if(opts.colModel!==undefined&&!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend({},op,opts.colModel.formatoptions);}if(op.disabled===true){ds='disabled=\"disabled\"';}else{ds='';}if($.fmatter.isEmpty(cval)||$.fmatter.isUndefined(cval)){cval=$.fn.fmatter.defaultFormat(cval,op);}cval=String(cval);cval=cval.toLowerCase();var bchk=cval.search(/(false|0|no|n|off)/i)<0?' checked=\\'checked\\' ':'';return'<input type=\"checkbox\" '+bchk+' value=\"'+cval+'\" offval=\"no\" '+ds+'/>';};$.fn.fmatter.link=function(cellval,opts){var op={target:opts.target};var target='';if(opts.colModel!==undefined&&!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend({},op,opts.colModel.formatoptions);}if(op.target){target='target='+op.target;}if(!$.fmatter.isEmpty(cellval)){return'<a '+target+' href=\"'+cellval+'\">'+cellval+'</a>';}return $.fn.fmatter.defaultFormat(cellval,opts);};$.fn.fmatter.showlink=function(cellval,opts){var op={baseLinkUrl:opts.baseLinkUrl,showAction:opts.showAction,addParam:opts.addParam||'',target:opts.target,idName:opts.idName},target='',idUrl;if(opts.colModel!==undefined&&!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend({},op,opts.colModel.formatoptions);}if(op.target){target='target='+op.target;}idUrl=op.baseLinkUrl+op.showAction+'?'+op.idName+'='+opts.rowId+op.addParam;if($.fmatter.isString(cellval)||$.fmatter.isNumber(cellval)){//add this one even if its blank string\nreturn'<a '+target+' href=\"'+idUrl+'\">'+cellval+'</a>';}return $.fn.fmatter.defaultFormat(cellval,opts);};$.fn.fmatter.integer=function(cellval,opts){var op=$.extend({},opts.integer);if(opts.colModel!==undefined&&!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend({},op,opts.colModel.formatoptions);}if($.fmatter.isEmpty(cellval)){return op.defaultValue;}return $.fmatter.util.NumberFormat(cellval,op);};$.fn.fmatter.number=function(cellval,opts){var op=$.extend({},opts.number);if(opts.colModel!==undefined&&!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend({},op,opts.colModel.formatoptions);}if($.fmatter.isEmpty(cellval)){return op.defaultValue;}return $.fmatter.util.NumberFormat(cellval,op);};$.fn.fmatter.currency=function(cellval,opts){var op=$.extend({},opts.currency);if(opts.colModel!==undefined&&!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend({},op,opts.colModel.formatoptions);}if($.fmatter.isEmpty(cellval)){return op.defaultValue;}return $.fmatter.util.NumberFormat(cellval,op);};$.fn.fmatter.date=function(cellval,opts,rwd,act){var op=$.extend({},opts.date);if(opts.colModel!==undefined&&!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend({},op,opts.colModel.formatoptions);}if(!op.reformatAfterEdit&&act=='edit'){return $.fn.fmatter.defaultFormat(cellval,opts);}if(!$.fmatter.isEmpty(cellval)){return $.fmatter.util.DateFormat(op.srcformat,cellval,op.newformat,op);}return $.fn.fmatter.defaultFormat(cellval,opts);};$.fn.fmatter.select=function(cellval,opts){// jqGrid specific\ncellval=String(cellval);var oSelect=false,ret=[],sep,delim;if(!$.fmatter.isUndefined(opts.colModel.formatoptions)){oSelect=opts.colModel.formatoptions.value;sep=opts.colModel.formatoptions.separator===undefined?':':opts.colModel.formatoptions.separator;delim=opts.colModel.formatoptions.delimiter===undefined?';':opts.colModel.formatoptions.delimiter;}else if(!$.fmatter.isUndefined(opts.colModel.editoptions)){oSelect=opts.colModel.editoptions.value;sep=opts.colModel.editoptions.separator===undefined?':':opts.colModel.editoptions.separator;delim=opts.colModel.editoptions.delimiter===undefined?';':opts.colModel.editoptions.delimiter;}if(oSelect){var msl=opts.colModel.editoptions.multiple===true?true:false,scell=[],sv;if(msl){scell=cellval.split(',');scell=$.map(scell,function(n){return $.trim(n);});}if($.fmatter.isString(oSelect)){// mybe here we can use some caching with care ????\nvar so=oSelect.split(delim),j=0,i;for(i=0;i<so.length;i++){sv=so[i].split(sep);if(sv.length>2){sv[1]=$.map(sv,function(n,i){if(i>0){return n;}}).join(sep);}if(msl){if($.inArray(sv[0],scell)>-1){ret[j]=sv[1];j++;}}else if($.trim(sv[0])==$.trim(cellval)){ret[0]=sv[1];break;}}}else if($.fmatter.isObject(oSelect)){// this is quicker\nif(msl){ret=$.map(scell,function(n){return oSelect[n];});}else{ret[0]=oSelect[cellval]||'';}}}cellval=ret.join(', ');return cellval===''?$.fn.fmatter.defaultFormat(cellval,opts):cellval;};$.fn.fmatter.rowactions=function(act){var $tr=$(this).closest('tr.jqgrow'),$actionsDiv=$(this).parent(),rid=$tr.attr('id'),$grid=$(this).closest('table.ui-jqgrid-btable'),$t=$grid[0],p=$t.p,cm=p.colModel[$.jgrid.getCellIndex(this)],op={keys:false,onEdit:null,onSuccess:null,afterSave:null,onError:null,afterRestore:null,extraparam:{},url:null,restoreAfterError:true,mtype:'POST',delOptions:{},editOptions:{}},saverow=function saverow(rowid,res){if($.isFunction(op.afterSave)){op.afterSave.call($t,rowid,res);}$actionsDiv.find('div.ui-inline-edit,div.ui-inline-del').show();$actionsDiv.find('div.ui-inline-save,div.ui-inline-cancel').hide();},restorerow=function restorerow(rowid){if($.isFunction(op.afterRestore)){op.afterRestore.call($t,rowid);}$actionsDiv.find('div.ui-inline-edit,div.ui-inline-del').show();$actionsDiv.find('div.ui-inline-save,div.ui-inline-cancel').hide();};if(!$.fmatter.isUndefined(cm.formatoptions)){op=$.extend(op,cm.formatoptions);}if(!$.fmatter.isUndefined(p.editOptions)){op.editOptions=p.editOptions;}if(!$.fmatter.isUndefined(p.delOptions)){op.delOptions=p.delOptions;}if($tr.hasClass('jqgrid-new-row')){op.extraparam[p.prmNames.oper]=p.prmNames.addoper;}var actop={keys:op.keys,oneditfunc:op.onEdit,successfunc:op.onSuccess,url:op.url,extraparam:op.extraparam,aftersavefunc:saverow,errorfunc:op.onError,afterrestorefunc:restorerow,restoreAfterError:op.restoreAfterError,mtype:op.mtype};switch(act){case'edit':$grid.jqGrid('editRow',rid,actop);$actionsDiv.find('div.ui-inline-edit,div.ui-inline-del').hide();$actionsDiv.find('div.ui-inline-save,div.ui-inline-cancel').show();$grid.triggerHandler('jqGridAfterGridComplete');break;case'save':if($grid.jqGrid('saveRow',rid,actop)){$actionsDiv.find('div.ui-inline-edit,div.ui-inline-del').show();$actionsDiv.find('div.ui-inline-save,div.ui-inline-cancel').hide();$grid.triggerHandler('jqGridAfterGridComplete');}break;case'cancel':$grid.jqGrid('restoreRow',rid,restorerow);$actionsDiv.find('div.ui-inline-edit,div.ui-inline-del').show();$actionsDiv.find('div.ui-inline-save,div.ui-inline-cancel').hide();$grid.triggerHandler('jqGridAfterGridComplete');break;case'del':$grid.jqGrid('delGridRow',rid,op.delOptions);break;case'formedit':$grid.jqGrid('setSelection',rid);$grid.jqGrid('editGridRow',rid,op.editOptions);break;}};$.fn.fmatter.actions=function(cellval,opts){var op={keys:false,editbutton:true,delbutton:true,editformbutton:false},rowid=opts.rowId,str='',ocl;if(!$.fmatter.isUndefined(opts.colModel.formatoptions)){op=$.extend(op,opts.colModel.formatoptions);}if(rowid===undefined||$.fmatter.isEmpty(rowid)){return'';}if(op.editformbutton){ocl='onclick=jQuery.fn.fmatter.rowactions.call(this,\\'formedit\\'); onmouseover=jQuery(this).addClass(\\'ui-state-hover\\'); onmouseout=jQuery(this).removeClass(\\'ui-state-hover\\'); ';str+='<div title=\\''+$.jgrid.nav.edittitle+'\\' style=\\'float:left;cursor:pointer;\\' class=\\'ui-pg-div ui-inline-edit\\' '+ocl+'><span class=\\'ui-icon ui-icon-pencil\\'></span></div>';}else if(op.editbutton){ocl='onclick=jQuery.fn.fmatter.rowactions.call(this,\\'edit\\'); onmouseover=jQuery(this).addClass(\\'ui-state-hover\\'); onmouseout=jQuery(this).removeClass(\\'ui-state-hover\\') ';str+='<div title=\\''+$.jgrid.nav.edittitle+'\\' style=\\'float:left;cursor:pointer;\\' class=\\'ui-pg-div ui-inline-edit\\' '+ocl+'><span class=\\'ui-icon ui-icon-pencil\\'></span></div>';}if(op.delbutton){ocl='onclick=jQuery.fn.fmatter.rowactions.call(this,\\'del\\'); onmouseover=jQuery(this).addClass(\\'ui-state-hover\\'); onmouseout=jQuery(this).removeClass(\\'ui-state-hover\\'); ';str+='<div title=\\''+$.jgrid.nav.deltitle+'\\' style=\\'float:left;margin-left:5px;\\' class=\\'ui-pg-div ui-inline-del\\' '+ocl+'><span class=\\'ui-icon ui-icon-trash\\'></span></div>';}ocl='onclick=jQuery.fn.fmatter.rowactions.call(this,\\'save\\'); onmouseover=jQuery(this).addClass(\\'ui-state-hover\\'); onmouseout=jQuery(this).removeClass(\\'ui-state-hover\\'); ';str+='<div title=\\''+$.jgrid.edit.bSubmit+'\\' style=\\'float:left;display:none\\' class=\\'ui-pg-div ui-inline-save\\' '+ocl+'><span class=\\'ui-icon ui-icon-disk\\'></span></div>';ocl='onclick=jQuery.fn.fmatter.rowactions.call(this,\\'cancel\\'); onmouseover=jQuery(this).addClass(\\'ui-state-hover\\'); onmouseout=jQuery(this).removeClass(\\'ui-state-hover\\'); ';str+='<div title=\\''+$.jgrid.edit.bCancel+'\\' style=\\'float:left;display:none;margin-left:5px;\\' class=\\'ui-pg-div ui-inline-cancel\\' '+ocl+'><span class=\\'ui-icon ui-icon-cancel\\'></span></div>';return'<div style=\\'margin-left:8px;\\'>'+str+'</div>';};$.unformat=function(cellval,options,pos,cnt){// specific for jqGrid only\nvar ret,formatType=options.colModel.formatter,op=options.colModel.formatoptions||{},sep,re=/([\\.\\*\\_\\'\\(\\)\\{\\}\\+\\?\\\\])/g,unformatFunc=options.colModel.unformat||$.fn.fmatter[formatType]&&$.fn.fmatter[formatType].unformat;if(unformatFunc!==undefined&&$.isFunction(unformatFunc)){ret=unformatFunc.call(this,$(cellval).text(),options,cellval);}else if(!$.fmatter.isUndefined(formatType)&&$.fmatter.isString(formatType)){var opts=$.jgrid.formatter||{},stripTag;switch(formatType){case'integer':op=$.extend({},opts.integer,op);sep=op.thousandsSeparator.replace(re,'\\\\$1');stripTag=new RegExp(sep,'g');ret=$(cellval).text().replace(stripTag,'');break;case'number':op=$.extend({},opts.number,op);sep=op.thousandsSeparator.replace(re,'\\\\$1');stripTag=new RegExp(sep,'g');ret=$(cellval).text().replace(stripTag,'').replace(op.decimalSeparator,'.');break;case'currency':op=$.extend({},opts.currency,op);sep=op.thousandsSeparator.replace(re,'\\\\$1');stripTag=new RegExp(sep,'g');ret=$(cellval).text();if(op.prefix&&op.prefix.length){ret=ret.substr(op.prefix.length);}if(op.suffix&&op.suffix.length){ret=ret.substr(0,ret.length-op.suffix.length);}ret=ret.replace(stripTag,'').replace(op.decimalSeparator,'.');break;case'checkbox':var cbv=options.colModel.editoptions?options.colModel.editoptions.value.split(':'):['Yes','No'];ret=$('input',cellval).is(':checked')?cbv[0]:cbv[1];break;case'select':ret=$.unformat.select(cellval,options,pos,cnt);break;case'actions':return'';default:ret=$(cellval).text();}}return ret!==undefined?ret:cnt===true?$(cellval).text():$.jgrid.htmlDecode($(cellval).html());};$.unformat.select=function(cellval,options,pos,cnt){// Spacial case when we have local data and perform a sort\n// cnt is set to true only in sortDataArray\nvar ret=[];var cell=$(cellval).text();if(cnt===true){return cell;}var op=$.extend({},!$.fmatter.isUndefined(options.colModel.formatoptions)?options.colModel.formatoptions:options.colModel.editoptions),sep=op.separator===undefined?':':op.separator,delim=op.delimiter===undefined?';':op.delimiter;if(op.value){var oSelect=op.value,msl=op.multiple===true?true:false,scell=[],sv;if(msl){scell=cell.split(',');scell=$.map(scell,function(n){return $.trim(n);});}if($.fmatter.isString(oSelect)){var so=oSelect.split(delim),j=0,i;for(i=0;i<so.length;i++){sv=so[i].split(sep);if(sv.length>2){sv[1]=$.map(sv,function(n,i){if(i>0){return n;}}).join(sep);}if(msl){if($.inArray(sv[1],scell)>-1){ret[j]=sv[0];j++;}}else if($.trim(sv[1])==$.trim(cell)){ret[0]=sv[0];break;}}}else if($.fmatter.isObject(oSelect)||$.isArray(oSelect)){if(!msl){scell[0]=cell;}ret=$.map(scell,function(n){var rv;$.each(oSelect,function(i,val){if(val==n){rv=i;return false;}});if(rv!==undefined){return rv;}});}return ret.join(', ');}return cell||'';};$.unformat.date=function(cellval,opts){var op=$.jgrid.formatter.date||{};if(!$.fmatter.isUndefined(opts.formatoptions)){op=$.extend({},op,opts.formatoptions);}if(!$.fmatter.isEmpty(cellval)){return $.fmatter.util.DateFormat(op.newformat,cellval,op.srcformat,op);}return $.fn.fmatter.defaultFormat(cellval,opts);};})(jQuery);/*jshint eqeqeq:false */ /*global jQuery */(function($){/*\r\n * jqGrid common function\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n*/'use strict';$.extend($.jgrid,{// Modal functions\nshowModal:function showModal(h){h.w.show();},closeModal:function closeModal(h){h.w.hide().attr('aria-hidden','true');if(h.o){h.o.remove();}},hideModal:function hideModal(selector,o){o=$.extend({jqm:true,gb:''},o||{});if(o.onClose){var oncret=o.gb&&typeof o.gb==='string'&&o.gb.substr(0,6)==='#gbox_'?o.onClose.call($('#'+o.gb.substr(6))[0],selector):o.onClose(selector);if(typeof oncret==='boolean'&&!oncret){return;}}if($.fn.jqm&&o.jqm===true){$(selector).attr('aria-hidden','true').jqmHide();}else{if(o.gb!==''){try{$('.jqgrid-overlay:first',o.gb).hide();}catch(e){}}$(selector).hide().attr('aria-hidden','true');}},//Helper functions\nfindPos:function findPos(obj){var curleft=0,curtop=0;if(obj.offsetParent){do{curleft+=obj.offsetLeft;curtop+=obj.offsetTop;}while(obj=obj.offsetParent);//do not change obj == obj.offsetParent\n}return[curleft,curtop];},createModal:function createModal(aIDs,content,p,insertSelector,posSelector,appendsel,css){p=$.extend(true,{},$.jgrid.jqModal||{},p);var mw=document.createElement('div'),rtlsup,self=this;css=$.extend({},css||{});rtlsup=$(p.gbox).attr('dir')=='rtl'?true:false;mw.className='ui-widget ui-widget-content ui-corner-all ui-jqdialog';mw.id=aIDs.themodal;var mh=document.createElement('div');mh.className='ui-jqdialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';mh.id=aIDs.modalhead;$(mh).append('<span class=\\'ui-jqdialog-title\\'>'+p.caption+'</span>');var ahr=$('<a href=\\'javascript:void(0)\\' class=\\'ui-jqdialog-titlebar-close ui-corner-all\\'></a>').hover(function(){ahr.addClass('ui-state-hover');},function(){ahr.removeClass('ui-state-hover');}).append('<span class=\\'ui-icon ui-icon-closethick\\'></span>');$(mh).append(ahr);if(rtlsup){mw.dir='rtl';$('.ui-jqdialog-title',mh).css('float','right');$('.ui-jqdialog-titlebar-close',mh).css('left',0.3+'em');}else{mw.dir='ltr';$('.ui-jqdialog-title',mh).css('float','left');$('.ui-jqdialog-titlebar-close',mh).css('right',0.3+'em');}var mc=document.createElement('div');$(mc).addClass('ui-jqdialog-content ui-widget-content').attr('id',aIDs.modalcontent);$(mc).append(content);mw.appendChild(mc);$(mw).prepend(mh);if(appendsel===true){$('body').append(mw);}//append as first child in body -for alert dialog\nelse if(typeof appendsel==='string'){$(appendsel).append(mw);}else{$(mw).insertBefore(insertSelector);}$(mw).css(css);if(p.jqModal===undefined){p.jqModal=true;}// internal use\nvar coord={};if($.fn.jqm&&p.jqModal===true){if(p.left===0&&p.top===0&&p.overlay){var pos=[];pos=$.jgrid.findPos(posSelector);p.left=pos[0]+4;p.top=pos[1]+4;}coord.top=p.top+'px';coord.left=p.left;}else if(p.left!==0||p.top!==0){coord.left=p.left;coord.top=p.top+'px';}$('a.ui-jqdialog-titlebar-close',mh).click(function(){var oncm=$('#'+$.jgrid.jqID(aIDs.themodal)).data('onClose')||p.onClose;var gboxclose=$('#'+$.jgrid.jqID(aIDs.themodal)).data('gbox')||p.gbox;self.hideModal('#'+$.jgrid.jqID(aIDs.themodal),{gb:gboxclose,jqm:p.jqModal,onClose:oncm});return false;});if(p.width===0||!p.width){p.width=300;}if(p.height===0||!p.height){p.height=200;}if(!p.zIndex){var parentZ=$(insertSelector).parents('*[role=dialog]').filter(':first').css('z-index');if(parentZ){p.zIndex=parseInt(parentZ,10)+2;}else{p.zIndex=950;}}var rtlt=0;if(rtlsup&&coord.left&&!appendsel){rtlt=$(p.gbox).width()-(!isNaN(p.width)?parseInt(p.width,10):0)-8;// to do\n// just in case\ncoord.left=parseInt(coord.left,10)+parseInt(rtlt,10);}if(coord.left){coord.left+='px';}$(mw).css($.extend({width:isNaN(p.width)?'auto':p.width+'px',height:isNaN(p.height)?'auto':p.height+'px',zIndex:p.zIndex,overflow:'hidden'},coord)).attr({tabIndex:'-1','role':'dialog','aria-labelledby':aIDs.modalhead,'aria-hidden':'true'});if(p.drag===undefined){p.drag=true;}if(p.resize===undefined){p.resize=true;}if(p.drag){$(mh).css('cursor','move');if($.fn.jqDrag){$(mw).jqDrag(mh);}else{try{$(mw).draggable({handle:$('#'+$.jgrid.jqID(mh.id))});}catch(e){}}}if(p.resize){if($.fn.jqResize){$(mw).append('<div class=\\'jqResize ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se\\'></div>');$('#'+$.jgrid.jqID(aIDs.themodal)).jqResize('.jqResize',aIDs.scrollelm?'#'+$.jgrid.jqID(aIDs.scrollelm):false);}else{try{$(mw).resizable({handles:'se, sw',alsoResize:aIDs.scrollelm?'#'+$.jgrid.jqID(aIDs.scrollelm):false});}catch(r){}}}if(p.closeOnEscape===true){$(mw).keydown(function(e){if(e.which==27){var cone=$('#'+$.jgrid.jqID(aIDs.themodal)).data('onClose')||p.onClose;self.hideModal('#'+$.jgrid.jqID(aIDs.themodal),{gb:p.gbox,jqm:p.jqModal,onClose:cone});}});}},viewModal:function viewModal(selector,o){o=$.extend({toTop:true,overlay:10,modal:false,overlayClass:'ui-widget-overlay',onShow:$.jgrid.showModal,onHide:$.jgrid.closeModal,gbox:'',jqm:true,jqM:true},o||{});if($.fn.jqm&&o.jqm===true){if(o.jqM){$(selector).attr('aria-hidden','false').jqm(o).jqmShow();}else{$(selector).attr('aria-hidden','false').jqmShow();}}else{if(o.gbox!==''){$('.jqgrid-overlay:first',o.gbox).show();$(selector).data('gbox',o.gbox);}$(selector).show().attr('aria-hidden','false');try{$(':input:visible',selector)[0].focus();}catch(_){}}},info_dialog:function info_dialog(caption,content,c_b,modalopt){var mopt={width:290,height:'auto',dataheight:'auto',drag:true,resize:false,left:250,top:170,zIndex:1000,jqModal:true,modal:false,closeOnEscape:true,align:'center',buttonalign:'center',buttons:[]// {text:'textbutt', id:\"buttid\", onClick : function(){...}}\n// if the id is not provided we set it like info_button_+ the index in the array - i.e info_button_0,info_button_1...\n};$.extend(true,mopt,$.jgrid.jqModal||{},{caption:'<b>'+caption+'</b>'},modalopt||{});var jm=mopt.jqModal,self=this;if($.fn.jqm&&!jm){jm=false;}// in case there is no jqModal\nvar buttstr='',i;if(mopt.buttons.length>0){for(i=0;i<mopt.buttons.length;i++){if(mopt.buttons[i].id===undefined){mopt.buttons[i].id='info_button_'+i;}buttstr+='<a href=\\'javascript:void(0)\\' id=\\''+mopt.buttons[i].id+'\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+mopt.buttons[i].text+'</a>';}}var dh=isNaN(mopt.dataheight)?mopt.dataheight:mopt.dataheight+'px',cn='text-align:'+mopt.align+';';var cnt='<div id=\\'info_id\\'>';cnt+='<div id=\\'infocnt\\' style=\\'margin:0px;padding-bottom:1em;width:100%;overflow:auto;position:relative;height:'+dh+';'+cn+'\\'>'+content+'</div>';cnt+=c_b?'<div class=\\'ui-widget-content ui-helper-clearfix\\' style=\\'text-align:'+mopt.buttonalign+';padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;\\'><a href=\\'javascript:void(0)\\' id=\\'closedialog\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+c_b+'</a>'+buttstr+'</div>':buttstr!==''?'<div class=\\'ui-widget-content ui-helper-clearfix\\' style=\\'text-align:'+mopt.buttonalign+';padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;\\'>'+buttstr+'</div>':'';cnt+='</div>';try{if($('#info_dialog').attr('aria-hidden')=='false'){$.jgrid.hideModal('#info_dialog',{jqm:jm});}$('#info_dialog').remove();}catch(e){}$.jgrid.createModal({themodal:'info_dialog',modalhead:'info_head',modalcontent:'info_content',scrollelm:'infocnt'},cnt,mopt,'','',true);// attach onclick after inserting into the dom\nif(buttstr){$.each(mopt.buttons,function(i){$('#'+$.jgrid.jqID(this.id),'#info_id').bind('click',function(){mopt.buttons[i].onClick.call($('#info_dialog'));return false;});});}$('#closedialog','#info_id').click(function(){self.hideModal('#info_dialog',{jqm:jm});return false;});$('.fm-button','#info_dialog').hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});if($.isFunction(mopt.beforeOpen)){mopt.beforeOpen();}$.jgrid.viewModal('#info_dialog',{onHide:function onHide(h){h.w.hide().remove();if(h.o){h.o.remove();}},modal:mopt.modal,jqm:jm});if($.isFunction(mopt.afterOpen)){mopt.afterOpen();}try{$('#info_dialog').focus();}catch(m){}},bindEv:function bindEv(el,opt,$t){if($.isFunction(opt.dataInit)){opt.dataInit.call($t,el);}if(opt.dataEvents){$.each(opt.dataEvents,function(){if(this.data!==undefined){$(el).bind(this.type,this.data,this.fn);}else{$(el).bind(this.type,this.fn);}});}},// Form Functions\ncreateEl:function createEl(eltype,options,vl,autowidth,ajaxso){var elem='',$t=this;function setAttributes(elm,atr,exl){var exclude=['dataInit','dataEvents','dataUrl','buildSelect','sopt','searchhidden','defaultValue','attr','custom_element','custom_value'];if(exl!==undefined&&$.isArray(exl)){$.merge(exclude,exl);}$.each(atr,function(key,value){if($.inArray(key,exclude)===-1){$(elm).attr(key,value);}});if(!atr.hasOwnProperty('id')){$(elm).attr('id',$.jgrid.randId());}}switch(eltype){case'textarea':elem=document.createElement('textarea');if(autowidth){if(!options.cols){$(elem).css({width:'98%'});}}else if(!options.cols){options.cols=20;}if(!options.rows){options.rows=2;}if(vl=='&nbsp;'||vl=='&#160;'||vl.length==1&&vl.charCodeAt(0)==160){vl='';}elem.value=vl;setAttributes(elem,options);$(elem).attr({'role':'textbox','multiline':'true'});break;case'checkbox'://what code for simple checkbox\nelem=document.createElement('input');elem.type='checkbox';if(!options.value){var vl1=vl.toLowerCase();if(vl1.search(/(false|0|no|off|undefined)/i)<0&&vl1!==''){elem.checked=true;elem.defaultChecked=true;elem.value=vl;}else{elem.value='on';}$(elem).attr('offval','off');}else{var cbval=options.value.split(':');if(vl===cbval[0]){elem.checked=true;elem.defaultChecked=true;}elem.value=cbval[0];$(elem).attr('offval',cbval[1]);}setAttributes(elem,options,['value']);$(elem).attr('role','checkbox');break;case'select':elem=document.createElement('select');elem.setAttribute('role','select');var msl,ovm=[];if(options.multiple===true){msl=true;elem.multiple='multiple';$(elem).attr('aria-multiselectable','true');}else{msl=false;}if(options.dataUrl!==undefined){var rowid=options.name?String(options.id).substring(0,String(options.id).length-String(options.name).length-1):String(options.id),postData=options.postData||ajaxso.postData;if($t.p&&$t.p.idPrefix){rowid=$.jgrid.stripPref($t.p.idPrefix,rowid);}else{postData=undefined;// don't use postData for searching from jqFilter. One can implement the feature in the future if required.\n}$.ajax($.extend({url:options.dataUrl,type:'GET',dataType:'html',data:$.isFunction(postData)?postData.call($t,rowid,vl,String(options.name)):postData,context:{elem:elem,options:options,vl:vl},success:function success(data){var a,ovm=[],elem=this.elem,vl=this.vl,options=$.extend({},this.options),msl=options.multiple===true;if($.isFunction(options.buildSelect)){var b=options.buildSelect.call($t,data);a=$(b).html();}else{a=$(data).html();}if(a){$(elem).append(a);setAttributes(elem,options);if(options.size===undefined){options.size=msl?3:1;}if(msl){ovm=vl.split(',');ovm=$.map(ovm,function(n){return $.trim(n);});}else{ovm[0]=$.trim(vl);}//$(elem).attr(options);\nsetTimeout(function(){$('option',elem).each(function(i){//if(i===0) { this.selected = \"\"; }\n// fix IE8/IE7 problem with selecting of the first item on multiple=true\nif(i===0&&elem.multiple){this.selected=false;}$(this).attr('role','option');if($.inArray($.trim($(this).text()),ovm)>-1||$.inArray($.trim($(this).val()),ovm)>-1){this.selected='selected';}});},0);}}},ajaxso||{}));}else if(options.value){var i;if(options.size===undefined){options.size=msl?3:1;}if(msl){ovm=vl.split(',');ovm=$.map(ovm,function(n){return $.trim(n);});}if(typeof options.value==='function'){options.value=options.value();}var so,sv,ov,sep=options.separator===undefined?':':options.separator,delim=options.delimiter===undefined?';':options.delimiter;if(typeof options.value==='string'){so=options.value.split(delim);for(i=0;i<so.length;i++){sv=so[i].split(sep);if(sv.length>2){sv[1]=$.map(sv,function(n,ii){if(ii>0){return n;}}).join(sep);}ov=document.createElement('option');ov.setAttribute('role','option');ov.value=sv[0];ov.innerHTML=sv[1];elem.appendChild(ov);if(!msl&&($.trim(sv[0])==$.trim(vl)||$.trim(sv[1])==$.trim(vl))){ov.selected='selected';}if(msl&&($.inArray($.trim(sv[1]),ovm)>-1||$.inArray($.trim(sv[0]),ovm)>-1)){ov.selected='selected';}}}else if(_typeof(options.value)==='object'){var oSv=options.value,key;for(key in oSv){if(oSv.hasOwnProperty(key)){ov=document.createElement('option');ov.setAttribute('role','option');ov.value=key;ov.innerHTML=oSv[key];elem.appendChild(ov);if(!msl&&($.trim(key)==$.trim(vl)||$.trim(oSv[key])==$.trim(vl))){ov.selected='selected';}if(msl&&($.inArray($.trim(oSv[key]),ovm)>-1||$.inArray($.trim(key),ovm)>-1)){ov.selected='selected';}}}}setAttributes(elem,options,['value']);}break;case'text':case'password':case'button':var role;if(eltype=='button'){role='button';}else{role='textbox';}elem=document.createElement('input');elem.type=eltype;elem.value=vl;setAttributes(elem,options);if(eltype!='button'){if(autowidth){if(!options.size){$(elem).css({width:'98%'});}}else if(!options.size){options.size=20;}}$(elem).attr('role',role);break;case'image':case'file':elem=document.createElement('input');elem.type=eltype;setAttributes(elem,options);break;case'custom':elem=document.createElement('span');try{if($.isFunction(options.custom_element)){var celm=options.custom_element.call($t,vl,options);if(celm){celm=$(celm).addClass('customelement').attr({id:options.id,name:options.name});$(elem).empty().append(celm);}else{throw'e2';}}else{throw'e1';}}catch(e){if(e=='e1'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_element\\' '+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose);}if(e=='e2'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_element\\' '+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,typeof e==='string'?e:e.message,$.jgrid.edit.bClose);}}break;}return elem;},// Date Validation Javascript\ncheckDate:function checkDate(format,date){var daysInFebruary=function daysInFebruary(year){// February has 29 days in any year evenly divisible by four,\n// EXCEPT for centurial years which are not also divisible by 400.\nreturn year%4===0&&(year%100!==0||year%400===0)?29:28;},daysArray=function daysArray(n){var i;for(i=1;i<=n;i++){this[i]=31;if(i==4||i==6||i==9||i==11){this[i]=30;}if(i==2){this[i]=29;}}return this;};var tsp={},sep;format=format.toLowerCase();//we search for /,-,. for the date separator\nif(format.indexOf('/')!=-1){sep='/';}else if(format.indexOf('-')!=-1){sep='-';}else if(format.indexOf('.')!=-1){sep='.';}else{sep='/';}format=format.split(sep);date=date.split(sep);if(date.length!=3){return false;}var j=-1,yln,dln=-1,mln=-1,i;for(i=0;i<format.length;i++){var dv=isNaN(date[i])?0:parseInt(date[i],10);tsp[format[i]]=dv;yln=format[i];if(yln.indexOf('y')!=-1){j=i;}if(yln.indexOf('m')!=-1){mln=i;}if(yln.indexOf('d')!=-1){dln=i;}}if(format[j]=='y'||format[j]=='yyyy'){yln=4;}else if(format[j]=='yy'){yln=2;}else{yln=-1;}var daysInMonth=daysArray(12),strDate;if(j===-1){return false;}strDate=tsp[format[j]].toString();if(yln==2&&strDate.length==1){yln=1;}if(strDate.length!=yln||tsp[format[j]]===0&&date[j]!='00'){return false;}if(mln===-1){return false;}strDate=tsp[format[mln]].toString();if(strDate.length<1||tsp[format[mln]]<1||tsp[format[mln]]>12){return false;}if(dln===-1){return false;}strDate=tsp[format[dln]].toString();if(strDate.length<1||tsp[format[dln]]<1||tsp[format[dln]]>31||tsp[format[mln]]==2&&tsp[format[dln]]>daysInFebruary(tsp[format[j]])||tsp[format[dln]]>daysInMonth[tsp[format[mln]]]){return false;}return true;},isEmpty:function isEmpty(val){if(val.match(/^\\s+$/)||val===''){return true;}return false;},checkTime:function checkTime(time){// checks only hh:ss (and optional am/pm)\nvar re=/^(\\d{1,2}):(\\d{2})([ap]m)?$/,regs;if(!$.jgrid.isEmpty(time)){regs=time.match(re);if(regs){if(regs[3]){if(regs[1]<1||regs[1]>12){return false;}}else{if(regs[1]>23){return false;}}if(regs[2]>59){return false;}}else{return false;}}return true;},checkValues:function checkValues(val,valref,g,customobject,nam){var edtrul,i,nm,dft,len;if(customobject===undefined){if(typeof valref==='string'){for(i=0,len=g.p.colModel.length;i<len;i++){if(g.p.colModel[i].name==valref){edtrul=g.p.colModel[i].editrules;valref=i;try{nm=g.p.colModel[i].formoptions.label;}catch(e){}break;}}}else if(valref>=0){edtrul=g.p.colModel[valref].editrules;}}else{edtrul=customobject;nm=nam===undefined?'_':nam;}if(edtrul){if(!nm){nm=g.p.colNames[valref];}if(edtrul.required===true){if($.jgrid.isEmpty(val)){return[false,nm+': '+$.jgrid.edit.msg.required,''];}}// force required\nvar rqfield=edtrul.required===false?false:true;if(edtrul.number===true){if(!(rqfield===false&&$.jgrid.isEmpty(val))){if(isNaN(val)){return[false,nm+': '+$.jgrid.edit.msg.number,''];}}}if(edtrul.minValue!==undefined&&!isNaN(edtrul.minValue)){if(parseFloat(val)<parseFloat(edtrul.minValue)){return[false,nm+': '+$.jgrid.edit.msg.minValue+' '+edtrul.minValue,''];}}if(edtrul.maxValue!==undefined&&!isNaN(edtrul.maxValue)){if(parseFloat(val)>parseFloat(edtrul.maxValue)){return[false,nm+': '+$.jgrid.edit.msg.maxValue+' '+edtrul.maxValue,''];}}var filter;if(edtrul.email===true){if(!(rqfield===false&&$.jgrid.isEmpty(val))){// taken from $ Validate plugin\nfilter=/^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i;if(!filter.test(val)){return[false,nm+': '+$.jgrid.edit.msg.email,''];}}}if(edtrul.integer===true){if(!(rqfield===false&&$.jgrid.isEmpty(val))){if(isNaN(val)){return[false,nm+': '+$.jgrid.edit.msg.integer,''];}if(val%1!==0||val.indexOf('.')!=-1){return[false,nm+': '+$.jgrid.edit.msg.integer,''];}}}if(edtrul.date===true){if(!(rqfield===false&&$.jgrid.isEmpty(val))){if(g.p.colModel[valref].formatoptions&&g.p.colModel[valref].formatoptions.newformat){dft=g.p.colModel[valref].formatoptions.newformat;}else{dft=g.p.colModel[valref].datefmt||'Y-m-d';}if(!$.jgrid.checkDate(dft,val)){return[false,nm+': '+$.jgrid.edit.msg.date+' - '+dft,''];}}}if(edtrul.time===true){if(!(rqfield===false&&$.jgrid.isEmpty(val))){if(!$.jgrid.checkTime(val)){return[false,nm+': '+$.jgrid.edit.msg.date+' - hh:mm (am/pm)',''];}}}if(edtrul.url===true){if(!(rqfield===false&&$.jgrid.isEmpty(val))){filter=/^(((https?)|(ftp)):\\/\\/([\\-\\w]+\\.)+\\w{2,3}(\\/[%\\-\\w]+(\\.\\w{2,})?)*(([\\w\\-\\.\\?\\\\\\/+@&#;`~=%!]*)(\\.\\w{2,})?)*\\/?)/i;if(!filter.test(val)){return[false,nm+': '+$.jgrid.edit.msg.url,''];}}}if(edtrul.custom===true){if(!(rqfield===false&&$.jgrid.isEmpty(val))){if($.isFunction(edtrul.custom_func)){var ret=edtrul.custom_func.call(g,val,nm);return $.isArray(ret)?ret:[false,$.jgrid.edit.msg.customarray,''];}return[false,$.jgrid.edit.msg.customfcheck,''];}}}return[true,'',''];}});})(jQuery);/*\r\n * jqFilter  jQuery jqGrid filter addon.\r\n * Copyright (c) 2011, Tony Tomov, tony@trirand.com\r\n * Dual licensed under the MIT and GPL licenses\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n *\r\n * The work is inspired from this Stefan Pirvu\r\n * http://www.codeproject.com/KB/scripting/json-filtering.aspx\r\n *\r\n * The filter uses JSON entities to hold filter rules and groups. Here is an example of a filter:\r\n\r\n{ \"groupOp\": \"AND\",\r\n      \"groups\" : [\r\n        { \"groupOp\": \"OR\",\r\n            \"rules\": [\r\n                { \"field\": \"name\", \"op\": \"eq\", \"data\": \"England\" },\r\n                { \"field\": \"id\", \"op\": \"le\", \"data\": \"5\"}\r\n             ]\r\n        }\r\n      ],\r\n      \"rules\": [\r\n        { \"field\": \"name\", \"op\": \"eq\", \"data\": \"Romania\" },\r\n        { \"field\": \"id\", \"op\": \"le\", \"data\": \"1\"}\r\n      ]\r\n}\r\n*/ /*jshint eqeqeq:false, eqnull:true, devel:true */ /*global jQuery */(function($){'use strict';$.fn.jqFilter=function(arg){if(typeof arg==='string'){var fn=$.fn.jqFilter[arg];if(!fn){throw'jqFilter - No such method: '+arg;}var args=$.makeArray(arguments).slice(1);return fn.apply(this,args);}var p=$.extend(true,{filter:null,columns:[],onChange:null,afterRedraw:null,checkValues:null,error:false,errmsg:'',errorcheck:true,showQuery:true,sopt:null,ops:[{'name':'eq','description':'equal','operator':'='},{'name':'ne','description':'not equal','operator':'<>'},{'name':'lt','description':'less','operator':'<'},{'name':'le','description':'less or equal','operator':'<='},{'name':'gt','description':'greater','operator':'>'},{'name':'ge','description':'greater or equal','operator':'>='},{'name':'bw','description':'begins with','operator':'LIKE'},{'name':'bn','description':'does not begin with','operator':'NOT LIKE'},{'name':'in','description':'in','operator':'IN'},{'name':'ni','description':'not in','operator':'NOT IN'},{'name':'ew','description':'ends with','operator':'LIKE'},{'name':'en','description':'does not end with','operator':'NOT LIKE'},{'name':'cn','description':'contains','operator':'LIKE'},{'name':'nc','description':'does not contain','operator':'NOT LIKE'},{'name':'nu','description':'is null','operator':'IS NULL'},{'name':'nn','description':'is not null','operator':'IS NOT NULL'}],numopts:['eq','ne','lt','le','gt','ge','nu','nn','in','ni'],stropts:['eq','ne','bw','bn','ew','en','cn','nc','nu','nn','in','ni'],strarr:['text','string','blob'],_gridsopt:[],// grid translated strings, do not tuch\ngroupOps:[{op:'AND',text:'AND'},{op:'OR',text:'OR'}],groupButton:true,ruleButtons:true,direction:'ltr'},$.jgrid.filter,arg||{});return this.each(function(){if(this.filter){return;}this.p=p;// setup filter in case if they is not defined\nif(this.p.filter===null||this.p.filter===undefined){this.p.filter={groupOp:this.p.groupOps[0].op,rules:[],groups:[]};}var i,len=this.p.columns.length,cl,isIE=/msie/i.test(navigator.userAgent)&&!window.opera;// translating the options\nif(this.p._gridsopt.length){// ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']\nfor(i=0;i<this.p._gridsopt.length;i++){this.p.ops[i].description=this.p._gridsopt[i];}}this.p.initFilter=$.extend(true,{},this.p.filter);// set default values for the columns if they are not set\nif(!len){return;}for(i=0;i<len;i++){cl=this.p.columns[i];if(cl.stype){// grid compatibility\ncl.inputtype=cl.stype;}else if(!cl.inputtype){cl.inputtype='text';}if(cl.sorttype){// grid compatibility\ncl.searchtype=cl.sorttype;}else if(!cl.searchtype){cl.searchtype='string';}if(cl.hidden===undefined){// jqGrid compatibility\ncl.hidden=false;}if(!cl.label){cl.label=cl.name;}if(cl.index){cl.name=cl.index;}if(!cl.hasOwnProperty('searchoptions')){cl.searchoptions={};}if(!cl.hasOwnProperty('searchrules')){cl.searchrules={};}}if(this.p.showQuery){$(this).append('<table class=\\'queryresult ui-widget ui-widget-content\\' style=\\'display:block;max-width:440px;border:0px none;\\' dir=\\''+this.p.direction+'\\'><tbody><tr><td class=\\'query\\'></td></tr></tbody></table>');}/*\r\n\t\t *Perform checking.\r\n\t\t *\r\n\t\t*/var checkData=function checkData(val,colModelItem){var ret=[true,''];if($.isFunction(colModelItem.searchrules)){ret=colModelItem.searchrules(val,colModelItem);}else if($.jgrid&&$.jgrid.checkValues){try{ret=$.jgrid.checkValues(val,-1,null,colModelItem.searchrules,colModelItem.label);}catch(e){}}if(ret&&ret.length&&ret[0]===false){p.error=!ret[0];p.errmsg=ret[1];}};/* moving to common\r\n\t\trandId = function() {\r\n\t\t\treturn Math.floor(Math.random()*10000).toString();\r\n\t\t};\r\n\t\t*/this.onchange=function(){// clear any error\nthis.p.error=false;this.p.errmsg='';return $.isFunction(this.p.onChange)?this.p.onChange.call(this,this.p):false;};/*\r\n\t\t * Redraw the filter every time when new field is added/deleted\r\n\t\t * and field is  changed\r\n\t\t */this.reDraw=function(){$('table.group:first',this).remove();var t=this.createTableForGroup(p.filter,null);$(this).append(t);if($.isFunction(this.p.afterRedraw)){this.p.afterRedraw.call(this,this.p);}};/*\r\n\t\t * Creates a grouping data for the filter\r\n\t\t * @param group - object\r\n\t\t * @param parentgroup - object\r\n\t\t */this.createTableForGroup=function(group,parentgroup){var that=this,i;// this table will hold all the group (tables) and rules (rows)\nvar table=$('<table class=\\'group ui-widget ui-widget-content\\' style=\\'border:0px none;\\'><tbody></tbody></table>'),// create error message row\nalign='left';if(this.p.direction=='rtl'){align='right';table.attr('dir','rtl');}if(parentgroup===null){table.append('<tr class=\\'error\\' style=\\'display:none;\\'><th colspan=\\'5\\' class=\\'ui-state-error\\' align=\\''+align+'\\'></th></tr>');}var tr=$('<tr></tr>');table.append(tr);// this header will hold the group operator type and group action buttons for\n// creating subgroup \"+ {}\", creating rule \"+\" or deleting the group \"-\"\nvar th=$('<th colspan=\\'5\\' align=\\''+align+'\\'></th>');tr.append(th);if(this.p.ruleButtons===true){// dropdown for: choosing group operator type\nvar groupOpSelect=$('<select class=\\'opsel\\'></select>');th.append(groupOpSelect);// populate dropdown with all posible group operators: or, and\nvar str='',selected;for(i=0;i<p.groupOps.length;i++){selected=group.groupOp===that.p.groupOps[i].op?' selected=\\'selected\\'':'';str+='<option value=\\''+that.p.groupOps[i].op+'\\''+selected+'>'+that.p.groupOps[i].text+'</option>';}groupOpSelect.append(str).bind('change',function(){group.groupOp=$(groupOpSelect).val();that.onchange();// signals that the filter has changed\n});}// button for adding a new subgroup\nvar inputAddSubgroup='<span></span>';if(this.p.groupButton){inputAddSubgroup=$('<input type=\\'button\\' value=\\'+ {}\\' title=\\'Add subgroup\\' class=\\'add-group\\'/>');inputAddSubgroup.bind('click',function(){if(group.groups===undefined){group.groups=[];}group.groups.push({groupOp:p.groupOps[0].op,rules:[],groups:[]});// adding a new group\nthat.reDraw();// the html has changed, force reDraw\nthat.onchange();// signals that the filter has changed\nreturn false;});}th.append(inputAddSubgroup);if(this.p.ruleButtons===true){// button for adding a new rule\nvar inputAddRule=$('<input type=\\'button\\' value=\\'+\\' title=\\'Add rule\\' class=\\'add-rule ui-add\\'/>'),cm;inputAddRule.bind('click',function(){//if(!group) { group = {};}\nif(group.rules===undefined){group.rules=[];}for(i=0;i<that.p.columns.length;i++){// but show only serchable and serchhidden = true fields\nvar searchable=that.p.columns[i].search===undefined?true:that.p.columns[i].search,hidden=that.p.columns[i].hidden===true,ignoreHiding=that.p.columns[i].searchoptions.searchhidden===true;if(ignoreHiding&&searchable||searchable&&!hidden){cm=that.p.columns[i];break;}}var opr;if(cm.searchoptions.sopt){opr=cm.searchoptions.sopt;}else if(that.p.sopt){opr=that.p.sopt;}else if($.inArray(cm.searchtype,that.p.strarr)!==-1){opr=that.p.stropts;}else{opr=that.p.numopts;}group.rules.push({field:cm.name,op:opr[0],data:''});// adding a new rule\nthat.reDraw();// the html has changed, force reDraw\n// for the moment no change have been made to the rule, so\n// this will not trigger onchange event\nreturn false;});th.append(inputAddRule);}// button for delete the group\nif(parentgroup!==null){// ignore the first group\nvar inputDeleteGroup=$('<input type=\\'button\\' value=\\'-\\' title=\\'Delete group\\' class=\\'delete-group\\'/>');th.append(inputDeleteGroup);inputDeleteGroup.bind('click',function(){// remove group from parent\nfor(i=0;i<parentgroup.groups.length;i++){if(parentgroup.groups[i]===group){parentgroup.groups.splice(i,1);break;}}that.reDraw();// the html has changed, force reDraw\nthat.onchange();// signals that the filter has changed\nreturn false;});}// append subgroup rows\nif(group.groups!==undefined){for(i=0;i<group.groups.length;i++){var trHolderForSubgroup=$('<tr></tr>');table.append(trHolderForSubgroup);var tdFirstHolderForSubgroup=$('<td class=\\'first\\'></td>');trHolderForSubgroup.append(tdFirstHolderForSubgroup);var tdMainHolderForSubgroup=$('<td colspan=\\'4\\'></td>');tdMainHolderForSubgroup.append(this.createTableForGroup(group.groups[i],group));trHolderForSubgroup.append(tdMainHolderForSubgroup);}}if(group.groupOp===undefined){group.groupOp=that.p.groupOps[0].op;}// append rules rows\nif(group.rules!==undefined){for(i=0;i<group.rules.length;i++){table.append(this.createTableRowForRule(group.rules[i],group));}}return table;};/*\r\n\t\t * Create the rule data for the filter\r\n\t\t */this.createTableRowForRule=function(rule,group){// save current entity in a variable so that it could\n// be referenced in anonimous method calls\nvar that=this,tr=$('<tr></tr>'),//document.createElement(\"tr\"),\n// first column used for padding\n//tdFirstHolderForRule = document.createElement(\"td\"),\ni,op,trpar,cm,str='',selected;//tdFirstHolderForRule.setAttribute(\"class\", \"first\");\ntr.append('<td class=\\'first\\'></td>');// create field container\nvar ruleFieldTd=$('<td class=\\'columns\\'></td>');tr.append(ruleFieldTd);// dropdown for: choosing field\nvar ruleFieldSelect=$('<select></select>'),ina,aoprs=[];ruleFieldTd.append(ruleFieldSelect);ruleFieldSelect.bind('change',function(){rule.field=$(ruleFieldSelect).val();trpar=$(this).parents('tr:first');for(i=0;i<that.p.columns.length;i++){if(that.p.columns[i].name===rule.field){cm=that.p.columns[i];break;}}if(!cm){return;}cm.searchoptions.id=$.jgrid.randId();if(isIE&&cm.inputtype==='text'){if(!cm.searchoptions.size){cm.searchoptions.size=10;}}var elm=$.jgrid.createEl(cm.inputtype,cm.searchoptions,'',true,that.p.ajaxSelectOptions,true);$(elm).addClass('input-elm');//that.createElement(rule, \"\");\nif(cm.searchoptions.sopt){op=cm.searchoptions.sopt;}else if(that.p.sopt){op=that.p.sopt;}else if($.inArray(cm.searchtype,that.p.strarr)!==-1){op=that.p.stropts;}else{op=that.p.numopts;}// operators\nvar s='',so=0;aoprs=[];$.each(that.p.ops,function(){aoprs.push(this.name);});for(i=0;i<op.length;i++){ina=$.inArray(op[i],aoprs);if(ina!==-1){if(so===0){rule.op=that.p.ops[ina].name;}s+='<option value=\\''+that.p.ops[ina].name+'\\'>'+that.p.ops[ina].description+'</option>';so++;}}$('.selectopts',trpar).empty().append(s);$('.selectopts',trpar)[0].selectedIndex=0;if($.jgrid.msie&&$.jgrid.msiever()<9){var sw=parseInt($('select.selectopts',trpar)[0].offsetWidth,10)+1;$('.selectopts',trpar).width(sw);$('.selectopts',trpar).css('width','auto');}// data\n$('.data',trpar).empty().append(elm);$.jgrid.bindEv(elm,cm.searchoptions,that);$('.input-elm',trpar).bind('change',function(e){var tmo=$(this).hasClass('ui-autocomplete-input')?200:0;setTimeout(function(){var elem=e.target;rule.data=elem.nodeName.toUpperCase()==='SPAN'&&cm.searchoptions&&$.isFunction(cm.searchoptions.custom_value)?cm.searchoptions.custom_value($(elem).children('.customelement:first'),'get'):elem.value;that.onchange();// signals that the filter has changed\n},tmo);});setTimeout(function(){//IE, Opera, Chrome\nrule.data=$(elm).val();that.onchange();// signals that the filter has changed\n},0);});// populate drop down with user provided column definitions\nvar j=0;for(i=0;i<that.p.columns.length;i++){// but show only serchable and serchhidden = true fields\nvar searchable=that.p.columns[i].search===undefined?true:that.p.columns[i].search,hidden=that.p.columns[i].hidden===true,ignoreHiding=that.p.columns[i].searchoptions.searchhidden===true;if(ignoreHiding&&searchable||searchable&&!hidden){selected='';if(rule.field===that.p.columns[i].name){selected=' selected=\\'selected\\'';j=i;}str+='<option value=\\''+that.p.columns[i].name+'\\''+selected+'>'+that.p.columns[i].label+'</option>';}}ruleFieldSelect.append(str);// create operator container\nvar ruleOperatorTd=$('<td class=\\'operators\\'></td>');tr.append(ruleOperatorTd);cm=p.columns[j];// create it here so it can be referentiated in the onchange event\n//var RD = that.createElement(rule, rule.data);\ncm.searchoptions.id=$.jgrid.randId();if(isIE&&cm.inputtype==='text'){if(!cm.searchoptions.size){cm.searchoptions.size=10;}}var ruleDataInput=$.jgrid.createEl(cm.inputtype,cm.searchoptions,rule.data,true,that.p.ajaxSelectOptions,true);if(rule.op=='nu'||rule.op=='nn'){$(ruleDataInput).attr('readonly','true');$(ruleDataInput).attr('disabled','true');}//retain the state of disabled text fields in case of null ops\n// dropdown for: choosing operator\nvar ruleOperatorSelect=$('<select class=\\'selectopts\\'></select>');ruleOperatorTd.append(ruleOperatorSelect);ruleOperatorSelect.bind('change',function(){rule.op=$(ruleOperatorSelect).val();trpar=$(this).parents('tr:first');var rd=$('.input-elm',trpar)[0];if(rule.op==='nu'||rule.op==='nn'){// disable for operator \"is null\" and \"is not null\"\nrule.data='';rd.value='';rd.setAttribute('readonly','true');rd.setAttribute('disabled','true');}else{rd.removeAttribute('readonly');rd.removeAttribute('disabled');}that.onchange();// signals that the filter has changed\n});// populate drop down with all available operators\nif(cm.searchoptions.sopt){op=cm.searchoptions.sopt;}else if(that.p.sopt){op=that.p.sopt;}else if($.inArray(cm.searchtype,that.p.strarr)!==-1){op=that.p.stropts;}else{op=that.p.numopts;}str='';$.each(that.p.ops,function(){aoprs.push(this.name);});for(i=0;i<op.length;i++){ina=$.inArray(op[i],aoprs);if(ina!==-1){selected=rule.op===that.p.ops[ina].name?' selected=\\'selected\\'':'';str+='<option value=\\''+that.p.ops[ina].name+'\\''+selected+'>'+that.p.ops[ina].description+'</option>';}}ruleOperatorSelect.append(str);// create data container\nvar ruleDataTd=$('<td class=\\'data\\'></td>');tr.append(ruleDataTd);// textbox for: data\n// is created previously\n//ruleDataInput.setAttribute(\"type\", \"text\");\nruleDataTd.append(ruleDataInput);$.jgrid.bindEv(ruleDataInput,cm.searchoptions,that);$(ruleDataInput).addClass('input-elm').bind('change',function(){rule.data=cm.inputtype==='custom'?cm.searchoptions.custom_value($(this).children('.customelement:first'),'get'):$(this).val();that.onchange();// signals that the filter has changed\n});// create action container\nvar ruleDeleteTd=$('<td></td>');tr.append(ruleDeleteTd);// create button for: delete rule\nif(this.p.ruleButtons===true){var ruleDeleteInput=$('<input type=\\'button\\' value=\\'-\\' title=\\'Delete rule\\' class=\\'delete-rule ui-del\\'/>');ruleDeleteTd.append(ruleDeleteInput);//$(ruleDeleteInput).html(\"\").height(20).width(30).button({icons: {  primary: \"ui-icon-minus\", text:false}});\nruleDeleteInput.bind('click',function(){// remove rule from group\nfor(i=0;i<group.rules.length;i++){if(group.rules[i]===rule){group.rules.splice(i,1);break;}}that.reDraw();// the html has changed, force reDraw\nthat.onchange();// signals that the filter has changed\nreturn false;});}return tr;};this.getStringForGroup=function(group){var s='(',index;if(group.groups!==undefined){for(index=0;index<group.groups.length;index++){if(s.length>1){s+=' '+group.groupOp+' ';}try{s+=this.getStringForGroup(group.groups[index]);}catch(eg){alert(eg);}}}if(group.rules!==undefined){try{for(index=0;index<group.rules.length;index++){if(s.length>1){s+=' '+group.groupOp+' ';}s+=this.getStringForRule(group.rules[index]);}}catch(e){alert(e);}}s+=')';if(s==='()'){return'';// ignore groups that don't have rules\n}return s;};this.getStringForRule=function(rule){var opUF='',opC='',i,cm,ret,val,numtypes=['int','integer','float','number','currency'];// jqGrid\nfor(i=0;i<this.p.ops.length;i++){if(this.p.ops[i].name===rule.op){opUF=this.p.ops[i].operator;opC=this.p.ops[i].name;break;}}for(i=0;i<this.p.columns.length;i++){if(this.p.columns[i].name===rule.field){cm=this.p.columns[i];break;}}if(cm==null){return'';}val=rule.data;if(opC==='bw'||opC==='bn'){val=val+'%';}if(opC==='ew'||opC==='en'){val='%'+val;}if(opC==='cn'||opC==='nc'){val='%'+val+'%';}if(opC==='in'||opC==='ni'){val=' ('+val+')';}if(p.errorcheck){checkData(rule.data,cm);}if($.inArray(cm.searchtype,numtypes)!==-1||opC==='nn'||opC==='nu'){ret=rule.field+' '+opUF+' '+val;}else{ret=rule.field+' '+opUF+' \"'+val+'\"';}return ret;};this.resetFilter=function(){this.p.filter=$.extend(true,{},this.p.initFilter);this.reDraw();this.onchange();};this.hideError=function(){$('th.ui-state-error',this).html('');$('tr.error',this).hide();};this.showError=function(){$('th.ui-state-error',this).html(this.p.errmsg);$('tr.error',this).show();};this.toUserFriendlyString=function(){return this.getStringForGroup(p.filter);};this.toString=function(){// this will obtain a string that can be used to match an item.\nvar that=this;function getStringRule(rule){if(that.p.errorcheck){var i,cm;for(i=0;i<that.p.columns.length;i++){if(that.p.columns[i].name===rule.field){cm=that.p.columns[i];break;}}if(cm){checkData(rule.data,cm);}}return rule.op+'(item.'+rule.field+',\\''+rule.data+'\\')';}function getStringForGroup(group){var s='(',index;if(group.groups!==undefined){for(index=0;index<group.groups.length;index++){if(s.length>1){if(group.groupOp==='OR'){s+=' || ';}else{s+=' && ';}}s+=getStringForGroup(group.groups[index]);}}if(group.rules!==undefined){for(index=0;index<group.rules.length;index++){if(s.length>1){if(group.groupOp==='OR'){s+=' || ';}else{s+=' && ';}}s+=getStringRule(group.rules[index]);}}s+=')';if(s==='()'){return'';// ignore groups that don't have rules\n}return s;}return getStringForGroup(this.p.filter);};// Here we init the filter\nthis.reDraw();if(this.p.showQuery){this.onchange();}// mark is as created so that it will not be created twice on this element\nthis.filter=true;});};$.extend($.fn.jqFilter,{/*\r\n\t * Return SQL like string. Can be used directly\r\n\t */toSQLString:function toSQLString(){var s='';this.each(function(){s=this.toUserFriendlyString();});return s;},/*\r\n\t * Return filter data as object.\r\n\t */filterData:function filterData(){var s;this.each(function(){s=this.p.filter;});return s;},getParameter:function getParameter(param){if(param!==undefined){if(this.p.hasOwnProperty(param)){return this.p[param];}}return this.p;},resetFilter:function resetFilter(){return this.each(function(){this.resetFilter();});},addFilter:function addFilter(pfilter){if(typeof pfilter==='string'){pfilter=$.jgrid.parse(pfilter);}this.each(function(){this.p.filter=pfilter;this.reDraw();this.onchange();});}});})(jQuery);/*jshint eqeqeq:false, eqnull:true, devel:true */ /*global xmlJsonClass, jQuery */(function($){/**\r\n * jqGrid extension for form editing Grid Data\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n**/'use strict';$.jgrid.extend({searchGrid:function searchGrid(p){p=$.extend(true,{recreateFilter:false,drag:true,sField:'searchField',sValue:'searchString',sOper:'searchOper',sFilter:'filters',loadDefaults:true,// this options activates loading of default filters from grid's postData for Multipe Search only.\nbeforeShowSearch:null,afterShowSearch:null,onInitializeSearch:null,afterRedraw:null,afterChange:null,closeAfterSearch:false,closeAfterReset:false,closeOnEscape:false,searchOnEnter:false,multipleSearch:false,multipleGroup:false,//cloneSearchRowOnAdd: true,\ntop:0,left:0,jqModal:true,modal:false,resize:true,width:450,height:'auto',dataheight:'auto',showQuery:false,errorcheck:true,// translation\n// if you want to change or remove the order change it in sopt\n// ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'],\nsopt:null,stringResult:undefined,onClose:null,onSearch:null,onReset:null,toTop:true,overlay:30,columns:[],tmplNames:null,tmplFilters:null,// translations - later in lang file\ntmplLabel:' Template: ',showOnLoad:false,layer:null},$.jgrid.search,p||{});return this.each(function(){var $t=this;if(!$t.grid){return;}var fid='fbox_'+$t.p.id,showFrm=true,IDs={themodal:'searchmod'+fid,modalhead:'searchhd'+fid,modalcontent:'searchcnt'+fid,scrollelm:fid},defaultFilters=$t.p.postData[p.sFilter];if(typeof defaultFilters==='string'){defaultFilters=$.jgrid.parse(defaultFilters);}if(p.recreateFilter===true){$('#'+$.jgrid.jqID(IDs.themodal)).remove();}function showFilter(_filter){showFrm=$($t).triggerHandler('jqGridFilterBeforeShow',[_filter]);if(showFrm===undefined){showFrm=true;}if(showFrm&&$.isFunction(p.beforeShowSearch)){showFrm=p.beforeShowSearch.call($t,_filter);}if(showFrm){$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(fid),jqm:p.jqModal,modal:p.modal,overlay:p.overlay,toTop:p.toTop});$($t).triggerHandler('jqGridFilterAfterShow',[_filter]);if($.isFunction(p.afterShowSearch)){p.afterShowSearch.call($t,_filter);}}}if($('#'+$.jgrid.jqID(IDs.themodal))[0]!==undefined){showFilter($('#fbox_'+$.jgrid.jqID(+$t.p.id)));}else{var fil=$('<div><div id=\\''+fid+'\\' class=\\'searchFilter\\' style=\\'overflow:auto\\'></div></div>').insertBefore('#gview_'+$.jgrid.jqID($t.p.id)),align='left',butleft='';if($t.p.direction=='rtl'){align='right';butleft=' style=\\'text-align:left\\'';fil.attr('dir','rtl');}var columns=$.extend([],$t.p.colModel),bS='<a href=\\'javascript:void(0)\\' id=\\''+fid+'_search\\' class=\\'fm-button ui-state-default ui-corner-all fm-button-icon-right ui-reset\\'><span class=\\'ui-icon ui-icon-search\\'></span>'+p.Find+'</a>',bC='<a href=\\'javascript:void(0)\\' id=\\''+fid+'_reset\\' class=\\'fm-button ui-state-default ui-corner-all fm-button-icon-left ui-search\\'><span class=\\'ui-icon ui-icon-arrowreturnthick-1-w\\'></span>'+p.Reset+'</a>',bQ='',tmpl='',colnm,found=false,bt,cmi=-1;if(p.showQuery){bQ='<a href=\\'javascript:void(0)\\' id=\\''+fid+'_query\\' class=\\'fm-button ui-state-default ui-corner-all fm-button-icon-left\\'><span class=\\'ui-icon ui-icon-comment\\'></span>Query</a>';}if(!p.columns.length){$.each(columns,function(i,n){if(!n.label){n.label=$t.p.colNames[i];}// find first searchable column and set it if no default filter\nif(!found){var searchable=n.search===undefined?true:n.search,hidden=n.hidden===true,ignoreHiding=n.searchoptions&&n.searchoptions.searchhidden===true;if(ignoreHiding&&searchable||searchable&&!hidden){found=true;colnm=n.index||n.name;cmi=i;}}});}else{columns=p.columns;}// old behaviour\nif(!defaultFilters&&colnm||p.multipleSearch===false){var cmop='eq';if(cmi>=0&&columns[cmi].searchoptions&&columns[cmi].searchoptions.sopt){cmop=columns[cmi].searchoptions.sopt[0];}else if(p.sopt&&p.sopt.length){cmop=p.sopt[0];}defaultFilters={'groupOp':'AND',rules:[{'field':colnm,'op':cmop,'data':''}]};}found=false;if(p.tmplNames&&p.tmplNames.length){found=true;tmpl=p.tmplLabel;tmpl+='<select class=\\'ui-template\\'>';tmpl+='<option value=\\'default\\'>Default</option>';$.each(p.tmplNames,function(i,n){tmpl+='<option value=\\''+i+'\\'>'+n+'</option>';});tmpl+='</select>';}bt='<table class=\\'EditTable\\' style=\\'border:0px none;margin-top:5px\\' id=\\''+fid+'_2\\'><tbody><tr><td colspan=\\'2\\'><hr class=\\'ui-widget-content\\' style=\\'margin:1px\\'/></td></tr><tr><td class=\\'EditButton\\' style=\\'text-align:'+align+'\\'>'+bC+tmpl+'</td><td class=\\'EditButton\\' '+butleft+'>'+bQ+bS+'</td></tr></tbody></table>';fid=$.jgrid.jqID(fid);$('#'+fid).jqFilter({columns:columns,filter:p.loadDefaults?defaultFilters:null,showQuery:p.showQuery,errorcheck:p.errorcheck,sopt:p.sopt,groupButton:p.multipleGroup,ruleButtons:p.multipleSearch,afterRedraw:p.afterRedraw,_gridsopt:$.jgrid.search.odata,ajaxSelectOptions:$t.p.ajaxSelectOptions,groupOps:p.groupOps,onChange:function onChange(){if(this.p.showQuery){$('.query',this).html(this.toUserFriendlyString());}if($.isFunction(p.afterChange)){p.afterChange.call($t,$('#'+fid),p);}},direction:$t.p.direction});fil.append(bt);if(found&&p.tmplFilters&&p.tmplFilters.length){$('.ui-template',fil).bind('change',function(){var curtempl=$(this).val();if(curtempl=='default'){$('#'+fid).jqFilter('addFilter',defaultFilters);}else{$('#'+fid).jqFilter('addFilter',p.tmplFilters[parseInt(curtempl,10)]);}return false;});}if(p.multipleGroup===true){p.multipleSearch=true;}$($t).triggerHandler('jqGridFilterInitialize',[$('#'+fid)]);if($.isFunction(p.onInitializeSearch)){p.onInitializeSearch.call($t,$('#'+fid));}p.gbox='#gbox_'+fid;if(p.layer){$.jgrid.createModal(IDs,fil,p,'#gview_'+$.jgrid.jqID($t.p.id),$('#gbox_'+$.jgrid.jqID($t.p.id))[0],'#'+$.jgrid.jqID(p.layer),{position:'relative'});}else{$.jgrid.createModal(IDs,fil,p,'#gview_'+$.jgrid.jqID($t.p.id),$('#gbox_'+$.jgrid.jqID($t.p.id))[0]);}if(p.searchOnEnter||p.closeOnEscape){$('#'+$.jgrid.jqID(IDs.themodal)).keydown(function(e){var $target=$(e.target);if(p.searchOnEnter&&e.which===13&&// 13 === $.ui.keyCode.ENTER\n!$target.hasClass('add-group')&&!$target.hasClass('add-rule')&&!$target.hasClass('delete-group')&&!$target.hasClass('delete-rule')&&(!$target.hasClass('fm-button')||!$target.is('[id$=_query]'))){$('#'+fid+'_search').focus().click();return false;}if(p.closeOnEscape&&e.which===27){// 27 === $.ui.keyCode.ESCAPE\n$('#'+$.jgrid.jqID(IDs.modalhead)).find('.ui-jqdialog-titlebar-close').focus().click();return false;}});}if(bQ){$('#'+fid+'_query').bind('click',function(){$('.queryresult',fil).toggle();return false;});}if(p.stringResult===undefined){// to provide backward compatibility, inferring stringResult value from multipleSearch\np.stringResult=p.multipleSearch;}$('#'+fid+'_search').bind('click',function(){var fl=$('#'+fid),sdata={},res,filters=fl.jqFilter('filterData');if(p.errorcheck){fl[0].hideError();if(!p.showQuery){fl.jqFilter('toSQLString');}if(fl[0].p.error){fl[0].showError();return false;}}if(p.stringResult){try{// xmlJsonClass or JSON.stringify\nres=xmlJsonClass.toJson(filters,'','',false);}catch(e){try{res=JSON.stringify(filters);}catch(e2){}}if(typeof res==='string'){sdata[p.sFilter]=res;$.each([p.sField,p.sValue,p.sOper],function(){sdata[this]='';});}}else{if(p.multipleSearch){sdata[p.sFilter]=filters;$.each([p.sField,p.sValue,p.sOper],function(){sdata[this]='';});}else{sdata[p.sField]=filters.rules[0].field;sdata[p.sValue]=filters.rules[0].data;sdata[p.sOper]=filters.rules[0].op;sdata[p.sFilter]='';}}$t.p.search=true;$.extend($t.p.postData,sdata);$($t).triggerHandler('jqGridFilterSearch');if($.isFunction(p.onSearch)){p.onSearch.call($t);}$($t).trigger('reloadGrid',[{page:1}]);if(p.closeAfterSearch){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID($t.p.id),jqm:p.jqModal,onClose:p.onClose});}return false;});$('#'+fid+'_reset').bind('click',function(){var sdata={},fl=$('#'+fid);$t.p.search=false;if(p.multipleSearch===false){sdata[p.sField]=sdata[p.sValue]=sdata[p.sOper]='';}else{sdata[p.sFilter]='';}fl[0].resetFilter();if(found){$('.ui-template',fil).val('default');}$.extend($t.p.postData,sdata);$($t).triggerHandler('jqGridFilterReset');if($.isFunction(p.onReset)){p.onReset.call($t);}$($t).trigger('reloadGrid',[{page:1}]);return false;});showFilter($('#'+fid));$('.fm-button:not(.ui-state-disabled)',fil).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});}});},editGridRow:function editGridRow(rowid,p){p=$.extend(true,{top:0,left:0,width:300,datawidth:'auto',height:'auto',dataheight:'auto',modal:false,overlay:30,drag:true,resize:true,url:null,mtype:'POST',clearAfterAdd:true,closeAfterEdit:false,reloadAfterSubmit:true,onInitializeForm:null,beforeInitData:null,beforeShowForm:null,afterShowForm:null,beforeSubmit:null,afterSubmit:null,onclickSubmit:null,afterComplete:null,onclickPgButtons:null,afterclickPgButtons:null,editData:{},recreateForm:false,jqModal:true,closeOnEscape:false,addedrow:'first',topinfo:'',bottominfo:'',saveicon:[],closeicon:[],savekey:[false,13],navkeys:[false,38,40],checkOnSubmit:false,checkOnUpdate:false,_savedData:{},processing:false,onClose:null,ajaxEditOptions:{},serializeEditData:null,viewPagerButtons:true},$.jgrid.edit,p||{});rp_ge[$(this)[0].p.id]=p;return this.each(function(){var $t=this;if(!$t.grid||!rowid){return;}var gID=$t.p.id,frmgr='FrmGrid_'+gID,frmtborg='TblGrid_'+gID,frmtb='#'+$.jgrid.jqID(frmtborg),IDs={themodal:'editmod'+gID,modalhead:'edithd'+gID,modalcontent:'editcnt'+gID,scrollelm:frmgr},onBeforeShow=$.isFunction(rp_ge[$t.p.id].beforeShowForm)?rp_ge[$t.p.id].beforeShowForm:false,onAfterShow=$.isFunction(rp_ge[$t.p.id].afterShowForm)?rp_ge[$t.p.id].afterShowForm:false,onBeforeInit=$.isFunction(rp_ge[$t.p.id].beforeInitData)?rp_ge[$t.p.id].beforeInitData:false,onInitializeForm=$.isFunction(rp_ge[$t.p.id].onInitializeForm)?rp_ge[$t.p.id].onInitializeForm:false,showFrm=true,maxCols=1,maxRows=0,postdata,extpost,newData,diff,frmoper;frmgr=$.jgrid.jqID(frmgr);if(rowid==='new'){rowid='_empty';frmoper='add';p.caption=rp_ge[$t.p.id].addCaption;}else{p.caption=rp_ge[$t.p.id].editCaption;frmoper='edit';}if(p.recreateForm===true&&$('#'+$.jgrid.jqID(IDs.themodal))[0]!==undefined){$('#'+$.jgrid.jqID(IDs.themodal)).remove();}var closeovrl=true;if(p.checkOnUpdate&&p.jqModal&&!p.modal){closeovrl=false;}function getFormData(){$(frmtb+' > tbody > tr > td > .FormElement').each(function(){var celm=$('.customelement',this);if(celm.length){var elem=celm[0],nm=$(elem).attr('name');$.each($t.p.colModel,function(){if(this.name===nm&&this.editoptions&&$.isFunction(this.editoptions.custom_value)){try{postdata[nm]=this.editoptions.custom_value.call($t,$('#'+$.jgrid.jqID(nm),frmtb),'get');if(postdata[nm]===undefined){throw'e1';}}catch(e){if(e==='e1'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_value\\' '+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose);}}return true;}});}else{switch($(this).get(0).type){case'checkbox':if($(this).is(':checked')){postdata[this.name]=$(this).val();}else{var ofv=$(this).attr('offval');postdata[this.name]=ofv;}break;case'select-one':postdata[this.name]=$('option:selected',this).val();extpost[this.name]=$('option:selected',this).text();break;case'select-multiple':postdata[this.name]=$(this).val();if(postdata[this.name]){postdata[this.name]=postdata[this.name].join(',');}else{postdata[this.name]='';}var selectedText=[];$('option:selected',this).each(function(i,selected){selectedText[i]=$(selected).text();});extpost[this.name]=selectedText.join(',');break;case'password':case'text':case'textarea':case'button':postdata[this.name]=$(this).val();break;}if($t.p.autoencode){postdata[this.name]=$.jgrid.htmlEncode(postdata[this.name]);}}});return true;}function createData(rowid,obj,tb,maxcols){var nm,hc,trdata,cnt=0,tmp,dc,elc,retpos=[],ind=false,tdtmpl='<td class=\\'CaptionTD\\'>&#160;</td><td class=\\'DataTD\\'>&#160;</td>',tmpl='',i;//*2\nfor(i=1;i<=maxcols;i++){tmpl+=tdtmpl;}if(rowid!='_empty'){ind=$(obj).jqGrid('getInd',rowid);}$(obj.p.colModel).each(function(i){nm=this.name;// hidden fields are included in the form\nif(this.editrules&&this.editrules.edithidden===true){hc=false;}else{hc=this.hidden===true?true:false;}dc=hc?'style=\\'display:none\\'':'';if(nm!=='cb'&&nm!=='subgrid'&&this.editable===true&&nm!=='rn'){if(ind===false){tmp='';}else{if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]).text();}else{try{tmp=$.unformat.call(obj,$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]),{rowId:rowid,colModel:this},i);}catch(_){tmp=this.edittype&&this.edittype=='textarea'?$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]).text():$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]).html();}if(!tmp||tmp=='&nbsp;'||tmp=='&#160;'||tmp.length==1&&tmp.charCodeAt(0)==160){tmp='';}}}var opt=$.extend({},this.editoptions||{},{id:nm,name:nm}),frmopt=$.extend({},{elmprefix:'',elmsuffix:'',rowabove:false,rowcontent:''},this.formoptions||{}),rp=parseInt(frmopt.rowpos,10)||cnt+1,cp=parseInt((parseInt(frmopt.colpos,10)||1)*2,10);if(rowid=='_empty'&&opt.defaultValue){tmp=$.isFunction(opt.defaultValue)?opt.defaultValue.call($t):opt.defaultValue;}if(!this.edittype){this.edittype='text';}if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}elc=$.jgrid.createEl.call($t,this.edittype,opt,tmp,false,$.extend({},$.jgrid.ajaxOptions,obj.p.ajaxSelectOptions||{}));if(tmp===''&&this.edittype=='checkbox'){tmp=$(elc).attr('offval');}if(tmp===''&&this.edittype=='select'){tmp=$('option:eq(0)',elc).text();}if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=tmp;}$(elc).addClass('FormElement');if($.inArray(this.edittype,['text','textarea','password','select'])>-1){$(elc).addClass('ui-widget-content ui-corner-all');}trdata=$(tb).find('tr[rowpos='+rp+']');if(frmopt.rowabove){var newdata=$('<tr><td class=\\'contentinfo\\' colspan=\\''+maxcols*2+'\\'>'+frmopt.rowcontent+'</td></tr>');$(tb).append(newdata);newdata[0].rp=rp;}if(trdata.length===0){trdata=$('<tr '+dc+' rowpos=\\''+rp+'\\'></tr>').addClass('FormData').attr('id','tr_'+nm);$(trdata).append(tmpl);$(tb).append(trdata);trdata[0].rp=rp;}$('td:eq('+(cp-2)+')',trdata[0]).html(frmopt.label===undefined?obj.p.colNames[i]:frmopt.label);$('td:eq('+(cp-1)+')',trdata[0]).append(frmopt.elmprefix).append(elc).append(frmopt.elmsuffix);if($.isFunction(opt.custom_value)&&rowid!=='_empty'){opt.custom_value.call($t,$('#'+nm,'#'+frmgr),'set',tmp);}$.jgrid.bindEv(elc,opt,$t);retpos[cnt]=i;cnt++;}});if(cnt>0){var idrow=$('<tr class=\\'FormData\\' style=\\'display:none\\'><td class=\\'CaptionTD\\'></td><td colspan=\\''+(maxcols*2-1)+'\\' class=\\'DataTD\\'><input class=\\'FormElement\\' id=\\'id_g\\' type=\\'text\\' name=\\''+obj.p.id+'_id\\' value=\\''+rowid+'\\'/></td></tr>');idrow[0].rp=cnt+999;$(tb).append(idrow);if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[obj.p.id+'_id']=rowid;}}return retpos;}function fillData(rowid,obj,fmid){var nm,cnt=0,tmp,fld,opt,vl,vlc;if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData={};rp_ge[$t.p.id]._savedData[obj.p.id+'_id']=rowid;}var cm=obj.p.colModel;if(rowid=='_empty'){$(cm).each(function(){nm=this.name;opt=$.extend({},this.editoptions||{});fld=$('#'+$.jgrid.jqID(nm),'#'+fmid);if(fld&&fld.length&&fld[0]!==null){vl='';if(opt.defaultValue){vl=$.isFunction(opt.defaultValue)?opt.defaultValue.call($t):opt.defaultValue;if(fld[0].type=='checkbox'){vlc=vl.toLowerCase();if(vlc.search(/(false|0|no|off|undefined)/i)<0&&vlc!==''){fld[0].checked=true;fld[0].defaultChecked=true;fld[0].value=vl;}else{fld[0].checked=false;fld[0].defaultChecked=false;}}else{fld.val(vl);}}else{if(fld[0].type=='checkbox'){fld[0].checked=false;fld[0].defaultChecked=false;vl=$(fld).attr('offval');}else if(fld[0].type&&fld[0].type.substr(0,6)=='select'){fld[0].selectedIndex=0;}else{fld.val(vl);}}if(rp_ge[$t.p.id].checkOnSubmit===true||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=vl;}}});$('#id_g','#'+fmid).val(rowid);return;}var tre=$(obj).jqGrid('getInd',rowid,true);if(!tre){return;}$('td[role=\"gridcell\"]',tre).each(function(i){nm=cm[i].name;// hidden fields are included in the form\nif(nm!=='cb'&&nm!=='subgrid'&&nm!=='rn'&&cm[i].editable===true){if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$(this).text();}else{try{tmp=$.unformat.call(obj,$(this),{rowId:rowid,colModel:cm[i]},i);}catch(_){tmp=cm[i].edittype=='textarea'?$(this).text():$(this).html();}}if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}if(rp_ge[$t.p.id].checkOnSubmit===true||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=tmp;}nm=$.jgrid.jqID(nm);switch(cm[i].edittype){case'password':case'text':case'button':case'image':case'textarea':if(tmp=='&nbsp;'||tmp=='&#160;'||tmp.length==1&&tmp.charCodeAt(0)==160){tmp='';}$('#'+nm,'#'+fmid).val(tmp);break;case'select':var opv=tmp.split(',');opv=$.map(opv,function(n){return $.trim(n);});$('#'+nm+' option','#'+fmid).each(function(){if(!cm[i].editoptions.multiple&&($.trim(tmp)==$.trim($(this).text())||opv[0]==$.trim($(this).text())||opv[0]==$.trim($(this).val()))){this.selected=true;}else if(cm[i].editoptions.multiple){if($.inArray($.trim($(this).text()),opv)>-1||$.inArray($.trim($(this).val()),opv)>-1){this.selected=true;}else{this.selected=false;}}else{this.selected=false;}});break;case'checkbox':tmp=String(tmp);if(cm[i].editoptions&&cm[i].editoptions.value){var cb=cm[i].editoptions.value.split(':');if(cb[0]==tmp){$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',true);$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',true);//ie\n}else{$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',false);$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',false);//ie\n}}else{tmp=tmp.toLowerCase();if(tmp.search(/(false|0|no|off|undefined)/i)<0&&tmp!==''){$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',true);$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',true);//ie\n}else{$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',false);$('#'+nm,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',false);//ie\n}}break;case'custom':try{if(cm[i].editoptions&&$.isFunction(cm[i].editoptions.custom_value)){cm[i].editoptions.custom_value.call($t,$('#'+nm,'#'+fmid),'set',tmp);}else{throw'e1';}}catch(e){if(e=='e1'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_value\\' '+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose);}}break;}cnt++;}});if(cnt>0){$('#id_g',frmtb).val(rowid);}}function setNulls(){$.each($t.p.colModel,function(i,n){if(n.editoptions&&n.editoptions.NullIfEmpty===true){if(postdata.hasOwnProperty(n.name)&&postdata[n.name]===''){postdata[n.name]='null';}}});}function postIt(){var copydata,ret=[true,'',''],onCS={},opers=$t.p.prmNames,idname,oper,key,selr,i;var retvals=$($t).triggerHandler('jqGridAddEditBeforeCheckValues',[$('#'+frmgr),frmoper]);if(retvals&&_typeof(retvals)==='object'){postdata=retvals;}if($.isFunction(rp_ge[$t.p.id].beforeCheckValues)){retvals=rp_ge[$t.p.id].beforeCheckValues.call($t,postdata,$('#'+frmgr),postdata[$t.p.id+'_id']=='_empty'?opers.addoper:opers.editoper);if(retvals&&_typeof(retvals)==='object'){postdata=retvals;}}for(key in postdata){if(postdata.hasOwnProperty(key)){ret=$.jgrid.checkValues.call($t,postdata[key],key,$t);if(ret[0]===false){break;}}}setNulls();if(ret[0]){onCS=$($t).triggerHandler('jqGridAddEditClickSubmit',[rp_ge[$t.p.id],postdata,frmoper]);if(onCS===undefined&&$.isFunction(rp_ge[$t.p.id].onclickSubmit)){onCS=rp_ge[$t.p.id].onclickSubmit.call($t,rp_ge[$t.p.id],postdata)||{};}ret=$($t).triggerHandler('jqGridAddEditBeforeSubmit',[postdata,$('#'+frmgr),frmoper]);if(ret===undefined){ret=[true,'',''];}if(ret[0]&&$.isFunction(rp_ge[$t.p.id].beforeSubmit)){ret=rp_ge[$t.p.id].beforeSubmit.call($t,postdata,$('#'+frmgr));}}if(ret[0]&&!rp_ge[$t.p.id].processing){rp_ge[$t.p.id].processing=true;$('#sData',frmtb+'_2').addClass('ui-state-active');oper=opers.oper;idname=opers.id;// we add to pos data array the action - the name is oper\npostdata[oper]=$.trim(postdata[$t.p.id+'_id'])=='_empty'?opers.addoper:opers.editoper;if(postdata[oper]!=opers.addoper){postdata[idname]=postdata[$t.p.id+'_id'];}else{// check to see if we have allredy this field in the form and if yes lieve it\nif(postdata[idname]===undefined){postdata[idname]=postdata[$t.p.id+'_id'];}}delete postdata[$t.p.id+'_id'];postdata=$.extend(postdata,rp_ge[$t.p.id].editData,onCS);if($t.p.treeGrid===true){if(postdata[oper]==opers.addoper){selr=$($t).jqGrid('getGridParam','selrow');var tr_par_id=$t.p.treeGridModel=='adjacency'?$t.p.treeReader.parent_id_field:'parent_id';postdata[tr_par_id]=selr;}for(i in $t.p.treeReader){if($t.p.treeReader.hasOwnProperty(i)){var itm=$t.p.treeReader[i];if(postdata.hasOwnProperty(itm)){if(postdata[oper]==opers.addoper&&i==='parent_id_field'){continue;}delete postdata[itm];}}}}postdata[idname]=$.jgrid.stripPref($t.p.idPrefix,postdata[idname]);var ajaxOptions=$.extend({url:rp_ge[$t.p.id].url||$($t).jqGrid('getGridParam','editurl'),type:rp_ge[$t.p.id].mtype,data:$.isFunction(rp_ge[$t.p.id].serializeEditData)?rp_ge[$t.p.id].serializeEditData.call($t,postdata):postdata,complete:function complete(data,status){var key;postdata[idname]=$t.p.idPrefix+postdata[idname];if(status!='success'){ret[0]=false;ret[1]=$($t).triggerHandler('jqGridAddEditErrorTextFormat',[data,frmoper]);if($.isFunction(rp_ge[$t.p.id].errorTextFormat)){ret[1]=rp_ge[$t.p.id].errorTextFormat.call($t,data);}else{ret[1]=status+' Status: \\''+data.statusText+'\\'. Error code: '+data.status;}}else{// data is posted successful\n// execute aftersubmit with the returned data from server\nret=$($t).triggerHandler('jqGridAddEditAfterSubmit',[data,postdata,frmoper]);if(ret===undefined){ret=[true,'',''];}if(ret[0]&&$.isFunction(rp_ge[$t.p.id].afterSubmit)){ret=rp_ge[$t.p.id].afterSubmit.call($t,data,postdata);}}if(ret[0]===false){$('#FormError>td',frmtb).html(ret[1]);$('#FormError',frmtb).show();}else{// remove some values if formattaer select or checkbox\n$.each($t.p.colModel,function(){if(extpost[this.name]&&this.formatter&&this.formatter=='select'){try{delete extpost[this.name];}catch(e){}}});postdata=$.extend(postdata,extpost);if($t.p.autoencode){$.each(postdata,function(n,v){postdata[n]=$.jgrid.htmlDecode(v);});}//rp_ge[$t.p.id].reloadAfterSubmit = rp_ge[$t.p.id].reloadAfterSubmit && $t.p.datatype != \"local\";\n// the action is add\nif(postdata[oper]==opers.addoper){//id processing\n// user not set the id ret[2]\nif(!ret[2]){ret[2]=$.jgrid.randId();}postdata[idname]=ret[2];if(rp_ge[$t.p.id].closeAfterAdd){if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');}else{if($t.p.treeGrid===true){$($t).jqGrid('addChildNode',ret[2],selr,postdata);}else{$($t).jqGrid('addRowData',ret[2],postdata,p.addedrow);$($t).jqGrid('setSelection',ret[2]);}}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}else if(rp_ge[$t.p.id].clearAfterAdd){if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');}else{if($t.p.treeGrid===true){$($t).jqGrid('addChildNode',ret[2],selr,postdata);}else{$($t).jqGrid('addRowData',ret[2],postdata,p.addedrow);}}fillData('_empty',$t,frmgr);}else{if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');}else{if($t.p.treeGrid===true){$($t).jqGrid('addChildNode',ret[2],selr,postdata);}else{$($t).jqGrid('addRowData',ret[2],postdata,p.addedrow);}}}}else{// the action is update\nif(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');if(!rp_ge[$t.p.id].closeAfterEdit){setTimeout(function(){$($t).jqGrid('setSelection',postdata[idname]);},1000);}}else{if($t.p.treeGrid===true){$($t).jqGrid('setTreeRow',postdata[idname],postdata);}else{$($t).jqGrid('setRowData',postdata[idname],postdata);}}if(rp_ge[$t.p.id].closeAfterEdit){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}}if($.isFunction(rp_ge[$t.p.id].afterComplete)){copydata=data;setTimeout(function(){$($t).triggerHandler('jqGridAddEditAfterComplete',[copydata,postdata,$('#'+frmgr),frmoper]);rp_ge[$t.p.id].afterComplete.call($t,copydata,postdata,$('#'+frmgr));copydata=null;},500);}if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){$('#'+frmgr).data('disabled',false);if(rp_ge[$t.p.id]._savedData[$t.p.id+'_id']!='_empty'){for(key in rp_ge[$t.p.id]._savedData){if(rp_ge[$t.p.id]._savedData.hasOwnProperty(key)&&postdata[key]){rp_ge[$t.p.id]._savedData[key]=postdata[key];}}}}}rp_ge[$t.p.id].processing=false;$('#sData',frmtb+'_2').removeClass('ui-state-active');try{$(':input:visible','#'+frmgr)[0].focus();}catch(e){}}},$.jgrid.ajaxOptions,rp_ge[$t.p.id].ajaxEditOptions);if(!ajaxOptions.url&&!rp_ge[$t.p.id].useDataProxy){if($.isFunction($t.p.dataProxy)){rp_ge[$t.p.id].useDataProxy=true;}else{ret[0]=false;ret[1]+=' '+$.jgrid.errors.nourl;}}if(ret[0]){if(rp_ge[$t.p.id].useDataProxy){var dpret=$t.p.dataProxy.call($t,ajaxOptions,'set_'+$t.p.id);if(dpret===undefined){dpret=[true,''];}if(dpret[0]===false){ret[0]=false;ret[1]=dpret[1]||'Error deleting the selected row!';}else{if(ajaxOptions.data.oper==opers.addoper&&rp_ge[$t.p.id].closeAfterAdd){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}if(ajaxOptions.data.oper==opers.editoper&&rp_ge[$t.p.id].closeAfterEdit){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}}}else{$.ajax(ajaxOptions);}}}if(ret[0]===false){$('#FormError>td',frmtb).html(ret[1]);$('#FormError',frmtb).show();// return;\n}}function compareData(nObj,oObj){var ret=false,key;for(key in nObj){if(nObj.hasOwnProperty(key)&&nObj[key]!=oObj[key]){ret=true;break;}}return ret;}function checkUpdates(){var stat=true;$('#FormError',frmtb).hide();if(rp_ge[$t.p.id].checkOnUpdate){postdata={};extpost={};getFormData();newData=$.extend({},postdata,extpost);diff=compareData(newData,rp_ge[$t.p.id]._savedData);if(diff){$('#'+frmgr).data('disabled',true);$('.confirm','#'+IDs.themodal).show();stat=false;}}return stat;}function restoreInline(){var i;if(rowid!=='_empty'&&$t.p.savedRow!==undefined&&$t.p.savedRow.length>0&&$.isFunction($.fn.jqGrid.restoreRow)){for(i=0;i<$t.p.savedRow.length;i++){if($t.p.savedRow[i].id==rowid){$($t).jqGrid('restoreRow',rowid);break;}}}}function updateNav(cr,posarr){var totr=posarr[1].length-1;if(cr===0){$('#pData',frmtb+'_2').addClass('ui-state-disabled');}else if(posarr[1][cr-1]!==undefined&&$('#'+$.jgrid.jqID(posarr[1][cr-1])).hasClass('ui-state-disabled')){$('#pData',frmtb+'_2').addClass('ui-state-disabled');}else{$('#pData',frmtb+'_2').removeClass('ui-state-disabled');}if(cr==totr){$('#nData',frmtb+'_2').addClass('ui-state-disabled');}else if(posarr[1][cr+1]!==undefined&&$('#'+$.jgrid.jqID(posarr[1][cr+1])).hasClass('ui-state-disabled')){$('#nData',frmtb+'_2').addClass('ui-state-disabled');}else{$('#nData',frmtb+'_2').removeClass('ui-state-disabled');}}function getCurrPos(){var rowsInGrid=$($t).jqGrid('getDataIDs'),selrow=$('#id_g',frmtb).val(),pos=$.inArray(selrow,rowsInGrid);return[pos,rowsInGrid];}if($('#'+$.jgrid.jqID(IDs.themodal))[0]!==undefined){showFrm=$($t).triggerHandler('jqGridAddEditBeforeInitData',[$('#'+$.jgrid.jqID(frmgr)),frmoper]);if(showFrm===undefined){showFrm=true;}if(showFrm&&onBeforeInit){showFrm=onBeforeInit.call($t,$('#'+frmgr));}if(showFrm===false){return;}restoreInline();$('.ui-jqdialog-title','#'+$.jgrid.jqID(IDs.modalhead)).html(p.caption);$('#FormError',frmtb).hide();if(rp_ge[$t.p.id].topinfo){$('.topinfo',frmtb).html(rp_ge[$t.p.id].topinfo);$('.tinfo',frmtb).show();}else{$('.tinfo',frmtb).hide();}if(rp_ge[$t.p.id].bottominfo){$('.bottominfo',frmtb+'_2').html(rp_ge[$t.p.id].bottominfo);$('.binfo',frmtb+'_2').show();}else{$('.binfo',frmtb+'_2').hide();}// filldata\nfillData(rowid,$t,frmgr);///\nif(rowid=='_empty'||!rp_ge[$t.p.id].viewPagerButtons){$('#pData, #nData',frmtb+'_2').hide();}else{$('#pData, #nData',frmtb+'_2').show();}if(rp_ge[$t.p.id].processing===true){rp_ge[$t.p.id].processing=false;$('#sData',frmtb+'_2').removeClass('ui-state-active');}if($('#'+frmgr).data('disabled')===true){$('.confirm','#'+$.jgrid.jqID(IDs.themodal)).hide();$('#'+frmgr).data('disabled',false);}$($t).triggerHandler('jqGridAddEditBeforeShowForm',[$('#'+frmgr),frmoper]);if(onBeforeShow){onBeforeShow.call($t,$('#'+frmgr));}$('#'+$.jgrid.jqID(IDs.themodal)).data('onClose',rp_ge[$t.p.id].onClose);$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,jqM:false,overlay:p.overlay,modal:p.modal});if(!closeovrl){$('.jqmOverlay').click(function(){if(!checkUpdates()){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}$($t).triggerHandler('jqGridAddEditAfterShowForm',[$('#'+frmgr),frmoper]);if(onAfterShow){onAfterShow.call($t,$('#'+frmgr));}}else{var dh=isNaN(p.dataheight)?p.dataheight:p.dataheight+'px',dw=isNaN(p.datawidth)?p.datawidth:p.datawidth+'px',frm=$('<form name=\\'FormPost\\' id=\\''+frmgr+'\\' class=\\'FormGrid\\' onSubmit=\\'return false;\\' style=\\'width:'+dw+';overflow:auto;position:relative;height:'+dh+';\\'></form>').data('disabled',false),tbl=$('<table id=\\''+frmtborg+'\\' class=\\'EditTable\\' cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\'><tbody></tbody></table>');showFrm=$($t).triggerHandler('jqGridAddEditBeforeInitData',[$('#'+frmgr),frmoper]);if(showFrm===undefined){showFrm=true;}if(showFrm&&onBeforeInit){showFrm=onBeforeInit.call($t,$('#'+frmgr));}if(showFrm===false){return;}restoreInline();$($t.p.colModel).each(function(){var fmto=this.formoptions;maxCols=Math.max(maxCols,fmto?fmto.colpos||0:0);maxRows=Math.max(maxRows,fmto?fmto.rowpos||0:0);});$(frm).append(tbl);var flr=$('<tr id=\\'FormError\\' style=\\'display:none\\'><td class=\\'ui-state-error\\' colspan=\\''+maxCols*2+'\\'></td></tr>');flr[0].rp=0;$(tbl).append(flr);//topinfo\nflr=$('<tr style=\\'display:none\\' class=\\'tinfo\\'><td class=\\'topinfo\\' colspan=\\''+maxCols*2+'\\'>'+rp_ge[$t.p.id].topinfo+'</td></tr>');flr[0].rp=0;$(tbl).append(flr);// set the id.\n// use carefull only to change here colproperties.\n// create data\nvar rtlb=$t.p.direction=='rtl'?true:false,bp=rtlb?'nData':'pData',bn=rtlb?'pData':'nData';createData(rowid,$t,tbl,maxCols);// buttons at footer\nvar bP='<a href=\\'javascript:void(0)\\' id=\\''+bp+'\\' class=\\'fm-button ui-state-default ui-corner-left\\'><span class=\\'ui-icon ui-icon-triangle-1-w\\'></span></a>',bN='<a href=\\'javascript:void(0)\\' id=\\''+bn+'\\' class=\\'fm-button ui-state-default ui-corner-right\\'><span class=\\'ui-icon ui-icon-triangle-1-e\\'></span></a>',bS='<a href=\\'javascript:void(0)\\' id=\\'sData\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+p.bSubmit+'</a>',bC='<a href=\\'javascript:void(0)\\' id=\\'cData\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+p.bCancel+'</a>';var bt='<table border=\\'0\\' cellspacing=\\'0\\' cellpadding=\\'0\\' class=\\'EditTable\\' id=\\''+frmtborg+'_2\\'><tbody><tr><td colspan=\\'2\\'><hr class=\\'ui-widget-content\\' style=\\'margin:1px\\'/></td></tr><tr id=\\'Act_Buttons\\'><td class=\\'navButton\\'>'+(rtlb?bN+bP:bP+bN)+'</td><td class=\\'EditButton\\'>'+bS+bC+'</td></tr>';bt+='<tr style=\\'display:none\\' class=\\'binfo\\'><td class=\\'bottominfo\\' colspan=\\'2\\'>'+rp_ge[$t.p.id].bottominfo+'</td></tr>';bt+='</tbody></table>';if(maxRows>0){var sd=[];$.each($(tbl)[0].rows,function(i,r){sd[i]=r;});sd.sort(function(a,b){if(a.rp>b.rp){return 1;}if(a.rp<b.rp){return-1;}return 0;});$.each(sd,function(index,row){$('tbody',tbl).append(row);});}p.gbox='#gbox_'+$.jgrid.jqID(gID);var cle=false;if(p.closeOnEscape===true){p.closeOnEscape=false;cle=true;}var tms=$('<div></div>').append(frm).append(bt);$.jgrid.createModal(IDs,tms,p,'#gview_'+$.jgrid.jqID($t.p.id),$('#gbox_'+$.jgrid.jqID($t.p.id))[0]);if(rtlb){$('#pData, #nData',frmtb+'_2').css('float','right');$('.EditButton',frmtb+'_2').css('text-align','left');}if(rp_ge[$t.p.id].topinfo){$('.tinfo',frmtb).show();}if(rp_ge[$t.p.id].bottominfo){$('.binfo',frmtb+'_2').show();}tms=null;bt=null;$('#'+$.jgrid.jqID(IDs.themodal)).keydown(function(e){var wkey=e.target;if($('#'+frmgr).data('disabled')===true){return false;}//??\nif(rp_ge[$t.p.id].savekey[0]===true&&e.which==rp_ge[$t.p.id].savekey[1]){// save\nif(wkey.tagName!='TEXTAREA'){$('#sData',frmtb+'_2').trigger('click');return false;}}if(e.which===27){if(!checkUpdates()){return false;}if(cle){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:p.gbox,jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}return false;}if(rp_ge[$t.p.id].navkeys[0]===true){if($('#id_g',frmtb).val()=='_empty'){return true;}if(e.which==rp_ge[$t.p.id].navkeys[1]){//up\n$('#pData',frmtb+'_2').trigger('click');return false;}if(e.which==rp_ge[$t.p.id].navkeys[2]){//down\n$('#nData',frmtb+'_2').trigger('click');return false;}}});if(p.checkOnUpdate){$('a.ui-jqdialog-titlebar-close span','#'+$.jgrid.jqID(IDs.themodal)).removeClass('jqmClose');$('a.ui-jqdialog-titlebar-close','#'+$.jgrid.jqID(IDs.themodal)).unbind('click').click(function(){if(!checkUpdates()){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}p.saveicon=$.extend([true,'left','ui-icon-disk'],p.saveicon);p.closeicon=$.extend([true,'left','ui-icon-close'],p.closeicon);// beforeinitdata after creation of the form\nif(p.saveicon[0]===true){$('#sData',frmtb+'_2').addClass(p.saveicon[1]=='right'?'fm-button-icon-right':'fm-button-icon-left').append('<span class=\\'ui-icon '+p.saveicon[2]+'\\'></span>');}if(p.closeicon[0]===true){$('#cData',frmtb+'_2').addClass(p.closeicon[1]=='right'?'fm-button-icon-right':'fm-button-icon-left').append('<span class=\\'ui-icon '+p.closeicon[2]+'\\'></span>');}if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){bS='<a href=\\'javascript:void(0)\\' id=\\'sNew\\' class=\\'fm-button ui-state-default ui-corner-all\\' style=\\'z-index:1002\\'>'+p.bYes+'</a>';bN='<a href=\\'javascript:void(0)\\' id=\\'nNew\\' class=\\'fm-button ui-state-default ui-corner-all\\' style=\\'z-index:1002\\'>'+p.bNo+'</a>';bC='<a href=\\'javascript:void(0)\\' id=\\'cNew\\' class=\\'fm-button ui-state-default ui-corner-all\\' style=\\'z-index:1002\\'>'+p.bExit+'</a>';var zI=p.zIndex||999;zI++;$('<div class=\\'ui-widget-overlay jqgrid-overlay confirm\\' style=\\'z-index:'+zI+';display:none;\\'>&#160;'+'</div><div class=\\'confirm ui-widget-content ui-jqconfirm\\' style=\\'z-index:'+(zI+1)+'\\'>'+p.saveData+'<br/><br/>'+bS+bN+bC+'</div>').insertAfter('#'+frmgr);$('#sNew','#'+$.jgrid.jqID(IDs.themodal)).click(function(){postIt();$('#'+frmgr).data('disabled',false);$('.confirm','#'+$.jgrid.jqID(IDs.themodal)).hide();return false;});$('#nNew','#'+$.jgrid.jqID(IDs.themodal)).click(function(){$('.confirm','#'+$.jgrid.jqID(IDs.themodal)).hide();$('#'+frmgr).data('disabled',false);setTimeout(function(){$(':input','#'+frmgr)[0].focus();},0);return false;});$('#cNew','#'+$.jgrid.jqID(IDs.themodal)).click(function(){$('.confirm','#'+$.jgrid.jqID(IDs.themodal)).hide();$('#'+frmgr).data('disabled',false);$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}// here initform - only once\n$($t).triggerHandler('jqGridAddEditInitializeForm',[$('#'+frmgr),frmoper]);if(onInitializeForm){onInitializeForm.call($t,$('#'+frmgr));}if(rowid=='_empty'||!rp_ge[$t.p.id].viewPagerButtons){$('#pData,#nData',frmtb+'_2').hide();}else{$('#pData,#nData',frmtb+'_2').show();}$($t).triggerHandler('jqGridAddEditBeforeShowForm',[$('#'+frmgr),frmoper]);if(onBeforeShow){onBeforeShow.call($t,$('#'+frmgr));}$('#'+$.jgrid.jqID(IDs.themodal)).data('onClose',rp_ge[$t.p.id].onClose);$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,overlay:p.overlay,modal:p.modal});if(!closeovrl){$('.jqmOverlay').click(function(){if(!checkUpdates()){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}$($t).triggerHandler('jqGridAddEditAfterShowForm',[$('#'+frmgr),frmoper]);if(onAfterShow){onAfterShow.call($t,$('#'+frmgr));}$('.fm-button','#'+$.jgrid.jqID(IDs.themodal)).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});$('#sData',frmtb+'_2').click(function(){postdata={};extpost={};$('#FormError',frmtb).hide();// all depend on ret array\n//ret[0] - succes\n//ret[1] - msg if not succes\n//ret[2] - the id  that will be set if reload after submit false\ngetFormData();if(postdata[$t.p.id+'_id']=='_empty'){postIt();}else if(p.checkOnSubmit===true){newData=$.extend({},postdata,extpost);diff=compareData(newData,rp_ge[$t.p.id]._savedData);if(diff){$('#'+frmgr).data('disabled',true);$('.confirm','#'+$.jgrid.jqID(IDs.themodal)).show();}else{postIt();}}else{postIt();}return false;});$('#cData',frmtb+'_2').click(function(){if(!checkUpdates()){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});$('#nData',frmtb+'_2').click(function(){if(!checkUpdates()){return false;}$('#FormError',frmtb).hide();var npos=getCurrPos();npos[0]=parseInt(npos[0],10);if(npos[0]!=-1&&npos[1][npos[0]+1]){$($t).triggerHandler('jqGridAddEditClickPgButtons',['next',$('#'+frmgr),npos[1][npos[0]]]);var nposret;if($.isFunction(p.onclickPgButtons)){nposret=p.onclickPgButtons.call($t,'next',$('#'+frmgr),npos[1][npos[0]]);if(nposret!==undefined&&nposret===false){return false;}}if($('#'+$.jgrid.jqID(npos[1][npos[0]+1])).hasClass('ui-state-disabled')){return false;}fillData(npos[1][npos[0]+1],$t,frmgr);$($t).jqGrid('setSelection',npos[1][npos[0]+1]);$($t).triggerHandler('jqGridAddEditAfterClickPgButtons',['next',$('#'+frmgr),npos[1][npos[0]]]);if($.isFunction(p.afterclickPgButtons)){p.afterclickPgButtons.call($t,'next',$('#'+frmgr),npos[1][npos[0]+1]);}updateNav(npos[0]+1,npos);}return false;});$('#pData',frmtb+'_2').click(function(){if(!checkUpdates()){return false;}$('#FormError',frmtb).hide();var ppos=getCurrPos();if(ppos[0]!=-1&&ppos[1][ppos[0]-1]){$($t).triggerHandler('jqGridAddEditClickPgButtons',['prev',$('#'+frmgr),ppos[1][ppos[0]]]);var pposret;if($.isFunction(p.onclickPgButtons)){pposret=p.onclickPgButtons.call($t,'prev',$('#'+frmgr),ppos[1][ppos[0]]);if(pposret!==undefined&&pposret===false){return false;}}if($('#'+$.jgrid.jqID(ppos[1][ppos[0]-1])).hasClass('ui-state-disabled')){return false;}fillData(ppos[1][ppos[0]-1],$t,frmgr);$($t).jqGrid('setSelection',ppos[1][ppos[0]-1]);$($t).triggerHandler('jqGridAddEditAfterClickPgButtons',['prev',$('#'+frmgr),ppos[1][ppos[0]]]);if($.isFunction(p.afterclickPgButtons)){p.afterclickPgButtons.call($t,'prev',$('#'+frmgr),ppos[1][ppos[0]-1]);}updateNav(ppos[0]-1,ppos);}return false;});}var posInit=getCurrPos();updateNav(posInit[0],posInit);});},viewGridRow:function viewGridRow(rowid,p){p=$.extend(true,{top:0,left:0,width:0,datawidth:'auto',height:'auto',dataheight:'auto',modal:false,overlay:30,drag:true,resize:true,jqModal:true,closeOnEscape:false,labelswidth:'30%',closeicon:[],navkeys:[false,38,40],onClose:null,beforeShowForm:null,beforeInitData:null,viewPagerButtons:true},$.jgrid.view,p||{});rp_ge[$(this)[0].p.id]=p;return this.each(function(){var $t=this;if(!$t.grid||!rowid){return;}var gID=$t.p.id,frmgr='ViewGrid_'+$.jgrid.jqID(gID),frmtb='ViewTbl_'+$.jgrid.jqID(gID),frmgr_id='ViewGrid_'+gID,frmtb_id='ViewTbl_'+gID,IDs={themodal:'viewmod'+gID,modalhead:'viewhd'+gID,modalcontent:'viewcnt'+gID,scrollelm:frmgr},onBeforeInit=$.isFunction(rp_ge[$t.p.id].beforeInitData)?rp_ge[$t.p.id].beforeInitData:false,showFrm=true,maxCols=1,maxRows=0;function focusaref(){//Sfari 3 issues\nif(rp_ge[$t.p.id].closeOnEscape===true||rp_ge[$t.p.id].navkeys[0]===true){setTimeout(function(){$('.ui-jqdialog-titlebar-close','#'+$.jgrid.jqID(IDs.modalhead)).focus();},0);}}function createData(rowid,obj,tb,maxcols){var nm,hc,trdata,cnt=0,tmp,dc,retpos=[],ind=false,i,tdtmpl='<td class=\\'CaptionTD form-view-label ui-widget-content\\' width=\\''+p.labelswidth+'\\'>&#160;</td><td class=\\'DataTD form-view-data ui-helper-reset ui-widget-content\\'>&#160;</td>',tmpl='',tdtmpl2='<td class=\\'CaptionTD form-view-label ui-widget-content\\'>&#160;</td><td class=\\'DataTD form-view-data ui-widget-content\\'>&#160;</td>',fmtnum=['integer','number','currency'],max1=0,max2=0,maxw,setme,viewfld;for(i=1;i<=maxcols;i++){tmpl+=i==1?tdtmpl:tdtmpl2;}// find max number align rigth with property formatter\n$(obj.p.colModel).each(function(){if(this.editrules&&this.editrules.edithidden===true){hc=false;}else{hc=this.hidden===true?true:false;}if(!hc&&this.align==='right'){if(this.formatter&&$.inArray(this.formatter,fmtnum)!==-1){max1=Math.max(max1,parseInt(this.width,10));}else{max2=Math.max(max2,parseInt(this.width,10));}}});maxw=max1!==0?max1:max2!==0?max2:0;ind=$(obj).jqGrid('getInd',rowid);$(obj.p.colModel).each(function(i){nm=this.name;setme=false;// hidden fields are included in the form\nif(this.editrules&&this.editrules.edithidden===true){hc=false;}else{hc=this.hidden===true?true:false;}dc=hc?'style=\\'display:none\\'':'';viewfld=typeof this.viewable!=='boolean'?true:this.viewable;if(nm!=='cb'&&nm!=='subgrid'&&nm!=='rn'&&viewfld){if(ind===false){tmp='';}else{if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$('td:eq('+i+')',obj.rows[ind]).text();}else{tmp=$('td:eq('+i+')',obj.rows[ind]).html();}}setme=this.align==='right'&&maxw!==0?true:false;var frmopt=$.extend({},{rowabove:false,rowcontent:''},this.formoptions||{}),rp=parseInt(frmopt.rowpos,10)||cnt+1,cp=parseInt((parseInt(frmopt.colpos,10)||1)*2,10);if(frmopt.rowabove){var newdata=$('<tr><td class=\\'contentinfo\\' colspan=\\''+maxcols*2+'\\'>'+frmopt.rowcontent+'</td></tr>');$(tb).append(newdata);newdata[0].rp=rp;}trdata=$(tb).find('tr[rowpos='+rp+']');if(trdata.length===0){trdata=$('<tr '+dc+' rowpos=\\''+rp+'\\'></tr>').addClass('FormData').attr('id','trv_'+nm);$(trdata).append(tmpl);$(tb).append(trdata);trdata[0].rp=rp;}$('td:eq('+(cp-2)+')',trdata[0]).html('<b>'+(frmopt.label===undefined?obj.p.colNames[i]:frmopt.label)+'</b>');$('td:eq('+(cp-1)+')',trdata[0]).append('<span>'+tmp+'</span>').attr('id','v_'+nm);if(setme){$('td:eq('+(cp-1)+') span',trdata[0]).css({'text-align':'right',width:maxw+'px'});}retpos[cnt]=i;cnt++;}});if(cnt>0){var idrow=$('<tr class=\\'FormData\\' style=\\'display:none\\'><td class=\\'CaptionTD\\'></td><td colspan=\\''+(maxcols*2-1)+'\\' class=\\'DataTD\\'><input class=\\'FormElement\\' id=\\'id_g\\' type=\\'text\\' name=\\'id\\' value=\\''+rowid+'\\'/></td></tr>');idrow[0].rp=cnt+99;$(tb).append(idrow);}return retpos;}function fillData(rowid,obj){var nm,hc,cnt=0,tmp,opt,trv;trv=$(obj).jqGrid('getInd',rowid,true);if(!trv){return;}$('td',trv).each(function(i){nm=obj.p.colModel[i].name;// hidden fields are included in the form\nif(obj.p.colModel[i].editrules&&obj.p.colModel[i].editrules.edithidden===true){hc=false;}else{hc=obj.p.colModel[i].hidden===true?true:false;}if(nm!=='cb'&&nm!=='subgrid'&&nm!=='rn'){if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$(this).text();}else{tmp=$(this).html();}opt=$.extend({},obj.p.colModel[i].editoptions||{});nm=$.jgrid.jqID('v_'+nm);$('#'+nm+' span','#'+frmtb).html(tmp);if(hc){$('#'+nm,'#'+frmtb).parents('tr:first').hide();}cnt++;}});if(cnt>0){$('#id_g','#'+frmtb).val(rowid);}}function updateNav(cr,posarr){var totr=posarr[1].length-1;if(cr===0){$('#pData','#'+frmtb+'_2').addClass('ui-state-disabled');}else if(posarr[1][cr-1]!==undefined&&$('#'+$.jgrid.jqID(posarr[1][cr-1])).hasClass('ui-state-disabled')){$('#pData',frmtb+'_2').addClass('ui-state-disabled');}else{$('#pData','#'+frmtb+'_2').removeClass('ui-state-disabled');}if(cr==totr){$('#nData','#'+frmtb+'_2').addClass('ui-state-disabled');}else if(posarr[1][cr+1]!==undefined&&$('#'+$.jgrid.jqID(posarr[1][cr+1])).hasClass('ui-state-disabled')){$('#nData',frmtb+'_2').addClass('ui-state-disabled');}else{$('#nData','#'+frmtb+'_2').removeClass('ui-state-disabled');}}function getCurrPos(){var rowsInGrid=$($t).jqGrid('getDataIDs'),selrow=$('#id_g','#'+frmtb).val(),pos=$.inArray(selrow,rowsInGrid);return[pos,rowsInGrid];}if($('#'+$.jgrid.jqID(IDs.themodal))[0]!==undefined){if(onBeforeInit){showFrm=onBeforeInit.call($t,$('#'+frmgr));if(showFrm===undefined){showFrm=true;}}if(showFrm===false){return;}$('.ui-jqdialog-title','#'+$.jgrid.jqID(IDs.modalhead)).html(p.caption);$('#FormError','#'+frmtb).hide();fillData(rowid,$t);if($.isFunction(rp_ge[$t.p.id].beforeShowForm)){rp_ge[$t.p.id].beforeShowForm.call($t,$('#'+frmgr));}$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,jqM:false,overlay:p.overlay,modal:p.modal});focusaref();}else{var dh=isNaN(p.dataheight)?p.dataheight:p.dataheight+'px',dw=isNaN(p.datawidth)?p.datawidth:p.datawidth+'px',frm=$('<form name=\\'FormPost\\' id=\\''+frmgr_id+'\\' class=\\'FormGrid\\' style=\\'width:'+dw+';overflow:auto;position:relative;height:'+dh+';\\'></form>'),tbl=$('<table id=\\''+frmtb_id+'\\' class=\\'EditTable\\' cellspacing=\\'1\\' cellpadding=\\'2\\' border=\\'0\\' style=\\'table-layout:fixed\\'><tbody></tbody></table>');if(onBeforeInit){showFrm=onBeforeInit.call($t,$('#'+frmgr));if(showFrm===undefined){showFrm=true;}}if(showFrm===false){return;}$($t.p.colModel).each(function(){var fmto=this.formoptions;maxCols=Math.max(maxCols,fmto?fmto.colpos||0:0);maxRows=Math.max(maxRows,fmto?fmto.rowpos||0:0);});// set the id.\n$(frm).append(tbl);createData(rowid,$t,tbl,maxCols);var rtlb=$t.p.direction=='rtl'?true:false,bp=rtlb?'nData':'pData',bn=rtlb?'pData':'nData',// buttons at footer\nbP='<a href=\\'javascript:void(0)\\' id=\\''+bp+'\\' class=\\'fm-button ui-state-default ui-corner-left\\'><span class=\\'ui-icon ui-icon-triangle-1-w\\'></span></a>',bN='<a href=\\'javascript:void(0)\\' id=\\''+bn+'\\' class=\\'fm-button ui-state-default ui-corner-right\\'><span class=\\'ui-icon ui-icon-triangle-1-e\\'></span></a>',bC='<a href=\\'javascript:void(0)\\' id=\\'cData\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+p.bClose+'</a>';if(maxRows>0){var sd=[];$.each($(tbl)[0].rows,function(i,r){sd[i]=r;});sd.sort(function(a,b){if(a.rp>b.rp){return 1;}if(a.rp<b.rp){return-1;}return 0;});$.each(sd,function(index,row){$('tbody',tbl).append(row);});}p.gbox='#gbox_'+$.jgrid.jqID(gID);var bt=$('<div></div>').append(frm).append('<table border=\\'0\\' class=\\'EditTable\\' id=\\''+frmtb+'_2\\'><tbody><tr id=\\'Act_Buttons\\'><td class=\\'navButton\\' width=\\''+p.labelswidth+'\\'>'+(rtlb?bN+bP:bP+bN)+'</td><td class=\\'EditButton\\'>'+bC+'</td></tr></tbody></table>');$.jgrid.createModal(IDs,bt,p,'#gview_'+$.jgrid.jqID($t.p.id),$('#gview_'+$.jgrid.jqID($t.p.id))[0]);if(rtlb){$('#pData, #nData','#'+frmtb+'_2').css('float','right');$('.EditButton','#'+frmtb+'_2').css('text-align','left');}if(!p.viewPagerButtons){$('#pData, #nData','#'+frmtb+'_2').hide();}bt=null;$('#'+IDs.themodal).keydown(function(e){if(e.which===27){if(rp_ge[$t.p.id].closeOnEscape){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:p.gbox,jqm:p.jqModal,onClose:p.onClose});}return false;}if(p.navkeys[0]===true){if(e.which===p.navkeys[1]){//up\n$('#pData','#'+frmtb+'_2').trigger('click');return false;}if(e.which===p.navkeys[2]){//down\n$('#nData','#'+frmtb+'_2').trigger('click');return false;}}});p.closeicon=$.extend([true,'left','ui-icon-close'],p.closeicon);if(p.closeicon[0]===true){$('#cData','#'+frmtb+'_2').addClass(p.closeicon[1]=='right'?'fm-button-icon-right':'fm-button-icon-left').append('<span class=\\'ui-icon '+p.closeicon[2]+'\\'></span>');}if($.isFunction(p.beforeShowForm)){p.beforeShowForm.call($t,$('#'+frmgr));}$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,overlay:p.overlay,modal:p.modal});$('.fm-button:not(.ui-state-disabled)','#'+frmtb+'_2').hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});focusaref();$('#cData','#'+frmtb+'_2').click(function(){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:p.onClose});return false;});$('#nData','#'+frmtb+'_2').click(function(){$('#FormError','#'+frmtb).hide();var npos=getCurrPos();npos[0]=parseInt(npos[0],10);if(npos[0]!=-1&&npos[1][npos[0]+1]){if($.isFunction(p.onclickPgButtons)){p.onclickPgButtons.call($t,'next',$('#'+frmgr),npos[1][npos[0]]);}fillData(npos[1][npos[0]+1],$t);$($t).jqGrid('setSelection',npos[1][npos[0]+1]);if($.isFunction(p.afterclickPgButtons)){p.afterclickPgButtons.call($t,'next',$('#'+frmgr),npos[1][npos[0]+1]);}updateNav(npos[0]+1,npos);}focusaref();return false;});$('#pData','#'+frmtb+'_2').click(function(){$('#FormError','#'+frmtb).hide();var ppos=getCurrPos();if(ppos[0]!=-1&&ppos[1][ppos[0]-1]){if($.isFunction(p.onclickPgButtons)){p.onclickPgButtons.call($t,'prev',$('#'+frmgr),ppos[1][ppos[0]]);}fillData(ppos[1][ppos[0]-1],$t);$($t).jqGrid('setSelection',ppos[1][ppos[0]-1]);if($.isFunction(p.afterclickPgButtons)){p.afterclickPgButtons.call($t,'prev',$('#'+frmgr),ppos[1][ppos[0]-1]);}updateNav(ppos[0]-1,ppos);}focusaref();return false;});}var posInit=getCurrPos();updateNav(posInit[0],posInit);});},delGridRow:function delGridRow(rowids,p){p=$.extend(true,{top:0,left:0,width:240,height:'auto',dataheight:'auto',modal:false,overlay:30,drag:true,resize:true,url:'',mtype:'POST',reloadAfterSubmit:true,beforeShowForm:null,beforeInitData:null,afterShowForm:null,beforeSubmit:null,onclickSubmit:null,afterSubmit:null,jqModal:true,closeOnEscape:false,delData:{},delicon:[],cancelicon:[],onClose:null,ajaxDelOptions:{},processing:false,serializeDelData:null,useDataProxy:false},$.jgrid.del,p||{});rp_ge[$(this)[0].p.id]=p;return this.each(function(){var $t=this;if(!$t.grid){return;}if(!rowids){return;}var onBeforeShow=$.isFunction(rp_ge[$t.p.id].beforeShowForm),onAfterShow=$.isFunction(rp_ge[$t.p.id].afterShowForm),onBeforeInit=$.isFunction(rp_ge[$t.p.id].beforeInitData)?rp_ge[$t.p.id].beforeInitData:false,gID=$t.p.id,onCS={},showFrm=true,dtbl='DelTbl_'+$.jgrid.jqID(gID),postd,idname,opers,oper,dtbl_id='DelTbl_'+gID,IDs={themodal:'delmod'+gID,modalhead:'delhd'+gID,modalcontent:'delcnt'+gID,scrollelm:dtbl};if($.isArray(rowids)){rowids=rowids.join();}if($('#'+$.jgrid.jqID(IDs.themodal))[0]!==undefined){if(onBeforeInit){showFrm=onBeforeInit.call($t,$('#'+dtbl));if(showFrm===undefined){showFrm=true;}}if(showFrm===false){return;}$('#DelData>td','#'+dtbl).text(rowids);$('#DelError','#'+dtbl).hide();if(rp_ge[$t.p.id].processing===true){rp_ge[$t.p.id].processing=false;$('#dData','#'+dtbl).removeClass('ui-state-active');}if(onBeforeShow){rp_ge[$t.p.id].beforeShowForm.call($t,$('#'+dtbl));}$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,jqM:false,overlay:rp_ge[$t.p.id].overlay,modal:rp_ge[$t.p.id].modal});if(onAfterShow){rp_ge[$t.p.id].afterShowForm.call($t,$('#'+dtbl));}}else{var dh=isNaN(rp_ge[$t.p.id].dataheight)?rp_ge[$t.p.id].dataheight:rp_ge[$t.p.id].dataheight+'px',dw=isNaN(p.datawidth)?p.datawidth:p.datawidth+'px',tbl='<div id=\\''+dtbl_id+'\\' class=\\'formdata\\' style=\\'width:'+dw+';overflow:auto;position:relative;height:'+dh+';\\'>';tbl+='<table class=\\'DelTable\\'><tbody>';// error data\ntbl+='<tr id=\\'DelError\\' style=\\'display:none\\'><td class=\\'ui-state-error\\'></td></tr>';tbl+='<tr id=\\'DelData\\' style=\\'display:none\\'><td >'+rowids+'</td></tr>';tbl+='<tr><td class=\"delmsg\" style=\"white-space:pre;\">'+rp_ge[$t.p.id].msg+'</td></tr><tr><td >&#160;</td></tr>';// buttons at footer\ntbl+='</tbody></table></div>';var bS='<a href=\\'javascript:void(0)\\' id=\\'dData\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+p.bSubmit+'</a>',bC='<a href=\\'javascript:void(0)\\' id=\\'eData\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+p.bCancel+'</a>';tbl+='<table cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\' class=\\'EditTable\\' id=\\''+dtbl+'_2\\'><tbody><tr><td><hr class=\\'ui-widget-content\\' style=\\'margin:1px\\'/></td></tr><tr><td class=\\'DelButton EditButton\\'>'+bS+'&#160;'+bC+'</td></tr></tbody></table>';p.gbox='#gbox_'+$.jgrid.jqID(gID);$.jgrid.createModal(IDs,tbl,p,'#gview_'+$.jgrid.jqID($t.p.id),$('#gview_'+$.jgrid.jqID($t.p.id))[0]);if(onBeforeInit){showFrm=onBeforeInit.call($t,$('#'+dtbl));if(showFrm===undefined){showFrm=true;}}if(showFrm===false){return;}$('.fm-button','#'+dtbl+'_2').hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});p.delicon=$.extend([true,'left','ui-icon-scissors'],rp_ge[$t.p.id].delicon);p.cancelicon=$.extend([true,'left','ui-icon-cancel'],rp_ge[$t.p.id].cancelicon);if(p.delicon[0]===true){$('#dData','#'+dtbl+'_2').addClass(p.delicon[1]=='right'?'fm-button-icon-right':'fm-button-icon-left').append('<span class=\\'ui-icon '+p.delicon[2]+'\\'></span>');}if(p.cancelicon[0]===true){$('#eData','#'+dtbl+'_2').addClass(p.cancelicon[1]=='right'?'fm-button-icon-right':'fm-button-icon-left').append('<span class=\\'ui-icon '+p.cancelicon[2]+'\\'></span>');}$('#dData','#'+dtbl+'_2').click(function(){var ret=[true,''],pk,postdata=$('#DelData>td','#'+dtbl).text();//the pair is name=val1,val2,...\nonCS={};if($.isFunction(rp_ge[$t.p.id].onclickSubmit)){onCS=rp_ge[$t.p.id].onclickSubmit.call($t,rp_ge[$t.p.id],postdata)||{};}if($.isFunction(rp_ge[$t.p.id].beforeSubmit)){ret=rp_ge[$t.p.id].beforeSubmit.call($t,postdata);}if(ret[0]&&!rp_ge[$t.p.id].processing){rp_ge[$t.p.id].processing=true;opers=$t.p.prmNames;postd=$.extend({},rp_ge[$t.p.id].delData,onCS);oper=opers.oper;postd[oper]=opers.deloper;idname=opers.id;postdata=String(postdata).split(',');if(!postdata.length){return false;}for(pk in postdata){if(postdata.hasOwnProperty(pk)){postdata[pk]=$.jgrid.stripPref($t.p.idPrefix,postdata[pk]);}}postd[idname]=postdata.join();$(this).addClass('ui-state-active');var ajaxOptions=$.extend({url:rp_ge[$t.p.id].url||$($t).jqGrid('getGridParam','editurl'),type:rp_ge[$t.p.id].mtype,data:$.isFunction(rp_ge[$t.p.id].serializeDelData)?rp_ge[$t.p.id].serializeDelData.call($t,postd):postd,complete:function complete(data,status){var i;if(status!='success'){ret[0]=false;if($.isFunction(rp_ge[$t.p.id].errorTextFormat)){ret[1]=rp_ge[$t.p.id].errorTextFormat.call($t,data);}else{ret[1]=status+' Status: \\''+data.statusText+'\\'. Error code: '+data.status;}}else{// data is posted successful\n// execute aftersubmit with the returned data from server\nif($.isFunction(rp_ge[$t.p.id].afterSubmit)){ret=rp_ge[$t.p.id].afterSubmit.call($t,data,postd);}}if(ret[0]===false){$('#DelError>td','#'+dtbl).html(ret[1]);$('#DelError','#'+dtbl).show();}else{if(rp_ge[$t.p.id].reloadAfterSubmit&&$t.p.datatype!='local'){$($t).trigger('reloadGrid');}else{if($t.p.treeGrid===true){try{$($t).jqGrid('delTreeNode',$t.p.idPrefix+postdata[0]);}catch(e){}}else{for(i=0;i<postdata.length;i++){$($t).jqGrid('delRowData',$t.p.idPrefix+postdata[i]);}}$t.p.selrow=null;$t.p.selarrrow=[];}if($.isFunction(rp_ge[$t.p.id].afterComplete)){setTimeout(function(){rp_ge[$t.p.id].afterComplete.call($t,data,postdata);},500);}}rp_ge[$t.p.id].processing=false;$('#dData','#'+dtbl+'_2').removeClass('ui-state-active');if(ret[0]){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}}},$.jgrid.ajaxOptions,rp_ge[$t.p.id].ajaxDelOptions);if(!ajaxOptions.url&&!rp_ge[$t.p.id].useDataProxy){if($.isFunction($t.p.dataProxy)){rp_ge[$t.p.id].useDataProxy=true;}else{ret[0]=false;ret[1]+=' '+$.jgrid.errors.nourl;}}if(ret[0]){if(rp_ge[$t.p.id].useDataProxy){var dpret=$t.p.dataProxy.call($t,ajaxOptions,'del_'+$t.p.id);if(dpret===undefined){dpret=[true,''];}if(dpret[0]===false){ret[0]=false;ret[1]=dpret[1]||'Error deleting the selected row!';}else{$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}}else{$.ajax(ajaxOptions);}}}if(ret[0]===false){$('#DelError>td','#'+dtbl).html(ret[1]);$('#DelError','#'+dtbl).show();}return false;});$('#eData','#'+dtbl+'_2').click(function(){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});if(onBeforeShow){rp_ge[$t.p.id].beforeShowForm.call($t,$('#'+dtbl));}$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,overlay:rp_ge[$t.p.id].overlay,modal:rp_ge[$t.p.id].modal});if(onAfterShow){rp_ge[$t.p.id].afterShowForm.call($t,$('#'+dtbl));}}if(rp_ge[$t.p.id].closeOnEscape===true){setTimeout(function(){$('.ui-jqdialog-titlebar-close','#'+$.jgrid.jqID(IDs.modalhead)).focus();},0);}});},navGrid:function navGrid(elem,o,pEdit,pAdd,pDel,pSearch,pView){o=$.extend({edit:true,editicon:'ui-icon-pencil',add:true,addicon:'ui-icon-plus',del:true,delicon:'ui-icon-trash',search:true,searchicon:'ui-icon-search',refresh:true,refreshicon:'ui-icon-refresh',refreshstate:'firstpage',view:false,viewicon:'ui-icon-document',position:'left',closeOnEscape:true,beforeRefresh:null,afterRefresh:null,cloneToTop:false,alertwidth:200,alertheight:'auto',alerttop:null,alertleft:null,alertzIndex:null},$.jgrid.nav,o||{});return this.each(function(){if(this.nav){return;}var alertIDs={themodal:'alertmod_'+this.p.id,modalhead:'alerthd_'+this.p.id,modalcontent:'alertcnt_'+this.p.id},$t=this,twd,tdw;if(!$t.grid||typeof elem!=='string'){return;}if($('#'+alertIDs.themodal)[0]===undefined){if(!o.alerttop&&!o.alertleft){if(window.innerWidth!==undefined){o.alertleft=window.innerWidth;o.alerttop=window.innerHeight;}else if(document.documentElement!==undefined&&document.documentElement.clientWidth!==undefined&&document.documentElement.clientWidth!==0){o.alertleft=document.documentElement.clientWidth;o.alerttop=document.documentElement.clientHeight;}else{o.alertleft=1024;o.alerttop=768;}o.alertleft=o.alertleft/2-parseInt(o.alertwidth,10)/2;o.alerttop=o.alerttop/2-25;}$.jgrid.createModal(alertIDs,'<div>'+o.alerttext+'</div><span tabindex=\\'0\\'><span tabindex=\\'-1\\' id=\\'jqg_alrt\\'></span></span>',{gbox:'#gbox_'+$.jgrid.jqID($t.p.id),jqModal:true,drag:true,resize:true,caption:o.alertcap,top:o.alerttop,left:o.alertleft,width:o.alertwidth,height:o.alertheight,closeOnEscape:o.closeOnEscape,zIndex:o.alertzIndex},'#gview_'+$.jgrid.jqID($t.p.id),$('#gbox_'+$.jgrid.jqID($t.p.id))[0],true);}var clone=1,i,onHoverIn=function onHoverIn(){if(!$(this).hasClass('ui-state-disabled')){$(this).addClass('ui-state-hover');}},onHoverOut=function onHoverOut(){$(this).removeClass('ui-state-hover');};if(o.cloneToTop&&$t.p.toppager){clone=2;}for(i=0;i<clone;i++){var tbd,navtbl=$('<table cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\' class=\\'ui-pg-table navtable\\' style=\\'float:left;table-layout:auto;\\'><tbody><tr></tr></tbody></table>'),sep='<td class=\\'ui-pg-button ui-state-disabled\\' style=\\'width:4px;\\'><span class=\\'ui-separator\\'></span></td>',pgid,elemids;if(i===0){pgid=elem;elemids=$t.p.id;if(pgid==$t.p.toppager){elemids+='_top';clone=1;}}else{pgid=$t.p.toppager;elemids=$t.p.id+'_top';}if($t.p.direction=='rtl'){$(navtbl).attr('dir','rtl').css('float','right');}if(o.add){pAdd=pAdd||{};tbd=$('<td class=\\'ui-pg-button ui-corner-all\\'></td>');$(tbd).append('<div class=\\'ui-pg-div\\'><span class=\\'ui-icon '+o.addicon+'\\'></span>'+o.addtext+'</div>');$('tr',navtbl).append(tbd);$(tbd,navtbl).attr({'title':o.addtitle||'',id:pAdd.id||'add_'+elemids}).click(function(){if(!$(this).hasClass('ui-state-disabled')){if($.isFunction(o.addfunc)){o.addfunc.call($t);}else{$($t).jqGrid('editGridRow','new',pAdd);}}return false;}).hover(onHoverIn,onHoverOut);tbd=null;}if(o.edit){tbd=$('<td class=\\'ui-pg-button ui-corner-all\\'></td>');pEdit=pEdit||{};$(tbd).append('<div class=\\'ui-pg-div\\'><span class=\\'ui-icon '+o.editicon+'\\'></span>'+o.edittext+'</div>');$('tr',navtbl).append(tbd);$(tbd,navtbl).attr({'title':o.edittitle||'',id:pEdit.id||'edit_'+elemids}).click(function(){if(!$(this).hasClass('ui-state-disabled')){var sr=$t.p.selrow;if(sr){if($.isFunction(o.editfunc)){o.editfunc.call($t,sr);}else{$($t).jqGrid('editGridRow',sr,pEdit);}}else{$.jgrid.viewModal('#'+alertIDs.themodal,{gbox:'#gbox_'+$.jgrid.jqID($t.p.id),jqm:true});$('#jqg_alrt').focus();}}return false;}).hover(onHoverIn,onHoverOut);tbd=null;}if(o.view){tbd=$('<td class=\\'ui-pg-button ui-corner-all\\'></td>');pView=pView||{};$(tbd).append('<div class=\\'ui-pg-div\\'><span class=\\'ui-icon '+o.viewicon+'\\'></span>'+o.viewtext+'</div>');$('tr',navtbl).append(tbd);$(tbd,navtbl).attr({'title':o.viewtitle||'',id:pView.id||'view_'+elemids}).click(function(){if(!$(this).hasClass('ui-state-disabled')){var sr=$t.p.selrow;if(sr){if($.isFunction(o.viewfunc)){o.viewfunc.call($t,sr);}else{$($t).jqGrid('viewGridRow',sr,pView);}}else{$.jgrid.viewModal('#'+alertIDs.themodal,{gbox:'#gbox_'+$.jgrid.jqID($t.p.id),jqm:true});$('#jqg_alrt').focus();}}return false;}).hover(onHoverIn,onHoverOut);tbd=null;}if(o.del){tbd=$('<td class=\\'ui-pg-button ui-corner-all\\'></td>');pDel=pDel||{};$(tbd).append('<div class=\\'ui-pg-div\\'><span class=\\'ui-icon '+o.delicon+'\\'></span>'+o.deltext+'</div>');$('tr',navtbl).append(tbd);$(tbd,navtbl).attr({'title':o.deltitle||'',id:pDel.id||'del_'+elemids}).click(function(){if(!$(this).hasClass('ui-state-disabled')){var dr;if($t.p.multiselect){dr=$t.p.selarrrow;if(dr.length===0){dr=null;}}else{dr=$t.p.selrow;}if(dr){if($.isFunction(o.delfunc)){o.delfunc.call($t,dr);}else{$($t).jqGrid('delGridRow',dr,pDel);}}else{$.jgrid.viewModal('#'+alertIDs.themodal,{gbox:'#gbox_'+$.jgrid.jqID($t.p.id),jqm:true});$('#jqg_alrt').focus();}}return false;}).hover(onHoverIn,onHoverOut);tbd=null;}if(o.add||o.edit||o.del||o.view){$('tr',navtbl).append(sep);}if(o.search){tbd=$('<td class=\\'ui-pg-button ui-corner-all\\'></td>');pSearch=pSearch||{};$(tbd).append('<div class=\\'ui-pg-div\\'><span class=\\'ui-icon '+o.searchicon+'\\'></span>'+o.searchtext+'</div>');$('tr',navtbl).append(tbd);$(tbd,navtbl).attr({'title':o.searchtitle||'',id:pSearch.id||'search_'+elemids}).click(function(){if(!$(this).hasClass('ui-state-disabled')){if($.isFunction(o.searchfunc)){o.searchfunc.call($t,pSearch);}else{$($t).jqGrid('searchGrid',pSearch);}}return false;}).hover(onHoverIn,onHoverOut);if(pSearch.showOnLoad&&pSearch.showOnLoad===true){$(tbd,navtbl).click();}tbd=null;}if(o.refresh){tbd=$('<td class=\\'ui-pg-button ui-corner-all\\'></td>');$(tbd).append('<div class=\\'ui-pg-div\\'><span class=\\'ui-icon '+o.refreshicon+'\\'></span>'+o.refreshtext+'</div>');$('tr',navtbl).append(tbd);$(tbd,navtbl).attr({'title':o.refreshtitle||'',id:'refresh_'+elemids}).click(function(){if(!$(this).hasClass('ui-state-disabled')){if($.isFunction(o.beforeRefresh)){o.beforeRefresh.call($t);}$t.p.search=false;try{var gID=$t.p.id;$t.p.postData.filters='';$('#fbox_'+$.jgrid.jqID(gID)).jqFilter('resetFilter');if($.isFunction($t.clearToolbar)){$t.clearToolbar.call($t,false);}}catch(e){}switch(o.refreshstate){case'firstpage':$($t).trigger('reloadGrid',[{page:1}]);break;case'current':$($t).trigger('reloadGrid',[{current:true}]);break;}if($.isFunction(o.afterRefresh)){o.afterRefresh.call($t);}}return false;}).hover(onHoverIn,onHoverOut);tbd=null;}tdw=$('.ui-jqgrid').css('font-size')||'11px';$('body').append('<div id=\\'testpg2\\' class=\\'ui-jqgrid ui-widget ui-widget-content\\' style=\\'font-size:'+tdw+';visibility:hidden;\\' ></div>');twd=$(navtbl).clone().appendTo('#testpg2').width();$('#testpg2').remove();$(pgid+'_'+o.position,pgid).append(navtbl);if($t.p._nvtd){if(twd>$t.p._nvtd[0]){$(pgid+'_'+o.position,pgid).width(twd);$t.p._nvtd[0]=twd;}$t.p._nvtd[1]=twd;}tdw=null;twd=null;navtbl=null;this.nav=true;}});},navButtonAdd:function navButtonAdd(elem,p){p=$.extend({caption:'newButton',title:'',buttonicon:'ui-icon-newwin',onClickButton:null,position:'last',cursor:'pointer'},p||{});return this.each(function(){if(!this.grid){return;}if(typeof elem==='string'&&elem.indexOf('#')!==0){elem='#'+$.jgrid.jqID(elem);}var findnav=$('.navtable',elem)[0],$t=this;if(findnav){if(p.id&&$('#'+$.jgrid.jqID(p.id),findnav)[0]!==undefined){return;}var tbd=$('<td></td>');if(p.buttonicon.toString().toUpperCase()=='NONE'){$(tbd).addClass('ui-pg-button ui-corner-all').append('<div class=\\'ui-pg-div\\'>'+p.caption+'</div>');}else{$(tbd).addClass('ui-pg-button ui-corner-all').append('<div class=\\'ui-pg-div\\'><span class=\\'ui-icon '+p.buttonicon+'\\'></span>'+p.caption+'</div>');}if(p.id){$(tbd).attr('id',p.id);}if(p.position=='first'){if(findnav.rows[0].cells.length===0){$('tr',findnav).append(tbd);}else{$('tr td:eq(0)',findnav).before(tbd);}}else{$('tr',findnav).append(tbd);}$(tbd,findnav).attr('title',p.title||'').click(function(e){if(!$(this).hasClass('ui-state-disabled')){if($.isFunction(p.onClickButton)){p.onClickButton.call($t,e);}}return false;}).hover(function(){if(!$(this).hasClass('ui-state-disabled')){$(this).addClass('ui-state-hover');}},function(){$(this).removeClass('ui-state-hover');});}});},navSeparatorAdd:function navSeparatorAdd(elem,p){p=$.extend({sepclass:'ui-separator',sepcontent:'',position:'last'},p||{});return this.each(function(){if(!this.grid){return;}if(typeof elem==='string'&&elem.indexOf('#')!==0){elem='#'+$.jgrid.jqID(elem);}var findnav=$('.navtable',elem)[0];if(findnav){var sep='<td class=\\'ui-pg-button ui-state-disabled\\' style=\\'width:4px;\\'><span class=\\''+p.sepclass+'\\'></span>'+p.sepcontent+'</td>';if(p.position==='first'){if(findnav.rows[0].cells.length===0){$('tr',findnav).append(sep);}else{$('tr td:eq(0)',findnav).before(sep);}}else{$('tr',findnav).append(sep);}}});},GridToForm:function GridToForm(rowid,formid){return this.each(function(){var $t=this,i;if(!$t.grid){return;}var rowdata=$($t).jqGrid('getRowData',rowid);if(rowdata){for(i in rowdata){if(rowdata.hasOwnProperty(i)){if($('[name='+$.jgrid.jqID(i)+']',formid).is('input:radio')||$('[name='+$.jgrid.jqID(i)+']',formid).is('input:checkbox')){$('[name='+$.jgrid.jqID(i)+']',formid).each(function(){if($(this).val()==rowdata[i]){$(this)[$t.p.useProp?'prop':'attr']('checked',true);}else{$(this)[$t.p.useProp?'prop':'attr']('checked',false);}});}else{// this is very slow on big table and form.\n$('[name='+$.jgrid.jqID(i)+']',formid).val(rowdata[i]);}}}}});},FormToGrid:function FormToGrid(rowid,formid,mode,position){return this.each(function(){var $t=this;if(!$t.grid){return;}if(!mode){mode='set';}if(!position){position='first';}var fields=$(formid).serializeArray();var griddata={};$.each(fields,function(i,field){griddata[field.name]=field.value;});if(mode=='add'){$($t).jqGrid('addRowData',rowid,griddata,position);}else if(mode=='set'){$($t).jqGrid('setRowData',rowid,griddata);}});}});})(jQuery);/*jshint eqeqeq:false, eqnull:true, devel:true */ /*global jQuery */(function($){/**\r\n * jqGrid extension for manipulating Grid Data\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n**/'use strict';$.jgrid.inlineEdit=$.jgrid.inlineEdit||{};$.jgrid.extend({//Editing\neditRow:function editRow(rowid,keys,oneditfunc,successfunc,url,extraparam,aftersavefunc,errorfunc,afterrestorefunc){// Compatible mode old versions\nvar o={},args=$.makeArray(arguments).slice(1);if($.type(args[0])==='object'){o=args[0];}else{if(keys!==undefined){o.keys=keys;}if($.isFunction(oneditfunc)){o.oneditfunc=oneditfunc;}if($.isFunction(successfunc)){o.successfunc=successfunc;}if(url!==undefined){o.url=url;}if(extraparam!==undefined){o.extraparam=extraparam;}if($.isFunction(aftersavefunc)){o.aftersavefunc=aftersavefunc;}if($.isFunction(errorfunc)){o.errorfunc=errorfunc;}if($.isFunction(afterrestorefunc)){o.afterrestorefunc=afterrestorefunc;}// last two not as param, but as object (sorry)\n//if (restoreAfterError !== undefined) { o.restoreAfterError = restoreAfterError; }\n//if (mtype !== undefined) { o.mtype = mtype || \"POST\"; }\n}o=$.extend(true,{keys:false,oneditfunc:null,successfunc:null,url:null,extraparam:{},aftersavefunc:null,errorfunc:null,afterrestorefunc:null,restoreAfterError:true,mtype:'POST'},$.jgrid.inlineEdit,o);// End compatible\nreturn this.each(function(){var $t=this,nm,tmp,editable,cnt=0,focus=null,svr={},ind,cm;if(!$t.grid){return;}ind=$($t).jqGrid('getInd',rowid,true);if(ind===false){return;}editable=$(ind).attr('editable')||'0';if(editable=='0'&&!$(ind).hasClass('not-editable-row')){cm=$t.p.colModel;$('td[role=\"gridcell\"]',ind).each(function(i){nm=cm[i].name;var treeg=$t.p.treeGrid===true&&nm==$t.p.ExpandColumn;if(treeg){tmp=$('span:first',this).html();}else{try{tmp=$.unformat.call($t,this,{rowId:rowid,colModel:cm[i]},i);}catch(_){tmp=cm[i].edittype&&cm[i].edittype=='textarea'?$(this).text():$(this).html();}}if(nm!='cb'&&nm!='subgrid'&&nm!='rn'){if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}svr[nm]=tmp;if(cm[i].editable===true){if(focus===null){focus=i;}if(treeg){$('span:first',this).html('');}else{$(this).html('');}var opt=$.extend({},cm[i].editoptions||{},{id:rowid+'_'+nm,name:nm});if(!cm[i].edittype){cm[i].edittype='text';}if(tmp=='&nbsp;'||tmp=='&#160;'||tmp.length==1&&tmp.charCodeAt(0)==160){tmp='';}var elc=$.jgrid.createEl.call($t,cm[i].edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions||{}));$(elc).addClass('editable');if(treeg){$('span:first',this).append(elc);}else{$(this).append(elc);}$.jgrid.bindEv(elc,opt,$t);//Again IE\nif(cm[i].edittype=='select'&&cm[i].editoptions!==undefined&&cm[i].editoptions.multiple===true&&cm[i].editoptions.dataUrl===undefined&&$.jgrid.msie){$(elc).width($(elc).width());}cnt++;}}});if(cnt>0){svr.id=rowid;$t.p.savedRow.push(svr);$(ind).attr('editable','1');$('td:eq('+focus+') input',ind).focus();if(o.keys===true){$(ind).bind('keydown',function(e){if(e.keyCode===27){$($t).jqGrid('restoreRow',rowid,o.afterrestorefunc);if($t.p._inlinenav){try{$($t).jqGrid('showAddEditButtons');}catch(eer1){}}return false;}if(e.keyCode===13){var ta=e.target;if(ta.tagName=='TEXTAREA'){return true;}if($($t).jqGrid('saveRow',rowid,o)){if($t.p._inlinenav){try{$($t).jqGrid('showAddEditButtons');}catch(eer2){}}}return false;}});}$($t).triggerHandler('jqGridInlineEditRow',[rowid,o]);if($.isFunction(o.oneditfunc)){o.oneditfunc.call($t,rowid);}}}});},saveRow:function saveRow(rowid,successfunc,url,extraparam,aftersavefunc,errorfunc,afterrestorefunc){// Compatible mode old versions\nvar args=$.makeArray(arguments).slice(1),o={};if($.type(args[0])==='object'){o=args[0];}else{if($.isFunction(successfunc)){o.successfunc=successfunc;}if(url!==undefined){o.url=url;}if(extraparam!==undefined){o.extraparam=extraparam;}if($.isFunction(aftersavefunc)){o.aftersavefunc=aftersavefunc;}if($.isFunction(errorfunc)){o.errorfunc=errorfunc;}if($.isFunction(afterrestorefunc)){o.afterrestorefunc=afterrestorefunc;}}o=$.extend(true,{successfunc:null,url:null,extraparam:{},aftersavefunc:null,errorfunc:null,afterrestorefunc:null,restoreAfterError:true,mtype:'POST'},$.jgrid.inlineEdit,o);// End compatible\nvar success=false;var $t=this[0],nm,tmp={},tmp2={},tmp3={},editable,fr,cv,ind;if(!$t.grid){return success;}ind=$($t).jqGrid('getInd',rowid,true);if(ind===false){return success;}editable=$(ind).attr('editable');o.url=o.url||$t.p.editurl;if(editable==='1'){var cm;$('td[role=\"gridcell\"]',ind).each(function(i){cm=$t.p.colModel[i];nm=cm.name;if(nm!='cb'&&nm!='subgrid'&&cm.editable===true&&nm!='rn'&&!$(this).hasClass('not-editable-cell')){switch(cm.edittype){case'checkbox':var cbv=['Yes','No'];if(cm.editoptions){cbv=cm.editoptions.value.split(':');}tmp[nm]=$('input',this).is(':checked')?cbv[0]:cbv[1];break;case'text':case'password':case'textarea':case'button':tmp[nm]=$('input, textarea',this).val();break;case'select':if(!cm.editoptions.multiple){tmp[nm]=$('select option:selected',this).val();tmp2[nm]=$('select option:selected',this).text();}else{var sel=$('select',this),selectedText=[];tmp[nm]=$(sel).val();if(tmp[nm]){tmp[nm]=tmp[nm].join(',');}else{tmp[nm]='';}$('select option:selected',this).each(function(i,selected){selectedText[i]=$(selected).text();});tmp2[nm]=selectedText.join(',');}if(cm.formatter&&cm.formatter=='select'){tmp2={};}break;case'custom':try{if(cm.editoptions&&$.isFunction(cm.editoptions.custom_value)){tmp[nm]=cm.editoptions.custom_value.call($t,$('.customelement',this),'get');if(tmp[nm]===undefined){throw'e2';}}else{throw'e1';}}catch(e){if(e=='e1'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_value\\' '+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose);}if(e=='e2'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_value\\' '+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose);}}break;}cv=$.jgrid.checkValues(tmp[nm],i,$t);if(cv[0]===false){cv[1]=tmp[nm]+' '+cv[1];return false;}if($t.p.autoencode){tmp[nm]=$.jgrid.htmlEncode(tmp[nm]);}if(o.url!=='clientArray'&&cm.editoptions&&cm.editoptions.NullIfEmpty===true){if(tmp[nm]===''){tmp3[nm]='null';}}}});if(cv[0]===false){try{var positions=$.jgrid.findPos($('#'+$.jgrid.jqID(rowid),$t.grid.bDiv)[0]);$.jgrid.info_dialog($.jgrid.errors.errcap,cv[1],$.jgrid.edit.bClose,{left:positions[0],top:positions[1]});}catch(e){alert(cv[1]);}return success;}var idname,opers=$t.p.prmNames,oldRowId=rowid;if($t.p.keyIndex===false){idname=opers.id;}else{idname=$t.p.colModel[$t.p.keyIndex+($t.p.rownumbers===true?1:0)+($t.p.multiselect===true?1:0)+($t.p.subGrid===true?1:0)].name;}if(tmp){tmp[opers.oper]=opers.editoper;if(tmp[idname]===undefined){tmp[idname]=rowid;}else if(ind.id!==$t.p.idPrefix+tmp[idname]){// rename rowid\nvar oldid=$.jgrid.stripPref($t.p.idPrefix,rowid);if($t.p._index[oldid]!==undefined){$t.p._index[tmp[idname]]=$t.p._index[oldid];delete $t.p._index[oldid];}rowid=$t.p.idPrefix+tmp[idname];$(ind).attr('id',rowid);if($t.p.selrow===oldRowId){$t.p.selrow=rowid;}if($.isArray($t.p.selarrrow)){var i=$.inArray(oldRowId,$t.p.selarrrow);if(i>=0){$t.p.selarrrow[i]=rowid;}}if($t.p.multiselect){var newCboxId='jqg_'+$t.p.id+'_'+rowid;$('input.cbox',ind).attr('id',newCboxId).attr('name',newCboxId);}// TODO: to test the case of frozen columns\n}if($t.p.inlineData===undefined){$t.p.inlineData={};}tmp=$.extend({},tmp,$t.p.inlineData,o.extraparam);}if(o.url=='clientArray'){tmp=$.extend({},tmp,tmp2);if($t.p.autoencode){$.each(tmp,function(n,v){tmp[n]=$.jgrid.htmlDecode(v);});}var k,resp=$($t).jqGrid('setRowData',rowid,tmp);$(ind).attr('editable','0');for(k=0;k<$t.p.savedRow.length;k++){if($t.p.savedRow[k].id==oldRowId){fr=k;break;}}if(fr>=0){$t.p.savedRow.splice(fr,1);}$($t).triggerHandler('jqGridInlineAfterSaveRow',[rowid,resp,tmp,o]);if($.isFunction(o.aftersavefunc)){o.aftersavefunc.call($t,rowid,resp,o);}success=true;$(ind).unbind('keydown');}else{$('#lui_'+$.jgrid.jqID($t.p.id)).show();tmp3=$.extend({},tmp,tmp3);tmp3[idname]=$.jgrid.stripPref($t.p.idPrefix,tmp3[idname]);$.ajax($.extend({url:o.url,data:$.isFunction($t.p.serializeRowData)?$t.p.serializeRowData.call($t,tmp3):tmp3,type:o.mtype,async:false,//?!?\ncomplete:function complete(res,stat){$('#lui_'+$.jgrid.jqID($t.p.id)).hide();if(stat==='success'){var ret=true,sucret,k;sucret=$($t).triggerHandler('jqGridInlineSuccessSaveRow',[res,rowid,o]);if(!$.isArray(sucret)){sucret=[true,tmp];}if(sucret[0]&&$.isFunction(o.successfunc)){sucret=o.successfunc.call($t,res);}if($.isArray(sucret)){// expect array - status, data, rowid\nret=sucret[0];tmp=sucret[1]||tmp;}else{ret=sucret;}if(ret===true){if($t.p.autoencode){$.each(tmp,function(n,v){tmp[n]=$.jgrid.htmlDecode(v);});}tmp=$.extend({},tmp,tmp2);$($t).jqGrid('setRowData',rowid,tmp);$(ind).attr('editable','0');for(k=0;k<$t.p.savedRow.length;k++){if($t.p.savedRow[k].id==rowid){fr=k;break;}}if(fr>=0){$t.p.savedRow.splice(fr,1);}$($t).triggerHandler('jqGridInlineAfterSaveRow',[rowid,res,tmp,o]);if($.isFunction(o.aftersavefunc)){o.aftersavefunc.call($t,rowid,res);}success=true;$(ind).unbind('keydown');}else{$($t).triggerHandler('jqGridInlineErrorSaveRow',[rowid,res,stat,null,o]);if($.isFunction(o.errorfunc)){o.errorfunc.call($t,rowid,res,stat,null);}if(o.restoreAfterError===true){$($t).jqGrid('restoreRow',rowid,o.afterrestorefunc);}}}},error:function error(res,stat,err){$('#lui_'+$.jgrid.jqID($t.p.id)).hide();$($t).triggerHandler('jqGridInlineErrorSaveRow',[rowid,res,stat,err,o]);if($.isFunction(o.errorfunc)){o.errorfunc.call($t,rowid,res,stat,err);}else{var rT=res.responseText||res.statusText;try{$.jgrid.info_dialog($.jgrid.errors.errcap,'<div class=\"ui-state-error\">'+rT+'</div>',$.jgrid.edit.bClose,{buttonalign:'right'});}catch(e){alert(rT);}}if(o.restoreAfterError===true){$($t).jqGrid('restoreRow',rowid,o.afterrestorefunc);}}},$.jgrid.ajaxOptions,$t.p.ajaxRowOptions||{}));}}return success;},restoreRow:function restoreRow(rowid,afterrestorefunc){// Compatible mode old versions\nvar args=$.makeArray(arguments).slice(1),o={};if($.type(args[0])==='object'){o=args[0];}else{if($.isFunction(afterrestorefunc)){o.afterrestorefunc=afterrestorefunc;}}o=$.extend(true,$.jgrid.inlineEdit,o);// End compatible\nreturn this.each(function(){var $t=this,fr,ind,ares={},k;if(!$t.grid){return;}ind=$($t).jqGrid('getInd',rowid,true);if(ind===false){return;}for(k=0;k<$t.p.savedRow.length;k++){if($t.p.savedRow[k].id==rowid){fr=k;break;}}if(fr>=0){if($.isFunction($.fn.datepicker)){try{$('input.hasDatepicker','#'+$.jgrid.jqID(ind.id)).datepicker('hide');}catch(e){}}$.each($t.p.colModel,function(){if(this.editable===true&&$t.p.savedRow[fr].hasOwnProperty(this.name)){ares[this.name]=$t.p.savedRow[fr][this.name];}});$($t).jqGrid('setRowData',rowid,ares);$(ind).attr('editable','0').unbind('keydown');$t.p.savedRow.splice(fr,1);if($('#'+$.jgrid.jqID(rowid),'#'+$.jgrid.jqID($t.p.id)).hasClass('jqgrid-new-row')){setTimeout(function(){$($t).jqGrid('delRowData',rowid);},0);}}$($t).triggerHandler('jqGridInlineAfterRestoreRow',[rowid]);if($.isFunction(o.afterrestorefunc)){o.afterrestorefunc.call($t,rowid);}});},addRow:function addRow(p){p=$.extend(true,{rowID:null,initdata:{},position:'first',useDefValues:true,useFormatter:false,addRowParams:{extraparam:{}}},p||{});return this.each(function(){if(!this.grid){return;}var $t=this;p.rowID=$.isFunction(p.rowID)?p.rowID.call($t,p):p.rowID!=null?p.rowID:$.jgrid.randId();if(p.useDefValues===true){$($t.p.colModel).each(function(){if(this.editoptions&&this.editoptions.defaultValue){var opt=this.editoptions.defaultValue,tmp=$.isFunction(opt)?opt.call($t):opt;p.initdata[this.name]=tmp;}});}$($t).jqGrid('addRowData',p.rowID,p.initdata,p.position);p.rowID=$t.p.idPrefix+p.rowID;$('#'+$.jgrid.jqID(p.rowID),'#'+$.jgrid.jqID($t.p.id)).addClass('jqgrid-new-row');if(p.useFormatter){$('#'+$.jgrid.jqID(p.rowID)+' .ui-inline-edit','#'+$.jgrid.jqID($t.p.id)).click();}else{var opers=$t.p.prmNames,oper=opers.oper;p.addRowParams.extraparam[oper]=opers.addoper;$($t).jqGrid('editRow',p.rowID,p.addRowParams);$($t).jqGrid('setSelection',p.rowID);}});},inlineNav:function inlineNav(elem,o){o=$.extend({edit:true,editicon:'ui-icon-pencil',add:true,addicon:'ui-icon-plus',save:true,saveicon:'ui-icon-disk',cancel:true,cancelicon:'ui-icon-cancel',addParams:{},editParams:{},restoreAfterSelect:true},$.jgrid.nav,o||{});return this.each(function(){if(!this.grid){return;}var $t=this,onSelect,gID=$.jgrid.jqID($t.p.id);$t.p._inlinenav=true;// detect the formatactions column\nif(o.addParams.useFormatter===true){var cm=$t.p.colModel,i;for(i=0;i<cm.length;i++){if(cm[i].formatter&&cm[i].formatter==='actions'){if(cm[i].formatoptions){var defaults={keys:false,onEdit:null,onSuccess:null,afterSave:null,onError:null,afterRestore:null,extraparam:{},url:null},ap=$.extend(defaults,cm[i].formatoptions);o.addParams.addRowParams={'keys':ap.keys,'oneditfunc':ap.onEdit,'successfunc':ap.onSuccess,'url':ap.url,'extraparam':ap.extraparam,'aftersavefunc':ap.afterSavef,'errorfunc':ap.onError,'afterrestorefunc':ap.afterRestore};}break;}}}if(o.add){$($t).jqGrid('navButtonAdd',elem,{caption:o.addtext,title:o.addtitle,buttonicon:o.addicon,id:$t.p.id+'_iladd',onClickButton:function onClickButton(){$($t).jqGrid('addRow',o.addParams);if(!o.addParams.useFormatter){$('#'+gID+'_ilsave').removeClass('ui-state-disabled');$('#'+gID+'_ilcancel').removeClass('ui-state-disabled');$('#'+gID+'_iladd').addClass('ui-state-disabled');$('#'+gID+'_iledit').addClass('ui-state-disabled');}}});}if(o.edit){$($t).jqGrid('navButtonAdd',elem,{caption:o.edittext,title:o.edittitle,buttonicon:o.editicon,id:$t.p.id+'_iledit',onClickButton:function onClickButton(){var sr=$($t).jqGrid('getGridParam','selrow');if(sr){$($t).jqGrid('editRow',sr,o.editParams);$('#'+gID+'_ilsave').removeClass('ui-state-disabled');$('#'+gID+'_ilcancel').removeClass('ui-state-disabled');$('#'+gID+'_iladd').addClass('ui-state-disabled');$('#'+gID+'_iledit').addClass('ui-state-disabled');}else{$.jgrid.viewModal('#alertmod',{gbox:'#gbox_'+gID,jqm:true});$('#jqg_alrt').focus();}}});}if(o.save){$($t).jqGrid('navButtonAdd',elem,{caption:o.savetext||'',title:o.savetitle||'Save row',buttonicon:o.saveicon,id:$t.p.id+'_ilsave',onClickButton:function onClickButton(){var sr=$t.p.savedRow[0].id;if(sr){var opers=$t.p.prmNames,oper=opers.oper;if(!o.editParams.extraparam){o.editParams.extraparam={};}if($('#'+$.jgrid.jqID(sr),'#'+gID).hasClass('jqgrid-new-row')){o.editParams.extraparam[oper]=opers.addoper;}else{o.editParams.extraparam[oper]=opers.editoper;}if($($t).jqGrid('saveRow',sr,o.editParams)){$($t).jqGrid('showAddEditButtons');}}else{$.jgrid.viewModal('#alertmod',{gbox:'#gbox_'+gID,jqm:true});$('#jqg_alrt').focus();}}});$('#'+gID+'_ilsave').addClass('ui-state-disabled');}if(o.cancel){$($t).jqGrid('navButtonAdd',elem,{caption:o.canceltext||'',title:o.canceltitle||'Cancel row editing',buttonicon:o.cancelicon,id:$t.p.id+'_ilcancel',onClickButton:function onClickButton(){var sr=$t.p.savedRow[0].id;if(sr){$($t).jqGrid('restoreRow',sr,o.editParams);$($t).jqGrid('showAddEditButtons');}else{$.jgrid.viewModal('#alertmod',{gbox:'#gbox_'+gID,jqm:true});$('#jqg_alrt').focus();}}});$('#'+gID+'_ilcancel').addClass('ui-state-disabled');}if(o.restoreAfterSelect===true){if($.isFunction($t.p.beforeSelectRow)){onSelect=$t.p.beforeSelectRow;}else{onSelect=false;}$t.p.beforeSelectRow=function(id,stat){var ret=true;if($t.p.savedRow.length>0&&$t.p._inlinenav===true&&id!==$t.p.selrow&&$t.p.selrow!==null){if($t.p.selrow==o.addParams.rowID){$($t).jqGrid('delRowData',$t.p.selrow);}else{$($t).jqGrid('restoreRow',$t.p.selrow,o.editParams);}$($t).jqGrid('showAddEditButtons');}if(onSelect){ret=onSelect.call($t,id,stat);}return ret;};}});},showAddEditButtons:function showAddEditButtons(){return this.each(function(){if(!this.grid){return;}var gID=$.jgrid.jqID(this.p.id);$('#'+gID+'_ilsave').addClass('ui-state-disabled');$('#'+gID+'_ilcancel').addClass('ui-state-disabled');$('#'+gID+'_iladd').removeClass('ui-state-disabled');$('#'+gID+'_iledit').removeClass('ui-state-disabled');});}//end inline edit\n});})(jQuery);/*jshint eqeqeq:false */ /*global jQuery */(function($){/*\r\n**\r\n * jqGrid extension for cellediting Grid Data\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n**/ /**\r\n * all events and options here are aded anonynous and not in the base grid\r\n * since the array is to big. Here is the order of execution.\r\n * From this point we use jQuery isFunction\r\n * formatCell\r\n * beforeEditCell,\r\n * onSelectCell (used only for noneditable cels)\r\n * afterEditCell,\r\n * beforeSaveCell, (called before validation of values if any)\r\n * beforeSubmitCell (if cellsubmit remote (ajax))\r\n * afterSubmitCell(if cellsubmit remote (ajax)),\r\n * afterSaveCell,\r\n * errorCell,\r\n * serializeCellData - new\r\n * Options\r\n * cellsubmit (remote,clientArray) (added in grid options)\r\n * cellurl\r\n * ajaxCellOptions\r\n* */'use strict';$.jgrid.extend({editCell:function editCell(iRow,iCol,ed){return this.each(function(){var $t=this,nm,tmp,cc,cm;if(!$t.grid||$t.p.cellEdit!==true){return;}iCol=parseInt(iCol,10);// select the row that can be used for other methods\n$t.p.selrow=$t.rows[iRow].id;if(!$t.p.knv){$($t).jqGrid('GridNav');}// check to see if we have already edited cell\nif($t.p.savedRow.length>0){// prevent second click on that field and enable selects\nif(ed===true){if(iRow==$t.p.iRow&&iCol==$t.p.iCol){return;}}// save the cell\n$($t).jqGrid('saveCell',$t.p.savedRow[0].id,$t.p.savedRow[0].ic);}else{window.setTimeout(function(){$('#'+$.jgrid.jqID($t.p.knv)).attr('tabindex','-1').focus();},0);}cm=$t.p.colModel[iCol];nm=cm.name;if(nm=='subgrid'||nm=='cb'||nm=='rn'){return;}cc=$('td:eq('+iCol+')',$t.rows[iRow]);if(cm.editable===true&&ed===true&&!cc.hasClass('not-editable-cell')){if(parseInt($t.p.iCol,10)>=0&&parseInt($t.p.iRow,10)>=0){$('td:eq('+$t.p.iCol+')',$t.rows[$t.p.iRow]).removeClass('edit-cell ui-state-highlight');$($t.rows[$t.p.iRow]).removeClass('selected-row ui-state-hover');}$(cc).addClass('edit-cell ui-state-highlight');$($t.rows[iRow]).addClass('selected-row ui-state-hover');try{tmp=$.unformat.call($t,cc,{rowId:$t.rows[iRow].id,colModel:cm},iCol);}catch(_){tmp=cm.edittype&&cm.edittype=='textarea'?$(cc).text():$(cc).html();}if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}if(!cm.edittype){cm.edittype='text';}$t.p.savedRow.push({id:iRow,ic:iCol,name:nm,v:tmp});if(tmp==='&nbsp;'||tmp==='&#160;'||tmp.length===1&&tmp.charCodeAt(0)===160){tmp='';}if($.isFunction($t.p.formatCell)){var tmp2=$t.p.formatCell.call($t,$t.rows[iRow].id,nm,tmp,iRow,iCol);if(tmp2!==undefined){tmp=tmp2;}}var opt=$.extend({},cm.editoptions||{},{id:iRow+'_'+nm,name:nm});var elc=$.jgrid.createEl.call($t,cm.edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions||{}));$($t).triggerHandler('jqGridBeforeEditCell',[$t.rows[iRow].id,nm,tmp,iRow,iCol]);if($.isFunction($t.p.beforeEditCell)){$t.p.beforeEditCell.call($t,$t.rows[iRow].id,nm,tmp,iRow,iCol);}$(cc).html('').append(elc).attr('tabindex','0');$.jgrid.bindEv(elc,opt,$t);window.setTimeout(function(){$(elc).focus();},0);$('input, select, textarea',cc).bind('keydown',function(e){if(e.keyCode===27){if($('input.hasDatepicker',cc).length>0){if($('.ui-datepicker').is(':hidden')){$($t).jqGrid('restoreCell',iRow,iCol);}else{$('input.hasDatepicker',cc).datepicker('hide');}}else{$($t).jqGrid('restoreCell',iRow,iCol);}}//ESC\nif(e.keyCode===13){$($t).jqGrid('saveCell',iRow,iCol);// Prevent default action\nreturn false;}//Enter\nif(e.keyCode===9){if(!$t.grid.hDiv.loading){if(e.shiftKey){$($t).jqGrid('prevCell',iRow,iCol);}//Shift TAb\nelse{$($t).jqGrid('nextCell',iRow,iCol);}//Tab\n}else{return false;}}e.stopPropagation();});$($t).triggerHandler('jqGridAfterEditCell',[$t.rows[iRow].id,nm,tmp,iRow,iCol]);if($.isFunction($t.p.afterEditCell)){$t.p.afterEditCell.call($t,$t.rows[iRow].id,nm,tmp,iRow,iCol);}}else{if(parseInt($t.p.iCol,10)>=0&&parseInt($t.p.iRow,10)>=0){$('td:eq('+$t.p.iCol+')',$t.rows[$t.p.iRow]).removeClass('edit-cell ui-state-highlight');$($t.rows[$t.p.iRow]).removeClass('selected-row ui-state-hover');}cc.addClass('edit-cell ui-state-highlight');$($t.rows[iRow]).addClass('selected-row ui-state-hover');tmp=cc.html().replace(/\\&#160\\;/ig,'');$($t).triggerHandler('jqGridSelectCell',[$t.rows[iRow].id,nm,tmp,iRow,iCol]);if($.isFunction($t.p.onSelectCell)){$t.p.onSelectCell.call($t,$t.rows[iRow].id,nm,tmp,iRow,iCol);}}$t.p.iCol=iCol;$t.p.iRow=iRow;});},saveCell:function saveCell(iRow,iCol){return this.each(function(){var $t=this,fr;if(!$t.grid||$t.p.cellEdit!==true){return;}if($t.p.savedRow.length>=1){fr=0;}else{fr=null;}if(fr!==null){var cc=$('td:eq('+iCol+')',$t.rows[iRow]),v,v2,cm=$t.p.colModel[iCol],nm=cm.name,nmjq=$.jgrid.jqID(nm);switch(cm.edittype){case'select':if(!cm.editoptions.multiple){v=$('#'+iRow+'_'+nmjq+' option:selected',$t.rows[iRow]).val();v2=$('#'+iRow+'_'+nmjq+' option:selected',$t.rows[iRow]).text();}else{var sel=$('#'+iRow+'_'+nmjq,$t.rows[iRow]),selectedText=[];v=$(sel).val();if(v){v.join(',');}else{v='';}$('option:selected',sel).each(function(i,selected){selectedText[i]=$(selected).text();});v2=selectedText.join(',');}if(cm.formatter){v2=v;}break;case'checkbox':var cbv=['Yes','No'];if(cm.editoptions){cbv=cm.editoptions.value.split(':');}v=$('#'+iRow+'_'+nmjq,$t.rows[iRow]).is(':checked')?cbv[0]:cbv[1];v2=v;break;case'password':case'text':case'textarea':case'button':v=$('#'+iRow+'_'+nmjq,$t.rows[iRow]).val();v2=v;break;case'custom':try{if(cm.editoptions&&$.isFunction(cm.editoptions.custom_value)){v=cm.editoptions.custom_value.call($t,$('.customelement',cc),'get');if(v===undefined){throw'e2';}else{v2=v;}}else{throw'e1';}}catch(e){if(e=='e1'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_value\\' '+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose);}if(e=='e2'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_value\\' '+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose);}}break;}// The common approach is if nothing changed do not do anything\nif(v2!==$t.p.savedRow[fr].v){var vvv=$($t).triggerHandler('jqGridBeforeSaveCell',[$t.rows[iRow].id,nm,v,iRow,iCol]);if(vvv){v=vvv;v2=vvv;}if($.isFunction($t.p.beforeSaveCell)){var vv=$t.p.beforeSaveCell.call($t,$t.rows[iRow].id,nm,v,iRow,iCol);if(vv){v=vv;v2=vv;}}var cv=$.jgrid.checkValues(v,iCol,$t);if(cv[0]===true){var addpost=$($t).triggerHandler('jqGridBeforeSubmitCell',[$t.rows[iRow].id,nm,v,iRow,iCol])||{};if($.isFunction($t.p.beforeSubmitCell)){addpost=$t.p.beforeSubmitCell.call($t,$t.rows[iRow].id,nm,v,iRow,iCol);if(!addpost){addpost={};}}if($('input.hasDatepicker',cc).length>0){$('input.hasDatepicker',cc).datepicker('hide');}if($t.p.cellsubmit=='remote'){if($t.p.cellurl){var postdata={};if($t.p.autoencode){v=$.jgrid.htmlEncode(v);}postdata[nm]=v;var idname,oper,opers;opers=$t.p.prmNames;idname=opers.id;oper=opers.oper;postdata[idname]=$.jgrid.stripPref($t.p.idPrefix,$t.rows[iRow].id);postdata[oper]=opers.editoper;postdata=$.extend(addpost,postdata);$('#lui_'+$.jgrid.jqID($t.p.id)).show();$t.grid.hDiv.loading=true;$.ajax($.extend({url:$t.p.cellurl,data:$.isFunction($t.p.serializeCellData)?$t.p.serializeCellData.call($t,postdata):postdata,type:'POST',complete:function complete(result,stat){$('#lui_'+$t.p.id).hide();$t.grid.hDiv.loading=false;if(stat=='success'){var ret=$($t).triggerHandler('jqGridAfterSubmitCell',[$t,result,postdata.id,nm,v,iRow,iCol])||[true,''];if(ret[0]===true&&$.isFunction($t.p.afterSubmitCell)){ret=$t.p.afterSubmitCell.call($t,result,postdata.id,nm,v,iRow,iCol);}if(ret[0]===true){$(cc).empty();$($t).jqGrid('setCell',$t.rows[iRow].id,iCol,v2,false,false,true);$(cc).addClass('dirty-cell');$($t.rows[iRow]).addClass('edited');$($t).triggerHandler('jqGridAfterSaveCell',[$t.rows[iRow].id,nm,v,iRow,iCol]);if($.isFunction($t.p.afterSaveCell)){$t.p.afterSaveCell.call($t,$t.rows[iRow].id,nm,v,iRow,iCol);}$t.p.savedRow.splice(0,1);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,ret[1],$.jgrid.edit.bClose);$($t).jqGrid('restoreCell',iRow,iCol);}}},error:function error(res,stat,err){$('#lui_'+$.jgrid.jqID($t.p.id)).hide();$t.grid.hDiv.loading=false;$($t).triggerHandler('jqGridErrorCell',[res,stat,err]);if($.isFunction($t.p.errorCell)){$t.p.errorCell.call($t,res,stat,err);$($t).jqGrid('restoreCell',iRow,iCol);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,res.status+' : '+res.statusText+'<br/>'+stat,$.jgrid.edit.bClose);$($t).jqGrid('restoreCell',iRow,iCol);}}},$.jgrid.ajaxOptions,$t.p.ajaxCellOptions||{}));}else{try{$.jgrid.info_dialog($.jgrid.errors.errcap,$.jgrid.errors.nourl,$.jgrid.edit.bClose);$($t).jqGrid('restoreCell',iRow,iCol);}catch(e){}}}if($t.p.cellsubmit=='clientArray'){$(cc).empty();$($t).jqGrid('setCell',$t.rows[iRow].id,iCol,v2,false,false,true);$(cc).addClass('dirty-cell');$($t.rows[iRow]).addClass('edited');$($t).triggerHandler('jqGridAfterSaveCell',[$t.rows[iRow].id,nm,v,iRow,iCol]);if($.isFunction($t.p.afterSaveCell)){$t.p.afterSaveCell.call($t,$t.rows[iRow].id,nm,v,iRow,iCol);}$t.p.savedRow.splice(0,1);}}else{try{window.setTimeout(function(){$.jgrid.info_dialog($.jgrid.errors.errcap,v+' '+cv[1],$.jgrid.edit.bClose);},100);$($t).jqGrid('restoreCell',iRow,iCol);}catch(e){}}}else{$($t).jqGrid('restoreCell',iRow,iCol);}}window.setTimeout(function(){$('#'+$.jgrid.jqID($t.p.knv)).attr('tabindex','-1').focus();},0);});},restoreCell:function restoreCell(iRow,iCol){return this.each(function(){var $t=this,fr;if(!$t.grid||$t.p.cellEdit!==true){return;}if($t.p.savedRow.length>=1){fr=0;}else{fr=null;}if(fr!==null){var cc=$('td:eq('+iCol+')',$t.rows[iRow]);// datepicker fix\nif($.isFunction($.fn.datepicker)){try{$('input.hasDatepicker',cc).datepicker('hide');}catch(e){}}$(cc).empty().attr('tabindex','-1');$($t).jqGrid('setCell',$t.rows[iRow].id,iCol,$t.p.savedRow[fr].v,false,false,true);$($t).triggerHandler('jqGridAfterRestoreCell',[$t.rows[iRow].id,$t.p.savedRow[fr].v,iRow,iCol]);if($.isFunction($t.p.afterRestoreCell)){$t.p.afterRestoreCell.call($t,$t.rows[iRow].id,$t.p.savedRow[fr].v,iRow,iCol);}$t.p.savedRow.splice(0,1);}window.setTimeout(function(){$('#'+$t.p.knv).attr('tabindex','-1').focus();},0);});},nextCell:function nextCell(iRow,iCol){return this.each(function(){var $t=this,nCol=false,i;if(!$t.grid||$t.p.cellEdit!==true){return;}// try to find next editable cell\nfor(i=iCol+1;i<$t.p.colModel.length;i++){if($t.p.colModel[i].editable===true){nCol=i;break;}}if(nCol!==false){$($t).jqGrid('editCell',iRow,nCol,true);}else{if($t.p.savedRow.length>0){$($t).jqGrid('saveCell',iRow,iCol);}}});},prevCell:function prevCell(iRow,iCol){return this.each(function(){var $t=this,nCol=false,i;if(!$t.grid||$t.p.cellEdit!==true){return;}// try to find next editable cell\nfor(i=iCol-1;i>=0;i--){if($t.p.colModel[i].editable===true){nCol=i;break;}}if(nCol!==false){$($t).jqGrid('editCell',iRow,nCol,true);}else{if($t.p.savedRow.length>0){$($t).jqGrid('saveCell',iRow,iCol);}}});},GridNav:function GridNav(){return this.each(function(){var $t=this;if(!$t.grid||$t.p.cellEdit!==true){return;}// trick to process keydown on non input elements\n$t.p.knv=$t.p.id+'_kn';var selection=$('<div style=\\'position:fixed;top:-1000000px;width:1px;height:1px;\\' tabindex=\\'0\\'><div tabindex=\\'-1\\' style=\\'width:1px;height:1px;\\' id=\\''+$t.p.knv+'\\'></div></div>'),i,kdir;function scrollGrid(iR,iC,tp){if(tp.substr(0,1)=='v'){var ch=$($t.grid.bDiv)[0].clientHeight,st=$($t.grid.bDiv)[0].scrollTop,nROT=$t.rows[iR].offsetTop+$t.rows[iR].clientHeight,pROT=$t.rows[iR].offsetTop;if(tp=='vd'){if(nROT>=ch){$($t.grid.bDiv)[0].scrollTop=$($t.grid.bDiv)[0].scrollTop+$t.rows[iR].clientHeight;}}if(tp=='vu'){if(pROT<st){$($t.grid.bDiv)[0].scrollTop=$($t.grid.bDiv)[0].scrollTop-$t.rows[iR].clientHeight;}}}if(tp=='h'){var cw=$($t.grid.bDiv)[0].clientWidth,sl=$($t.grid.bDiv)[0].scrollLeft,nCOL=$t.rows[iR].cells[iC].offsetLeft+$t.rows[iR].cells[iC].clientWidth,pCOL=$t.rows[iR].cells[iC].offsetLeft;if(nCOL>=cw+parseInt(sl,10)){$($t.grid.bDiv)[0].scrollLeft=$($t.grid.bDiv)[0].scrollLeft+$t.rows[iR].cells[iC].clientWidth;}else if(pCOL<sl){$($t.grid.bDiv)[0].scrollLeft=$($t.grid.bDiv)[0].scrollLeft-$t.rows[iR].cells[iC].clientWidth;}}}function findNextVisible(iC,act){var ind,i;if(act=='lft'){ind=iC+1;for(i=iC;i>=0;i--){if($t.p.colModel[i].hidden!==true){ind=i;break;}}}if(act=='rgt'){ind=iC-1;for(i=iC;i<$t.p.colModel.length;i++){if($t.p.colModel[i].hidden!==true){ind=i;break;}}}return ind;}$(selection).insertBefore($t.grid.cDiv);$('#'+$t.p.knv).focus().keydown(function(e){kdir=e.keyCode;if($t.p.direction=='rtl'){if(kdir===37){kdir=39;}else if(kdir===39){kdir=37;}}switch(kdir){case 38:if($t.p.iRow-1>0){scrollGrid($t.p.iRow-1,$t.p.iCol,'vu');$($t).jqGrid('editCell',$t.p.iRow-1,$t.p.iCol,false);}break;case 40:if($t.p.iRow+1<=$t.rows.length-1){scrollGrid($t.p.iRow+1,$t.p.iCol,'vd');$($t).jqGrid('editCell',$t.p.iRow+1,$t.p.iCol,false);}break;case 37:if($t.p.iCol-1>=0){i=findNextVisible($t.p.iCol-1,'lft');scrollGrid($t.p.iRow,i,'h');$($t).jqGrid('editCell',$t.p.iRow,i,false);}break;case 39:if($t.p.iCol+1<=$t.p.colModel.length-1){i=findNextVisible($t.p.iCol+1,'rgt');scrollGrid($t.p.iRow,i,'h');$($t).jqGrid('editCell',$t.p.iRow,i,false);}break;case 13:if(parseInt($t.p.iCol,10)>=0&&parseInt($t.p.iRow,10)>=0){$($t).jqGrid('editCell',$t.p.iRow,$t.p.iCol,true);}break;default:return true;}return false;});});},getChangedCells:function getChangedCells(mthd){var ret=[];if(!mthd){mthd='all';}this.each(function(){var $t=this,nm;if(!$t.grid||$t.p.cellEdit!==true){return;}$($t.rows).each(function(j){var res={};if($(this).hasClass('edited')){$('td',this).each(function(i){nm=$t.p.colModel[i].name;if(nm!=='cb'&&nm!=='subgrid'){if(mthd=='dirty'){if($(this).hasClass('dirty-cell')){try{res[nm]=$.unformat.call($t,this,{rowId:$t.rows[j].id,colModel:$t.p.colModel[i]},i);}catch(e){res[nm]=$.jgrid.htmlDecode($(this).html());}}}else{try{res[nm]=$.unformat.call($t,this,{rowId:$t.rows[j].id,colModel:$t.p.colModel[i]},i);}catch(e){res[nm]=$.jgrid.htmlDecode($(this).html());}}}});res.id=this.id;ret.push(res);}});});return ret;}/// end  cell editing\n});})(jQuery);/*jshint eqeqeq:false */ /*global jQuery */(function($){/**\r\n * jqGrid extension for SubGrid Data\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n**/'use strict';$.jgrid.extend({setSubGrid:function setSubGrid(){return this.each(function(){var $t=this,cm,i,suboptions={plusicon:'ui-icon-plus',minusicon:'ui-icon-minus',openicon:'ui-icon-carat-1-sw',expandOnLoad:false,delayOnLoad:50,selectOnExpand:false,reloadOnExpand:true};$t.p.subGridOptions=$.extend(suboptions,$t.p.subGridOptions||{});$t.p.colNames.unshift('');$t.p.colModel.unshift({name:'subgrid',width:$.jgrid.cell_width?$t.p.subGridWidth+$t.p.cellLayout:$t.p.subGridWidth,sortable:false,resizable:false,hidedlg:true,search:false,fixed:true});cm=$t.p.subGridModel;if(cm[0]){cm[0].align=$.extend([],cm[0].align||[]);for(i=0;i<cm[0].name.length;i++){cm[0].align[i]=cm[0].align[i]||'left';}}});},addSubGridCell:function addSubGridCell(pos,iRow){var prp='',ic,sid;this.each(function(){prp=this.formatCol(pos,iRow);sid=this.p.id;ic=this.p.subGridOptions.plusicon;});return'<td role=\"gridcell\" aria-describedby=\"'+sid+'_subgrid\" class=\"ui-sgcollapsed sgcollapsed\" '+prp+'><a href=\\'javascript:void(0);\\'><span class=\\'ui-icon '+ic+'\\'></span></a></td>';},addSubGrid:function addSubGrid(pos,sind){return this.each(function(){var ts=this;if(!ts.grid){return;}//-------------------------\nvar subGridCell=function subGridCell(trdiv,cell,pos){var tddiv=$('<td align=\\''+ts.p.subGridModel[0].align[pos]+'\\'></td>').html(cell);$(trdiv).append(tddiv);};var subGridXml=function subGridXml(sjxml,sbid){var tddiv,i,sgmap,dummy=$('<table cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\'><tbody></tbody></table>'),trdiv=$('<tr></tr>');for(i=0;i<ts.p.subGridModel[0].name.length;i++){tddiv=$('<th class=\\'ui-state-default ui-th-subgrid ui-th-column ui-th-'+ts.p.direction+'\\'></th>');$(tddiv).html(ts.p.subGridModel[0].name[i]);$(tddiv).width(ts.p.subGridModel[0].width[i]);$(trdiv).append(tddiv);}$(dummy).append(trdiv);if(sjxml){sgmap=ts.p.xmlReader.subgrid;$(sgmap.root+' '+sgmap.row,sjxml).each(function(){trdiv=$('<tr class=\\'ui-widget-content ui-subtblcell\\'></tr>');if(sgmap.repeatitems===true){$(sgmap.cell,this).each(function(i){subGridCell(trdiv,$(this).text()||'&#160;',i);});}else{var f=ts.p.subGridModel[0].mapping||ts.p.subGridModel[0].name;if(f){for(i=0;i<f.length;i++){subGridCell(trdiv,$(f[i],this).text()||'&#160;',i);}}}$(dummy).append(trdiv);});}var pID=$('table:first',ts.grid.bDiv).attr('id')+'_';$('#'+$.jgrid.jqID(pID+sbid)).append(dummy);ts.grid.hDiv.loading=false;$('#load_'+$.jgrid.jqID(ts.p.id)).hide();return false;};var subGridJson=function subGridJson(sjxml,sbid){var tddiv,result,i,cur,sgmap,j,dummy=$('<table cellspacing=\\'0\\' cellpadding=\\'0\\' border=\\'0\\'><tbody></tbody></table>'),trdiv=$('<tr></tr>');for(i=0;i<ts.p.subGridModel[0].name.length;i++){tddiv=$('<th class=\\'ui-state-default ui-th-subgrid ui-th-column ui-th-'+ts.p.direction+'\\'></th>');$(tddiv).html(ts.p.subGridModel[0].name[i]);$(tddiv).width(ts.p.subGridModel[0].width[i]);$(trdiv).append(tddiv);}$(dummy).append(trdiv);if(sjxml){sgmap=ts.p.jsonReader.subgrid;result=$.jgrid.getAccessor(sjxml,sgmap.root);if(result!==undefined){for(i=0;i<result.length;i++){cur=result[i];trdiv=$('<tr class=\\'ui-widget-content ui-subtblcell\\'></tr>');if(sgmap.repeatitems===true){if(sgmap.cell){cur=cur[sgmap.cell];}for(j=0;j<cur.length;j++){subGridCell(trdiv,cur[j]||'&#160;',j);}}else{var f=ts.p.subGridModel[0].mapping||ts.p.subGridModel[0].name;if(f.length){for(j=0;j<f.length;j++){subGridCell(trdiv,cur[f[j]]||'&#160;',j);}}}$(dummy).append(trdiv);}}}var pID=$('table:first',ts.grid.bDiv).attr('id')+'_';$('#'+$.jgrid.jqID(pID+sbid)).append(dummy);ts.grid.hDiv.loading=false;$('#load_'+$.jgrid.jqID(ts.p.id)).hide();return false;};var populatesubgrid=function populatesubgrid(rd){var sid,dp,i,j;sid=$(rd).attr('id');dp={nd_:new Date().getTime()};dp[ts.p.prmNames.subgridid]=sid;if(!ts.p.subGridModel[0]){return false;}if(ts.p.subGridModel[0].params){for(j=0;j<ts.p.subGridModel[0].params.length;j++){for(i=0;i<ts.p.colModel.length;i++){if(ts.p.colModel[i].name===ts.p.subGridModel[0].params[j]){dp[ts.p.colModel[i].name]=$('td:eq('+i+')',rd).text().replace(/\\&#160\\;/ig,'');}}}}if(!ts.grid.hDiv.loading){ts.grid.hDiv.loading=true;$('#load_'+$.jgrid.jqID(ts.p.id)).show();if(!ts.p.subgridtype){ts.p.subgridtype=ts.p.datatype;}if($.isFunction(ts.p.subgridtype)){ts.p.subgridtype.call(ts,dp);}else{ts.p.subgridtype=ts.p.subgridtype.toLowerCase();}switch(ts.p.subgridtype){case'xml':case'json':$.ajax($.extend({type:ts.p.mtype,url:ts.p.subGridUrl,dataType:ts.p.subgridtype,data:$.isFunction(ts.p.serializeSubGridData)?ts.p.serializeSubGridData.call(ts,dp):dp,complete:function complete(sxml){if(ts.p.subgridtype==='xml'){subGridXml(sxml.responseXML,sid);}else{subGridJson($.jgrid.parse(sxml.responseText),sid);}sxml=null;}},$.jgrid.ajaxOptions,ts.p.ajaxSubgridOptions||{}));break;}}return false;};var _id,pID,atd,nhc=0,bfsc,r;$.each(ts.p.colModel,function(){if(this.hidden===true||this.name==='rn'||this.name==='cb'){nhc++;}});var len=ts.rows.length,i=1;if(sind!==undefined&&sind>0){i=sind;len=sind+1;}while(i<len){if($(ts.rows[i]).hasClass('jqgrow')){$(ts.rows[i].cells[pos]).bind('click',function(){var tr=$(this).parent('tr')[0];r=tr.nextSibling;if($(this).hasClass('sgcollapsed')){pID=ts.p.id;_id=tr.id;if(ts.p.subGridOptions.reloadOnExpand===true||ts.p.subGridOptions.reloadOnExpand===false&&!$(r).hasClass('ui-subgrid')){atd=pos>=1?'<td colspan=\\''+pos+'\\'>&#160;</td>':'';bfsc=$(ts).triggerHandler('jqGridSubGridBeforeExpand',[pID+'_'+_id,_id]);bfsc=bfsc===false||bfsc==='stop'?false:true;if(bfsc&&$.isFunction(ts.p.subGridBeforeExpand)){bfsc=ts.p.subGridBeforeExpand.call(ts,pID+'_'+_id,_id);}if(bfsc===false){return false;}$(tr).after('<tr role=\\'row\\' class=\\'ui-subgrid\\'>'+atd+'<td class=\\'ui-widget-content subgrid-cell\\'><span class=\\'ui-icon '+ts.p.subGridOptions.openicon+'\\'></span></td><td colspan=\\''+parseInt(ts.p.colNames.length-1-nhc,10)+'\\' class=\\'ui-widget-content subgrid-data\\'><div id='+pID+'_'+_id+' class=\\'tablediv\\'></div></td></tr>');$(ts).triggerHandler('jqGridSubGridRowExpanded',[pID+'_'+_id,_id]);if($.isFunction(ts.p.subGridRowExpanded)){ts.p.subGridRowExpanded.call(ts,pID+'_'+_id,_id);}else{populatesubgrid(tr);}}else{$(r).show();}$(this).html('<a href=\\'javascript:void(0);\\'><span class=\\'ui-icon '+ts.p.subGridOptions.minusicon+'\\'></span></a>').removeClass('sgcollapsed').addClass('sgexpanded');if(ts.p.subGridOptions.selectOnExpand){$(ts).jqGrid('setSelection',_id);}}else if($(this).hasClass('sgexpanded')){bfsc=$(ts).triggerHandler('jqGridSubGridRowColapsed',[pID+'_'+_id,_id]);bfsc=bfsc===false||bfsc==='stop'?false:true;if(bfsc&&$.isFunction(ts.p.subGridRowColapsed)){_id=tr.id;bfsc=ts.p.subGridRowColapsed.call(ts,pID+'_'+_id,_id);}if(bfsc===false){return false;}if(ts.p.subGridOptions.reloadOnExpand===true){$(r).remove('.ui-subgrid');}else if($(r).hasClass('ui-subgrid')){// incase of dynamic deleting\n$(r).hide();}$(this).html('<a href=\\'javascript:void(0);\\'><span class=\\'ui-icon '+ts.p.subGridOptions.plusicon+'\\'></span></a>').removeClass('sgexpanded').addClass('sgcollapsed');}return false;});}i++;}if(ts.p.subGridOptions.expandOnLoad===true){$(ts.rows).filter('.jqgrow').each(function(index,row){$(row.cells[0]).click();});}ts.subGridXml=function(xml,sid){subGridXml(xml,sid);};ts.subGridJson=function(json,sid){subGridJson(json,sid);};});},expandSubGridRow:function expandSubGridRow(rowid){return this.each(function(){var $t=this;if(!$t.grid&&!rowid){return;}if($t.p.subGrid===true){var rc=$(this).jqGrid('getInd',rowid,true);if(rc){var sgc=$('td.sgcollapsed',rc)[0];if(sgc){$(sgc).trigger('click');}}}});},collapseSubGridRow:function collapseSubGridRow(rowid){return this.each(function(){var $t=this;if(!$t.grid&&!rowid){return;}if($t.p.subGrid===true){var rc=$(this).jqGrid('getInd',rowid,true);if(rc){var sgc=$('td.sgexpanded',rc)[0];if(sgc){$(sgc).trigger('click');}}}});},toggleSubGridRow:function toggleSubGridRow(rowid){return this.each(function(){var $t=this;if(!$t.grid&&!rowid){return;}if($t.p.subGrid===true){var rc=$(this).jqGrid('getInd',rowid,true);if(rc){var sgc=$('td.sgcollapsed',rc)[0];if(sgc){$(sgc).trigger('click');}else{sgc=$('td.sgexpanded',rc)[0];if(sgc){$(sgc).trigger('click');}}}}});}});})(jQuery);/**\r\n * jqGrid extension - Tree Grid\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl.html\r\n**/ /*jshint eqeqeq:false */ /*global jQuery */(function($){'use strict';$.jgrid.extend({setTreeNode:function setTreeNode(i,len){return this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}var expCol=$t.p.expColInd,expanded=$t.p.treeReader.expanded_field,isLeaf=$t.p.treeReader.leaf_field,level=$t.p.treeReader.level_field,icon=$t.p.treeReader.icon_field,loaded=$t.p.treeReader.loaded,lft,rgt,curLevel,ident,lftpos,twrap,ldat,lf;while(i<len){var ind=$t.rows[i].id,dind=$t.p._index[ind],expan;ldat=$t.p.data[dind];//$t.rows[i].level = ldat[level];\nif($t.p.treeGridModel=='nested'){if(!ldat[isLeaf]){lft=parseInt(ldat[$t.p.treeReader.left_field],10);rgt=parseInt(ldat[$t.p.treeReader.right_field],10);// NS Model\nldat[isLeaf]=rgt===lft+1?'true':'false';$t.rows[i].cells[$t.p._treeleafpos].innerHTML=ldat[isLeaf];}}//else {\n//row.parent_id = rd[$t.p.treeReader.parent_id_field];\n//}\nif(ldat===undefined){i++,len++;continue;}curLevel=parseInt(ldat[level],10);if($t.p.tree_root_level===0){ident=curLevel+1;lftpos=curLevel;}else{ident=curLevel;lftpos=curLevel-1;}twrap='<div class=\\'tree-wrap tree-wrap-'+$t.p.direction+'\\' style=\\'width:'+ident*18+'px;\\'>';twrap+='<div style=\\''+($t.p.direction=='rtl'?'right:':'left:')+lftpos*18+'px;\\' class=\\'ui-icon ';if(ldat[loaded]!==undefined){if(ldat[loaded]=='true'||ldat[loaded]===true){ldat[loaded]=true;}else{ldat[loaded]=false;}}if(ldat[isLeaf]=='true'||ldat[isLeaf]===true){twrap+=(ldat[icon]!==undefined&&ldat[icon]!==''?ldat[icon]:$t.p.treeIcons.leaf)+' tree-leaf treeclick';ldat[isLeaf]=true;lf='leaf';}else{ldat[isLeaf]=false;lf='';}ldat[expanded]=(ldat[expanded]=='true'||ldat[expanded]===true?true:false)&&(ldat[loaded]||ldat[loaded]===undefined);if(ldat[expanded]===false){twrap+=ldat[isLeaf]===true?'\\'':$t.p.treeIcons.plus+' tree-plus treeclick\\'';}else{twrap+=ldat[isLeaf]===true?'\\'':$t.p.treeIcons.minus+' tree-minus treeclick\\'';}twrap+='></div></div>';$($t.rows[i].cells[expCol]).wrapInner('<span class=\\'cell-wrapper'+lf+'\\'></span>').prepend(twrap);if(curLevel!==parseInt($t.p.tree_root_level,10)){var pn=$($t).jqGrid('getNodeParent',ldat);expan=pn&&pn.hasOwnProperty(expanded)?pn[expanded]:true;if(!expan){$($t.rows[i]).css('display','none');}}$($t.rows[i].cells[expCol]).find('div.treeclick').bind('click',function(e){var target=e.target||e.srcElement,ind2=$(target,$t.rows).closest('tr.jqgrow')[0].id,pos=$t.p._index[ind2];if(!$t.p.data[pos][isLeaf]){if($t.p.data[pos][expanded]){$($t).jqGrid('collapseRow',$t.p.data[pos]);$($t).jqGrid('collapseNode',$t.p.data[pos]);}else{$($t).jqGrid('expandRow',$t.p.data[pos]);$($t).jqGrid('expandNode',$t.p.data[pos]);}}return false;});if($t.p.ExpandColClick===true){$($t.rows[i].cells[expCol]).find('span.cell-wrapper').css('cursor','pointer').bind('click',function(e){var target=e.target||e.srcElement,ind2=$(target,$t.rows).closest('tr.jqgrow')[0].id,pos=$t.p._index[ind2];if(!$t.p.data[pos][isLeaf]){if($t.p.data[pos][expanded]){$($t).jqGrid('collapseRow',$t.p.data[pos]);$($t).jqGrid('collapseNode',$t.p.data[pos]);}else{$($t).jqGrid('expandRow',$t.p.data[pos]);$($t).jqGrid('expandNode',$t.p.data[pos]);}}$($t).jqGrid('setSelection',ind2);return false;});}i++;}});},setTreeGrid:function setTreeGrid(){return this.each(function(){var $t=this,i=0,pico,ecol=false,nm,key,tkey,dupcols=[];if(!$t.p.treeGrid){return;}if(!$t.p.treedatatype){$.extend($t.p,{treedatatype:$t.p.datatype});}$t.p.subGrid=false;$t.p.altRows=false;$t.p.pgbuttons=false;$t.p.pginput=false;$t.p.gridview=true;if($t.p.rowTotal===null){$t.p.rowNum=10000;}$t.p.multiselect=false;$t.p.rowList=[];$t.p.expColInd=0;pico='ui-icon-triangle-1-'+($t.p.direction=='rtl'?'w':'e');$t.p.treeIcons=$.extend({plus:pico,minus:'ui-icon-triangle-1-s',leaf:'ui-icon-radio-off'},$t.p.treeIcons||{});if($t.p.treeGridModel=='nested'){$t.p.treeReader=$.extend({level_field:'level',left_field:'lft',right_field:'rgt',leaf_field:'isLeaf',expanded_field:'expanded',loaded:'loaded',icon_field:'icon'},$t.p.treeReader);}else if($t.p.treeGridModel=='adjacency'){$t.p.treeReader=$.extend({level_field:'level',parent_id_field:'parent',leaf_field:'isLeaf',expanded_field:'expanded',loaded:'loaded',icon_field:'icon'},$t.p.treeReader);}for(key in $t.p.colModel){if($t.p.colModel.hasOwnProperty(key)){nm=$t.p.colModel[key].name;if(nm==$t.p.ExpandColumn&&!ecol){ecol=true;$t.p.expColInd=i;}i++;//\nfor(tkey in $t.p.treeReader){if($t.p.treeReader.hasOwnProperty(tkey)&&$t.p.treeReader[tkey]==nm){dupcols.push(nm);}}}}$.each($t.p.treeReader,function(j,n){if(n&&$.inArray(n,dupcols)===-1){if(j==='leaf_field'){$t.p._treeleafpos=i;}i++;$t.p.colNames.push(n);$t.p.colModel.push({name:n,width:1,hidden:true,sortable:false,resizable:false,hidedlg:true,editable:true,search:false});}});});},expandRow:function expandRow(record){this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}var childern=$($t).jqGrid('getNodeChildren',record),//if ($($t).jqGrid(\"isVisibleNode\",record)) {\nexpanded=$t.p.treeReader.expanded_field,rows=$t.rows;$(childern).each(function(){var id=$.jgrid.getAccessor(this,$t.p.localReader.id);$(rows.namedItem(id)).css('display','');if(this[expanded]){$($t).jqGrid('expandRow',this);}});//}\n});},collapseRow:function collapseRow(record){this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}var childern=$($t).jqGrid('getNodeChildren',record),expanded=$t.p.treeReader.expanded_field,rows=$t.rows;$(childern).each(function(){var id=$.jgrid.getAccessor(this,$t.p.localReader.id);$(rows.namedItem(id)).css('display','none');if(this[expanded]){$($t).jqGrid('collapseRow',this);}});});},// NS ,adjacency models\ngetRootNodes:function getRootNodes(){var result=[];this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}switch($t.p.treeGridModel){case'nested':var level=$t.p.treeReader.level_field;$($t.p.data).each(function(){if(parseInt(this[level],10)===parseInt($t.p.tree_root_level,10)){result.push(this);}});break;case'adjacency':var parent_id=$t.p.treeReader.parent_id_field;$($t.p.data).each(function(){if(this[parent_id]===null||String(this[parent_id]).toLowerCase()=='null'){result.push(this);}});break;}});return result;},getNodeDepth:function getNodeDepth(rc){var ret=null;this.each(function(){if(!this.grid||!this.p.treeGrid){return;}var $t=this;switch($t.p.treeGridModel){case'nested':var level=$t.p.treeReader.level_field;ret=parseInt(rc[level],10)-parseInt($t.p.tree_root_level,10);break;case'adjacency':ret=$($t).jqGrid('getNodeAncestors',rc).length;break;}});return ret;},getNodeParent:function getNodeParent(rc){var result=null;this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}switch($t.p.treeGridModel){case'nested':var lftc=$t.p.treeReader.left_field,rgtc=$t.p.treeReader.right_field,levelc=$t.p.treeReader.level_field,lft=parseInt(rc[lftc],10),rgt=parseInt(rc[rgtc],10),level=parseInt(rc[levelc],10);$(this.p.data).each(function(){if(parseInt(this[levelc],10)===level-1&&parseInt(this[lftc],10)<lft&&parseInt(this[rgtc],10)>rgt){result=this;return false;}});break;case'adjacency':var parent_id=$t.p.treeReader.parent_id_field,dtid=$t.p.localReader.id;$(this.p.data).each(function(){if(this[dtid]==rc[parent_id]){result=this;return false;}});break;}});return result;},getNodeChildren:function getNodeChildren(rc){var result=[];this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}switch($t.p.treeGridModel){case'nested':var lftc=$t.p.treeReader.left_field,rgtc=$t.p.treeReader.right_field,levelc=$t.p.treeReader.level_field,lft=parseInt(rc[lftc],10),rgt=parseInt(rc[rgtc],10),level=parseInt(rc[levelc],10);$(this.p.data).each(function(){if(parseInt(this[levelc],10)===level+1&&parseInt(this[lftc],10)>lft&&parseInt(this[rgtc],10)<rgt){result.push(this);}});break;case'adjacency':var parent_id=$t.p.treeReader.parent_id_field,dtid=$t.p.localReader.id;$(this.p.data).each(function(){if(this[parent_id]==rc[dtid]){result.push(this);}});break;}});return result;},getFullTreeNode:function getFullTreeNode(rc){var result=[];this.each(function(){var $t=this,len;if(!$t.grid||!$t.p.treeGrid){return;}switch($t.p.treeGridModel){case'nested':var lftc=$t.p.treeReader.left_field,rgtc=$t.p.treeReader.right_field,levelc=$t.p.treeReader.level_field,lft=parseInt(rc[lftc],10),rgt=parseInt(rc[rgtc],10),level=parseInt(rc[levelc],10);$(this.p.data).each(function(){if(parseInt(this[levelc],10)>=level&&parseInt(this[lftc],10)>=lft&&parseInt(this[lftc],10)<=rgt){result.push(this);}});break;case'adjacency':if(rc){result.push(rc);var parent_id=$t.p.treeReader.parent_id_field,dtid=$t.p.localReader.id;$(this.p.data).each(function(i){len=result.length;for(i=0;i<len;i++){if(result[i][dtid]==this[parent_id]){result.push(this);break;}}});}break;}});return result;},// End NS, adjacency Model\ngetNodeAncestors:function getNodeAncestors(rc){var ancestors=[];this.each(function(){if(!this.grid||!this.p.treeGrid){return;}var parent=$(this).jqGrid('getNodeParent',rc);while(parent){ancestors.push(parent);parent=$(this).jqGrid('getNodeParent',parent);}});return ancestors;},isVisibleNode:function isVisibleNode(rc){var result=true;this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}var ancestors=$($t).jqGrid('getNodeAncestors',rc),expanded=$t.p.treeReader.expanded_field;$(ancestors).each(function(){result=result&&this[expanded];if(!result){return false;}});});return result;},isNodeLoaded:function isNodeLoaded(rc){var result;this.each(function(){var $t=this;if(!$t.grid||!$t.p.treeGrid){return;}var isLeaf=$t.p.treeReader.leaf_field;if(rc!==undefined){if(rc.loaded!==undefined){result=rc.loaded;}else if(rc[isLeaf]||$($t).jqGrid('getNodeChildren',rc).length>0){result=true;}else{result=false;}}else{result=false;}});return result;},expandNode:function expandNode(rc){return this.each(function(){if(!this.grid||!this.p.treeGrid){return;}var expanded=this.p.treeReader.expanded_field,parent=this.p.treeReader.parent_id_field,loaded=this.p.treeReader.loaded,level=this.p.treeReader.level_field,lft=this.p.treeReader.left_field,rgt=this.p.treeReader.right_field;if(!rc[expanded]){var id=$.jgrid.getAccessor(rc,this.p.localReader.id);var rc1=$('#'+$.jgrid.jqID(id),this.grid.bDiv)[0];var position=this.p._index[id];if($(this).jqGrid('isNodeLoaded',this.p.data[position])){rc[expanded]=true;$('div.treeclick',rc1).removeClass(this.p.treeIcons.plus+' tree-plus').addClass(this.p.treeIcons.minus+' tree-minus');}else if(!this.grid.hDiv.loading){rc[expanded]=true;$('div.treeclick',rc1).removeClass(this.p.treeIcons.plus+' tree-plus').addClass(this.p.treeIcons.minus+' tree-minus');this.p.treeANode=rc1.rowIndex;this.p.datatype=this.p.treedatatype;if(this.p.treeGridModel=='nested'){$(this).jqGrid('setGridParam',{postData:{nodeid:id,n_left:rc[lft],n_right:rc[rgt],n_level:rc[level]}});}else{$(this).jqGrid('setGridParam',{postData:{nodeid:id,parentid:rc[parent],n_level:rc[level]}});}$(this).trigger('reloadGrid');rc[loaded]=true;if(this.p.treeGridModel=='nested'){$(this).jqGrid('setGridParam',{postData:{nodeid:'',n_left:'',n_right:'',n_level:''}});}else{$(this).jqGrid('setGridParam',{postData:{nodeid:'',parentid:'',n_level:''}});}}}});},collapseNode:function collapseNode(rc){return this.each(function(){if(!this.grid||!this.p.treeGrid){return;}var expanded=this.p.treeReader.expanded_field;if(rc[expanded]){rc[expanded]=false;var id=$.jgrid.getAccessor(rc,this.p.localReader.id);var rc1=$('#'+$.jgrid.jqID(id),this.grid.bDiv)[0];$('div.treeclick',rc1).removeClass(this.p.treeIcons.minus+' tree-minus').addClass(this.p.treeIcons.plus+' tree-plus');}});},SortTree:function SortTree(sortname,newDir,st,datefmt){return this.each(function(){if(!this.grid||!this.p.treeGrid){return;}var i,len,rec,records=[],$t=this,query,roots,rt=$(this).jqGrid('getRootNodes');// Sorting roots\nquery=$.jgrid.from(rt);query.orderBy(sortname,newDir,st,datefmt);roots=query.select();// Sorting children\nfor(i=0,len=roots.length;i<len;i++){rec=roots[i];records.push(rec);$(this).jqGrid('collectChildrenSortTree',records,rec,sortname,newDir,st,datefmt);}$.each(records,function(index){var id=$.jgrid.getAccessor(this,$t.p.localReader.id);$('#'+$.jgrid.jqID($t.p.id)+' tbody tr:eq('+index+')').after($('tr#'+$.jgrid.jqID(id),$t.grid.bDiv));});query=null;roots=null;records=null;});},collectChildrenSortTree:function collectChildrenSortTree(records,rec,sortname,newDir,st,datefmt){return this.each(function(){if(!this.grid||!this.p.treeGrid){return;}var i,len,child,ch,query,children;ch=$(this).jqGrid('getNodeChildren',rec);query=$.jgrid.from(ch);query.orderBy(sortname,newDir,st,datefmt);children=query.select();for(i=0,len=children.length;i<len;i++){child=children[i];records.push(child);$(this).jqGrid('collectChildrenSortTree',records,child,sortname,newDir,st,datefmt);}});},// experimental\nsetTreeRow:function setTreeRow(rowid,data){var success=false;this.each(function(){var t=this;if(!t.grid||!t.p.treeGrid){return;}success=$(t).jqGrid('setRowData',rowid,data);});return success;},delTreeNode:function delTreeNode(rowid){return this.each(function(){var $t=this,rid=$t.p.localReader.id,i,left=$t.p.treeReader.left_field,right=$t.p.treeReader.right_field,myright,width,res,key;if(!$t.grid||!$t.p.treeGrid){return;}var rc=$t.p._index[rowid];if(rc!==undefined){// nested\nmyright=parseInt($t.p.data[rc][right],10);width=myright-parseInt($t.p.data[rc][left],10)+1;var dr=$($t).jqGrid('getFullTreeNode',$t.p.data[rc]);if(dr.length>0){for(i=0;i<dr.length;i++){$($t).jqGrid('delRowData',dr[i][rid]);}}if($t.p.treeGridModel==='nested'){// ToDo - update grid data\nres=$.jgrid.from($t.p.data).greater(left,myright,{stype:'integer'}).select();if(res.length){for(key in res){if(res.hasOwnProperty(key)){res[key][left]=parseInt(res[key][left],10)-width;}}}res=$.jgrid.from($t.p.data).greater(right,myright,{stype:'integer'}).select();if(res.length){for(key in res){if(res.hasOwnProperty(key)){res[key][right]=parseInt(res[key][right],10)-width;}}}}}});},addChildNode:function addChildNode(nodeid,parentid,data,expandData){//return this.each(function(){\nvar $t=this[0];if(data){// we suppose tha the id is autoincremet and\nvar expanded=$t.p.treeReader.expanded_field,isLeaf=$t.p.treeReader.leaf_field,level=$t.p.treeReader.level_field,//icon = $t.p.treeReader.icon_field,\nparent=$t.p.treeReader.parent_id_field,left=$t.p.treeReader.left_field,right=$t.p.treeReader.right_field,loaded=$t.p.treeReader.loaded,method,parentindex,parentdata,parentlevel,i,len,max=0,rowind=parentid,leaf,maxright;if(expandData===undefined){expandData=false;}if(nodeid===undefined||nodeid===null){i=$t.p.data.length-1;if(i>=0){while(i>=0){max=Math.max(max,parseInt($t.p.data[i][$t.p.localReader.id],10));i--;}}nodeid=max+1;}var prow=$($t).jqGrid('getInd',parentid);leaf=false;// if not a parent we assume root\nif(parentid===undefined||parentid===null||parentid===''){parentid=null;rowind=null;method='last';parentlevel=$t.p.tree_root_level;i=$t.p.data.length+1;}else{method='after';parentindex=$t.p._index[parentid];parentdata=$t.p.data[parentindex];parentid=parentdata[$t.p.localReader.id];parentlevel=parseInt(parentdata[level],10)+1;var childs=$($t).jqGrid('getFullTreeNode',parentdata);// if there are child nodes get the last index of it\nif(childs.length){i=childs[childs.length-1][$t.p.localReader.id];rowind=i;i=$($t).jqGrid('getInd',rowind)+1;}else{i=$($t).jqGrid('getInd',parentid)+1;}// if the node is leaf\nif(parentdata[isLeaf]){leaf=true;parentdata[expanded]=true;//var prow = $($t).jqGrid('getInd', parentid);\n$($t.rows[prow]).find('span.cell-wrapperleaf').removeClass('cell-wrapperleaf').addClass('cell-wrapper').end().find('div.tree-leaf').removeClass($t.p.treeIcons.leaf+' tree-leaf').addClass($t.p.treeIcons.minus+' tree-minus');$t.p.data[parentindex][isLeaf]=false;parentdata[loaded]=true;}}len=i+1;if(data[expanded]===undefined){data[expanded]=false;}if(data[loaded]===undefined){data[loaded]=false;}data[level]=parentlevel;if(data[isLeaf]===undefined){data[isLeaf]=true;}if($t.p.treeGridModel==='adjacency'){data[parent]=parentid;}if($t.p.treeGridModel==='nested'){// this method requiere more attention\nvar query,res,key;//maxright = parseInt(maxright,10);\n// ToDo - update grid data\nif(parentid!==null){maxright=parseInt(parentdata[right],10);query=$.jgrid.from($t.p.data);query=query.greaterOrEquals(right,maxright,{stype:'integer'});res=query.select();if(res.length){for(key in res){if(res.hasOwnProperty(key)){res[key][left]=res[key][left]>maxright?parseInt(res[key][left],10)+2:res[key][left];res[key][right]=res[key][right]>=maxright?parseInt(res[key][right],10)+2:res[key][right];}}}data[left]=maxright;data[right]=maxright+1;}else{maxright=parseInt($($t).jqGrid('getCol',right,false,'max'),10);res=$.jgrid.from($t.p.data).greater(left,maxright,{stype:'integer'}).select();if(res.length){for(key in res){if(res.hasOwnProperty(key)){res[key][left]=parseInt(res[key][left],10)+2;}}}res=$.jgrid.from($t.p.data).greater(right,maxright,{stype:'integer'}).select();if(res.length){for(key in res){if(res.hasOwnProperty(key)){res[key][right]=parseInt(res[key][right],10)+2;}}}data[left]=maxright+1;data[right]=maxright+2;}}if(parentid===null||$($t).jqGrid('isNodeLoaded',parentdata)||leaf){$($t).jqGrid('addRowData',nodeid,data,method,rowind);$($t).jqGrid('setTreeNode',i,len);}if(parentdata&&!parentdata[expanded]&&expandData){$($t.rows[prow]).find('div.treeclick').click();}}//});\n}});})(jQuery);/*jshint eqeqeq:false, eqnull:true */ /*global jQuery */ // Grouping module\n(function($){'use strict';$.extend($.jgrid,{template:function template(format){//jqgformat\nvar args=$.makeArray(arguments).slice(1),j,al=args.length;if(format==null){format='';}return format.replace(/\\{([\\w\\-]+)(?:\\:([\\w\\.]*)(?:\\((.*?)?\\))?)?\\}/g,function(m,i){if(!isNaN(parseInt(i,10))){return args[parseInt(i,10)];}for(j=0;j<al;j++){if($.isArray(args[j])){var nmarr=args[j],k=nmarr.length;while(k--){if(i===nmarr[k].nm){return nmarr[k].v;}}}}});}});$.jgrid.extend({groupingSetup:function groupingSetup(){return this.each(function(){var $t=this,i,j,cml,cm=$t.p.colModel,grp=$t.p.groupingView;if(grp!==null&&(_typeof(grp)==='object'||$.isFunction(grp))){if(!grp.groupField.length){$t.p.grouping=false;}else{if(grp.visibiltyOnNextGrouping===undefined){grp.visibiltyOnNextGrouping=[];}grp.lastvalues=[];grp.groups=[];grp.counters=[];for(i=0;i<grp.groupField.length;i++){if(!grp.groupOrder[i]){grp.groupOrder[i]='';}if(!grp.groupText[i]){grp.groupText[i]='{0}';}if(typeof grp.groupColumnShow[i]!=='boolean'){grp.groupColumnShow[i]=true;}if(typeof grp.groupSummary[i]!=='boolean'){grp.groupSummary[i]=false;}if(grp.groupColumnShow[i]===true){grp.visibiltyOnNextGrouping[i]=true;$($t).jqGrid('showCol',grp.groupField[i]);}else{grp.visibiltyOnNextGrouping[i]=$('#'+$.jgrid.jqID($t.p.id+'_'+grp.groupField[i])).is(':visible');$($t).jqGrid('hideCol',grp.groupField[i]);}}grp.summary=[];for(j=0,cml=cm.length;j<cml;j++){if(cm[j].summaryType){grp.summary.push({nm:cm[j].name,st:cm[j].summaryType,v:'',sr:cm[j].summaryRound,srt:cm[j].summaryRoundType||'round'});}}}}else{$t.p.grouping=false;}});},groupingPrepare:function groupingPrepare(rData,gdata,record,irow){this.each(function(){var grp=this.p.groupingView,$t=this,i,grlen=grp.groupField.length,fieldName,v,displayName,displayValue,changed=0;for(i=0;i<grlen;i++){fieldName=grp.groupField[i];displayName=grp.displayField[i];v=record[fieldName];displayValue=displayName==null?null:record[displayName];if(displayValue==null){displayValue=v;}if(v!==undefined){if(irow===0){// First record always starts a new group\ngrp.groups.push({idx:i,dataIndex:fieldName,value:v,displayValue:displayValue,startRow:irow,cnt:1,summary:[]});grp.lastvalues[i]=v;grp.counters[i]={cnt:1,pos:grp.groups.length-1,summary:$.extend(true,[],grp.summary)};$.each(grp.counters[i].summary,function(){if($.isFunction(this.st)){this.v=this.st.call($t,this.v,this.nm,record);}else{this.v=$($t).jqGrid('groupingCalculations.handler',this.st,this.v,this.nm,this.sr,this.srt,record);}});grp.groups[grp.counters[i].pos].summary=grp.counters[i].summary;}else{if(_typeof(v)!=='object'&&grp.lastvalues[i]!==v){// This record is not in same group as previous one\ngrp.groups.push({idx:i,dataIndex:fieldName,value:v,displayValue:displayValue,startRow:irow,cnt:1,summary:[]});grp.lastvalues[i]=v;changed=1;grp.counters[i]={cnt:1,pos:grp.groups.length-1,summary:$.extend(true,[],grp.summary)};$.each(grp.counters[i].summary,function(){if($.isFunction(this.st)){this.v=this.st.call($t,this.v,this.nm,record);}else{this.v=$($t).jqGrid('groupingCalculations.handler',this.st,this.v,this.nm,this.sr,this.srt,record);}});grp.groups[grp.counters[i].pos].summary=grp.counters[i].summary;}else{if(changed===1){// This group has changed because an earlier group changed.\ngrp.groups.push({idx:i,dataIndex:fieldName,value:v,displayValue:displayValue,startRow:irow,cnt:1,summary:[]});grp.lastvalues[i]=v;grp.counters[i]={cnt:1,pos:grp.groups.length-1,summary:$.extend(true,[],grp.summary)};$.each(grp.counters[i].summary,function(){if($.isFunction(this.st)){this.v=this.st.call($t,this.v,this.nm,record);}else{this.v=$($t).jqGrid('groupingCalculations.handler',this.st,this.v,this.nm,this.sr,this.srt,record);}});grp.groups[grp.counters[i].pos].summary=grp.counters[i].summary;}else{grp.counters[i].cnt+=1;grp.groups[grp.counters[i].pos].cnt=grp.counters[i].cnt;$.each(grp.counters[i].summary,function(){if($.isFunction(this.st)){this.v=this.st.call($t,this.v,this.nm,record);}else{this.v=$($t).jqGrid('groupingCalculations.handler',this.st,this.v,this.nm,this.sr,this.srt,record);}});grp.groups[grp.counters[i].pos].summary=grp.counters[i].summary;}}}}}gdata.push(rData);});return gdata;},groupingToggle:function groupingToggle(hid){this.each(function(){var $t=this,grp=$t.p.groupingView,strpos=hid.split('_'),//uid = hid.substring(0,strpos+1),\nnum=parseInt(strpos[strpos.length-2],10);strpos.splice(strpos.length-2,2);var uid=strpos.join('_'),minus=grp.minusicon,plus=grp.plusicon,tar=$('#'+$.jgrid.jqID(hid)),r=tar.length?tar[0].nextSibling:null,tarspan=$('#'+$.jgrid.jqID(hid)+' span.'+'tree-wrap-'+$t.p.direction),collapsed=false,tspan;if(tarspan.hasClass(minus)){if(grp.showSummaryOnHide){if(r){while(r){if($(r).hasClass('jqfoot')){var lv=parseInt($(r).attr('jqfootlevel'),10);if(lv<=num){break;}}$(r).hide();r=r.nextSibling;}}}else{if(r){while(r){if($(r).hasClass(uid+'_'+String(num))||$(r).hasClass(uid+'_'+String(num-1))){break;}$(r).hide();r=r.nextSibling;}}}tarspan.removeClass(minus).addClass(plus);collapsed=true;}else{if(r){while(r){if($(r).hasClass(uid+'_'+String(num))||$(r).hasClass(uid+'_'+String(num-1))){break;}$(r).show();tspan=$(r).find('span.'+'tree-wrap-'+$t.p.direction);if(tspan&&$(tspan).hasClass(plus)){$(tspan).removeClass(plus).addClass(minus);}r=r.nextSibling;}}tarspan.removeClass(plus).addClass(minus);}$($t).triggerHandler('jqGridGroupingClickGroup',[hid,collapsed]);if($.isFunction($t.p.onClickGroup)){$t.p.onClickGroup.call($t,hid,collapsed);}});return false;},groupingRender:function groupingRender(grdata,colspans){return this.each(function(){var $t=this,grp=$t.p.groupingView,str='',icon='',hid,clid,pmrtl=grp.groupCollapse?grp.plusicon:grp.minusicon,gv,cp=[],len=grp.groupField.length;pmrtl+=' tree-wrap-'+$t.p.direction;$.each($t.p.colModel,function(i,n){var ii;for(ii=0;ii<len;ii++){if(grp.groupField[ii]===n.name){cp[ii]=i;break;}}});var toEnd=0;function findGroupIdx(ind,offset,grp){var ret=false,i;if(offset===0){ret=grp[ind];}else{var id=grp[ind].idx;if(id===0){ret=grp[ind];}else{for(i=ind;i>=0;i--){if(grp[i].idx===id-offset){ret=grp[i];break;}}}}return ret;}var sumreverse=$.makeArray(grp.groupSummary);sumreverse.reverse();$.each(grp.groups,function(i,n){toEnd++;clid=$t.p.id+'ghead_'+n.idx;hid=clid+'_'+i;icon='<span style=\\'cursor:pointer;\\' class=\\'ui-icon '+pmrtl+'\\' onclick=\"jQuery(\\'#'+$.jgrid.jqID($t.p.id)+'\\').jqGrid(\\'groupingToggle\\',\\''+hid+'\\');return false;\"></span>';try{gv=$t.formatter(hid,n.displayValue,cp[n.idx],n.value);}catch(egv){gv=n.displayValue;}str+='<tr id=\"'+hid+'\" role=\"row\" class= \"ui-widget-content jqgroup ui-row-'+$t.p.direction+' '+clid+'\"><td style=\"padding-left:'+n.idx*12+'px;'+'\" colspan=\"'+colspans+'\">'+icon+$.jgrid.template(grp.groupText[n.idx],gv,n.cnt,n.summary)+'</td></tr>';var leaf=len-1===n.idx;if(leaf){var gg=grp.groups[i+1],k,kk,ik;var end=gg!==undefined?grp.groups[i+1].startRow:grdata.length;for(kk=n.startRow;kk<end;kk++){str+=grdata[kk].join('');}var jj;if(gg!==undefined){for(jj=0;jj<grp.groupField.length;jj++){if(gg.dataIndex===grp.groupField[jj]){break;}}toEnd=grp.groupField.length-jj;}for(ik=0;ik<toEnd;ik++){if(!sumreverse[ik]){continue;}var hhdr='';if(grp.groupCollapse&&!grp.showSummaryOnHide){hhdr=' style=\"display:none;\"';}str+='<tr'+hhdr+' jqfootlevel=\"'+(n.idx-ik)+'\" role=\"row\" class=\"ui-widget-content jqfoot ui-row-'+$t.p.direction+'\">';var fdata=findGroupIdx(i,ik,grp.groups),cm=$t.p.colModel,vv,grlen=fdata.cnt;for(k=0;k<colspans;k++){var tmpdata='<td '+$t.formatCol(k,1,'')+'>&#160;</td>',tplfld='{0}';$.each(fdata.summary,function(){if(this.nm===cm[k].name){if(cm[k].summaryTpl){tplfld=cm[k].summaryTpl;}if(typeof this.st==='string'&&this.st.toLowerCase()==='avg'){if(this.v&&grlen>0){this.v=this.v/grlen;}}try{vv=$t.formatter('',this.v,k,this);}catch(ef){vv=this.v;}tmpdata='<td '+$t.formatCol(k,1,'')+'>'+$.jgrid.format(tplfld,vv)+'</td>';return false;}});str+=tmpdata;}str+='</tr>';}toEnd=jj;}});$('#'+$.jgrid.jqID($t.p.id)+' tbody:first').append(str);// free up memory\nstr=null;});},groupingGroupBy:function groupingGroupBy(name,options){return this.each(function(){var $t=this;if(typeof name==='string'){name=[name];}var grp=$t.p.groupingView;$t.p.grouping=true;//Set default, in case visibilityOnNextGrouping is undefined\nif(grp.visibiltyOnNextGrouping===undefined){grp.visibiltyOnNextGrouping=[];}var i;// show previous hidden groups if they are hidden and weren't removed yet\nfor(i=0;i<grp.groupField.length;i++){if(!grp.groupColumnShow[i]&&grp.visibiltyOnNextGrouping[i]){$($t).jqGrid('showCol',grp.groupField[i]);}}// set visibility status of current group columns on next grouping\nfor(i=0;i<name.length;i++){grp.visibiltyOnNextGrouping[i]=$('#'+$.jgrid.jqID($t.p.id)+'_'+$.jgrid.jqID(name[i])).is(':visible');}$t.p.groupingView=$.extend($t.p.groupingView,options||{});grp.groupField=name;$($t).trigger('reloadGrid');});},groupingRemove:function groupingRemove(current){return this.each(function(){var $t=this;if(current===undefined){current=true;}$t.p.grouping=false;if(current===true){var grp=$t.p.groupingView,i;// show previous hidden groups if they are hidden and weren't removed yet\nfor(i=0;i<grp.groupField.length;i++){if(!grp.groupColumnShow[i]&&grp.visibiltyOnNextGrouping[i]){$($t).jqGrid('showCol',grp.groupField);}}$('tr.jqgroup, tr.jqfoot','#'+$.jgrid.jqID($t.p.id)+' tbody:first').remove();$('tr.jqgrow:hidden','#'+$.jgrid.jqID($t.p.id)+' tbody:first').show();}else{$($t).trigger('reloadGrid');}});},groupingCalculations:{handler:function handler(fn,v,field,round,roundType,rc){var funcs={sum:function sum(){return parseFloat(v||0)+parseFloat(rc[field]||0);},min:function min(){if(v===''){return parseFloat(rc[field]||0);}return Math.min(parseFloat(v),parseFloat(rc[field]||0));},max:function max(){if(v===''){return parseFloat(rc[field]||0);}return Math.max(parseFloat(v),parseFloat(rc[field]||0));},count:function count(){if(v===''){v=0;}if(rc.hasOwnProperty(field)){return v+1;}return 0;},avg:function avg(){// the same as sum, but at end we divide it\n// so use sum instead of duplicating the code (?)\nreturn funcs.sum();}};if(!funcs[fn]){throw'jqGrid Grouping No such method: '+fn;}var res=funcs[fn]();if(round!=null){if(roundType=='fixed'){res=res.toFixed(round);}else{var mul=Math.pow(10,round);res=Math.round(res*mul)/mul;}}return res;}}});})(jQuery);/*jshint eqeqeq:false, eqnull:true, devel:true */ /*global jQuery, xmlJsonClass */(function($){/*\r\n * jqGrid extension for constructing Grid Data from external file\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n**/'use strict';$.jgrid.extend({jqGridImport:function jqGridImport(o){o=$.extend({imptype:'xml',// xml, json, xmlstring, jsonstring\nimpstring:'',impurl:'',mtype:'GET',impData:{},xmlGrid:{config:'roots>grid',data:'roots>rows'},jsonGrid:{config:'grid',data:'data'},ajaxOptions:{}},o||{});return this.each(function(){var $t=this;var xmlConvert=function xmlConvert(xml,o){var cnfg=$(o.xmlGrid.config,xml)[0];var xmldata=$(o.xmlGrid.data,xml)[0],jstr,jstr1,key;if(xmlJsonClass.xml2json&&$.jgrid.parse){jstr=xmlJsonClass.xml2json(cnfg,' ');jstr=$.jgrid.parse(jstr);for(key in jstr){if(jstr.hasOwnProperty(key)){jstr1=jstr[key];}}if(xmldata){// save the datatype\nvar svdatatype=jstr.grid.datatype;jstr.grid.datatype='xmlstring';jstr.grid.datastr=xml;$($t).jqGrid(jstr1).jqGrid('setGridParam',{datatype:svdatatype});}else{$($t).jqGrid(jstr1);}jstr=null;jstr1=null;}else{alert('xml2json or parse are not present');}};var jsonConvert=function jsonConvert(jsonstr,o){if(jsonstr&&typeof jsonstr=='string'){var _jsonparse=false;if($.jgrid.useJSON){$.jgrid.useJSON=false;_jsonparse=true;}var json=$.jgrid.parse(jsonstr);if(_jsonparse){$.jgrid.useJSON=true;}var gprm=json[o.jsonGrid.config];var jdata=json[o.jsonGrid.data];if(jdata){var svdatatype=gprm.datatype;gprm.datatype='jsonstring';gprm.datastr=jdata;$($t).jqGrid(gprm).jqGrid('setGridParam',{datatype:svdatatype});}else{$($t).jqGrid(gprm);}}};switch(o.imptype){case'xml':$.ajax($.extend({url:o.impurl,type:o.mtype,data:o.impData,dataType:'xml',complete:function complete(xml,stat){if(stat=='success'){xmlConvert(xml.responseXML,o);$($t).triggerHandler('jqGridImportComplete',[xml,o]);if($.isFunction(o.importComplete)){o.importComplete(xml);}}xml=null;}},o.ajaxOptions));break;case'xmlstring':// we need to make just the conversion and use the same code as xml\nif(o.impstring&&typeof o.impstring=='string'){var xmld=$.jgrid.stringToDoc(o.impstring);if(xmld){xmlConvert(xmld,o);$($t).triggerHandler('jqGridImportComplete',[xmld,o]);if($.isFunction(o.importComplete)){o.importComplete(xmld);}o.impstring=null;}xmld=null;}break;case'json':$.ajax($.extend({url:o.impurl,type:o.mtype,data:o.impData,dataType:'json',complete:function complete(json){try{jsonConvert(json.responseText,o);$($t).triggerHandler('jqGridImportComplete',[json,o]);if($.isFunction(o.importComplete)){o.importComplete(json);}}catch(ee){}json=null;}},o.ajaxOptions));break;case'jsonstring':if(o.impstring&&typeof o.impstring=='string'){jsonConvert(o.impstring,o);$($t).triggerHandler('jqGridImportComplete',[o.impstring,o]);if($.isFunction(o.importComplete)){o.importComplete(o.impstring);}o.impstring=null;}break;}});},jqGridExport:function jqGridExport(o){o=$.extend({exptype:'xmlstring',root:'grid',ident:'\\t'},o||{});var ret=null;this.each(function(){if(!this.grid){return;}var key,gprm=$.extend(true,{},$(this).jqGrid('getGridParam'));// we need to check for:\n// 1.multiselect, 2.subgrid  3. treegrid and remove the unneded columns from colNames\nif(gprm.rownumbers){gprm.colNames.splice(0,1);gprm.colModel.splice(0,1);}if(gprm.multiselect){gprm.colNames.splice(0,1);gprm.colModel.splice(0,1);}if(gprm.subGrid){gprm.colNames.splice(0,1);gprm.colModel.splice(0,1);}gprm.knv=null;if(gprm.treeGrid){for(key in gprm.treeReader){if(gprm.treeReader.hasOwnProperty(key)){gprm.colNames.splice(gprm.colNames.length-1);gprm.colModel.splice(gprm.colModel.length-1);}}}switch(o.exptype){case'xmlstring':ret='<'+o.root+'>'+xmlJsonClass.json2xml(gprm,o.ident)+'</'+o.root+'>';break;case'jsonstring':ret='{'+xmlJsonClass.toJson(gprm,o.root,o.ident,false)+'}';if(gprm.postData.filters!==undefined){ret=ret.replace(/filters\":\"/,'filters\":');ret=ret.replace(/}]}\"/,'}]}');}break;}});return ret;},excelExport:function excelExport(o){o=$.extend({exptype:'remote',url:null,oper:'oper',tag:'excel',exportOptions:{}},o||{});return this.each(function(){if(!this.grid){return;}var url;if(o.exptype=='remote'){var pdata=$.extend({},this.p.postData);pdata[o.oper]=o.tag;var params=jQuery.param(pdata);if(o.url.indexOf('?')!=-1){url=o.url+'&'+params;}else{url=o.url+'?'+params;}window.location=url;}});}});})(jQuery);/*jshint evil:true, eqeqeq:false, eqnull:true, devel:true */ /*global jQuery */(function($){/*\r\n**\r\n * jqGrid addons using jQuery UI\r\n * Author: Mark Williams\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl-2.0.html\r\n * depends on jQuery UI\r\n**/'use strict';if($.jgrid.msie&&$.jgrid.msiever()==8){$.expr[':'].hidden=function(elem){return elem.offsetWidth===0||elem.offsetHeight===0||elem.style.display=='none';};}// requiere load multiselect before grid\n$.jgrid._multiselect=false;if($.ui){if($.ui.multiselect){if($.ui.multiselect.prototype._setSelected){var setSelected=$.ui.multiselect.prototype._setSelected;$.ui.multiselect.prototype._setSelected=function(item,selected){var ret=setSelected.call(this,item,selected);if(selected&&this.selectedList){var elt=this.element;this.selectedList.find('li').each(function(){if($(this).data('optionLink')){$(this).data('optionLink').remove().appendTo(elt);}});}return ret;};}if($.ui.multiselect.prototype.destroy){$.ui.multiselect.prototype.destroy=function(){this.element.show();this.container.remove();if($.Widget===undefined){$.widget.prototype.destroy.apply(this,arguments);}else{$.Widget.prototype.destroy.apply(this,arguments);}};}$.jgrid._multiselect=true;}}$.jgrid.extend({sortableColumns:function sortableColumns(tblrow){return this.each(function(){var ts=this,tid=$.jgrid.jqID(ts.p.id);function start(){ts.p.disableClick=true;}var sortable_opts={'tolerance':'pointer','axis':'x','scrollSensitivity':'1','items':'>th:not(:has(#jqgh_'+tid+'_cb'+',#jqgh_'+tid+'_rn'+',#jqgh_'+tid+'_subgrid),:hidden)','placeholder':{element:function element(item){var el=$(document.createElement(item[0].nodeName)).addClass(item[0].className+' ui-sortable-placeholder ui-state-highlight').removeClass('ui-sortable-helper')[0];return el;},update:function update(self,p){p.height(self.currentItem.innerHeight()-parseInt(self.currentItem.css('paddingTop')||0,10)-parseInt(self.currentItem.css('paddingBottom')||0,10));p.width(self.currentItem.innerWidth()-parseInt(self.currentItem.css('paddingLeft')||0,10)-parseInt(self.currentItem.css('paddingRight')||0,10));}},'update':function update(event,ui){var p=$(ui.item).parent(),th=$('>th',p),colModel=ts.p.colModel,cmMap={},tid=ts.p.id+'_';$.each(colModel,function(i){cmMap[this.name]=i;});var permutation=[];th.each(function(){var id=$('>div',this).get(0).id.replace(/^jqgh_/,'').replace(tid,'');if(cmMap.hasOwnProperty(id)){permutation.push(cmMap[id]);}});$(ts).jqGrid('remapColumns',permutation,true,true);if($.isFunction(ts.p.sortable.update)){ts.p.sortable.update(permutation);}setTimeout(function(){ts.p.disableClick=false;},50);}};if(ts.p.sortable.options){$.extend(sortable_opts,ts.p.sortable.options);}else if($.isFunction(ts.p.sortable)){ts.p.sortable={'update':ts.p.sortable};}if(sortable_opts.start){var s=sortable_opts.start;sortable_opts.start=function(e,ui){start();s.call(this,e,ui);};}else{sortable_opts.start=start;}if(ts.p.sortable.exclude){sortable_opts.items+=':not('+ts.p.sortable.exclude+')';}tblrow.sortable(sortable_opts).data('sortable').floating=true;});},columnChooser:function columnChooser(opts){var self=this;if($('#colchooser_'+$.jgrid.jqID(self[0].p.id)).length){return;}var selector=$('<div id=\"colchooser_'+self[0].p.id+'\" style=\"position:relative;overflow:hidden\"><div><select multiple=\"multiple\"></select></div></div>');var select=$('select',selector);function insert(perm,i,v){if(i>=0){var a=perm.slice();var b=a.splice(i,Math.max(perm.length-i,i));if(i>perm.length){i=perm.length;}a[i]=v;return a.concat(b);}}opts=$.extend({'width':420,'height':240,'classname':null,'done':function done(perm){if(perm){self.jqGrid('remapColumns',perm,true);}},/* msel is either the name of a ui widget class that\r\n               extends a multiselect, or a function that supports\r\n               creating a multiselect object (with no argument,\r\n               or when passed an object), and destroying it (when\r\n               passed the string \"destroy\"). */'msel':'multiselect',/* \"msel_opts\" : {}, */ /* dlog is either the name of a ui widget class that\r\n               behaves in a dialog-like way, or a function, that\r\n               supports creating a dialog (when passed dlog_opts)\r\n               or destroying a dialog (when passed the string\r\n               \"destroy\")\r\n               */'dlog':'dialog','dialog_opts':{'minWidth':470},/* dlog_opts is either an option object to be passed\r\n               to \"dlog\", or (more likely) a function that creates\r\n               the options object.\r\n               The default produces a suitable options object for\r\n               ui.dialog */'dlog_opts':function dlog_opts(opts){var buttons={};buttons[opts.bSubmit]=function(){opts.apply_perm();opts.cleanup(false);};buttons[opts.bCancel]=function(){opts.cleanup(true);};return $.extend(true,{'buttons':buttons,'close':function close(){opts.cleanup(true);},'modal':opts.modal||false,'resizable':opts.resizable||true,'width':opts.width+20},opts.dialog_opts||{});},/* Function to get the permutation array, and pass it to the\r\n               \"done\" function */'apply_perm':function apply_perm(){$('option',select).each(function(){if(this.selected){self.jqGrid('showCol',colModel[this.value].name);}else{self.jqGrid('hideCol',colModel[this.value].name);}});var perm=[];//fixedCols.slice(0);\n$('option:selected',select).each(function(){perm.push(parseInt(this.value,10));});$.each(perm,function(){delete colMap[colModel[parseInt(this,10)].name];});$.each(colMap,function(){var ti=parseInt(this,10);perm=insert(perm,ti,ti);});if(opts.done){opts.done.call(self,perm);}},/* Function to cleanup the dialog, and select. Also calls the\r\n               done function with no permutation (to indicate that the\r\n               columnChooser was aborted */'cleanup':function cleanup(calldone){call(opts.dlog,selector,'destroy');call(opts.msel,select,'destroy');selector.remove();if(calldone&&opts.done){opts.done.call(self);}},'msel_opts':{}},$.jgrid.col,opts||{});if($.ui){if($.ui.multiselect){if(opts.msel=='multiselect'){if(!$.jgrid._multiselect){// should be in language file\nalert('Multiselect plugin loaded after jqGrid. Please load the plugin before the jqGrid!');return;}opts.msel_opts=$.extend($.ui.multiselect.defaults,opts.msel_opts);}}}if(opts.caption){selector.attr('title',opts.caption);}if(opts.classname){selector.addClass(opts.classname);select.addClass(opts.classname);}if(opts.width){$('>div',selector).css({'width':opts.width,'margin':'0 auto'});select.css('width',opts.width);}if(opts.height){$('>div',selector).css('height',opts.height);select.css('height',opts.height-10);}var colModel=self.jqGrid('getGridParam','colModel');var colNames=self.jqGrid('getGridParam','colNames');var colMap={},fixedCols=[];select.empty();$.each(colModel,function(i){colMap[this.name]=i;if(this.hidedlg){if(!this.hidden){fixedCols.push(i);}return;}select.append('<option value=\\''+i+'\\' '+(this.hidden?'':'selected=\\'selected\\'')+'>'+$.jgrid.stripHtml(colNames[i])+'</option>');});function call(fn,obj){if(!fn){return;}if(typeof fn=='string'){if($.fn[fn]){$.fn[fn].apply(obj,$.makeArray(arguments).slice(2));}}else if($.isFunction(fn)){fn.apply(obj,$.makeArray(arguments).slice(2));}}var dopts=$.isFunction(opts.dlog_opts)?opts.dlog_opts.call(self,opts):opts.dlog_opts;call(opts.dlog,selector,dopts);var mopts=$.isFunction(opts.msel_opts)?opts.msel_opts.call(self,opts):opts.msel_opts;call(opts.msel,select,mopts);},sortableRows:function sortableRows(opts){// Can accept all sortable options and events\nreturn this.each(function(){var $t=this;if(!$t.grid){return;}// Currently we disable a treeGrid sortable\nif($t.p.treeGrid){return;}if($.fn.sortable){opts=$.extend({'cursor':'move','axis':'y','items':'.jqgrow'},opts||{});if(opts.start&&$.isFunction(opts.start)){opts._start_=opts.start;delete opts.start;}else{opts._start_=false;}if(opts.update&&$.isFunction(opts.update)){opts._update_=opts.update;delete opts.update;}else{opts._update_=false;}opts.start=function(ev,ui){$(ui.item).css('border-width','0px');$('td',ui.item).each(function(i){this.style.width=$t.grid.cols[i].style.width;});if($t.p.subGrid){var subgid=$(ui.item).attr('id');try{$($t).jqGrid('collapseSubGridRow',subgid);}catch(e){}}if(opts._start_){opts._start_.apply(this,[ev,ui]);}};opts.update=function(ev,ui){$(ui.item).css('border-width','');if($t.p.rownumbers===true){$('td.jqgrid-rownum',$t.rows).each(function(i){$(this).html(i+1+(parseInt($t.p.page,10)-1)*parseInt($t.p.rowNum,10));});}if(opts._update_){opts._update_.apply(this,[ev,ui]);}};$('tbody:first',$t).sortable(opts);$('tbody:first',$t).disableSelection();}});},gridDnD:function gridDnD(opts){return this.each(function(){var $t=this,i,cn;if(!$t.grid){return;}// Currently we disable a treeGrid drag and drop\nif($t.p.treeGrid){return;}if(!$.fn.draggable||!$.fn.droppable){return;}function updateDnD(){var datadnd=$.data($t,'dnd');$('tr.jqgrow:not(.ui-draggable)',$t).draggable($.isFunction(datadnd.drag)?datadnd.drag.call($($t),datadnd):datadnd.drag);}var appender='<table id=\\'jqgrid_dnd\\' class=\\'ui-jqgrid-dnd\\'></table>';if($('#jqgrid_dnd')[0]===undefined){$('body').append(appender);}if(typeof opts=='string'&&opts=='updateDnD'&&$t.p.jqgdnd===true){updateDnD();return;}opts=$.extend({'drag':function drag(opts){return $.extend({start:function start(ev,ui){var i,subgid;// if we are in subgrid mode try to collapse the node\nif($t.p.subGrid){subgid=$(ui.helper).attr('id');try{$($t).jqGrid('collapseSubGridRow',subgid);}catch(e){}}// hack\n// drag and drop does not insert tr in table, when the table has no rows\n// we try to insert new empty row on the target(s)\nfor(i=0;i<$.data($t,'dnd').connectWith.length;i++){if($($.data($t,'dnd').connectWith[i]).jqGrid('getGridParam','reccount')=='0'){$($.data($t,'dnd').connectWith[i]).jqGrid('addRowData','jqg_empty_row',{});}}ui.helper.addClass('ui-state-highlight');$('td',ui.helper).each(function(i){this.style.width=$t.grid.headers[i].width+'px';});if(opts.onstart&&$.isFunction(opts.onstart)){opts.onstart.call($($t),ev,ui);}},stop:function stop(ev,ui){var i,ids;if(ui.helper.dropped&&!opts.dragcopy){ids=$(ui.helper).attr('id');if(ids===undefined){ids=$(this).attr('id');}$($t).jqGrid('delRowData',ids);}// if we have a empty row inserted from start event try to delete it\nfor(i=0;i<$.data($t,'dnd').connectWith.length;i++){$($.data($t,'dnd').connectWith[i]).jqGrid('delRowData','jqg_empty_row');}if(opts.onstop&&$.isFunction(opts.onstop)){opts.onstop.call($($t),ev,ui);}}},opts.drag_opts||{});},'drop':function drop(opts){return $.extend({accept:function accept(d){if(!$(d).hasClass('jqgrow')){return d;}var tid=$(d).closest('table.ui-jqgrid-btable');if(tid.length>0&&$.data(tid[0],'dnd')!==undefined){var cn=$.data(tid[0],'dnd').connectWith;return $.inArray('#'+$.jgrid.jqID(this.id),cn)!=-1?true:false;}return false;},drop:function drop(ev,ui){if(!$(ui.draggable).hasClass('jqgrow')){return;}var accept=$(ui.draggable).attr('id');var getdata=ui.draggable.parent().parent().jqGrid('getRowData',accept);if(!opts.dropbyname){var j=0,tmpdata={},nm,key;var dropmodel=$('#'+$.jgrid.jqID(this.id)).jqGrid('getGridParam','colModel');try{for(key in getdata){if(getdata.hasOwnProperty(key)){nm=dropmodel[j].name;if(!(nm=='cb'||nm=='rn'||nm=='subgrid')){if(getdata.hasOwnProperty(key)&&dropmodel[j]){tmpdata[nm]=getdata[key];}}j++;}}getdata=tmpdata;}catch(e){}}ui.helper.dropped=true;if(opts.beforedrop&&$.isFunction(opts.beforedrop)){//parameters to this callback - event, element, data to be inserted, sender, reciever\n// should return object which will be inserted into the reciever\nvar datatoinsert=opts.beforedrop.call(this,ev,ui,getdata,$('#'+$.jgrid.jqID($t.p.id)),$(this));if(datatoinsert!==undefined&&datatoinsert!==null&&_typeof(datatoinsert)=='object'){getdata=datatoinsert;}}if(ui.helper.dropped){var grid;if(opts.autoid){if($.isFunction(opts.autoid)){grid=opts.autoid.call(this,getdata);}else{grid=Math.ceil(Math.random()*1000);grid=opts.autoidprefix+grid;}}// NULL is interpreted as undefined while null as object\n$('#'+$.jgrid.jqID(this.id)).jqGrid('addRowData',grid,getdata,opts.droppos);}if(opts.ondrop&&$.isFunction(opts.ondrop)){opts.ondrop.call(this,ev,ui,getdata);}}},opts.drop_opts||{});},'onstart':null,'onstop':null,'beforedrop':null,'ondrop':null,'drop_opts':{'activeClass':'ui-state-active','hoverClass':'ui-state-hover'},'drag_opts':{'revert':'invalid','helper':'clone','cursor':'move','appendTo':'#jqgrid_dnd','zIndex':5000},'dragcopy':false,'dropbyname':false,'droppos':'first','autoid':true,'autoidprefix':'dnd_'},opts||{});if(!opts.connectWith){return;}opts.connectWith=opts.connectWith.split(',');opts.connectWith=$.map(opts.connectWith,function(n){return $.trim(n);});$.data($t,'dnd',opts);if($t.p.reccount!='0'&&!$t.p.jqgdnd){updateDnD();}$t.p.jqgdnd=true;for(i=0;i<opts.connectWith.length;i++){cn=opts.connectWith[i];$(cn).droppable($.isFunction(opts.drop)?opts.drop.call($($t),opts):opts.drop);}});},gridResize:function gridResize(opts){return this.each(function(){var $t=this,gID=$.jgrid.jqID($t.p.id);if(!$t.grid||!$.fn.resizable){return;}opts=$.extend({},opts||{});if(opts.alsoResize){opts._alsoResize_=opts.alsoResize;delete opts.alsoResize;}else{opts._alsoResize_=false;}if(opts.stop&&$.isFunction(opts.stop)){opts._stop_=opts.stop;delete opts.stop;}else{opts._stop_=false;}opts.stop=function(ev,ui){$($t).jqGrid('setGridParam',{height:$('#gview_'+gID+' .ui-jqgrid-bdiv').height()});$($t).jqGrid('setGridWidth',ui.size.width,opts.shrinkToFit);if(opts._stop_){opts._stop_.call($t,ev,ui);}};if(opts._alsoResize_){var optstest='{\\'#gview_'+gID+' .ui-jqgrid-bdiv\\':true,\\''+opts._alsoResize_+'\\':true}';opts.alsoResize=eval('('+optstest+')');// the only way that I found to do this\n}else{opts.alsoResize=$('.ui-jqgrid-bdiv','#gview_'+gID);}delete opts._alsoResize_;$('#gbox_'+gID).resizable(opts);});}});})(jQuery);/*\r\n Transform a table to a jqGrid.\r\n Peter Romianowski <peter.romianowski@optivo.de>\r\n If the first column of the table contains checkboxes or\r\n radiobuttons then the jqGrid is made selectable.\r\n*/ // Addition - selector can be a class or id\nfunction tableToGrid(selector,options){jQuery(selector).each(function(){if(this.grid){return;}//Adedd from Tony Tomov\n// This is a small \"hack\" to make the width of the jqGrid 100%\njQuery(this).width('99%');var w=jQuery(this).width();// Text whether we have single or multi select\nvar inputCheckbox=jQuery('tr td:first-child input[type=checkbox]:first',jQuery(this));var inputRadio=jQuery('tr td:first-child input[type=radio]:first',jQuery(this));var selectMultiple=inputCheckbox.length>0;var selectSingle=!selectMultiple&&inputRadio.length>0;var selectable=selectMultiple||selectSingle;//var inputName = inputCheckbox.attr(\"name\") || inputRadio.attr(\"name\");\n// Build up the columnModel and the data\nvar colModel=[];var colNames=[];jQuery('th',jQuery(this)).each(function(){if(colModel.length===0&&selectable){colModel.push({name:'__selection__',index:'__selection__',width:0,hidden:true});colNames.push('__selection__');}else{colModel.push({name:jQuery(this).attr('id')||jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'),index:jQuery(this).attr('id')||jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'),width:jQuery(this).width()||150});colNames.push(jQuery(this).html());}});var data=[];var rowIds=[];var rowChecked=[];jQuery('tbody > tr',jQuery(this)).each(function(){var row={};var rowPos=0;jQuery('td',jQuery(this)).each(function(){if(rowPos===0&&selectable){var input=jQuery('input',jQuery(this));var rowId=input.attr('value');rowIds.push(rowId||data.length);if(input.is(':checked')){rowChecked.push(rowId);}row[colModel[rowPos].name]=input.attr('value');}else{row[colModel[rowPos].name]=jQuery(this).html();}rowPos++;});if(rowPos>0){data.push(row);}});// Clear the original HTML table\njQuery(this).empty();// Mark it as jqGrid\njQuery(this).addClass('scroll');jQuery(this).jqGrid(jQuery.extend({datatype:'local',width:w,colNames:colNames,colModel:colModel,multiselect:selectMultiple//inputName: inputName,\n//inputValueCol: imputName != null ? \"__selection__\" : null\n},options||{}));// Add data\nvar a;for(a=0;a<data.length;a++){var id=null;if(rowIds.length>0){id=rowIds[a];if(id&&id.replace){// We have to do this since the value of a checkbox\n// or radio button can be anything\nid=encodeURIComponent(id).replace(/[.\\-%]/g,'_');}}if(id===null){id=a+1;}jQuery(this).jqGrid('addRowData',id,data[a]);}// Set the selection\nfor(a=0;a<rowChecked.length;a++){jQuery(this).jqGrid('setSelection',rowChecked[a]);}});}/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito, \r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */var rp_ge={};(function($){/*\r\n\t * MODIFICACIONES UDA\r\n\t * Se han convertido los siguientes métodos privados en públicos para permitir su extensión.\r\n\t * - getFormData\r\n\t * - createData\r\n\t * - fillData\r\n\t * - setNulls\r\n\t * - postIt\r\n\t * - compareData\r\n\t * - checkUpdates\r\n\t * - restoreInline\r\n\t * - updateNav\r\n\t * - getCurrPos\r\n\t */$.extend($.jgrid,{createData:function createData(rowid,obj,tb,maxcols){var $t=this,nm,hc,trdata,cnt=0,tmp,dc,elc,retpos=[],ind=false,tdtmpl=\"<td class='CaptionTD'>&#160;</td><td class='DataTD'>&#160;</td>\",tmpl=\"\",i;//*2\nfor(i=1;i<=maxcols;i++){tmpl+=tdtmpl;}if(rowid!='_empty'){ind=$(obj).jqGrid(\"getInd\",rowid);}$(obj.p.colModel).each(function(i){nm=this.name;// hidden fields are included in the form\nif(this.editrules&&this.editrules.edithidden===true){hc=false;}else{hc=this.hidden===true?true:false;}dc=hc?\"style='display:none'\":\"\";if(nm!=='cb'&&nm!=='subgrid'&&this.editable===true&&nm!=='rn'){if(ind===false){tmp=\"\";}else{if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$(\"td:eq(\"+i+\")\",obj.rows[ind]).text();}else{try{tmp=$.unformat.call(obj,$(\"td:eq(\"+i+\")\",obj.rows[ind]),{rowId:rowid,colModel:this},i);}catch(_){tmp=this.edittype&&this.edittype==\"textarea\"?$(\"td:eq(\"+i+\")\",obj.rows[ind]).text():$(\"td:eq(\"+i+\")\",obj.rows[ind]).html();}if(!tmp||tmp==\"&nbsp;\"||tmp==\"&#160;\"||tmp.length==1&&tmp.charCodeAt(0)==160){tmp='';}}}var opt=$.extend({},this.editoptions||{},{id:nm,name:nm}),frmopt=$.extend({},{elmprefix:'',elmsuffix:'',rowabove:false,rowcontent:''},this.formoptions||{}),rp=parseInt(frmopt.rowpos,10)||cnt+1,cp=parseInt((parseInt(frmopt.colpos,10)||1)*2,10);if(rowid==\"_empty\"&&opt.defaultValue){tmp=$.isFunction(opt.defaultValue)?opt.defaultValue.call($t):opt.defaultValue;}if(!this.edittype){this.edittype=\"text\";}if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}elc=$.jgrid.createEl.call($t,this.edittype,opt,tmp,false,$.extend({},$.jgrid.ajaxOptions,obj.p.ajaxSelectOptions||{}));if(tmp===\"\"&&this.edittype==\"checkbox\"){tmp=$(elc).attr(\"offval\");}if(tmp===\"\"&&this.edittype==\"select\"){tmp=$(\"option:eq(0)\",elc).text();}if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=tmp;}$(elc).addClass(\"FormElement\");if(this.edittype=='text'||this.edittype=='textarea'){$(elc).addClass(\"ui-widget-content ui-corner-all\");}trdata=$(tb).find(\"tr[rowpos=\"+rp+\"]\");if(frmopt.rowabove){var newdata=$(\"<tr><td class='contentinfo' colspan='\"+maxcols*2+\"'>\"+frmopt.rowcontent+\"</td></tr>\");$(tb).append(newdata);newdata[0].rp=rp;}if(trdata.length===0){trdata=$(\"<tr \"+dc+\" rowpos='\"+rp+\"'></tr>\").addClass(\"FormData\").attr(\"id\",\"tr_\"+nm);$(trdata).append(tmpl);$(tb).append(trdata);trdata[0].rp=rp;}$(\"td:eq(\"+(cp-2)+\")\",trdata[0]).html(typeof frmopt.label==='undefined'?obj.p.colNames[i]:frmopt.label);$(\"td:eq(\"+(cp-1)+\")\",trdata[0]).append(frmopt.elmprefix).append(elc).append(frmopt.elmsuffix);retpos[cnt]=i;cnt++;}});if(cnt>0){var idrow=$(\"<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='\"+(maxcols*2-1)+\"' class='DataTD'><input class='FormElement' id='id_g' type='text' name='\"+obj.p.id+\"_id' value='\"+rowid+\"'/></td></tr>\");idrow[0].rp=cnt+999;$(tb).append(idrow);if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[obj.p.id+\"_id\"]=rowid;}}return retpos;},fillData:function fillData(rowid,obj,fmid){var $t=this,gID=$t.p.id,frmgr=\"FrmGrid_\"+gID,frmtborg=\"TblGrid_\"+gID,frmtb=\"#\"+$.jgrid.jqID(frmtborg),nm,cnt=0,tmp,fld,opt,vl,vlc;if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData={};rp_ge[$t.p.id]._savedData[obj.p.id+\"_id\"]=rowid;}var cm=obj.p.colModel;if(rowid=='_empty'){$(cm).each(function(){nm=this.name;opt=$.extend({},this.editoptions||{});fld=$(\"#\"+$.jgrid.jqID(nm),\"#\"+fmid);if(fld&&fld.length&&fld[0]!==null){vl=\"\";if(opt.defaultValue){vl=$.isFunction(opt.defaultValue)?opt.defaultValue.call($t):opt.defaultValue;if(fld[0].type=='checkbox'){vlc=vl.toLowerCase();if(vlc.search(/(false|0|no|off|undefined)/i)<0&&vlc!==\"\"){fld[0].checked=true;fld[0].defaultChecked=true;fld[0].value=vl;}else{fld[0].checked=false;fld[0].defaultChecked=false;}}else{fld.val(vl);}}else{if(fld[0].type=='checkbox'){fld[0].checked=false;fld[0].defaultChecked=false;vl=$(fld).attr(\"offval\");}else if(fld[0].type&&fld[0].type.substr(0,6)=='select'){fld[0].selectedIndex=0;}else{fld.val(vl);}}if(rp_ge[$t.p.id].checkOnSubmit===true||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=vl;}}});$(\"#id_g\",\"#\"+fmid).val(rowid);return;}var tre=$(obj).jqGrid(\"getInd\",rowid,true);if(!tre){return;}$('td[role=\"gridcell\"]',tre).each(function(i){nm=cm[i].name;// hidden fields are included in the form\nif(nm!=='cb'&&nm!=='subgrid'&&nm!=='rn'&&cm[i].editable===true){if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$(this).text();}else{try{tmp=$.unformat.call(obj,$(this),{rowId:rowid,colModel:cm[i]},i);}catch(_){tmp=cm[i].edittype==\"textarea\"?$(this).text():$(this).html();}}if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}if(rp_ge[$t.p.id].checkOnSubmit===true||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=tmp;}nm=$.jgrid.jqID(nm);switch(cm[i].edittype){case\"password\":case\"text\":case\"button\":case\"image\":case\"textarea\":if(tmp==\"&nbsp;\"||tmp==\"&#160;\"||tmp.length==1&&tmp.charCodeAt(0)==160){tmp='';}$(\"#\"+nm,\"#\"+fmid).val(tmp);break;case\"select\":var opv=tmp.split(\",\");opv=$.map(opv,function(n){return $.trim(n);});$(\"#\"+nm+\" option\",\"#\"+fmid).each(function(){if(!cm[i].editoptions.multiple&&($.trim(tmp)==$.trim($(this).text())||opv[0]==$.trim($(this).text())||opv[0]==$.trim($(this).val()))){this.selected=true;}else if(cm[i].editoptions.multiple){if($.inArray($.trim($(this).text()),opv)>-1||$.inArray($.trim($(this).val()),opv)>-1){this.selected=true;}else{this.selected=false;}}else{this.selected=false;}});break;case\"checkbox\":tmp=tmp+\"\";if(cm[i].editoptions&&cm[i].editoptions.value){var cb=cm[i].editoptions.value.split(\":\");if(cb[0]==tmp){$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"checked\",true);$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"defaultChecked\",true);//ie\n}else{$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"checked\",false);$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"defaultChecked\",false);//ie\n}}else{tmp=tmp.toLowerCase();if(tmp.search(/(false|0|no|off|undefined)/i)<0&&tmp!==\"\"){$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"checked\",true);$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"defaultChecked\",true);//ie\n}else{$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"checked\",false);$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp?'prop':'attr'](\"defaultChecked\",false);//ie\n}}break;case'custom':try{if(cm[i].editoptions&&$.isFunction(cm[i].editoptions.custom_value)){cm[i].editoptions.custom_value.call($t,$(\"#\"+nm,\"#\"+fmid),'set',tmp);}else{throw\"e1\";}}catch(e){if(e==\"e1\"){$.jgrid.info_dialog(jQuery.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.nodefined,jQuery.jgrid.edit.bClose);}else{$.jgrid.info_dialog(jQuery.jgrid.errors.errcap,e.message,jQuery.jgrid.edit.bClose);}}break;}cnt++;}});if(cnt>0){$(\"#id_g\",frmtb).val(rowid);}},getFormData:function getFormData(postdata,extpost){var $t=this,gID=$t.p.id,frmgr=\"FrmGrid_\"+gID,frmtborg=\"TblGrid_\"+gID,frmtb=\"#\"+$.jgrid.jqID(frmtborg);$(frmtb+\" > tbody > tr > td > .FormElement\").each(function(){var celm=$(\".customelement\",this);if(celm.length){var elem=celm[0],nm=$(elem).attr('name');$.each($t.p.colModel,function(){if(this.name===nm&&this.editoptions&&$.isFunction(this.editoptions.custom_value)){try{postdata[nm]=this.editoptions.custom_value.call($t,$(\"#\"+$.jgrid.jqID(nm),frmtb),'get');if(postdata[nm]===undefined){throw\"e1\";}}catch(e){if(e===\"e1\"){$.jgrid.info_dialog(jQuery.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.novalue,jQuery.jgrid.edit.bClose);}else{$.jgrid.info_dialog(jQuery.jgrid.errors.errcap,e.message,jQuery.jgrid.edit.bClose);}}return true;}});}else{switch($(this).get(0).type){case\"checkbox\":if($(this).is(\":checked\")){postdata[this.name]=$(this).val();}else{var ofv=$(this).attr(\"offval\");postdata[this.name]=ofv;}break;case\"select-one\":postdata[this.name]=$(\"option:selected\",this).val();extpost[this.name]=$(\"option:selected\",this).text();break;case\"select-multiple\":postdata[this.name]=$(this).val();if(postdata[this.name]){postdata[this.name]=postdata[this.name].join(\",\");}else{postdata[this.name]=\"\";}var selectedText=[];$(\"option:selected\",this).each(function(i,selected){selectedText[i]=$(selected).text();});extpost[this.name]=selectedText.join(\",\");break;case\"password\":case\"text\":case\"textarea\":case\"button\":postdata[this.name]=$(this).val();break;}if($t.p.autoencode){postdata[this.name]=$.jgrid.htmlEncode(postdata[this.name]);}}});return true;},postIt:function postIt(postdata,extpost,frmoper){var $t=this,gID=$t.p.id,frmgr=\"FrmGrid_\"+gID,frmtborg=\"TblGrid_\"+gID,frmtb=\"#\"+$.jgrid.jqID(frmtborg),copydata,ret=[true,\"\",\"\"],onCS={},opers=$t.p.prmNames,idname,oper,key,selr,i;var retvals=$($t).triggerHandler(\"jqGridAddEditBeforeCheckValues\",[$(\"#\"+frmgr),frmoper]);if(retvals&&_typeof(retvals)==='object'){postdata=retvals;}if($.isFunction(rp_ge[$t.p.id].beforeCheckValues)){retvals=rp_ge[$t.p.id].beforeCheckValues.call($t,postdata,$(\"#\"+frmgr),postdata[$t.p.id+\"_id\"]==\"_empty\"?opers.addoper:opers.editoper);if(retvals&&_typeof(retvals)==='object'){postdata=retvals;}}for(key in postdata){if(postdata.hasOwnProperty(key)){ret=$.jgrid.checkValues.call($t,postdata[key],key,$t);if(ret[0]===false){break;}}}$.proxy($.jgrid.setNulls,$t)();if(ret[0]){onCS=$($t).triggerHandler(\"jqGridAddEditClickSubmit\",[rp_ge[$t.p.id],postdata,frmoper]);if(onCS===undefined&&$.isFunction(rp_ge[$t.p.id].onclickSubmit)){onCS=rp_ge[$t.p.id].onclickSubmit.call($t,rp_ge[$t.p.id],postdata)||{};}ret=$($t).triggerHandler(\"jqGridAddEditBeforeSubmit\",[postdata,$(\"#\"+frmgr),frmoper]);if(ret===undefined){ret=[true,\"\",\"\"];}if(ret[0]&&$.isFunction(rp_ge[$t.p.id].beforeSubmit)){ret=rp_ge[$t.p.id].beforeSubmit.call($t,postdata,$(\"#\"+frmgr));}}if(ret[0]&&!rp_ge[$t.p.id].processing){rp_ge[$t.p.id].processing=true;$(\"#sData\",frmtb+\"_2\").addClass('ui-state-active');oper=opers.oper;idname=opers.id;// we add to pos data array the action - the name is oper\npostdata[oper]=$.trim(postdata[$t.p.id+\"_id\"])==\"_empty\"?opers.addoper:opers.editoper;if(postdata[oper]!=opers.addoper){postdata[idname]=postdata[$t.p.id+\"_id\"];}else{// check to see if we have allredy this field in the form and if yes lieve it\nif(postdata[idname]===undefined){postdata[idname]=postdata[$t.p.id+\"_id\"];}}delete postdata[$t.p.id+\"_id\"];postdata=$.extend(postdata,rp_ge[$t.p.id].editData,onCS);if($t.p.treeGrid===true){if(postdata[oper]==opers.addoper){selr=$($t).jqGrid(\"getGridParam\",'selrow');var tr_par_id=$t.p.treeGridModel=='adjacency'?$t.p.treeReader.parent_id_field:'parent_id';postdata[tr_par_id]=selr;}for(i in $t.p.treeReader){if($t.p.treeReader.hasOwnProperty(i)){var itm=$t.p.treeReader[i];if(postdata.hasOwnProperty(itm)){if(postdata[oper]==opers.addoper&&i==='parent_id_field'){continue;}delete postdata[itm];}}}}postdata[idname]=$.jgrid.stripPref($t.p.idPrefix,postdata[idname]);var ajaxOptions=$.extend({url:rp_ge[$t.p.id].url?rp_ge[$t.p.id].url:$($t).jqGrid('getGridParam','editurl'),type:rp_ge[$t.p.id].mtype,data:$.isFunction(rp_ge[$t.p.id].serializeEditData)?rp_ge[$t.p.id].serializeEditData.call($t,postdata):postdata,complete:function complete(data,Status){postdata[idname]=$t.p.idPrefix+postdata[idname];if(Status!=\"success\"){ret[0]=false;ret[1]=$($t).triggerHandler(\"jqGridAddEditErrorTextFormat\",[data,frmoper]);if($.isFunction(rp_ge[$t.p.id].errorTextFormat)){ret[1]=rp_ge[$t.p.id].errorTextFormat.call($t,data);}else{ret[1]=Status+\" Status: '\"+data.statusText+\"'. Error code: \"+data.status;}}else{// data is posted successful\n// execute aftersubmit with the returned data from server\nret=$($t).triggerHandler(\"jqGridAddEditAfterSubmit\",[data,postdata,frmoper]);if(ret===undefined){ret=[true,\"\",\"\"];}if(ret[0]&&$.isFunction(rp_ge[$t.p.id].afterSubmit)){ret=rp_ge[$t.p.id].afterSubmit.call($t,data,postdata);}}if(ret[0]===false){$(\"#FormError>td\",frmtb).html(ret[1]);$(\"#FormError\",frmtb).show();}else{// remove some values if formattaer select or checkbox\n$.each($t.p.colModel,function(){if(extpost[this.name]&&this.formatter&&this.formatter=='select'){try{delete extpost[this.name];}catch(e){}}});postdata=$.extend(postdata,extpost);if($t.p.autoencode){$.each(postdata,function(n,v){postdata[n]=$.jgrid.htmlDecode(v);});}//rp_ge[$t.p.id].reloadAfterSubmit = rp_ge[$t.p.id].reloadAfterSubmit && $t.p.datatype != \"local\";\n// the action is add\nif(postdata[oper]==opers.addoper){//id processing\n// user not set the id ret[2]\nif(!ret[2]){ret[2]=$.jgrid.randId();}postdata[idname]=ret[2];if(rp_ge[$t.p.id].closeAfterAdd){if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger(\"reloadGrid\");}else{if($t.p.treeGrid===true){$($t).jqGrid(\"addChildNode\",ret[2],selr,postdata);}else{$($t).jqGrid(\"addRowData\",ret[2],postdata,p.addedrow);$($t).jqGrid(\"setSelection\",ret[2]);}}$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}else if(rp_ge[$t.p.id].clearAfterAdd){if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger(\"reloadGrid\");}else{if($t.p.treeGrid===true){$($t).jqGrid(\"addChildNode\",ret[2],selr,postdata);}else{$($t).jqGrid(\"addRowData\",ret[2],postdata,p.addedrow);}}$.proxy($.jgrid.fillData,$t)(\"_empty\",$t,frmgr);}else{if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger(\"reloadGrid\");}else{if($t.p.treeGrid===true){$($t).jqGrid(\"addChildNode\",ret[2],selr,postdata);}else{$($t).jqGrid(\"addRowData\",ret[2],postdata,p.addedrow);}}}}else{// the action is update\nif(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger(\"reloadGrid\");if(!rp_ge[$t.p.id].closeAfterEdit){setTimeout(function(){$($t).jqGrid(\"setSelection\",postdata[idname]);},1000);}}else{if($t.p.treeGrid===true){$($t).jqGrid(\"setTreeRow\",postdata[idname],postdata);}else{$($t).jqGrid(\"setRowData\",postdata[idname],postdata);}}if(rp_ge[$t.p.id].closeAfterEdit){$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}}if($.isFunction(rp_ge[$t.p.id].afterComplete)){copydata=data;setTimeout(function(){$($t).triggerHandler(\"jqGridAddEditAfterComplete\",[copydata,postdata,$(\"#\"+frmgr),frmoper]);rp_ge[$t.p.id].afterComplete.call($t,copydata,postdata,$(\"#\"+frmgr));copydata=null;},500);}if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){$(\"#\"+frmgr).data(\"disabled\",false);if(rp_ge[$t.p.id]._savedData[$t.p.id+\"_id\"]!=\"_empty\"){for(var key in rp_ge[$t.p.id]._savedData){if(postdata[key]){rp_ge[$t.p.id]._savedData[key]=postdata[key];}}}}}rp_ge[$t.p.id].processing=false;$(\"#sData\",frmtb+\"_2\").removeClass('ui-state-active');try{$(':input:visible',\"#\"+frmgr)[0].focus();}catch(e){}}},$.jgrid.ajaxOptions,rp_ge[$t.p.id].ajaxEditOptions);if(!ajaxOptions.url&&!rp_ge[$t.p.id].useDataProxy){if($.isFunction($t.p.dataProxy)){rp_ge[$t.p.id].useDataProxy=true;}else{ret[0]=false;ret[1]+=\" \"+$.jgrid.errors.nourl;}}if(ret[0]){if(rp_ge[$t.p.id].useDataProxy){var dpret=$t.p.dataProxy.call($t,ajaxOptions,\"set_\"+$t.p.id);if(typeof dpret==\"undefined\"){dpret=[true,\"\"];}if(dpret[0]===false){ret[0]=false;ret[1]=dpret[1]||\"Error deleting the selected row!\";}else{if(ajaxOptions.data.oper==opers.addoper&&rp_ge[$t.p.id].closeAfterAdd){$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}if(ajaxOptions.data.oper==opers.editoper&&rp_ge[$t.p.id].closeAfterEdit){$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}}}else{$.ajax(ajaxOptions);}}}if(ret[0]===false){$(\"#FormError>td\",frmtb).html(ret[1]);$(\"#FormError\",frmtb).show();// return;\n}},setNulls:function setNulls(){var $t=this;$.each($t.p.colModel,function(i,n){if(n.editoptions&&n.editoptions.NullIfEmpty===true){if(postdata.hasOwnProperty(n.name)&&postdata[n.name]===\"\"){postdata[n.name]='null';}}});},compareData:function compareData(nObj,oObj){var ret=false,key;for(key in nObj){if(nObj[key]!=oObj[key]){ret=true;break;}}return ret;},checkUpdates:function checkUpdates(extpost){var $t=this,gID=$t.p.id,frmgr=\"FrmGrid_\"+gID,frmtborg=\"TblGrid_\"+gID,frmtb=\"#\"+$.jgrid.jqID(frmtborg),stat=true;$(\"#FormError\",frmtb).hide();if(rp_ge[$t.p.id].checkOnUpdate){postdata={};extpost={};$.proxy($.jgrid.getFormData,$t)(postdata,extpost);newData=$.extend({},postdata,extpost);diff=$.proxy($.jgrid.compareData,$t)(newData,rp_ge[$t.p.id]._savedData);if(diff){$(\"#\"+frmgr).data(\"disabled\",true);$(\".confirm\",\"#\"+IDs.themodal).show();stat=false;}}return stat;},restoreInline:function restoreInline(rowid){var $t=this;if(rowid!==\"_empty\"&&typeof $t.p.savedRow!==\"undefined\"&&$t.p.savedRow.length>0&&$.isFunction($.fn.jqGrid.restoreRow)){for(var i=0;i<$t.p.savedRow.length;i++){if($t.p.savedRow[i].id==rowid){$($t).jqGrid('restoreRow',rowid);break;}}}},updateNav:function updateNav(cr,totr){var $t=this,gID=$t.p.id,frmgr=\"FrmGrid_\"+gID,frmtborg=\"TblGrid_\"+gID,frmtb=\"#\"+$.jgrid.jqID(frmtborg);if(cr===0){$($.fn.jqGrid.rup.edit.navigation.back.id,frmtb+\"_2\").addClass('ui-state-disabled');}else{$($.fn.jqGrid.rup.edit.navigation.back.id,frmtb+\"_2\").removeClass('ui-state-disabled');}if(cr==totr){$($.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").addClass('ui-state-disabled');}else{$($.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").removeClass('ui-state-disabled');}},getCurrPos:function getCurrPos(){var $t=this,gID=$t.p.id,frmgr=\"FrmGrid_\"+gID,frmtborg=\"TblGrid_\"+gID,frmtb=\"#\"+$.jgrid.jqID(frmtborg),rowsInGrid=$($t).jqGrid(\"getDataIDs\"),selrow=$(\"#id_g\",frmtb).val(),pos=$.inArray(selrow,rowsInGrid);return[pos,rowsInGrid];}});/*\r\n\t * MODIFICACIONES\r\n\t * Funciones extendidas (MODIFICADAS) del componente jqGrid.\r\n\t * \r\n\t * Los métodos aquí indicados han sido extendidos partiendo de la implementación original.\r\n\t * Las modificaciones han sido realizadas debido a la incompatibilidad de su implementación con los requisitos exigidos.\r\n\t * \r\n\t * Los métodos extendidos para su modificación son los siguientes:\r\n\t * \r\n\t * - editGridRow\r\n\t */$.jgrid.extend({editGridRow:function editGridRow(rowid,p){p=$.extend({top:0,left:0,width:300,height:'auto',dataheight:'auto',modal:false,overlay:30,drag:true,resize:true,url:null,mtype:\"POST\",clearAfterAdd:true,closeAfterEdit:false,reloadAfterSubmit:true,onInitializeForm:null,beforeInitData:null,beforeShowForm:null,afterShowForm:null,beforeSubmit:null,afterSubmit:null,onclickSubmit:null,afterComplete:null,onclickPgButtons:null,afterclickPgButtons:null,editData:{},recreateForm:false,jqModal:true,closeOnEscape:false,addedrow:\"first\",topinfo:'',bottominfo:'',saveicon:[],closeicon:[],savekey:[false,13],navkeys:[false,38,40],checkOnSubmit:false,checkOnUpdate:false,_savedData:{},processing:false,onClose:null,ajaxEditOptions:{},serializeEditData:null,viewPagerButtons:true},$.jgrid.edit,p||{});rp_ge[$(this)[0].p.id]=p;return this.each(function(){var $t=this;if(!$t.grid||!rowid){return;}var gID=$t.p.id,frmgr=\"FrmGrid_\"+gID,frmtborg=\"TblGrid_\"+gID,frmtb=\"#\"+$.jgrid.jqID(frmtborg),IDs={themodal:'editmod'+gID,modalhead:'edithd'+gID,modalcontent:'editcnt'+gID,scrollelm:frmgr},onBeforeShow=$.isFunction(rp_ge[$t.p.id].beforeShowForm)?rp_ge[$t.p.id].beforeShowForm:false,onAfterShow=$.isFunction(rp_ge[$t.p.id].afterShowForm)?rp_ge[$t.p.id].afterShowForm:false,onBeforeInit=$.isFunction(rp_ge[$t.p.id].beforeInitData)?rp_ge[$t.p.id].beforeInitData:false,onInitializeForm=$.isFunction(rp_ge[$t.p.id].onInitializeForm)?rp_ge[$t.p.id].onInitializeForm:false,showFrm=true,maxCols=1,maxRows=0,postdata,extpost,newData,diff,frmoper;frmgr=$.jgrid.jqID(frmgr);if(rowid===\"new\"){rowid=\"_empty\";frmoper=\"add\";p.caption=rp_ge[$t.p.id].addCaption;}else{p.caption=rp_ge[$t.p.id].editCaption;frmoper=\"edit\";}if(p.recreateForm===true&&$(\"#\"+$.jgrid.jqID(IDs.themodal))[0]!==undefined){$(\"#\"+$.jgrid.jqID(IDs.themodal)).remove();}var closeovrl=true;if(p.checkOnUpdate&&p.jqModal&&!p.modal){closeovrl=false;}if($(\"#\"+$.jgrid.jqID(IDs.themodal))[0]!==undefined){showFrm=$($t).triggerHandler(\"jqGridAddEditBeforeInitData\",[$(\"#\"+$.jgrid.jqID(frmgr)),frmoper]);if(typeof showFrm==\"undefined\"){showFrm=true;}if(showFrm&&onBeforeInit){showFrm=onBeforeInit.call($t,$(\"#\"+frmgr));}if(showFrm===false){return;}/* MOD */$.proxy($.jgrid.restoreInline,$t)(rowid);$(\".ui-jqdialog-title\",\"#\"+$.jgrid.jqID(IDs.modalhead)).html(p.caption);$(\"#FormError\",frmtb).hide();if(rp_ge[$t.p.id].topinfo){$(\".topinfo\",frmtb).html(rp_ge[$t.p.id].topinfo);$(\".tinfo\",frmtb).show();}else{$(\".tinfo\",frmtb).hide();}if(rp_ge[$t.p.id].bottominfo){$(\".bottominfo\",frmtb+\"_2\").html(rp_ge[$t.p.id].bottominfo);$(\".binfo\",frmtb+\"_2\").show();}else{$(\".binfo\",frmtb+\"_2\").hide();}/* MOD */$.proxy($.jgrid.fillData,$t)(rowid,$t,frmgr);///\nif(rowid==\"_empty\"||!rp_ge[$t.p.id].viewPagerButtons){$($.fn.jqGrid.rup.edit.navigation.back.id+\",\"+$.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").hide();}else{$($.fn.jqGrid.rup.edit.navigation.back.id+\",\"+$.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").show();}if(rp_ge[$t.p.id].processing===true){rp_ge[$t.p.id].processing=false;$(\"#sData\",frmtb+\"_2\").removeClass('ui-state-active');}if($(\"#\"+frmgr).data(\"disabled\")===true){$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();$(\"#\"+frmgr).data(\"disabled\",false);}$($t).triggerHandler(\"jqGridAddEditBeforeShowForm\",[$(\"#\"+frmgr),frmoper]);if(onBeforeShow){onBeforeShow.call($t,$(\"#\"+frmgr));}$(\"#\"+$.jgrid.jqID(IDs.themodal)).data(\"onClose\",rp_ge[$t.p.id].onClose);$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,jqM:false,overlay:p.overlay,modal:p.modal});if(!closeovrl){$(\".jqmOverlay\").click(function(){/* MOD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}$($t).triggerHandler(\"jqGridAddEditAfterShowForm\",[$(\"#\"+frmgr),frmoper]);if(onAfterShow){onAfterShow.call($t,$(\"#\"+frmgr));}}else{var dh=isNaN(p.dataheight)?p.dataheight:p.dataheight+\"px\",frm=$(\"<form name='FormPost' id='\"+frmgr+\"' class='FormGrid' onSubmit='return false;' style='width:100%;overflow:auto;position:relative;height:\"+dh+\";'></form>\").data(\"disabled\",false),tbl=$(\"<table id='\"+frmtborg+\"' class='EditTable' cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>\");showFrm=$($t).triggerHandler(\"jqGridAddEditBeforeInitData\",[$(\"#\"+frmgr),frmoper]);if(typeof showFrm==\"undefined\"){showFrm=true;}if(showFrm&&onBeforeInit){showFrm=onBeforeInit.call($t,$(\"#\"+frmgr));}if(showFrm===false){return;}/* MOD\t*/$.proxy($.jgrid.restoreInline,$t)(rowid);$($t.p.colModel).each(function(){var fmto=this.formoptions;maxCols=Math.max(maxCols,fmto?fmto.colpos||0:0);maxRows=Math.max(maxRows,fmto?fmto.rowpos||0:0);});$(frm).append(tbl);var flr=$(\"<tr id='FormError' style='display:none'><td class='ui-state-error' colspan='\"+maxCols*2+\"'></td></tr>\");flr[0].rp=0;$(tbl).append(flr);//topinfo\nflr=$(\"<tr style='display:none' class='tinfo'><td class='topinfo' colspan='\"+maxCols*2+\"'>\"+rp_ge[$t.p.id].topinfo+\"</td></tr>\");flr[0].rp=0;$(tbl).append(flr);// set the id.\n// use carefull only to change here colproperties.\n// create data\nvar rtlb=$t.p.direction==\"rtl\"?true:false,bp=rtlb?$.fn.jqGrid.rup.edit.navigation.forward.id:$.fn.jqGrid.rup.edit.navigation.back.id,bn=rtlb?$.fn.jqGrid.rup.edit.navigation.back.id:$.fn.jqGrid.rup.edit.navigation.forward.id;/* MOD */$.proxy($.jgrid.createData,$t)(rowid,$t,tbl,maxCols);// buttons at footer\nvar bP=\"<a href='javascript:void(0)' id='\"+bp+\"' class='fm-button ui-state-default ui-corner-left'><span class='ui-icon ui-icon-triangle-1-w'></span></a>\",bN=\"<a href='javascript:void(0)' id='\"+bn+\"' class='fm-button ui-state-default ui-corner-right'><span class='ui-icon ui-icon-triangle-1-e'></span></a>\",bS=\"<a href='javascript:void(0)' id='sData' class='fm-button ui-state-default ui-corner-all'>\"+p.bSubmit+\"</a>\",bC=\"<a href='javascript:void(0)' id='cData' class='fm-button ui-state-default ui-corner-all'>\"+p.bCancel+\"</a>\";var bt=\"<table border='0' cellspacing='0' cellpadding='0' class='EditTable' id='\"+frmtborg+\"_2'><tbody><tr><td colspan='2'><hr class='ui-widget-content' style='margin:1px'/></td></tr><tr id='Act_Buttons'><td class='navButton'>\"+(rtlb?bN+bP:bP+bN)+\"</td><td class='EditButton'>\"+bS+bC+\"</td></tr>\";bt+=\"<tr style='display:none' class='binfo'><td class='bottominfo' colspan='2'>\"+rp_ge[$t.p.id].bottominfo+\"</td></tr>\";bt+=\"</tbody></table>\";if(maxRows>0){var sd=[];$.each($(tbl)[0].rows,function(i,r){sd[i]=r;});sd.sort(function(a,b){if(a.rp>b.rp){return 1;}if(a.rp<b.rp){return-1;}return 0;});$.each(sd,function(index,row){$('tbody',tbl).append(row);});}p.gbox=\"#gbox_\"+$.jgrid.jqID(gID);var cle=false;if(p.closeOnEscape===true){p.closeOnEscape=false;cle=true;}var tms=$(\"<span></span>\").append(frm).append(bt);$.jgrid.createModal(IDs,tms,p,\"#gview_\"+$.jgrid.jqID($t.p.id),$(\"#gbox_\"+$.jgrid.jqID($t.p.id))[0]);if(rtlb){$($.fn.jqGrid.rup.edit.navigation.back.id+\",\"+$.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").css(\"float\",\"right\");$(\".EditButton\",frmtb+\"_2\").css(\"text-align\",\"left\");}if(rp_ge[$t.p.id].topinfo){$(\".tinfo\",frmtb).show();}if(rp_ge[$t.p.id].bottominfo){$(\".binfo\",frmtb+\"_2\").show();}tms=null;bt=null;$(\"#\"+$.jgrid.jqID(IDs.themodal)).keydown(function(e){var wkey=e.target;if($(\"#\"+frmgr).data(\"disabled\")===true){return false;}//??\nif(rp_ge[$t.p.id].savekey[0]===true&&e.which==rp_ge[$t.p.id].savekey[1]){// save\nif(wkey.tagName!=\"TEXTAREA\"){$(\"#sData\",frmtb+\"_2\").trigger(\"click\");return false;}}if(e.which===27){/* MOD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}if(cle){$.jgrid.hideModal(this,{gb:p.gbox,jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}return false;}if(rp_ge[$t.p.id].navkeys[0]===true){if($(\"#id_g\",frmtb).val()==\"_empty\"){return true;}if(e.which==rp_ge[$t.p.id].navkeys[1]){//up\n$($.fn.jqGrid.rup.edit.navigation.back.id,frmtb+\"_2\").trigger(\"click\");return false;}if(e.which==rp_ge[$t.p.id].navkeys[2]){//down\n$($.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").trigger(\"click\");return false;}}});if(p.checkOnUpdate){$(\"a.ui-jqdialog-titlebar-close span\",\"#\"+$.jgrid.jqID(IDs.themodal)).removeClass(\"jqmClose\");$(\"a.ui-jqdialog-titlebar-close\",\"#\"+$.jgrid.jqID(IDs.themodal)).unbind(\"click\").click(function(){/* MOD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}p.saveicon=$.extend([true,\"left\",\"ui-icon-disk\"],p.saveicon);p.closeicon=$.extend([true,\"left\",\"ui-icon-close\"],p.closeicon);// beforeinitdata after creation of the form\nif(p.saveicon[0]===true){$(\"#sData\",frmtb+\"_2\").addClass(p.saveicon[1]==\"right\"?'fm-button-icon-right':'fm-button-icon-left').append(\"<span class='ui-icon \"+p.saveicon[2]+\"'></span>\");}if(p.closeicon[0]===true){$(\"#cData\",frmtb+\"_2\").addClass(p.closeicon[1]==\"right\"?'fm-button-icon-right':'fm-button-icon-left').append(\"<span class='ui-icon \"+p.closeicon[2]+\"'></span>\");}if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){bS=\"<a href='javascript:void(0)' id='sNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>\"+p.bYes+\"</a>\";bN=\"<a href='javascript:void(0)' id='nNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>\"+p.bNo+\"</a>\";bC=\"<a href='javascript:void(0)' id='cNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>\"+p.bExit+\"</a>\";var ii,zI=p.zIndex||999;zI++;if($.browser.msie&&$.browser.version==6){ii='<iframe style=\"display:block;position:absolute;z-index:-1;filter:Alpha(Opacity=\\'0\\');\" src=\"javascript:false;\"></iframe>';}else{ii=\"\";}$(\"<div class='ui-widget-overlay jqgrid-overlay confirm' style='z-index:\"+zI+\";display:none;'>&#160;\"+ii+\"</div><div class='confirm ui-widget-content ui-jqconfirm' style='z-index:\"+(zI+1)+\"'>\"+p.saveData+\"<br/><br/>\"+bS+bN+bC+\"</div>\").insertAfter(\"#\"+frmgr);$(\"#sNew\",\"#\"+$.jgrid.jqID(IDs.themodal)).click(function(){/* MOD */$.proxy($.jgrid.postIt,$t)(postdata,extpost,frmoper);$(\"#\"+frmgr).data(\"disabled\",false);$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();return false;});$(\"#nNew\",\"#\"+$.jgrid.jqID(IDs.themodal)).click(function(){$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();$(\"#\"+frmgr).data(\"disabled\",false);setTimeout(function(){$(\":input\",\"#\"+frmgr)[0].focus();},0);return false;});$(\"#cNew\",\"#\"+$.jgrid.jqID(IDs.themodal)).click(function(){$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();$(\"#\"+frmgr).data(\"disabled\",false);$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}// here initform - only once\n$($t).triggerHandler(\"jqGridAddEditInitializeForm\",[$(\"#\"+frmgr),frmoper]);if(onInitializeForm){onInitializeForm.call($t,$(\"#\"+frmgr));}if(rowid==\"_empty\"||!rp_ge[$t.p.id].viewPagerButtons){$($.fn.jqGrid.rup.edit.navigation.back.id+\",\"+$.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").hide();}else{$($.fn.jqGrid.rup.edit.navigation.back.id+\",\"+$.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").show();}$($t).triggerHandler(\"jqGridAddEditBeforeShowForm\",[$(\"#\"+frmgr),frmoper]);if(onBeforeShow){onBeforeShow.call($t,$(\"#\"+frmgr));}$(\"#\"+$.jgrid.jqID(IDs.themodal)).data(\"onClose\",rp_ge[$t.p.id].onClose);$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,overlay:p.overlay,modal:p.modal});if(!closeovrl){$(\".jqmOverlay\").click(function(){/* MOD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}$($t).triggerHandler(\"jqGridAddEditAfterShowForm\",[$(\"#\"+frmgr),frmoper]);if(onAfterShow){onAfterShow.call($t,$(\"#\"+frmgr));}$(\".fm-button\",\"#\"+$.jgrid.jqID(IDs.themodal)).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});$(\"#sData\",frmtb+\"_2\").click(function(){postdata={};extpost={};$(\"#FormError\",frmtb).hide();// all depend on ret array\n//ret[0] - succes\n//ret[1] - msg if not succes\n//ret[2] - the id  that will be set if reload after submit false\n/* MOD */$.proxy($.jgrid.getFormData,$t)(postdata,extpost);/* MOD */if(postdata[$t.p.id+\"_id\"]==\"_empty\"){$.proxy($.jgrid.postIt,$t)(postdata,extpost,frmoper);}else if(p.checkOnSubmit===true){newData=$.extend({},postdata,extpost);diff=$.proxy($.jgrid.compareData,$t)(newData,rp_ge[$t.p.id]._savedData);if(diff){$(\"#\"+frmgr).data(\"disabled\",true);$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).show();}else{/* MOD */$.proxy($.jgrid.postIt,$t)(postdata,extpost,frmoper);}}else{/* MOD */$.proxy($.jgrid.postIt,$t)(postdata,extpost,frmoper);}return false;});$(\"#cData\",frmtb+\"_2\").click(function(){/* MOD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});$($.fn.jqGrid.rup.edit.navigation.forward.id,frmtb+\"_2\").click(function(){/* MOD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$(\"#FormError\",frmtb).hide();/* MOD */var npos=$.proxy($.jgrid.getCurrPos,$t)();npos[0]=parseInt(npos[0],10);if(npos[0]!=-1&&npos[1][npos[0]+1]){$($t).triggerHandler(\"jqGridAddEditClickPgButtons\",['next',$(\"#\"+frmgr),npos[1][npos[0]]]);var nposret=true;if($.isFunction(p.onclickPgButtons)){nposret=p.onclickPgButtons.call($t,'next',$(\"#\"+frmgr),npos[1][npos[0]]);if(nposret!==undefined&&nposret===false){return false;}}if($(\"#\"+$.jgrid.jqID(npos[1][npos[0]+1])).hasClass('ui-state-disabled')){return false;}/* MOD */$.proxy($.jgrid.fillData,$t)(npos[1][npos[0]+1],$t,frmgr);$($t).jqGrid(\"setSelection\",npos[1][npos[0]+1]);$($t).triggerHandler(\"jqGridAddEditAfterClickPgButtons\",['next',$(\"#\"+frmgr),npos[1][npos[0]]]);if($.isFunction(p.afterclickPgButtons)){p.afterclickPgButtons.call($t,'next',$(\"#\"+frmgr),npos[1][npos[0]+1]);}/* MOD */$.proxy($.jgrid.updateNav,$t)(npos[0]+1,npos[1].length-1);}return false;});$($.fn.jqGrid.rup.edit.navigation.back.id,frmtb+\"_2\").click(function(){/* MOD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$(\"#FormError\",frmtb).hide();/* MOD */var ppos=$.proxy($.jgrid.getCurrPos,$t)();if(ppos[0]!=-1&&ppos[1][ppos[0]-1]){$($t).triggerHandler(\"jqGridAddEditClickPgButtons\",['prev',$(\"#\"+frmgr),ppos[1][ppos[0]]]);var pposret=true;if($.isFunction(p.onclickPgButtons)){pposret=p.onclickPgButtons.call($t,'prev',$(\"#\"+frmgr),ppos[1][ppos[0]]);if(pposret!==undefined&&pposret===false){return false;}}if($(\"#\"+$.jgrid.jqID(ppos[1][ppos[0]-1])).hasClass('ui-state-disabled')){return false;}/* MOD */$.proxy($.jgrid.fillData,$t)(ppos[1][ppos[0]-1],$t,frmgr);$($t).jqGrid(\"setSelection\",ppos[1][ppos[0]-1]);$($t).triggerHandler(\"jqGridAddEditAfterClickPgButtons\",['prev',$(\"#\"+frmgr),ppos[1][ppos[0]]]);if($.isFunction(p.afterclickPgButtons)){p.afterclickPgButtons.call($t,'prev',$(\"#\"+frmgr),ppos[1][ppos[0]-1]);}/* MOD */$.proxy($.jgrid.updateNav,$t)(ppos[0]-1,ppos[1].length-1);}return false;});}/* MOD */var posInit=$.proxy($.jgrid.getCurrPos,$t)();/* MOD */$.proxy($.jgrid.updateNav,$t)(posInit[0],posInit[1].length-1);});}});$.fn.jqGrid.rup={};$.fn.jqGrid.rup.edit={navigation:{forward:{id:\"#nData\"},back:{id:\"#pData\"}}};})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito, \r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */(function($){jQuery.jgrid.fluid={fluidWidth:function fluidWidth(options){var grid=$(this);var settings=$.extend({fluidBaseLayer:\"#gbox_\"+grid.attr(\"id\"),fluidOffset:0,minWidth:null,maxWidth:null},options||{});var resizeLayer=function resizeLayer(layer,forceEvent){var currentWidth=layer.width(),previousWidth=$(layer).data(\"previousWidth\"),evntCurrentWidth=currentWidth;if(forceEvent===true||currentWidth!=previousWidth){$(layer).data(\"previousWidth\",currentWidth);evntCurrentWidth=settings.minWidth!==null&&currentWidth<settings.minWidth?settings.minWidth:evntCurrentWidth;evntCurrentWidth=settings.maxWidth!==null&&currentWidth>settings.maxWidth?settings.maxWidth:evntCurrentWidth;grid.trigger(\"fluidWidth.resize\",[previousWidth,evntCurrentWidth-settings.fluidOffset]);}};// Comprobamos si se esta monitorizando la anchura de la capa\nif($(settings.fluidBaseLayer).data(\"fluidWidth\")!==true){//Inidicamos que la capa esta siendo monitorizada\n$(settings.fluidBaseLayer).data(\"fluidWidth\",true);setInterval(function(){resizeLayer($(settings.fluidBaseLayer),false);},100);}resizeLayer($(settings.fluidBaseLayer),true);}};})(jQuery);jQuery.fn.extend({fluidWidth:jQuery.jgrid.fluid.fluidWidth});/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /**\r\n * Tiene como objetivo mostrar al usuario de manera gráfica el estado de avance de una tarea o proceso.\r\n *\r\n * @summary Componente RUP Table.\r\n * @module rup_jqtable\r\n * @see El componente está basado en el plugin {@link http://www.trirand.com/blog/|jQuery Grid Plugin – jqGrid}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://www.trirand.com/jqgridwiki/doku.php|aquí}.\r\n * @example\r\n *\r\n * var properties = {\r\n *\t\turl: \"../tableUrl\",\r\n *\t\tcolNames: [\r\n *\t\t\t\"id\",\"nombre\",\"...\"]\r\n *\t\t],\r\n *\t\tcolModel: [\r\n *\t\t\t{name: \"id\", label: \"id\"},\r\n *\t\t\t{name: \"nombre\", label: \"nombre\"},\r\n *\t\t\t{name: \"...\", label: \"...\"}\r\n *\t\t],\r\n *\t\tmodel:\"Usuario\",\r\n *\t\tusePlugins:[\r\n *\t\t\t\"formEdit\",\r\n *\t\t\t\"feedback\",\r\n *\t\t\t\"toolbar\",\r\n *\t\t\t\"contextMenu\",\r\n *\t\t\t\"fluid\",\r\n *\t\t\t\"filter\",\r\n *\t\t\t\"search\"\r\n *\t\t],\r\n *\t\tprimaryKey: \"id\"\r\n *\t};\r\n *\r\n * $(\"#jqtable\").rup_jqtable(properties);\r\n */ /*global jQuery */(function($){//*****************************************************************************************************************\n// DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n//*****************************************************************************************************************\nvar rup_jqtable={};rup_jqtable.plugins=[];jQuery.rup_jqtable=jQuery.rup_jqtable||{};jQuery.extend(jQuery.rup_jqtable,{registerPlugin:function registerPlugin(name,settings){if(jQuery.inArray(name,rup_jqtable.plugins)===-1){rup_jqtable.plugins.push(name);rup_jqtable.plugins[name]=settings;}}});//Se configura el arranque de UDA para que alberge el nuevo patrón\njQuery.extend(jQuery.rup.iniRup,jQuery.rup.rupSelectorObjectConstructor('rup_jqtable',rup_jqtable));$.fn.fmatter.rup_combo=function(cellval,opts,rwd,act){var labelProp,label,settings;var formatterData=$(this).data('rup.jqtable.formatter')!==undefined?$(this).data('rup.jqtable.formatter'):{};// Se añade la info del formatter\nvar formatterObj={};formatterObj['rup_combo']={value:cellval};//\t\tformatterObj[\"rup_combo\"] = cellval;\n// Se añade la info de la columna\nvar colFormatter={};colFormatter[opts.colModel.name]=formatterObj;// Se añade el id de la fila\nvar rowObj={};rowObj[opts.rowId]=colFormatter;if(opts.colModel.formatoptions&&opts.colModel.formatoptions.labelName){labelProp=opts.colModel.formatoptions.labelName;label=$.rup_utils.getJson(rwd,labelProp);}else{if(typeof opts.colModel.editoptions.source==='string'){// Combo remoto\n// Obtener la propiedad que corresponde al texto a visualizar\nif(opts.colModel.name.indexOf('.')!==-1){labelProp=opts.colModel.name.substring(0,opts.colModel.name.lastIndexOf('.'))+'.'+opts.colModel.editoptions.sourceParam.label;}else{labelProp=opts.colModel.editoptions.sourceParam.label;}label=$.rup_utils.getJson(rwd,labelProp);}else{// Combo local\nvar labelArr=$.grep(opts.colModel.editoptions.source,function(elem,index){if(elem.value===cellval){return true;}});if(labelArr.length===1){if(labelArr[0].i18nCaption){label=$.rup.i18nParse($.rup.i18n.app[settings.i18nId],labelArr[0].i18nCaption);}else{label=labelArr[0].label;}}}}formatterObj['rup_combo']['label']=label;$.extend(true,formatterData,rowObj);$(this).data('rup.jqtable.formatter',formatterData);return label||'';};$.fn.fmatter.rup_combo.unformat=function(cellvalue,options){var val=$(this).data('rup.jqtable.formatter')[options.rowId][options.colModel.name]['rup_combo']['value'];return val||'';};$.fn.fmatter.rup_autocomplete=function(cellval,opts,rwd,act){var labelProp,label,settings;var formatterData=$(this).data('rup.jqtable.formatter')!==undefined?$(this).data('rup.jqtable.formatter'):{};// Se añade la info del formatter\nvar formatterObj={};formatterObj['rup_autocomplete']={value:cellval};//\t\tformatterObj[\"rup_combo\"] = cellval;\n// Se añade la info de la columna\nvar colFormatter={};colFormatter[opts.colModel.name]=formatterObj;// Se añade el id de la fila\nvar rowObj={};rowObj[opts.rowId]=colFormatter;if(opts.colModel.formatoptions&&opts.colModel.formatoptions.labelName){labelProp=opts.colModel.formatoptions.labelName;label=$.rup_utils.getJson(rwd,labelProp);}else{if(typeof opts.colModel.editoptions.source==='string'){// Combo remoto\n// Obtener la propiedad que corresponde al texto a visualizar\nif(opts.colModel.name.indexOf('.')!==-1){labelProp=opts.colModel.name.substring(0,opts.colModel.name.lastIndexOf('.'))+'.'+opts.colModel.editoptions.sourceParam.label;}else{labelProp=opts.colModel.editoptions.sourceParam.label;}label=$.rup_utils.getJson(rwd,labelProp);}else{// Combo local\nvar labelArr=$.grep(opts.colModel.editoptions.source,function(elem,index){if(elem.value===cellval){return true;}});if(labelArr.length===1){if(labelArr[0].i18nCaption){label=$.rup.i18nParse($.rup.i18n.app[settings.i18nId],labelArr[0].i18nCaption);}else{label=labelArr[0].label;}}}}formatterObj['rup_autocomplete']['label']=label;$.extend(true,formatterData,rowObj);$(this).data('rup.jqtable.formatter',formatterData);return label||'';};$.fn.fmatter.rup_autocomplete.unformat=function(cellvalue,options){var val=$(this).data('rup.jqtable.formatter')[options.rowId][options.colModel.name]['rup_autocomplete']['value'];return val||'';};/*\r\n   * SOBREESCITURAS\r\n   * Funciones extendidas (SOBREESCRITAS) del componente jqGrid\r\n   *\r\n   * Los métodos aquí indicados han sido extendidos y su implementación sustituida por completo.\r\n   * La extensión ha sido realizada para ajustar el comportamiento del componente jqGrid a los requisitos exigidos.\r\n   *\r\n   * Los métodos extendidos para su modificación son los siguientes:\r\n   *\r\n   * - createModal\r\n   * - hideModal\r\n   * - viewModal\r\n   */jQuery.extend(jQuery.jgrid,{createModal:function createModal(aIDs,content,p,insertSelector,posSelector,appendsel,css){// aIDs: Identificadores de la modal\n// -- aIDs.modalcontent :\n// -- aIDs.modalhead :\n// -- aIDs.scrollelm :\n// -- aIDs.themodal :\n// content: Contenido HTML del díalogo\n// p: parámetros de configuración del diálogo\n// insertSelector: selector que corresponde al elemento despues del que se va a insertar la modal\n// posSelector: elemento base sobre el que se calcula la posición\nvar $divModal=jQuery('<div></div>').attr('id',aIDs.themodal).append($(content));var $scrollelm=$divModal.find('#'+aIDs.scrollelm);$divModal.insertBefore($(insertSelector));/* TODO : Añadir los parametros de configruación que puedan añadirse al rup_dialog. */$divModal.rup_dialog({type:$.rup.dialog.DIV,autoOpen:false,modal:true,resizable:p.resize,title:p.caption,width:p.width,buttons:p.buttons});// Eliminamos los eventos del boton de cerrar para mostrar el gestor de cambios\nif(jQuery.isFunction(p.onClose)){jQuery('.ui-dialog-titlebar-close, a:has(#closeText_'+$divModal.first()[0].id+')',$divModal.parent()).off('click').on('click',function(event){p.onClose.call(event);});// Se elimina el evento de cerrar al texto de cierre del dialogo y se asigna el evento de la gestion de cambios.\n//\t\t\t\tprop.detailDiv.parent().find(\"#closeText_\" + prop.detailDiv.first()[0].id).parent().unbind('click').bind(\"click\", function () {\n//\t\t\t\t\tself._checkDetailFormModifications(function(){\n//\t\t\t\t\t\tprop.detailDiv.rup_dialog(\"close\");\n//\t\t\t\t\t});\n//\t\t\t\t});\n// Se elimina el evento de cerrar al icono de cierre del dialogo y se asigna el evento de la gestion de cambios.\n//\t\t\t\tprop.detailDiv.parent().find(\".ui-dialog-titlebar-close\").unbind('click').bind(\"click\", function () {\n//\t\t\t\t\tself._checkDetailFormModifications(function(){\n//\t\t\t\t\t\tprop.detailDiv.rup_dialog(\"close\");\n//\t\t\t\t\t});\n//\t\t\t\t});\n}jQuery('#'+aIDs.scrollelm+'_2').addClass('botoneraModal');jQuery('.fm-button','#'+aIDs.scrollelm+'_2').on({focusin:function focusin(){jQuery(this).addClass('ui-state-focus');},focusout:function focusout(){jQuery(this).removeClass('ui-state-focus');}});},hideModal:function hideModal(selector,o){jQuery(selector).rup_dialog('close');},viewModal:function viewModal(selector,o){jQuery(selector).rup_dialog('open');}});jQuery.extend(jQuery.rup_jqtable,{proxyAjax:function proxyAjax(ajaxOptions,identifier){jQuery.rup_ajax(ajaxOptions);}});/* ******************************\r\n   * FUNCIONES DE CONFIGURACION\r\n   * ******************************/jQuery.fn.rup_jqtable('extend',{/**\r\n     * Metodo que realiza la pre-configuración del core del componente RUP Table.\r\n     * Este método se ejecuta antes de la pre-configuración de los plugins y de la invocación al componente jqGrid.\r\n     *\r\n     * @name preConfigureCore\r\n     * @function\r\n     * @param {object} settings - Parámetros de configuración del componente.\r\n     * @fires module:rup_jqtable#rupTable_checkOutOfGrid\r\n     * @fires module:rup_jqtable#rupTable_serializeGridData\r\n     * @fires module:rup_jqtable#rupTable_beforeProcessing\r\n     */preConfigureCore:function preConfigureCore(settings){var $self=this,colModel,colModelObj;// Configuración del parámetro url\nsettings.baseUrl=settings.url;// Ajuste en caso de no utilizar el plugin de filter\nif(jQuery.inArray('filter',settings.usePlugins)===-1){settings.url+='/filter';}// Se almacena el identificador del objeto en la propiedad settings.id\nsettings.id=$self.attr('id');// Se da valor a la propiedad ruptype\n$self.attr('ruptype','jqtable');settings.core.tableDiv=settings.id+'_div';settings.core.$tableDiv=jQuery('#'+settings.core.tableDiv);jQuery(document).bind('click',function(event){var $originalTarget=jQuery(event.target);if($originalTarget.parents().index(settings.core.$tableDiv)===-1){$self.triggerHandler('rupTable_checkOutOfGrid',[event,$originalTarget]);}});/*\r\n       * Configuración de los identificadores por defecto de los componentes del rup_jqtable\r\n       */if(settings.pager!==false){settings.pager=$.rup_utils.getJQueryId(settings.pager!==null?settings.pager:settings.id+'_pager');settings.$pager=jQuery(settings.pager);if(settings.$pager.length===0){alert('El identificador '+settings.pager+' especificado para el paginador no existe.');}}colModel=settings.colModel;if(settings.loadOnStartUp===false||settings.multifilter!=undefined){$self.data('tmp.loadOnStartUp.datatype',settings.datatype);settings.datatype='clientSide';}// Configuración del colModel para los campos sobre los que se debe de configurar un componente RUP\nfor(var i=0;i<colModel.length;i++){colModelObj=colModel[i];// Se comprueba para cada uno de las entradas en el colModel si se debe de crear un componente RUP\nif(colModelObj.rupType!==undefined&&colModelObj.rupType!==null){// En caso de tratarse de un componente RUP\n// Se indica como edittype=\"custom\" para que jqGrid lo trate como un componente personalizado\ncolModelObj.edittype='custom';// Si no se ha especificado una funcion custom_element se asigna la función genérica correspondiente a un componente RUP\nif(!jQuery.isFunction(colModelObj.editoptions.custom_element)){colModelObj.editoptions.custom_element=function(value,options){return $('<input>').attr({'type':'text','id':options.id,'name':options.name,'class':'FormElement formulario_linea_input customelement','style':'width:98%','value':value})[0];};}// Si no se ha especificado una funcion custom_value se asigna la función genérica correspondiente a un componente RUP\nif(!jQuery.isFunction(colModelObj.editoptions.custom_value)){colModelObj.editoptions.custom_value=function($elem,operation,value){var ruptype=$elem.attr('ruptype');if(ruptype!==undefined){if(operation==='set'){$elem['rup_'+ruptype]('setRupValue',value);}else if(operation==='get'){if(ruptype==='autocomplete'){return $('[id=\"'+$elem.attr('id').substring(0,$elem.attr('id').indexOf('_label'))+'\"]')['rup_'+ruptype]('getRupValue');}else{return $elem['rup_'+ruptype]('getRupValue');}}}};}}}// Configuración de la columna extra utilizada para mostrar el estado de los registros\nif(settings.showGridInfoCol){settings.colNames=$.merge([''],settings.colNames);settings.colModel=$.merge([settings.defaultGridInfoCol],settings.colModel);}// Configuración de las claves compuestas\nif(settings.primaryKey!==undefined&&typeof settings.primaryKey==='string'){settings.primaryKey=[settings.primaryKey];}if(settings.primaryKey!==undefined&&_typeof(settings.primaryKey)==='object'){// Configuración de la columna extra para gestionar las claves compuestas\nif(settings.primaryKey.length===1){settings.primaryKeyCol=settings.primaryKey[0];// Se configura la propiedad key para la columna correspondiente a a clave primaria\nfor(var i=0;i<colModel.length;i++){if(colModel[i].name===settings.primaryKeyCol){colModel[i].key=true;break;}}}else if(settings.primaryKey.length>1){settings.colNames=$.merge([''],settings.colNames);var pkColModel=$.extend({},settings.defaultGridMultiplePkCol,{key:true,formatter:function formatter(cellvalue,options,rowObject){var $self=$(this),settings=$self.data('settings'),retValue='';for(var i=0;i<settings.primaryKey.length;i++){retValue+=$.rup_utils.unnestjson(rowObject)[settings.primaryKey[i]]+settings.multiplePkToken;}retValue=retValue.substr(0,retValue.length-1);return retValue;}});settings.primaryKeyCol='pkCol';settings.colModel=$.merge([pkColModel],settings.colModel);}// Se actualiza el nombre de la columna que va a ejercer como clave primaria\n$.extend(settings,{prmNames:{id:settings.primaryKeyCol}});}// Configuración del colModel para la gestión de la edición de las claves primarias en los modos add y edit\nfor(var i=0;i<colModel.length;i++){colModelObj=colModel[i];if(colModelObj.editable===true){if(colModelObj.editableOnAdd===undefined){colModelObj.editableOnAdd=true;}if(colModelObj.editableOnEdit===undefined){if(jQuery.inArray(colModel[i].name,settings.primaryKey)!==-1){colModelObj.editableOnEdit=false;}else{colModelObj.editableOnEdit=true;}}}}// Sobreescritura del método serialize grid data\nsettings.serializeGridData=function(postData){var newPostData,pageNum=parseInt(postData.page),lastpage=parseInt($self.rup_jqtable('getGridParam','lastpage'));if(lastpage!==0&&pageNum>lastpage){postData.page=lastpage;}if(settings.core.startOnPage!==null){postData.page=settings.core.startOnPage;$self.data('tmp.firstLoad',true);}jQuery.extend(true,postData,{core:{'pkToken':settings.multiplePkToken,'pkNames':settings.primaryKey}});newPostData=$.extend({},{'filter':{}},postData);$self.triggerHandler('rupTable_serializeGridData',[newPostData]);$self.removeData('tmp.firstLoad');settings.core.startOnPage=null;return jQuery.toJSON(newPostData);};settings.beforeProcessing=function(data,st,xhr){if($self.triggerHandler('rupTable_beforeProcessing',[data,st,xhr]===false)){return false;}if(settings.primaryKey.length>1){$.each(data.rows,function(index,elem){var retValue='';for(var i=0;i<settings.primaryKey.length;i++){retValue+=$.rup_utils.unnestjson(elem)[settings.primaryKey[i]]+settings.multiplePkToken;}retValue=retValue.substr(0,retValue.length-1);elem['pkCol']=retValue;});}return true;};// Gestión de errores por defecto\n//\t\t\tif (!jQuery.isFunction(settings.loadError)){\n//\t\t\t\tsettings.userDefined\n//\t\t\t\tsettings.loadError = function(xhr,st,err){\n//\t\t\t\t\tjQuery.rup_messages(\"msgError\", {\n//\t\t\t\t\t\ttitle: settings.core.defaultLoadErrorTitle,\n//\t\t\t\t\t\tmessage: xhr.responseText\n//\t\t\t\t\t});\n//\t\t\t\t};\n//\t\t\t}\nvar userLoadError=settings.loadError;settings.loadError=function(xhr,st,err){var $self=$(this),ret;ret=$self.triggerHandler('rupTable_loadError',xhr,st,err);if(ret!==false){jQuery.proxy(userLoadError,$self)(xhr,st,err);}};settings.getActiveLineId=function(){var $self=this,rowsInGrid=$self.jqGrid('getDataIDs'),selrow=$self.jqGrid('getGridParam','selrow');return $.inArray(selrow,rowsInGrid);};settings.getActiveRowId=function(){var $self=this;return $self.rup_jqtable('getGridParam','selrow');};settings.getSelectedRows=function(){var $self=this,selrow=$self.rup_jqtable('getGridParam','selrow');return selrow===null?[]:[selrow];};settings.getSelectedLines=function(){var $self=this,selrow=$self.rup_jqtable('getGridParam','selrow');return selrow===null?[]:[$.inArray(selrow,$self.jqGrid('getDataIDs'))];};// Gestión de las operaciones que se pueden realizar sobre los registros\n// Se unifican las operaciones por defecto con las indicadas por el usaurio\njQuery.each(settings.core.operations,function(index,operation){settings.core.showOperations[index]=true;});jQuery.extend(true,settings.core.defaultOperations,settings.core.operations);$self.on({'jqGridBeforeRequest':function jqGridBeforeRequest(){jQuery.set_uda_ajax_mode_on();},'jqGridLoadComplete.rup_jqtable.tooltip':function jqGridLoadCompleteRup_jqtableTooltip(event,data){var $self=$(this);if(data!==undefined){// Redimensionado del campo de número de página en base al número de página máximo\njQuery('.pagControls input.ui-pg-input',settings.$pager).attr({size:data.total.length,maxlength:data.total.length});}},'jqGridResizeStart':function jqGridResizeStart(event,index){//rup_combo , close the menu of the rup_combo when a column is resized\n$('#'+$self[0].id+'_search_rowInputs select').each(function(){$(this).selectmenu('close');});},'jqGridResizeStop':function jqGridResizeStop(event,index){//rup_combo, adjust the width of the menu to the new width after a column has been resized\n$('#'+$self[0].id+'_search_rowInputs select').each(function(){$('[id=\\''+this.id+'-menu\\']').width($('[id=\\''+this.id+'-button\\']').width());});},'jqGridGridComplete.rup_jqtable.core':function jqGridGridCompleteRup_jqtableCore(event){var $self=$(this),$tbody;if($self.rup_jqtable('getGridParam','records')===0){// No se han encontrado registros\n$self.prev().remove();//Borrar div vacío\n$($self.jqGrid('getGridParam','pager')).hide();var content='<tr class=\"ui-widget-content jqgrow ui-row-ltr\" role=\"row\" id=\"'+$self[0].id+'_noRecords\" aria-selected=\"false\">';content+='<td aria-describedby=\"'+$self[0].id+'_NO_REGISTROS\" title=\"'+$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.noRecordsFound')+'\" style=\"border:0;padding-left: 0.5em ! important;text-align: left;width:'+$('#gview_'+$self.attr('id')).width()+'px;background:white;\" role=\"gridcell\">';//content += \t'<div id=\"RUP_GRID_' + self[0].id + '_noRecord_ext\" class=\"cellLayout\" style=\"padding-left: 0.5em ! important;\">' + $.rup.i18nParse($.rup.i18n.base,\"rup_jqtable.noRecordsFound\");\n//content += '</div></td></tr>';\ncontent+=$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.noRecordsFound');content+='</td></tr>';$self.before(content);$('[aria-describedby=\"'+$self[0].id+'_NO_REGISTROS\"]').rup_tooltip({position:{my:'center',at:'center'}});}else{jQuery('#'+$self[0].id+'_noRecords').remove();//si tenemos la capa de no hay registros la borramos\njQuery($self.jqGrid('getGridParam','pager')).show();}},'jqGridGridComplete.rup_jqtable.tooltip':function jqGridGridCompleteRup_jqtableTooltip(event){var $self=$(this),$tbody;// Se han encontrado registros\n// Tooltips de la tabla\n//\t\t\t\t\tjQuery(\"[title]\", $self).rup_tooltip({show:{delay:settings.tooltipDelay}});\n//Se le aplica el tooltip de uda\n$('#'+$(this).attr('id')+' [title]').each(function(i,elem){var $elem=$(elem);$elem.attr('grid_tooltip',$elem.attr('title')).removeAttr('title');});$tbody=jQuery('tbody:first',$self);$tbody.on('mousestop',{delay:500},function(event,originalEvent){var obj=$.rup_utils.elementFromPoint(originalEvent.clientX,originalEvent.clientY,true),$obj=$(obj),toolipTmpId,auxId,auxDescribedBy;if(!$obj.attr('rup_tooltip')&&$obj.attr('grid_tooltip')&&!$obj.data().qtip){auxId=$obj.parent().attr('id')?$obj.parent().attr('id'):$obj.parents('tr[role=\\'row\\']').attr('id');auxDescribedBy=$obj.attr('aria-describedby')?$obj.attr('aria-describedby'):$obj.parents('td[role=\\'gridcell\\']').attr('aria-describedby');$obj.attr('title',$obj.attr('grid_tooltip'));toolipTmpId=auxId+'_'+auxDescribedBy;$obj.rup_tooltip({show:{delay:0},id:toolipTmpId,position:{viewport:$(window),adjust:{method:'flip'}}});$obj.triggerHandler('mouseenter.qtip-'+toolipTmpId+'-create');//\t\t\t\t\t\t\t$obj.triggerHandler(\"mouseenter\");\n$obj.rup_tooltip('option','show.delay',500);$obj.rup_tooltip('open');}});}});},/**\r\n     * Metodo que realiza la post-configuración del core del componente RUP Table.\r\n     * Este método se ejecuta antes de la post-configuración de los plugins y después de la invocación al componente jqGrid.\r\n     *\r\n     * @name postConfigureCore\r\n     * @function\r\n     * @param {object} settings - Parámetros de configuración del componente.\r\n     */postConfigureCore:function postConfigureCore(settings){var $self=this;// Se configura la funcionalidad de redimensionado de la tabla.\nif(settings.resizable!==false){$self.rup_jqtable('gridResize',jQuery.isPlainObject(settings.resizable)?settings.resizable:{});}// Configruación pager\nif(settings.pager!==false){$self.rup_jqtable('configurePager',settings);}// Se añaden los tooltip a las cabeceras de la tabla\n$.each($('#gview_table th:visible'),function(index,elem){var $elem=$(elem),text=$elem.find('div').text();if(text!==''){$elem.attr('title',text).rup_tooltip({show:{delay:500},position:{viewport:$(window),adjust:{method:'flip'}}});}});// Implementación del ellipsis en las cabeceras de las columnas de la tabla\njQuery($self.rup_jqtable('getGridParam','colModel')).each(function(index,element){var $headerLabel;//Si la columna define ellipsis...\nif(element.classes==='ui-ellipsis'){//Añadirle estilos para ellipsis al div que está dentro de la cabecera\njQuery('[id=\\'jqgh_'+settings.id+'_'+element.name+'\\']').css('display','block').css('text-overflow','ellipsis');}//Sustituir DIV del literal de la cabecera por SPAN (para que funcione ellipsis)\n$headerLabel=jQuery('[id=\\'jqgh_'+settings.id+'_'+element.name+'\\']').children('div');$headerLabel.replaceWith(jQuery('<span>').text($headerLabel.text()).css('cursor','pointer'));});// Configuración de la columna extra utilizada para mostrar el estado de los registros\nif(settings.showGridInfoCol){//\t\t\t\tjQuery(\"#gview_\"+settings.id+\" table thead th#\"+settings.id+\"_rupInfoCol\").css(\"padding-right\",\"0px\").css(\"padding-left\",\"0px\").css(\"border-right\",\"0px none\");\njQuery('#gview_'+settings.id+' table thead th#'+settings.id+'_rupInfoCol').css('border-right','0px none');}if(settings.loadOnStartUp===false||settings.multifilter!=undefined){settings.datatype=$self.data('tmp.loadOnStartUp.datatype');$self.rup_jqtable('setGridParam',{datatype:$self.data('tmp.loadOnStartUp.datatype')});$self.removeData('tmp.loadOnStartUp.datatype');}}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\njQuery.fn.rup_jqtable('extend',{/**\r\n     * Devuelve la propiedad colModel del jqGrid.\r\n     *\r\n     * @name getColModel\r\n     * @function\r\n     * @return {object} - Propiedad colModel del jqGrid.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getColModel\");\r\n     */getColModel:function getColModel(){return $(this).jqGrid('getGridParam','colModel');},/**\r\n     * Devuelve el valor del parámetro del grid especificado.\r\n     *\r\n     * @name getGridParam\r\n     * @function\r\n     * @param {string} pName - Nombre del parámetro que se desea obtener.\r\n     * @return {object} - Valor del parámetro.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getGridParam\",\"nombreParametro\");\r\n     */getGridParam:function getGridParam(pName){return $(this).jqGrid('getGridParam',pName);},/**\r\n     * Permite redimensionar la tabla de acuerdo a los parámetros indicados.\r\n     *\r\n     * @name getGridParam\r\n     * @function\r\n     * @param {object} options - Parámetros para configurar la altura y anchura del redimensionado.\r\n     * @return {jQuery} - Referencia al propio componente.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"gridResize\",{});\r\n     */gridResize:function gridResize(options){return $(this).jqGrid('gridResize',options);},/**\r\n     * Devuelve un array con los identificadores de los registros seleccionados.\r\n     *\r\n     * @name getSelectedRows\r\n     * @function\r\n     * @return {string[]} - Array con los identificadores de los registros seleccionados.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getSelectedRows\");\r\n     */getSelectedRows:function getSelectedRows(){var $self=this,settings=$self.data('settings');return jQuery.proxy(settings.getSelectedRows,$self)();},/**\r\n     * Devuelve un array con los índices de las líneas de los registros seleccionados.\r\n     *\r\n     * @name getSelectedLines\r\n     * @function\r\n     * @return {number[]} - Array con los índices de las líneas de los registros seleccionados.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getSelectedLines\");\r\n     */getSelectedLines:function getSelectedLines(){var $self=this,settings=$self.data('settings');return jQuery.proxy(settings.getSelectedLines,$self)();},/**\r\n     * El objetivo de este método es construir una URL mediante la cual se pueda realizar una petición para obtener los datos de un registro concreto.\r\n     * La URL se genera concatenando los valores de las propiedades que forman la primary key del resgistro a la url base especificada en los settings de inicialización.\r\n     *\r\n     * @name getPkUrl\r\n     * @function\r\n     * @param {string} rowId - Identificador del registro.\r\n     * @return {string} - Url para obtener los valores del registro correspondiente.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getPkUrl\",\"0001\");\r\n     */getPkUrl:function getPkUrl(rowId){var $self=this,settings=$self.data('settings'),tmpRowId;if(Array.isArray(rowId)){tmpRowId=rowId[0]!==undefined?rowId[0]:'';}else{tmpRowId=rowId;}return tmpRowId.split(settings.multiplePkToken).join('/');},/**\r\n     * Lanza la recarga de la tabla.\r\n     *\r\n     * @name reloadGrid\r\n     * @function\r\n     * @param {boolean} async - Indica si la llamada debe ser asíncrona o síncrona.\r\n     * @param {boolean} notSelect - Indica si debe seleccionar el primer elemento o no.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"reloadGrid\", true);\r\n     */reloadGrid:function reloadGrid(async,notSelect){var $self=this,settings=$self.data('settings'),page=$self.rup_jqtable('getGridParam','page');var ajaxOptions=$self.jqGrid('getGridParam','ajaxGridOptions');var ajaxOptionsAsync=ajaxOptions.async;ajaxOptions.async=false;//\t\t\tvar ajaxOptions = $self.jqGrid(\"setGridParam\", {ajaxGridOptions:ajaxOptions});\n$self.jqGrid('setGridParam',{ajaxGridOptions:ajaxOptions});$self.jqGrid('setGridParam',{page:1});$self.trigger('reloadGrid');ajaxOptions.async=true;$self.jqGrid('setGridParam',{ajaxGridOptions:ajaxOptions});if(!notSelect){var nextPagePos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])();$self.jqGrid('setSelection',nextPagePos[1][0]);}},/**\r\n     * Resetea el formulario indicado.\r\n     *\r\n     * @name resetForm\r\n     * @function\r\n     * @param {jQuery} $form - Objeto jQuery que referencia el formulario que se desea resetear.\r\n     * @return {jQuery} - Referencia al propio objeto.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"resetForm\", $(\"#idFormulario\"));\r\n     */resetForm:function resetForm($form){var $self=this,settings=$self.data('settings');// Se eliminan los estilos de errores de validacion\nif($form.data('validator')!=undefined){var errorClass=$form.data('validator').settings.errorClass;$('.'+errorClass,$form).removeClass(errorClass);}// Se realiza el reset de los campos ordinarios\n//form.resetForm();\njQuery('input[type!=\\'button\\'][type!=\\'checkbox\\'][type!=\\'radio\\'], textarea',$form).val('');jQuery('input[type=\\'checkbox\\']',$form).not('[name*=\\'jqg_GRID_\\']',$form).not('[disabled=\\'disabled\\']',$form).removeAttr('checked');// Se realiza el reset de los rup_combo\njQuery.each($('select.rup_combo',$form),function(index,elem){if(settings.filter&&settings.filter.clearSearchFormMode==='reset'){jQuery(elem).rup_combo('reset');}else{jQuery(elem).rup_combo('clear');}});//Vaciar los autocompletes\n$('[ruptype=\\'autocomplete\\']',$form).each(function(index,element){$(element).val('');});//Vaciar los arboles\n$('[ruptype=\\'tree\\']',$form).each(function(index,element){$(element).rup_tree('setRupValue','');});// Se realiza el reset del fomulario\nif(settings.filter&&settings.filter.clearSearchFormMode==='reset'){$form.resetForm();}else{$('input[type=\\'radio\\']',$form).removeAttr('checked');}return $self;},/**\r\n     * Asigna a uno o varios parámetros del grid los valores indicados.\r\n     *\r\n     * @name setGridParam\r\n     * @function\r\n     * @param {object} newParams - Objeto que contiene los parámetros y sus valores.\r\n     * @return {jQuery} - Referencia al propio objeto.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"setGridParam\", {param1:value1, param2:value2});\r\n     */setGridParam:function setGridParam(newParams){$(this).jqGrid('setGridParam',newParams);return $(this);},/**\r\n     * Selecciona o deselecciona los registros indicados.\r\n     *\r\n     * @name setSelection\r\n     * @function\r\n     * @param {string | string[]} selectedRows - Identificador o array de identificadores de los registros que se desea seleccionar o deseleccionar.\r\n     * @param {boolean} status - En caso de ser true se seleccionarán los registros indicados. En caso de ser false se deseleccionarán.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"setSelection\", [\"3\",\"7\"], true);\r\n     */setSelection:function setSelection(selection,status,e){var $self=this,settings=$self.data('settings'),ret;ret=$self.triggerHandler('rupTable_setSelection',arguments);if(ret!==false){$self.jqGrid('setSelection',selection,status,e);}},/**\r\n     * Muestra en los campos del formulario los errores de validación indicados.\r\n     *\r\n     * @name showServerValidationFieldErrors\r\n     * @function\r\n     * @param {jQuery} $form - Objeto jQuery que referencia el formulario que se desea resetear.\r\n     * @param {object} errors - Objeto json que contiene los errores de validación que se han dado para cada campo.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"showServerValidationFieldErrors \", $(\"#idFormulario\"), {});\r\n     */showServerValidationFieldErrors:function showServerValidationFieldErrors($form,errors){var $self=$(this);if(errors.rupErrorFields!==undefined||errors.rupFeedback!==undefined){$form.validate().submitted=$.extend(true,$form.validate().submitted,errors.rupErrorFields);$form.validate().invalid=errors.rupErrorFields;$form.validate().showErrors(errors.rupErrorFields);}else if(errors.rupFeedback!==undefined){$self.rup_jqtable('showFeedback',$form.validate().settings.feedback,$.rup_utils.printMsg(errors.rupFeedback.message),errors.rupFeedback.imgClass!==undefined?errors.rupFeedback.imgClass:null);}},/**\r\n     * Elimina el resaltado de la línea especificada de la tabla.\r\n     *\r\n     * @name rupTableClearHighlightedRowAsSelected\r\n     * @function\r\n     * @param {jQuery} $row - Objeto jQuery que referencia a la línea de la tabla.\r\n     * @fires module:rup_jqtable#rupTableClearHighlightedRowAsSelected\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"clearHighlightedRowAsSelected\", $(\"#idFila\"));\r\n     */clearHighlightedRowAsSelected:function clearHighlightedRowAsSelected($row){var $self=this,self=$self[0],internalProps=self.p,row=$row[0],froz=internalProps.frozenColumns===true?internalProps.id+'_frozen':'';if(!$row.hasClass('ui-subgrid')&&!$row.hasClass('ui-state-disabled')){$('#jqg_'+$.jgrid.jqID(internalProps.id)+'_'+$.jgrid.jqID(row.id))[internalProps.useProp?'prop':'attr']('checked',false);$row.removeClass('ui-state-highlight').attr('aria-selected','false');//\t\t\t\temp.push(row.id);\nif(froz){$('#jqg_'+$.jgrid.jqID(internalProps.id)+'_'+$.jgrid.jqID(row.id),self.grid.fbDiv)[internalProps.useProp?'prop':'attr']('checked',false);$('#'+$.jgrid.jqID(row.id),self.grid.fbDiv).removeClass('ui-state-highlight');}}$self.trigger('rupTableClearHighlightedRowAsSelected',[$row]);},/**\r\n     * Resalta la línea especificada de la tabla.\r\n     *\r\n     * @name highlightRowAsSelected\r\n     * @function\r\n     * @param {jQuery} $row - Objeto jQuery que referencia a la línea de la tabla.\r\n     * @fires module:rup_jqtable#rupTableHighlightRowAsSelected\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"highlightRowAsSelected\", $(\"#idFila\"));\r\n     */highlightRowAsSelected:function highlightRowAsSelected($row){var $self=this,self=$self[0],internalProps=self.p,row=$row[0],froz=internalProps.frozenColumns===true?internalProps.id+'_frozen':'';if($row.length>0&&!$row.hasClass('ui-subgrid')&&!$row.hasClass('jqgroup')&&!$row.hasClass('ui-state-disabled')){$('#jqg_'+$.jgrid.jqID(internalProps.id)+'_'+$.jgrid.jqID(row.id))[internalProps.useProp?'prop':'attr']('checked',true);$row.addClass('ui-state-highlight').attr('aria-selected','true');internalProps.selarrrow.push(row.id);internalProps.selrow=row.id;if(froz){$('#jqg_'+$.jgrid.jqID(internalProps.id)+'_'+$.jgrid.jqID(row.id),self.grid.fbDiv)[internalProps.useProp?'prop':'attr']('checked',true);$('#'+$.jgrid.jqID(row.id),self.grid.fbDiv).addClass('ui-state-highlight');}$self.trigger('rupTableHighlightRowAsSelected',[$row]);}},/**\r\n     * Actualiza el valor de los datos que se muestran en la barra de paginación.\r\n     *\r\n     * @name updateDetailPagination\r\n     * @function\r\n     * @param {string} currentRowNumArg - Número actual de los registros que se están mostrando.\r\n     * @param {string} totalRowNumArg - Número total de los registros que se muestran en la tabla.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"updateDetailPagination\", \"1-10\", \"586\" );\r\n     */updateDetailPagination:function updateDetailPagination(currentRowNumArg,totalRowNumArg){var $self=this,settings=$self.data('settings'),tableId=settings.id,currentRowNum,totalRowNum;currentRowNum=currentRowNumArg!==undefined?currentRowNumArg:$.proxy(settings.getDetailCurrentRowCount,$self)();totalRowNum=totalRowNumArg!==undefined?totalRowNumArg:$.proxy(settings.getDetailTotalRowCount,$self)();if(currentRowNum===1){$('#first_'+tableId+', #back_'+tableId,settings.$detailFormDiv).addClass('ui-state-disabled');}else{$('#first_'+tableId+', #back_'+tableId,settings.$detailFormDiv).removeClass('ui-state-disabled');}if(currentRowNum===totalRowNum){$('#forward_'+tableId+', #last_'+tableId,settings.$detailFormDiv).addClass('ui-state-disabled');}else{$('#forward_'+tableId+', #last_'+tableId,settings.$detailFormDiv).removeClass('ui-state-disabled');}$('#rup_jqtable_selectedElements_'+$self.attr('id')).text(jQuery.jgrid.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.defaults.detailForm_pager'),currentRowNum,totalRowNum));},/**\r\n     * Función de callback que se ejecutará desde el método updateSavedData.\r\n     *\r\n     * @callback jQuery.rup_validate~onSubmitHandler\r\n     * @param {object} savedData - Objeto interno que almacena en formato json los datos con los que se han inicializado los campos del formulario.\r\n     * @example <caption>Envia el formulario cuando este es válido.</caption>\r\n     * $(\"#idComponente\").rup_jqtable(\"updateSavedData\", function(savedData){\r\n     * });\r\n     */ /**\r\n     * Permite modificar el objeto interno _savedData que se utiliza en el control de cambios en el modo de edición en formulario y edición en línea.\r\n     *\r\n     * @name updateSavedData\r\n     * @function\r\n     * @param {module:rup_jqtable~onUpdateSavedData} arg -Función de callback desde la que se puede modificar el objeto _savedData.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"updateSavedData\", function(savedData){\r\n     * });\r\n     */updateSavedData:function updateSavedData(arg){var $self=this,settings=$self.data('settings');if(jQuery.isFunction(arg)){jQuery.proxy(arg,$self)(rp_ge[settings.id]._savedData);}},isPluginLoaded:function isPluginLoaded(name){var $self=this,settings=$self.data('settings');return settings.usePlugins.indexOf(name)===-1?false:true;}});jQuery.fn.rup_jqtable('extend',{/**\r\n     * Realiza la configuración interna del paginador de acuerdo a los parámetros de configuración indicados en la inicialización del componente.\r\n     *\r\n     * @name configurePager\r\n     * @function\r\n     * @param {object} settings - Parámetros de configuración del componente.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"configurePager\", settings);\r\n     */configurePager:function configurePager(settings){var $self=this;return $.proxy($self[0]._ADAPTER.configurePager,$self)(settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PRIVADOS\n//********************************\njQuery.fn.rup_jqtable('extend',{/**\r\n     * Método de inicialización del componente.\r\n     *\r\n     * @name _init\r\n     * @function\r\n     * @private\r\n     * @param {object} args - Parámetros de configuración del componente.\r\n     * @fires module:rup_jqtable#rupTable_coreConfigFinished\r\n     */_init:function _init(args){if(args.length>1){jQuery.rup.errorGestor(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_global.initError')+$(this).attr('id'));}else{var $self=this,settings={};/* *************************\r\n         * CONFIGURACION\r\n         * *************************/var defaultPugins=Array.isArray(args[0].defaultPlugins)?args[0].defaultPlugins:jQuery.fn.rup_jqtable.defaults.defaultPlugins,userPlugins=jQuery.merge([],args[0].usePlugins),configuredPlugins=jQuery.merge(jQuery.merge([],defaultPugins),userPlugins);jQuery.rup_utils.sortArray(configuredPlugins,function(obj1,obj2){return rup_jqtable.plugins[obj2].loadOrder-rup_jqtable.plugins[obj1].loadOrder;});/* *********************************************************\r\n         * SE PROCESA LAS CONFIGURACION POR DEFECTO DEL CORE y VALIDACIÓN DEL LOS DIALOGOS\r\n         * *********************************************************\r\n         */if($(\"[aria-describedby=\"+$self.attr('id')+\"_detail_div]\").length>0){$(\"[aria-describedby=\"+$self.attr('id')+\"_detail_div]\").remove();}settings=$.extend(true,{},settings,jQuery.fn.rup_jqtable.plugins.core.defaults);$self[0]._ADAPTER=$.rup.adapter[settings.adapter];/* *********************************************************\r\n         * SE PROCESAN LAS CONFIGURACIONES POR DEFECTO DE LOS PLUGINS\r\n         * *********************************************************\r\n         */$.each(configuredPlugins,function(index,name){if(rup_jqtable.plugins[name]!==undefined&&jQuery.fn.rup_jqtable.plugins[name]!==undefined){settings=$.extend(true,{},settings,jQuery.fn.rup_jqtable.plugins[name].defaults);}});// Se sobreescribe la configuración por defecto con la especificada por el usaurio\nsettings=jQuery.extend(true,{},jQuery.fn.rup_jqtable.defaults,settings,args[0]);/* *********************************************************\r\n         * EJECUCION DE LA PRECONFIGURACION DEL CORE\r\n         * *********************************************************/$self.rup_jqtable('preConfigureCore',settings);/* *********************************************************\r\n         * EJECUCION DE FUNCIONES DE PRECONFIGURACION DE LOS PLUGINS\r\n         * *********************************************************\r\n         */$.each(configuredPlugins,function(index,name){if(jQuery.isFunction(rup_jqtable.plugins[name].preConfiguration)){jQuery.proxy(rup_jqtable.plugins[name].preConfiguration,$self)(settings);}});/*\r\n         * INVOCACIÓN al plugin subyacente jqGrid\r\n         */$self.jqGrid(settings);/* *********************************************************\r\n         * EJECUCION DE LA POSTCONFIGURACION DEL CORE\r\n         * *********************************************************/$self.rup_jqtable('postConfigureCore',settings);/* *********************************************************\r\n         * EJECUCION DE FUNCIONES DE POSTCONFIGURACION DE LOS PLUGINS\r\n         * *********************************************************/$.each(configuredPlugins,function(index,name){if(jQuery.isFunction(rup_jqtable.plugins[name].postConfiguration)){jQuery.proxy(rup_jqtable.plugins[name].postConfiguration,$self)(settings);}});// Se almacenan los settings medainte el data para ser accesibles en las invocaciones a los métodos públicos.\n$self.data('settings',settings);$self.triggerHandler('rupTable_coreConfigFinished');}},/**\r\n     * Devuelve el índice de la línea identificada mediante el valor indicado por parámetro.\r\n     *\r\n     * @name _getLineIndex\r\n     * @function\r\n     * @private\r\n     * @param {string} rowId - Identificador del registro.\r\n     * @return {number} - Índice de la línea.\r\n     */_getLineIndex:function _getLineIndex(rowId){var $self=this,settings=$self.data('settings'),tableghead=settings.id+'ghead_',count=0,$row,id;if($self.rup_jqtable('getGridParam','grouping')===true){for(var i=0;i<$self[0].rows.length;i++){$row=jQuery($self[0].rows[i]);id=$row.attr('id');if(id!==undefined&&id.indexOf(tableghead)===-1){count++;if(id===rowId){return count;}}}}else{return $self.jqGrid('getInd',rowId);}}});//*********************************************************************\n// MÉTODOS PARA MANTENER LA RETROCOMPATIBILIDAD CON LA API DEL RUP.GRID\n//*********************************************************************\njQuery.fn.rup_jqtable('extend',{/**\r\n     * Añade una nueva línea a la tabla. Esta operación no realiza una inserción del registro en el sistema de persistencia, sino que únicamente añade una nueva fila de modo visual.\r\n     *\r\n     * @name addRowData\r\n     * @function\r\n     * @param {string} rowid - Identificador del registro.\r\n     * @param {object} data - Objeto json que contiene los valores de cada columna de la nueva línea.\r\n     * @param {string} position - fisrt o last. Determina la posición donde se va a insertar el registro.\r\n     * @param {string} srcrowid -En el caso de indicarse se insertará la nueva línea en la posición relativa al registro que identifica y el valor del parámetro position.\r\n     * @return {jQuery} - Referencia al propio componente.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"addRowData\", \"10\", {campo1:valor1,campo2:valor2});\r\n     */addRowData:function addRowData(rowid,data,position,srcrowid){var $self=$(this);//\t\t\t//Se aade la capa de separacion para diferenciar los nuevos elementos incluidos\n//\t\t\tif ($(\"#\" + tableName + \" #separadorAadidos\").html() === null) {\n//\t\t\t\t$(\"#\" + tableName + \" tr:first-child\").after($(\"#\" + tableName + \" tr:first-child\").clone(false).css(\"display\", \"none\").css(\"height\", \"\").attr(\"id\", \"separadorAadidos\"));\n//\n//\t\t\t\t$.each($(\"#\" + tableName + \" #separadorAadidos td\") , function (index, object) {\n//\t\t\t\t\t$(this).html(\"\").attr(\"class\", \"tdAddSeparator\");\n//\t\t\t\t});\n//\n//\t\t\t\t$(\"#\" + tableName + \" #separadorAadidos\").addClass(\"trAddSeparator\");\n//\t\t\t\t$(\"#\" + tableName + \" #separadorAadidos\").css(\"display\", \"\");\n//\t\t\t}\nreturn $self.jqGrid('addRowData',rowid,data,position,srcrowid);//Añadimos los estilos de elemento añadido\n//\t\t\t$(\"#\" + tableName + \" #\" + rowid).addClass(\"addElement\");\n//$(\"#\" + tableName + \" #\" + rowid + \" td\").addClass(\"addElementBorder\");\n},/**\r\n     * Elimina de la tabla un registro determinado. El registro no se elimina del sistema de persistencia. Solo se elimina de manera visual.\r\n     *\r\n     * @name delRowData\r\n     * @function\r\n     * @param {string} rowid - Identificador del registro.\r\n     * @return {jQuery} - Referencia al propio componente.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"delRowData\",\"10\");\r\n     */delRowData:function delRowData(rowid){var $self=$(this);$self.jqGrid('delRowData',rowid);return $self;},/**\r\n     * Devuelve el identificador de la línea activa.\r\n     *\r\n     * @name getActiveRowId\r\n     * @function\r\n     * @return {string} - Identificador de la línea activa.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getActiveRowId\");\r\n     */getActiveRowId:function getActiveRowId(){var $self=this,settings=$self.data('settings');return jQuery.proxy(settings.getActiveRowId,$self)();},/**\r\n     * Devuelve el índice de la línea activa.\r\n     *\r\n     * @name getActiveLineId\r\n     * @function\r\n     * @return {string} - Índice de la línea activa.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getActiveLineId\");\r\n     */getActiveLineId:function getActiveLineId(){var $self=this,settings=$self.data('settings');return jQuery.proxy(settings.getActiveLineId,$self)();},/**\r\n     * Actualiza los valores de las columnas de un registro determinado. La actualización de loa datos se realiza solo de manera visual. Los nuevos datos no se persisten.\r\n     *\r\n     * @name setRowData\r\n     * @function\r\n     * @param {string} rowid - Identificador del registro que se desea actualizar.\r\n     * @param {object} data - Objeto json que contiene los valores de cada columna de la nueva línea.\r\n     * @param {string} cssp - En caso de especificarse, se añadirán a la línea las class de estilos aquí indicadas.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"setRowData\", \"10\", {campo1:valor1,campo2:valor2});\r\n     */setRowData:function setRowData(rowid,data,cssp){var $self=$(this);$self.jqGrid('setRowData',rowid,data,cssp);//Actualizar tooltip de las celdas de la fila\njQuery('td[title]',$self).each(function(index,elem){var $cell=jQuery(elem),title=$cell.prop('title');$cell.attr({'grid_tooltip':title,'oldtitle':title}).removeAttr('title');});},/**\r\n     * Devuelve un objeto json con los valores de los campos del registro indicado.\r\n     *\r\n     * @name getRowData\r\n     * @function\r\n     * @param {string} rowid - Identificador del registro del que se quieren recuperar los datos.\r\n     * @return {object} - Objecto json con los valores del registro.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getRowData\", \"10\");\r\n     */getRowData:function getRowData(rowid){var $self=$(this);return $self.jqGrid('getRowData',rowid);},/**\r\n     * Devuelve un array con los identificadores de los registros que se muestran actualmente en la página de la tabla.\r\n     *\r\n     * @name getDataIDs\r\n     * @function\r\n     * @return {string[]} - Identificadores de lso registros mostrados en la página actual.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getDataIDs\");\r\n     */getDataIDs:function getDataIDs(){var $self=$(this);return $self.jqGrid('getDataIDs');},/**\r\n     * Limpia los registros mostrados en la tabla.\r\n     *\r\n     * @name clearGridData\r\n     * @function\r\n     * @param {boolean} clearfooter - En caso de indicarse como true se elimina la información del pié de la tabla.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"clearGridData\", false);\r\n     */clearGridData:function clearGridData(clearfooter){var $self=$(this);return $self.jqGrid('clearGridData',clearfooter);},/**\r\n     * Devuelve el objeto colModel del componente jqGrid.\r\n     *\r\n     * @name getColModel\r\n     * @function\r\n     * @return {object} - Objeto colModel de la tabla.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getColModel\");\r\n     */getColModel:function getColModel(){// Función que devuelve el colModel directamente.\nvar $self=$(this);return $self.jqGrid('getGridParam','colModel');},/**\r\n     * Devuelve el valor de la columna de la fila indicada.\r\n     *\r\n     * @name getCol\r\n     * @function\r\n     * @param {string} rowid - Identificador de la fila.\r\n     * @param {string} colName - Nombre de la columna.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getCol\", \"10\", \"nombre\");\r\n     */getCol:function getCol(rowid,colName){//Función que devuelve el valor de la celda de la fila que se le pasa como paramtero. El colName puede ser o el indice de la columna o el nombre de la misma\nvar $self=$(this);return $self.jqGrid('getCell',rowid,colName);},/**\r\n     * Devuelve un objeto json que contiene la serialización del formulario.\r\n     *\r\n     * @name getSerializedForm\r\n     * @function\r\n     * @param {jQuery} form - Formulario que se desea serializar.\r\n     * @param {boolean} skipEmpty - En caso de indicarse true se omiten los campos que no contienen valor.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getSerializedForm\", $(\"#idFormulario\"), false);\r\n     */getSerializedForm:function getSerializedForm(form,skipEmpty,delimeter){return form2object(form instanceof jQuery?form[0]:form,delimeter?delimeter:null,skipEmpty?skipEmpty:false);}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\njQuery.fn.rup_jqtable.plugins={};jQuery.fn.rup_jqtable.plugins.core={};jQuery.fn.rup_jqtable.plugins.core.defaults={// adapter: \"jqtable_jqueryui\",\nadapter:'jqtable_bootstrap',core:{operations:{},defaultOperations:{},showOperations:{},defaultLoadErrorTitle:$.rup.i18n.base.rup_ajax.errorTitle}};/**\r\n   * Función de callback que será ejecutada cuando el usuario realice una acción sobre la operación.\r\n   *\r\n   * @callback module:rup_jqtable~onOperation\r\n   * @param {string} key - Identificador de la operación\r\n   * @param {object} options - Opciones de configuración de la operación.\r\n   * @example\r\n   * callback: function(key, options){\r\n   *\t\talert(\"Operación 1\");\r\n   *\t}\r\n   */ /**\r\n   * Función de callback que determina si la operación debe estar habilitada o no.\r\n   *\r\n   * @callback module:rup_jqtable~isEnabled\r\n   * @return {boolean} - Devuelve si la operación debe de estar habilitada o no.\r\n   * @example\r\n   * enabled: function(){\r\n   *\t\treturn true;\r\n   *\t}\r\n   */ /**\r\n   * Mediante esta propiedad se definen las posibles operaciones a realizar sobre los registros mostrados en la tabla. Debido al carácter global de estas operaciones se toman en cuenta por otros componentes (toolbar, menú contextual) a la hora de mostrar sus controles. Las operaciones se definen mediante un objeto json en el cual el nombre de la propiedad será el identificador de la propiedad.\r\n   *\r\n   * @typedef {Object} module:rup_jqtable~Operations\r\n   * @property {string} [name] - Texto a mostrar al usuario a la hora de visualizar la operación.\r\n   * @property {string} [icon] - Clase CSS correspondiente al icono que se quiere visualizar junto a la operación.\r\n   * @property {module:rup_jqtable~isEnabled} [enabled] - Función que determina si el botón se debe mostrar habilitado o deshabilitado. Esto se determina devolviendo true/false desde la función de callback aquí indicada.\r\n   * @property {module:rup_jqtable~onOperation} [callback] - Función de callback que será ejecutada cuando el usuario realice una acción sobre la operación.\r\n   * @example\r\n   * core:{\r\n   * \toperations:{\r\n   *\t\t\t\"operacion1\": {\r\n   *\t\t\t\tname: \"Operación 1\",\r\n   *\t\t\t\ticon: \"rup-icon rup-icon-new\",\r\n   *\t\t\t\tenabled: function(){\r\n   *\t\t\t\t\treturn true;\r\n   *\t\t\t\t},\r\n   *\t\t\t\tcallback: function(key, options){\r\n   *\t\t\t\t\talert(\"Operación 1\");\r\n   *\t\t\t\t}\r\n   *\t\t\t},\r\n   *\t\t\t\"operacion2\": {\r\n   *\t\t\t\tname: \"Operación 2\",\r\n   *\t\t\t\ticon: \"rup-icon rup-icon-new\",\r\n   *\t\t\t\tenabled: function(){\r\n   *\t\t\t\t\treturn true;\r\n   *\t\t\t\t},\r\n   *\t\t\t\tcallback: function(key, options){\r\n   *\t\t\t\t\talert(\"Operación 1\");\r\n   *\t\t\t\t}\r\n   *\t\t\t}\r\n   *\t\t}\r\n   * }\r\n   */ /**\r\n   * Permite habilitar/deshabilitar las operaciones definidas por defecto por otros módulos.\r\n   *\r\n   * @typedef module:rup_jqtable~ShowOperations\r\n   * @example\r\n   * core:{\r\n   *\t\tshowOperations:{\r\n   *\t\t\tadd:false;\r\n   *\t\t\tclone:false;\r\n   *\t\t}\r\n   *\t}\r\n   */ /**\r\n   * @description Propiedades de configuración del componente.\r\n   * @see Para mas información consulte la documentación acerca de las opciones de configuración del componente {@link http://www.trirand.com/jqgridwiki/doku.php|jqGrid}.\r\n   *\r\n   * @name options\r\n   *\r\n   * @property {boolean} [altRows=true] - Determina si se aplica o no el pijama en las filas de la tabla.\r\n   * @property {string} [altclass=rupgrid_oddRow] - Estilo que se aplica a las filas impares para mostrar el efecto.\r\n   * @property {string} [datatype=json] - Formato de dato esperado para representar los registros de la tabla.\r\n   * @property {string} [height=auto] - Determina la altura de la tabla.\r\n   * @property {object} [jsonReader={repeatitems: false}] - Parámetros de configuración que determinan el modo en el que se va a procesar el json de retorno del servidor\r\n   * @property {boolean} [resizable=false] - Determina si la tabla puede ser redimensionada mediante el ratón.\r\n   * @property {number} [rowNum=10] - Número de registros por página que se van a mostrar en la tabla.\r\n   * @property {number[]} [rowList=[10,20,30]] - Lista de posibles valores para el número de elementos por página que se van a mostrar en el combo de selección correspondiente.\r\n   * @property {boolean} [sortable=true] - Determina si se permite variar el orden de las columnas arrastrándolas.\r\n   * @property {boolean} [viewrecords=true] - Indica si se debe mostrar el rango de elementos que se están visualizando en la tabla.\r\n   * @property {boolean} [loadOnStartUp=true] - Determina si se debe realizar automáticamente la búsqueda al cargar la página.\r\n   * @property {string} [multiplePkToken=~] - Separador que se utiliza en los casos en los que la clave primaria sea múltiple. Se creará una columna que contenga un identificador único resultante de la concatenación de las claves primarias realizada mediante el separador aquí indicado.\r\n   * @property {module:rup_jqtable~Operations} [operations] - Mediante esta propiedad se definen las posibles operaciones a realizar sobre los registros mostrados en la tabla. Debido al carácter global de estas operaciones se toman en cuenta por otros componentes (toolbar, menú contextual) a la hora de mostrar sus controles. Las operaciones se definen mediante un objeto json en el cual el nombre de la propiedad será el identificador de la propiedad.\r\n   * @property {module:rup_jqtable~ShowOperations} [showOperations] - Permite habilitar/deshabilitar las operaciones definidas por defecto por otros módulos.\r\n   * @property {number} [startOnPage=1] - Permite especificar el número de página inicial que se mostrará al cargar la página.\r\n   */jQuery.fn.rup_jqtable.defaults={altRows:true,altclass:'rup-grid_oddRow',datatype:'json',// Tipo de dato esperado para representar los registros de la tabla (jqGrid)\neditable:false,// Determina si la tabla permite la edición en línea (rup_jqtable)\nheight:'auto',// Ajusta la altura de la tabla al contenido (jqGrid)\njsonReader:{repeatitems:false},// Parámetros de configuración que describen la estructura del json esperado (jqGrid)\npager:null,resizable:false,// Determina si la tabla puede ser redimensionada mediante el ratón (jqGrid)\nrowNum:10,// Determina el número de registros que se van a mostrar por página\nrowList:[10,20,30],// Valores a mostrar en el combo de selección de número de registros por página\nsortable:true,// Determina si se puede realizar drag&drop con las columnas de la tabla (jqGrid)\nviewrecords:true,// Muestra el rango de elementos que se están mostrando en la tabla (jqGrid)\nmtype:'POST',loadError:function loadError(xhr,st,err){var $self=$(this),settings=$self.data('settings');jQuery.rup_messages('msgError',{title:settings.core.defaultLoadErrorTitle,message:xhr.responseText});},loadOnStartUp:true,// Callback ejecutado en las peticiones AJAX de la tabla\nloadBeforeSend:function rup_jqtable_defaults_loadBeforeSend(xhr,settings){// Se modifica la request para incluir las siguientes cabeceras:\n// Se añade la cabecera JQGridModel para indicar que la petición ha sido realizada por el componente rup_jqtable\nxhr.setRequestHeader('JQGridModel','true');// Se indica que el tipo de contenido enviado en la cabecera es application/jsons\nxhr.setRequestHeader('Content-Type','application/json');},loadui:'block',validate:{},defaultPlugins:[],dataProxy:jQuery.rup_jqtable.proxyAjax,defaultGridInfoCol:{name:'rupInfoCol',index:'rupInfoCol',editable:false,fixed:true,sortable:false,width:16,resizable:false,classes:'rupInfoCol',search:false,formatter:function formatter(){return'<span class=\\'ui-icon ui-icon-rupInfoCol\\'></span>';}},defaultGridMultiplePkCol:{name:'pkCol',index:'pkCol',hidden:true,editable:false,fixed:true,sortable:false,width:25,resizable:false,search:false},multiplePkToken:'~',scrollOffset:0,showGridInfoCol:false,tooltipDelay:500};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n   * Evento que se produce al detectarse que el usuario interactua con un elemento externo a la tabla.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_checkOutOfGrid\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {jQuery} $originalTarget - Objeto jQuery que referencia el elemento del dom con el que ha interactuado el usuario.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_checkOutOfGrid\", function(event,\r\n   * $originalTarget){ });\r\n   */ /**\r\n   * Este evento se lanza durante el proceso de serialización de la información que va a ser enviada para obtener los registros que se van a mostrar en la tabla.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_serializeGridData\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Información serializada que va a ser enviada. Se puede modificar o agregar nuevos campos para completarla.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_serializeGridData\", function(event, data){\r\n   * });\r\n   */ /**\r\n   * Evento que se lanza antes de que se procese la información recibida del servidor.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_beforeProcessing\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Información recibida del servidor.\r\n   * @property {string} st - Mensaje de status de la petición.\r\n   * @property {object} xhr - Objeto xhr recibido.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_beforeProcessing\", function(event, data, st,\r\n   * xhr){ });\r\n   */ /**\r\n   * Se produce cuando se elimina el resaltado de un registro de la tabla.\r\n   *\r\n   * @event module:rup_jqtable#rupTableClearHighlightedRowAsSelected\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {jQuery} $row - Objeto jQuery que identifica la línea que se ha procesado.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTableClearHighlightedRowAsSelected\", function(event, $row){ });\r\n   */ /**\r\n   * Se produce cuando se añade el resaltado a un registro de la tabla.\r\n   *\r\n   * @event module:rup_jqtable#rupTableHighlightRowAsSelected\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {jQuery} $row - Objeto jQuery que identifica la línea que se ha procesado.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTableHighlightedRowAsSelected\", function(event, $row){ });\r\n   */ /**\r\n   * Evento que se lanza después de que el componente haya finalizado con el proceso de configuración e inicialización.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_coreConfigFinished\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_coreConfigFinished\", function(event, $row){ });\r\n   */})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /**\r\n * Tiene como objetivo proporcionar al componente RUP Table de las funcionalidades que ofrece el uso de un menú contextual.\r\n *\r\n * @summary Plugin de menú contextual del componente RUP Table.\r\n * @module rup_jqtable/contextMenu\r\n * @example\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n *\tusePlugins:[\"contextMenu\"],\r\n *\tcontextMenu:{\r\n * \t\t// Propiedades de configuración del plugin contextMenu\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */ /*global jQuery */jQuery.rup_jqtable.registerPlugin('contextMenu',{loadOrder:4,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureContextMenu',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureContextMenu',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión del diseño líquido del componente.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * postConfigureFilter(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t * Se almacena la referencia de los diferentes componentes:\r\n\t *\r\n\t * settings.$fluidBaseLayer : Referencia a la capa que se tomará como base para aplicar el diseño líquido.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t * Metodo que realiza la pre-configuración del plugin contextMenu del componente RUP Table.\r\n\t\t * Este método se ejecuta antes de la incialización del plugin.\r\n\t\t *\r\n\t\t * @name preConfigureContextMenu\r\n\t\t * @function\r\n\t\t * @param {object} settings - Parámetros de configuración del componente.\r\n\t\t */preConfigureContextMenu:function preConfigureContextMenu(settings){var $self=this,contextMenuSettings=settings.contextMenu;// Se unifican los parámetros de configuración de mostrar/ocultar los botones de la toolbar\nif(contextMenuSettings.createDefaultRowOperations===true){contextMenuSettings.showOperations=jQuery.extend(true,{},contextMenuSettings.defaultRowOperations,settings.core.showOperations,contextMenuSettings.showOperations);}},/**\r\n\t\t * Metodo que realiza la post-configuración del plugin contextMenu del componente RUP Table.\r\n\t\t * Este método se ejecuta después de la incialización del plugin.\r\n\t\t *\r\n\t\t * @name postConfigureContextMenu\r\n\t\t * @function\r\n\t\t * @param {object} settings - Parámetros de configuración del componente.\r\n\t\t */postConfigureContextMenu:function postConfigureContextMenu(settings){var $self=this,contextMenuSettings=settings.contextMenu;function getTdIndex(thArray,name){for(var i=0;i<thArray.length;i++){if(jQuery(thArray[i]).attr('id')===settings.id+'_'+name){return i+1;}}return-1;}$self.one({'jqGridLoadComplete.rupTable.contextMenu':function jqGridLoadCompleteRupTableContextMenu(data){var tbodyTr='[id=\\''+$self.attr('id')+'\\'] tbody:first tr[role=\\'row\\'].jqgrow',$tbodyTr=jQuery(tbodyTr),contextRowItems={},cellLevelContextMenu=false,globalCellLevelContextMenu=Array.isArray(settings.contextMenu.colNames),itemsPerColumn={},colItem,thArray,$contextMenuSelector;//\t\t\t\t\tjQuery.each(settings.contextMenu.defaultRowOperations, function(buttonId, value){\njQuery.each(settings.contextMenu.showOperations,function(buttonId,value){var operationCfg;if(value!==false){operationCfg=settings.core.operations[buttonId];if(operationCfg!==undefined){contextRowItems[buttonId]={name:operationCfg.name,id:settings.id+'_contextMenu_'+buttonId,cssSprite:operationCfg.icon,disabled:function disabled(){return!jQuery.proxy(operationCfg.enabled,$self)();},callback:function callback(key,options){jQuery.proxy(operationCfg.callback,$self)(key,options);},className:operationCfg.className};if(Array.isArray(value)===true){cellLevelContextMenu=true;contextRowItems[buttonId].colNames=value;}}}});jQuery.each(settings.contextMenu.items,function(index,oper){if(Array.isArray(oper.colNames)){cellLevelContextMenu=true;}});jQuery.extend(true,contextRowItems,settings.contextMenu.items);// En caso de especificar solo para unas columnas\nthArray=jQuery('[id=\\'gview_'+settings.id+'\\'] '+settings.contextMenu.theadThSelector);// Eliminamos los contextMenu creados previamente\n$('ul.context-menu-list',$tbodyTr).remove();if(globalCellLevelContextMenu&&!cellLevelContextMenu){for(var i=0;i<contextMenuSettings.colNames.length;i++){var contextMenuSelector='[id=\\''+$self.attr('id')+'\\'] '+contextMenuSettings.tbodyTdSelector+':nth-child('+getTdIndex(thArray,contextMenuSettings.colNames[i])+')';$contextMenuSelector=jQuery(contextMenuSelector);if($contextMenuSelector.length>0){$.contextMenu('destroy',$contextMenuSelector);$contextMenuSelector.rup_contextMenu({selector:contextMenuSelector,items:contextRowItems});}}}else if(cellLevelContextMenu){//\t\t\t\t\t\t// En caso de no especificarse un valor de colnames para indicar sobre cuales se debe de mostrar el menú contextual, se toman todas las visibles.\nif(!Array.isArray(contextMenuSettings.colNames)){contextMenuSettings.colNames=jQuery.map(settings.colModel,function(elem,index){if(elem.hidden!==true){return elem.name;}});}jQuery.each(contextRowItems,function(index,item){var colNamesAux;if(Array.isArray(item.colNames)){colNamesAux=item.colNames;}else{colNamesAux=contextMenuSettings.colNames;}for(var i=0;i<colNamesAux.length;i++){colItem={};colItem[colNamesAux[i]]={};jQuery.extend(true,itemsPerColumn,colItem);var itemAux={};itemAux[index]=item;jQuery.extend(true,itemsPerColumn[colNamesAux[i]],itemAux);}});jQuery.each(itemsPerColumn,function(index,item){var contextMenuSelector='[id=\\''+$self.attr('id')+'\\'] '+contextMenuSettings.tbodyTdSelector+':nth-child('+getTdIndex(thArray,contextMenuSettings.colNames[i])+')';$contextMenuSelector=jQuery(contextMenuSelector);$.contextMenu('destroy',$contextMenuSelector);if($contextMenuSelector.length>0){$contextMenuSelector.rup_contextMenu({selector:contextMenuSelector,items:item});}});}else{$.contextMenu('destroy',$tbodyTr);if($tbodyTr.length>0){$tbodyTr.rup_contextMenu({selector:tbodyTr,items:contextRowItems});}}}});}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n   * @description Propiedades de configuración del plugin contextMenu del componente RUP Table.\r\n   *\r\n   * @name options\r\n   *\r\n   * @property {string[]} [colNames=null] - Mediante un array se puede configurar las columnas para las cuales se va a mostrar el menú contextual. En caso de especificar el valor null se mostrará en todas las columnas.\r\n   * @property {boolean} [createDefaultRowOperations=true] - Propiedad que indica si el componente va a mostrar las operaciones por defecto como opciones dentro del menú contextual.\r\n   * @property {string} [tbodySelector='tbody:first tr[role=\\'row\\'].jqgrow'] - Selector de jQuery que identifica el tbody de la tabla. Este selector se utiliza para mostrar el menú contextual a nivel de tabla.\r\n\t * @property {string} [tbodyTdSelector='tbody:first tr.jqgrow td'] - Selector de jQuery que identifica las columnas de la tabla. Este selector se utiliza para mostrar el menú contextual a nivel de columna.\r\n\t * @property {string} [theadThSelector='thead:first th'] - Selector de jQuery que identifica las cabeceras de las columnas de la tabla.\r\n   * @property {object} [items={}}] - Se especifica la configuración de los diferentes items que se van a mostrar en el menú contextual para los registros.\r\n\t * @property {rup_jqtable~Operations[]} [showOperations] - Permite indicar que operaciones definidas de manera global van a ser mostradas como opciones en el menú contextual.\r\n   */jQuery.fn.rup_jqtable.plugins.contextMenu={};jQuery.fn.rup_jqtable.plugins.contextMenu.defaults={contextMenu:{colNames:null,createDefaultRowOperations:true,defaultRowOperations:{},rowOperations:{},tbodySelector:'tbody:first tr[role=\\'row\\'].jqgrow',tbodyTdSelector:'tbody:first tr.jqgrow td',theadThSelector:'thead:first th',items:{}}};})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Gestiona las operaciones de filtrado de datos sobre el origen de datos que utiliza el componente.\r\n *\r\n * @summary Plugin de filtrado del componente RUP Table.\r\n * @module rup_jqtable/filter\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"filter\"],\r\n * \tfilter:{\r\n * \t\t// Propiedades de configuración del plugin filter\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */jQuery.rup_jqtable.registerPlugin('filter',{loadOrder:1,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureFilter',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureFilter',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión del filtrado de registros de la tabla.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * postConfigureFilter(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t * Se almacena la referencia de los diferentes componentes:\r\n\t *\r\n\t * settings.filter.$filterContainer : Contenedor del formulario de filtrado\r\n\t * settings.filter.$filterButton : Botón que realiza el filtrado\r\n\t * settings.filter.$cleanButton : Botón para limpiar el formulario\r\n\t * settings.filter.$collapsableLayer : Capa que puede ser ocultada/mostrada\r\n\t * settings.filter.$toggleIcon1Id : Control que oculta muestra el fomulario\r\n\t * settings.filter.$filterSummary : Contenedor donde se especifican los criterios de filtrado\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t\t* Metodo que realiza la pre-configuración del plugin filter del componente RUP Table.\r\n\t\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t\t*\r\n\t\t\t* @name preConfigureFilter\r\n\t\t\t* @function\r\n\t\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t\t*/preConfigureFilter:function preConfigureFilter(settings){var $self=this,tableId=settings.id,filterSettings=settings.filter,filterFormId,toggleIcon1Tmpl,toggleLabelTmpl,filterSummaryTmpl,toggleIcon2Tmpl,$toggleIcon1,$toggleLabel,$filterSummary,$toggleIcon2;/*\r\n\t\t\t * Inicialización de los identificadores y componentes por defecto de los componentes de filtrado\r\n\t\t\t */filterSettings.id=filterSettings.id!==undefined?filterSettings.id:tableId+'_filter_form';filterSettings.filterToolbarId=filterSettings.filterToolbar!==undefined?filterSettings.filterToolbar:tableId+'_filter_toolbar';filterSettings.filterButtonId=filterSettings.filterButtonId!==undefined?filterSettings.filterButtonId:tableId+'_filter_filterButton';filterSettings.cleanButtonId=filterSettings.cleanButtonId!==undefined?filterSettings.cleanButtonId:tableId+'_filter_cleanButton';filterSettings.collapsableLayerId=filterSettings.collapsableLayerId!==undefined?filterSettings.collapsableLayerId:tableId+'_filter_fieldset';filterSettings.toggleIcon1Id=filterSettings.toggleIcon1!==undefined?filterSettings.toggleIcon1:tableId+'_filter_toggle_icon1';filterSettings.toggleLabelId=filterSettings.toggleLabelId!==undefined?filterSettings.toggleLabelId:tableId+'_filter_toggle_label';filterSettings.filterSummaryId=filterSettings.filterSummaryId!==undefined?filterSettings.filterSummaryId:tableId+'_filter_summary';filterSettings.toggleIcon2Id=filterSettings.toggleIcon2!==undefined?filterSettings.toggleIcon2:tableId+'_filter_toggle_icon2';filterSettings.$filterContainer=jQuery('#'+filterSettings.id);filterSettings.$filterToolbar=jQuery('#'+filterSettings.filterToolbarId);if(filterSettings.$filterContainer.length===0){alert('El identificador especificado para el fomulario de búsqueda no existe.');}else if(filterSettings.$filterToolbar.length===0){alert('El identificador especificado para la barra de controles del formulario de filtrado no existe.');}else{/*\r\n\t\t\t\t * Se almacena la referencia de los diferentes componentes\r\n\t\t\t\t *\r\n\t\t\t\t * $filterContainer : Contenedor del formulario de filtrado\r\n\t\t\t\t * $filterButton : Botón que realiza el filtrado\r\n\t\t\t\t * $cleanButton : Botón para limpiar el formulario\r\n\t\t\t\t * $collapsableLayer : Capa que puede ser ocultada/mostrada\r\n\t\t\t\t * $toggleIcon1Id : Control que oculta muestra el fomulario\r\n\t\t\t\t * $filterSummary : Contenedor donde se especifican los criterios de filtrado\r\n\t\t\t\t */toggleIcon1Tmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.filter.toggleIcon1');toggleLabelTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.filter.toggleLabel');filterSummaryTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.filter.filterSummary');toggleIcon2Tmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.filter.toggleIcon2');$toggleIcon1=$(jQuery.jgrid.format(toggleIcon1Tmpl,filterSettings.toggleIcon1Id));$toggleLabel=$(jQuery.jgrid.format(toggleLabelTmpl,filterSettings.toggleLabelId,$.rup.i18n.base.rup_jqtable.plugins.filter.filterCriteria));$filterSummary=$(jQuery.jgrid.format(filterSummaryTmpl,filterSettings.filterSummaryId));$toggleIcon2=$(jQuery.jgrid.format(toggleIcon2Tmpl,filterSettings.toggleIcon2Id));filterSettings.$filterToolbar.append($toggleIcon1).append($toggleLabel).append($filterSummary).append($toggleIcon2);filterSettings.$filterContainer=jQuery('#'+filterSettings.id);filterSettings.$filterButton=jQuery('#'+filterSettings.filterButtonId);//Creacion del boton de filtrado\n//filterSettings.$filterButton.addClass(\"dropdownButton\");\n//filterSettings.$filterButton.append('<ul><li class=\"dropdownButton-list\"><a  class=\"dropdownButton-trigger\" href=\"#\">Filtro</a><div class=\"dropdownButton-content\"><form><fieldset class=\"dropdownButton-inputs\"><div id=\"dropdownButton-combo\"></div></fieldset>       <fieldset class=\"dropdownButton-actions\"><input class=\"ui-button ui-widget ui-state-default ui-corner-all\"  value=\"Guardar\" type=\"submit\"><input  class=\"ui-button ui-widget ui-state-default ui-corner-all\"  value=\"Aplicar\" type=\"submit\"> <input class=\"ui-button ui-widget ui-state-default ui-corner-all\"  value=\"Eliminar\" type=\"submit\"></fieldset>                 </form>               </div></li>             <li class=\"dropdownButton-menu\"><a class=\"dropdownButton-lanzador\" href=\"#\"><span>▼</span></a></li> </ul>');\nfilterSettings.$cleanButton=jQuery('#'+filterSettings.cleanButtonId);filterSettings.$collapsableLayer=jQuery('#'+filterSettings.collapsableLayerId);filterSettings.$toggleIcon1=$toggleIcon1;filterSettings.$toggleLabel=$toggleLabel;filterSettings.$filterSummary=$filterSummary;filterSettings.$toggleIcon2=$toggleIcon2;/*\r\n\t\t\t\t * TODO: Comprobar que la configuración es correcta\r\n\t\t\t\t */if(filterSettings.$filterContainer.prop('tagName')==='FORM'){filterSettings.$filterContainer.ajaxForm();}// Se utiliza el plugin ajaxForm de jQuery para configurar el formualario de busqueda como AJAX.\n// Se redimensiona el formulario de busqueda al tamanyo del grid.\nfilterSettings.$filterContainer.parent().css('width',$self.rup_jqtable('getGridParam','width'));// Se configura la url de filtrado\nif(settings.filter.url===null){settings.filter.url=settings.baseUrl+'/filter';}settings.url=settings.filter.url;// Se almacena en las propiedades la url utilizada para la busqueda a partir de la especificada en el grid.\nsettings.searchURL=$self.rup_jqtable('getGridParam','url');// Se asigna a la tecla ENTER la funcion de busqueda.\nfilterSettings.$filterContainer.bind('keydown',function(evt){if(evt.keyCode==13){// TODO : poner como evento\n//$self.rup_jqtable(\"showSearchCriteria\");\n$self.rup_jqtable('filter');}});// Creacion del boton de busqueda.\nfilterSettings.$filterButton.bind('click',function(){// TODO: Control cambios\n// TODO : poner como evento\n//Deshabilitar el nombre del filtro en el filterSummary una vez que ha terminado el filtro por defecto\nif(settings.$firstStartUp){settings.$firstStartUp=false;}//$self.rup_jqtable(\"showSearchCriteria\");\n$self.rup_jqtable('filter');});// Creacion del botón de limpiar formulario.\nfilterSettings.$cleanButton.bind('click',function(){// TODO : poner como evento\nif(settings.$firstStartUp){settings.$firstStartUp=false;}$self.rup_jqtable('cleanFilterForm').rup_jqtable('filter');if(filterSettings.validate!==undefined){jQuery('.rup-maint_validateIcon',filterSettings.$filterContainer).remove();}//$self.rup_jqtable(\"showSearchCriteria\");\n});filterSettings.$toggleIcon1.add(filterSettings.$toggleLabel).add(filterSettings.$toggleIcon2).attr('tabindex','0').on({'keydown':function keydown(evt){if(evt.keyCode==13){$self.rup_jqtable('toggleFilterForm');}}});filterSettings.$filterToolbar.addClass('cursor_pointer').on({'click':function click(){$self.rup_jqtable('toggleFilterForm');}});if(settings.filter.showHidden===true){filterSettings.$collapsableLayer.hide();//\t\t\t\t\t\tfilterSettings.$collapsableRowShow.show();\nfilterSettings.$toggleIcon1.removeClass('ui-icon-triangle-1-n').addClass('ui-icon-triangle-1-s');filterSettings.$filterSummary.parent().addClass('rup-maint_searchCriteria');}// Configuración de validaciones\nif(filterSettings.validate!==undefined){filterSettings.$filterContainer.rup_validate(filterSettings.validate);$self.on({'rupTable_beforeFilter.filter.validate':function rupTable_beforeFilterFilterValidate(){//filterSettings.$filterContainer.rup_validate(\"resetForm\");\nif(multifilterSettings!==undefined){if(!settings.$firstStartUp){return filterSettings.$filterContainer.valid();}else{return null;}}else{return filterSettings.$filterContainer.valid();}}});}}$self.on({'rupTable_serializeGridData.filter':function rupTable_serializeGridDataFilter(events,postData){var filterParams=form2object(settings.filter.$filterContainer[0]),queryStrFilterParams=jQuery.param(filterParams),lastFilterParams=$self.data('tmp.lastFilterParams');var filtro;if(settings.$firstStartUp==true){var filtro=multifilterSettings.$filterDefaultValue;}if(filtro==undefined){jQuery.extend(postData,{'filter':filterParams});}else{jQuery.extend(postData,{'filter':filtro});}if(lastFilterParams===undefined||lastFilterParams!==queryStrFilterParams){jQuery.extend(postData,{page:$self.data('tmp.firstLoad')===true&&settings.core.startOnPage!==null?settings.core.startOnPage:'1'});$self.data('tmp.lastFilterParams',queryStrFilterParams);}}});$self.on('jqGridGridComplete',function(event){if($self.data('settings')!==undefined){$self.rup_jqtable('showSearchCriteria');}});// gestion de evento por defecto Multifiltro\nif(settings.multifilter!=undefined&&settings.multifilter!=null){var $filterForm,$filterDefaultName,$firstStartUp;var multifilterSettings=settings.multifilter;settings.filter.$filterForm=$('#'+settings.id+'_filter_form');var selector;settings.$firstStartUp=true;if(multifilterSettings.idFilter!=null){selector=multifilterSettings.idFilter;}else{selector=settings.id;}var usuario;if(multifilterSettings.userFilter!=null){usuario=multifilterSettings.userFilter;}else{usuario=LOGGED_USER;}var getDefault;if(multifilterSettings.getDefault!=null){getDefault=multifilterSettings.getDefault;}else{getDefault=true;}// getDefault\nif(getDefault){$.rup_ajax({url:settings.baseUrl+'/multiFilter/getDefault?filterSelector='+selector+'&user='+usuario,type:'GET',dataType:'json',showLoading:false,contentType:'application/json',//async : false,\ncomplete:function complete(jqXHR,textStatus){if(settings.loadOnStartUp){$self.rup_jqtable('filter');}$self.triggerHandler('rupTable_multifilter_fillForm',$self.data.filterData);//\t\t\t\t\t\t\t\t\t\t\t\t$self.triggerHandler(\"rupTable_multifilter_fillForm\",form2object(settings.filter.$filterContainer[0]));\n},success:function success(data,status,xhr){if(data!=null){var valorFiltro=$.parseJSON(data.filterValue);$self._fillForm(valorFiltro);//settings.filter.$filterSummary.html(\"<i>\"+data.filterName+\"</i>\");\nmultifilterSettings.$filterDefaultName=data.filterName;multifilterSettings.$filterDefaultValue=valorFiltro;$self.data.filterData=valorFiltro;}},error:function error(xhr,ajaxOptions,thrownError){}});}}},/**\r\n\t\t * Metodo que realiza la post-configuración del plugin filter del componente RUP Table.\r\n\t\t * Este método se ejecuta después de la incialización del plugin.\r\n\t\t *\r\n\t\t * @name postConfigureFilter\r\n\t\t * @function\r\n\t\t * @param {object} settings - Parámetros de configuración del componente.\r\n\t\t */postConfigureFilter:function postConfigureFilter(settings){var $self=this,filterFormId,filterSettings;}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Métodos públicos del plugin filter.\r\n\t *\r\n\t * cleanFilterForm: Realiza una limpieza de los campos del formulario.\r\n\t * filter: Lanza el filtrado de la tabla de acuerdo a los criterios indicados en el formulario.\r\n\t * toggleFilterForm: Método encargado de ocultar y mostrar el formulario de filtrado.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n     * Limpia los campos del formulario de filtrado.\r\n     *\r\n     * @function  cleanFilterForm\r\n\t\t * @fires module:rup_jqtable#rupTable_filter_beforeCleanFilterForm\r\n\t\t * @fires module:rup_jqtable#rupTable_filter_afterCleanFilterForm\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"cleanFilterForm\");\r\n     */cleanFilterForm:function cleanFilterForm(){var $self=this,settings=$self.data('settings');$self.triggerHandler('rupTable_filter_beforeCleanFilterForm');$self.rup_jqtable('resetForm',settings.filter.$filterContainer);$self.triggerHandler('rupTable_filter_afterCleanFilterForm');return $self;},/**\r\n     * Realiza el filtrado de acuerdo a los datos existentes en el formulario de filtrado.\r\n     *\r\n     * @function  filter\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeFilter\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"filter\");\r\n     */filter:function filter(){var $self=this,settings=$self.data('settings');var bfr=$self.triggerHandler('rupTable_beforeFilter');if(bfr===false||bfr==='stop'){return;}if($.isFunction(settings.filter.beforeFilter)){bfr=settings.filter.beforeFilter.call($self);if(bfr===undefined){bfr=true;}if(bfr===false){return;}}$self.rup_jqtable('setGridParam',{page:'1'});$self.trigger('reloadGrid');},/**\r\n     * Devuelve los parámetros de filtrado empleados en el filtrado.\r\n     *\r\n     * @function  getFilterParams\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getFilterParams\");\r\n     */getFilterParams:function getFilterParams(){var $self=this,settings=$self.data('settings');return form2object(settings.filter.$filterContainer[0]);},/**\r\n     *  Oculta el formulario de filtrado.\r\n     *\r\n     * @function  hideFilterForm\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"hideFilterForm\");\r\n     */hideFilterForm:function hideFilterForm(){var $self=$(this),settings=$self.data('settings'),filterSettings=settings.filter;filterSettings.$collapsableLayer.hide(settings.filter.transitionConfig);//\t\t\tfilterSettings.$collapsableRowShow.show(settings.filter.transitionConfig);\nfilterSettings.$toggleIcon2.removeClass('ui-icon-circle-triangle-n').addClass('ui-icon-circle-triangle-s');filterSettings.$toggleIcon1.removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');filterSettings.$filterSummary.parent().addClass('rup-maint_searchCriteria');},/**\r\n     * Muestra el formulario de filtrado.\r\n     *\r\n     * @function showFilterForm\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"showFilterForm\");\r\n     */showFilterForm:function showFilterForm(){var $self=$(this),settings=$self.data('settings'),filterSettings=settings.filter;// Se muestra el formulario de búsqueda\nfilterSettings.$collapsableLayer.show($.extend({},settings.filter.transitionConfig,{complete:function complete(){// Anadido el foco al primer campo del formulario\njQuery('input:first',filterSettings.$filterContainer).focus();}}));filterSettings.$toggleIcon2.removeClass('ui-icon-circle-triangle-s').addClass('ui-icon-circle-triangle-n');filterSettings.$toggleIcon1.removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');filterSettings.$filterSummary.parent().removeClass('rup-maint_searchCriteria');//Eliminar tooltip\n//\t\t\t$titleSearch.rup_tooltip(\"destroy\");\n//\t\t\tfilterSettings.$collapsableRowShow.hide(settings.filter.transitionConfig);\n},/**\r\n     * Alterna el estado del formulario de filtrado entre visible y oculto.\r\n     *\r\n     * @function toggleFilterForm\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"toggleFilterForm\");\r\n     */toggleFilterForm:function toggleFilterForm(){var $self=$(this),settings=$self.data('settings'),filterSettings=settings.filter;if(filterSettings.$collapsableLayer.is(':hidden')){//MOSTRAR\n$self.rup_jqtable('showFilterForm');}else{// OCULTAR\n$self.rup_jqtable('hideFilterForm');}return $self;},/**\r\n     * Actualiza el resumen de los criterios de filtrado a partir de los valores existentes en el formulario.\r\n     *\r\n     * @function showSearchCriteria\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"showSearchCriteria\");\r\n     */showSearchCriteria:function showSearchCriteria(){var $self=this,settings=$self.data('settings'),searchString=' ',temp='',label,numSelected,field,fieldId,fieldName,fieldValue,aux=settings.filter.$filterContainer.serializeArray(),searchForm=settings.filter.$filterContainer,filterMulticombo=new Array();var obj;//añadir arbol\nvar nombreArbol=$('.jstree',settings.filter.$filterContainer);var arboles=$('.jstree',settings.filter.$filterContainer);$.each(arboles,function(index,item){obj=new Object();obj.name=$(item).attr('name');obj.value=$(item).rup_tree('getRupValue').length;obj.type='rup_tree';aux.push(obj);});for(var i=0;i<aux.length;i++){if(aux[i].value!==''&&$.inArray(aux[i].name,settings.filter.excludeSummary)!=0){//CAMPO a tratar\nfield=$('[name=\\''+aux[i].name+'\\']',searchForm);//Comprobar si se debe excluir el campo\nif($.inArray(field.attr('id'),settings.filter.filterExclude)!==-1){continue;}//Seleccionar radio\nif(field.length>1){field=$('[name=\\''+aux[i].name+'\\']:checked',searchForm);}//Omitir campos hidden\nif($(field).attr('type')==='hidden'){continue;}//ID del campo\nfieldId=$(field).attr('id');//ID para elementos tipo rup.combo\nif($(field).attr('ruptype')==='combo'){if(field.next('.ui-multiselect').length==0){fieldId+='-button';}}//ID para elementos tipo rup.autocomplete\nif($(field).attr('ruptype')==='autocomplete'){fieldId=fieldId.substring(0,fieldId.indexOf('_label'));}//NAME\nlabel=$('label[for^=\\''+fieldId+'\\']',searchForm);if(label.length>0){// <label for='xxx'></label>\nfieldName=label.html();}else{// <div></div>\n// <div></div>\nif($(field).attr('ruptype')!=='combo'){//fieldName= $(\"[name='\" + aux[i].name + \"']\",searchForm).prev('div').html();\nfieldName=$('[name=\\''+aux[i].name+'\\']',searchForm).prev('div').find('label').first().html();}else{//fieldName= $(\"[name='\" + aux[i].name + \"']\",searchForm).parent().prev('div').html();\n// Buscamos el label asociado al combo\n// Primero por id\nvar $auxField=$('[name=\\''+aux[i].name+'\\']',searchForm),$labelField;$labelField=jQuery('[for=\\''+$auxField.attr('id')+'\\']');if($labelField.length>0){fieldName=$labelField.first().text();}else{fieldName=$('[name=\\''+aux[i].name+'\\']',searchForm).parent().prev('div').find('label').first().html();}}}if(fieldName===null||fieldName===undefined){fieldName='';}//VALUE\nfieldValue=' = ';switch($(field)[0].tagName){case'INPUT':fieldValue=fieldValue+$(field).val();if($(field)[0].type==='checkbox'||$(field)[0].type==='radio'){fieldValue='';}break;//Rup-tree\ncase'DIV':$.each(aux,function(index,item){if(item.name==field.attr('id')){if(item.value!=0){fieldValue+=' = '+item.value;}}else{fieldValue='';}});if(fieldValue==''){fieldName='';}break;case'SELECT':if(field.next('.ui-multiselect').length==0){fieldValue=fieldValue+$('option[value=\\''+aux[i].value+'\\']',field).html();}else{if($.inArray($(field).attr('id'),filterMulticombo)===-1){numSelected=field.rup_combo('value').length;if(numSelected!==0){fieldValue+=numSelected;}else{fieldName='';fieldValue='';}filterMulticombo.push($(field).attr('id'));}else{fieldName='';fieldValue='';}}break;}//Parsear NAME\nvar parseableChars=new Array(':','=');for(var j=0;j<parseableChars.length;j++){if(fieldName!==''&&fieldName.indexOf(parseableChars[j])!==-1){fieldName=fieldName.substring(0,fieldName.indexOf(parseableChars[j]));break;}}//Controlar rup.combo con valor vacío\nwhile(fieldValue.indexOf('&amp;nbsp;')!==-1){fieldValue=fieldValue.replace('&amp;nbsp;','');}//Si no tiene NAME sacar solo el valor\nif(fieldName===''&&fieldValue.indexOf(' = ')!==-1){fieldValue=fieldValue.substring(2,fieldValue.length);}//Si no tiene NAME ni VALUE omitir\nif(fieldName===''&&$.trim(fieldValue)===''){continue;}searchString=searchString+fieldName+fieldValue+', ';}}if(jQuery.isFunction(settings.filter.fncSearchCriteria)){searchString=jQuery.proxy(settings.filter.fncSearchCriteria,$self,searchString)();}if($.trim(searchString).length-1==$.trim(searchString).lastIndexOf(',')){searchString=searchString.substr(0,searchString.lastIndexOf(','))+' ';}if(settings.multifilter){if(jQuery.isFunction(settings.multifilter.fncFilterName)){searchString=jQuery.proxy(settings.multifilter.fncFilterName,$self,searchString)();}}//Contiene criterios\n//\t\t\tif (searchString.length>1){\n//searchString = searchString.substring(0, searchString.length-2);\nvar initialHeight=$('#titleSearch_'+settings.id.name).css('height'),height,tmp=searchString,tooltip=false;//Añadir criterios\nwhile(true){settings.filter.$filterSummary.html(' <i>'+tmp+'</i>');height=$('#titleSearch_'+settings.id.name).css('height');if(height===initialHeight){break;}tmp=tmp.substring(0,tmp.lastIndexOf(','))+' <b>...</b>';tooltip=true;}//Tooltip con criterios\nif(tooltip){settings.filter.$filterSummary.rup_tooltip({content:{text:searchString.substring(1)},position:{my:'bottom center',at:'top center'}});}}//\t\t}\n});//*******************************\n// DEFINICIÓN DE MÉTODOS PRIVADOS\n//*******************************\njQuery.fn.rup_jqtable('extend',{/**\r\n     * Obtiene el label correspondiente a un campo por el que se realiza el filtrado.\r\n     *\r\n     * @function _getSearchFormFieldLabel\r\n\t\t * @private\r\n\t\t * @param {object} $field Referencia jQuery a un campo del formulario de filtrado.\r\n\t\t * @param {object} $form Referencia jQuery al formulario de filtrado.\r\n\t\t * @return {string} - Label identificador al campo del formulario indicado por parámetro.\r\n     * @example\r\n     * $self._getSearchFormFieldLabel($field, $form);\r\n     */_getSearchFormFieldLabel:function _getSearchFormFieldLabel($field,$form){var fieldId=$field.attr('id'),$label,formFieldLabel='',rupType=$field.attr('ruptype');if(rupType!=='combo'){$label=jQuery('label[for=\\''+fieldId+'\\']',$form);}else{$label=jQuery('label[for=\\''+fieldId+'-button\\']',$form);}if($label.length>0){// <label for='xxx'></label>\nformFieldLabel=$label.html();}else{// <div></div>\n// <div></div>\nif($field.attr('ruptype')!=='combo'){//fieldName= $(\"[name='\" + aux[i].name + \"']\",searchForm).prev('div').html();\nformFieldLabel=$('[name=\\''+name+'\\']',$form).prev('div').find('label').first().html();}else{//fieldName= $(\"[name='\" + aux[i].name + \"']\",searchForm).parent().prev('div').html();\nformFieldLabel=$('[name=\\''+name+'\\']',$form).parent().prev('div').find('label').first().html();}}// Eliminamos los caracteres ':' y '=' que puedan existir en el label\nformFieldLabel=formFieldLabel.replace(/[:=]/g,'');return formFieldLabel;},/**\r\n     * Obtiene el value del campo por el que se está filtrando.\r\n     *\r\n     * @function _getSearchFormFieldLabel\r\n\t\t * @private\r\n\t\t * @param {object} $field Referencia jQuery a un campo del formulario de filtrado.\r\n\t\t * @param {object} $form Referencia jQuery al formulario de filtrado.\r\n\t\t * @return {string} - Value correspondiente al campo del formulario indicado por parámetro.\r\n     * @example\r\n     * $self._getSearchFormFieldValue($field, $form);\r\n     */_getSearchFormFieldValue:function _getSearchFormFieldValue($field,$form){var fieldValue=' = ',filterMulticombo=[],numSelected,fieldName;//VALUE\nswitch($field.prop('tagName')){case'INPUT':fieldValue=fieldValue+$field.val();if($field.attr('type')==='checkbox'||$field.attr('type')==='radio'){fieldValue='';}break;case'SELECT':if($field.next('.ui-multiselect').length==0){fieldValue=fieldValue+$('option[value=\\''+$field.rup_combo('getRupValue')+'\\']',$field).html();}else{if($.inArray($field.attr('id'),filterMulticombo)===-1){numSelected=$field.rup_combo('value').length;if(numSelected!==0){fieldValue+=numSelected;}else{fieldName='';fieldValue='';}filterMulticombo.push($field.attr('id'));}else{fieldName='';fieldValue='';}}break;}//Controlar rup.combo con valor vacío\nwhile(fieldValue.indexOf('&amp;nbsp;')!==-1){fieldValue=fieldValue.replace('&amp;nbsp;','');}return fieldValue;}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t * Parámetros de configuración por defecto para el plugin filter.\r\n\t *\r\n\t */ /**\r\n \t* @description Propiedades de configuración del plugin filter del componente RUP Table.\r\n \t*\r\n \t* @name options\r\n \t*\r\n \t* @property {boolean} [showHidden=false] -  Determina si el formulario de filtrado se debe de mostrar inicialmente oculto o no.\r\n \t* @property {string} [url=null] - Url que se va a utilizar para realizar las peticiones de filtrado de la tabla. En caso de no especificarse una concreta, se utilizará por defecto una construida a partir de la url base. (urlBase + /filter).\r\n \t* @property {object} [transitionConfig] - Configuración del efecto de la animación de mostrar/ocultar el formulario defiltrado.\r\n \t* @property {function} [fncSearchCriteria] - Permite especificar una función de callback en la cual es posible modificar la cadena de texto con la que se muestra el resumen de los parámetros de filtrado.\r\n \t*/jQuery.fn.rup_jqtable.plugins.filter={};jQuery.fn.rup_jqtable.plugins.filter.defaults={core:{startOnPage:null},filter:{url:null,showHidden:false,transitionConfig:{duration:'slow',effect:'blind'}}};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n   *  Se lanza antes de producirse la petición de filtrado.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_beforeFilter\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_beforeFilter\", function(event){ });\r\n   */ /**\r\n    *   El botón de limpiar el formulario, limpia y filtra el formulario. Este evento se lanza antes de limpiar el formulario del filtro pero antes de filtrar con el formulario limpio.\r\n    *\r\n    * @event module:rup_jqtable#rupTable_filter_beforeCleanFilterForm\r\n    * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n    * @example\r\n    * $(\"#idComponente\").on(\"rupTable_filter_beforeCleanFilterForm\", function(event){ });\r\n    */ /**\r\n    *   El botón de limpiar el formulario, limpia y filtra el formulario. Este evento se lanza después de limpiar el formulario del filtro pero antes de filtrar con el formulario limpio.\r\n    *\r\n    * @event module:rup_jqtable#rupTable_filter_afterCleanFilterForm\r\n    * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n    * @example\r\n    * $(\"#idComponente\").on(\"rupTable_filter_afterCleanFilterForm\", function(event,){ });\r\n    */})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Permite al usuario realizar una búsqueda entre el conjunto de resultados que se le muestran. Mediante una serie de criterios de búsqueda permite al usuario posicionarse entre los diferentes registros que se ajustan a dichos criterios.\r\n *\r\n * @summary Plugin de search del componente RUP Table.\r\n * @module rup_jqtable/search\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"search\"],\r\n * \tsearch:{\r\n * \t\t// Propiedades de configuración del plugin search\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * preConfiguration: Método que se ejecuta antes de la invocación del componente jqGrid.\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */jQuery.rup_jqtable.registerPlugin('search',{loadOrder:9,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureSearch',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureSearch',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión de la búsqueda de registros.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * preConfigureSearch(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t * postConfigureSearch(settings): Método que define la postconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin search del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigureSearch\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigureSearch:function preConfigureSearch(settings){// Añadimos la columna por defecto para mostrar la información de registros encontrados\n//\t\t\tsettings.colNames = $.merge([\"\"], settings.colNames);\n//\t\t\tsettings.colModel = $.merge([settings.search.defaultSearchInfoCol], settings.colModel);\n// Se configura la url de filtrado\nif(settings.search.url===null){settings.search.url=settings.baseUrl+'/search';}},/**\r\n\t\t* Metodo que realiza la post-configuración del plugin search del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name postConfigureSearch\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/postConfigureSearch:function postConfigureSearch(settings){var $self=this;$self.rup_jqtable('createSearchRow',settings);$self._initializeSearchProps(settings);$self.on({'jqGridLoadComplete.rupTable.search':function jqGridLoadCompleteRupTableSearch(data){var page=parseInt($self.rup_jqtable('getGridParam','page'),10);if($self._hasPageMatchedElements(page)){$self.rup_jqtable('highlightMatchedRowsInPage',page);//\t\t\t\t\t\t// TODO: Generalizar\n//\t\t\t\t\t\t$self.find(\"td[aria-describedby='\"+settings.id+\"_infoSearch'] img.ui-icon.ui-icon-search\").remove();\n//\t\t\t\t\t\tfor (var i=0;i<settings.search.matchedRowsPerPage[page].length;i++){\n//\t\t\t\t\t\t\tnewIndexPos = settings.search.matchedRowsPerPage[page][i];\n//\t\t\t\t\t\t\t$($self.jqGrid(\"getInd\",newIndexPos, true)).find(\"td[aria-describedby='\"+settings.id+\"_infoSearch']\").html($(\"<img/>\").addClass(\"ui-icon ui-icon-search\")[0]);\n//\t\t\t\t\t\t}\n}$self.rup_jqtable('updateSearchPagination');},'jqGridSelectRow.rupTable.search rupTable_setSelection.search':function jqGridSelectRowRupTableSearchRupTable_setSelectionSearch(event,id,status,obj){$self.rup_jqtable('updateSearchPagination',id);},'jqGridGridComplete.rup_jqtable.search':function jqGridGridCompleteRup_jqtableSearch(event){var $self=$(this),settings=$self.data('settings');if($self.rup_jqtable('getGridParam','records')===0){settings.search.$searchRow.hide();}else{settings.search.$searchRow.show();}},'rupTable_searchAfterCreateToolbar':function rupTable_searchAfterCreateToolbar(event,$searchRow){var props=$self[0].p,colModel=props.colModel,cellColModel,$elem,editOptions,searchRupType,searchEditOptions;$('th[role=\\'columnheader\\']',$searchRow).each(function(i){cellColModel=colModel[i];searchRupType=cellColModel.searchoptions!==undefined&&cellColModel.searchoptions.rupType!==undefined?cellColModel.searchoptions.rupType:cellColModel.rupType;var colModelName=cellColModel.name;$elem=$('[name=\\''+colModelName+'\\']',$searchRow);// Se añade el title de los elementos de acuerdo al colname\n$elem.attr({'title':props.colNames[i],'class':'editable customelement'}).removeAttr('readOnly');// En caso de tratarse de un componente rup, se inicializa de acuerdo a la configuracón especificada en el colModel\nif(searchRupType!==undefined){searchEditOptions=cellColModel.searchoptions||cellColModel.editoptions;/*\r\n\t\t\t\t\t\t\t * PRE Configuración de los componentes RUP\r\n\t\t\t\t\t\t\t */switch(searchRupType){case'combo':searchEditOptions=$.extend({},{menuWidth:$elem.width()},searchEditOptions,{width:'97%'});break;}// Invocación al componente RUP\n$elem['rup_'+searchRupType](searchEditOptions);/*\r\n\t\t\t\t\t\t\t * POST Configuración de los componentes RUP\r\n\t\t\t\t\t\t\t */switch(searchRupType){case'date':// TODO: Aplicarlo con estilos\n$elem.css('width','86%');break;}}});}});}});/**\r\n\t * Métodos públicos del plugin search.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * toggleSearchForm(): Método que gestiona el mostrar/ocultar el formulario de búsqueda.\r\n\t * createSearchRow(settings): Genera el formulario de búsqueda.\r\n\t * navigateToMatchedRow(matchedRow): Se posiciona en el registro indicado que se corresponde con los criterios de búsqueda.\r\n\t * doSearch(): Realiza la búsqueda de acuerdo a los criterios especificados.\r\n\t * goToFirstMatched(paramPage): Navega hasta el primer resgistro que se corresponde con la búsqueda.\r\n\t * fncGetSearchNavigationParams(buttonType): Devuelve los parámetros de navegación correspondientes al botón de navegación indicado.\r\n\t * doSearchNavigation(arrParams, execute, changePage, index, npos, newPage, newPageIndex): Realiza la navegación entre los resultados de la búsqueda.\r\n\t * clearSearch(): Realiza un borrado de los resultados de la búsqueda.\r\n\t * clearHighlightedMatchedRows(): Elimina el resaltado de los registros\r\n\t * highlightMatchedRowsInPage(page): Realiza el resaltado de los resultados de los registros para la página indicada.\r\n\t * highlightMatchedRow($row): Resalta la línea indicada.\r\n\t * updateSearchPagination(paramRowId): Actualiza los controles de paginación del formulario de búsqueda.\r\n\t * getSearchCurrentRowCount(): Devuelve el resgistro actual en el que se encuentra el registro seleccionado respecto al conjunto de resultados.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n     *  Muestra/Oculta el formulario de búsqueda.\r\n     *\r\n     * @function toggleSearchForm\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"toggleSearchForm\");\r\n     */toggleSearchForm:function toggleSearchForm(){var $self=this,settings=$self.data('settings'),prop=$self[0].p,trow,trow2;if(!settings.search.created){$self.rup_jqtable('createSearchToolbar');settings.search.$collapseIcon.removeClass('ui-icon-triangle-1-e');settings.search.$collapseIcon.addClass('ui-icon-triangle-1-s');jQuery('#searchNavLayer_'+settings.id).show();settings.search.created=true;jQuery('input','table thead tr.ui-search-toolbar').keypress(function(e){var key=e.charCode||e.keyCode||0;if(key==13){$self.rup_jqtable('search');return false;}return this;});}else{trow=jQuery('tr.ui-search-toolbar',$self[0].grid.hDiv);trow2=prop.frozenColumns===true?jQuery('tr.ui-search-toolbar',$self[0].grid.fhDiv):false;if(jQuery('tr.ui-search-toolbar','#gview_'+settings.id).is(':visible')){trow.hide(settings.search.transitionConfig);if(trow2){trow2.hide(settings.search.transitionConfig);}jQuery('#searchNavLayer_'+settings.id).hide(settings.search.transitionConfig);settings.search.$collapseIcon.removeClass('ui-icon-triangle-1-s');settings.search.$collapseIcon.addClass('ui-icon-triangle-1-e');}else{trow.show(settings.search.transitionConfig);if(trow2){trow2.show(settings.search.transitionConfig);}jQuery('#searchNavLayer_'+settings.id).show(settings.search.transitionConfig);settings.search.$collapseIcon.removeClass('ui-icon-triangle-1-e');settings.search.$collapseIcon.addClass('ui-icon-triangle-1-s');}}},/**\r\n     * Genera la barra de controles para gestionar la búsqueda.\r\n     *\r\n     * @function createSearchToolbar\r\n\t\t * @fires module:rup_jqtable#rupTable_searchAfterCreateToolbar\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"createSearchToolbar\");\r\n     */createSearchToolbar:function createSearchToolbar(){var $self=this,settings=$self.data('settings'),prop=$self[0].p,$searchRow=jQuery('<tr>').attr({'class':'ui-search-toolbar','role':'rowheader'});if(jQuery('table thead tr:first th[id=\\''+settings.id+'_cb\\']',$self[0].grid.hDiv).length!==0){$searchRow.append(jQuery('<th>').attr({'role':'columnheader','class':'search_row_header ui-th-column ui-th-'+prop.direction}));}$searchRow.append(jQuery('<th>').attr({'role':'columnheader','class':'search_row_header ui-th-column ui-th-'+prop.direction}));$.each(prop.colModel,function(index,colM){var $searchHeader=jQuery('<th>').attr({'role':'columnheader','class':'search_row_header ui-th-column ui-th-'+prop.direction}),elc,$elc;if(colM.hidden===true){$searchHeader.css('display','none');}colM.search=colM.search===false?false:true;if(colM.stype===undefined){colM.stype=colM.edittype!==undefined?colM.edittype:'text';if(colM.searchoptions!==undefined&&colM.searchoptions.rupType==='combo'){colM.stype='text';}}var soptions=$.extend({},colM.searchoptions||colM.editoptions||{},{id:colM.name,name:colM.name});if(colM.search){elc=$.jgrid.createEl.call($self[0],colM.stype!==undefined?colM.stype:colM.edittype,soptions,'',true,$.extend({},$.jgrid.ajaxOptions,soptions.ajaxSelectOptions||{}));$elc=jQuery(elc);$elc.css('width','97%');//\t\t\t\t\t$searchCol.append($elc);\n$searchHeader.append($elc);}if(colM.name!==settings.defaultGridInfoCol.name&&colM.name!==settings.defaultGridMultiplePkCol.name&&colM.name!=='cb'){$searchRow.append($searchHeader);}});$('table thead',$self[0].grid.hDiv).append($searchRow);settings.search.$searchRowInputs=jQuery('table thead tr.ui-search-toolbar','#gview_'+settings.id);settings.search.$searchRowInputs.attr({'id':settings.id+'_search_rowInputs','form':settings.id+'_search_rowInputs'});// Configuración de validaciones\nif(settings.search.validate!==undefined){settings.search.$searchForm.rup_validate(settings.search.validate);$self.on({'rupTable_beforeSearch.search.validate':function rupTable_beforeSearchSearchValidate(){return settings.search.$searchForm.valid();}});}$self.triggerHandler('rupTable_searchAfterCreateToolbar',[$searchRow]);$self[0].ftoolbar=true;},/**\r\n     * Genera la barra de controles para gestionar la búsqueda.\r\n     *\r\n     * @function createSearchRow\r\n\t\t * @param {object} settings - Genera la línea de busqueda de acuerdo a las propiedades de configuración especificadas.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"createSearchRow\", settings);\r\n     */createSearchRow:function createSearchRow(settings){var $self=this,$gridHead=jQuery('table thead','#gview_'+settings.id),searchForm,// Templates\nsearchRowHeaderTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.searchRowHeader'),collapseLayerTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.collapseLayer'),collapseIconTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.collapseIcon'),collapseLabelTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.collapseLabel'),matchedLayerTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.matchedLayer'),matchedLabelTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.matchedLabel'),navLayerTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.navLayer'),navButtonTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.navButton'),navSearchButtonTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.navSearchButton'),navClearButtonTmpl=jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.navClearButton'),// Objetos\n$searchRow=$(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.templates.search.searchRow')),$searchRowHeader=$(jQuery.jgrid.format(searchRowHeaderTmpl,$gridHead.find('th').length-$gridHead.find('th:hidden').length)),// Capa que controla el colapso del formualario\n$collapseLayer=$(jQuery.jgrid.format(collapseLayerTmpl,'searchCollapseLayer_'+settings.id)),$collapseIcon=$(jQuery.jgrid.format(collapseIconTmpl,'searchCollapseIcon_'+settings.id)),$collapseLabel=$(jQuery.jgrid.format(collapseLabelTmpl,'searchCollapsLabel_'+settings.id,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.plugins.search.searchCriteria'))),// Capa que muestra el número de ocurrencias\n$matchedLayer=$(jQuery.jgrid.format(matchedLayerTmpl,'matchedLayer_'+settings.id)),$matchedLabel=$(jQuery.jgrid.format(matchedLabelTmpl,'matchedLabel_'+settings.id,jQuery.jgrid.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.plugins.search.matchedRecords'),0))),// Capa que controla la navegación entre las diferentes ocurrencias\n$navLayer=$(jQuery.jgrid.format(navLayerTmpl,'searchNavLayer_'+settings.id)),$firstNavButton=$(jQuery.jgrid.format(navButtonTmpl,'search_nav_first_'+settings.id,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.first'))),$backNavButton=$(jQuery.jgrid.format(navButtonTmpl,'search_nav_back_'+settings.id,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.previous'))),$forwardNavButton=$(jQuery.jgrid.format(navButtonTmpl,'search_nav_forward_'+settings.id,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.next'))),$lastNavButton=$(jQuery.jgrid.format(navButtonTmpl,'search_nav_last_'+settings.id,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.last'))),$navSearchButton=$(jQuery.jgrid.format(navSearchButtonTmpl,'search_nav_button_'+settings.id,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.search.Find'))),$navClearButton=$(jQuery.jgrid.format(navClearButtonTmpl,'search_nav_clear_button'+settings.id,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.search.Reset')));// Construcción del objeto final\n$collapseLayer.append($collapseIcon).append($collapseLabel);$matchedLayer.append($matchedLabel);$navLayer.append($firstNavButton).append($backNavButton).append($forwardNavButton).append($lastNavButton).append($navSearchButton).append($navClearButton);$searchRowHeader.append($collapseLayer);$searchRowHeader.append($matchedLayer);$searchRowHeader.append($navLayer);$searchRow.append($searchRowHeader);$gridHead.append($searchRow);settings.search=settings.search||{};settings.search.created=false;//\t\t\tsettings.search.url = settings.search.url || settings.url+\"../search\";\nsettings.search.$collapseIcon=$collapseIcon;settings.search.$searchRow=$searchRow;settings.search.$matchedLabel=$matchedLabel;settings.search.$firstNavButton=$firstNavButton;settings.search.$backNavButton=$backNavButton;settings.search.$forwardNavButton=$forwardNavButton;settings.search.$lastNavButton=$lastNavButton;// Creacion del enlace de mostrar/ocultar el formulario\n$collapseIcon.add($collapseLabel).on('click',function(){$self.rup_jqtable('toggleSearchForm');});// Evento de búsqueda asociado al botón\n$navSearchButton.on('click',function(){$self.rup_jqtable('search');});// Evento asociado a limpiar el fomulario de búsqueda\n$navClearButton.on('click',function(){$self.rup_jqtable('clearSearch');});$navLayer.hide();function doSearchButtonNavigation($button,buttonId){if(!$button.hasClass('ui-state-disabled')){$self.rup_jqtable('navigateToMatchedRow',buttonId);}}// Elemento primero\n$firstNavButton.on('click',function(){doSearchButtonNavigation(jQuery(this),'first');});// Elemento anterior\n$backNavButton.on('click',function(){doSearchButtonNavigation(jQuery(this),'prev');});// Elemento siguiente\n$forwardNavButton.on('click',function(){doSearchButtonNavigation(jQuery(this),'next');});// Elemento ultimo\n$lastNavButton.on('click',function(){doSearchButtonNavigation(jQuery(this),'last');});// Se recubre con un form\nvar $searchForm=jQuery('<form>').attr('id',settings.id+'_search_searchForm');settings.search.$searchRow.parent().parent().wrap($searchForm);settings.search.$searchForm=jQuery('#'+settings.id+'_search_searchForm');settings.search.$searchRow.hide();},/**\r\n     *  Navega hasta el elemento indicado que se ajusta a los criterios de búsqueda indicados.\r\n     *\r\n     * @function navigateToMatchedRow\r\n\t\t * @param {string} matchedRow - Identificador de la línea a la cual se quiere navegar.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"navigateToMatchedRow\", matchedRow);\r\n     */navigateToMatchedRow:function navigateToMatchedRow(matchedRow){var $self=this,retNavParams=$self.rup_jqtable('fncGetSearchNavigationParams',matchedRow);$self.rup_jqtable('doSearchNavigation',retNavParams);},/**\r\n     * Lanza la operación de búsqueda además del evento previo.\r\n     *\r\n     * @function search\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeSearch\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"search\");\r\n     */search:function search(){var $self=this,settings=$self.data('settings');var bfr=$self.triggerHandler('rupTable_beforeSearch');if(bfr===false||bfr==='stop'){return;}if($.isFunction(settings.search.beforeSearch)){bfr=settings.search.beforeSearch.call($self);if(bfr===undefined){bfr=true;}if(bfr===false){return;}}$self.rup_jqtable('doSearch');},/**\r\n     *  Lanza la operación de búsqueda.\r\n     *\r\n     * @function navigateToMatchedRow\r\n\t\t * @fires module:rup_jqtable#rupTable_searchBeforeSubmit.rupTable.masterDetail\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"doSearch\");\r\n     */doSearch:function doSearch(){var $self=this,settings=$self.data('settings'),ret,jsonData={},page=parseInt($self.rup_jqtable('getGridParam','page'),10),postData=$self.rup_jqtable('getGridParam','postData');//\t\t\tjsonData.filterParams =$self.rup_jqtable(\"getGridParam\",\"postData\"),\njsonData.filter=$self.rup_jqtable('getFilterParams');jsonData.search=form2object(settings.search.$searchRowInputs[0]);$self._initializeSearchProps(settings);ret=$self.triggerHandler('rupTable_searchBeforeSubmit.rupTable.masterDetail',[postData,jsonData]);if(ret===false){return false;}jQuery.rup_ajax({url:settings.search.url,type:'POST',dataType:'json',data:jQuery.toJSON($.extend(true,{},postData,jsonData)),contentType:'application/json',success:function success(xhr,b,c){var rowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10);if(xhr.length===0){$self._initializeSearchProps(settings);$self.rup_jqtable('updateSearchPagination');$self.rup_jqtable('clearHighlightedMatchedRows');}else{jQuery.each(xhr,function(index,elem){//\t\t\t\t\t\t\tif (settings.primaryKey.length>1){\nvar retValue='';for(var i=0;i<settings.primaryKey.length;i++){retValue+=elem.pk[settings.primaryKey[i]]+settings.multiplePkToken;}elem['id']=retValue.substr(0,retValue.length-1);//\t\t\t\t\t\t\t}\nelem.page=Math.ceil(elem.tableLine/rowsPerPage);elem.pageLine=elem.tableLine-(elem.page-1)*rowsPerPage;$self._processMatchedRow(settings,elem);});$self.trigger('rupTableSearchSuccess');$self.rup_jqtable('goToFirstMatched',page);}}});},/**\r\n     * Navega hasta el primer elemento que se ajusta a los criterios de búsqueda. En caso de no existir elementos adecuados en la página actual se navega hasta el primer elemento.\r\n     *\r\n     * @function goToFirstMatched\r\n\t\t * @param {paramPage} paramPage - En caso de indicarse una página se utilizará en vez de la página actual.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"goToFirstMatched\", paramPage);\r\n     */goToFirstMatched:function goToFirstMatched(paramPage){var $self=this,settings=$self.data('settings'),page=typeof paramPage==='string'?parseInt(paramPage,10):paramPage;if($self._hasPageMatchedElements(page)){// TODO: Generalizar\n//\t\t\t\t$self.find(\"td[aria-describedby='\"+settings.id+\"_infoSearch'] img.ui-icon.ui-icon-search\").remove();\n//\t\t\t\tfor (var i=0;i<settings.search.matchedRowsPerPage[page].length;i++){\n//\t\t\t\t\tnewIndexPos = settings.search.matchedRowsPerPage[page][i];\n//\t\t\t\t\t$($self.jqGrid(\"getInd\",newIndexPos, true)).find(\"td[aria-describedby='\"+settings.id+\"_infoSearch']\").html($(\"<img/>\").addClass(\"ui-icon ui-icon-search\")[0]);\n//\t\t\t\t}\n$self.rup_jqtable('setSelection',settings.search.matchedRowsPerPage[page][0],true);$self.rup_jqtable('highlightMatchedRowsInPage',page);}else{$self.rup_jqtable('navigateToMatchedRow','first');}},/**\r\n     * Devuelve los parámetros correspondientes al tipo de enlace de navegación indicado por parámetro.\r\n     *\r\n     * @function fncGetSearchNavigationParams\r\n\t\t * @param {paramPage} buttonType - Tipo de parámetro first, prev, next o last.-\r\n\t\t * @return {object} - Parametros de configuración asociados al tipo de enlace.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"fncGetSearchNavigationParams\", buttonType);\r\n     */fncGetSearchNavigationParams:function fncGetSearchNavigationParams(buttonType){var $self=this,settings=$self.data('settings'),execute=false,changePage=false,index=0,newPageIndex=0,npos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),page=parseInt($self.rup_jqtable('getGridParam','page'),10),newPage=page,activeLineId,//\t\t\tlastPage = parseInt(Math.ceil($self.rup_jqtable(\"getGridParam\", \"records\")/$self.rup_jqtable(\"getGridParam\", \"rowNum\")),10),\ncurrentArrayIndex,selectedLines,pageArrayIndex;$self.trigger('rupTableAfterSearchNav',[buttonType]);npos[0]=parseInt(npos[0],10);activeLineId=$self.rup_jqtable('getActiveLineId');$('#'+settings.formEdit.feedbackId,settings.$detailForm).hide();switch(buttonType){case'first':// Navegar al primer elemento\nexecute=true;// Si no se han seleccionado todos los elementos\n// Se comprueba si la página en la que nos encontramos es la primera en la que se han seleccionado registros\nif(settings.search.matchedPages[0]!==page){// Marcamos el flag changePage para indicar que se debe de realizar una paginación\nchangePage=true;// La nueva página será la primera página en la que se ha realizado una selección de registros\nnewPage=settings.search.matchedPages[0];}// Recuperamos el primer registro seleccionado del la página\nindex=settings.search.matchedLinesPerPage[newPage][0];newPageIndex=index;break;case'prev':// Navegar al anterior elemento seleccionado\nexecute=true;// Obtenemos un array con los index de los registros seleccionados en la página actual\nselectedLines=settings.search.matchedLinesPerPage[page]||[];// Obtenemos la posición que ocupa el elemento actual en el array de seleccionados\ncurrentArrayIndex=$.inArray(activeLineId+1,selectedLines);// La línea no se encuentra entre los registros que se corresponden a la búsqueda\nif(currentArrayIndex===-1){currentArrayIndex=$.rup_utils.insertSorted($.merge([],selectedLines),activeLineId+1);//\t\t\t\t\t\tif(currentArrayIndex>1){\n//\t\t\t\t\t\t\tcurrentArrayIndex--;\n//\t\t\t\t\t\t}\n}// Se comprueba si ocupa el lugar del primer elemento seleccionado\nif(currentArrayIndex===0){// En caso de tratarse del primer elemento seleccionado de la página, se deberá de realizar una navegación a la página anterior que disponga de elementos seleccionados\nchangePage=true;pageArrayIndex=$.inArray(page,settings.search.matchedPages);// En caso de no estar posicionados en una página en la que se encuentran ocurrencias de registros\nif(pageArrayIndex===-1){// Se obtiene la posición en la que se encontraría la página\npageArrayIndex=$.rup_utils.insertSorted($.merge([],settings.search.matchedPages),page);}// Recorremos las páginas anteriores\nnewPage=settings.search.matchedPages[pageArrayIndex-1];// Obtenemos los identificadores de los registros seleccionados de la nueva página\nselectedLines=settings.search.matchedLinesPerPage[newPage];// Obtenemos el último registro seleccionado\nindex=selectedLines[selectedLines.length-1];}else{// En caso de no tratarse del último elemento de la página, recuperamos el elemento anterior que haya sido seleccionado también\nindex=selectedLines[currentArrayIndex-1];}newPageIndex=index;break;case'next':// Navegar al siguiente elemento seleccionado\nexecute=true;// Obtenemos un array con los index de los registros seleccionados en la página actual\nselectedLines=settings.search.matchedLinesPerPage[page]||[];// Obtenemos la posición que ocupa el elemento actual en el array de seleccionados\ncurrentArrayIndex=$.inArray(activeLineId+1,selectedLines);// La línea no se encuentra entre los registros que se corresponden a la búsqueda\nif(currentArrayIndex===-1){currentArrayIndex=$.rup_utils.insertSorted($.merge([],selectedLines),activeLineId+1);currentArrayIndex--;}// Se comprueba si ocupa el lugar del último elemento seleccionado\nif(currentArrayIndex===selectedLines.length-1){// En caso de tratarse del primer elemento seleccionado de la página, se deberá de realizar una navegación a la página anterior que disponga de elementos seleccionados\nchangePage=true;pageArrayIndex=$.inArray(page,settings.search.matchedPages);// En caso de no estar posicionados en una página en la que se encuentran ocurrencias de registros\nif(pageArrayIndex===-1){// Se obtiene la posición en la que se encontraría la página\npageArrayIndex=$.rup_utils.insertSorted($.merge([],settings.search.matchedPages),page)-1;}// Recorremos las páginas anteriores\nnewPage=settings.search.matchedPages[pageArrayIndex+1];// Obtenemos los identificadores de los registros seleccionados de la nueva página\nselectedLines=settings.search.matchedLinesPerPage[newPage];// Obtenemos el primer registro de la página\nindex=selectedLines[0];}else{// En caso de no tratarse del último elemento de la página, recuperamos el elemento anterior que haya sido seleccionado también\nindex=selectedLines[currentArrayIndex+1];}newPageIndex=index;break;case'last':// Navegar al primer elemento\nexecute=true;// Si no se han seleccionado todos los elementos\n// Se comprueba si la página en la que nos encontramos es la primera en la que se han seleccionado registros\nif(settings.search.matchedPages[settings.search.matchedPages.length-1]!==page){// Marcamos el flag changePage para indicar que se debe de realizar una paginación\nchangePage=true;// La nueva página será la primera página en la que se ha realizado una selección de registros\nnewPage=settings.search.matchedPages[settings.search.matchedPages.length-1];}// Recuperamos el primer registro seleccionado del la página\nindex=settings.search.matchedLinesPerPage[newPage][settings.search.matchedLinesPerPage[newPage].length-1];newPageIndex=index;break;}return[buttonType,execute,changePage,index-1,npos,newPage,newPageIndex-1];},/**\r\n     * Realiza la navegación entre los elementos que se ajustan a los criterios de bús\r\n     *\r\n     * @function fncGetSearchNavigationParams\r\n\t\t * @param {object[]} arrParams - Array de parámetros que determinan la navegación.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"doSearchNavigation\", arrParams);\r\n     */doSearchNavigation:function doSearchNavigation(arrParams){var $self=this,settings=$self.data('settings'),buttonType,execute,changePage,index,npos,newPage,newPageIndex,indexAux,ret,actualRowId,rowId,pagePos,$row;if($.isArray(arrParams)){buttonType=arrParams[0];execute=arrParams[1];changePage=arrParams[2];index=arrParams[3];npos=arrParams[4];newPage=arrParams[5];newPageIndex=arrParams[6];if(execute){$self.rup_jqtable('hideFormErrors',settings.formEdit.$detailForm);//\t\t\t\t\t$self.triggerHandler(\"jqGridAddEditClickPgButtons\", [buttonType, settings.$detailForm, npos[1][npos[index]]]);\npagePos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])();//\t\t\t\t\tactualRowId = npos[1][npos[0]];\nactualRowId=$self.rup_jqtable('getActiveRowId');//\t\t\t\t\tret = $self.triggerHandler(\"rupTable_searchNavigation_deselect\", actualRowId);\n//\t\t\t\t\tif (ret!==false){\n$row=jQuery($self.jqGrid('getInd',actualRowId,true));if($row.data('tmp.search.notToDeselect')!=='true'){$self.rup_jqtable('setSelection',actualRowId,false);if($row.data('tmp.search.notToDeselect')!==undefined){delete $row.data('tmp.search.notToDeselect');}}if(changePage){//\t\t\t\t\t\t$self.jqGrid(\"setSelection\", pagePos[1][pagePos[0]], false);\n$self.trigger('reloadGrid',[{page:newPage}]);$self.on('jqGridAfterLoadComplete.rupTable.serach.pagination',function(event,data){indexAux=jQuery.inArray(newPageIndex+1,settings.search.matchedLinesPerPage[newPage]);rowId=settings.search.matchedRowsPerPage[parseInt(data.page,10)][indexAux];$row=jQuery($self.jqGrid('getInd',rowId,true));if($row.attr('aria-selected')==='true'){$row.data('tmp.search.notToDeselect','true');}$self.rup_jqtable('setSelection',rowId,true);$self.off('jqGridAfterLoadComplete.rupTable.serach.pagination');});}else{indexAux=jQuery.inArray(index+1,settings.search.matchedLinesPerPage[newPage]);rowId=settings.search.matchedRowsPerPage[newPage][indexAux];$row=jQuery($self.jqGrid('getInd',rowId,true));if($row.attr('aria-selected')==='true'){$row.data('tmp.search.notToDeselect','true');}$self.rup_jqtable('setSelection',rowId,true);}}}},/**\r\n     * Limpia los criterios de búsqueda introducidos por el usuario.\r\n     *\r\n     * @function clearSearch\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"clearSearch\");\r\n     */clearSearch:function clearSearch(){var $self=this,settings=$self.data('settings');$self._initializeSearchProps(settings);$self.rup_jqtable('updateSearchPagination');$self.rup_jqtable('clearHighlightedMatchedRows');jQuery('input,textarea','#gview_'+settings.id+' table thead tr.ui-search-toolbar').val('');jQuery('table thead tr.ui-search-toolbar [ruptype=\\'combo\\']','#gview_'+settings.id).rup_combo('clear');},/**\r\n     * Elimina el resaltado de los registros que se ajustan a los criterios de busqueda.\r\n     *\r\n     * @function clearHighlightedMatchedRows\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"clearHighlightedMatchedRows\");\r\n     */clearHighlightedMatchedRows:function clearHighlightedMatchedRows(){var $self=this,settings=$self.data('settings');$self.find('td[aria-describedby=\\''+settings.id+'_rupInfoCol\\'] span.ui-icon.ui-icon-search').removeClass('ui-icon-search');},/**\r\n     * Resalta los registros que se ajustan a los criterios de búsqueda.\r\n     *\r\n     * @function highlightMatchedRowsInPage\r\n\t\t * @param {string} page - Identificador de la página en la que se desean resaltar los registos.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"highlightMatchedRowsInPage\", page);\r\n     */highlightMatchedRowsInPage:function highlightMatchedRowsInPage(page){var $self=this,settings=$self.data('settings'),internalProps=$self[0].p,$row;$self.rup_jqtable('clearHighlightedMatchedRows');for(var i=0;i<settings.search.matchedRowsPerPage[page].length;i++){var newIndexPos=settings.search.matchedRowsPerPage[page][i];$row=$($self.jqGrid('getInd',newIndexPos,true));$self.rup_jqtable('highlightMatchedRow',$row);//\t\t\t\tif (i==0){\n//\t\t\t\t\tinternalProps.selarrrow.push($row[0].id);\n//\t\t\t\t\tinternalProps.selrow = $row[0].id;\n//\t\t\t\t}\n}},/**\r\n     * Resalta como ocurrencia de la búsqueda la línea especificada.\r\n     *\r\n     * @function highlightMatchedRow\r\n\t\t * @param {string} $row - Objeto jQuery que referencia la línea de la tabla que se quiere resaltar.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"highlightMatchedRow\", $(\"#idRow\"));\r\n     */highlightMatchedRow:function highlightMatchedRow($row){var $self=this,settings=$self.data('settings');$row.find('td[aria-describedby=\\''+settings.id+'_rupInfoCol\\'] span').addClass('ui-icon ui-icon-rupInfoCol ui-icon-search');},/**\r\n     * Actualiza los valores de la navegación entre registros.\r\n     *\r\n     * @function updateSearchPagination\r\n\t\t * @param {string} paramRowId - Identificador de la página.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"updateSearchPagination\", paramRowId);\r\n     */updateSearchPagination:function updateSearchPagination(paramRowId){var $self=this,settings=$self.data('settings'),rowId,pagePos,currentArrayIndex,page=parseInt($self.rup_jqtable('getGridParam','page'),10),numMatched,formatter=$.jgrid.formatter.integer;if(paramRowId!==undefined){rowId=paramRowId;}else{pagePos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])();rowId=pagePos[0]!==-1?pagePos[1][pagePos[0]-1]:-1;}if(settings.search.numMatched===0){settings.search.$firstNavButton.add(settings.search.$backNavButton).add(settings.search.$forwardNavButton).add(settings.search.$lastNavButton).addClass('ui-state-disabled');settings.search.$matchedLabel.html(jQuery.jgrid.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.plugins.search.matchedRecords'),'0'));}else if(rowId!==-1){// Comprobamos si el registro seleccionado es uno de los resultados de la busqueda\nif(jQuery.inArray(rowId,settings.search.matchedRowsPerPage[page])!==-1){// Calculamos el\nnumMatched=$self.rup_jqtable('getSearchCurrentRowCount',rowId);if(settings.search&&settings.search.numMatched){settings.search.$matchedLabel.html(jQuery.jgrid.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.plugins.search.matchedRecordsCount'),$.fmatter.util.NumberFormat(numMatched,formatter),$.fmatter.util.NumberFormat(settings.search.numMatched,formatter)));}if(numMatched===1){settings.search.$firstNavButton.addClass('ui-state-disabled');settings.search.$firstNavButton.attr('disabled','disabled');settings.search.$backNavButton.addClass('ui-state-disabled');settings.search.$backNavButton.attr('disabled','disabled');}else{settings.search.$firstNavButton.removeClass('ui-state-disabled');settings.search.$firstNavButton.removeAttr(\"disabled\");settings.search.$backNavButton.removeClass('ui-state-disabled');settings.search.$backNavButton.removeAttr(\"disabled\");}if(numMatched===settings.search.numMatched){settings.search.$lastNavButton.addClass('ui-state-disabled');settings.search.$lastNavButton.attr('disabled','disabled');settings.search.$forwardNavButton.addClass('ui-state-disabled');settings.search.$forwardNavButton.attr('disabled','disabled');}else{settings.search.$lastNavButton.removeClass('ui-state-disabled');settings.search.$lastNavButton.removeAttr(\"disabled\");settings.search.$forwardNavButton.removeClass('ui-state-disabled');settings.search.$forwardNavButton.removeAttr(\"disabled\");}}else{if(settings.search&&settings.search.numMatched){settings.search.$matchedLabel.html(jQuery.jgrid.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.plugins.search.matchedRecords'),$.fmatter.util.NumberFormat(settings.search.numMatched,formatter)));}settings.search.$firstNavButton.removeClass('ui-state-disabled');settings.search.$backNavButton.removeAttr(\"disabled\");settings.search.$forwardNavButton.removeClass('ui-state-disabled');settings.search.$lastNavButton.removeAttr(\"disabled\");// Miramos a ver si desde la posición actual hay anterior\nif(jQuery.inArray(settings.search.matchedPages,page)>0){settings.search.$backNavButton.removeClass('ui-state-disabled');}else if(jQuery.inArray(page,settings.search.matchedPages)===-1&&$.rup_utils.insertSorted($.merge([],settings.search.matchedPages),page)===0){// Anterior a las páginas en las que se han encontrado ocurrencias\nsettings.search.$backNavButton.addClass('ui-state-disabled');settings.search.$firstNavButton.addClass('ui-state-disabled');}else if(jQuery.inArray(page,settings.search.matchedPages)===-1&&$.rup_utils.insertSorted($.merge([],settings.search.matchedPages),page)>=settings.search.matchedPages.length){// Posterior a las páginas en las que se han encontrado ocurrencias\nsettings.search.$forwardNavButton.addClass('ui-state-disabled');settings.search.$lastNavButton.addClass('ui-state-disabled');}else{pagePos=$self.rup_jqtable('getActiveLineId');if(settings.search.matchedLinesPerPage[page]!==undefined){currentArrayIndex=$.rup_utils.insertSorted($.merge([],settings.search.matchedLinesPerPage[page]),pagePos+1);}if(currentArrayIndex===0){settings.search.$backNavButton.addClass('ui-state-disabled');}if(settings.search.matchedLinesPerPage[page]!==undefined&&currentArrayIndex===settings.search.matchedLinesPerPage[page].length){settings.search.$forwardNavButton.addClass('ui-state-disabled');}}}}},/**\r\n     *  Devuelve, para una linea determinada, la posición en que se encuentra dentro del total de registros que se ajustan a los criterios de búsqueda\r\n     *\r\n     * @function getSearchCurrentRowCount\r\n\t\t * @param {string} selectedRowId - Identificador del registro.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"getSearchCurrentRowCount\", \"05\");\r\n     */getSearchCurrentRowCount:function getSearchCurrentRowCount(selectedRowId){var $self=this,settings=$self.data('settings'),page=parseInt($self.rup_jqtable('getGridParam','page'),10),currentPos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),selectedRows=$self.rup_jqtable('getSelectedRows'),//\t\t\trowsPerPage = parseInt($self.rup_jqtable(\"getGridParam\", \"rowNum\"),10),\nselectedPagesArrayIndex,currentRow=jQuery.inArray(selectedRowId!==undefined?selectedRowId:selectedRows[0],currentPos[1]),cont=0;// En caso de que no se hayan seleccionado\n// Se obtiene el indice de la página actual dentro del array de páginas deseleccionadas para\nselectedPagesArrayIndex=jQuery.inArray(page,settings.search.matchedPages);for(var i=0;i<selectedPagesArrayIndex;i++){cont+=settings.search.matchedLinesPerPage[settings.search.matchedPages[i]].length;}cont+=$.inArray(currentRow+1,settings.search.matchedLinesPerPage[settings.search.matchedPages[selectedPagesArrayIndex]])+1;return cont;}});/**\r\n\t * Métodos públicos del plugin search.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * _hasPageMatchedElements(paramPage): Devuelve true/false dependiendo si la página tiene registros que coinciden con los criterios de búsqueda o no.\r\n\t * _initializeSearchProps(settings): Se realiza la inicialización de los componentes del plugin search.\r\n\t * _processMatchedRow(settings, matchedElem): Se gestiona el registro indicado.\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n     * Devuelve true/false dependiendo si la página tiene registros que coinciden con los criterios de búsqueda o no.\r\n     *\r\n     * @function _hasPageMatchedElements\r\n\t\t * @private\r\n\t\t * @param {string} paramPage - Identificador del registro.\r\n\t\t * @return {boolean} - true/false dependiendo si la página tiene registros que coinciden con los criterios de búsqueda o no.\r\n     * @example\r\n     * $self._hasPageMatchedElements(\"1\");\r\n     */_hasPageMatchedElements:function _hasPageMatchedElements(paramPage){var $self=this,settings=$self.data('settings'),page=typeof paramPage==='string'?parseInt(paramPage,10):paramPage;// Se comprueba si se han seleccionado todos los registros de la tabla\n// Comprobamos si en la página indicada se ha encontrado un elemento\nreturn jQuery.inArray(page,settings.search.matchedPages)!==-1;},/**\r\n     * Se realiza la inicialización de los componentes del plugin search.\r\n     *\r\n     * @function _initializeSearchProps\r\n\t\t * @private\r\n\t\t * @param {object} settings - Parámetros de configuración de la página.\r\n\t\t * @return {boolean} - true/false dependiendo si la página tiene registros que coinciden con los criterios de búsqueda o no.\r\n     * @example\r\n     * $self._initializeSearchProps(settings);\r\n     */_initializeSearchProps:function _initializeSearchProps(settings){// Se almacenan en los settings internos las estructuras de control de los registros seleccionados\nif(settings.search===undefined){settings.search={};}// Numero de registros encontrados\nsettings.search.numMatched=0;// Propiedades\nsettings.search.matchedRowsPerPage=[];settings.search.matchedLinesPerPage=[];settings.search.matchedRows=[];settings.search.matchedIds=[];settings.search.matchedPages=[];},/**\r\n     * Se gestiona el registro indicado.\r\n     *\r\n     * @function _processMatchedRow\r\n\t\t * @private\r\n\t\t * @param {object} settings - Parámetros de configuración de la página.\r\n\t\t * @param {object} - Referencia al elemento.\r\n     * @example\r\n     * $self._processMatchedRow(settings, matchedElem);\r\n     */_processMatchedRow:function _processMatchedRow(settings,matchedElem){var lineIndex;if(settings.search.matchedRowsPerPage[matchedElem.page]===undefined){settings.search.matchedRowsPerPage[matchedElem.page]=[];settings.search.matchedLinesPerPage[matchedElem.page]=[];}// Se almacena el Id del registro seleccionado\nif(jQuery.inArray(matchedElem.id,settings.search.matchedIds)===-1){settings.search.matchedIds.push(matchedElem.id);settings.search.matchedRows.push({id:matchedElem.id,page:matchedElem.page});lineIndex=$.rup_utils.insertSorted(settings.search.matchedLinesPerPage[matchedElem.page],matchedElem.pageLine);settings.search.matchedRowsPerPage[matchedElem.page].splice(lineIndex,0,matchedElem.id);if(settings.search.matchedRowsPerPage[matchedElem.page].length>0&&jQuery.inArray(parseInt(matchedElem.page,10),settings.search.matchedPages)===-1){$.rup_utils.insertSorted(settings.search.matchedPages,parseInt(matchedElem.page,10));}settings.search.numMatched++;}}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n \t* @description Propiedades de configuración del plugin search del componente RUP Table.\r\n \t*\r\n \t* @name options\r\n \t*\r\n \t* @property {string} [url=null] - Url que se va a utilizar para realizar las peticiones de filtrado de la tabla. En caso de no especificarse una concreta, se utilizará por defecto una construida a partir de la url base. (urlBase + /search).\r\n\t* @property {object} [validate] - Mediante esta propiedad es posible especificar reglas de validación que se especifican en la guía de uso del componente RUP validation.\r\n \t*/jQuery.fn.rup_jqtable.plugins.search={};jQuery.fn.rup_jqtable.plugins.search.defaults={showGridInfoCol:true,search:{url:null,autosearch:false,beforeSearch:function beforeSearch(){return true;},defaultSearchInfoCol:{name:'infoSearch',index:'infoSearch',editable:false,width:'15em',search:false},searchOnEnter:false,transitionConfig:{duration:0}}};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n   *  Se lanza al finalizar la creación de la linea de búsqueda de la tabla.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_searchAfterCreateToolbar\r\n   * @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t * @property {Event} $searchRow - Linea de la tabla destinada a la búsqueda.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_searchAfterCreateToolbar\", function(event, $searchRow){ });\r\n   */ /**\r\n    * Evento lanzado antes de realizarse la búsqueda.\r\n    *\r\n    * @event module:rup_jqtable#rupTable_beforeSearch\r\n    * @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n    * @example\r\n    * $(\"#idComponente\").on(\"rupTable_beforeSearch\", function(event){ });\r\n    */ /**\r\n    * Evento lanzado antes de realizarse la petición de búsqueda al servidor\r\n    *\r\n    * @event module:rup_jqtable#rupTable_searchBeforeSubmit.rupTable.masterDetail\r\n    * @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t\t* @property {object} postData - Objeto data que va a ser enviado en la petición.\r\n\t\t* @property {object} jsonData - Objeto json con los parámetros de búsqueda.\r\n    * @example\r\n    * $(\"#idComponente\").on(\"rupTable_searchBeforeSubmit.rupTable.masterDetail\", function(event, postData, jsonData){ });\r\n    */})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Genera una botonera asociada a la tabla con la finalidad de agrupar los controles que permiten realizar acciones sobre los registros de la misma.\r\n *\r\n * @summary Plugin de toolbar del componente RUP Table.\r\n * @module rup_jqtable/toolbar\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"toolbar\"],\r\n * \ttoolbar:{\r\n * \t\t// Propiedades de configuración del plugin toolbar\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * preConfiguration: Método que se ejecuta antes de la invocación del componente jqGrid.\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */jQuery.rup_jqtable.registerPlugin('toolbar',{loadOrder:3,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureToolbar',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureToolbar',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión de la botonera asociada a la tabla.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * preConfigureToolbar(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t * postConfigureToolbar(settings): Método que define la postconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin toolbar del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigureToolbar\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigureToolbar:function preConfigureToolbar(settings){var $self=this,toolbarSettings=settings.toolbar;/*\r\n\t\t\t * Inicialización de los identificadores por defecto de los componentes del toolbar\r\n\t\t\t */toolbarSettings.id=toolbarSettings.id!==null?toolbarSettings.id:settings.id+'_toolbar';/*\r\n\t\t\t * Inicialización del componente rup_toolbar\r\n\t\t\t */if(jQuery('#'+toolbarSettings.id).length>0){settings.$toolbar=toolbarSettings.id[0]==='#'?$(toolbarSettings.id):$('#'+toolbarSettings.id);if(!settings.$toolbar.hasClass('rup-toolbar')){settings.$toolbar.rup_toolbar({width:toolbarSettings.width});}//\t\t\t\ttoolbarSettings.self=$(toolbarSettings);\n}else{// En caso de no indicarse un toolbar, se crea un toolbar por defecto.\n// FIXME: Contemplar la posibilidad de no generar una toolbar por defecto\ntoolbarSettings={};toolbarSettings.id='rup-maint_toolbar-'+settings.id;toolbarSettings.self=$('<div></div>').attr('id',toolbarSettings.id);$self.prepend(toolbarSettings.self);toolbarSettings.self.rup_toolbar({width:toolbarSettings.width});}toolbarSettings.$toolbar=settings.$toolbar;// autoAjustToolbar: Realiza el autoajuste del toolbar al tamanyo del grid.\nif(toolbarSettings.autoAjustToolbar){settings.$toolbar.css('width',$self.rup_jqtable('getGridParam','width')-5);//-5 para ajustar el ancho\n}// createDefaultToolButtons: Determina la creacion de los botones basicos por defecto del toolbar.\n// Se unifican los parámetros de configuración de mostrar/ocultar los botones de la toolbar\nif(toolbarSettings.createDefaultToolButtons===true){toolbarSettings.showOperations=jQuery.extend(true,{},toolbarSettings.defaultButtons,settings.core.showOperations,toolbarSettings.showOperations);}// Retrocompatibilidad: se mantiene el antiguo parámetro newButtons\ntoolbarSettings.buttons=jQuery.extend(true,{},toolbarSettings.newButtons,toolbarSettings.buttons);},/**\r\n\t\t* Metodo que realiza la post-configuración del plugin toolbar del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name postConfigureToolbar\r\n\t\t* @function\r\n\t\t* @fires module:rup_jqtable#rupTable_feedbackClose\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/postConfigureToolbar:function postConfigureToolbar(settings){var $self=this,toolbarSettings=settings.toolbar,counter=1;// Se generan los botones de la toolbar en base a las operaciones\njQuery.each(settings.toolbar.showOperations,function(buttonId,value){var operationCfg;if(value===true){operationCfg=settings.core.operations[buttonId];if(operationCfg!==undefined){toolbarSettings['btn'+buttonId.capitalize()]=settings.$toolbar.addButton({id:'btn'+buttonId.capitalize(),i18nCaption:operationCfg.name,css:operationCfg.icon,index:counter++,dropdown:operationCfg.dropdown,right:operationCfg.right},jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable')).bind('click',function(event){jQuery.proxy(operationCfg.callback,$self)($self,event);});}}});//Se comprueba si hay nuevos botones definidos y se ejecuta la función addButton con la parametrizacion de los nuevos botones\nif(toolbarSettings.buttons!==undefined&&toolbarSettings.buttons!==null){jQuery.each(toolbarSettings.buttons,function(index,object){if(object.json_i18n===undefined){object.json_i18n={};}//\t\t\t\t\tif (object.obj===undefined)\nif(object.obj!==undefined&&object.click!==undefined){settings.$toolbar.addButton(object.obj,object.json_i18n).bind('click',object.click);}else if(object.buttons!==undefined){var mButton=settings.$toolbar.addMButton(object,object.json_i18n).bind('click',settings.$toolbar.showMButton);settings.$toolbar.addButtonsToMButton(object.buttons,mButton,object.json_i18n);}else{$.rup.errorGestor($.rup.i18nParse($.rup.i18n.base,'rup_jqtable.toolbarNewButtonError'));}});}/*\r\n\t\t\t * EVENTOS\r\n\t\t\t */$self.on({'jqGridSelectRow.rupTable.toolbar jqGridLoadComplete.rupTable.toolbar jqGridInlineEditRow.rupTable.toolbar jqGridInlineAfterRestoreRow.rupTable.toolbar rupTableHighlightRowAsSelected.rupTable.toolbar rupTableSelectedRowNumberUpdated jqGridInlineAfterSaveRow rupTable_toolbarButtonsStateRefresh rupTable_afterDeleteRow.rupTable.toolbar rupTable_coreConfigFinished.toolbar rupTable_deleteAfterComplete.rupTable.toolbar':function jqGridSelectRowRupTableToolbarJqGridLoadCompleteRupTableToolbarJqGridInlineEditRowRupTableToolbarJqGridInlineAfterRestoreRowRupTableToolbarRupTableHighlightRowAsSelectedRupTableToolbarRupTableSelectedRowNumberUpdatedJqGridInlineAfterSaveRowRupTable_toolbarButtonsStateRefreshRupTable_afterDeleteRowRupTableToolbarRupTable_coreConfigFinishedToolbarRupTable_deleteAfterCompleteRupTableToolbar(event,id,status,obj){var $self=jQuery(this),settings=$self.data('settings');// Existe elementos seleccionados para ser editados\nfunction processButton($button,enable){if($button!==undefined){if(enable){$button.button('enable');}else{$button.button('disable');}}}jQuery.each(settings.core.operations,function(buttonId,operationCfg){//\t\t\t\t\t\tif (value===true){\nif(settings.toolbar.showOperations[buttonId]===true){//\t\t\t\t\t\t\toperationCfg = settings.core.operations[buttonId];\nif(operationCfg!==undefined){processButton(settings.toolbar['btn'+buttonId.capitalize()],jQuery.proxy(operationCfg.enabled,$self)());}}});},'rupTable_internalFeedbackClose':function rupTable_internalFeedbackClose(){var $self=jQuery(this),settings=$self.data('settings');$self.trigger('rupTable_feedbackClose',settings.$internalFeedback);// if ($self.rup_jqtable('isPluginLoaded', 'feedback')){\n// \tsettings.$internalFeedback.rup_feedback('close');\n// }\n}});}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t* @description Propiedades de configuración del plugin toolbar del componente RUP Table.\r\n\t*\r\n\t* @name options\r\n\t*\r\n\t* @property {string} [id] - En caso de que se vaya a utilizar un identificador diferente al esperado por defecto, se deberá de indicar mediante esta propiedad.\r\n\t* @property {boolean} [createDefaultToolButtons=true] - Determina (true/false) si se deben visualizar los botones correspondientes a las operaciones por defecto del componente.\r\n\t* @property {object} [showOperations] - Permite indicar que operaciones definidas de manera global van a ser mostradas como botones. Cada operación puede tomar uno de los siguientes valores:  true: Valor por defecto. Se mostrará la operación como opción en la botonera.  true: Valor por defecto. Se mostrará la operación como opción en la  false: La operación no se mostrará como opción en la botonera.\r\n\t* @property {object} [deleteOptions] - Propiedades de configuración de la acción de borrado de un registro.\r\n\t* @property {object} [buttons] - Permite definir nuevos botones que se mostrarán en la toolbar. Los nuevos botones se especificarán del mismo modo que se describe en el componente rup_toolbar.\r\n\t*/jQuery.fn.rup_jqtable.plugins.toolbar={};jQuery.fn.rup_jqtable.plugins.toolbar.defaults={toolbar:{id:null,autoAjustToolbar:true,createDefaultToolButtons:true,defaultAdd:true,defaultEdit:true,defaultSave:true,defaultClone:true,defaultCancel:true,defaultDelete:true,defaultFilter:false,defaultButtons:{},showOperations:{},width:796}};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n\t*  Evento que se lanza cuando se cierra el feedback.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_feedbackClose\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} $feedback - Referencia jQuery al feedback interno.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_feedbackClose\", function(event, $internalFeedback){ });\r\n\t*/})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Permite configurar un área para informar al usuario de cómo interactuar con el componente. Mediante el componente feedback se mostraran al usuario mensajes de confirmación, avisos y errores que faciliten y mejoren la interacción del usuario con la aplicación.\r\n *\r\n * @summary Plugin de feedback del componente RUP Table.\r\n * @module rup_jqtable/feedback\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n *\tusePlugins:[\"feedback\"],\r\n * \tfeedback:{\r\n * \t\t// Propiedades de configuración del plugin feedback\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * preConfiguration: Método que se ejecuta antes de la invocación del componente jqGrid.\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */jQuery.rup_jqtable.registerPlugin('feedback',{loadOrder:2,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureFeedback',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureFeedback',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión de la botonera asociada a la tabla.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * preConfigureFeedback(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t * postConfigureFeedback(settings): Método que define la postconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t * settings.$feedback : Referencia al componente feedback.\r\n\t * settings.$$internalFeedback : Referencia al feedback interno.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/*\r\n\t\t * Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t\t *\r\n\t\t * TODO: internacionalizar mensajes de error.\r\n\t\t */ /**\r\n\t\t\t* Metodo que realiza la pre-configuración del plugin feedback del componente RUP Table.\r\n\t\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t\t*\r\n\t\t\t* @name preConfigureFeedback\r\n\t\t\t* @function\r\n\t\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t\t*/preConfigureFeedback:function preConfigureFeedback(settings){var $self=this,feedbackId,feedbackSettings=settings.feedback,$feedback;/*\r\n\t\t\t * Inicialización de los identificadores por defecto de los componentes del toolbar\r\n\t\t\t */feedbackSettings.id=feedbackSettings.id!==null?feedbackSettings.id:settings.id+'_feedback';feedbackId=feedbackSettings.id[0]==='#'?feedbackSettings.id:'#'+feedbackSettings.id;$feedback=jQuery(feedbackId);if($feedback.length===0){alert('El identificador especificado para el feedback no existe.');}else{settings.$feedback=$feedback;settings.$feedback.rup_feedback(feedbackSettings.config).attr('ruptype','feedback');}if(!jQuery.isFunction(settings.loadError)){settings.loadError=function(xhr){$self.rup_jqtable('showFeedback',settings.$feedback,xhr.responseText,'error');};}/*\r\n       * Definición del método serializeGridData para que añada al postData la información relativa a la multiseleccion.\r\n       */$self.on({'rupTable_feedbackClose':function rupTable_feedbackClose(events,$feedback){$($feedback).rup_feedback('close');},'rupTable_feedbackShow':function rupTable_feedbackShow(events,$feedback,msg,type,options){$self.rup_jqtable('showFeedback',$($feedback),msg,type,options);}});},/**\r\n\t\t * Metodo que realiza la post-configuración del plugin feedback del componente RUP Table.\r\n\t\t * Este método se ejecuta después de la incialización del plugin.\r\n\t\t *\r\n\t\t * @name postConfigureFeedback\r\n\t\t * @function\r\n\t\t * @param {object} settings - Parámetros de configuración del componente.\r\n\t\t */postConfigureFeedback:function postConfigureFeedback(settings){// Definición del feedback interno\nsettings.$internalFeedback=$('<div></div>').attr('id','rup_feedback_'+settings.id).insertBefore('#gbox_'+settings.id);settings.$internalFeedback.rup_feedback(settings.feedback.internalFeedbackConfig);}});jQuery.fn.rup_jqtable('extend',{/**\r\n     * Muestra el feedback indicado con la configuración especificada.\r\n     *\r\n     * @function  showFeedback\r\n     * @param {object} $feedback - Objeto jQuery que referencia al componente feedback.\r\n     * @param {string} msg - : Mensaje a mostrar en el feedback.\r\n\t\t * @param {string} type -  Clase de feedback a mostrar.\r\n\t\t * @param {object} options - Propiedades de configuración del feedback\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"showFeedback\", $(\"#idFeedback\"), \"Texto...\", \"ok\"), {};\r\n     */showFeedback:function showFeedback($feedback,msg,type,options){var $self=this,settings=$self.data('settings'),options_backup,default_options;if(options===false){// Muestra el feedback con las opciones con las que se ha creado\n$feedback.rup_feedback('set',msg,type);}else if(jQuery.isPlainObject(options)){// Se aplicam las opciones de configuración indicadas sin modificar las del feedback\n$feedback.rup_feedback('option',options);$feedback.rup_feedback('set',msg,type);}else{// Se utilizan las opciones de configuración por defecto del componente jqtable\ndefault_options=settings.feedback[type+'FeedbackConfig']!==undefined?settings.feedback[type+'FeedbackConfig']:settings.feedback.okFeedbackConfig;$feedback.rup_feedback('option',default_options);$feedback.rup_feedback('set',msg,type);}}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t * Parámetros de configuración por defecto para el feedback.\r\n\t *\r\n\t * feedback.config: Configuración por defecto del feedback principal.\r\n\t * feedback.internalFeedbackConfig: Configuración por defecto del feedback interno.\r\n\t */ /**\r\n\t* @description Propiedades de configuración del plugin feedback del componente RUP Table.\r\n\t*\r\n\t* @name options\r\n\t*\r\n\t* @property {string} [id=null] - Nombre del identificador a utilizar en el feedback. Se utiliza en caso de no querer utilizar el por defecto.\r\n\t* @property {object} [config] - Determina la configuración por defecto del feedback.\r\n\t* @property {object} [okFeedbackConfig] - Determina la configuración por defecto del feedback en los casos de mensajes tipo .\r\n\t* @property {object} [errorFeedbackConfig] - Determina la configuración por defecto del feedback en los casos de mensajes tipo ERROR.\r\n\t* @property {object} [alertFeedbackConfig] - Determina la configuración por defecto del feedback en los casos de mensajes tipo ALERT.\r\n\t* @property {object} [internalFeedbackConfig] - Determina la configuración por defecto del feedback interno de la tabla.\r\n\t*/jQuery.fn.rup_jqtable.plugins.feedback={};jQuery.fn.rup_jqtable.plugins.feedback.defaults={loadError:function loadError(xhr,st,err){var $self=$(this),settings=$self.data('settings');$self.rup_jqtable('showFeedback',settings.$feedback,xhr.responseText,'error');},feedback:{okFeedbackConfig:{closeLink:true,gotoTop:false,delay:1000},errorFeedbackConfig:{closeLink:true,gotoTop:false,delay:null},alertFeedbackConfig:{closeLink:true,gotoTop:false,delay:null},id:null,config:{type:'ok',closeLink:true,gotoTop:false,block:true},internalFeedbackConfig:{type:'ok',closeLink:true,gotoTop:false,block:false}}};})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Aplica al componente un diseño líquido de modo que se adapte al ancho de la capa en la que está contenido.\r\n *\r\n * @summary Plugin de filtrado múltiple del componente RUP Table.\r\n * @module rup_jqtable/fluid\r\n * @deprecated\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"fuild\"],\r\n * \tfuild:{\r\n * \t\t// Propiedades de configuración del plugin fuild\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */jQuery.rup_jqtable.registerPlugin('fluid',{loadOrder:5,postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureFluid',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión del diseño líquido del componente.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * postConfigureFilter(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t * Se almacena la referencia de los diferentes componentes:\r\n\t *\r\n\t * settings.$fluidBaseLayer : Referencia a la capa que se tomará como base para aplicar el diseño líquido.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/*\r\n\t\t * Realiza la configuración interna necesaria para la gestión correcta de la edición mediante un formulario.\r\n\t\t *\r\n\t\t * TODO: internacionalizar mensajes de error.\r\n\t\t */ /**\r\n\t\t* Metodo que realiza la post-configuración del plugin fuild del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name postConfigureFluid\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/postConfigureFluid:function postConfigureFluid(settings){var $self=this,$fluidBaseLayer;settings.fluid.baseLayer=$.rup_utils.getJQueryId(settings.fluid.baseLayer!==null?settings.fluid.baseLayer:settings.id+'_div');settings.fluid.$baseLayer=jQuery(settings.fluid.baseLayer);if(settings.fluid.$baseLayer.length===0){alert('El identificador '+settings.baseLayer+' especificado para la capa sobre la que se va a aplicar el diseño líquido no existe.');return;}$fluidBaseLayer=settings.fluid.fluidBaseLayer=settings.fluid.$baseLayer;// Tratamiento del evento de redimiensionado del diseño líquido de la tabla\n$self.bind('fluidWidth.resize',function(event,previousWidth,currentWidth){if($self.is(':visible')){var feedBackPaddingLeft,feedBackPaddingRight,toolbarPaddingLeft,toolbarPaddingRight;$self.setGridWidth(currentWidth);// Se redimensionan las capas contenidas en el mantenimiento\n$fluidBaseLayer.children().width(currentWidth);//\t\t\t\t\t\tprop.searchForm.parent().width(currentWidth+3)\n// Se redimensiona el feedback\nif(settings.$feedback){feedBackPaddingLeft=parseInt(settings.$feedback.css('padding-left'));feedBackPaddingRight=parseInt(settings.$feedback.css('padding-right'));settings.$feedback.width(currentWidth-(feedBackPaddingLeft+feedBackPaddingRight));}// Se redimensiona la toolbar\nif(settings.$toolbar){toolbarPaddingLeft=parseInt(settings.$toolbar.css('padding-left'));toolbarPaddingRight=parseInt(settings.$toolbar.css('padding-right'));settings.$toolbar.width(currentWidth-(toolbarPaddingLeft+toolbarPaddingRight));settings.$toolbar.css('width',currentWidth-(toolbarPaddingLeft+toolbarPaddingRight));}}});//\t\t\t$self.fluidWidth({\n//\t\t\t\tfluidBaseLayer:settings.fluid.baseLayer,\n//\t\t\t\tminWidth: 100,\n//\t\t\t\tmaxWidth: 2000,\n//\t\t\t\tfluidOffset : 0\n//\t\t\t});\n$self.fluidWidth(settings.fluid);$self.on('rupTable_fluidUpdate',function(event){$self.fluidWidth(settings.fluid);});}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t * Parámetros de configuración por defecto para el plugin fluid.\r\n\t *\r\n\t */ /**\r\n \t* @description Propiedades de configuración del plugin multifilter del componente RUP Table.\r\n \t*\r\n \t* @name options\r\n \t*\r\n \t* @property {string} [baseLayer] - Identificador de la capa que contiene al componente. Se tomará como base para redimensionar las diferentes partes de la tabla. En caso de no indicarse se tomará por defecto una generada con el patrón identificadorTabla+”_div”.\r\n \t* @property {integer} [minWidth=100] - Determina la anchura máxima a la que se va a redimensionar la capa.\r\n \t* @property {integer} [maxWidth=2000] -  Determina la anchura mínima a la que se va a redimensionar la capa.\r\n \t* @property {integer} [fluidOffset=0] - Desplazamiento que se aplica a la capa redimensionada.\r\n \t*/jQuery.fn.rup_jqtable.plugins.fluid={};jQuery.fn.rup_jqtable.plugins.fluid.defaults={fluid:{baseLayer:null,minWidth:100,maxWidth:2000,fluidOffset:0}};})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Permite la edición de los registros de la tabla utilizando un formulario de detalle. El formulario se muestra dentro de un diálogo y ofrece las siguientes funcionalidades:\r\n * - Añadir un nuevo registro o modificar uno ya existente.\r\n * - Cancelar la inserción o edición de un registro.\r\n * - Navegar entre los registros mostrados en la tabla para permitir operar de manera mas ágil sobre losdiferentes elementos.\r\n *\r\n * @summary Plugin de edición en formulario del componente RUP Table.\r\n * @module rup_jqtable/formEdit\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"formEdit\"],\r\n * \tformEdit:{\r\n * \t\t// Propiedades de configuración del plugin formEdit\r\n * \t}\r\n * });\r\n */(function($){/**\r\n     * Definición de los métodos principales que configuran la inicialización del plugin.\r\n     *\r\n     * preConfiguration: Método que se ejecuta antes de la invocación del componente jqGrid.\r\n     * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n     *\r\n     */jQuery.rup_jqtable.registerPlugin('formEdit',{loadOrder:6,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureFormEdit',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureFormEdit',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n     * Extensión del componente rup_jqtable para permitir la edición de los registros mediante un formulario.\r\n     *\r\n     * Los métodos implementados son:\r\n     *\r\n     * preConfigureFormEdit(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n     * postConfigureFormEdit(settings): Método que define la postconfiguración necesaria para el correcto funcionamiento del componente.\r\n     *\r\n     * Las propiedades de esta extensión almacenadas en el settings son las siguientes:\r\n     *\r\n     * settings.formEdit.$detailForm : Referencia al formulario de detalle mediante el que se realizan las modificaciones e inserciones de registros.\r\n     * settings.formEdit.$detailFormDiv : Referencia al div que arropa el formulario de detalle y sobre el que se inicializa el componente rup_dialog.\r\n     *\r\n     */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin formEdit del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigureFormEdit\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigureFormEdit:function preConfigureFormEdit(settings){var $self=this,self=this[0],colModel=settings.colModel,colModelObj;settings.formEdit.navigationBarId=settings.formEdit.navigationBarId!==undefined?settings.formEdit.navigationBarId:settings.id+'_detail_navigation';settings.formEdit.saveButtonId=settings.formEdit.saveButtonId!==undefined?settings.formEdit.saveButtonId:settings.id+'_detail_button_save';settings.formEdit.saveRepeatButtonId=settings.formEdit.saveRepeatButtonId!==undefined?settings.formEdit.saveRepeatButtonId:settings.id+'_detail_button_save_repeat';settings.formEdit.cancelButtonId=settings.formEdit.cancelButtonId!==undefined?settings.formEdit.cancelButtonId:settings.id+'_detail_button_cancel';settings.formEdit.feedbackId=settings.formEdit.feedbackId!==undefined?settings.formEdit.feedbackId:settings.id+'_detail_feedback';settings.formEdit.$navigationBar=jQuery('#'+settings.formEdit.navigationBarId);settings.formEdit.$saveButton=jQuery('#'+settings.formEdit.saveButtonId);settings.formEdit.$saveRepeatButton=jQuery('#'+settings.formEdit.saveRepeatButtonId);settings.formEdit.$cancelButton=jQuery('#'+settings.formEdit.cancelButtonId);settings.formEdit.$feedback=jQuery('#'+settings.formEdit.feedbackId);/*\r\n             * Inicialización de propiedades del componente para simplificar su configuración\r\n             */ // En caso de no especificarse una url para la edición de un elemento, se utiliza por defecto la indicada en la propiedad url.\nif(settings.formEdit.editurl===undefined){settings.formEdit.editurl=settings.baseUrl;settings.formEdit.editOptions.ajaxEditOptions.url=settings.baseUrl;settings.formEdit.addOptions.ajaxEditOptions.url=settings.baseUrl;}if(settings.formEdit.detailOptions.ajaxDetailOptions.url===undefined){settings.formEdit.detailOptions.ajaxDetailOptions.url=settings.baseUrl;}settings.ondblClickRow=function(rowid,iRow,iCol,e){$self.rup_jqtable('editElement',rowid);return false;};settings.formEdit.deleteOptions.ajaxDelOptions=jQuery.extend(true,settings.formEdit.deleteOptions.ajaxDelOptions,{success:function success(data,st,xhr){$self.triggerHandler('rupTableAfterDelete',[data,st,xhr]);$self.rup_jqtable('showFeedback',settings.$feedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.deletedOK'),'ok');}});// Se comprueba si se ha especificado un formulario propio por parte del usuario.\nif(settings.formEdit.detailForm===undefined){for(var i=0;i<colModel.length;i++){colModelObj=colModel[i];colModelObj.id='detailForm_'+settings.id+'_'+colModelObj.name.replace(/[.]/g,'_');}}/* DEFINICION DE OPERACIONES BASICAS CON LOS REGISTROS */settings.core.defaultOperations={'add':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.new'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.add.icon,enabled:function enabled(){return true;},callback:function callback(key,options){$self.rup_jqtable('newElement');}},'edit':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.modify'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.edit.icon,enabled:function enabled(){var $self=this,settings=$self.data('settings');return jQuery.proxy(settings.fncHasSelectedElements,$self)();},callback:function callback(key,options){$self.rup_jqtable('editElement');}},//\t\t\t\t\"save\": {\n//\t\t\t\t\tname: \"Guardar\",\n//\t\t\t\t\ticon: \"save\",\n//\t\t\t\t\tenabled: function(){\n//\t\t\t\t\t\treturn false;\n//\t\t\t\t\t}},\n//\t\t\t\t\tcallback: function(key, options){\n//\t\t\t\t\t\t$self.rup_jqtable(\"newElement\");\n//\t\t\t\t\t}},\n'clone':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.clone'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.clone.icon,enabled:function enabled(){return jQuery.proxy(settings.fncHasSelectedElements,$self)();},callback:function callback(key,options){$self.rup_jqtable('cloneElement');}},//\t\t\t\t\"cancel\": {\n//\t\t\t\t\tname: \"Cancel\",\n//\t\t\t\t\ticon: \"cancel\",\n//\t\t\t\t\tenabled: function(){\n//\t\t\t\t\t\treturn false;\n//\t\t\t\t\t}},\n'delete':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.delete'),icon:self._ADAPTER.CONST.core.operations.defaultOperations['delete'].icon,enabled:function enabled(){var $self=this,settings=$self.data('settings');return jQuery.proxy(settings.fncHasSelectedElements,$self)();},callback:function callback(key,options){$self.rup_jqtable('deleteElement');}}};$.extend(true,settings.core.operations,settings.core.defaultOperations);// Configuración de edit/add\nsettings.formEdit.addOptions=$.extend(true,{},settings.formEdit.addEditOptions,settings.formEdit.addOptions);settings.formEdit.editOptions=$.extend(true,{},settings.formEdit.addEditOptions,settings.formEdit.editOptions);},/**\r\n\t * Metodo que realiza la post-configuración del plugin formEdit del componente RUP Table.\r\n\t * Este método se ejecuta antes de la incialización del plugin.\r\n\t *\r\n\t * @name postConfigureFormEdit\r\n\t * @function\r\n\t * @param {object} settings - Parámetros de configuración del componente.\r\n\t */postConfigureFormEdit:function postConfigureFormEdit(settings){var $self=this,$objDetailForm;// Se comprueba si se ha especificado un formulario propio por parte del usuario.\nif(settings.formEdit.detailForm){// Se comprueba que el identificador especificado para el diálogo sea válido\nif(jQuery(settings.formEdit.detailForm).length===0){alert('El identificador especificado para el fomulario de detalle no existe.');}else{$objDetailForm=$(settings.formEdit.detailForm);if($objDetailForm.is('form')){if($objDetailForm.parent().is('div')){settings.formEdit.$detailFormDiv=$objDetailForm.parent();settings.formEdit.$detailForm=$objDetailForm;}else{alert('El formulario no está incluido dentro de un div');}}else if($objDetailForm.is('div')){var $objFormAux=$objDetailForm.find('form');if($objFormAux.length===1){settings.formEdit.$detailFormDiv=$objDetailForm;settings.formEdit.$detailForm=$objFormAux;}else{alert('El div indicado no contiene un único formulario');}}// Inicialización del componente rup_form sobre del formulario de detalle\nsettings.formEdit.$detailForm.rup_form(settings.formEdit.editOptions);settings.formEdit.ownFormEdit=true;}}//\t\t\telse{\n// No se configura un formulario de detalle\nvar beforeSendUserEvent=settings.beforeSend;var defaultBeforeSend=function defaultBeforeSend(jqXHR,ajaxOptions){ajaxOptions.beforeSend=beforeSendUserEvent;ajaxOptions.validate=settings.formEdit.validate;ajaxOptions.feedback=settings.$detailFeedback;// Se elimina el valor de la propiedad contentType para que la gestione automáticamente el componente rup.form\ndelete ajaxOptions.contentType;if(jQuery.isPlainObject(ajaxOptions.data)&&settings.masterDetail===undefined){ajaxOptions.data=$.rup_utils.unnestjson(ajaxOptions.data);}ajaxOptions.beforeSubmit=function(a,$form,options){var hasFileInputs=jQuery('input:file',$form).length>0;if(!$.rup.browser.xhrFileUploadSupport&&hasFileInputs||options.iframe===true){options.extraData={};}// TODO : Comprobar si se puede elimianr el delete\na=undefined;//delete a;\n};ajaxOptions.propperFormSerialization=false;settings.formEdit.$detailForm.rup_form('ajaxSubmit',ajaxOptions);rp_ge[settings.id].processing=false;return false;};settings.formEdit.editOptions.ajaxEditOptions.beforeSend=defaultBeforeSend;settings.formEdit.addOptions.ajaxEditOptions.beforeSend=defaultBeforeSend;//\t\t\t}\nsettings.getDetailTotalRowCount=function(){var $self=this;return $self.rup_jqtable('getGridParam','records');};settings.getDetailCurrentRowCount=function(){var $self=this,page,rowNum,rowId,rowsPerPage,cont;// Obtenemos la pagina actual\npage=parseInt($self.rup_jqtable('getGridParam','page'),10);// Obtenemos el identificador del registro seleccionado\nrowId=$self.rup_jqtable('getGridParam','selrow');// Obtenemos el numero de linea\n//\t\t\t\trowNum = $self.jqGrid(\"getInd\", rowId);\nrowNum=jQuery.inArray(rowId,jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])()[1])+1;// Numero de registros por pagina que se visualizan\nrowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10);// Flag de todos los registros seleccionados\ncont=page*rowsPerPage-rowsPerPage+rowNum;return cont;};settings.getRowForEditing=function(){var $self=this,selrow=$self.jqGrid('getGridParam','selrow');return selrow===null?false:selrow;};settings.fncHasSelectedElements=function(){var $self=this;return jQuery.proxy(settings.getRowForEditing,$self)()!==false;};settings.fncGetNavigationParams=function getNavigationParams(linkType){var $self=this,execute=false,changePage=false,index=0,newPage=0,newPageIndex=0,npos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),page=parseInt($self.rup_jqtable('getGridParam','page'),10),rowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10),lastPage=parseInt(Math.ceil($self.rup_jqtable('getGridParam','records')/$self.rup_jqtable('getGridParam','rowNum')),10);npos[0]=parseInt(npos[0],10);switch(linkType){case'first':if(!(page===1&&npos[0]===0)){execute=true;index=0;if(page>1){changePage=true;newPage=1;newPageIndex=0;}}break;case'prev':if(!(page===1&&npos[0]===0)){execute=true;index=npos[0]-1;if(index<0){changePage=true;newPage=page-1;newPageIndex=rowsPerPage;}}break;case'next':if(!(page===lastPage&&npos[0]===npos[1].length-1)){execute=true;index=npos[0]+1;if(index>npos[1].length-1){changePage=true;newPage=page+1;newPageIndex=0;}}break;case'last':if(!(page===lastPage&&npos[0]===npos[1].length-1)){execute=true;index=npos[1].length-1;if(page<lastPage){changePage=true;newPage=lastPage;newPageIndex=rowsPerPage;}}break;}return[linkType,execute,changePage,index,npos,newPage,newPageIndex];};settings.doNavigation=function(arrParams,execute,changePage,index,npos,newPage,newPageIndex){var $self=this,settings=$self.data('settings'),props=rp_ge[$self.attr('id')],linkType,execute,changePage,index,npos,newPage,newPageIndex;if($.isArray(arrParams)){linkType=arrParams[0];execute=arrParams[1];changePage=arrParams[2];index=arrParams[3];npos=arrParams[4];newPage=arrParams[5];newPageIndex=arrParams[6];if(execute){$self.rup_jqtable('hideFormErrors',settings.formEdit.$detailForm);$self.triggerHandler('jqGridAddEditClickPgButtons',[linkType,settings.formEdit.$detailForm,npos[1][npos[index]]]);if(changePage){$self.trigger('reloadGrid',[{page:newPage}]);$self.on('jqGridAfterLoadComplete.pagination',function(event,data){var nextPagePos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),newIndexPos=newPageIndex<nextPagePos[1].length?newPageIndex:nextPagePos[1].length-1;$self.jqGrid('setSelection',nextPagePos[1][newIndexPos]);jQuery.proxy(jQuery.jgrid.fillData,$self[0])(nextPagePos[1][newIndexPos],$self[0],settings.formEdit.$detailForm.attr('id'),settings.opermode);jQuery.proxy(jQuery.jgrid.updateNav,$self[0])(nextPagePos[1][newIndexPos],npos[1].length-1);$self.off('jqGridAfterLoadComplete.pagination');});}else{jQuery.proxy(jQuery.jgrid.fillData,$self[0])(npos[1][index],$self[0],settings.formEdit.$detailForm.attr('id'),settings.opermode);$self.jqGrid('setSelection',npos[1][index]);jQuery.proxy(jQuery.jgrid.updateNav,$self[0])(npos[1][index],npos[1].length-1);}$self.triggerHandler('jqGridAddEditAfterClickPgButtons',[linkType,settings.formEdit.$detailForm,npos[1][npos[index]]]);if(jQuery.isFunction(props.afterclickPgButtons)){props.afterclickPgButtons.call($self,'next',settings.formEdit.$detailForm,npos[1][npos[index]]);}}}};// Campturador del evento jqGridInlineAfterSaveRow.\n$self.on({'jqGridLoadComplete.rupTable.formEditing':function jqGridLoadCompleteRupTableFormEditing(data){var $self=$(this),settings=$self.data('settings'),nPos;if(settings.formEdit.autoselectFirstRecord){nPos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])();$self.jqGrid('setSelection',nPos[1][0],false);}},'jqGridAddEditInitializeForm.rupTable.formEditing':function jqGridAddEditInitializeFormRupTableFormEditing(event,$form,modo){/*\r\n                     * Creación de los componentes rup\r\n                     */var $self=$(this),settings=$self.data('settings'),colModel=settings.colModel;if(settings.formEdit.ownFormEdit===false){jQuery.each(colModel,function(index,colObj){if(colObj.rupType){if(colObj.editoptions&&colObj.editoptions.i18nId===undefined){colObj.editoptions.i18nId=$self.attr('id')+'##'+this.name;}$('#'+(colObj.id!==null?colObj.id:name),$form)['rup_'+colObj.rupType](colObj.editoptions);}});}//Se crea el toolbar de error mediante un componente rup_tooltip\nsettings.$detailFeedback=settings.formEdit.$feedback.rup_feedback({closeLink:true,gotoTop:false,block:false,fadeSpeed:500//\t\t\t\t\t\tdelay: 1000,\n}).attr('ruptype','feedback');},'jqGridAddEditAfterSubmit.rupTable.formEditing':function jqGridAddEditAfterSubmitRupTableFormEditing(event,res,postData,oper){// Una vez se haya realizado el guardado del registro se muestra el mensaje correspondiente en el feedback dependiendo del modo en el que se encuentra.\nvar settings=$self.data('settings'),formEditSaveType=$self.data('tmp.formEditSaveType'),id,compositeId='',$fieldRupCombo,labelProperty=null,responseJson;$self.removeData('tmp.formEditSaveType');// Tratamiento concreto para los componentes RUP\n// Combo\njQuery.each(settings.colModel,function(i,elem){if(elem.rupType==='combo'){$fieldRupCombo=jQuery('[name=\\''+elem.name+'\\']',settings.$detailForm);if(elem.editoptions.labelProperty!==undefined){labelProperty=elem.editoptions.labelProperty;}else if(elem.editoptions.sourceParam!==undefined){labelProperty=elem.name.substring(0,elem.name.lastIndexOf('.')+1)+elem.editoptions.sourceParam.label;}if(labelProperty!==null){postData[labelProperty]=$fieldRupCombo.rup_combo('label');}}});// Dependiendo del boton de guardado seleccionado se realiza el comportamiento correspondiente\nif(formEditSaveType==='SAVE'){if(oper==='edit'){$self.rup_jqtable('showFeedback',settings.$feedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.modifyOK'),'ok');}else{$self.rup_jqtable('showFeedback',settings.$feedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.insertOK'),'ok');}settings.formEdit.$detailFormDiv.rup_dialog('close');}else if(formEditSaveType==='SAVE_REPEAT'){if(oper==='edit'){$self.rup_jqtable('showFeedback',settings.$detailFeedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.modifyOK'),'ok');}else{$self.rup_jqtable('showFeedback',settings.$detailFeedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.insertOK'),'ok');}}// Se obtiene el json de respuesta\ntry{responseJson=$.parseJSON(res.responseText);}catch(e){responseJson=postData;}// Tratamiento de la primary key compuesta\nif(settings.primaryKey&&_typeof(settings.primaryKey)==='object'&&settings.primaryKey.length>1){for(var i=0;i<settings.primaryKey.length;i++){compositeId+=responseJson[settings.primaryKey[i]]+settings.multiplePkToken;}id=compositeId.substr(0,compositeId.length-1);}else{id=responseJson[settings.primaryKey?settings.primaryKey:$self[0].p.prmNames.id];}return[true,'',id];},'jqGridAddEditErrorTextFormat.rupTable.formEditing':function jqGridAddEditErrorTextFormatRupTableFormEditing(event,data,oper){var responseJSON;if(data.status===406&&data.responseText!==''){try{responseJSON=jQuery.parseJSON(data.responseText);if(responseJSON.rupErrorFields){$self.rup_jqtable('showServerValidationFieldErrors',settings.formEdit.$detailForm,responseJSON);}}catch(e){// El mensaje JSON\n$self.rup_jqtable('showFeedback',settings.$detailFeedback,data.responseText,'error');}}},//\t\t\t\t \"jqGridDblClickRow.rupTable.formEditing\": function (event, rowid, iRow, iCol, e){\n//\t\t\t\t\t$self.rup_jqtable('editElement', rowid);\n//\t\t\t\t },\n'jqGridAddEditBeforeShowForm.rupTable.formEditing':function jqGridAddEditBeforeShowFormRupTableFormEditing(event,$detailForm,frmoper){var $self=$(this),settings=$self.data('settings'),$title=jQuery('#ui-dialog-title-'+settings.formEdit.$detailFormDiv.attr('id'),settings.formEdit.$detailFormDiv.parent()),colModel=$self[0].p.colModel;// Se ocultan los errores de validación mostrados en el formulario de detalle\n$self.rup_jqtable('hideFormErrors',settings.formEdit.$detailForm);if(frmoper==='add'||frmoper==='clone'||frmoper==='clone_clear'){$title.text(rp_ge[$self[0].p.id].addCaption);$('#pagination_'+settings.id+',#pag_'+settings.id).hide();}else{$title.text(rp_ge[$self[0].p.id].editCaption);$('#pagination_'+settings.id+',#pag_'+settings.id).show();}},'jqGridAddEditBeforeShowForm.rupTable.formEditing.readOnlyPks':function jqGridAddEditBeforeShowFormRupTableFormEditingReadOnlyPks(event,$detailForm,frmoper){var $self=$(this),settings=$self.data('settings'),colModel=$self[0].p.colModel;// Controlar los campos editables en modo edición\nfor(var i=0;i<colModel.length;i++){if(settings.formEdit.ownFormEdit!==true||settings.formEdit.ownFormEdit===true&&jQuery.inArray(colModel[i].name,settings.primaryKey)!==-1){if(frmoper==='add'||frmoper==='clone'||frmoper==='clone_clear'){if(colModel[i].editableOnAdd===false){jQuery('[name=\\''+colModel[i].name+'\\']',settings.formEdit.$detailFormDiv).attr('readonly','readonly');}else{jQuery('[name=\\''+colModel[i].name+'\\']',settings.formEdit.$detailFormDiv).removeAttr('readonly');}}else{if(colModel[i].editableOnEdit===false){jQuery('[name=\\''+colModel[i].name+'\\']',settings.formEdit.$detailFormDiv).attr('readonly','readonly');}else{jQuery('[name=\\''+colModel[i].name+'\\']',settings.formEdit.$detailFormDiv).removeAttr('readonly');}}}}},'jqGridAddEditAfterShowForm.rupTable.formEditing':function jqGridAddEditAfterShowFormRupTableFormEditing(event,$detailForm,frmoper){var $self=$(this),settings=$self.data('settings');// Ubicamos el foco en el primer elemento del formulario\n$self.rup_jqtable('hideFormErrors',settings.formEdit.$detailForm);jQuery(':focusable:enabled:not([readonly]):first',$detailForm).focus();}});}});/**\r\n     * Métodos públicos del plugin formEdit.\r\n     *\r\n     * Los métodos implementados son:\r\n     *\r\n     * createDetailNavigation(settings): Crea la barra de navegación del formulario de detalle.\r\n     * deleteElement(rowId, options): Realiza el borrado de un registro determinado.\r\n     * editElement(rowId, options): Lanza la edición de un registro medainte un formulario de detalle.\r\n     * newElement(): Inicia el proceso de inserción de un nuevo registro.\r\n     *\r\n     * s($form): Oculta los mensaje de error visualizado en el\r\n     *\r\n     */jQuery.fn.rup_jqtable('extend',{/**\r\n     * Devuelve la template HTML correspondiente a la capa de navegación del fomulario de filtrado.\r\n     *\r\n     * @function  createDetailNavigation\r\n\t\t * @return {object} - Template correspondiente a la capa de navegación.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"createDetailNavigation\");\r\n     */createDetailNavigation:function createDetailNavigation(){var $self=$(this);return $.proxy($self[0]._ADAPTER.createDetailNavigation,$self)();},/**\r\n\t\t * Elimina el registro correspondiente al identificador indicado y utilizando las opciones de borrado especificadas.\r\n\t\t *\r\n\t\t * @function  deleteElement\r\n\t\t * @param {string} rowId - Identificador del registro que se desea eliminar.\r\n\t\t * @param {object} options - Opciones de configuración de la operación de borrado.\r\n\t\t * @return {object} - Referencia al propio objecto jQuery.\r\n\t\t * @fires module:rup_jqtable#rupTable_deleteAfterSubmit\r\n\t\t * @fires module:rup_jqtable#rupTable_afterDeleteRow\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeDeleteRow\r\n\t\t * @example\r\n\t\t * $(\"#idComponente\").rup_jqtable(\"deleteElement\", rowId, options);\r\n\t\t */deleteElement:function deleteElement(rowId,options){var $self=this,settings=$self.data('settings'),deleteOptions=jQuery.extend(true,{},settings.formEdit.deleteOptions,options),selectedRow=rowId===undefined?$self.rup_jqtable('getSelectedRows'):rowId;// En caso de especificarse el uso del método HTTP DELETE, se anyade el identificador como PathParameter\nif(selectedRow.length===1){if(deleteOptions.mtype==='DELETE'){deleteOptions.url=settings.formEdit.editurl+'/'+$self.rup_jqtable('getPkUrl',selectedRow);}}else{deleteOptions.mtype='POST';deleteOptions.ajaxDelOptions.contentType='application/json';deleteOptions.ajaxDelOptions.type='POST';deleteOptions.ajaxDelOptions.dataType='json';deleteOptions.url=settings.formEdit.editurl+'/deleteAll';deleteOptions.serializeDelData=function(ts,postData){return jQuery.toJSON({'core':{'pkToken':settings.multiplePkToken,'pkNames':settings.primaryKey},'multiselection':$self.rup_jqtable('getSelectedIds'),'filter':$self.rup_jqtable('getFilterParams')});};}deleteOptions.afterSubmit=function(){$self.triggerHandler('rupTable_deleteAfterSubmit');return true;};deleteOptions.afterComplete=function(){$self.triggerHandler('rupTable_afterDeleteRow');};if($self.triggerHandler('rupTable_beforeDeleteRow',[deleteOptions,selectedRow])!==false){$self.jqGrid('delGridRow',selectedRow,deleteOptions);}return $self;},/**\r\n\t\t * Edita el registro correspondiente al identificador indicado y utilizando las opciones de edición especificadas.\r\n\t\t *\r\n\t\t * @function  editElement\r\n\t\t * @param {string} rowId - Identificador del registro que se desea editar.\r\n\t\t * @param {object} options - Opciones de configuración de la operación de edición.\r\n\t\t * @return {object} - Referencia al propio objecto jQuery.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeEditRow\r\n\t\t * @example\r\n\t\t * $(\"#idComponente\").rup_jqtable(\"editElement\", rowId, options);\r\n\t\t */editElement:function editElement(rowId,options){var $self=this,settings=$self.data('settings'),//\t\t\t\tselectedRow = (rowId===undefined?$self.jqGrid('getGridParam','selrow'):rowId);\nselectedRow=rowId===undefined?$.proxy(settings.getRowForEditing,$self)():rowId,colModel=$self[0].p.colModel;if(selectedRow!==false){// Controlar los campos editables en modo edición\nfor(var i=0;i<colModel.length;i++){if(colModel[i].editable===true&&colModel[i].editableOnEdit===false){if(colModel[i].editoptions===undefined){colModel[i].editoptions={};}colModel[i].editoptions.readonly='readonly';}else{if(colModel[i].editoptions!==undefined&&colModel[i].editoptions.readonly!==undefined){delete colModel[i].editoptions.readonly;}}}if($self.triggerHandler('rupTable_beforeEditRow',[settings.formEdit.editOptions,selectedRow])!==false){$self.jqGrid('editGridRow',selectedRow,settings.formEdit.editOptions);}}return $self;},/**\r\n\t\t * Muestra el formulario de detalle para permitir al usuario insertar un nuevo registro.\r\n\t\t *\r\n\t\t * @function  newElement\r\n\t\t * @param {boolean} addEvent - Determina si se debe lanzar (true) o no (false) el evento rupTable_beforeAddRow.\r\n\t\t * @return {object} - Referencia al propio objecto jQuery.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeAddRow\r\n\t\t * @example\r\n\t\t * $(\"#idComponente\").rup_jqtable(\"newElement\", true);\r\n\t\t */newElement:function newElement(addEvent){var $self=this,settings=$self.data('settings'),colModel=$self[0].p.colModel,eventRet;// Controlar los campos editables en modo edición\nfor(var i=0;i<colModel.length;i++){if(colModel[i].editable===true&&colModel[i].editableOnAdd!==false){if(colModel[i].editable===true&&colModel[i].editableOnAdd===false){if(colModel[i].editoptions===undefined){colModel[i].editoptions={};}colModel[i].editoptions.readonly='readonly';}else{if(colModel[i].editoptions!==undefined&&colModel[i].editoptions.readonly!==undefined){delete colModel[i].editoptions.readonly;}}}}if(addEvent===false||addEvent!==false&&$self.triggerHandler('rupTable_beforeAddRow',[settings.formEdit.addOptions])!==false){$self.jqGrid('editGridRow','new',settings.formEdit.addOptions);}return $self;},/**\r\n\t\t * Clona el registro correspondiente al identificador indicado y utilizando las opciones de clonado especificadas.\r\n\t\t *\r\n\t\t * @function  cloneElement\r\n\t\t * @param {string} rowId - Identificador del registro que se desea clonar.\r\n\t\t * @param {object} options - Opciones de configuración de la operación de clonado.\r\n\t\t * @param {boolean} cloneEvent - Determina si se debe lanzar (true) o no (false) el evento rupTable_beforeCloneRow.\r\n\t\t * @return {object} - Referencia al propio objecto jQuery.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeCloneRow\r\n\t\t * @example\r\n\t\t * $(\"#idComponente\").rup_jqtable(\"cloneElement\", rowId, options, cloneEvent);\r\n\t\t */cloneElement:function cloneElement(rowId,options,cloneEvent){var $self=this,settings=$self.data('settings'),colModel=$self[0].p.colModel,selectedRow=rowId===undefined?$.proxy(settings.getRowForEditing,$self)():rowId;// Controlar los campos editables en modo edición\nfor(var i=0;i<colModel.length;i++){if(colModel[i].editable===true&&colModel[i].editableOnAdd!==false){if(colModel[i].editable===true&&colModel[i].editableOnAdd===false){if(colModel[i].editoptions===undefined){colModel[i].editoptions={};}colModel[i].editoptions.readonly='readonly';}else{if(colModel[i].editoptions!==undefined&&colModel[i].editoptions.readonly!==undefined){delete colModel[i].editoptions.readonly;}}}}if(cloneEvent===false||cloneEvent!==false&&$self.triggerHandler('rupTable_beforeCloneRow',[settings,selectedRow])!==false){$self.jqGrid('editGridRow','cloned',settings.formEdit.addOptions);jQuery.proxy(jQuery.jgrid.fillData,$self[0])(selectedRow,$self[0],settings.formEdit.$detailForm,'clone');jQuery('#id_g',settings.formEdit.$detailForm).val('_empty');}return $self;},/**\r\n\t\t *  Oculta los mensajes de error del formulario indicado.\r\n\t\t *\r\n\t\t * @function  hideFormErrors\r\n\t\t * @param {object} $form - Formulario del que se desea ocultar los mensajes de error.\r\n\t\t * @example\r\n\t\t * $(\"#idComponente\").rup_jqtable(\"hideFormErrors\", $form);\r\n\t\t */hideFormErrors:function hideFormErrors($form){var $self=this,settings=$self.data('settings');// Ocultamos el feedback de error\nif(settings.formEdit!==undefined&&settings.formEdit.$feedback!==undefined){settings.formEdit.$feedback.hide();}if($form!==undefined){jQuery('.rup-maint_validateIcon',$form).remove();jQuery('input.error',$form).removeClass('error');if($form.data('validator')){$form.rup_validate('resetElements');}}}});/**\r\n     * Sobreescrituras del componente jqGrid\r\n     */$.extend($.jgrid,{createData:function createData(rowid,obj,tb,maxcols){/*ADD*/var $form=tb.parent();var $t=this,$self=$($t),settings=$self.data('settings'),nmId,nm,hc,trdata,cnt=0,tmp,dc,elc,retpos=[],ind=false,// \t\t\ttdtmpl = \"<td class='CaptionTD'>&#160;</td><td class='DataTD'>&#160;</td>\", tmpl=\"\", i;\n/*ADD*/tmpl='<label class=\\'CaptionTD\\'></label>',i;for(i=1;i<=maxcols;i++){tb.append($('<div>').attr('id','col_'+parseInt((parseInt(i,10)||1)*2,10)).addClass('floating_left_pad_right').width(100/maxcols*0.95+'%'));}if(rowid!='_empty'){ind=$(obj).jqGrid('getInd',rowid);}$(obj.p.colModel).each(function(i){nm=this.name;nmId=this.id;// hidden fields are included in the form\nif(this.editrules&&this.editrules.edithidden===true){hc=false;}else{hc=this.hidden===true?true:false;}dc=hc?'style=\\'display:none\\'':'';if(nm!=='cb'&&nm!=='subgrid'&&this.editable===true&&nm!=='rn'){if(ind===false){tmp='';}else{if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]).text();}else{try{tmp=$.unformat.call(obj,$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]),{rowId:rowid,colModel:this},i);}catch(_){tmp=this.edittype&&this.edittype=='textarea'?$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]).text():$('td[role=\\'gridcell\\']:eq('+i+')',obj.rows[ind]).html();}if(!tmp||tmp=='&nbsp;'||tmp=='&#160;'||tmp.length==1&&tmp.charCodeAt(0)==160){tmp='';}}}var opt=$.extend({},this.editoptions||{},{id:nmId,name:nm}),frmopt=$.extend({},{elmprefix:'',elmsuffix:'',rowabove:false,rowcontent:''},this.formoptions||{}),rp=parseInt(frmopt.rowpos,10)||cnt+1,cp=parseInt((parseInt(frmopt.colpos,10)||1)*2,10);if(rowid=='_empty'&&opt.defaultValue){tmp=$.isFunction(opt.defaultValue)?opt.defaultValue.call($t):opt.defaultValue;}if(!this.edittype){this.edittype='text';}if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}elc=$.jgrid.createEl.call($t,this.edittype,opt,tmp,false,$.extend({},$.jgrid.ajaxOptions,obj.p.ajaxSelectOptions||{}));if(tmp===''&&this.edittype=='checkbox'){tmp=$(elc).attr('offval');}if(tmp===''&&this.edittype=='select'){tmp=$('option:eq(0)',elc).text();}/* MODIFICADO */if(this.edittype==='custom'){elc=$(elc).children()[0];}$(elc).addClass('FormElement');/* TODO : Permitir la personalización de los estilos de los campos de texto */ //\t\t\t\t\tif( $.inArray(this.edittype, ['text','textarea','password','select']) > -1) {\n//\t\t\t\t\t\t$(elc).addClass(\"ui-widget-content ui-corner-all\");\n//\t\t\t\t\t}\ntrdata=$(tb).find('tr[rowpos='+rp+']');if(frmopt.rowabove){var newdata=$('<div><span class=\\'contentinfo\\'>'+frmopt.rowcontent+'</span></div>');$(tb).append(newdata);newdata[0].rp=rp;}if(trdata.length===0){/*MOD trdata = $(\"<tr \"+dc+\" rowpos='\"+rp+\"'></tr>\").addClass(\"FormData\").attr(\"id\",\"tr_\"+nm);*/trdata=$('<div '+dc+' rowpos=\\''+rp+'\\'></div>').addClass('FormData floating_left_pad_right one-column').attr('id','tr_'+nm);/*MOD END */$(trdata).append(tmpl);$(tb).find('#col_'+cp).append(trdata);trdata[0].rp=rp;}var $formField=$('label',trdata[0]).attr('for',nmId).html(typeof frmopt.label==='undefined'?obj.p.colNames[i]:frmopt.label);$formField.parent().append(frmopt.elmprefix).append(elc).append(frmopt.elmsuffix);retpos[cnt]=i;cnt++;}});if(cnt>0){/*MOD trdata var idrow = $(\"<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='\"+ (maxcols*2-1)+\"' class='DataTD '><input class='FormElement' id='id_g' type='text' name='\"+obj.p.id+\"_id' value='\"+rowid+\"'/></td></tr>\");*/var idrow=$('<div class=\\'FormData\\' style=\\'display:none\\'><span class=\\'CaptionTD\\'></span><span class=\\'DataTD \\'><input class=\\'FormElement\\' id=\\'id_g\\' type=\\'text\\' name=\\''+obj.p.id+'_id\\' value=\\''+rowid+'\\'/></span></div>');idrow[0].rp=cnt+999;$(tb).append(idrow);if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[obj.p.id+'_id']=rowid;}}return retpos;},fillDataClientSide:function fillDataClientSide(rowid,obj,fmid,frmoper){var $t=this,$self=$($t),settings=$self.data('settings'),gID=$t.p.id,frmgr=$.fn.jqGrid.rup.edit.detail.detailFormId+gID,frmtborg=$.fn.jqGrid.rup.edit.detail.detailBodyId+gID,frmtb='#'+$.jgrid.jqID(frmtborg),nm,id,cnt=0,tmp,fld,opt,vl,vlc;if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData={};rp_ge[$t.p.id]._savedData[obj.p.id+'_id']=rowid;}var cm=obj.p.colModel;if(rowid=='_empty'){$self.rup_jqtable('resetForm',settings.formEdit.$detailForm);$(cm).each(function(){nm=this.name;id=this.id!==undefined?this.id:nm;opt=$.extend({},this.editoptions||{});fld=$('#'+$.jgrid.jqID(id),settings.formEdit.$detailForm);if(fld.length===0){fld=$('[name=\\''+id+'\\']',settings.formEdit.$detailForm);}if(fld&&fld.length&&fld[0]!==null){vl='';if(opt.defaultValue){vl=$.isFunction(opt.defaultValue)?opt.defaultValue.call($t):opt.defaultValue;if(fld[0].type=='checkbox'||fld[0].type=='radio'){vlc=vl.toLowerCase();if(vlc.search(/(false|0|no|off|undefined)/i)<0&&vlc!==''){fld[0].checked=true;fld[0].defaultChecked=true;fld[0].value=vl;}else{fld[0].checked=false;fld[0].defaultChecked=false;}}else{fld.val(vl);}}else{if(fld[0].type=='checkbox'||fld[0].type=='radio'){fld[0].checked=false;fld[0].defaultChecked=false;vl=$(fld).attr('offval');}else if(fld[0].type&&fld[0].type.substr(0,6)=='select'){if(fld.attr('ruptype')==='combo'){fld.rup_combo('reset');}else{fld[0].selectedIndex=0;}}else{fld.val(vl);}}if(rp_ge[$t.p.id].checkOnSubmit===true||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=vl;}}});$('#id_g',settings.formEdit.$detailForm).val(rowid);return;}var tre=$(obj).jqGrid('getInd',rowid,true);if(!tre){return;}$('td[role=\"gridcell\"]',tre).each(function(i){nm=cm[i].name;id=this.id!==undefined?this.id:nm;// hidden fields are included in the form\nif(nm!=='cb'&&nm!=='subgrid'&&nm!=='rn'&&cm[i].editable===true){if(nm==obj.p.ExpandColumn&&obj.p.treeGrid===true){tmp=$(this).text();}else{try{tmp=$.unformat.call(obj,$(this),{rowId:rowid,colModel:cm[i]},i);}catch(_){tmp=cm[i].edittype=='textarea'?$(this).text():$(this).html();}}if($t.p.autoencode){tmp=$.jgrid.htmlDecode(tmp);}if(rp_ge[$t.p.id].checkOnSubmit===true||rp_ge[$t.p.id].checkOnUpdate){rp_ge[$t.p.id]._savedData[nm]=tmp;}nm=$.jgrid.jqID(nm);switch(cm[i].edittype){case'password':case'text':case'button':case'image':case'textarea':if(tmp=='&nbsp;'||tmp=='&#160;'||tmp.length==1&&tmp.charCodeAt(0)==160){tmp='';}$('#'+id,'#'+fmid).val(tmp);break;case'select':var opv=tmp.split(',');opv=$.map(opv,function(n){return $.trim(n);});$('#'+id+' option','#'+fmid).each(function(){if(!cm[i].editoptions.multiple&&($.trim(tmp)==$.trim($(this).text())||opv[0]==$.trim($(this).text())||opv[0]==$.trim($(this).val()))){this.selected=true;}else if(cm[i].editoptions.multiple){if($.inArray($.trim($(this).text()),opv)>-1||$.inArray($.trim($(this).val()),opv)>-1){this.selected=true;}else{this.selected=false;}}else{this.selected=false;}});break;case'checkbox':tmp=String(tmp);if(cm[i].editoptions&&cm[i].editoptions.value){var cb=cm[i].editoptions.value.split(':');if(cb[0]==tmp){$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',true);$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',true);//ie\n}else{$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',false);$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',false);//ie\n}}else{tmp=tmp.toLowerCase();if(tmp.search(/(false|0|no|off|undefined)/i)<0&&tmp!==''){$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',true);$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',true);//ie\n}else{$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('checked',false);$('#'+id,'#'+fmid)[$t.p.useProp?'prop':'attr']('defaultChecked',false);//ie\n}}break;case'custom':try{if(cm[i].editoptions&&$.isFunction(cm[i].editoptions.custom_value)){cm[i].editoptions.custom_value.call($t,$('#'+id,'#'+fmid),'set',tmp);}else{throw'e1';}}catch(e){if(e=='e1'){$.jgrid.info_dialog($.jgrid.errors.errcap,'function \\'custom_value\\' '+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose);}else{$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose);}}break;}cnt++;}});if(cnt>0){$('#id_g',frmtb).val(rowid);}},fillDataServerSide:function fillDataServerSide(rowid,$form,frmoper){var $t=this,$self=$($t),settings=$self.data('settings'),postdata={},$detailFormToPopulate=$form!==undefined?$form:settings.formEdit.$detailForm;if(rowid=='_empty'){$self.rup_jqtable('resetForm',settings.formEdit.$detailForm);$.proxy($.jgrid.getFormData,$t)(postdata,{});rp_ge[$t.p.id]._savedData=$.rup_utils.unnestjson(postdata);if(frmoper!=='clone_clear'){$self.triggerHandler('jqGridAddEditAfterFillData',[$form,frmoper]);}$('#id_g',$form).val(rowid);return;}var ajaxOptions=$.extend({success:function success(xhr,ajaxOptions){var xhrArray;if(xhr.id&&xhr.id instanceof Object){//estamos en JPA\nif(xhr.id instanceof Object){//es que estamos en jpa y traemos una clave compuesta\nxhr['JPA_ID']=xhr.id;delete xhr.id;}}xhrArray=$.rup_utils.jsontoarray(xhr);$.rup_utils.populateForm(xhrArray,$detailFormToPopulate);rp_ge[$t.p.id]._savedData=$.rup_utils.unnestjson(xhr);rp_ge[$t.p.id]._savedData[settings.id+'_id']=rowid;$('#id_g',$form).val(rowid);$self.triggerHandler('rupTable_afterFormFillDataServerSide',[xhr,$detailFormToPopulate,ajaxOptions]);},error:function error(xhr,ajaxOptions,thrownError){settings.$feedback.rup_feedback('option','delay',null);settings.$feedback.rup_feedback('set',xhr.responseText,'error');settings.$feedback.rup_feedback('option','delay',1000);}},settings.formEdit.detailOptions.ajaxDetailOptions);ajaxOptions.url+='/'+$self.rup_jqtable('getPkUrl',rowid);$.when($.rup_ajax(ajaxOptions)).then(function(success,statusText,xhr){$self.triggerHandler('jqGridAddEditAfterFillData',[$form,frmoper]);});},fillData:function fillData(rowid,obj,fmid,frmoper){var $t=this,$self=$($t),settings=$self.data('settings');//switch ((rowid == '_empty'?\"clientSide\":settings.formEdit.editOptions.fillDataMethod)){\nswitch(settings.formEdit.editOptions.fillDataMethod){case'clientSide':$.proxy($.jgrid.fillDataClientSide,$t)(rowid,obj,fmid,frmoper);break;case'serverSide':default:$.proxy($.jgrid.fillDataServerSide,$t)(rowid,settings.formEdit.$detailForm,frmoper);break;}},getFormData:function getFormData(postdata,extpost){var $t=this,$self=$(this),settings=$self.data('settings'),formParams;formParams=form2object(settings.formEdit.$detailForm[0],null,false);jQuery.extend(true,postdata,formParams);return true;},postIt:function postIt(postdata,extpost,frmoper){var $t=this,self=$t,$self=jQuery(self),settings=$self.data('settings'),gID=$t.p.id,frmgr=$.fn.jqGrid.rup.edit.detail.detailFormId+gID,frmtborg=$.fn.jqGrid.rup.edit.detail.detailBodyId+gID,frmtb='#'+$.jgrid.jqID(frmtborg),copydata,ret=[true,'',''],onCS={},opers=$t.p.prmNames,idname,oper,key,selr,i;var retvals=$($t).triggerHandler('jqGridAddEditBeforeCheckValues',[$('#'+frmgr),frmoper]);if(retvals&&_typeof(retvals)==='object'){postdata=retvals;}if($.isFunction(rp_ge[$t.p.id].beforeCheckValues)){retvals=rp_ge[$t.p.id].beforeCheckValues.call($t,postdata,$('#'+frmgr),postdata[$t.p.id+'_id']=='_empty'?opers.addoper:opers.editoper);if(retvals&&_typeof(retvals)==='object'){postdata=retvals;}}for(key in postdata){if(postdata.hasOwnProperty(key)){ret=$.jgrid.checkValues.call($t,postdata[key],key,$t);if(ret[0]===false){break;}}}$.proxy($.jgrid.setNulls,$t)();if(ret[0]){onCS=$($t).triggerHandler('jqGridAddEditClickSubmit',[rp_ge[$t.p.id],postdata,frmoper]);if(onCS===undefined&&$.isFunction(rp_ge[$t.p.id].onclickSubmit)){onCS=rp_ge[$t.p.id].onclickSubmit.call($t,rp_ge[$t.p.id],postdata)||{};}ret=$($t).triggerHandler('jqGridAddEditBeforeSubmit',[postdata,$('#'+frmgr),frmoper]);if(ret===undefined){ret=[true,'',''];}if(ret[0]&&$.isFunction(rp_ge[$t.p.id].beforeSubmit)){ret=rp_ge[$t.p.id].beforeSubmit.call($t,postdata,$('#'+frmgr));}}//\t\t\tif(ret[0] && !rp_ge[$t.p.id].processing) {\nif(ret[0]){rp_ge[$t.p.id].processing=true;$('#sData',frmtb+'_2').addClass('ui-state-active');oper=opers.oper;idname=opers.id;// we add to pos data array the action - the name is oper\npostdata[oper]=$.trim(postdata[$t.p.id+'_id'])=='_empty'?opers.addoper:opers.editoper;if(postdata[oper]!=opers.addoper){postdata[idname]=postdata[$t.p.id+'_id'];}else{// check to see if we have allredy this field in the form and if yes lieve it\nif(postdata[idname]===undefined){postdata[idname]=postdata[$t.p.id+'_id'];}}delete postdata[$t.p.id+'_id'];postdata=$.extend(postdata,rp_ge[$t.p.id].editData,onCS);if($t.p.treeGrid===true){if(postdata[oper]==opers.addoper){selr=$($t).jqGrid('getGridParam','selrow');var tr_par_id=$t.p.treeGridModel=='adjacency'?$t.p.treeReader.parent_id_field:'parent_id';postdata[tr_par_id]=selr;}for(i in $t.p.treeReader){if($t.p.treeReader.hasOwnProperty(i)){var itm=$t.p.treeReader[i];if(postdata.hasOwnProperty(itm)){if(postdata[oper]==opers.addoper&&i==='parent_id_field'){continue;}delete postdata[itm];}}}}postdata[idname]=$.jgrid.stripPref($t.p.idPrefix,postdata[idname]);var ajaxOptions=$.extend({url:rp_ge[$t.p.id].url||$($t).jqGrid('getGridParam','editurl'),type:rp_ge[$t.p.id].mtype,data:$.isFunction(rp_ge[$t.p.id].serializeEditData)?rp_ge[$t.p.id].serializeEditData.call($t,postdata):postdata,complete:function complete(data,status){var key,xhr;postdata[idname]=$t.p.idPrefix+postdata[idname];if(status!='success'){ret[0]=false;ret[1]=$($t).triggerHandler('jqGridAddEditErrorTextFormat',[data,frmoper]);if($.isFunction(rp_ge[$t.p.id].errorTextFormat)){ret[1]=rp_ge[$t.p.id].errorTextFormat.call($t,data);}else{ret[1]=status+' Status: \\''+data.statusText+'\\'. Error code: '+data.status;}}else{// data is posted successful\n// execute aftersubmit with the returned data from server\nret=$($t).triggerHandler('jqGridAddEditAfterSubmit',[data,postdata,frmoper]);if(ret===undefined){ret=[true,'',''];}if(ret[0]&&$.isFunction(rp_ge[$t.p.id].afterSubmit)){ret=rp_ge[$t.p.id].afterSubmit.call($t,data,postdata);}}if(ret[0]===false){$('#'+settings.formEdit.feedbackId+'>td',frmtb).html(ret[1]);$('#'+settings.formEdit.feedbackId,frmtb).show();}else{// remove some values if formattaer select or checkbox\nxhr=$.parseJSON(data.responseText);$.each($t.p.colModel,function(){if(extpost[this.name]&&this.formatter&&this.formatter=='select'){try{delete extpost[this.name];}catch(e){}}if(this.formatter=='checkbox'&&postdata[this.name]==undefined){postdata[this.name]=null;}if(this.formatter&&this.formatter!=='checkbox'&&this.formatter!=='select'){if(postdata[this.name]===undefined){postdata[this.name]=this.formatter.call($($t),ret[2],undefined,xhr,postdata[oper]);}}if(this.formatterOnUpdate){postdata[this.name]=this.formatterOnUpdate.call($($t),$('#'+frmgr));}if(this.updateFromDetail){postdata[this.name]=this.updateFromDetail.call($($t),$('#'+frmgr));}});postdata=$.extend(postdata,extpost);if($t.p.autoencode){$.each(postdata,function(n,v){postdata[n]=$.jgrid.htmlDecode(v);});}//rp_ge[$t.p.id].reloadAfterSubmit = rp_ge[$t.p.id].reloadAfterSubmit && $t.p.datatype != \"local\";\n// the action is add\nif(postdata[oper]==opers.addoper){//id processing\n// user not set the id ret[2]\nif(!ret[2]){ret[2]=$.jgrid.randId();}postdata[idname]=ret[2];if(rp_ge[$t.p.id].closeAfterAdd){if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');}else{if($t.p.treeGrid===true){$($t).jqGrid('addChildNode',ret[2],selr,postdata);}else{$($t).jqGrid('addRowData',ret[2],postdata,rp_ge[$t.p.id].addedrow);$($t).jqGrid('setSelection',ret[2]);}}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,onClose:rp_ge[$t.p.id].onClose});}else if(rp_ge[$t.p.id].clearAfterAdd){if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');}else{if($t.p.treeGrid===true){$($t).jqGrid('addChildNode',ret[2],selr,postdata);}else{$($t).jqGrid('addRowData',ret[2],postdata,rp_ge[$t.p.id].addedrow);// TODO : Añadido para que seleccione el registro insertado. Tratar de hacerlo en el evento jqGridAfterInsertRow\n$($t).jqGrid('setSelection',ret[2]);}}$.proxy($.jgrid.fillData,$t)('_empty',$t,frmgr);}else{if(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');}else{if($t.p.treeGrid===true){$($t).jqGrid('addChildNode',ret[2],selr,postdata);}else{$($t).jqGrid('addRowData',ret[2],postdata,rp_ge[$t.p.id].addedrow);}}}}else{// the action is update\nif(rp_ge[$t.p.id].reloadAfterSubmit){$($t).trigger('reloadGrid');if(!rp_ge[$t.p.id].closeAfterEdit){setTimeout(function(){$($t).jqGrid('setSelection',postdata[idname]);},1000);}}else{if($t.p.treeGrid===true){$($t).jqGrid('setTreeRow',postdata[idname],postdata);}else{$($t).jqGrid('setRowData',postdata[idname],postdata);}}if(rp_ge[$t.p.id].closeAfterEdit){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,onClose:rp_ge[$t.p.id].onClose});}}if($.isFunction(rp_ge[$t.p.id].afterComplete)){copydata=data;setTimeout(function(){$($t).triggerHandler('jqGridAddEditAfterComplete',[copydata,postdata,$('#'+frmgr),frmoper]);rp_ge[$t.p.id].afterComplete.call($t,copydata,postdata,$('#'+frmgr));copydata=null;},500);}if(rp_ge[$t.p.id].checkOnSubmit||rp_ge[$t.p.id].checkOnUpdate){$('#'+frmgr).data('disabled',false);if(rp_ge[$t.p.id]._savedData[$t.p.id+'_id']!='_empty'){for(key in rp_ge[$t.p.id]._savedData){if(rp_ge[$t.p.id]._savedData.hasOwnProperty(key)&&postdata[key]){rp_ge[$t.p.id]._savedData[key]=postdata[key];}}}}}rp_ge[$t.p.id].processing=false;$('#sData',frmtb+'_2').removeClass('ui-state-active');try{$(':input:visible','#'+frmgr)[0].focus();}catch(e){}}},$.jgrid.ajaxOptions,rp_ge[$t.p.id].ajaxEditOptions);if(!ajaxOptions.url&&!rp_ge[$t.p.id].useDataProxy){if($.isFunction($t.p.dataProxy)){rp_ge[$t.p.id].useDataProxy=true;}else{ret[0]=false;ret[1]+=' '+$.jgrid.errors.nourl;}}if(ret[0]){if(rp_ge[$t.p.id].useDataProxy){var dpret=$t.p.dataProxy.call($t,ajaxOptions,'set_'+$t.p.id);if(dpret===undefined){dpret=[true,''];}if(dpret[0]===false){ret[0]=false;ret[1]=dpret[1]||'Error deleting the selected row!';}else{if(ajaxOptions.data.oper==opers.addoper&&rp_ge[$t.p.id].closeAfterAdd){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,onClose:rp_ge[$t.p.id].onClose});}if(ajaxOptions.data.oper==opers.editoper&&rp_ge[$t.p.id].closeAfterEdit){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,onClose:rp_ge[$t.p.id].onClose});}}}else{$.ajax(ajaxOptions);}}}if(ret[0]===false){$('#'+settings.formEdit.feedbackId+'>td',frmtb).html(ret[1]);$('#'+settings.formEdit.feedbackId,frmtb).show();// return;\n}},setNulls:function setNulls(){var $t=this,postdata;$.each($t.p.colModel,function(i,n){if(n.editoptions&&n.editoptions.NullIfEmpty===true){if(postdata.hasOwnProperty(n.name)&&postdata[n.name]===''){postdata[n.name]='null';}}});},compareData:function compareData(nObj,oObj){var ret=false,key,unnestNObj=jQuery.rup_utils.unnestjson(nObj),unnestOObj=jQuery.rup_utils.unnestjson(oObj);for(key in unnestNObj){if(unnestNObj.hasOwnProperty(key)&&String(unnestNObj[key])!==String(unnestOObj[key])){ret=true;// Descomentar para debug\n//\t\t\t\t\tconsole.log(\" Compare data: \"+ key+ \" new: \"+String(unnestNObj[key]) + \" old: \"+String(unnestOObj[key]));\nbreak;}}return ret;},checkUpdates:function checkUpdates(extpost,okCallback){var $self=$(this),settings=$self.data('settings'),postdata,newData,$t=this,gID=$t.p.id,frmgr=$.fn.jqGrid.rup.edit.detail.detailFormId+gID,frmtborg=$.fn.jqGrid.rup.edit.detail.detailBodyId+gID,frmtb='#'+$.jgrid.jqID(frmtborg),stat=true,diff=false;//\t\t\t$(\"#\"+settings.formEdit.feedbackId,frmtb).hide();\nif(rp_ge[$t.p.id].checkOnUpdate){postdata={};extpost={};$.proxy($.jgrid.getFormData,$t)(postdata,extpost);newData=$.extend({},postdata,extpost);if(settings.formEdit.addEditOptions.defaultCompareData===true){diff=$.proxy($.jgrid.compareData,$t)(newData,rp_ge[$t.p.id]._savedData);}var compareDataEvent=jQuery.Event('rupTable_formEditCompareData');compareDataEvent.isDifferent=diff;$self.triggerHandler(compareDataEvent,[rp_ge[$t.p.id]._savedData,newData]);if(compareDataEvent.isDifferent){$.rup_messages('msgConfirm',{message:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.saveAndContinue'),title:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.changes'),OKFunction:function OKFunction(){if(jQuery.isFunction(okCallback)){jQuery.proxy(okCallback,$self)();}}});//\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",true);\n//\t\t\t\t\t$(\".confirm\",\"#\"+IDs.themodal).show();\nstat=false;}}return stat;},restoreInline:function restoreInline(rowid){var $t=this,i;if(rowid!=='_empty'&&typeof $t.p.savedRow!=='undefined'&&$t.p.savedRow.length>0&&$.isFunction($.fn.jqGrid.restoreRow)){for(i=0;i<$t.p.savedRow.length;i++){if($t.p.savedRow[i].id==rowid){$($t).jqGrid('restoreRow',rowid);break;}}}},getCurrPos:function getCurrPos(){var $t=this,$self=$(this),settings=$self.data('settings'),gID=$t.p.id,frmgr=$.fn.jqGrid.rup.edit.detail.detailFormId+gID,frmtborg=$.fn.jqGrid.rup.edit.detail.detailBodyId+gID,frmtb='#'+$.jgrid.jqID(frmtborg),rowsInGrid=$($t).jqGrid('getDataIDs'),idGval=$('#id_g',settings.formEdit.$detailForm).val(),selrow=idGval!==undefined&&idGval!=='_empty'?idGval:$self.jqGrid('getGridParam','selrow'),pos=$.inArray(selrow,rowsInGrid);return[pos,rowsInGrid];},updateNav:function updateNav(cr,posarr){var $self=$(this),totr;if(posarr!==undefined&&posarr[1]!==undefined){totr=posarr[1].length-1;if(cr===0){$('#pData',frmtb+'_2').addClass('ui-state-disabled');}else if(posarr[1][cr-1]!==undefined&&$('#'+$.jgrid.jqID(posarr[1][cr-1])).hasClass('ui-state-disabled')){$('#pData',frmtb+'_2').addClass('ui-state-disabled');}else{$('#pData',frmtb+'_2').removeClass('ui-state-disabled');}if(cr==totr){$('#nData',frmtb+'_2').addClass('ui-state-disabled');}else if(posarr[1][cr+1]!==undefined&&$('#'+$.jgrid.jqID(posarr[1][cr+1])).hasClass('ui-state-disabled')){$('#nData',frmtb+'_2').addClass('ui-state-disabled');}else{$('#nData',frmtb+'_2').removeClass('ui-state-disabled');}}$self.rup_jqtable('updateDetailPagination');}});/*\r\n     * MODIFICACIONES\r\n     * Funciones extendidas (MODIFICADAS) del componente jqGrid.\r\n     *\r\n     * Los métodos aquí indicados han sido extendidos partiendo de la implementación original.\r\n     * Las modificaciones han sido realizadas debido a la incompatibilidad de su implementación con los requisitos exigidos.\r\n     *\r\n     * Los métodos extendidos para su modificación son los siguientes:\r\n     *\r\n     * - editGridRow\r\n     */$.jgrid.extend({editGridRow:function editGridRow(rowid,p){p=$.extend({top:0,left:0,width:300,height:'auto',dataheight:'auto',modal:false,overlay:30,drag:true,resize:true,url:null,mtype:'POST',clearAfterAdd:true,closeAfterEdit:false,reloadAfterSubmit:true,onInitializeForm:null,beforeInitData:null,beforeShowForm:null,afterShowForm:null,beforeSubmit:null,afterSubmit:null,onclickSubmit:null,afterComplete:null,onclickPgButtons:null,afterclickPgButtons:null,editData:{},recreateForm:false,jqModal:true,closeOnEscape:false,addedrow:'first',topinfo:'',bottominfo:'',saveicon:[],closeicon:[],savekey:[false,13],navkeys:[false,38,40],checkOnSubmit:false,checkOnUpdate:false,_savedData:{},processing:false,onClose:null,ajaxEditOptions:{},serializeEditData:null,viewPagerButtons:true},$.jgrid.edit,p||{});rp_ge[$(this)[0].p.id]=p;return this.each(function(){var $t=this,$self=$($t),settings=$self.data('settings');if(!$t.grid||!rowid){return;}var gID=$t.p.id,frmgr=$.fn.jqGrid.rup.edit.detail.detailFormId+gID,frmtborg=$.fn.jqGrid.rup.edit.detail.detailBodyId+gID,frmtb='#'+$.jgrid.jqID(frmtborg),IDs={themodal:$.fn.jqGrid.rup.edit.detail.detailDivId+gID,modalhead:'edithd'+gID,modalcontent:'editcnt'+gID,scrollelm:frmgr},onBeforeShow=$.isFunction(rp_ge[$t.p.id].beforeShowForm)?rp_ge[$t.p.id].beforeShowForm:false,onAfterShow=$.isFunction(rp_ge[$t.p.id].afterShowForm)?rp_ge[$t.p.id].afterShowForm:false,onBeforeInit=$.isFunction(rp_ge[$t.p.id].beforeInitData)?rp_ge[$t.p.id].beforeInitData:false,onInitializeForm=$.isFunction(rp_ge[$t.p.id].onInitializeForm)?rp_ge[$t.p.id].onInitializeForm:false,showFrm=true,maxCols=1,maxRows=0,postdata,extpost,newData,diff,frmoper;frmgr=$.jgrid.jqID(frmgr);if(rowid==='new'){rowid='_empty';frmoper='add';p.caption=rp_ge[$t.p.id].addCaption;}else if(rowid==='cloned'){p.caption=rp_ge[$t.p.id].addCaption;rowid='_empty';frmoper='clone_clear';}else{p.caption=rp_ge[$t.p.id].editCaption;frmoper='edit';}settings.opermode=frmoper;//\t\t\t\tif(p.recreateForm===true && $(\"#\"+$.jgrid.jqID(IDs.themodal))[0] !== undefined) {\n//\t\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).remove();\n//\t\t\t\t}\nif(p.recreateForm===true&&settings.formEdit.detailFormCreated===true){settings.formEdit.$detailFormDiv.remove();}var closeovrl=true;if(p.checkOnUpdate&&p.jqModal&&!p.modal){closeovrl=false;}if(settings.formEdit.detailFormCreated===true){IDs.themodal=settings.formEdit.$detailFormDiv.attr('id');showFrm=$($t).triggerHandler('jqGridAddEditBeforeInitData',[settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr),frmoper]);if(showFrm===undefined){showFrm=true;}if(showFrm&&onBeforeInit){showFrm=onBeforeInit.call($t,settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr));}if(showFrm===false){return;}$.proxy($.jgrid.restoreInline,$t)(rowid);$('.ui-jqdialog-title','#'+$.jgrid.jqID(IDs.modalhead)).html(p.caption);$('#'+settings.formEdit.feedbackId,frmtb).hide();if(rp_ge[$t.p.id].topinfo){$('.topinfo',frmtb).html(rp_ge[$t.p.id].topinfo);$('.tinfo',frmtb).show();}else{$('.tinfo',frmtb).hide();}if(rp_ge[$t.p.id].bottominfo){$('.bottominfo',frmtb+'_2').html(rp_ge[$t.p.id].bottominfo);$('.binfo',frmtb+'_2').show();}else{$('.binfo',frmtb+'_2').hide();}$.proxy($.jgrid.fillData,$t)(rowid,$t,frmgr,frmoper);///\nif(rowid=='_empty'||!rp_ge[$t.p.id].viewPagerButtons){$('#pData, #nData',frmtb+'_2').hide();}else{$('#pData, #nData',frmtb+'_2').show();}if(rp_ge[$t.p.id].processing===true){rp_ge[$t.p.id].processing=false;$('#sData',frmtb+'_2').removeClass('ui-state-active');}if((settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr)).data('disabled')===true){$('.confirm','#'+$.jgrid.jqID(IDs.themodal)).hide();(settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr)).data('disabled',false);}$($t).triggerHandler('jqGridAddEditBeforeShowForm',[settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr),frmoper]);if(onBeforeShow){onBeforeShow.call($t,settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr));}$('#'+$.jgrid.jqID(IDs.themodal)).data('onClose',rp_ge[$t.p.id].onClose);$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,jqM:false,overlay:p.overlay,modal:p.modal});if(!closeovrl){$('.jqmOverlay').click(function(){if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}$($t).triggerHandler('jqGridAddEditAfterShowForm',[settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr),frmoper]);if(onAfterShow){onAfterShow.call($t,settings.formEdit.$detailForm?settings.formEdit.$detailForm:$('#'+frmgr));}}else{var saveData=function saveData(){postdata={};extpost={};$('#'+settings.formEdit.feedbackId,frmtb).hide();// all depend on ret array\n//ret[0] - succes\n//ret[1] - msg if not succes\n//ret[2] - the id  that will be set if reload after submit false\n$.proxy($.jgrid.getFormData,$t)(postdata);if(postdata[$t.p.id+'_id']=='_empty'){$.proxy($.jgrid.postIt,$t)(postdata,extpost,settings.opermode);}else if(p.checkOnSubmit===true){newData=$.extend({},postdata,extpost);diff=compareData(newData,rp_ge[$t.p.id]._savedData);if(diff){$('#'+frmgr).data('disabled',true);$('.confirm','#'+$.jgrid.jqID(IDs.themodal)).show();}else{$.proxy($.jgrid.postIt,$t)(postdata,extpost,settings.opermode);}}else{$.proxy($.jgrid.postIt,$t)(postdata,extpost,settings.opermode);}return false;};var fncSaveButton=function fncSaveButton(){$self.data('tmp.formEditSaveType','SAVE');if(!saveData()){return false;}};var fncSaveAndRepeatButton=function fncSaveAndRepeatButton(){$self.data('tmp.formEditSaveType','SAVE_REPEAT');if(!saveData()){return false;}};var fncCancelLink=function fncCancelLink(){if(!$.proxy($.jgrid.checkUpdates,$t)(extpost,function(){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});})){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;};var dh=isNaN(p.dataheight)?p.dataheight:p.dataheight+'px',dw=isNaN(p.datawidth)?p.datawidth:p.datawidth+'px',frm=$(jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.templates.detailForm.form',frmgr,dh)).data('disabled',false),tbl=$(jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.templates.detailForm.body',frmtborg)),showFrm=$($t).triggerHandler('jqGridAddEditBeforeInitData',[$('#'+frmgr),frmoper]),flr;if(typeof showFrm=='undefined'){showFrm=true;}if(showFrm&&onBeforeInit){showFrm=onBeforeInit.call($t,$('#'+frmgr));}if(showFrm===false){return;}$.proxy($.jgrid.restoreInline,$t)(rowid);$($t.p.colModel).each(function(){var fmto=this.formoptions;maxCols=Math.max(maxCols,fmto?fmto.colpos||0:0);maxRows=Math.max(maxRows,fmto?fmto.rowpos||0:0);});$(frm).append(tbl);flr=$(jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.templates.detailForm.errorFeedback',settings.formEdit.feedbackId));flr[0].rp=0;$(tbl).append(flr);/* ADD\t*/flr=$('<div class=\\'tinfo\\' style=\\'display:none\\'><span class=\\'topinfo\\'>'+rp_ge[$t.p.id].topinfo+'</span></div>');/*MOD END*/flr[0].rp=0;$(tbl).append(flr);// set the id.\n// use carefull only to change here colproperties.\n// create data\nvar rtlb=$t.p.direction=='rtl'?true:false,bp=rtlb?'nData':'pData',bn=rtlb?'pData':'nData';/* DEL\t\t\t\tcreateData(rowid,$t,tbl,maxCols); */if(settings.formEdit.$detailForm===undefined){settings.formEdit.$detailForm=tbl.parent();$.proxy($.jgrid.createData,$t)(rowid,$t,tbl,maxCols);}else{settings.formEdit.$detailForm.append($('<div class=\\'FormData\\' style=\\'display:none\\'><span class=\\'CaptionTD\\'></span><span class=\\'DataTD \\'><input class=\\'FormElement\\' id=\\'id_g\\' type=\\'text\\' name=\\''+$t.p.id+'_id\\' value=\\''+rowid+'\\'/></span></div>'));}frm=settings.formEdit.$detailForm[0];$.proxy($.jgrid.fillData,$t)(rowid,$t,frmgr,frmoper);// buttons at footer\nvar bP='<a href=\\'javascript:void(0)\\' id=\\''+bp+'\\' class=\\'fm-button ui-state-default ui-corner-left\\'><span class=\\'ui-icon ui-icon-triangle-1-w\\'></span></a>',bN='<a href=\\'javascript:void(0)\\' id=\\''+bn+'\\' class=\\'fm-button ui-state-default ui-corner-right\\'><span class=\\'ui-icon ui-icon-triangle-1-e\\'></span></a>',bS='<a href=\\'javascript:void(0)\\' id=\\'sData\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+p.bSubmit+'</a>',bC='<a href=\\'javascript:void(0)\\' id=\\'cData\\' class=\\'fm-button ui-state-default ui-corner-all\\'>'+p.bCancel+'</a>';var bt='<table border=\\'0\\' cellspacing=\\'0\\' cellpadding=\\'0\\' class=\\'EditTable\\' id=\\''+frmtborg+'_2\\'><tbody><tr><td colspan=\\'2\\'><hr class=\\'ui-widget-content\\' style=\\'margin:1px\\'/></td></tr><tr id=\\'Act_Buttons\\'><td class=\\'navButton\\'>'+(rtlb?bN+bP:bP+bN)+'</td><td class=\\'EditButton\\'>'+bS+bC+'</td></tr>';bt+='<tr style=\\'display:none\\' class=\\'binfo\\'><td class=\\'bottominfo\\' colspan=\\'2\\'>'+rp_ge[$t.p.id].bottominfo+'</td></tr>';bt+='</tbody></table>';/*\r\n                     * MODIFICADO POR UDA.\r\n                     * Adaptar la ordenación a la nueva disposición mediante divs en vez de table.\r\n                     */if(settings.formEdit.ownFormEdit===false){if(maxRows>0){for(var i=1;i<=maxCols;i++){// Por cada columna\nvar $colLayer=tbl.find('#col_'+parseInt((parseInt(i,10)||1)*2,10));var sd=[];$.each($colLayer.find('div'),function(i,r){sd[i]=r;});sd.sort(function(a,b){if(a.rp>b.rp){return 1;}if(a.rp<b.rp){return-1;}return 0;});$.each(sd,function(index,row){$colLayer.append(row);});}}}/*\r\n                     * FIN MODIFICACION\r\n                     */p.gbox='#gbox_'+$.jgrid.jqID(gID);var cle=false;if(p.closeOnEscape===true){p.closeOnEscape=false;cle=true;}/*\r\n                     * MODIFICADO POR UDA\r\n                     * Añadida barra de navegación entre elementos\r\n                     */var barraNavegacion=$self.rup_jqtable('createDetailNavigation'),tms;if(settings.formEdit.ownFormEdit===true){if(!settings.formEdit.$detailFormDiv.is(':visible')){settings.formEdit.$detailFormDiv.show();}/* TODO : Añadir los parametros de configruación que puedan añadirse al rup_dialog. */settings.formEdit.$detailFormDiv.rup_dialog($.extend({},{type:$.rup.dialog.DIV,autoOpen:false,modal:true,resizable:p.resize,title:p.caption,width:p.width},settings.formEdit.dialogOptions));settings.formEdit.detailFormCreated=true;settings.formEdit.$navigationBar.append(barraNavegacion);if(settings.formEdit.$saveButton.length>0){settings.formEdit.$saveButton.button().click(function(){jQuery.proxy(fncSaveButton,$self)();});}if(settings.formEdit.$saveRepeatButton.length>0){settings.formEdit.$saveRepeatButton.button().click(function(){jQuery.proxy(fncSaveAndRepeatButton,$self)();});}if(settings.formEdit.$cancelButton.length>0){settings.formEdit.$cancelButton.on('click',function(){jQuery.proxy(fncCancelLink,$self)();});}if(!jQuery.isFunction(p.onClose)){p.onClose=fncCancelLink;}jQuery('.ui-dialog-titlebar-close, a:has(#closeText_'+settings.formEdit.$detailFormDiv.first()[0].id+')',settings.formEdit.$detailFormDiv.parent()).off('click').on('click',function(event){p.onClose.call(event);});IDs.themodal=settings.formEdit.$detailFormDiv.attr('id');}else{var tms=barraNavegacion.after(frm);var saveButton={text:$.rup.i18nParse($.rup.i18n.base,'rup_global.save'),click:fncSaveButton};var saveAndRepeatButton={text:$.rup.i18nParse($.rup.i18n.base,'rup_global.save_repeat'),click:fncSaveAndRepeatButton};var cancelLink={text:$.rup.i18nParse($.rup.i18n.base,'rup_global.cancel'),btnType:$.rup.dialog.LINK,click:fncCancelLink};p.buttons=[saveButton,saveAndRepeatButton,cancelLink];p.onClose=fncCancelLink;$.jgrid.createModal(IDs,tms,p,'#gview_'+$.jgrid.jqID($t.p.id),$('#gbox_'+$.jgrid.jqID($t.p.id))[0]);settings.formEdit.detailFormCreated=true;}if(settings.formEdit.$detailFormDiv===undefined){settings.formEdit.$detailFormDiv=$('#'+$.jgrid.jqID(IDs.themodal));}/*\r\n                     * Creacion rup_form\r\n                     */if(rtlb){$('#pData, #nData',frmtb+'_2').css('float','right');$('.EditButton',frmtb+'_2').css('text-align','left');}if(rp_ge[$t.p.id].topinfo){$('.tinfo',frmtb).show();}if(rp_ge[$t.p.id].bottominfo){$('.binfo',frmtb+'_2').show();}tms=null;bt=null;$('#'+$.jgrid.jqID(IDs.themodal)).keydown(function(e){var wkey=e.target;if($('#'+frmgr).data('disabled')===true){return false;}//??\nif(rp_ge[$t.p.id].savekey[0]===true&&e.which==rp_ge[$t.p.id].savekey[1]){// save\nif(wkey.tagName!='TEXTAREA'){$('#sData',frmtb+'_2').trigger('click');return false;}}if(e.which===27){/* DEL \t\t\t\t\t\tif(!checkUpdates()) {return false;} */ /* ADD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}if(cle){$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:p.gbox,jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});}return false;}if(rp_ge[$t.p.id].navkeys[0]===true){if($('#id_g',frmtb).val()=='_empty'){return true;}if(e.which==rp_ge[$t.p.id].navkeys[1]){//up\n$('#pData',frmtb+'_2').trigger('click');return false;}if(e.which==rp_ge[$t.p.id].navkeys[2]){//down\n$('#nData',frmtb+'_2').trigger('click');return false;}}});if(p.checkOnUpdate){$('a.ui-jqdialog-titlebar-close span','#'+$.jgrid.jqID(IDs.themodal)).removeClass('jqmClose');$('a.ui-jqdialog-titlebar-close','#'+$.jgrid.jqID(IDs.themodal)).unbind('click').click(function(){/* DEL \t\t\t\t\t\tif(!checkUpdates()) {return false;} */ /* ADD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}p.saveicon=$.extend([true,'left','ui-icon-disk'],p.saveicon);p.closeicon=$.extend([true,'left','ui-icon-close'],p.closeicon);// beforeinitdata after creation of the form\nif(p.saveicon[0]===true){$('#sData',frmtb+'_2').addClass(p.saveicon[1]=='right'?'fm-button-icon-right':'fm-button-icon-left').append('<span class=\\'ui-icon '+p.saveicon[2]+'\\'></span>');}if(p.closeicon[0]===true){$('#cData',frmtb+'_2').addClass(p.closeicon[1]=='right'?'fm-button-icon-right':'fm-button-icon-left').append('<span class=\\'ui-icon '+p.closeicon[2]+'\\'></span>');}// here initform - only once\n$($t).triggerHandler('jqGridAddEditInitializeForm',[settings.formEdit.$detailForm,frmoper]);if(onInitializeForm){onInitializeForm.call($t,settings.formEdit.$detailForm);}if(rowid=='_empty'||!rp_ge[$t.p.id].viewPagerButtons){$('#pData,#nData',frmtb+'_2').hide();}else{$('#pData,#nData',frmtb+'_2').show();}$($t).triggerHandler('jqGridAddEditBeforeShowForm',[settings.formEdit.$detailForm,frmoper]);if(onBeforeShow){onBeforeShow.call($t,settings.formEdit.$detailForm);}$('#'+$.jgrid.jqID(IDs.themodal)).data('onClose',rp_ge[$t.p.id].onClose);$.jgrid.viewModal('#'+$.jgrid.jqID(IDs.themodal),{gbox:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,overlay:p.overlay,modal:p.modal});if(!closeovrl){$('.jqmOverlay').click(function(){/* DEL \t\t\t\t\t\tif(!checkUpdates()) {return false;} */ /* ADD */if(!$.proxy($.jgrid.checkUpdates,$t)(extpost)){return false;}$.jgrid.hideModal('#'+$.jgrid.jqID(IDs.themodal),{gb:'#gbox_'+$.jgrid.jqID(gID),jqm:p.jqModal,onClose:rp_ge[$t.p.id].onClose});return false;});}$($t).triggerHandler('jqGridAddEditAfterShowForm',[settings.formEdit.$detailForm,frmoper]);if(onAfterShow){onAfterShow.call($t,settings.formEdit.$detailForm);}$('.fm-button','#'+$.jgrid.jqID(IDs.themodal)).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});}var posInit=$.proxy($.jgrid.getCurrPos,$t)();$self.rup_jqtable('updateDetailPagination');$.proxy($.jgrid.updateNav,$t)(posInit[0],posInit[1].length-1);});}});$.fn.jqGrid.rup={};$.fn.jqGrid.rup.edit={detail:{detailDivId:'detailDiv_',detailBodyId:'detailBody_',detailFormId:'detailForm_'},navigation:{forward:{id:'#nData'},back:{id:'#pData'}}};//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t* @description Propiedades de configuración del plugin formEdit del componente RUP Table.\r\n\t* @see Las posibles propiedades que se pueden indicar en cada una de las siguientes propiedades, se especifican con más detalle en la documentación del plugin subyacente jqGrid.\r\n\t* @name options\r\n\t*\r\n\t* @property {object} [addEditOptions] - Propiedades de configuración comunes a las acciones de edición e inserciónde un registro.\r\n\t* @property {object} [addOptions] - Propiedades de configuración exclusivas de la acción de inserción de un registro. Sobrescriben las indicadas en la propiedad addEditOptions.\r\n\t* @property {object} [editOptions] - Propiedades de configuración exclusivas de la acción de edición de un registro. Sobrescriben las indicadas en la propiedad addEditOptions.\r\n\t* @property {object} [deleteOptions] - Propiedades de configuración de la acción de borrado de un registro.\r\n\t* @property {object} [detailOptions] - Propiedades de configuración de la acción de mostrar un registro mediante el formulario de detalle.\r\n\t* @property {boolean} [defaultCompareData] - Determina si se debe de realizar la comparación por defecto en el control de cambios del formulario de edición. Por defecto a true.\r\n\t* @property {object} [dialogOptions] - Permite especificar opciones de configuración para el diálogo que contiene el formulario de detalle. Las opciones de configuración se pueden consultar en la guía de desarrollo del componente RUP Diálogo.\r\n\t*/jQuery.fn.rup_jqtable.plugins.formEdit={};jQuery.fn.rup_jqtable.plugins.formEdit.defaults={toolbar:{defaultButtons:{add:true,edit:true,cancel:false,save:false,clone:true,'delete':true,filter:false}},contextMenu:{defaultRowOperations:{add:true,edit:true,cancel:false,save:false,clone:true,'delete':true,filter:false}},formEdit:{autoselectFirstRecord:true,ownFormEdit:false,detailFormCreated:false,dialogOptions:{}}};// Parámetros de configuración por defecto para la acción de eliminar un registro.\njQuery.fn.rup_jqtable.plugins.formEdit.defaults.formEdit.deleteOptions={bSubmit:jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_message.aceptar'),cancelicon:[false,'left','icono_cancelar'],delicon:[false],linkStyleButtons:['#eData'],msg:'<div id=\"rup_msgDIV_msg_icon\" class=\"rup-message_icon-confirm\"></div><div id=\"rup_msgDIV_msg\" class=\"rup-message_msg-confirm white-space-normal\">'+jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.deleteAll')+'</div>',mtype:'DELETE',width:320,reloadAfterSubmit:false,resize:false,useDataProxy:true};// Parámetros de configuración por defecto para la acción de añadir y editar un registro.\njQuery.fn.rup_jqtable.plugins.formEdit.defaults.formEdit.addEditOptions={bSubmit:jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_message.aceptar'),closeicon:[false],checkOnUpdate:true,defaultCompareData:true,fillDataMethod:'serverSide',// clientSide || serverSide\nsaveicon:[false],linkStyleButtons:['#cData'],msg:'<div id=\"rup_msgDIV_msg_icon\" class=\"rup-message_icon-confirm\"></div><div id=\"rup_msgDIV_msg\" class=\"rup-message_msg-confirm white-space-normal\">'+jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.deleteAll')+'</div>',mtype:'PUT',reloadAfterSubmit:false,resize:false,viewPagerButtons:false,// TODO: no permitir el habilitarlo\nwidth:569,ajaxEditOptions:{type:'PUT',dataType:'json',processData:false}};// Parámetros de configruación específicos para la acción de añadir un registro\njQuery.fn.rup_jqtable.plugins.formEdit.defaults.formEdit.addOptions={mtype:'POST',ajaxEditOptions:{type:'POST'}};// Parámetros de configruación específicos para la acción de editar un registro\njQuery.fn.rup_jqtable.plugins.formEdit.defaults.formEdit.editOptions={mtype:'PUT',ajaxEditOptions:{type:'PUT'}};// Parámetros de configuración por defecto para la obtención del detalle de un registro\njQuery.fn.rup_jqtable.plugins.formEdit.defaults.formEdit.detailOptions={ajaxDetailOptions:{dataType:'json',type:'GET',contentType:'application/json'}};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n\t*  Evento que se lanza justo antes de procesarse la petición de borrado de un registro. En caso de devolver false se detiene la ejecución del borrado.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeDeleteRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} deleteOptions - Opciones de configuración de la operación de borrado.\r\n\t* @property {string} selectedRow - Identificador de la fila que se desea eliminar.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeDeleteRow\", function(event, deleteOptions, selectedRow){ });\r\n\t*/ /**\r\n\t*  Evento que se lanza justo antes de procesarse la petición de edición de un registro. En caso de devolver false se detiene la ejecución del borrado.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeEditRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} editOptions - Opciones de configuración de la operación de edición.\r\n\t* @property {string} selectedRow - Identificador de la fila que se desea editar.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeEditRow\", function(event, editOptions, selectedRow){ });\r\n\t*/ /**\r\n\t*  Evento que se lanza justo después de realizarse la petición de borrado de un registro.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_deleteAfterSubmit\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_deleteAfterSubmit\", function(event){ });\r\n\t*/ /**\r\n\t*  Evento lanzado antes de ejecutarse el método de inserción de un registro. En caso de retornar false se cancelará la inserción.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeAddRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} addOptions -  Opciones de configuración de la acción de insertar un elemento.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeAddRow\", function(event, addOptions){ });\r\n\t*/ /**\r\n\t*  Evento lanzado antes de ejecutarse el método de clonado de un registro. En caso de retornar false se cancelará el clonado.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeCloneRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} cloneOptions - Opciones de configuración de la operación de clonado.\r\n\t* @property {string} selectedRow - Identificador de la fila que se desea clonar.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeCloneRow\", function(event, cloneOptions, selectedRow){ });\r\n\t*/ /**\r\n\t*  Evento lanzado antes de ejecutarse el método de clonado de un registro. En caso de retornar false se cancelará el clonado.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeCloneRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} cloneOptions - Opciones de configuración de la operación de clonado.\r\n\t* @property {string} selectedRow - Identificador de la fila que se desea clonar.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeCloneRow\", function(event, cloneOptions, selectedRow){ });\r\n\t*/ /**\r\n\t*  Evento lanzado después de que ha finalizado correctamente el proceso de eliminar un registro..\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_afterDeleteRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_afterDeleteRow\", function(event){ });\r\n\t*/ /**\r\n\t*  Evento lanzado después de que ha finalizado correctamente el proceso de carga de datos en el formulario de edición a partir de una petición al servidor de aplicaciones.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_afterFormFillDataServerSide\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} xhr - Objeto enviado como respuesta desde el servidor.\r\n\t* @property {object} $detailFormToPopulate - Referencia al formulario de detalle.\r\n\t* @property {object} ajaxOptions - Opciones de configuración de la petición AJAX.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_afterFormFillDataServerSide\", function(event, xhr, $detailFormToPopulate, ajaxOptions){ });\r\n\t*/ /**\r\n\t*  : Permite asociar manejadores de eventos para ejecutar\r\n\tcódigo que indique al proceso de control de cambios si se han producido modificaciones o no.\r\n\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_formEditCompareData\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} savedData - Objeto que contiene los valores iniciales del formulario a partir de la serialización del mismo.\r\n\t* @property {object} newData - Objeto que contiene los valores actuales del formulario a partir de la serialización del mismo.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_formEditCompareData \", function(event,\tsavedData, newData){\r\n\t*\t\t// Se realizan las comprobaciones necesarias para determinar si se han producido cambios en el formulario de detalle\r\n\t*\t\tevent.isDifferent = true; // En caso de que se hayan producido cambios.\r\n\t*  \tevent.isDifferent = false; // En caso de que no hayan producido cambios.\r\n\t* });\r\n\t*/})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * preConfiguration: Método que se ejecuta antes de la invocación del componente jqGrid.\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */ /**\r\n\t * Permite la edición de los registros de la tabla mostrando los campos de edición sobre la propia línea del registro.\r\n\t *\r\n\t * @summary Plugin de edición en línea del componente RUP Table.\r\n\t * @module rup_jqtable/inlineEdit\r\n\t * @example\r\n\t *\r\n\t * $(\"#idComponente\").rup_jqtable({\r\n\t * \turl: \"../jqGridUsuario\",\r\n\t * \tusePlugins:[\"inlineEdit\"],\r\n\t * \tinlineEdit:{\r\n\t * \t\t// Propiedades de configuración del plugin inlineEdit\r\n\t * \t}\r\n\t * });\r\n\t */jQuery.rup_jqtable.registerPlugin('inlineEdit',{loadOrder:7,preConfiguration:function preConfiguration(settings){var $self=this;$self.rup_jqtable('preConfigureInlineEdit',settings);},postConfiguration:function postConfiguration(settings){var $self=this;$self.rup_jqtable('postConfigureInlineEdit',settings);}});/**\r\n\t * Extensión del componente rup_jqtable para permitir la edición en línea de los registros visualizados.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * configureInlineEdit(settings): Realiza la configuración interna necesaria para la gestión correcta de la edición en línea.\r\n\t * editRow(rowId, options): Activa el modo edicón en línea para un registro determinado.\r\n\t * saveRow(rowId, options): Realiza el guardado de un registo modificado mediante la edición en línea.\r\n\t *\r\n\t * Las propiedades de esta extensión almacenadas en el settings son las siguientes:\r\n\t *\r\n\t * settings.$inlineForm : Referencia al formulario utilizado para enviar los datos del registro que está siendo editado.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin inlineEdit del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigureInlineEdit\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigureInlineEdit:function preConfigureInlineEdit(settings){var $self=$(this),self=$self[0],//\t\t\t\tformId = \"inlineForm_\" + settings.id,\nuserBeforeSend;//\t\t\t\t$inlineForm =$(\"<form>\").attr({\"id\":\"inlineForm_\" + settings.id});\nsettings.editable=true;//\t\t\t// Arropamos la estructura de la tabla en un formulario para poder realizar el envío de los campos\n//\t\t\t$self.wrap($inlineForm);\n//\t\t\t// Almacenamos la referencia al formulario.\n//\t\t\tsettings.inlineEdit.$inlineForm = $(\"#\"+formId);\nif(settings.inlineEdit.addEditOptions.url===undefined){settings.inlineEdit.addEditOptions.url=settings.baseUrl;}settings.inlineEdit.deleteOptions.ajaxDelOptions=$.extend(true,settings.inlineEdit.deleteOptions.ajaxDelOptions,{success:function success(data,st,xhr){$self.triggerHandler('rupTableAfterDelete',[data,st,xhr]);$self.rup_jqtable('showFeedback',settings.$feedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.deletedOK'),'ok');}});/*\r\n\t\t\t * Configuración del evetno beforeSend. Se sustituye el existente (en caso de haber)\r\n\t\t\t * por el implementado a continuación. El objetivo es realizar la operación AJAX mediante\r\n\t\t\t * el componente rup_formulario en vez del sistema por defecto del jqGrid.\r\n\t\t\t *\r\n\t\t\t * El método beforeSend indicado por el usuario se seguirá ejecutanto de manera normal.\r\n\t\t\t */ // Se almacena en una variable temporal el método beforeSend especificado por el usuario\nuserBeforeSend=settings.inlineEdit.beforeSend;settings.inlineEdit.addEditOptions.restoreAfterError=false;settings.inlineEdit.addEditOptions.errorfunc=function(rowid,data,stat,err,o){var responseJSON;if(data.status===406&&data.responseText!==''){try{responseJSON=jQuery.parseJSON(data.responseText);if(responseJSON.rupErrorFields){$self.rup_jqtable('showServerValidationFieldErrors',settings.inlineEdit.$inlineForm,responseJSON);}}catch(e){// El mensaje JSON\n$self.rup_jqtable('showFeedback',settings.$feedback,data.responseText,'error');}}};settings.inlineEdit.addEditOptions.ajaxRowOptions.beforeSend=function(jqXHR,ajaxOptions){// Se añade la configuración de validaciones, la función userBeforeSend indicada por el usuario y el feedback utilizado por el componente.\njQuery.extend(true,ajaxOptions,{validate:settings.validate,beforeSend:jQuery.isFunction(userBeforeSend)?userBeforeSend:null,feedback:settings.$feedback});// Handler del evento rupValidate_formValidationError. Se lanza cuando se produce un error de validación en el formulario.\nsettings.inlineEdit.$inlineForm.on('rupValidate_formValidationError.inlineEditing',function(event,obj){$self.off('rupValidate_formValidationError.inlineEditing');// Se elimina la capa de bloqueo de la tabla.\n$('#lui_'+$.jgrid.jqID(settings.id)).hide();});// Se realiza el envío del fomulario\nsettings.inlineEdit.$inlineForm.rup_form('ajaxSubmit',ajaxOptions);// Se retorna false para evitar que se realice la petición AJAX del plugin subyacente.\nreturn false;};// Fuerza la configuración para que solo se pueda seleccionar mediante el checkbox\nsettings.multiboxonly=true;settings.getRowForEditing=function(){var $self=this,selrow=$self.jqGrid('getGridParam','selrow');return selrow===null?false:selrow;};/* DEFINICION DE OPERACIONES BASICAS CON LOS REGISTROS */settings.core.defaultOperations={'add':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.new'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.add.icon,enabled:function enabled(){var $self=this;return jQuery('tr[editable=\\'1\\']',$self).length===0;},callback:function callback(key,options){var $self=this;$self.rup_jqtable('addRow');}},'edit':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.modify'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.edit.icon,enabled:function enabled(){var $self=this,selrow=$self.jqGrid('getGridParam','selrow'),newRow;// Existe una fila seleccionada?\nselrow=selrow===null?false:selrow;selrow=selrow&&selrow.indexOf('jqg')===-1;// Existe una fila en modo nuevo?\nnewRow=jQuery('tr[editable=\\'1\\'].jqgrid-new-row',$self).length===0;return selrow&&newRow;},callback:function callback(key,options){$self.rup_jqtable('editRow',jQuery.proxy(settings.getRowForEditing,$self)());}},'save':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.save'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.save.icon,enabled:function enabled(){var $self=this;return jQuery('tr[editable=\\'1\\']',$self).length>0;},callback:function callback(object,event){if(event.type==='click'){$self.rup_jqtable('saveRow');}}},'clone':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.clone'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.clone.icon,enabled:function enabled(){var $self=this,selrow=$self.jqGrid('getGridParam','selrow'),newRow;// Existe una fila seleccionada?\nselrow=selrow===null?false:selrow;selrow=selrow&&selrow.indexOf('jqg')===-1;// Existe una fila en modo nuevo?\nnewRow=jQuery('tr[editable=\\'1\\'].jqgrid-new-row',$self).length===0;return selrow&&newRow;//\t\t\t\t\t\tif (settings.inlineEdit.autoEditRow===true){\n//\t\t\t\t\t\t\treturn $self.rup_jqtable(\"getSelectedRows\").length === 1;\n//\t\t\t\t\t\t}else{\n//\t\t\t\t\t\t\treturn $self.rup_jqtable(\"getSelectedRows\").length === 1 && jQuery(\"tr[editable='1']\", $self).length===0;\n//\t\t\t\t\t\t}\n},callback:function callback(key,options){if(jQuery('tr[editable=\\'1\\']',$self).length>0){$self.rup_jqtable('restoreRow');}$self.rup_jqtable('cloneRow');}},'cancel':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.cancel'),icon:self._ADAPTER.CONST.core.operations.defaultOperations.cancel.icon,enabled:function enabled(){var $self=this;return jQuery('tr[editable=\\'1\\']',$self).length>0;},callback:function callback(key,options){$self.rup_jqtable('restoreRow');}},'delete':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.delete'),icon:self._ADAPTER.CONST.core.operations.defaultOperations['delete'].icon,enabled:function enabled(){var $self=this,selrow=$self.jqGrid('getGridParam','selrow');selrow=selrow===null||selrow.indexOf('jqg')!==-1?false:selrow;return jQuery('tr[editable=\\'1\\']:not(.jqgrid-new-row)',$self).length>0||selrow;},callback:function callback(key,options){$self.rup_jqtable('deleteRow');}}};$.extend(true,settings.core.operations,settings.core.defaultOperations);// Configuración de edit/add\n// Se procede a añadir sobre los settings de configuración los correspondientes a la edición en línea.\nsettings.inlineEdit.addOptions=$.extend(true,{},settings.inlineEdit.addEditOptions,settings.inlineEdit.addOptions);settings.inlineEdit.editOptions=$.extend(true,{},settings.inlineEdit.addEditOptions,settings.inlineEdit.editOptions);/* =======\r\n\t\t\t * EVENTOS\r\n\t\t\t * =======\r\n\t\t\t */ // Campturador del evento jqGridInlineAfterSaveRow.\n$self.on({//\t\t\t\t\"jqGridAfterInsertRow.rupTable.inlineEditing\": function(event, rowid, data, data){\n//\t\t\t\t\tjQuery($self.getInd(rowid, true)).attr(\"editmode\",\"add\");\n//\n//\t\t\t\t},\n'jqGridInlineErrorSaveRow.rupTable.inlineEditing':function jqGridInlineErrorSaveRowRupTableInlineEditing(event,rowid,data){jQuery($self.getInd(rowid,true)).attr('id',settings.inlineEditingRow);$self.rup_jqtable('setSelection',settings.inlineEditingRow);},'jqGridInlineAfterSaveRow.rupTable.inlineEditing':function jqGridInlineAfterSaveRowRupTableInlineEditing(event,rowid,res,tmp,options){// Una vez introducida la fila se elimina el estilo jqgrid-new-row para evitar que se elimine al utilizar el cancelar sobre esa fila.\njQuery('#'+jQuery.jgrid.jqID(rowid)+'.jqgrid-new-row',$self).removeClass('jqgrid-new-row');// Una vez se haya realizado el guardado del registro se muestra el mensaje correspondiente en el feedback dependiendo del modo en el que se encuentra.\nif(options.oper==='edit'){$self.rup_jqtable('showFeedback',settings.$feedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.modifyOK'),'ok');}else{$self.rup_jqtable('showFeedback',settings.$feedback,$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.insertOK'),'ok');}},'jqGridInlineEditRow.rupTable.inlineEditing':function oneditfunc_default(event,rowId){var self=this,$self=$(self),settings=$self.data('settings'),colModel=self.p.colModel,ind=$self.jqGrid('getInd',rowId,true),cellColModel,colModelName,editOptions,$elem;// Se procesan las celdas editables\n$('td[role=\\'gridcell\\']',ind).each(function(i){cellColModel=colModel[i];if(cellColModel.editable===true){colModelName=cellColModel.name;$elem=$('[name=\\''+colModelName+'\\']',ind);// Se añade el title de los elementos de acuerdo al colname\n$elem.attr({'oldtitle':self.p.colNames[i],'class':'editable customelement'});// En caso de tratarse de un componente rup, se inicializa de acuerdo a la configuracón especificada en el colModel\nif(cellColModel.rupType!==undefined){editOptions=cellColModel.editoptions;/*\r\n\t\t\t\t\t\t\t\t * PRE Configuración de los componentes RUP\r\n\t\t\t\t\t\t\t\t */switch(cellColModel.rupType){case'combo':editOptions=$.extend({menuWidth:$elem.width()},editOptions,{width:'100%'});break;}// Invocación al componente RUP\n$elem['rup_'+cellColModel.rupType](editOptions);/*\r\n\t\t\t\t\t\t\t\t * POST Configuración de los componentes RUP\r\n\t\t\t\t\t\t\t\t */switch(cellColModel.rupType){case'date':// TODO: Aplicarlo con estilos\n$elem.css('width','88%');break;}}}});settings.inlineEditingRow=rowId;function addNextRow(rowId,iCol){$self.on('jqGridInlineAfterSaveRow.inlineEditing.addNextRow',function(event){$self.rup_jqtable('addRow');jQuery($self.getInd($self[0].p.selrow,true)).find(':not([readonly]):focusable:first').focus();$self.off('jqGridInlineAfterSaveRow.inlineEditing.addNextRow');});$self.rup_jqtable('saveRow',rowId);return true;}function editNextRow(rowId,iCol){var idsArray,rowIndex,rowsPerPage,page,lastPage,$focusableElem;idsArray=$self.getDataIDs();rowIndex=$self.getInd(rowId)-1;rowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10);if(rowIndex===rowsPerPage-1){// Cambio de página\npage=parseInt($self.rup_jqtable('getGridParam','page'),10);lastPage=parseInt(Math.ceil($self.rup_jqtable('getGridParam','records')/$self.rup_jqtable('getGridParam','rowNum')),10);if(page<lastPage){$self.trigger('reloadGrid',[{page:page+1}]);$self.on('jqGridAfterLoadComplete.rupTable.inlineEdit',function(event,data){idsArray=$self.getDataIDs();$self.on('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected',function(event,rId){if(iCol===undefined||iCol===-1){$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td :not([readonly]):focusable:first');}else{$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td:eq('+iCol+') :not([readonly]):focusable:first');}$focusableElem.trigger('focus');$self.off('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected');});jQuery($self.getInd(idsArray[0],true)).trigger('click');$self.off('jqGridAfterLoadComplete.rupTable.inlineEdit');});return false;}}else{$self.on('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected',function(event,rId){if(iCol===undefined||iCol===-1){$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td :not([readonly]):focusable:first');}else{$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td:eq('+iCol+') :not([readonly]):focusable:first');}$focusableElem.trigger('focus');$self.off('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected');});jQuery($self.getInd(idsArray[rowIndex+1],true)).trigger('click');return false;}return true;}function editPreviousRow(rowId,iCol){var idsArray,rowIndex,page,$focusableElem;idsArray=$self.getDataIDs();rowIndex=$self.getInd(rowId)-1;if(rowIndex===0){// Cambio de página\npage=parseInt($self.rup_jqtable('getGridParam','page'),10);if(page>1){$self.trigger('reloadGrid',[{page:page-1}]);$self.on('jqGridAfterLoadComplete.rupTable.inlineEdit',function(event,data){idsArray=$self.getDataIDs();$self.on('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected',function(event,rId){if(iCol===undefined||iCol===-1){$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td :not([readonly]):focusable:last');}else{$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td:eq('+iCol+') :not([readonly]):focusable:last');}$focusableElem.trigger('focus');$self.off('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected');});jQuery($self.getInd(idsArray[idsArray.length-1],true)).trigger('click');$self.off('jqGridAfterLoadComplete.rupTable.inlineEdit');});return false;}}else{$self.on('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected',function(event,rId){if(iCol===undefined||iCol===-1){$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td :not([readonly]):focusable:last');}else{$focusableElem=jQuery($self.jqGrid('getInd',rId,true)).find('td:eq('+iCol+') :not([readonly]):focusable:last');}$focusableElem.trigger('focus');$self.off('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected');});jQuery($self.getInd(idsArray[rowIndex-1],true)).trigger('click');return false;}}// Se almacena el contenido del los campos de la línea editable\n// TODO: Externalizar la obtención de los datos para comprobar los cambios\n$self.data('initialFormData',settings.inlineEdit.$inlineForm.rup_form('formSerialize'));// Se añaden los eventos de teclado\njQuery(ind).on({'keydown':function keydown(event){if(event.keyCode===27){$self.rup_jqtable('restoreRow',$(this).attr('id'),settings.afterrestorefunc);return false;}if(event.keyCode===13){var ta=event.target;if(ta.tagName=='TEXTAREA'){return true;}$self.rup_jqtable('saveRow');return false;}}});jQuery('td',jQuery(ind)).on({'keydown':function keydown(event){var iCol,nameArray;if(event.keyCode===38){nameArray=$.map($self.rup_jqtable('getColModel'),function(elem,index){return elem.name;});iCol=jQuery.inArray($(this).attr('aria-describedby').split(settings.id+'_')[1],nameArray);editPreviousRow($(ind).attr('id'),iCol);return false;}if(event.keyCode===40){nameArray=$.map($self.rup_jqtable('getColModel'),function(elem,index){return elem.name;});iCol=jQuery.inArray($(this).attr('aria-describedby').split(settings.id+'_')[1],nameArray);editNextRow($(ind).attr('id'),iCol);return false;}}});jQuery('input,select',jQuery(ind)).on({'focus':function focus(event){//\t\t\t\t\t\t\tvar $row = $(this).parent().parent();\n//\n//\t\t\t\t\t\t\tsettings.inlineEditingRow  = $row.attr(\"id\");\n//\t\t\t\t\t\t\t$self.rup_jqtable(\"setSelection\",$row.attr(\"id\"));\n}});jQuery('input, textarea, select,a.rup_combo',jQuery(ind)).filter('.editable:visible:last').on({'keydown':function keydown(event){if(event.keyCode==9&&!event.shiftKey){if(jQuery(ind).attr('id').indexOf('jqg')!==-1){if(addNextRow(jQuery(ind).attr('id'))===false){return false;}}else{if(editNextRow(jQuery(ind).attr('id'))===false){return false;}}}}});jQuery('input, textarea, select,a.rup_combo',jQuery(ind)).filter('.editable:visible:first').on({'keydown':function keydown(event){var idsArray,rowIndex,page;if(event.keyCode==9){if(event.shiftKey){idsArray=$self.getDataIDs();rowIndex=$self.getInd(rowId)-1;if(rowIndex===0){// Cambio de página\npage=parseInt($self.rup_jqtable('getGridParam','page'),10);if(page>1){$self.trigger('reloadGrid',[{page:page-1}]);$self.on('jqGridAfterLoadComplete.rupTable.inlineEdit',function(event,data){idsArray=$self.getDataIDs();$self.on('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected',function(event,rowId){jQuery($self.jqGrid('getInd',rowId,true)).find('td :focusable:last').trigger('focus');$self.off('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected');});jQuery($self.getInd(idsArray[idsArray.length-1],true)).trigger('click');$self.off('jqGridAfterLoadComplete.rupTable.inlineEdit');});return false;}}else{$self.on('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected',function(event,rowId){jQuery($self.jqGrid('getInd',rowId,true)).find('td :focusable:last').trigger('focus');$self.off('jqGridInlineEditRow.rupTable.inlineEditing.tabKeyNav.cellSelected');});jQuery($self.getInd(idsArray[rowIndex-1],true)).trigger('click');return false;}}}}});},'jqGridDblClickRow.rupTable.inlineEdit':function jqGridDblClickRowRupTableInlineEdit(rowid,iRow,iCol,e){if(!settings.inlineEdit.autoEditRow){$self.rup_jqtable('editRow',iRow);}else{return false;}},'jqGridInlineAfterRestoreRow.inlineEditing.processRupObjects':function jqGridInlineAfterRestoreRowInlineEditingProcessRupObjects(event,rowid){var self=this,$self=$(this),json=self.p.savedRow[0];$self.rup_jqtable('restoreInlineRupFields',rowid,json);},'rupTable_beforeSaveRow.inlineEditing.processRupObjects':function rupTable_beforeSaveRowInlineEditingProcessRupObjects(event,rowid,options){var self=this,$self=$(this),$row,$cell,ruptypeObj;$(self.p.colModel).each(function(i){$row=$(self.rows.namedItem(rowid));$cell=$row.find('td:eq('+i+')');ruptypeObj=$cell.find('[ruptype]:not([autocomplete])');if(ruptypeObj.attr('ruptype')==='combo'){if($self.data('rup.jqtable.formatter')!==undefined){$self.data('rup.jqtable.formatter')[rowid][this.name]['rup_'+ruptypeObj.attr('rupType')]={'label':ruptypeObj.rup_combo('label'),'value':ruptypeObj.rup_combo('getRupValue')};}}else if(ruptypeObj.attr('ruptype')==='autocomplete'&&ruptypeObj.attr('rup_autocomplete_label')){if($self.data('rup.jqtable.formatter')!==undefined){$self.data('rup.jqtable.formatter')[rowid][this.name]['rup_'+ruptypeObj.attr('rupType')]={'label':$('[id=\"'+ruptypeObj.attr('id')+'_label\"]').val(),'value':ruptypeObj.rup_autocomplete('getRupValue')};}}});},'jqGridInlineSuccessSaveRow.rupTable.inlineEditing.processRupObjects':function jqGridInlineSuccessSaveRowRupTableInlineEditingProcessRupObjects(event,res,rowid,o){var json=jQuery.parseJSON(res.responseText),self=this,$self=$(self);$self.rup_jqtable('restoreInlineRupFields',rowid,json);return[true,json,rowid];},'jqGridBeforeSelectRow.rupTable.inlineEditing':function jqGridBeforeSelectRowRupTableInlineEditing(event,rowid,obj){var $self=$(this),settings=$self.data('settings'),editableRows=$('tr[editable=1]',$self);/*\r\n\t\t\t\t\t * Se comprueba si existen registros que estén siendo editados en línea.\r\n\t\t\t\t\t * Del mismo modo se comprueba si el registro seleccionado es diferente del que se está editando en ese momento.\r\n\t\t\t\t\t */if(editableRows.length>0&&settings.inlineEditingRow!==undefined&&settings.inlineEditingRow!==rowid){// Se comprueba si se han realizado cambios en el registro en edición\n// TODO: Utilizar un método para comprobar los cambios en el formulario\nif($self.data('initialFormData')!==settings.inlineEdit.$inlineForm.rup_form('formSerialize')){// En caso de que se hayan realizado cambios se debera de realizar el guardado de los mismos.\n// Se confiura un handler para el evento jqGridInlineSuccessSaveRow que indica que se ha completado con exito el guardado del registro modificado.\n$self.on('jqGridInlineSuccessSaveRow.inlineEditing_beforeSelectRow',function(event){// Una vez se haya realizado correctamente el guardado del registo se procede a seleccionar el registro solicitado por el usuario.\n$self.rup_jqtable('setSelection',rowid);// Se elimina el handler del evento para evitar duplicidades\n$self.off('jqGridInlineSuccessSaveRow.inlineEditing_beforeSelectRow');});// Se procede a realizar el guardado de los registros editados\nfor(var i=0;i<editableRows.length;i++){$self.rup_jqtable('saveRow',editableRows[0].id);}// Se retorna un false para deterner la selección del registro y permitir que se realice antes la gestión del guardado.\nreturn false;}}// En caso de no necesitarse guardar el registro en edición se continúa con la gestión de la selección de manera normal.\nreturn true;},'jqGridSelectRow.rupTable.inlineEditing':function jqGridSelectRowRupTableInlineEditing(event,rowid,status,obj){var $self=$(this),editableRows;editableRows=$('tr[editable=1]',$self);// En caso de que existan registros en modo edición se restauran\nif(editableRows.length>0){jQuery.each($('tr[editable=1]',$self),function(index,elem){if($(elem).attr('id')!==rowid){$self.jqGrid('restoreRow',$(elem).attr('id'));}});}if(settings.inlineEdit.autoEditRow){// Se procede a entrar en modo edición en la línea seleccionada.\n$self.rup_jqtable('editRow',rowid);}},'rupTable_checkOutOfGrid.rupTable.inlineEditing':function rupTable_checkOutOfGridRupTableInlineEditing(event,$target){var $self=$(this),settings=$self.data('settings'),operationCfg=settings.core.defaultOperations['save'];if(jQuery.proxy(operationCfg.enabled,$self)()){jQuery.proxy(operationCfg.callback,$self)($self,event);}}});if(settings.inlineEdit.autoEditRow){$self.on({'jqGridCellSelect.rupTable.inlineEditing':function jqGridCellSelectRupTableInlineEditing(event,rowid,iCol,cellcontent,obj){var $self=$(this);if(iCol!==-1){$self.on('jqGridInlineEditRow.rupTable.inlineEditing.cellSelected',function(event,rowId){jQuery($self.jqGrid('getInd',rowid,true)).find('td:eq('+iCol+') :focusable:first').trigger('focus');$self.off('jqGridInlineEditRow.rupTable.inlineEditing.cellSelected');});}}});}},/**\r\n\t * Metodo que realiza la post-configuración del plugin inlineEdit del componente RUP Table.\r\n\t * Este método se ejecuta antes de la incialización del plugin.\r\n\t *\r\n\t * @name postConfigureInlineEdit\r\n\t * @function\r\n\t * @param {object} settings - Parámetros de configuración del componente.\r\n\t */postConfigureInlineEdit:function postConfigureInlineEdit(settings){var $self=this,formId='inlineForm_'+settings.id,$inlineForm=$('<form>').attr({'id':'inlineForm_'+settings.id});// Arropamos la estructura de la tabla en un formulario para poder realizar el envío de los campos\n$self.wrap($inlineForm);// Almacenamos la referencia al formulario.\nsettings.inlineEdit.$inlineForm=$('#'+formId);settings.inlineEdit.$inlineForm.on('rupValidate_formValidationError.inlineEditing',function(event,obj){var rowid=$self.jqGrid('getGridParam','selrow');jQuery($self.getInd(rowid,true)).attr('id',settings.inlineEditingRow);$self.rup_jqtable('setSelection',settings.inlineEditingRow);});$self.on({'jqGridLoadComplete.rupTable.formEditing':function jqGridLoadCompleteRupTableFormEditing(data){var $self=$(this),settings=$self.data('settings'),nPos;if(settings.inlineEdit.autoselectFirstRecord){nPos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])();$self.rup_jqtable('highlightRowAsSelected',jQuery($self.jqGrid('getInd',nPos[1][0],true)));}}});}});/**\r\n\t * Métodos públicos del plugin inlineEdit.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * addRow(options): Muestra una nueva línea para inserción.\r\n\t * editRow(rowId, options): Activa el modo edicón en línea para un registro determinado.\r\n\t * deleteRow(rowId, options): Realiza el borrado de un registro.\r\n\t * saveRow(rowId, options): Realiza el guardado de un registo modificado mediante la edición en línea.\r\n\t * restoreRow(rowId): Restaura la línea indicada\r\n\t *\r\n\t * Las propiedades de esta extensión almacenadas en el settings son las siguientes:\r\n\t *\r\n\t * settings.$inlineForm : Referencia al formulario utilizado para enviar los datos del registro que está siendo editado.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n     * Añade una nueva línea en blanco al mantenimiento para permitir introducir los datos del nuevo registro.\r\n     *\r\n     * @function addRow\r\n\t\t * @param {object} options - Opciones de configuración de la acción de inserción.\r\n\t\t * @return {object} - Referencia jQuery a la propia tabla.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeAddRow\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"addRow\", options);\r\n     */addRow:function addRow(options){var $self=this,settings=$self.data('settings'),colModel=$self[0].p.colModel;/*\r\n\t\t\t * TODO: Ajustar el paso de parámetros\r\n\t\t\t */var auxOptions={addRowParams:$.extend({},settings.inlineEdit.addOptions,options)};// Controlar los campos editables en modo nuevo\nfor(var i=0;i<colModel.length;i++){if(colModel[i].editable===true&&colModel[i].editableOnAdd!==false){if(colModel[i].editable===true&&colModel[i].editableOnAdd===false){if(colModel[i].editoptions===undefined){colModel[i].editoptions={};}colModel[i].editoptions.readonly='readonly';}else{if(colModel[i].editoptions!==undefined&&colModel[i].editoptions.readonly!==undefined){delete colModel[i].editoptions.readonly;}}}}if($self.triggerHandler('rupTable_beforeAddRow',[auxOptions])!==false){$self.jqGrid('addRow',$.extend({},auxOptions));}return $self;},/**\r\n\t\t * Clona un registro determinado. Añade una nueva línea con el contenido del registro a partir del cual se desea clonar.\r\n     *\r\n     * @function cloneRow\r\n\t\t * @param {string} rowId -  Identificador del registro a partir del cual se desea realizar el clonado.\r\n\t\t * @param {object} options - Opciones de configuración de la acción de clonado.\r\n\t\t * @return {object} - Referencia jQuery a la propia tabla.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeCloneRow\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"cloneRow\", rowId, options);\r\n     */cloneRow:function cloneRow(rowId,options){var $self=this,settings=$self.data('settings'),selectedRow=rowId===undefined?$self.jqGrid('getGridParam','selrow'):rowId,colModel=$self[0].p.colModel,rowdata,clonedRowId;if($self.triggerHandler('rupTable_beforeCloneRow',[settings,rowId])!==false){rowdata=$self.jqGrid('getRowData',selectedRow);$self.rup_jqtable('addRow');clonedRowId=jQuery('tbody:first tr[id*=\\'jqg\\']',$self).attr('id');$self.jqGrid('setRowData',clonedRowId,rowdata);jQuery($self.jqGrid('getInd',clonedRowId,true)).attr('editable','0');// Controlar los campos editables en modo nuevo\nfor(var i=0;i<colModel.length;i++){if(colModel[i].editable===true&&colModel[i].editableOnAdd!==false){if(colModel[i].editable===true&&colModel[i].editableOnAdd===false){if(colModel[i].editoptions===undefined){colModel[i].editoptions={};}colModel[i].editoptions.readonly='readonly';}else{if(colModel[i].editoptions!==undefined&&colModel[i].editoptions.readonly!==undefined){delete colModel[i].editoptions.readonly;}}}}$self.rup_jqtable('editRow',clonedRowId,{},true);}},/**\r\n     * Pone el registro indicado en modo edición para permitir la edición de sus datos.\r\n     *\r\n     * @function editRow\r\n\t\t * @param {string} rowId - Identificador del registro que se desea editar.\r\n\t\t * @param {object} options - Opciones de configuración de la acción de modificación.\r\n\t\t * @return {object} - Referencia jQuery a la propia tabla.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeEditRow\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"editRow\", rowId, options, true);\r\n     */editRow:function editRow(rowId,options,skipFieldCheck){var $self=this,settings=$self.data('settings'),selectedRow=rowId===undefined?$self.jqGrid('getGridParam','selrow'):rowId,colModel=$self[0].p.colModel;if(skipFieldCheck!==true){// Controlar los campos editables en modo edición\nfor(var i=0;i<colModel.length;i++){if(colModel[i].editable===true&&colModel[i].editableOnEdit===false){if(colModel[i].editoptions===undefined){colModel[i].editoptions={};}colModel[i].editoptions.readonly='readonly';}else{if(colModel[i].editoptions!==undefined&&colModel[i].editoptions.readonly!==undefined){delete colModel[i].editoptions.readonly;}}}}if($self.triggerHandler('rupTable_beforeEditRow',[settings.inlineEdit.editOptions,selectedRow])!==false){$self.jqGrid('editRow',selectedRow,$.extend({},settings.inlineEdit.editOptions,options));}return $self;},/**\r\n     * Elimina el registro indicado.\r\n     *\r\n     * @function deleteRow\r\n\t\t * @param {string} rowId - Identificador del registro que se desea eliminar.\r\n\t\t * @param {object} options - Opciones de configuración de la acción de borrado..\r\n\t\t * @return {object} - Referencia jQuery a la propia tabla.\r\n\t\t * @fires module:rup_jqtable#rupTable_deleteAfterSubmit\r\n\t\t * @fires module:rup_jqtable#rupTable_deleteAfterComplete\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeDeleteRow\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"deleteRow\", rowId, options);\r\n     */deleteRow:function deleteRow(rowId,options){var $self=this,settings=$self.data('settings'),//\t\t\tdeleteOptions = jQuery.extend(true, {}, jQuery.fn.rup_jqtable.defaults.deleteOptions, options),\ndeleteOptions=jQuery.extend(true,{},settings.inlineEdit.deleteOptions,options),selectedRow=rowId===undefined?$self.rup_jqtable('getSelectedRows'):rowId;// En caso de especificarse el uso del método HTTP DELETE, se anyade el identificador como PathParameter\nif(selectedRow.length===1){if(deleteOptions.mtype==='DELETE'){deleteOptions.url=settings.baseUrl+'/'+$self.rup_jqtable('getPkUrl',selectedRow);}}else{deleteOptions.mtype='POST';deleteOptions.ajaxDelOptions.contentType='application/json';deleteOptions.ajaxDelOptions.type='POST';deleteOptions.ajaxDelOptions.dataType='json';deleteOptions.url=settings.baseUrl+'/deleteAll';deleteOptions.serializeDelData=function(ts,postData){//\t\t\t\t\t$self.rup_jqtable(\"getFilterParams\")\nreturn jQuery.toJSON({'core':{'pkToken':settings.multiplePkToken,'pkNames':settings.primaryKey},'multiselection':$self.rup_jqtable('getSelectedIds')});};}deleteOptions.afterSubmit=function(data,postd){$self.triggerHandler('rupTable_deleteAfterSubmit',[data,postd]);return[true];};deleteOptions.afterComplete=function(data,postd){$self.triggerHandler('rupTable_deleteAfterComplete',[data,postd]);};if($self.triggerHandler('rupTable_beforeDeleteRow',[deleteOptions,selectedRow])!==false){$self.jqGrid('delGridRow',selectedRow,deleteOptions);}return $self;},/**\r\n     *  Guarda el registro modificado. Se almacenan los datos introducidos en la línea en modo edición.\r\n     *\r\n     * @function saveRow\r\n\t\t * @param {string} rowId - Identificador del registro que se desea guardar.\r\n\t\t * @param {object} options - Opciones de configuración de la acción de guardado..\r\n\t\t * @return {object} - Referencia jQuery a la propia tabla.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeSaveRow\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"saveRow\", rowId, options);\r\n     */saveRow:function saveRow(rowId,options){var $self=this,settings=$self.data('settings'),selectedRow=rowId===undefined?$self.jqGrid('getGridParam','selrow'):rowId;$self.triggerHandler('rupTable_beforeSaveRow',[selectedRow,options]);if(selectedRow.indexOf('jqg')!==-1){$self[0].p.ajaxRowOptions=settings.inlineEdit.addOptions.ajaxRowOptions;$self.jqGrid('saveRow',selectedRow,settings.inlineEdit.addOptions);}else{$self[0].p.ajaxRowOptions=settings.inlineEdit.editOptions.ajaxRowOptions;$self.jqGrid('saveRow',selectedRow,settings.inlineEdit.editOptions);}return $self;},/**\r\n     * Restaura la fila indicada al estado anterior a habilitarse el modo edición.\r\n     *\r\n     * @function restoreRow\r\n\t\t * @param {string} rowId - Identificador de la línea que se desea guardar.\r\n\t\t * @param {function} afterrestorefunc - Función de callback que se ejecuta después de restaurar la fila.\r\n\t\t * @return {object} - Referencia jQuery a la propia tabla.\r\n\t\t * @fires module:rup_jqtable#rupTable_beforeRestoreRow\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"restoreRow\", rowId, function(){});\r\n     */restoreRow:function restoreRow(rowId,afterrestorefunc){var $self=this,rowToRestore=rowId===undefined?$self.jqGrid('getGridParam','selrow'):rowId;$self.triggerHandler('rupTable_beforeRestoreRow',[rowId]);$self.jqGrid('restoreRow',rowToRestore,afterrestorefunc);return $self;},/**\r\n     * Restaura los campos RUP existentes en una fila de edición en línea.\r\n     *\r\n     * @function restoreRow\r\n\t\t * @param {string} rowId - Identificador de la línea que se desea guardar.\r\n\t\t * @return {object} - Referencia jQuery a la propia tabla.\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"restoreRow\", rowId, options);\r\n     */restoreInlineRupFields:function restoreInlineRupFields(rowid){var $self=this,self=this[0],$row,$cell,val;$(self.p.colModel).each(function(i){$row=$(self.rows.namedItem(rowid));var $tempRowId=$self.data('settings').inlineEditingRow;$cell=$row.find('td:eq('+i+')');//ruptypeObj = $cell.find(\"[ruptype]\");\n//\t\t\t\truptypeObj = this.editoptions.ruptype;\nif(this.rupType){if(this.rupType==='combo'){if($self.data('rup.jqtable.formatter')!==undefined){val=$self.data('rup.jqtable.formatter')[$tempRowId][this.name]['rup_'+this.rupType]['label'];$cell.html(val);}}else if(this.rupType==='autocomplete'){if($self.data('rup.jqtable.formatter')!==undefined){val=$self.data('rup.jqtable.formatter')[$tempRowId][this.name]['rup_'+this.rupType]['label'];$cell.html(val);}}}});return $self;}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t * Parametros de configuración de los settings para el caso particular de configuración del componente en el caso de funcionar en modo edición en linea.\r\n\t *\r\n\t * Los métodos para los que se proporciona una implementación son los siguientes.\r\n\t *\r\n\t * beforeSelectRow:\r\n\t * onCellSelect:\r\n\t * onSelectRow:\r\n\t */ /**\r\n\t* @description Propiedades de configuración del plugin inlineEdit del componente RUP Table.\r\n\t* @see Las posibles propiedades que se pueden indicar en cada una de las siguientes propiedades, se especifican con más detalle en la documentación del plugin subyacente jqGrid.\r\n\t* @name options\r\n\t*\r\n\t* @property {object} [addEditOptions] - Propiedades de configuración comunes a las acciones de edición e inserciónde un registro.\r\n\t* @property {object} [addOptions] - Propiedades de configuración exclusivas de la acción de inserción de un registro. Sobrescriben las indicadas en la propiedad addEditOptions.\r\n\t* @property {object} [editOptions] - Propiedades de configuración exclusivas de la acción de edición de un registro. Sobrescriben las indicadas en la propiedad addEditOptions.\r\n\t* @property {object} [deleteOptions] - Propiedades de configuración de la acción de borrado de un registro.\r\n\t*/jQuery.fn.rup_jqtable.plugins.inlineEdit={};jQuery.fn.rup_jqtable.plugins.inlineEdit.defaults={toolbar:{defaultButtons:{add:true,edit:true,cancel:true,save:true,clone:true,'delete':true,filter:false}},contextMenu:{defaultRowOperations:{add:true,edit:true,cancel:true,save:true,clone:true,'delete':true,filter:false}},inlineEdit:{autoselectFirstRecord:true,autoEditRow:false},formEdit:{}};// Parámetros de configruación comunes para las acciónes de añadir y editar un registro\njQuery.fn.rup_jqtable.plugins.inlineEdit.defaults.inlineEdit.addEditOptions={contentType:'application/json',type:'PUT',dataType:'json',ajaxRowOptions:{contentType:'application/json',dataType:'json',processData:false}};// Parámetros de configruación específicos para la acción de añadir un registro\njQuery.fn.rup_jqtable.plugins.inlineEdit.defaults.inlineEdit.addOptions={mtype:'POST',ajaxRowOptions:{type:'POST'}};// Parámetros de configruación específicos para la acción de editar un registro\njQuery.fn.rup_jqtable.plugins.inlineEdit.defaults.inlineEdit.editOptions={mtype:'PUT',ajaxRowOptions:{type:'PUT'}};// Parámetros de configruación específicos para la acción de eliminar un registro\njQuery.fn.rup_jqtable.plugins.inlineEdit.defaults.inlineEdit.deleteOptions={bSubmit:jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_message.aceptar'),cancelicon:[false,'left','icono_cancelar'],delicon:[false],linkStyleButtons:['#eData'],msg:'<div id=\"rup_msgDIV_msg_icon\" class=\"rup-message_icon-confirm\"></div><div id=\"rup_msgDIV_msg\" class=\"rup-message_msg-confirm white-space-normal\">'+jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.deleteAll')+'</div>',mtype:'DELETE',width:320,reloadAfterSubmit:false,resize:false};/**\r\n\t * Extensión de las propiedades por defecto del jqGrid para el modo de edición en línea\r\n\t */jQuery.jgrid.inlineEdit={keys:false};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n\t*  Evento que se lanza justo antes de procesarse la petición de borrado de un registro. En caso de devolver false se detiene la ejecución del borrado.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeDeleteRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} deleteOptions - Opciones de configuración de la operación de borrado.\r\n\t* @property {string} selectedRow - Identificador de la fila que se desea eliminar.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeDeleteRow\", function(event, deleteOptions, selectedRow){ });\r\n\t*/ /**\r\n\t*  Evento que se lanza justo antes de procesarse la petición de edición de un registro. En caso de devolver false se detiene la ejecución del borrado.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeEditRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} editOptions - Opciones de configuración de la operación de edición.\r\n\t* @property {string} selectedRow - Identificador de la fila que se desea editar.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeEditRow\", function(event, editOptions, selectedRow){ });\r\n\t*/ /**\r\n\t*  Evento que se lanza justo después de realizarse la petición de borrado de un registro.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_deleteAfterSubmit\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_deleteAfterSubmit\", function(event){ });\r\n\t*/ /**\r\n\t*  Evento lanzado antes de ejecutarse el método de inserción de un registro. En caso de retornar false se cancelará la inserción.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeAddRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} addOptions -  Opciones de configuración de la acción de insertar un elemento.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeAddRow\", function(event, addOptions){ });\r\n\t*/ /**\r\n\t*  Evento lanzado antes de ejecutarse el método de clonado de un registro. En caso de retornar false se cancelará el clonado.\r\n\t*\r\n\t* @event module:rup_jqtable#rupTable_beforeCloneRow\r\n\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t* @property {object} cloneOptions - Opciones de configuración de la operación de clonado.\r\n\t* @property {string} selectedRow - Identificador de la fila que se desea clonar.\r\n\t* @example\r\n\t* $(\"#idComponente\").on(\"rupTable_beforeCloneRow\", function(event, cloneOptions, selectedRow){ });\r\n\t*/})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Permite realizar una selección múltiple de los registros que se muestran en la tabla.\r\n *\r\n * @summary Plugin de multiselection del componente RUP Table.\r\n * @module rup_jqtable/multiselection\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"multiselection\"],\r\n * \tmultiselection:{\r\n * \t\t// Propiedades de configuración del plugin multiselection\r\n * \t}\r\n * });\r\n */(function($){/**\r\n   * Definición de los métodos principales que configuran la inicialización del plugin.\r\n   *\r\n   * preConfiguration: Método que se ejecuta antes de la invocación del componente jqGrid.\r\n   * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n   *\r\n   */jQuery.rup_jqtable.registerPlugin('multiselection',{loadOrder:8,preConfiguration:function preConfiguration(settings){var $self=this;$self.rup_jqtable('preConfigureMultiselection',settings);},postConfiguration:function postConfiguration(settings){var $self=this;if(settings.multiselect===true){$self.rup_jqtable('postConfigureMultiselection',settings);}}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n   * Extensión del componente rup_jqtable para permitir la gestión de la multiselección.\r\n   *\r\n   * Los métodos implementados son:\r\n   *\r\n   * preConfigureMultiselection(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n   * postConfigureMultiselection(settings): Método que define la postconfiguración necesaria para el correcto funcionamiento del componente.\r\n   *\r\n   */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin multiselection del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigureMultiselection\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigureMultiselection:function preConfigureMultiselection(settings){var $self=this;// Añadimos la columna por defecto para mostrar la información del registro en edición\n//\t\t\tsettings.colNames = jQuery.merge([\"\"], settings.colNames);\n//\t\t\tsettings.colModel = jQuery.merge([settings.multiselection.defaultEditableInfoCol], settings.colModel);\n// Se configura la propiedad multiselecta true para que el plugin subyacente se configure en modo multiseleccion\nsettings.multiselect=true;settings.multiselectWidth=40;//\n//\t\t\tsettings.ondblClickRow=function(){\n//\t\t\t\treturn false;\n//\t\t\t};\n$.extend(true,settings.core.operations,{clone:{enabled:function enabled(){return settings.multiselection.numSelected===1;}}});settings.getActiveLineId=function(){var $self=this,settings=$self.data('settings'),npos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])();return jQuery.inArray(settings.multiselection.rowForEditing,npos[1]);};settings.getActiveRowId=function(){var $self=this,settings=$self.data('settings');return settings.multiselection.rowForEditing;};settings.getSelectedRows=function(){var $self=this,settings=$self.data('settings');if(settings.multiselection.selectedAll!==true){return settings.multiselection.selectedIds;}else{return settings.multiselection.deselectedIds;}};settings.getSelectedLines=function(){var $self=this,settings=$self.data('settings'),page=parseInt($self.rup_jqtable('getGridParam','page'),10);if(settings.multiselection.selectedAll!==true){return settings.multiselection.selectedLinesPerPage[page];}else{return settings.multiselection.deselectedLinesPerPage[page];}};/*\r\n       * Definición del método serializeGridData para que añada al postData la información relativa a la multiseleccion.\r\n       */$self.on({'rupTable_serializeGridData.multiselection':function rupTable_serializeGridDataMultiselection(events,postData){var multiselectionObj={},tmpLastSearch;function getLastSearchStr(postData){return postData.rows+postData.sidx+postData.sord+postData.filter!==undefined?jQuery.param(jQuery.extend({},postData.filter,{rows:postData.rows,sidx:postData.sidx,sord:postData.sord})):'';}tmpLastSearch=$self.data('tmp.lastSearch');if(tmpLastSearch!==undefined&&tmpLastSearch!==getLastSearchStr(postData)){if(settings&&settings.multiselection&&settings.multiselection.numSelected>0){multiselectionObj=$self.rup_jqtable('getSelectedIds');jQuery.extend(true,postData,{'multiselection':multiselectionObj});}}$self.data('tmp.lastSearch',getLastSearchStr(postData));},'rupTable_setSelection.multiselection':function rupTable_setSelectionMultiselection(events,selectedRows,status,reorderSelection){var page=parseInt($self.rup_jqtable('getGridParam','page'),10);if(Array.isArray(selectedRows)){for(var i=0;i<selectedRows.length;i++){$self._processSelectedRow(settings,selectedRows[i],status);}}else{$self._processSelectedRow(settings,selectedRows,status);}// En caso de que se solicite la reordenación de los identificadores seleccionados\nif(reorderSelection===true){$self.on('rupTable_serializeGridData.multiselection.reorderSelection',function(events,postData){$self.off('rupTable_serializeGridData.multiselection.reorderSelection');jQuery.extend(true,postData,{'multiselection':$self.rup_jqtable('getSelectedIds')});});}$self.triggerHandler('rupTable_multiselectionUpdated');$self.triggerHandler('jqGridSelectRow.rupTable.multiselection',[selectedRows,status]);return false;}});},/**\r\n\t\t* Metodo que realiza la post-configuración del plugin multiselection del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name postConfigureMultiselection\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/postConfigureMultiselection:function postConfigureMultiselection(settings){var $self=this;// Inicialización de las propiedades asociadas a la gestión de los registros seleccionados\n$self._initializeMultiselectionProps(settings);// Se almacena la referencia del check de (de)seleccionar todos los registros\nsettings.$selectAllCheck=jQuery('#cb_'+settings.id);settings.fncHasSelectedElements=function(){return settings.multiselection.numSelected>0;};settings.getRowForEditing=function(){var $self=this,settings=$self.data('settings'),page=parseInt($self.rup_jqtable('getGridParam','page'),10),nPos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),index,retNavParams;if($self._hasPageSelectedElements(page)){if(settings.multiselection.rowForEditing!==undefined){return settings.multiselection.rowForEditing;}index=$self._getSelectedLinesOfPage(page)[0];return nPos[1][index-1];}else{retNavParams=jQuery.proxy(settings.fncGetNavigationParams,$self)('first');execute=retNavParams[1];newPage=retNavParams[5];newPageIndex=retNavParams[6];if(execute){$self.trigger('reloadGrid',[{page:newPage}]);$self.on('jqGridAfterLoadComplete.multiselection.editRow',function(event,data){var nextPagePos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),//newIndexPos = nextPagePos[1][$self._getSelectedLinesOfPage(newPage)[0]-1];\nnewIndexPos=$self.getActiveRowId();$self.jqGrid('editGridRow',newIndexPos,settings.editOptions);$self.off('jqGridAfterLoadComplete.multiselection.editRow');});}return false;}};settings.getDetailTotalRowCount=function(){var $self=this,settings=$self.data('settings');return settings.multiselection.numSelected;};settings.getDetailCurrentRowCount=function(){var $self=this,settings=$self.data('settings'),page=parseInt($self.rup_jqtable('getGridParam','page'),10),currentRow=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),rowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10),selectedPagesArrayIndex,tmpSelectedPage,cont=0;// Comprobamos si se han seleccionado todos los registros de la tabla\nif(!settings.multiselection.selectedAll){// En caso de que no se hayan seleccionado\n// Se obtiene el indice de la página actual dentro del array de páginas deseleccionadas para\nselectedPagesArrayIndex=jQuery.inArray(page,settings.multiselection.selectedPages);tmpSelectedPage=settings.multiselection.selectedPages[selectedPagesArrayIndex];for(var i=1;i<tmpSelectedPage;i++){if(settings.multiselection.selectedLinesPerPage[i]!==undefined){cont+=settings.multiselection.selectedLinesPerPage[i].length;}}cont+=jQuery.inArray(currentRow[0]+1,settings.multiselection.selectedLinesPerPage[tmpSelectedPage])+1;}else{cont=page>1?(page-1-settings.multiselection.deselectedPages.length)*rowsPerPage:0;for(var i=0;i<settings.multiselection.deselectedPages.length&&settings.multiselection.deselectedPages[i]!==page;i++){cont+=rowsPerPage-settings.multiselection.deselectedLinesPerPage[settings.multiselection.deselectedPages[i]].length;}cont+=jQuery.inArray(currentRow[0]+1,$self._getSelectedLinesOfPage(page))+1;}return cont;};settings.fncGetNavigationParams=function getNavigationParams_multiselection(linkType){var $self=this,settings=$self.data('settings'),execute=false,changePage=false,index=0,newPageIndex=0,npos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),page=parseInt($self.rup_jqtable('getGridParam','page'),10),newPage=page,lastPage=parseInt(Math.ceil($self.rup_jqtable('getGridParam','records')/$self.rup_jqtable('getGridParam','rowNum')),10),currentArrayIndex,selectedLines;npos[0]=parseInt(npos[0],10);$('#'+settings.formEdit.feedbackId,settings.formEdit.$detailForm).hide();switch(linkType){case'first':// Navegar al primer elemento seleccionado\nexecute=true;// Si no se han seleccionado todos los elementos\nif(!settings.multiselection.selectedAll){// Se comprueba si la página en la que nos encontramos es la primera en la que se han seleccionado registros\nif(settings.multiselection.selectedPages[0]!==page){// Marcamos el flag changePage para indicar que se debe de realizar una paginación\nchangePage=true;// La nueva página será la primera página en la que se ha realizado una selección de registros\nnewPage=settings.multiselection.selectedPages[0];}}else{// En el caso de que se hayan seleccionado todos los elementos de la tabla\n// Recorremos las páginas buscando la primera en la que existan elementos seleccionados\nfor(var pageAux=1;pageAux<=lastPage;pageAux++){if($self._hasPageSelectedElements(pageAux)){if(pageAux!==page){newPage=pageAux;changePage=true;}break;}}}// Recuperamos el primer registro seleccionado del la página\nindex=$self._getFirstSelectedElementOfPage(newPage);newPageIndex=index;break;case'prev':// Navegar al anterior elemento seleccionado\nexecute=true;// Obtenemos un array con los index de los registros seleccionados en la página actual\nselectedLines=$self._getSelectedLinesOfPage(page);// Obtenemos la posición que ocupa el elemento actual en el array de seleccionados\ncurrentArrayIndex=jQuery.inArray(npos[0]+1,selectedLines);// Se comprueba si ocupa el lugar del primer elemento seleccionado\nif(currentArrayIndex===0){// En caso de tratarse del primer elemento seleccionado de la página, se deberá de realizar una navegación a la página anterior que disponga de elementos seleccionados\nchangePage=true;// Recorremos las páginas anteriores\nfor(var pageAux=page-1;pageAux>=0;pageAux--){// En caso de que la página disponga de elementos selecciondados.\nif($self._hasPageSelectedElements(pageAux)){newPage=pageAux;// Obtenemos los identificadores de los registros seleccionados de la nueva página\nselectedLines=$self._getSelectedLinesOfPage(pageAux);// Obtenemos el último registro seleccionado\nindex=selectedLines[selectedLines.length-1];break;}}}else{// En caso de no tratarse del último elemento de la página, recuperamos el elemento anterior que haya sido seleccionado también\nindex=selectedLines[currentArrayIndex-1];}newPageIndex=index;break;case'next':// Navegar al siguiente elemento seleccionado\nexecute=true;// Obtenemos un array con los index de los registros seleccionados en la página actual\nselectedLines=$self._getSelectedLinesOfPage(page);// Obtenemos la posición que ocupa el elemento actual en el array de seleccionados\ncurrentArrayIndex=jQuery.inArray(npos[0]+1,selectedLines);// Se comprueba si ocupa el lugar del último elemento seleccionado\nif(currentArrayIndex===selectedLines.length-1){// En caso de tratarse del último elemento seleccionado de la página, se deberá de realizar una navegación a la página siguiente que disponga de elementos seleccionados\nchangePage=true;// Recorremos las páginas siguientes\nfor(var pageAux=page+1;pageAux<=lastPage;pageAux++){// En caso de que la página disponga de elementos selecciondados.\nif($self._hasPageSelectedElements(pageAux)){newPage=pageAux;// Obtenemos los identificadores de los registros seleccionados de la nueva página\nselectedLines=$self._getSelectedLinesOfPage(pageAux);// Obtenemos el primer registro seleccionado\nindex=selectedLines[0];break;}}}else{// En caso de no tratarse del último elemento de la página, recuperamos el elemento anterior que haya sido seleccionado también\nindex=selectedLines[currentArrayIndex+1];}newPageIndex=index;break;case'last':// Navegar al ultimo elemento seleccionado\nexecute=true;// Si no se han seleccionado todos los elementos\nif(!settings.multiselection.selectedAll){// Se comprueba si la página en la que nos encontramos es la primera en la que se han seleccionado registros\nif(settings.multiselection.selectedPages[settings.multiselection.selectedPages.length-1]!==page){// Marcamos el flag changePage para indicar que se debe de realizar una paginación\nchangePage=true;// La nueva página será la primera página en la que se ha realizado una selección de registros\nnewPage=settings.multiselection.selectedPages[settings.multiselection.selectedPages.length-1];}}else{// En el caso de que se hayan seleccionado todos los elementos de la tabla\n// Recorremos las páginas buscando la primera en la que existan elementos seleccionados\nfor(var pageAux=lastPage;pageAux>0;pageAux--){if($self._hasPageSelectedElements(pageAux)){if(pageAux!==page){newPage=pageAux;changePage=true;}break;}}}selectedLines=$self._getSelectedLinesOfPage(newPage);// Recuperamos el último registro seleccionado del la página\nindex=selectedLines[selectedLines.length-1];newPageIndex=index;}return[linkType,execute,changePage,index-1,npos,newPage,newPageIndex-1];};settings.doNavigation=function(arrParams,execute,changePage,index,npos,newPage,newPageIndex){var $self=this,settings=$self.data('settings'),props=rp_ge[$self.attr('id')],linkType,execute,changePage,index,npos,newPage,newPageIndex,fncAfterclickPgButtons;if(Array.isArray(arrParams)){linkType=arrParams[0];execute=arrParams[1];changePage=arrParams[2];index=arrParams[3];npos=arrParams[4];newPage=arrParams[5];newPageIndex=arrParams[6];if(execute){$self.rup_jqtable('hideFormErrors',settings.formEdit.$detailForm);$self.triggerHandler('jqGridAddEditClickPgButtons',[linkType,settings.formEdit.$detailForm,npos[1][npos[index]]]);if(changePage){$self.trigger('reloadGrid',[{page:newPage}]);$self.on('jqGridAfterLoadComplete.pagination',function(event,data){var nextPagePos=jQuery.proxy(jQuery.jgrid.getCurrPos,$self[0])(),newIndexPos=nextPagePos[1][newPageIndex];//\t\t\t\t\t\t\t\t$self.jqGrid(\"setSelection\", nextPagePos[1][newIndexPos]);\njQuery.proxy(jQuery.jgrid.fillData,$self[0])(newIndexPos,$self[0],settings.formEdit.$detailForm.attr('id'),settings.opermode);jQuery.proxy(jQuery.jgrid.updateNav,$self[0])();//\t\t\t\t\t\t\t\t$self.find(\"td[aria-describedby='\"+settings.id+\"_infoEditable'] img.ui-icon.ui-icon-pencil\").remove();\nsettings.multiselection.rowForEditing=newIndexPos;$self.rup_jqtable('clearHighlightedEditableRows');$self.rup_jqtable('highlightEditableRow',$self.jqGrid('getInd',newIndexPos,true));//\t\t\t\t\t\t\t\t$($self.jqGrid(\"getInd\",newIndexPos, true)).find(\"td[aria-describedby='\"+settings.id+\"_infoEditable']\").html($(\"<img/>\").addClass(\"ui-icon ui-icon-pencil\")[0]);\n$self.off('jqGridAfterLoadComplete.pagination');});}else{jQuery.proxy(jQuery.jgrid.fillData,$self[0])(npos[1][index],$self[0],settings.formEdit.$detailForm.attr('id'),settings.opermode);//\t\t\t\t\t\t\t$self.jqGrid(\"setSelection\", npos[1][index]);\njQuery.proxy(jQuery.jgrid.updateNav,$self[0])();//\t\t\t\t\t\t\t$self.find(\"td[aria-describedby='\"+settings.id+\"_infoEditable'] img.ui-icon.ui-icon-pencil\").remove();\nsettings.multiselection.rowForEditing=npos[1][index];$self.rup_jqtable('clearHighlightedEditableRows');$self.rup_jqtable('highlightEditableRow',$self.jqGrid('getInd',npos[1][index],true));//\t\t\t\t\t\t\t$($self.jqGrid(\"getInd\",npos[1][index], true)).find(\"td[aria-describedby='\"+settings.id+\"_infoEditable']\").html($(\"<img/>\").addClass(\"ui-icon ui-icon-pencil\")[0]);\n}$self.triggerHandler('jqGridAddEditAfterClickPgButtons',[linkType,settings.formEdit.$detailForm,npos[1][npos[index]]]);fncAfterclickPgButtons=props!==undefined?props.afterclickPgButtons:settings.afterclickPgButtons;if(jQuery.isFunction(fncAfterclickPgButtons)){props.fncAfterclickPgButtons.call($self,linkType,settings.formEdit.$detailForm,npos[1][npos[index]]);}}}};// Configuracion de los handler de los eventos\n$self.on({/*\r\n         * Capturador del evento jqGridSelectRow.\r\n         * Se ejecuta cuando se selecciona una fila.\r\n         * Realiza la gestión interna sobre la acción de (de)selección del usuario.\r\n         *\r\n         * \tevent: Objeto event.\r\n         * \tid: Identificador de la línea.\r\n         *  status: true en caso de selección, false en caso de deselección.\r\n         *  obj: Objeto interno del jqGrid.\r\n         */'jqGridSelectRow.rupTable.multiselection':function jqGridSelectRowRupTableMultiselection(event,id,status,obj){var page,firstSelectedId,firstSelectedLine,activeLineId,selectedLineId,toLine,fromLine,idsArr;if(obj!==false){if(obj!==undefined&&jQuery(obj.target).hasClass('treeclick')){return false;}if(jQuery.rup.isCtrlPressed()===true||jQuery.rup.isShiftPressed()===true){window.getSelection().removeAllRanges();}if(!(jQuery.rup.isCtrlPressed()||jQuery.rup.isShiftPressed())&&settings.multiboxonly===true&&obj!==undefined&&!(obj.originalEvent!==undefined&&jQuery(obj.originalEvent.target).is(':checkbox')&&jQuery(obj.originalEvent.target).attr('id').indexOf('jqg_')!==-1)){$self.rup_jqtable('deselectRemainingRows');}// Shift presed\nif(jQuery.rup.isShiftPressed()===true){selectedLineId=$self.jqGrid('getInd',id,false);activeLineId=$self.rup_jqtable('getActiveLineId');if(activeLineId<selectedLineId){toLine=selectedLineId-1;fromLine=activeLineId+1;}else{toLine=activeLineId;fromLine=selectedLineId;}idsArr=$self.jqGrid('getDataIDs');for(var i=fromLine;i<toLine;i++){$self._processSelectedRow(settings,idsArr[i],status);$self.rup_jqtable('highlightRowAsSelected',jQuery($self.jqGrid('getInd',idsArr[i],true)));}}// Se gestiona la selección o deselección del registro indicado\n$self._processSelectedRow(settings,id,status);// Actualización del número de registros seleccionados\n$self.rup_jqtable('updateSelectedRowNumber');// Se cierra el feedback para (de)seleccionar el resto de registros\n$self.trigger('rupTable_feedbackClose',settings.$internalFeedback);// Se gestiona el icono de linea editable\n$self.rup_jqtable('clearHighlightedEditableRows');//\t\t\t\t\t\t$self.find(\"td[aria-describedby='\"+settings.id+\"_infoEditable'] img.ui-icon.ui-icon-pencil\").remove();\nif(status){settings.multiselection.rowForEditing=id;$self.rup_jqtable('highlightEditableRow',$self.jqGrid('getInd',id,true));//\t\t\t\t\t\t\t$($self.jqGrid(\"getInd\",id, true)).find(\"td[aria-describedby='\"+settings.id+\"_infoEditable']\").html($(\"<img/>\").addClass(\"ui-icon ui-icon-pencil\")[0]);\n}else{page=parseInt($self.rup_jqtable('getGridParam','page'),10);if($self._hasPageSelectedElements(page)){$self.rup_jqtable('highlightFirstEditableRow');//\t\t\t\t\t\t\t\tfirstSelectedLine = $self._getFirstSelectedElementOfPage(page);\n//\t\t\t\t\t\t\t\tfirstSelectedId = $self.jqGrid(\"getDataIDs\")[firstSelectedLine-1];\n//\t\t\t\t\t\t\t\tsettings.multiselection.rowForEditing=firstSelectedId;\n//\t\t\t\t\t\t\t\t$self.rup_jqtable(\"highlightEditableRow\", $self.jqGrid(\"getInd\",firstSelectedId, true));\n}}}},'jqGridDblClickRow.rupTable.multiselection':function jqGridDblClickRowRupTableMultiselection(event,rowid,iRow,iCol,e){$self.rup_jqtable('setSelection',rowid,true);$self.rup_jqtable('clearHighlightedEditableRows');$self.rup_jqtable('highlightEditableRow',$self.jqGrid('getInd',rowid,true));},'jqGridGridComplete.rup_jqtable.multiselection':function jqGridGridCompleteRup_jqtableMultiselection(event){var $self=$(this),settings=$self.data('settings');if($self.rup_jqtable('getGridParam','records')===0){jQuery(jQuery('#cb_'+$self.attr('id'),settings.core.$tableDiv)[0]).attr('disabled','disabled');}else{jQuery(jQuery('#cb_'+$self.attr('id'),settings.core.$tableDiv)[0]).removeAttr('disabled');}},/*\r\n         * Capturador del evento jqGridLoadComplete.\r\n         * Se ejecuta una vez se haya completado la carga de la tabla.\r\n         *\r\n         * \tdata: Objeto que contiene la carga de la tabla.\r\n         *\r\n         */'jqGridLoadComplete.rupTable.multiselection':function jqGridLoadCompleteRupTableMultiselection(data,xhr){var self=$self[0],internalProps=self.p,page=$self.rup_jqtable('getGridParam','page'),rowNum=$self.rup_jqtable('getGridParam','rowNum'),rows,selectedRows=settings.multiselection.selectedRowsPerPage[page],deselectedRows=settings.multiselection.deselectedRowsPerPage[page]||[],reorderedRow,reorderedRowPage,reorderedRowLine,reorderedRowId,arrayAuxRowsPerPage,arrayAuxLinesPerPage,arrayAuxIds,arrayAuxRows,arrayAuxPages,firstSelectedLine,firstSelectedId,indexAux,idAux;/*\r\n           * REORDENAR LA SELECCION\r\n           */if(xhr.reorderedSelection!==undefined&&xhr.reorderedSelection!==null){$self._initializeMultiselectionProps(settings);settings.multiselection.selectedAll=xhr.selectedAll;if(settings.multiselection.selectedAll===true){arrayAuxRowsPerPage=settings.multiselection.deselectedRowsPerPage;arrayAuxLinesPerPage=settings.multiselection.deselectedLinesPerPage;arrayAuxIds=settings.multiselection.deselectedIds;arrayAuxRows=settings.multiselection.deselectedRows;arrayAuxPages=settings.multiselection.deselectedPages;settings.multiselection.numSelected=xhr.records-xhr.reorderedSelection.length;}else{arrayAuxRowsPerPage=settings.multiselection.selectedRowsPerPage;arrayAuxLinesPerPage=settings.multiselection.selectedLinesPerPage;arrayAuxIds=settings.multiselection.selectedIds;arrayAuxRows=settings.multiselection.selectedRows;arrayAuxPages=settings.multiselection.selectedPages;settings.multiselection.numSelected=xhr.reorderedSelection.length;}for(var i=0;i<xhr.reorderedSelection.length;i++){reorderedRow=xhr.reorderedSelection[i];reorderedRowPage=reorderedRow.page;reorderedRowLine=reorderedRow.pageLine;var retValue='';for(var j=0;j<settings.primaryKey.length;j++){retValue+=reorderedRow.pk[settings.primaryKey[j]]+settings.multiplePkToken;}reorderedRowId=retValue.substr(0,retValue.length-1);if(arrayAuxRowsPerPage[reorderedRowPage]===undefined){arrayAuxRowsPerPage[reorderedRowPage]=[];arrayAuxLinesPerPage[reorderedRowPage]=[];}// Se almacena el Id del registro seleccionado\nif(jQuery.inArray(reorderedRowId,arrayAuxIds)===-1){arrayAuxIds.push(reorderedRowId);arrayAuxRows.push({id:reorderedRowId,page:reorderedRowPage});//\t\t\t\t\t\t\t\tarrayAuxRowsPerPage[reorderedRowPage].splice(reorderedRowLine,0,reorderedRowId);\narrayAuxRowsPerPage[reorderedRowPage].push(reorderedRowId);arrayAuxLinesPerPage[reorderedRowPage].push(reorderedRowLine);if(arrayAuxRowsPerPage[reorderedRowPage].length>0&&jQuery.inArray(reorderedRowPage,arrayAuxPages)===-1){jQuery.rup_utils.insertSorted(arrayAuxPages,reorderedRowPage);}}}//\t\t\t\t\t\t$self.rup_jqtable(\"updateSelectedRowNumber\");\n}// Se genera el evento que indica la modificación de los elementos seleccionados.\n$self.triggerHandler('rupTable_multiselectionUpdated');// Se cierra el feedback para seleccionar/deseleccionar el resto de registros\n$self.trigger('rupTable_feedbackClose',settings.$internalFeedback);// Se gestiona el icono de linea editable\nif($self._hasPageSelectedElements(page)){if(settings.multiselection.rowForEditing!==undefined&&jQuery.inArray(settings.multiselection.rowForEditing,$self.jqGrid('getDataIDs'))!==-1){$self.rup_jqtable('highlightEditableRow',jQuery($self.jqGrid('getInd',settings.multiselection.rowForEditing,true)),true);}else{$self.rup_jqtable('highlightFirstEditableRow');}//\t\t\t\t\t\tfirstSelectedLine = $self._getFirstSelectedElementOfPage(page);\n//\t\t\t\t\t\tfirstSelectedId = $self.jqGrid(\"getDataIDs\")[firstSelectedLine-1];\n//\t\t\t\t\t\tsettings.multiselection.rowForEditing=firstSelectedId;\n//\t\t\t\t\t\t$self.rup_jqtable(\"highlightEditableRow\", $self.jqGrid(\"getInd\",firstSelectedId, true));\n}/**\r\n           * ARROW\r\n           */ //Cabecera\nvar $checkAllTH=jQuery('[id=\\''+settings.id+'_cb\\']');if(settings.multiselection.headerContextMenu_enabled&&$checkAllTH.find('a').length===0){//Añadir solo una vez\n$checkAllTH.find('input').css('margin-right','1em');$self._addArrow($checkAllTH.find('input'));}//Fila\n$self.find('.cbox').css('margin-right','1em');if(settings.multiselection.rowContextMenu_enabled){var isJerarquia=settings.jerarquia!==undefined?true:false,defaultOptions=jQuery.isEmptyObject(settings.multiselection.rowContextMenu.items);//Recorrer todas las filas\n$.each($self.find('.cbox'),function(index,value){//Añadir flecha\n$self._addArrow(jQuery(value));//Deshabilitar flecha: Jerarquía + solo opciones por defecto + no tiene hijos\nif(isJerarquia&&defaultOptions&&$(value).parents('tr').find('.treeclick').hasClass('tree-leaf')){jQuery(this).next('a').addClass('ui-state-disabled').off('click');}});}},/*\r\n         * Capturador del evento jqGridSelectAll.\r\n         * Se ejecuta cuando se realice una selección de todos los elementos de la página.\r\n         *\r\n         * \tevent: Objeto event de jQuery\r\n         *  selectedRows: Array con los identificadores de los registros seleccionados en la página\r\n         *  status: true en caso de selección, false en caso de deselección.\r\n         */'jqGridSelectAll.rupTable.multiselection':function jqGridSelectAllRupTableMultiselection(event,selectedRows,status){var page=$self.rup_jqtable('getGridParam','page'),selectMsg,deselectMsg,elementosRestantes,selectRestMsg,remainingSelectButton,remainingDeselectButton,cont;// Se oculta el posible mensaje de feedback que se muestre\n$self.triggerHandler('rupTable_internalFeedbackClose');// Se gestiona la selección de todos los registros de la página\ncont=0;for(var i=0;i<selectedRows.length;i++){if(selectedRows[i].indexOf(settings.id+'ghead_')===-1){$self._processSelectedRow(settings,selectedRows[i],status);cont++;}}selectMsg=jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.selectMsg','<b>'+cont+'</b>','<b>'+page+'</b>');deselectMsg=jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.deselectMsg','<b>'+cont+'</b>','<b>'+page+'</b>');// Se comprueba el valor de status para determinar si se está seleccionando (true) o deseleccionando (false) todos los registos de la página\nif(status){// Se obtienen el número de registros restantes que quedan por seleccionar\nelementosRestantes=$self._getRemainingRecordNum(settings,selectedRows);if(elementosRestantes!==0){// En caso de existir registros sin seleccionar se muestra el mensaje junto con un botón para permitir la selecón de dichos elementos\nselectRestMsg=jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.selectRestMsg',elementosRestantes);remainingSelectButton=jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.templates.multiselection.selectRemainingRecords',$self[0].id,selectRestMsg,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.selectAll'));$self.trigger('rupTable_feedbackShow',[settings.$internalFeedback,selectMsg+remainingSelectButton,'alert']);}else{// Si no hay elementos restantes por seleccionar se muestra solo un mensaje informativo\n$self.trigger('rupTable_feedbackShow',[settings.$internalFeedback,selectMsg,'alert']);}// Se asocia el handler al evento click del botón de seleccionar el resto de registros\n$('#rup_jqtable_'+$self[0].id+'_selectAll').on('click',function(event){$self.rup_jqtable('selectRemainingRows');});$self.rup_jqtable('highlightFirstEditableRow');}else{$self.rup_jqtable('clearHighlightedEditableRows');// En caso de existir elementos seleccionados se muestra un mensaje que incluye un botón para permitir la deselección del todos los elementos seleccionados\nif(settings.multiselection.numSelected>0){selectRestMsg=jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.deselectRestMsg',settings.multiselection.numSelected);remainingDeselectButton=jQuery.rup.i18nTemplate(jQuery.rup.i18n.base,'rup_jqtable.templates.multiselection.deselectRemainingRecords',$self[0].id,selectRestMsg,jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.deSelectAll'));$self.trigger('rupTable_feedbackShow',[settings.$internalFeedback,deselectMsg+remainingDeselectButton,'alert']);}else{// Si no hay elementos restantes por deseleccionar se muestra solo un mensaje informativo\n$self.trigger('rupTable_feedbackShow',[settings.$internalFeedback,deselectMsg,'alert']);}// Se asocia el handler al evento click del botón de deseleccionar el resto de registros\n$('#rup_jqtable_'+$self[0].id+'_deselectAll').on('click',function(event){$self.rup_jqtable('deselectRemainingRows');});}// Se actualiza el contador de elementos seleccionados\n$self.rup_jqtable('updateSelectedRowNumber');},'rupTableAfterSearchNav.rupTable.multiselection rupTableSearchSuccess.rupTable.multiselection rupTableAfterDelete.rupTable.multiselection':function rupTableAfterSearchNavRupTableMultiselectionRupTableSearchSuccessRupTableMultiselectionRupTableAfterDeleteRupTableMultiselection(){var $self=$(this);$self.rup_jqtable('resetSelection');},'rupTable_multiselectionUpdated.multiselection':function rupTable_multiselectionUpdatedMultiselection(){var $self=$(this),self=$self[0],page=$self.rup_jqtable('getGridParam','page'),settings=$self.data('settings'),internalProps=self.p,rowNum=$self.rup_jqtable('getGridParam','rowNum'),rows,selectedRows=settings.multiselection.selectedRowsPerPage[page],deselectedRows=settings.multiselection.deselectedRowsPerPage[page]||[];// Se oculta el posible mensaje de feedback que se muestre\n$self.triggerHandler('rupTable_internalFeedbackClose');/*\r\n           * Gestión de la persistencia de la multiselección entre páginas.\r\n           *\r\n           * El siguiente algoritmo permite mantener la selección de registros mientras se pagina.\r\n           * Los registros seleccionados se mantienen almacenando sus identificadores.\r\n           * En caso de seleccionar todos los elementos de la tabla se trabaja mediante lógica inversa, de modo que se almacenan los registros deseleccionados.\r\n           */ // Se comprueba si se han seleccionado todos los registros de la tabla.\nif(settings.multiselection.selectedAll){internalProps.selarrrow=[];rows=self.rows;// Para cada línea que muestra la tabla:\nfor(var i=0;i<rows.length;i++){// Se comprueba si el registro se encuentra en el array de deseleccionados.\nif(jQuery.inArray(rows[i].id,deselectedRows)===-1){// En caso de no ser un elemento deseleccionado se marca como seleccionado.\n$self.rup_jqtable('highlightRowAsSelected',$(rows[i]));}else{// En caso de ser un elemento deseleccionado se desmarca.\n$self.rup_jqtable('clearHighlightedRowAsSelected',$(rows[i]));}}// En caso de estar todos los elementos de la página seleccionados marcamos el check general\nif(deselectedRows.length===0){settings.$selectAllCheck[internalProps.useProp?'prop':'attr']('checked',true);}}else{// No se han seleccionado todos los resgistros de la página.\nif(selectedRows){rows=self.rows;internalProps.selarrrow=[];// Para cada línea que muestra la tabla:\nfor(var i=0;i<rows.length;i++){// Se comprueba si el registro se encuentra en el array de seleccionados\nif(jQuery.inArray(rows[i].id,selectedRows)!==-1){// En caso de ser un elemento seleccionado, se marca como tal.\n$self.rup_jqtable('highlightRowAsSelected',$(rows[i]));}else{// En caso de no ser un elemento seleccionado se desmarca.\n$self.rup_jqtable('clearHighlightedRowAsSelected',$(rows[i]));}}// En caso de estar todos los elementos de la página seleccionados marcamos el check general\nif(selectedRows.length===rowNum){settings.$selectAllCheck[internalProps.useProp?'prop':'attr']('checked',true);}}}$self.rup_jqtable('updateSelectedRowNumber');},'rupTable_beforeAddRow.multiselection':function rupTable_beforeAddRowMultiselection(event,addCloneOptions){// Si la edición en línea no está activada, no comprobamos los elementos seleccionados y devolvemos true\nif($self[0].p.inlineEdit){return true;}$self._checkSelectedElements(function(){$self.jqGrid('editGridRow','new',addCloneOptions);$self.rup_jqtable('resetSelection');$self.rup_jqtable('clearHighlightedEditableRows');});return false;},'jqGridAddEditAfterSubmit.rupTable.formEditing':function jqGridAddEditAfterSubmitRupTableFormEditing(event,res,postData,oper){if(oper!=='edit'){$self.rup_jqtable('resetSelection');$self.rup_jqtable('clearHighlightedEditableRows');}}});if(settings.multiboxonly===true){settings.multiselection.multiboxonly=true;}// Control del uso de Ctrl y Shift\njQuery('body').on({'rup_ctrlKeyDown rup_shiftKeyDown':function rup_ctrlKeyDownRup_shiftKeyDown(){if(settings.multiselection.multiboxonly===true){$self[0].p.multiboxonly=false;}return false;},'rup_ctrlKeyUp rup_shiftKeyUp':function rup_ctrlKeyUpRup_shiftKeyUp(){if(settings.multiselection.multiboxonly===true){$self[0].p.multiboxonly=true;}return false;}});/**\r\n       * MENUS CONTEXTUALES\r\n       */jQuery.contextMenu('destroy','[id=\\''+settings.id+'_cb\\']');var selector='[id=\\''+settings.id+'_cb\\']';if(jQuery(selector).length>0){jQuery(selector).rup_contextMenu({selector:selector,trigger:'none',callback:settings.multiselection.headerContextMenu.callback,items:$self._headerContextMenuItems(settings.multiselection.headerContextMenu,settings),position:function position(contextMenu,x,y){var offset=this.offset();contextMenu.$menu.css({top:offset.top+this.height(),left:offset.left});}});}if(settings.multiselection.rowContextMenu_enabled){var _selector='td[aria-describedby=\\''+settings.id+'_cb\\']';jQuery.contextMenu('destroy',_selector);if(jQuery(_selector).length>0){jQuery(_selector).rup_contextMenu({selector:_selector,trigger:'none',callback:settings.multiselection.rowContextMenu.callback,items:$self._rowContextMenuItems(settings.multiselection.rowContextMenu,settings),position:function position(contextMenu,x,y){var offset=this.offset();contextMenu.$menu.css({top:offset.top+this.height(),left:offset.left});}});}}}});/**\r\n   * Métodos públicos del plugin multiselection.\r\n   *\r\n   * Los métodos implementados son:\r\n   *\r\n   * resetSelection(): Limpia a selección realizada por el usuario.\r\n   * updateSelectedRowNumber(): Refresca el identificador de resgistros seleccionados\r\n   */jQuery.fn.rup_jqtable('extend',{getSelectedIds:function getSelectedIds(){var $self=this,settings=$self.data('settings'),multiselectionObj={};if(!settings.multiselection.selectedAll){if(settings.multiselection.selectedIds!=undefined){if(settings.multiselection.selectedIds.length>0){jQuery.extend(true,multiselectionObj,{'selectedIds':settings.multiselection.selectedIds});}}jQuery.extend(true,multiselectionObj,{'selectedAll':false});}else{if(settings.multiselection.deselectedIds.length>0){jQuery.extend(true,multiselectionObj,{'selectedIds':settings.multiselection.deselectedIds});}jQuery.extend(true,multiselectionObj,{'selectedAll':true});}return multiselectionObj;},clearHighlightedEditableRows:function clearHighlightedEditableRows(){var $self=this,settings=$self.data('settings');$self.find('td[aria-describedby=\\''+settings.id+'_rupInfoCol\\'] span.ui-icon.ui-icon-pencil').removeClass('ui-icon-pencil');},highlightFirstEditableRow:function highlightFirstEditableRow(){var $self=this,settings=$self.data('settings'),page=parseInt($self.rup_jqtable('getGridParam','page'),10),firstSelectedLine,firstSelectedId;$self.rup_jqtable('clearHighlightedEditableRows');if($self._hasPageSelectedElements(page)){firstSelectedLine=$self._getFirstSelectedElementOfPage(page);firstSelectedId=$self.jqGrid('getDataIDs')[firstSelectedLine-1];settings.multiselection.rowForEditing=firstSelectedId;$self.rup_jqtable('highlightEditableRow',$self.jqGrid('getInd',firstSelectedId,true));}},highlightEditableRow:function highlightEditableRow($row){var $self=this,settings=$self.data('settings');$row=jQuery($row);$row.find('td[aria-describedby=\\''+settings.id+'_rupInfoCol\\'] span').addClass('ui-icon ui-icon-rupInfoCol ui-icon-pencil');},refreshSelection:function refreshSelection(){var $self=this;$self.triggerHandler('rupTable_multiselectionUpdated');},resetSelection:function resetSelection(){var $self=this,settings=$self.data('settings');$self.jqGrid('resetSelection');$self._initializeMultiselectionProps(settings);$self.triggerHandler('rupTable_multiselectionUpdated');},selectAllRows:function selectAllRows(event){var $self=this,settings=$self.data('settings'),arr,$row;$self.rup_jqtable('selectRemainingRows');jQuery('#cb_'+settings.id).attr('checked','checked');// Se marcan los registros de la tabla como marcados\narr=$self.jqGrid('getDataIDs');for(var i=0;i<arr.length;i++){$row=jQuery($self.jqGrid('getInd',arr[i],true));$self.rup_jqtable('highlightRowAsSelected',$row);}$self.rup_jqtable('highlightFirstEditableRow');},selectRemainingRows:function selectRemainingRows(event){var $self=this,settings=$self.data('settings');$self._initializeMultiselectionProps(settings);// Se marca el flag de todos seleccionados a true\nsettings.multiselection.selectedAll=true;// Numero de registros seleccionados\nsettings.multiselection.numSelected=$self.rup_jqtable('getGridParam','records');// Se cierra el feedback para seleccionar/deseleccionar el resto de registros\n$self.rup_jqtable('updateSelectedRowNumber');$self.trigger('rupTable_feedbackClose',settings.$internalFeedback);},deselectAllRows:function deselectAllRows(event){var $self=this,settings=$self.data('settings'),arr,$row,internalProps=$self[0].p;$self.rup_jqtable('deselectRemainingRows');$self.rup_jqtable('clearHighlightedEditableRows');jQuery('#cb_'+settings.id).removeAttr('checked');// Se marcan los registros de la tabla como marcados\narr=$self.jqGrid('getDataIDs');internalProps.selarrrow=[];for(var i=0;i<arr.length;i++){$row=jQuery($self.jqGrid('getInd',arr[i],true));$self.rup_jqtable('clearHighlightedRowAsSelected',$row);}},deselectRemainingRows:function deselectRemainingRows(event){var $self=this,settings=$self.data('settings');$self._initializeMultiselectionProps(settings);// Se cierra el feedback para seleccionar/deseleccionar el resto de registros\n$self.rup_jqtable('updateSelectedRowNumber');$self.trigger('rupTable_feedbackClose',settings.$internalFeedback);},/*\r\n     * Actualiza el contador de la tabla que indica los registros seleccionados.\r\n     */updateSelectedRowNumber:function updateSelectedRowNumber(){var $self=$(this),settings=$self.data('settings');$('div .ui-paging-selected',settings.$pager).html(settings.multiselection.numSelected+' '+jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.pager.selected'));$self.triggerHandler('rupTableSelectedRowNumberUpdated');}});//*******************************************************\n// DEFINICIÓN DE MÉTODOS PRIVADOS\n//*******************************************************\n/**\r\n   * Métodos privados del plugin multiselection.\r\n   *\r\n   * Los métodos implementados son:\r\n   *\r\n   * _addArrow (object): Añade flecha para desplegar menú contextual.\r\n   * _headerContextMenuItems(options, settings): Configura el menú contextual del check de la cabecera.\r\n   * _rowContextMenuItems(options, settings): Configura el menú contextual del check de cada línea (contiene configuración para Jerarquía).\r\n   * _hasPageSelectedElements(paramPage): Determina (true/false) si la página indicada contiene registros seleccionados.\r\n   * _initializeMultiselectionProps(settings): Inicializa los parámetros internos de control para la multiselección.\r\n   * _getFirstSelectedElementOfPage(paramPage): Devuelve el primer registro seleccionado de la página indicada.\r\n   * _getRemainingRecordNum(settings, selectedRows): Devuelve el número de elementos restantes que pueden ser seleccionados.\r\n   * _getSelectedLinesOfPage(page): Devuelve el número de registros seleccionados de que dispone la página indicada por parámetro.\r\n   * _processSelectedRow(settings, rowId, status): Gestióna la acción de seleción/deselección del registro indicado.\r\n   */jQuery.fn.rup_jqtable('extend',{//Añade flecha contextMenu\n_addArrow:function _addArrow(object){jQuery(object).after(jQuery('<a></a>').attr('href','javascript:void(0)').addClass('ui-icon rup-jerarquia_checkmenu_arrow').on('click',function(e){$(this).parents('th, td').contextMenu();}));},_checkSelectedElements:function _checkSelectedElements(okCallback){var $self=$(this),self=$self[0],page=$self.rup_jqtable('getGridParam','page'),settings=$self.data('settings');//if(prop.showMultiselectAlerts && selectedRows && selectedRows.length>0){\nif(settings.multiselection.numSelected>0){$.rup_messages('msgConfirm',{message:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.checkSelectedElems'),title:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.changes'),OKFunction:function OKFunction(){okCallback.call();}});}else{okCallback.call();}},//Crear contextMenu cabecera\n_headerContextMenuItems:function _headerContextMenuItems(options,settings){var $self=this,items={};if(options.selectAllPage){jQuery.extend(items,{'selectAllPage':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.multiselection.selectAllPage'),icon:'check',disabled:function disabled(key,opt){return $self._getSelectedLinesOfPage(parseInt($self.rup_jqtable('getGridParam','page'))).length===$self.jqGrid('getGridParam','reccount');},callback:function callback(key,options){$('[id=\\'cb_'+settings.id+'\\']').attr('checked','checked').click().attr('checked','checked');}}});}if(options.deselectAllPage){jQuery.extend(items,{'deselectAllPage':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.multiselection.deselectAllPage'),icon:'uncheck',disabled:function disabled(key,opt){return $self._getSelectedLinesOfPage(parseInt($self.rup_jqtable('getGridParam','page'))).length===0;},callback:function callback(key,options){$('[id=\\'cb_'+settings.id+'\\']').removeAttr('checked').click().removeAttr('checked');}}});}if(options.separator){jQuery.extend(items,{'separator':''});}if(options.selectAll){jQuery.extend(items,{'selectAll':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.multiselection.selectAll'),icon:'check_all',disabled:function disabled(key,opt){return settings.multiselection.numSelected===$self.rup_jqtable('getGridParam','records');},callback:function callback(key,options){$self.rup_jqtable('selectAllRows');}}});}if(options.deselectAll){jQuery.extend(items,{'deselectAll':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.multiselection.deselectAll'),icon:'uncheck_all',disabled:function disabled(key,opt){return settings.multiselection.numSelected===0;},callback:function callback(key,options){$self.rup_jqtable('deselectAllRows');}}});}if(!jQuery.isEmptyObject(options.items)){jQuery.extend(items,options.items);}return items;},_rowContextMenuItems:function _rowContextMenuItems(options,settings){var $self=this,items={};if(settings.jerarquia!==undefined&&settings.jerarquia.contextMenu){if(options.selectChild){jQuery.extend(items,{'selectChild':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.jerarquia.selectChild'),icon:'child',callback:function callback(key,options){$self._getJerarquiaChildren(this,key,options);}}});}if(options.selectDescendent){jQuery.extend(items,{'selectDescendent':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.jerarquia.selectDescendent'),icon:'descendent',callback:function callback(key,options){$self._getJerarquiaChildren(this,key,options);}}});}if(options.separator){jQuery.extend(items,{'separator':''});}if(options.deselectChild){jQuery.extend(items,{'deselectChild':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.jerarquia.deselectChild'),icon:'uncheck',callback:function callback(key,options){$self._getJerarquiaChildren(this,key,options);}}});}if(options.deselectDescendent){jQuery.extend(items,{'deselectDescendent':{name:$.rup.i18nParse($.rup.i18n.base,'rup_jqtable.plugins.jerarquia.deselectDescendent'),icon:'uncheck',callback:function callback(key,options){$self._getJerarquiaChildren(this,key,options);}}});}}if(!jQuery.isEmptyObject(options.items)){jQuery.extend(items,options.items);}return items;},_refreshSelectedElements:function _refreshSelectedElements(settings,status,rowPK,tableRow){//Variables para referenciar selección normal o inversa\nvar rowsPerPage,linesPerPage,ids,rows,pages;if(settings.multiselection.selectedAll!==true){rowsPerPage=settings.multiselection.selectedRowsPerPage;linesPerPage=settings.multiselection.selectedLinesPerPage;ids=settings.multiselection.selectedIds;rows=settings.multiselection.selectedRows;pages=settings.multiselection.selectedPages;}else{rowsPerPage=settings.multiselection.deselectedRowsPerPage;linesPerPage=settings.multiselection.deselectedLinesPerPage;ids=settings.multiselection.deselectedIds;rows=settings.multiselection.deselectedRows;pages=settings.multiselection.deselectedPages;status=!status;}//Si no estaba seleccionado\nif(status){if(jQuery.inArray(rowPK,ids)===-1){//Añadir el elemento a los seleccionados\nif(settings.multiselection.selectedAll!==true){settings.multiselection.numSelected++;}else{//Quitar el elemento de los no seleccionados (inversa)\nsettings.multiselection.numSelected--;}//Controlar si no existe array para la página\nif(rowsPerPage[tableRow.page]===undefined){rowsPerPage[tableRow.page]=[];linesPerPage[tableRow.page]=[];}//id\nids.push(rowPK);//PAGINA [líneas]\njQuery.rup_utils.insertSorted(linesPerPage[tableRow.page],tableRow.pageLine);//{ id : PK, page : PAGINA }\nrows.push({id:rowPK,page:tableRow.page});//PAGINA [ids]\nrowsPerPage[tableRow.page].splice(tableRow.pageLine,0,rowPK);//PAGINA\nif(rowsPerPage[tableRow.page].length>0&&jQuery.inArray(tableRow.page,pages)===-1){jQuery.rup_utils.insertSorted(pages,tableRow.page);}}}else{if(jQuery.inArray(rowPK,ids)!==-1){//Quitar el elemento a los seleccionados\nif(settings.multiselection.selectedAll!==true){settings.multiselection.numSelected--;}else{//añadir el elemento de los no seleccionados (inversa)\nsettings.multiselection.numSelected++;}//id\nids.splice(jQuery.inArray(rowPK,ids),1);//PAGINA [líneas]\nlinesPerPage[tableRow.page].splice(jQuery.inArray(tableRow.pageLine,linesPerPage[tableRow.page]),1);//{ id : PK, page : PAGINA }\nvar selectedRowObjStr=JSON.stringify({id:rowPK,page:tableRow.page}),indexInArray=null;jQuery.grep(rows,function(element,index){if(JSON.stringify(element)===selectedRowObjStr){indexInArray=index;}});rows.splice(indexInArray,1);//PAGINA [ids]\nrowsPerPage[tableRow.page].splice(jQuery.inArray(rowPK,rowsPerPage[tableRow.page]),1);//PAGINA\nif(rowsPerPage[tableRow.page].length==0&&jQuery.inArray(tableRow.page,pages)!==-1){pages.splice(jQuery.inArray(tableRow.page,pages),1);}}}},_hasPageSelectedElements:function _hasPageSelectedElements(paramPage){var $self=this,settings=$self.data('settings'),rowsPerPage,page=typeof paramPage==='string'?parseInt(paramPage,10):paramPage;// Se comprueba si se han seleccionado todos los registros de la tabla\nif(!settings.multiselection.selectedAll){// En caso de no haberse seleccionado todos los registros de la tabla\n// Comprobamos si en la página indicada se ha seleccionado un elemento\nreturn jQuery.inArray(page,settings.multiselection.selectedPages)!==-1;}else{// En caso de haberse seleccionado todos los registros de la tabla\n// Generamos un array inicializado con los index de las lineas de las tablas\nrowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10);// Obtenemos el número de registro por página que se visualizan\n// Se comprueba si el número de registros deseleccionados es igual al número de registros por página, en cuyo caso significará que no hay elementos seleccionados\nif(jQuery.inArray(page,settings.multiselection.deselectedPages)!==-1&&settings.multiselection.deselectedLinesPerPage[page].length===rowsPerPage){return false;}return true;}},_initializeMultiselectionProps:function _initializeMultiselectionProps(settings){// Se almacenan en los settings internos las estructuras de control de los registros seleccionados\nif(settings.multiselection===undefined){settings.multiselection={};}// Flag indicador de selección de todos los registros\nsettings.multiselection.selectedAll=false;// Numero de registros seleccionados\nsettings.multiselection.numSelected=0;// Propiedades de selección de registros\nsettings.multiselection.selectedRowsPerPage=[];settings.multiselection.selectedLinesPerPage=[];settings.multiselection.selectedRows=[];settings.multiselection.selectedIds=[];settings.multiselection.selectedPages=[];// Propiedades de deselección de registros\nsettings.multiselection.deselectedRowsPerPage=[];settings.multiselection.deselectedLinesPerPage=[];settings.multiselection.deselectedRows=[];settings.multiselection.deselectedIds=[];settings.multiselection.deselectedPages=[];},_getFirstSelectedElementOfPage:function _getFirstSelectedElementOfPage(paramPage){var $self=this,settings=$self.data('settings'),rowsPerPage,page=typeof paramPage==='string'?parseInt(paramPage,10):paramPage;// Se comprueba si se han seleccionado todos los registros de la tabla\nif(!settings.multiselection.selectedAll){// En caso de no haberse seleccionado todos los registros de la tabla\n// Comprobamos si en la página indicada se ha seleccionado un elemento\nif(jQuery.inArray(page,settings.multiselection.selectedPages)===-1){return false;}// En caso de que se haya seleccionado un elemento en la página indicada se devuelve el primero\nreturn settings.multiselection.selectedLinesPerPage[page][0];}else{// En caso de haberse seleccionado todos los registros de la tabla\n// Si no se han deseleccionado registros en la página se devuelve el primer indice\nif(jQuery.inArray(page,settings.multiselection.deselectedPages)===-1){return 1;}// Obtenemos el número de registro por página que se visualizan\nrowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10);// Se comprueba si el número de registros deseleccionados es igual al número de registros por página, en cuyo caso significará que no hay eleme\nif(settings.multiselection.deselectedLinesPerPage[page].length===rowsPerPage){return false;}// Obtenemos el primer elemento de la página que no ha sido deseleccionado\nfor(var i=1;i<=rowsPerPage;i++){if(jQuery.inArray(i,settings.multiselection.deselectedLinesPerPage[page])===-1){return i;}}}},_getRemainingRecordNum:function _getRemainingRecordNum(settings,selectedRows){var $self=this,totalRegistros=$self.rup_jqtable('getGridParam','records'),registrosPagina=$self.rup_jqtable('getGridParam','reccount'),registrosSelPagina=selectedRows.length,registrosSelTotal=settings.multiselection.numSelected,elementosRestantes=totalRegistros-registrosPagina!==0?totalRegistros-registrosPagina-(registrosSelTotal-registrosSelPagina):0;return elementosRestantes;},_getSelectedLinesOfPage:function _getSelectedLinesOfPage(page){var $self=this,settings=$self.data('settings'),rowsPerPage,records,lastPage,inverseArray=[];// Se comprueba si se han seleccionado todos los registros de la tabla\nif(!settings.multiselection.selectedAll){// En caso de no haberse seleccionado todos los registros de la tabla\n// Comprobamos si en la página indicada se ha seleccionado un elemento\nif(jQuery.inArray(page,settings.multiselection.selectedPages)===-1){return[];}// En caso de que se haya seleccionado un elemento en la página indicada se devuelve el array de seleccionados\nreturn settings.multiselection.selectedLinesPerPage[page];}else{// En caso de haberse seleccionado todos los registros de la tabla\n// Generamos un array inicializado con los index de las lineas de las tablas\nrowsPerPage=parseInt($self.rup_jqtable('getGridParam','rowNum'),10);records=$self.rup_jqtable('getGridParam','records');lastPage=parseInt(Math.ceil(records/rowsPerPage,10));// En caso de ser la última página se recalcula el número de elementos que se muestran en ella\nif(page===lastPage){rowsPerPage=records-(lastPage-1)*rowsPerPage;}for(var i=1;i<=rowsPerPage;i++){inverseArray[i-1]=i;}// Si no se han deseleccionado registros en la página se devuelve el array al completo\nif(jQuery.inArray(page,settings.multiselection.deselectedPages)===-1){return inverseArray;}// Obtenemos el número de registro por página que se visualizan\n// Se comprueba si el número de registros deseleccionados es igual al número de registros por página, en cuyo caso significará que no hay elementos seleccionados\nif(settings.multiselection.deselectedLinesPerPage[page].length===rowsPerPage){return[];}// Se eliminan del array inicializado con todos los identificadores de las lineas, las que han sido deseleccionadas\nreturn jQuery.grep(inverseArray,function(elem){return jQuery.inArray(elem,settings.multiselection.deselectedLinesPerPage[page])===-1;});}},_processSelectedRow:function _processSelectedRow(settings,rowId,status){var $self=this,page=$self.rup_jqtable('getGridParam','page'),pageInt=parseInt(page),lineIndex,indexInArray,indexAtPage,indexPage;// Se selecciona o deselecciona el elemento en los arrays que almacenan los registros seleccionados.\nif(status){if(settings.multiselection.selectedAll){// Se ha deseleccionado un elemento\n// Se almacena el Id del registro seleccionado\nindexInArray=jQuery.inArray(rowId,settings.multiselection.deselectedIds);if(indexInArray!=-1){settings.multiselection.deselectedIds.splice(indexInArray,1);settings.multiselection.deselectedRows.splice(indexInArray,1);indexAtPage=jQuery.inArray(rowId,settings.multiselection.deselectedRowsPerPage[page]);settings.multiselection.deselectedRowsPerPage[page].splice(indexAtPage,1);settings.multiselection.deselectedLinesPerPage[page].splice(indexAtPage,1);if(settings.multiselection.deselectedRowsPerPage[page].length===0){indexPage=jQuery.inArray(pageInt,settings.multiselection.deselectedPages);if(indexPage!==-1){settings.multiselection.deselectedPages.splice(indexPage,1);}}settings.multiselection.numSelected++;}}else{// Se ha seleccionado un elemento\n// Se comprueba si está creado el array correspondiente para la página actual\nif(settings.multiselection.selectedRowsPerPage[page]===undefined){settings.multiselection.selectedRowsPerPage[page]=[];settings.multiselection.selectedLinesPerPage[page]=[];}// Se almacena el Id del registro seleccionado\nif(jQuery.inArray(rowId,settings.multiselection.selectedIds)===-1){settings.multiselection.selectedIds.push(rowId);settings.multiselection.selectedRows.push({id:rowId,page:page});//\t\t\t\t\t\tlineIndex = jQuery.rup_utils.insertSorted(settings.multiselection.selectedLinesPerPage[page], $self.jqGrid(\"getInd\",rowId));\nlineIndex=jQuery.rup_utils.insertSorted(settings.multiselection.selectedLinesPerPage[page],$self._getLineIndex(rowId));settings.multiselection.selectedRowsPerPage[page].splice(lineIndex,0,rowId);if(settings.multiselection.selectedRowsPerPage[page].length>0&&jQuery.inArray(pageInt,settings.multiselection.selectedPages)===-1){jQuery.rup_utils.insertSorted(settings.multiselection.selectedPages,pageInt);}settings.multiselection.numSelected++;}}}else{if(settings.multiselection.selectedAll){// Se ha seleccionado un elemento\n// Se comprueba si está creado el array correspondiente para la página actual\nif(settings.multiselection.deselectedRowsPerPage[page]===undefined){settings.multiselection.deselectedRowsPerPage[page]=[];settings.multiselection.deselectedLinesPerPage[page]=[];}// Se almacena el Id del registro seleccionado\nif(jQuery.inArray(rowId,settings.multiselection.deselectedIds)===-1){settings.multiselection.deselectedIds.push(rowId);settings.multiselection.deselectedRows.push({id:rowId,page:page});//\t\t\t\t\t\tlineIndex = jQuery.rup_utils.insertSorted(settings.multiselection.deselectedLinesPerPage[page], $self.jqGrid(\"getInd\",rowId));\nlineIndex=jQuery.rup_utils.insertSorted(settings.multiselection.deselectedLinesPerPage[page],$self._getLineIndex(rowId));settings.multiselection.deselectedRowsPerPage[page].splice(lineIndex,0,rowId);if(settings.multiselection.deselectedRowsPerPage[page].length>0&&jQuery.inArray(pageInt,settings.multiselection.deselectedPages)===-1){jQuery.rup_utils.insertSorted(settings.multiselection.deselectedPages,pageInt);}settings.multiselection.numSelected--;}}else{// Se ha deseleccionado un elemento\n// Se almacena el Id del registro seleccionado\nindex=jQuery.inArray(rowId,settings.multiselection.selectedIds);if(index!=-1){settings.multiselection.selectedIds.splice(index,1);settings.multiselection.selectedRows.splice(index,1);indexAtPage=jQuery.inArray(rowId,settings.multiselection.selectedRowsPerPage[page]);settings.multiselection.selectedRowsPerPage[page].splice(indexAtPage,1);settings.multiselection.selectedLinesPerPage[page].splice(indexAtPage,1);if(settings.multiselection.selectedRowsPerPage[page].length===0){indexPage=jQuery.inArray(pageInt,settings.multiselection.selectedPages);if(indexPage!==-1){settings.multiselection.selectedPages.splice(indexPage,1);}}settings.multiselection.numSelected--;}}}$self.rup_jqtable('updateSelectedRowNumber');}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\njQuery.fn.rup_jqtable.plugins.multiselection=jQuery.fn.rup_jqtable.plugins.multiselection||{};jQuery.fn.rup_jqtable.plugins.multiselection.defaults={showGridInfoCol:true,formEdit:{autoselectFirstRecord:false},inlineEdit:{autoselectFirstRecord:false},multiselection:{defaultEditableInfoCol:{name:'infoEditable',index:'infoEditable',editable:false,width:'15em',search:false},headerContextMenu_enabled:true,headerContextMenu:{selectAllPage:true,deselectAllPage:true,separator:true,selectAll:true,deselectAll:true,items:{}},rowContextMenu_enabled:false,rowContextMenu:{selectChild:true,selectDescendent:true,separator:true,deselectChild:true,deselectDescendent:true,items:{}}}};jQuery.fn.rup_jqtable.defaults.multiselection={loadBeforeSend:function rup_jqtable_defaults_loadBeforeSend(xhr,settings){// Se modifica la request para incluir las siguientes cabeceras:\n// Se añade la cabecera JQGridModel para indicar que la petición ha sido realizada por el componente rup_jqtable\nxhr.setRequestHeader('JQGridModel','true');// Se indica que el tipo de contenido enviado en la cabecera es application/jsons\nxhr.setRequestHeader('Content-Type','application/json');}};})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * El objetivo principal del módulo Jerarquía es la presentación de un conjunto de datos (tabla) ordenados jerárquicamente en base a una relación existente entre ellos.\r\n *\r\n * @summary Plugin de edición en línea del componente RUP Table.\r\n * @module rup_jqtable/jerarquia\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"jerarquia\"],\r\n * \tjerarquia:{\r\n * \t\t// Propiedades de configuración del plugin jerarquia\r\n * \t}\r\n * });\r\n */(function(jQuery){jQuery.rup_jqtable.registerPlugin('jerarquia',{loadOrder:11,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigurejerarquia',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigurejerarquia',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\njQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin jerarquia del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigurejerarquia\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigurejerarquia:function preConfigurejerarquia(settings){var $self=this,jerarquiaSettings=settings.jerarquia;//Contenedor de parámetros de la jerarquia\n$self.jqGrid('setGridParam',{postData:{jerarquia:{}}});//Sobreescribir valores y funciones TREEGRID\nsettings.treeGrid=true;settings.rowTotal=0;//(avoid default feature)\nsettings.treeGridModel='adjacency';//default: nested\nsettings.treeIcons=jerarquiaSettings['icons'];//(avoid default function)\nvar setTreeGrid_default=$self.jqGrid.setTreeGrid;jQuery.jgrid.extend({setTreeGrid:function setTreeGrid(){setTreeGrid_default.call($self);$self[0].p.altRows=true;//pijama\n$self[0].p.pgbuttons=true;//enlaces paginación\n$self[0].p.pginput=true;//selector de página\n$self[0].p.rowList=settings.rowList;//núm. elementos/página\nif(settings.multiselect){$self[0].p.multiselect=true;//multiselección\n}}});// Se configura la url de filtrado\nif(settings.filter.childrenUrl===null){settings.filter.childrenUrl=settings.baseUrl+'Children';}//Columna de jerarquía\nsettings.ExpandColumn=jerarquiaSettings['column'];//Si es multiselección se debe de desplazar el puntero de la columna a la siguiente (da igual que sea oculta)\nif(settings.multiselect){for(key in settings.colModel){if(settings.colModel[key].name===settings.ExpandColumn){key=parseInt(key)+1;//Si no hay columna siguiente se crea una oculta para esto\nif(settings.colModel[key]===undefined){settings.colNames[key]='jerarquia_multiselect';settings.colModel[key]={name:'jerarquia_multiselect',hidden:true};}settings.ExpandColumn=settings.colModel[key].name;break;}}}//Añadir columnas de la jerarquía\nsettings.colNames=jQuery.merge(['level'],settings.colNames);settings.colModel=jQuery.merge([{name:'level',hidden:true}],settings.colModel);settings.colNames=jQuery.merge(['isLeaf'],settings.colNames);settings.colModel=jQuery.merge([{name:'isLeaf',hidden:true}],settings.colModel);settings.colNames=jQuery.merge(['parentNodes'],settings.colNames);settings.colModel=jQuery.merge([{name:'parentNodes',hidden:true}],settings.colModel);settings.colNames=jQuery.merge(['filter'],settings.colNames);settings.colModel=jQuery.merge([{name:'filter',hidden:true}],settings.colModel);//Inicializar los elementos contraidos\njQuery($self).data('tree',[]);//Sobreescribir evento expandir/contraer\n$self.on({'rupTable_serializeGridData.multiselection':function rupTable_serializeGridDataMultiselection(events,postData){//Token para separar los nodos (para tooltip)\njQuery.extend(true,postData,{'jerarquia':{'token':jerarquiaSettings['token']}});if(Array.isArray(postData.jerarquia.tree)&&postData.jerarquia.tree.length===0){postData.jerarquia.tree='';}},'jqGridAddEditAfterComplete.rupTable.jerarquia':function jqGridAddEditAfterCompleteRupTableJerarquia(){//Desactivar TREEGRID\n$self[0].p.treeGrid=false;//(avoid default feature)\n},//\t\t\t\t\"jqGridAddEditBeforeSubmit.rupTable.jerarquia\": function(event, postData, $form, frmoper){\n//\t\t\t\t\tvar parentProp = jQuery.proxy(settings.getRowForEditing, $self)();\n//\t\t\t\t\tif (parentProp!==undefined){\n//\t\t\t\t\t\tpostData[settings.jerarquia.parentProp] = parentProp;\n//\t\t\t\t\t}\n//\t\t\t\t},\n'jqGridAddEditBeforeSubmit.rupTable.jerarquia jqGridBeforeRequest.rupTable.jerarquia':function jqGridAddEditBeforeSubmitRupTableJerarquiaJqGridBeforeRequestRupTableJerarquia(){//Activar TREEGRID\n$self[0].p.treeGrid=true;//(avoid default feature)\n},'jqGridLoadComplete.rupTable.jerarquia':function jqGridLoadCompleteRupTableJerarquia(event,data){//Array de elementos contraidos\nvar collapsedNodes=jQuery($self).data('tree'),collapsedNodes_length=collapsedNodes.length;//ICONOS: contraidos (tree)\nfor(var i=0;i<collapsedNodes_length;i++){jQuery('[id=\\''+collapsedNodes[i]+'\\'] .tree-wrap > div').removeClass('tree-leaf '+settings.treeIcons.leaf).addClass('tree-minus '+settings.treeIcons.minus);}//ICONOS: filtrado (filter) y tooltip (parentNodes)\nvar rows=$self.rup_jqtable('getGridParam','data'),rows_length=rows.length,$filterIcon=jQuery('<div></div>').addClass('rup-jerarquia_filter ui-icon').addClass(jerarquiaSettings['icons']['filter']).text(jQuery.rup.i18nParse(jQuery.rup.i18n.base,'rup_jqtable.plugins.jerarquia.filtered'));for(var i=0;i<rows_length;i++){var rowId=jQuery.jgrid.getAccessor(rows[i],$self.rup_jqtable('getGridParam','localReader').id),$rowColumn=jQuery('tr[id=\\''+rowId+'\\'] > td .tree-wrap');//Filtro\nif(rows[i].filter){$rowColumn.prepend($filterIcon.clone());}//Tooltip\nif(jerarquiaSettings['parentNodesTooltip']){$rowColumn.parent().rup_tooltip({content:{text:$self._parseParentNodes(rows[i].parentNodes)}});}}//EVENTOS: Expandir (plus) - Contraer (minus)\njQuery('.tree-plus, .tree-minus').off('click');jQuery('.tree-plus, .tree-minus').on('click',function(event){var $iconDiv=jQuery(this),rowId=$self.rup_jqtable('getGridParam','_index')[$iconDiv.closest('tr.jqgrow')[0].id],rowData=$self.rup_jqtable('getGridParam','data')[rowId],nodeId=jQuery.jgrid.getAccessor(rowData,$self.rup_jqtable('getGridParam','localReader').id);//Añadir o eliminar elemento para query (y almacenarlo en la tabla)\nif($iconDiv.hasClass(settings.treeIcons.plus)){collapsedNodes.push(nodeId);}else{collapsedNodes.splice(jQuery.inArray(nodeId,collapsedNodes),1);}jQuery($self).data('tree',collapsedNodes);//Buscar (añadiendo colapsados)\n$self.jqGrid('setGridParam',{postData:{'jerarquia':{'tree':collapsedNodes.toString()}}});$self.trigger('reloadGrid');});//Desactivar TREEGRID\n$self[0].p.treeGrid=false;//(avoid default feature)\n}});//Eventos que producen reset de los elementos expandidos\njQuery.each(jerarquiaSettings['resetEvents'],function(index,object){var callback=jQuery.isFunction(object[0])?object.shift():null,ids='[id=\\''+object.join('\\'], [id=\\'')+'\\']';//Asociar el evento\njQuery(ids).on(index,function(event){if(callback===null||callback.call($self,event)===false){$self.reset();}});//El evento se ejecuta el primero en secuencia\nfor(var i=0;i<object.length;i++){jQuery._data(jQuery('#'+object[i])[0],'events')[index]=jQuery._data(jQuery('#'+object[i])[0],'events')[index].reverse();}});//Activar contextMenu\nsettings.multiselection.rowContextMenu_enabled=settings.jerarquia.contextMenu;},/**\r\n\t\t* Metodo que realiza la post-configuración del plugin jerarquia del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name postConfigurejerarquia\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/postConfigurejerarquia:function postConfigurejerarquia(settings){var $self=this,jerarquiaSettings=settings.jerarquia;}});/**\r\n   * Métodos públicos del plugin jerarquia.\r\n   *\r\n   * Los métodos implementados son:\r\n   *\r\n   * reset: Reiniciar los elementos expandidos\r\n   */jQuery.fn.rup_jqtable('extend',{//Reiniciar los elementos expandidos\n/**\r\n     * Colapsa los nodos que han sido expandidos.\r\n     *\r\n     * @function reset\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"reset\");\r\n     */reset:function reset(){jQuery(this).data('tree',[]);jQuery(this).jqGrid('setGridParam',{postData:{'jerarquia':{'tree':[]}}});}});/**\r\n   * Métodos privados del plugin jerarquia.\r\n   *\r\n   * Los métodos implementados son:\r\n   *\r\n   * _parseParentNodes(parentNodes): Procesar valores del tooltip\r\n   * _getJerarquiaChildren($trigger, key, options : Obtener los hijos/descendientes para seleccionar/deseleccionar\r\n   */jQuery.fn.rup_jqtable('extend',{/**\r\n     * Colapsa los nodos que han sido expandidos.\r\n     *\r\n     * @function _parseParentNodes\r\n\t\t * @param {object} parentNodes - Referencia a los nodos padre.\r\n\t\t * @private\r\n     * @example\r\n     * $self._parseParentNodes(parentNodes);\r\n     */_parseParentNodes:function _parseParentNodes(parentNodes){var parentNodesTooltipFnc=this.data('settings')['jerarquia']['parentNodesTooltipFnc'],nodes=parentNodes.split(this.data('settings')['jerarquia']['token']).slice(1);//filtrar primer separador\nif(parentNodesTooltipFnc===null){//Función por defecto\nvar str='',tab='&nbsp;&nbsp;';for(var i=0;i<nodes.length;i++){if(i!==nodes.length-1){str+=nodes[i]+'<br/>'+tab+'└&nbsp;';tab+='&nbsp;&nbsp;&nbsp;';}else{str+='<b>'+nodes[i]+'</b>';}}return str;}else{return parentNodesTooltipFnc.call(this,nodes);}},//f(x) del contextMenu de multiselect con jerarquia\n_getJerarquiaChildren:function _getJerarquiaChildren($trigger,key,options){var $self=this,settings=$self.data('settings'),//        \t\trowData = $self.rup_jqtable(\"getGridParam\",\"data\")[$trigger.parent().index()-1],\nrowData=$self.rup_jqtable('getRowData',$trigger.parent().attr('id')),ajaxData={jerarquia:{//tree : {}, //Obviar elementos contraidos\nparentId:jQuery.jgrid.getAccessor(rowData,settings.primaryKeyCol),child:key.toLowerCase().indexOf('child')!=-1//FIXME: Quitar esto\n},filter:$self.rup_jqtable('getFilterParams')};jQuery.extend(true,ajaxData,$self.rup_jqtable('getGridParam','postData'));var primaryKey=Array.isArray(settings.primaryKey)?settings.primaryKey[0]:settings.primaryKey;jQuery.rup_ajax({url:settings.filter.childrenUrl,dataType:'json',data:jQuery.toJSON(ajaxData),type:'POST',async:false,contentType:'application/json',beforeSend:function beforeSend(xhr){xhr.setRequestHeader('JQGridModel',true);xhr.setRequestHeader('RUP',jQuery.toJSON({primaryKey:primaryKey}));},success:function success(xhr,ajaxOptions){var children=xhr['children'],children_length=children.length,status=key.indexOf('deselect')!=-1?false:true;for(var i=0;i<children_length;i++){var record=children[i];rowPK=record.pk[primaryKey];//FIXME: Generalizar esto\n$self._refreshSelectedElements(settings,status,rowPK,record);}//Actualizar datos\n$self.triggerHandler('rupTable_multiselectionUpdated');},error:function error(xhr,ajaxOptions,thrownError){},complete:function complete(xhr,textStatus){}});}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n// Parámetros de configuración por defecto para la jerarquía\n/**\r\n\t* @description Propiedades de configuración del plugin jerarquia del componente RUP Table.\r\n\t* @name options\r\n\t*\r\n\t* @property {string} [treedatatype=json] - Determina el tipo de dato empleado para obtener la representación jerárquica.\r\n\t* @property {string} [token] - Carácter separador utilizado para concatenar diferentes identificadores de los registros mostrados en la jerarquía. (por defecto “/”).\r\n\t* @property {object} [icons] - Estilos utilizados para cada uno de los elementos visuales de la jerarquía.\r\n\t* @property {object} icons.plus - Icono para expandir el nodo.\r\n\t* @property {object} icons.minus - Icono para contraer el nodo.\r\n\t* @property {object} icons.leaf - Icono correspondiente a un nodo hoja.\r\n\t* @property {object} icons.filter - Icono para indicar que el nodo satisface los parámetros de filtrado.\r\n\t* @property {boolean} [parentNodesTooltip=true] - Determina si se debe de mostrar un tooltip para cada nodo, en el cual se representa la jerarquía que ocupa respecto a los padres.\r\n\t* @property {function} [parentNodesTooltipFnc=null] - Función de callback que permite personalizar el tooltip a mostrar.\r\n\t* @property {boolean} [contextMenu=true] - Determina si se muestra el menú contextual para cada nodo.\r\n\t*/jQuery.fn.rup_jqtable.plugins.jerarquia={};jQuery.fn.rup_jqtable.plugins.jerarquia.defaults={treedatatype:'json',formEdit:{addEditOptions:{reloadAfterSubmit:true}},jerarquia:{token:'/',icons:{plus:'ui-icon-triangle-1-se',minus:'ui-icon-triangle-1-e',leaf:'ui-icon-none',filter:'ui-icon-star'},parentNodesTooltip:true,parentNodesTooltipFnc:null,contextMenu:true}};})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Permite relacionar dos tablas de modo que tengan una relación maestro-detalle. De este modo, los resultados de la tabla detalle se muestran a partir del seleccionado en la tabla maestro.\r\n *\r\n * @summary Plugin de edición en línea del componente RUP Table.\r\n * @module rup_jqtable/masterDetail\r\n * @example\r\n *\r\n * $(\"#idComponenteMaestro\").rup_jqtable({\r\n *\turl: \"../jqGridUsuarioMaestro\",\r\n * });\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuarioDetalle\",\r\n * \tusePlugins:[\"masterDetail\"],\r\n * \tinlineEdit:{\r\n * \t\tmaster: \"#idComponenteMaestro\"\r\n * \t\t// Propiedades de configuración del plugin inlineEdit\r\n * \t}\r\n * });\r\n */(function($){jQuery.rup_jqtable.registerPlugin('masterDetail',{loadOrder:10,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureMasterDetail',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la edición de los registros mediante un formulario.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * configureDetailForm(settings): Realiza la configuración interna necesaria para la gestión correcta de la edición mediante un formulario.\r\n\t * deleteElement(rowId, options): Realiza el borrado de un registro determinado.\r\n\t * editElement(rowId, options): Lanza la edición de un registro medainte un formulario de detalle.\r\n\t * newElement(): Inicia el proceso de inserción de un nuevo registro.\r\n\t * showServerValidationFieldErrors(errors): Función encargada de mostrar los errores producidos en la gestión de los datos del mantenimiento.\r\n\t *\r\n\t * Las propiedades de esta extensión almacenadas en el settings son las siguientes:\r\n\t *\r\n\t * settings.$detailForm : Referencia al formulario de detalle mediante el que se realizan las modificaciones e inserciones de registros.\r\n\t * settings.$detailFormDiv : Referencia al div que arropa el formulario de detalle y sobre el que se inicializa el componente rup_dialog.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n \t\t* Metodo que realiza la pre-configuración del plugin masterDetail del componente RUP Table.\r\n \t\t* Este método se ejecuta antes de la incialización del plugin.\r\n \t\t*\r\n \t\t* @name preConfigureMasterDetail\r\n \t\t* @function\r\n \t\t* @param {object} settings - Parámetros de configuración del componente.\r\n \t\t*/preConfigureMasterDetail:function preConfigureMasterDetail(settings){var $self=this,$master;// Obtenemos la referencia del maestro\n$master=jQuery(settings.masterDetail.master);settings.masterDetail.$master=$master;$self.on({'rupTable_serializeGridData.rupTable.masterDetail':function rupTable_serializeGridDataRupTableMasterDetail(events,postData){var masterPkObject=$self.rup_jqtable('getMasterTablePkObject');if(masterPkObject!==null){var jsonParam={'filter':masterPkObject};jQuery.extend(true,postData,jsonParam);}},'jqGridAddEditBeforeSubmit.rupTable.masterDetail':function jqGridAddEditBeforeSubmitRupTableMasterDetail(event,postData,frmoper){var masterPkObject=$self.rup_jqtable('getMasterTablePkObject');if(masterPkObject!==null){jQuery.extend(postData,masterPkObject);}},'rupTable_searchBeforeSubmit.rupTable.masterDetail':function rupTable_searchBeforeSubmitRupTableMasterDetail(event,postData,jsonData){var masterPkObject=$self.rup_jqtable('getMasterTablePkObject');if(masterPkObject!==null){var jsonParam={'filter':masterPkObject};jQuery.extend(true,jsonData,jsonParam);}}});$master.on({'jqGridSelectRow.rupTable.masterDetail':function jqGridSelectRowRupTableMasterDetail(event,rowid,status){var lastRowid=$self.data('tmp.masterDetail.lastRowid');if(lastRowid===undefined||lastRowid!==rowid){if(jQuery.inArray('filter',settings.usePlugins)!==-1){$self.data('tmp.masterDetail.lastRowid',rowid);$self.rup_jqtable('showSearchCriteria');$self.rup_jqtable('filter');}else{$self.rup_jqtable('reloadGrid');}}},'jqGridAfterLoadComplete.multiselection.editRow':function jqGridAfterLoadCompleteMultiselectionEditRow(event,data){if(data.rows.length===0){$self.removeData('tmp.masterDetail.lastRowid');$self.jqGrid('clearGridData');}}});}});jQuery.fn.rup_jqtable('extend',{/**\r\n     * Devuelve un objeto json con la clave primaria del registro correspondiente de la tabla maestra.\r\n     *\r\n     * @function getMasterTablePkObject\r\n\t\t * @param {object} options - Opciones de configuración de la acción de inserción.\r\n\t\t * @return {object} - Objeto json con la clave primaria del registro correspondiente de la tabla maestra\r\n     * @example\r\n     * $(\"#idTable\").rup_jqtable(\"getMasterTablePkObject\");\r\n     */getMasterTablePkObject:function getMasterTablePkObject(){var $self=this,settings=$self.data('settings'),$master=settings.masterDetail.$master,masterPkValue=$master.rup_jqtable('getSelectedRows'),masterPkName=settings.masterDetail.masterPrimaryKey;function nestJSON(key,value){var retObj={};var splitedKey=key.split('.');if(splitedKey.length===1){retObj[key]=value;return retObj;}else{retObj[splitedKey[0]]=nestJSON(key.substr(key.indexOf('.')+1),value);return retObj;}}//Inicio compatibilidad con masterPrimaryKey compuestas\nif($.isArray(masterPkName)&&masterPkName.length>0&&masterPkValue.length===1){var multiplePkToken=$master.rup_jqtable('getGridParam','multiplePkToken');var splitedMasterPkValue=masterPkValue[0].split(multiplePkToken);var retPkObj={};if(splitedMasterPkValue.length===masterPkName.length){$.each(masterPkName,function(index,value){jQuery.extend(true,retPkObj,nestJSON(value,splitedMasterPkValue[index]));});}return retPkObj;//Fin compatibilidad con masterPrimaryKey compuestas\n}else{if(masterPkValue.length===1){return nestJSON(masterPkName,masterPkValue[0]);}else if(masterPkValue.length===0){return null;}}}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t* @description Propiedades de configuración del plugin masterDetail del componente RUP Table.\r\n\t*\r\n\t* @name options\r\n\t*\r\n\t* @property {string} master - Selector jQuery que referencia al componente maestro.\r\n\t* @property {string} masterPrimaryKey -  Clave primaria del componente maestro.\r\n\t*/ // Parámetros de configuración por defecto para la acción de eliminar un registro.\njQuery.fn.rup_jqtable.plugins.masterDetail={};jQuery.fn.rup_jqtable.plugins.masterDetail.defaults={};})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Genera los controles necesarios para permitir al usuario la exportación de los datos mostrados en la tabla.\r\n *\r\n * @summary Plugin de reporting del componente RUP Table.\r\n * @module rup_jqtable/report\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"report\"],\r\n * \treport:{\r\n * \t\t// Propiedades de configuración del report inlineEdit\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización del plugin.\r\n\t *\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n\t *\r\n\t */jQuery.rup_jqtable.registerPlugin('report',{loadOrder:11,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureReport',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureReport',settings);}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión de la generaciónd de informes.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * preConfigureReport(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t * postConfigureReport(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin report del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigureReport\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigureReport:function preConfigureReport(settings){var $self=this;},/**\r\n\t\t* Metodo que realiza la post-configuración del plugin report del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name postConfigureReport\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t* @fires module:rup_jqtable#rupTable_serializeReportData\r\n\t\t*/postConfigureReport:function postConfigureReport(settings){var $self=this,colModel=$self.rup_jqtable('getColModel'),reportsColums,reportSettings=settings.report;reportsColums=$self._getReportColumns(colModel,settings);/*\r\n\t\t\t * INICIALIZACION DE VALORES POR DEFECTO\r\n\t\t\t */ // Inicialización de la toolbar del componente jqtable en caso de que no se especifique\nif(reportSettings.appendTo===undefined){reportSettings.appendTo=settings.toolbar.id;}// Se toman los parámetros columns globales como base para los específicos\njQuery.each(reportSettings.buttons[0].buttons,function(index,element){element.columns=$.extend(true,{},reportSettings.columns,element.columns);if(element.columns.grid===undefined){element.columns.grid=settings.id;}if(element.columns.customNames===undefined){element.columns.customNames=reportsColums;}if(element.columns.click===undefined){element.columns.click=function(){};}});reportSettings.fncGetGridParam=function(){var $self=this,settings=$self.data('settings'),data={},filterData={};jQuery.each($self.jqGrid('getGridParam','postData'),function(index,elem){if(jQuery.inArray(index,settings.report.sendPostDataParams)!==-1){data[index]=elem;}});if(settings.filter!==undefined&&settings.filter.$filterContainer!==undefined){filterData=$self.rup_jqtable('getFilterParams');}jQuery.extend(true,data,filterData);$self.triggerHandler('rupTable_serializeReportData',[data]);return $.rup_utils.unnestjson(data);};/*\r\n\t\t\t * FIN DE INICIALIZACION DE VALORES POR DEFECTO\r\n\t\t\t */jQuery.rup_report(reportSettings);}});jQuery.fn.rup_jqtable('extend',{/**\r\n     * Devuelve las columnas de la tabla para las que se va a generar el informe.\r\n     *\r\n     * @function _processMatchedRow\r\n\t\t * @private\r\n\t\t * @param {object} colModel - colModel correspondiente a la tabla.\r\n\t\t * @param {object} settings - Parámetros de configuración de la página.\r\n\t\t * @return {string[]} - Array con el nombre de las columnas.\r\n     * @example\r\n     * $self._getReportColumns(colModel, settings);\r\n     */_getReportColumns:function _getReportColumns(colModel,settings){return jQuery.map(colModel,function(elem,index){if(jQuery.inArray(elem.name,settings.report.excludeColumns)===-1){return elem.name;}else{return null;}});}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n\t* @description Propiedades de configuración del plugin report del componente RUP Table.\r\n\t*\r\n\t* @name options\r\n\t*\r\n\t* @property {object} [columns] - Permite especificar mediante un array, los identificadores de las columnas que van a ser mostradas en el informe.\r\n\t* @property {string[]} [excludeColumns] - Determina las columnas que van a ser excluidas de la generación del informe.\r\n\t* @property {string[]} [sendPostDataParams] - Parámetros del jqGrid que van a ser enviados en la petición de generación del informe.\r\n\t*/jQuery.fn.rup_jqtable.plugins.report={};jQuery.fn.rup_jqtable.plugins.report.defaults={report:{columns:{},excludeColumns:['rupInfoCol','cb'],sendPostDataParams:['_search','core','nd','page','rows','sidx','sord']}};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n   * Permite asociar un manejador al evento que se produce en el momento en el que se construye el objeto que se envía al servidor para solicitar la generación del informe. Permite la modificación del objeto postData para añadir, modificar o eliminar los parámetros que van a ser enviados.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_serializeReportData\r\n   * @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t * @property {Event} dta - Linea de la tabla destinada a la búsqueda.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_serializeReportData\", function(event, data){ });\r\n   */})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Gestiona las operaciones de filtrado múltiple de datos sobre el origen de datos que utiliza el componente.\r\n *\r\n * @summary Plugin de filtrado múltiple del componente RUP Table.\r\n * @module rup_jqtable/multifilter\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"multifilter\"],\r\n * \tfilter:{\r\n * \t\t// Propiedades de configuración del plugin multifilter\r\n * \t}\r\n * });\r\n */(function($){/**\r\n\t * Definición de los métodos principales que configuran la inicialización\r\n\t * del plugin.\r\n\t *\r\n\t * postConfiguration: Método que se ejecuta después de la invocación del\r\n\t * componente jqGrid.\r\n\t *\r\n\t */jQuery.rup_jqtable.registerPlugin('multifilter',{loadOrder:15,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureMultifilter',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureMultifilter',settings);}});// ********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n// ********************************\n/**\r\n\t * Extensión del componente rup_jqtable para permitir la gestión del filtrado\r\n\t * de registros de la tabla.\r\n\t *\r\n\t * Los métodos implementados son:\r\n\t *\r\n\t * postConfigureFilter(settings): Método que define la preconfiguración\r\n\t * necesaria para el correcto funcionamiento del componente.\r\n\t *\r\n\t * Se almacena la referencia de los diferentes componentes:\r\n\t *\r\n\t * settings.filter.$filterContainer : Contenedor del formulario de filtrado\r\n\t * settings.filter.$filterButton : Botón que realiza el filtrado\r\n\t * settings.filter.$cleanButton : Enlace para limpiar el formulario\r\n\t * settings.filter.$collapsableLayer : Capa que puede ser ocultada/mostrada\r\n\t * settings.filter.$toggleIcon1Id : Control que oculta muestra el fomulario\r\n\t * settings.filter.$filterSummary : Contenedor donde se especifican los\r\n\t * criterios de filtrado\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t\t* Metodo que realiza la pre-configuración del plugin de filtrado múltiple del componente RUP Table.\r\n\t\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t\t*\r\n\t\t\t* @name preConfigureMultifilter\r\n\t\t\t* @function\r\n\t\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t\t*/preConfigureMultifilter:function preConfigureMultifilter(settings){var $self=this,tableId=settings.id,multifilterSettings=settings.multifilter,dropdownDialogId,$dropdownDialog,$dropdownDiaglogTemplate;//definicion de variables con los selectores\nmultifilterSettings.$dropdownDialog=$('#'+settings.id+'_multifilter_dropdownDialog');//definicion de variables con ids\nmultifilterSettings.dropdownDialogId=settings.id+'_multifilter_dropdownDialog';$dropdownDiaglogTemplate=$self.rup_jqtable('getMultifilterDialogTemplate',settings);settings.filter.$filterContainer.after($dropdownDiaglogTemplate);$self.rup_jqtable('configureMultifilter',settings);// configuracion del resumen del filtro para que\n// apareza el nombre del filtro\nsettings.multifilter.fncFilterName=function(searchString){if(multifilterSettings.$comboLabel==undefined){//&& settings.$firstStartUp  && multifilterSettings.$filterDefaultName!=undefined){\nif(multifilterSettings.$filterDefaultName!==undefined)searchString=multifilterSettings.$filterDefaultName+'  {'+searchString+'}   ';}else if(multifilterSettings.$comboLabel!=undefined&&settings.$firstStartUp){if(multifilterSettings.$comboLabel.val()==''&&multifilterSettings.$filterDefaultName!=undefined){if(multifilterSettings.$filterDefaultName!==undefined)searchString=multifilterSettings.$filterDefaultName+'  {'+searchString+'}   ';}}else if(multifilterSettings.$comboLabel.val()!=''&&multifilterSettings.$filterWithName){multifilterSettings.$filterWithName=false;searchString=multifilterSettings.$comboLabel.val()+'  {'+searchString+'}   ';}return searchString;};},/**\r\n\t\t\t* Metodo que realiza la post-configuración del plugin de filtrado múltiple del componente RUP Table.\r\n\t\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t\t*\r\n\t\t\t* @name postConfigureMultifilter\r\n\t\t\t* @function\r\n\t\t\t* @fires module:rup_jqtable#rupTable_multifilter_fillForm\r\n\t\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t\t*/postConfigureMultifilter:function postConfigureMultifilter(settings){var $self=this,multifilterSettings=settings.multifilter,filterSettings,$dropdownButton,$combo,$comboLabel,$defaultCheck,$feedback,$comboButton,$closeDialog,dropdownButtonConfig,xhrArray=[];/*\r\n\t\t\t\t\t\t\t * $(\"#\"+settings.id+\"_multifilter_combo_label\").on(\"change\",\r\n\t\t\t\t\t\t\t * function(){\r\n\t\t\t\t\t\t\t *\r\n\t\t\t\t\t\t\t * if\r\n\t\t\t\t\t\t\t * ($(\"#\"+settings.id+\"_multifilter_combo_label\").val()==\"\"){\r\n\t\t\t\t\t\t\t * $self._toggleButtons(settings.id,false); }else{\r\n\t\t\t\t\t\t\t * $self._toggleButtons(settings.id,true); } });\r\n\t\t\t\t\t\t\t */dropdownButtonConfig=$self[0]._ADAPTER.multifilter.dropdown;settings.filter.$filterButton.rup_button({dropdown:{dropdownIcon:dropdownButtonConfig.dropdownIcon,dropdownDialog:multifilterSettings.dropdownDialogId,dropdownDialogConfig:{title:dropdownButtonConfig.dropdownDialogConfig.title+$.rup.i18n.base.rup_jqtable.plugins.multifilter.tittle,width:'450px',buttons:[{id:settings.id+'_multifilter_BtnSave',\"class\":'btn-outline-primary',text:$.rup.i18n.base.rup_jqtable.plugins.multifilter.save,click:function click(){if($self._checkLabel(settings)){// creo objeto Filter con los datos del formulario del filtro\nvar filter=$self._createFilterFromForm(settings);var bfr=$self.triggerHandler('rupTable_beforeAdd');if(bfr===false||bfr==='stop'){multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.errorValidate,'error');return;}// añado el filtro\n$self.rup_jqtable('addFilter',filter);}}},{id:settings.id+'_multifilter_BtnApply',\"class\":'btn-outline-primary',text:$.rup.i18n.base.rup_jqtable.plugins.multifilter.apply,click:function click(){//Deshabilitar el nombre del filtro en el filterSummary una vez que ha terminado el filtro por defecto\nif(settings.$firstStartUp){settings.$firstStartUp=false;}if($self._checkLabel(settings)){multifilterSettings.$filterWithName=true;var valorFiltro=$self._searchFilterInCombo(settings);if(valorFiltro!=undefined){//limpiamos el filtro\n$self.rup_jqtable('cleanFilterForm');//Cargamos de nuevo el filtro en el formulario del filtro\n// rellenar el formulario del filtro\n$self.triggerHandler('rupTable_multifilter_fillForm',valorFiltro);$self._fillForm(valorFiltro);$self.rup_jqtable('filter');multifilterSettings.$closeDialog.click();}else{multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.errorNoexiste,'error');}//\n//$self.rup_jqtable(\"filter\");\n// crea el tooptip del resumen del filtro\n//var filterCriteria = $self._createTooltip();\n}}},{id:settings.id+'_multifilter_BtnRemove',\"class\":'btn-outline-primary',text:$.rup.i18n.base.rup_jqtable.plugins.multifilter.remove,click:function click(){if($self._checkLabel(settings)){// creo objeto Filter con los datos del formulario del filtro\nvar filter=$self._createFilterFromForm(settings);// borro el filtro\n$self.rup_jqtable('deleteFilter',filter);}}},{text:$.rup.i18n.base.rup_jqtable.plugins.multifilter.cancel,click:function click(){var filtroAnterior=$self.data('filtroAnterior');if(filtroAnterior!=null){//var xhrArray=$.rup_utils.jsontoarray(filtroAnterior);\n$self.rup_jqtable('cleanFilterForm');//$.rup_utils.populateForm(filtroAnterior,settings.filter.$filterForm);\n$self.triggerHandler('rupTable_multifilter_fillForm',filtroAnterior);$self._fillForm(filtroAnterior);}//limpio el filtro del dropdownDIalog\nmultifilterSettings.$comboLabel.val('');multifilterSettings.$closeDialog.click();},btnType:$.rup.dialog.LINK}]}}});//Deshabilitar el nombre del filtro en el filterSummary una vez que ha terminado el filtro por defecto\n$self.on('rupTable_beforeFilter',function(event){/*if (settings.$firstStartUp){\r\n\r\n\t\t\t\t\t\t\t\t\tsettings.$firstStartUp=false;\r\n\t\t\t\t\t\t\t\t}*/});//definincion de variables con los selectores\nmultifilterSettings.$dropdownButton=$('#'+settings.id+'_filter_filterButton_dropdown');multifilterSettings.$combo=$('#'+settings.id+'_multifilter_combo');multifilterSettings.$comboLabel=$('#'+settings.id+'_multifilter_combo_label');multifilterSettings.$comboButton=$('#'+settings.id+'_multifilter_dropdownDialog .rup-combobox-toggle');multifilterSettings.$defaultCheck=$('#'+settings.id+'_multifilter_defaultFilter');multifilterSettings.$feedback=$('#'+settings.id+'_multifilter_dropdownDialog_feedback');multifilterSettings.$closeDialog=$('#closeText_'+settings.id+'_multifilter_dropdownDialog');// dialog modal para no cambiar el filtro mientras\n// se gestionan los mismos\n$('#'+multifilterSettings.dropdownDialogId).rup_dialog('setOption','modal',true);$('#'+multifilterSettings.dropdownDialogId).rup_dialog('setOption','draggable',false);$('#'+multifilterSettings.dropdownDialogId).rup_dialog('setOption','resizable',false);// $('#'+multifilterSettings.dropdownDialogId).parent().addClass(\"rup_multifilter_container\");\n$('#'+multifilterSettings.dropdownDialogId).parent().css('width','500px');multifilterSettings.$dropdownButton.on('click',function(){//guardo el filtroAnterior\nvar valorFiltro=form2object(settings.filter.$filterContainer[0]);xhrArray=$.rup_utils.jsontoarray(valorFiltro);$self.data('filtroAnterior',valorFiltro);//Foco al label al entrar al dialog\nmultifilterSettings.$comboLabel.focus();});$self._configCombo(settings);multifilterSettings.$feedback.rup_feedback({block:false});//gesión por filtroPorDefecto\n//$self.rup_jqtable(\"showSearchCriteria\");\n//if(filtroDefault!=null)\n//$(\"#\"+settings.id+\"_filter_summary\").prepend(filtroDefault.filterName +\" \"+ $(\"#\"+settings.id+\"_filter_summary\").val() );\n//bug IE que al cerrar el dialog con el combo desplegado , la lista del combo sigue abierta\n$('.rup-dropdown-dialog').on('dialogclose',function(){multifilterSettings.$comboLabel.autocomplete('widget').hide();});//la primera vez que cancelas el filtroAnterior es el filtroPorDefecto\nvar valorFiltro=form2object(settings.filter.$filterContainer[0]);xhrArray=$.rup_utils.jsontoarray(valorFiltro);$self.data('filtroAnterior',valorFiltro);//$self.rup_jqtable(\"filter\");\n//settings.filter.$filterButton.trigger(\"click\");\n//$self.triggerHandler(\"rupTable_multifilter_fillForm\",form2object(settings.filter.$filterContainer[0]));\n$self.on({'rupTable_beforeAdd.multifilter.validate':function rupTable_beforeAddMultifilterValidate(){//filterSettings.$filterContainer.rup_validate(\"resetForm\");\nif(multifilterSettings!==undefined){if(!settings.$firstStartUp){return settings.filter.$filterContainer.valid();}else{return null;}}else{return settings.filter.$filterContainer.valid();}}});}});// ********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n// ********************************\n/**\r\n\t * Métodos públicos del plugin filter.\r\n\t *\r\n\t * cleanFilterForm: Realiza una limpieza de los campos del formulario.\r\n\t * filter: Lanza el filtrado de la tabla de acuerdo a los criterios\r\n\t * indicados en el formulario. toggleFilterForm: Método encargado de ocultar\r\n\t * y mostrar el formulario de filtrado.\r\n\t *\r\n\t */jQuery.fn.rup_jqtable('extend',{/**\r\n     * Devuelve la template html empleada para renderizar los controles del formulario de filtrado múltiple.\r\n     *\r\n     * @function  getMultifilterDialogTemplate\r\n\t\t * @param {object} settings - Propiedades de configuración del componente.\r\n\t\t * @return {object} - Objeto jQuery con el contenido html de la template.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"getMultifilterDialogTemplate\", settings);\r\n     */getMultifilterDialogTemplate:function getMultifilterDialogTemplate(settings){var $self=this,multifilterSettings=settings.multifilter;var $dropdownDiaglogTemplate=jQuery('<div id=\"'+multifilterSettings.dropdownDialogId+'\" style=\"display:none\" class=\"rup_multifilter_dropdown\">'+'<div id=\"'+multifilterSettings.dropdownDialogId+'_feedback\"></div>'+'<form>'+'<fieldset class=\"dropdownButton-inputs\">'+'<div id=\"'+multifilterSettings.dropdownDialogId+'_columna_cnt\">'+'<div class=\"form-row\">'+'<div id=\"'+multifilterSettings.dropdownDialogId+'_lineaCombo\"  class=\"form-group fix-align col-sm\">'+'<label for=\"'+settings.id+'_multifilter_combo\" class=\"formulario_linea_label\">'+$.rup.i18n.base.rup_jqtable.plugins.multifilter.filters+'</label>'+'<input id=\"'+settings.id+'_multifilter_combo\" class=\"rup_multifilter_selector\" />'+'</div>'+'</div>'+'<div class=\"form-row\">'+'<div id=\"'+multifilterSettings.dropdownDialogId+'_lineaDefault\" class=\"form-group col-sm\">'+'<label for=\"'+settings.id+'_multifilter_defaultFilter\" class=\"formulario_linea_label\">'+$.rup.i18n.base.rup_jqtable.plugins.multifilter.defaultFilter+'</label>'+'<input type=\"checkbox\" id=\"'+settings.id+'_multifilter_defaultFilter\" class=\"formulario_linea_input form-control\"/>'+'</div>'+'</div>'+'</div>'+'</fieldset>'+'</form>'+'</div>');return $dropdownDiaglogTemplate;},/**\r\n     * Realiza la configuración interna del plugin multifilter a partir de las propiedades de configuración indicadas.\r\n     *\r\n     * @function  configureMultifilter\r\n\t\t * @param {object} settings - Propiedades de configuración del componente.\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"configureMultifilter\", settings);\r\n     */configureMultifilter:function configureMultifilter(settings){var $self=this,multifilterSettings=settings.multifilter,$filterForm;$self.data('settings',settings);settings.filter.$filterForm=$('#'+settings.id+'_filter_form');var options_ejie_combo={source:[{label:'Si',value:'0'},{label:'No',value:'1'}],width:120,blank:''};// jQuery(\"#\"+settings.id+\"_multifilter_combo\").rup_combo(options_ejie_combo);\nvar selector;if(multifilterSettings.idFilter!=null){selector=multifilterSettings.idFilter;}else{selector=settings.id;}var usuario;if(multifilterSettings.userFilter!=null){usuario=multifilterSettings.userFilter;}else{usuario=LOGGED_USER;}var getDefault;if(multifilterSettings.getDefault!=null){getDefault=multifilterSettings.getDefault;}else{getDefault=true;}jQuery('#'+settings.id+'_multifilter_combo').rup_autocomplete({source:settings.baseUrl+'/multiFilter/getAll?filterSelector='+selector+'&user='+usuario,sourceParam:{label:'filterName',value:'filterDefault',data:'filterValue',category:'filter'},method:'GET',contains:false,combobox:true,menuAppendTo:$('#'+multifilterSettings.dropdownDialogId).parent(),appendTo:$('#'+multifilterSettings.dropdownDialogId).parent(),select:function select(){var valorFiltro=$self._searchFilterInCombo(settings);//limpiar Filtro\n//$self.rup_jqtable(\"resetForm\",settings.filter.$filterForm);\n$self.rup_jqtable('cleanFilterForm');// rellenar el formulario del filtro\n//$.rup_utils.populateForm(xhrArray,settings.filter.$filterForm);\n$self.triggerHandler('rupTable_multifilter_fillForm',valorFiltro);$self._fillForm(valorFiltro);//\n}});jQuery('#'+settings.id+'_multifilter_combo_label').on('autocompleteopen',function(){$(this).data('uiAutocomplete').menu.element.css('zIndex',Number($('#'+multifilterSettings.dropdownDialogId).parent().css('zIndex'))+1);if($(this).data('tmp.data')!==undefined){var data=$(this).data('tmp.data');var count=-1;var objeto=$.grep(data,function(obj,i){if(obj.filterDefault){count=i;return obj;}});if(objeto!==undefined){var link=$('#'+settings.id+'_multifilter_combo_menu a:eq('+count+')');link.css('font-weight','bold');}}});$('.jstree').on('rup_filter_treeLoaded',function(event,data){$(this).rup_tree('setRupValue',data);//$self.rup_jqtable(\"showSearchCriteria\");\n});settings.filter.$cleanButton.on('click',function(){multifilterSettings.$combo.rup_autocomplete('set','','');settings.filter.$filterSummary.html('<i></i>');});},/**\r\n     * Función que añade un filtro al multifiltro\r\n     *\r\n     * @function  addFilter\r\n\t\t * @param {object} filter - Objeto json con la información del filtro a añadir.\r\n\t\t * @fires module:rup_jqtable#rupTable_multifilter_beforeAdd\r\n     * @example\r\n     * $(\"#idComponente\").rup_jqtable(\"addFilter\", filter);\r\n     */addFilter:function addFilter(filter){var $self=this;var settings=$self.data('settings');var multifilterSettings=settings.multifilter;// self.data(\"settings\");\nif(multifilterSettings.idFilter!=null){filter.filtro.filterSelector=multifilterSettings.idFilter;}// add Filter\n$.rup_ajax({url:settings.baseUrl+'/multiFilter/add',type:'POST',data:$.toJSON(filter),dataType:'json',showLoading:false,contentType:'application/json',async:false,beforeSend:function beforeSend(xhr,options){return $self.triggerHandler('rupTable_multifilter_beforeAdd',[xhr,options]);},success:function success(data,status,xhr){multifilterSettings.$savedFilterName=data.filterName;multifilterSettings.$savedFilterValue=data.filterValue;multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.ok,'ok');//multifilterSettings.$combo.rup_autocomplete(\"set\",\"\", \"\");\nmultifilterSettings.$comboLabel.data('tmp.loadObjects.term',null);multifilterSettings.$comboLabel.data('loadObjects',{});// $(\"#\"+settings.id+\"_multifilter_combo_label\").data(\"tmp.loadObjects.term\",term);\nmultifilterSettings.$comboLabel.data('tmp.data',{});if(multifilterSettings.$comboLabel.autocomplete('widget').is(':visible')){multifilterSettings.$comboLabel.autocomplete('widget').hide();}},error:function error(xhr,ajaxOptions,thrownError){multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.error,'error');}});},/**\r\n\t\t * Función que elimina un filtro del multifiltro.\r\n\t\t *\r\n\t\t * @function  deleteFilter\r\n\t\t * @param {object} filter - Objeto json con la información del filtro a eliminar.\r\n\t\t * @example\r\n\t\t * $(\"#idComponente\").rup_jqtable(\"deleteFilter\", filter);\r\n\t\t */deleteFilter:function deleteFilter(filter){var $self=this;var settings=$self.data('settings');var multifilterSettings=settings.multifilter;//reiniciar filter salvado\nmultifilterSettings.$savedFilterName=undefined;multifilterSettings.$savedFilterValue=undefined;if(multifilterSettings.idFilter!=null){filter.filtro.filterSelector=multifilterSettings.idFilter;}// delete\n$.rup_ajax({url:settings.baseUrl+'/multiFilter/delete',type:'POST',data:$.toJSON(filter),dataType:'json',showLoading:false,contentType:'application/json',async:false,success:function success(data,status,xhr){multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.ok,'ok');multifilterSettings.$combo.rup_autocomplete('set','','');multifilterSettings.$comboLabel.data('tmp.loadObjects.term',null);multifilterSettings.$comboLabel.data('loadObjects',{});// $(\"#\"+settings.id+\"_multifilter_combo_label\").data(\"tmp.loadObjects.term\",term);\nmultifilterSettings.$comboLabel.data('tmp.data',{});if(multifilterSettings.$comboLabel.autocomplete('widget').is(':visible')){multifilterSettings.$comboLabel.autocomplete('widget').hide();}if(data.filterFeedback=='no_records'){multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.noRecords,'error');}},error:function error(xhr,ajaxOptions,thrownError){multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.error,'error');}});}});// *******************************\n// DEFINICIÓN DE MÉTODOS PRIVADOS\n// *******************************\njQuery.fn.rup_jqtable('extend',{/**\r\n     * Genera el objeto json de datos de filtrado correspondiente al formulario empleado.\r\n     *\r\n     * @function _createFilterFromForm\r\n\t\t * @private\r\n\t\t * @param {object} settings - Propiedades de configuración del componente.\r\n\t\t * @return {object} - Objeto json con la información de filtrado del formulario.\r\n     * @example\r\n     * $self._createFilterFromForm(settings);\r\n     */_createFilterFromForm:function _createFilterFromForm(settings){var multifilterSettings=settings.multifilter;var dataForm=form2object(settings.filter.$filterContainer[0]);//cambiar la fecha a milisegundos para guardar en bd\nvar fecha;$.each($('[ruptype=\\'date\\']',settings.filter.$filterContainer),function(index,item){fecha=$(item).datepicker('getDate');if(fecha!=null)dataForm[item.name]=fecha.getTime().toString();});var dataFormJson=$.toJSON(dataForm);var usuario;if(multifilterSettings.userFilter!=null){usuario=multifilterSettings.userFilter;}else{usuario=LOGGED_USER;}var filter={filtro:{filterSelector:settings.id,filterName:multifilterSettings.$comboLabel.val(),filterValue:dataFormJson,filterDefault:multifilterSettings.$defaultCheck.is(':checked'),filterUser:usuario}};return filter;},/**\r\n     * Inicializa el combo de selección de filtrado a aplicar en el fomulario.\r\n     *\r\n     * @function _configCombo\r\n\t\t * @private\r\n\t\t * @param {object} settings - Propiedades de configuración del componente.\r\n     * @example\r\n     * $self._configCombo(settings);\r\n     */_configCombo:function _configCombo(settings){var multifilterSettings=settings.multifilter;multifilterSettings.$comboLabel.on('change',function(){settings.filter.$filterSummary.html('<i></i>');});// si el filtro es el predefinido que aparezca en negrita\nmultifilterSettings.$comboLabel.data('uiAutocomplete')._renderItem=function(ul,item){return $('<li></li>').data('item.autocomplete',item).append('<a>'+item.label+'</a>').appendTo(ul);};jQuery('#'+settings.id+'_multifilter_combo_label').on('rupAutocomplete_loadComplete',function(event,data){var count=-1;var objeto=$.grep(data,function(obj,i){if(obj.filterDefault){count=i;return obj;}});if(objeto!==undefined){var link=$('#'+settings.id+'_multifilter_combo_menu a:eq('+count+')');link.css('font-weight','bold');}});multifilterSettings.$comboLabel.off('blur click');multifilterSettings.$comboLabel.attr('placeholder',$.rup.i18n.base.rup_jqtable.plugins.multifilter.input);multifilterSettings.$comboLabel.on('blur',function(event){// Obtener datos de si viene de\n// seleccionar elemento o si el\n// menú de selección está\n// desplegado\nvar selected=multifilterSettings.$combo.data('selected'),isShowingMenu=$('.ui-autocomplete:visible').length>0?true:false;// Borrar índicador de que viene\n// de seleccionar elemento\nmultifilterSettings.$combo.data('selected',false);// Si es un evento de teclado\n// pero no es ENTER, omitir esta\n// función\nif(event.type==='keydown'&&event.keyCode!==13){return true;}if(isShowingMenu===true&&event.type==='keydown'){multifilterSettings.$combo.focus();event.stopPropagation();return true;}var autoCompObject=$(event.currentTarget),loadObjects=multifilterSettings.$comboLabel.data('loadObjects');if(settings.getText==true){if(loadObjects[autoCompObject.val()]!==undefined){multifilterSettings.$combo.val(autoCompObject.val());multifilterSettings.$combo.attr('rup_autocomplete_label',autoCompObject.val());}else{multifilterSettings.$combo.val(autoCompObject.val());multifilterSettings.$combo.attr('rup_autocomplete_label',autoCompObject.val());}}else{if(loadObjects[autoCompObject.val()]!==undefined){multifilterSettings.$combo.val(loadObjects[autoCompObject.val()]);multifilterSettings.$combo.attr('rup_autocomplete_label',loadObjects[autoCompObject.val()]);}else{autoCompObject.autocomplete('close');}}// Si el evento es ENTER y viene\n// de seleccionar un elemento o\n// el menú se estaba mostrando,\n// omitir resto de funciones\n// (ej. buscar)\nif(event.type==='keydown'&&event.keyCode===13&&(selected||isShowingMenu)){return false;}});multifilterSettings.$comboButton.off('click mousedown');multifilterSettings.$comboButton.on('blur',function(){if(multifilterSettings.$comboLabel.autocomplete('widget').is(':visible')){multifilterSettings.$comboLabel.autocomplete('widget').hide();}});multifilterSettings.$comboButton.on('click',function(){if(multifilterSettings.$comboLabel.autocomplete('widget').is(':visible')){multifilterSettings.$comboLabel.autocomplete('widget').hide();}else{multifilterSettings.$comboLabel.autocomplete('search','');multifilterSettings.$comboLabel.autocomplete('widget').show();multifilterSettings.$comboLabel.autocomplete('widget').trigger('focus');}});},//\t\t\t\t\t\t_toggleButtons : function(id, visibles) {\n//\n//\t\t\t\t\t\t\tif (visibles == false) {\n//\t\t\t\t\t\t\t\t$(\"#\" + id + \"_multifilter_BtnSave\").button(\n//\t\t\t\t\t\t\t\t\t\t\"disable\");\n//\t\t\t\t\t\t\t\t$(\"#\" + id + \"_multifilter_BtnApply\").button(\n//\t\t\t\t\t\t\t\t\t\t\"disable\");\n//\t\t\t\t\t\t\t\t$(\"#\" + id + \"_multifilter_BtnRemove\").button(\n//\t\t\t\t\t\t\t\t\t\t\"disable\");\n//\n//\t\t\t\t\t\t\t} else {\n//\t\t\t\t\t\t\t\t$(\"#\" + id + \"_multifilter_BtnSave\").button(\n//\t\t\t\t\t\t\t\t\t\t\"enable\");\n//\t\t\t\t\t\t\t\t$(\"#\" + id + \"_multifilter_BtnApply\").button(\n//\t\t\t\t\t\t\t\t\t\t\"enable\");\n//\t\t\t\t\t\t\t\t$(\"#\" + id + \"_multifilter_BtnRemove\").button(\n//\t\t\t\t\t\t\t\t\t\t\"enable\");\n//\t\t\t\t\t\t\t}\n//\t\t\t\t\t\t},\n/**\r\n     * Valida el label que se introduce asociado al filtrado que se va a añadir.\r\n     *\r\n     * @function _checkLabel\r\n\t\t * @private\r\n\t\t * @param {object} settings - Propiedades de configuración del componente.\r\n\t\t * @return {boolean} - Devuelve si es válido o no el nombre introducido para el filtro.\r\n     * @example\r\n     * $self._configCombo(settings);\r\n     */_checkLabel:function _checkLabel(settings){var multifilterSettings=settings.multifilter;if($.trim(multifilterSettings.$comboLabel.val())==''){multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.emptyName,'error');return false;}else if(multifilterSettings.$comboLabel.val().length>settings.multifilter.labelSize){multifilterSettings.$feedback.rup_feedback('set',$.rup.i18n.base.rup_jqtable.plugins.multifilter.tooLong,'error');return false;}return true;},/**\r\n     * Devuelve el json de filtrado asociado al filtro seleccionado en el combo.\r\n     *\r\n     * @function _searchFilterInCombo\r\n\t\t * @private\r\n\t\t * @param {object} settings - Propiedades de configuración del componente.\r\n\t\t * @return {object} - Json de filtrado asociado al filtro seleccionado en el combo.\r\n     * @example\r\n     * $self._searchFilterInCombo(settings);\r\n     */_searchFilterInCombo:function _searchFilterInCombo(settings){var multifilterSettings=settings.multifilter,xhrArray=[];var name=$('#'+settings.id+'_multifilter_combo_label').val();// var listaFiltros = $(\"#\" + this.id+\n// \"_label\").data(\"tmp.data\");\nvar listaFiltros=$('#'+settings.id+'_multifilter_combo_label').data('tmp.data');// Busco el valor del filtro\nvar objFiltro=$.grep(listaFiltros,function(obj,i){if(obj.label==name)return obj;});// si es filtro por defecto,\n// checkeo el check \"Filtro\n// por defecto\"\nif(objFiltro.length!=0){multifilterSettings.$defaultCheck.attr('checked',objFiltro[0].filterDefault);var valorFiltro=$.parseJSON(objFiltro[0].value);// $.map(valorFiltro,function(item) {\n// xhrArray[item.name] = item.value;\n// });\nxhrArray=$.rup_utils.jsontoarray(valorFiltro);}if(valorFiltro==undefined&&multifilterSettings.$savedFilterName!=undefined){if(multifilterSettings.$savedFilterName===name)var valorFiltro=$.parseJSON(multifilterSettings.$savedFilterValue);}return valorFiltro;},/**\r\n\t\t * Inicializa los campos del formulario con los valores correspondientes al filtro seleccionado.\r\n\t\t *\r\n\t\t * @function _fillForm\r\n\t\t * @private\r\n\t\t * @param {object} filtroNuevo - Objeto json con los valores de filtrado.\r\n\t\t * @example\r\n\t\t * $self._fillForm(data);\r\n\t\t */_fillForm:function _fillForm(filtroNuevo){var $self=this;var settings=$self.data('settings');//cambiar milisengudos a fecha (el formato de bd del  fecha es milisegundos)\n$('[ruptype=\\'date\\']',settings.filter.$filterContainer).each(function(index,elem){var $campo=jQuery(elem);var fechaString;var jsonFecha=filtroNuevo[elem.name];if(jsonFecha!=undefined){if(jsonFecha.search('/')==-1){var dateFromJson=new Date(parseInt(jsonFecha));var dateFormat=$campo.data('datepicker').settings.dateFormat;if($campo.data('datepicker').settings.datetimepicker){// Cuando es fecha-hora\nvar dateObj={hour:dateFromJson.getHours(),minute:dateFromJson.getMinutes(),second:dateFromJson.getSeconds()};fechaString=$.datepicker.formatDate(dateFormat,dateFromJson)+' '+$.timepicker._formatTime(dateObj,'hh:mm:ss');}else{// Solo fecha\nfechaString=$.datepicker.formatDate(dateFormat,dateFromJson);}filtroNuevo[elem.name]=fechaString;}}});// Formatear datos\n// var valorFiltro = $.parseJSON(filtroNuevo);\nvar xhrArray=$.rup_utils.jsontoarray(filtroNuevo);// evento antes de rellenar el form\n// $self.triggerHandler(\"rupTable_multifilter_fillForm\",filtroNuevo);\n// rellenar el formulario\n$.rup_utils.populateForm(xhrArray,$(this.selector+'_filter_form'));// $self._fillForm(filtroNuevo);\n// $self.rup_jqtable(\"filter\");\n}});// *******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n// *******************************************************\n/**\r\n\t * Parámetros de configuración por defecto para el plugin filter.\r\n\t *\r\n\t */ /**\r\n\t* @description Propiedades de configuración del plugin multifilter del componente RUP Table.\r\n\t*\r\n\t* @name options\r\n\t*\r\n\t* @property {string} [idFilter] - Permite asignar un identificador al filtro. Debe ser único para toda la aplicación. En caso de no asignar un id, se asigna el selector del rup_jqtable.\r\n\t* @property {string} labelSize - Permite especificar el tamaño máximo permitido para el nombre del filtro. Es una propiedad obligatoria.\r\n\t* @property {string} [userFilter] - En caso de que la aplicación donde se tiene que implementar el multifiltro no implemente la variable LOGGED_USER, para conservar el usuario identificado, con este parámetro permite asignar un identificador de usuario alternativo.\r\n\t* @property {boolean} [getDefault=true] - Determina si el multifiltro debe de cargar el filtro por defecto al cargar la página.\r\n\t*/jQuery.fn.rup_jqtable.plugins.multifilter={};jQuery.fn.rup_jqtable.plugins.multifilter.defaults={multifilter:{}};/* ********* */ /* EVENTOS\r\n  /* ********* */ /**\r\n   *  Evento lanzado justo antes de añadir un filtro.\r\n   *\r\n   * @event module:rup_jqtable#rupTable_multifilter_beforeAdd\r\n   * @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t * @property {Event} xhr - Objecto XHR empleado en la petición AJAX de nuevo filtro.\r\n\t * @property {Event} options - Opciones de comfiguración de la petición AJAX de nuevo filtro.\r\n   * @example\r\n   * $(\"#idComponente\").on(\"rupTable_multifilter_beforeAdd\", function(event, xhr, options){ });\r\n   */ /**\r\n\t\t* Evento ejecutado cuando se rellenar el formulario del filtro. Cada vez que se cancela, limpia o se selecciona un filtro se lanza este evento.\r\n\t\t*\r\n\t\t* @event module:rup_jqtable#rupTable_multifilter_fillForm:\r\n\t\t* @property {Event} event - Objeto Event correspondiente al evento disparado.\r\n\t\t* @property {Event} filterData - Valor del filtro.\r\n\t\t* @example\r\n\t\t* $(\"#idComponente\").on(\"rupTable_multifilter_fillForm:\", function(event, filterData){ });\r\n\t\t*/})(jQuery);/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */ /*global jQuery */ /**\r\n * Proporciona al componente RUP Table ciertas funcionalidades responsive.\r\n *\r\n * @summary Plugin de toolbar del componente RUP Table.\r\n * @module rup_jqtable/responsive\r\n * @example\r\n *\r\n * $(\"#idComponente\").rup_jqtable({\r\n * \turl: \"../jqGridUsuario\",\r\n * \tusePlugins:[\"responsive\"],\r\n * \tresponsive:{\r\n * \t\t// Propiedades de configuración del plugin responsive\r\n * \t}\r\n * });\r\n */(function($){/**\r\n   * Definición de los métodos principales que configuran la inicialización del plugin.\r\n   *\r\n   * preConfiguration: Método que se ejecuta antes de la invocación del componente jqGrid.\r\n   * postConfiguration: Método que se ejecuta después de la invocación del componente jqGrid.\r\n   *\r\n   */jQuery.rup_jqtable.registerPlugin('responsive',{loadOrder:20,preConfiguration:function preConfiguration(settings){var $self=this;return $self.rup_jqtable('preConfigureResponsive',settings);},postConfiguration:function postConfiguration(settings){var $self=this;return $self.rup_jqtable('postConfigureResponsive',settings);}});$.extend($.rup,{jqtable:{responsive:{'SCREEN_SM':768,'SCREEN_MD':992,'SCREEN_LG':1200}}});//********************************\n// DEFINICIÓN DE MÉTODOS PÚBLICOS\n//********************************\n/**\r\n   * Extensión del componente rup_jqtable para permitir la gestión de la botonera asociada a la tabla.\r\n   *\r\n   * Los métodos implementados son:\r\n   *\r\n   * preConfigureFeedback(settings): Método que define la preconfiguración necesaria para el correcto funcionamiento del componente.\r\n   * postConfigureFeedback(settings): Método que define la postconfiguración necesaria para el correcto funcionamiento del componente.\r\n   *\r\n   * settings.$feedback : Referencia al componente feedback.\r\n   * settings.$$internalFeedback : Referencia al feedback interno.\r\n   *\r\n   *\r\n   */$.extend($.jgrid,{// \tsetGridWidth: function(nwidth, shrink){\n// \tdebugger;\n// \t}\n});jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Metodo que realiza la pre-configuración del plugin responsive del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name preConfigureResponsive\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/preConfigureResponsive:function preConfigureResponsive(settings){var $self=this;},/**\r\n\t\t* Metodo que realiza la post-configuración del plugin responsive del componente RUP Table.\r\n\t\t* Este método se ejecuta antes de la incialización del plugin.\r\n\t\t*\r\n\t\t* @name postConfigureResponsive\r\n\t\t* @function\r\n\t\t* @param {object} settings - Parámetros de configuración del componente.\r\n\t\t*/postConfigureResponsive:function postConfigureResponsive(settings){var $self=this,$fluidBaseLayer,currentDisplay,currentDisplayIndex;settings.fluid.baseLayer=$.rup_utils.getJQueryId(settings.fluid.baseLayer!==null?settings.fluid.baseLayer:settings.id+'_div');settings.fluid.$baseLayer=jQuery(settings.fluid.baseLayer);if(settings.fluid.$baseLayer.length===0){alert('El identificador '+settings.baseLayer+' especificado para la capa sobre la que se va a aplicar el diseño líquido no existe.');return;}$fluidBaseLayer=settings.fluid.fluidBaseLayer=settings.fluid.$baseLayer;// Tratamiento del evento de redimiensionado del diseño líquido de la tabla\n$(window).on('resize',function(event,previousWidth,currentWidth){if($self.is(':visible')){var feedBackPaddingLeft,feedBackPaddingRight,toolbarPaddingLeft,toolbarPaddingRight,windowWidth,rwdConfigArray;windowWidth=$(window).width();if(windowWidth>$.rup.jqtable.responsive.SCREEN_LG){currentDisplay='lg';}else if(windowWidth>$.rup.jqtable.responsive.SCREEN_MD){currentDisplay='md';}else if(windowWidth>$.rup.jqtable.responsive.SCREEN_SM){currentDisplay='sm';}else{currentDisplay='xs';}rwdConfigArray=$self.rup_jqtable('getRwdColConfig');$.each(rwdConfigArray,function(i,obj){if(obj[currentDisplay]===true){$self.rup_jqtable('showCol',obj.name);}else{$self.rup_jqtable('hideCol',obj.name);}});//$self.trigger(\"rupTable_fluidUpdate\");\n//$self.setGridWidth(currentWidth);\n// Se redimensionan las capas contenidas en el mantenimiento\n//$fluidBaseLayer.children().width(currentWidth);\n//\t\t\t\t\t\tprop.searchForm.parent().width(currentWidth+3)\n// Se redimensiona el feedback\n// if (settings.$feedback){\n// \tfeedBackPaddingLeft = parseInt(settings.$feedback.css(\"padding-left\"));\n// \tfeedBackPaddingRight = parseInt(settings.$feedback.css(\"padding-right\"));\n// \tsettings.$feedback.width(currentWidth - (feedBackPaddingLeft+feedBackPaddingRight));\n// }\n// Se redimensiona la toolbar\n// if (settings.$toolbar){\n// \ttoolbarPaddingLeft = parseInt(settings.$toolbar.css(\"padding-left\"));\n// \ttoolbarPaddingRight = parseInt(settings.$toolbar.css(\"padding-right\"));\n// \tsettings.$toolbar.width(currentWidth - (toolbarPaddingLeft+toolbarPaddingRight));\n// \tsettings.$toolbar.css(\"width\", currentWidth - (toolbarPaddingLeft+toolbarPaddingRight));\n// }\n}});function intNum(val,defval){val=parseInt(val,10);if(isNaN(val)){return defval||0;}return val;}function reDefineColWidth(){var $self=this;var widthsArr=$self[0].p.colModel.map(function(i,elem){return i.width;});for(var j=0;j<widthsArr.length;j++){$('.ui-jqgrid-labels > th:eq('+j+')').css('width',widthsArr[j]);$self.find('tr').find('td:eq('+j+')').each(function(){$(this).css('width',widthsArr[j]);});}}function setColWidth(){//console.log(\"entra\");\nvar initwidth=0,ts=this[0],grid=this[0],brd=$.jgrid.cell_width?0:intNum(ts.p.cellLayout,0),vc=0,lvc,scw=intNum(ts.p.scrollOffset,0),cw,hs=false,aw,gw=0,cl=0,cr;$.each(ts.p.colModel,function(){if(this.hidden===undefined){this.hidden=false;}if(ts.p.grouping&&ts.p.autowidth){var ind=$.inArray(this.name,ts.p.groupingView.groupField);if(ind!==-1){this.hidden=!ts.p.groupingView.groupColumnShow[ind];}}this.widthOrg=cw=intNum(this.width,0);if(this.hidden===false){initwidth+=cw+brd;if(this.fixed){gw+=cw+brd;}else{vc++;}cl++;}});if(isNaN(ts.p.width)){ts.p.width=initwidth+(ts.p.shrinkToFit===false&&!isNaN(ts.p.height)?scw:0);}grid.width=ts.p.width;ts.p.tblwidth=initwidth;if(ts.p.shrinkToFit===false&&ts.p.forceFit===true){ts.p.forceFit=false;}if(ts.p.shrinkToFit===true&&vc>0){aw=grid.width-brd*vc-gw;if(!isNaN(ts.p.height)){aw-=scw;hs=true;}initwidth=0;$.each(ts.p.colModel,function(i){if(this.hidden===false&&this.fixed!==true){//console.log(\"->\" + this.name + \" - hidden:\" + this.hidden + \" - fixed: \" + this.fixed + \" -  tblwidth: \" + ts.p.tblwidth + \" - width: \" + this.width);\ncw=Math.round(aw*this.width/(ts.p.tblwidth-brd*vc-gw));this.width=cw;initwidth+=cw;lvc=i;}});cr=0;if(hs){if(grid.width-gw-(initwidth+brd*vc)!==scw){cr=grid.width-gw-(initwidth+brd*vc)-scw;}}else if(!hs&&Math.abs(grid.width-gw-(initwidth+brd*vc))!==1){cr=grid.width-gw-(initwidth+brd*vc);}ts.p.colModel[lvc].width+=cr;ts.p.tblwidth=initwidth+cr+brd*vc+gw;if(ts.p.tblwidth>ts.p.width){ts.p.colModel[lvc].width-=ts.p.tblwidth-parseInt(ts.p.width,10);ts.p.tblwidth=ts.p.width;}}}function resize(){$self.css('width','100%');$self.parents('.ui-jqgrid-bdiv').css('width','100%');$self.parents('.ui-jqgrid-view').css('width','100%');$self.parents('.ui-jqgrid').css('width','100%');$self.parents('.ui-jqgrid').find('.ui-jqgrid-htable').css('width','100%');$self.parents('.ui-jqgrid').find('.ui-jqgrid-htable').parents('.ui-jqgrid-hbox').css('width','100%');$self.parents('.ui-jqgrid').find('.ui-jqgrid-hdiv').css('width','100%');$self.parents('.ui-jqgrid').find('.ui-jqgrid-pager').css('width','100%');if($self.data('settings').$toolbar){$self.data('settings').$toolbar.css('width','100%');}$.proxy(setColWidth,$self)();$.proxy(reDefineColWidth,$self)();}$self.on('jqGridAfterLoadComplete',function(){$.proxy(resize,$self)();});$(window).on('resize',function(){$.proxy(resize,$self)();});// $self.fluidWidth({\n// \tfluidBaseLayer:settings.fluid.baseLayer,\n// \tminWidth: 100,\n// \tmaxWidth: 2000,\n// \tfluidOffset : 0\n// });\n//\n// // $self.fluidWidth(settings.fluid);\n// //\n// $self.on(\"rupTable_fluidUpdate\", function(event){\n// \t$.proxy(resize,$self)();\n// });\n}});jQuery.fn.rup_jqtable('extend',{/**\r\n\t\t* Obtiene a partir de la configuración del colModel, la información correspondiente al comportamiento responsive de las columnas.\r\n\t\t*\r\n\t\t* @name getRwdColConfig\r\n\t\t* @function\r\n\t\t* @return {object[]} - Configuración responsive para las columnas de la tabla.\r\n\t\t*/getRwdColConfig:function getRwdColConfig(){var $self=this,rwdCols,retJson={},retArray=[],jsonAux={},colRwdClasses,splitAux,splitAux2;rwdCols=$.grep($self.rup_jqtable('getColModel'),function(obj,i){return obj['rwdClasses'];});$.each(rwdCols,function(i,obj){colRwdClasses=obj.rwdClasses;jsonAux={name:obj.name,xs:true,sm:true,md:true,lg:true};splitAux=colRwdClasses.split(' ');//console.log(\"name:\" + obj.name);\nfor(var i=0;i<splitAux.length;i++){splitAux2=splitAux[i].split('-');//  console.log(\"splitAux2:\" + splitAux2[0]);\n//console.log(\"splitAux2:\" + splitAux2[1]);\nif(splitAux2[0]==='hidden'){jsonAux[splitAux2[1]]=false;}}retArray.push(jsonAux);});//console.log(retArray);\nreturn retArray;}});//*******************************************************\n// DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n//*******************************************************\n/**\r\n \t* @description Propiedades de configuración del plugin responsive del componente RUP Table.\r\n \t*\r\n \t* @name options\r\n \t*\r\n \t* @property {object} [fluid] - Parametros de configuración\r\n \t* @property {string[]} [excludeColumns] - Determina las columnas que van a ser excluidas de la generación del informe.\r\n \t* @property {string[]} [sendPostDataParams] - Parámetros del jqGrid que van a ser enviados en la petición de generación del informe.\r\n \t*/jQuery.fn.rup_jqtable.plugins.responsive={};jQuery.fn.rup_jqtable.plugins.responsive.defaults={// autowidth:true,\nfluid:{baseLayer:null,minWidth:100,maxWidth:2000,fluidOffset:0},toolbar:{autoAjustToolbar:false,width:'87.6%'}};// jQuery.fn.rup_jqtable.plugins.toolbar.defaults = {\n// \ttoolbar:{\n// \t\tautoAjustToolbar:false\n// \t}\n// };\n})(jQuery);});});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.jqtable.js?");

/***/ }),

/***/ "./src/rup.lang.js":
/*!*************************!*\
  !*** ./src/rup.lang.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/*\r\n\t Plugin que genera la combo de idiomas con el siguiente formato.\r\n\t\t<ul>\r\n\t\t\t<li id=\"idiomaActivo\" class=\"activo\">Castellano </li>\r\n\t\t\t<li id=\"enlace\" class=\"ultimo cambio_idioma\" >\r\n\t\t\t\t<a href=\"#\">Cambiar Idioma</a>\r\n\t\t\t</li>\r\n\t\t\t<li id=\"listado\" class=\"ultimo cambio_idioma_desplegado\" style=\"display: none;\">\r\n\t\t\t\t<div  class=\"caja_idiomas\">\r\n\t\t\t\t\t<a id=\"caja_listado\" class=\"opcion_cambio\" >Cambiar Idioma</a>\r\n\t\t\t\t\t<div class=\"listado_idiomas\">\r\n\t\t\t\t\t\t<a id=\"cerrar\" class=\"cerrar_idiomas\" href=\"#\" title=\"Cerrar\"><span class=\"hidden\">Cerrar</span></a>\r\n\r\n\t\t\t\t\t\t<ul class=\"principal\">\r\n\t\t\t\t\t\t\t\t<li id=\"idioma_es\" class=\"activo\">\r\n\t\t\t\t\t\t\t\t\t<a class=\"idioma\">Castellano</a>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t<li id=\"idioma_eu\">\r\n\t\t\t\t\t\t\t\t\t<a class=\"idioma\">Euskera</a>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t </div>\r\n\t\t\t\t </div>\r\n\t\t\t</li>\r\n\t\t</ul>\r\n*/\n\n/**\r\n * El componente de idioma esta diseñado para permitir al usuario elegir, de forma intuitiva, el idioma en el que se presenta la aplicación.\r\n *\r\n * @summary Componente RUP Language.\r\n * @module rup_language\r\n * @example\r\n * var properties={\r\n *   // Propiedades de configuración\r\n * };\r\n *\r\n * $(\"#idlanguage\").rup_language(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./rup.tooltip */ \"./src/rup.tooltip.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.widget('$.rup_language', {\n    options: {\n      languages: null,\n      active: null,\n      modo: 'default' //portal\n\n    },\n\n    /**\r\n     * Función encargada de crear en el DOM los elementos necesarios para el componente.\r\n     *\r\n     * @function\t_create\r\n     * @private\r\n     */\n    _create: function _create() {\n      var _this = this;\n\n      global.initRupI18nPromise.then(function () {\n        var active;\n        _this.options.active = $.rup.lang == null ? '[lang]' : $.rup.lang;\n        active = _this.options.active;\n        _this.options.languages = $.rup.AVAILABLE_LANGS.split(',');\n        var self = _this.element,\n            aChangeLang = $(\"\\n                        <a id=\\\"rup_language_choice\\\" class=\\\"rup-language_change_option\\\">\\n                            \".concat($.rup.i18nParse($.rup.i18n.base, 'rup_language.changeLanguage'), \"\\n                        </a>\\n                    \")); // Obtener el parámetro HDIV_STATE (en caso de no estar disponible se devolverá vacío)\n\n        var hdivStateParam = $.fn.getHDIV_STATE(true); //gestion de estilos de jquery-ui\n\n        $(self).addClass('ui-widget');\n\n        if (_this.options.modo === 'default') {\n          var $parent = self.parent(),\n              $langCurrentText = self.find('[data-rup-lang-current]'),\n              $languagesDropdown;\n          $parent.addClass('dropdown');\n          self.addClass('dropdown-toggle').attr({\n            'data-toogle': 'dropdown',\n            'aria-haspopup': 'true',\n            'aria-expanded': 'false'\n          });\n          $langCurrentText.text($.rup.i18nParse($.rup.i18n.base, 'rup_language.' + _this.options.active));\n          $languagesDropdown = $parent.find('[aria-labelledby=' + self.attr('id') + ']');\n          $.each(_this.options.languages, function (key, value) {\n            value = value.replace(/^\\s*|\\s*$/g, '');\n            var txt = $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + value);\n            $languagesDropdown.append($(\"\\n                            <a href=\\\"\".concat('?' + $.rup.LOCALE_PARAM_NAME + '=' + value + hdivStateParam, \"\\\" class=\\\"dropdown-item\\\">\").concat(txt, \"</a>\\n                        \")));\n          });\n          $parent.append($languagesDropdown);\n        } else if (_this.options.modo === 'portal') {\n          var ul = $('<ul>').addClass('rup-language_portal'),\n              lng_lenght = $(_this.options.languages).length;\n          $.each(_this.options.languages, function (key, value) {\n            value = value.replace(/^\\s*|\\s*$/g, '');\n            var txt = $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + value + '_short');\n\n            if (value !== active) {\n              var title = $.rup.i18nParse($.rup.i18n.base, 'rup_language.changeLanguageLiteral_' + value) + $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + value);\n              $(\"\\n                                <li>\\n                                    <a href=\\\"\".concat('?' + $.rup.LOCALE_PARAM_NAME + '=' + value + hdivStateParam, \"\\\"\\n                                        class=\\\"rup-language_portal_list ui-corner-all\\\"\\n                                        title=\\\"\").concat(title, \"\\\">\\n                                        \").concat(txt, \"\\n                                    </a>\\n                                </li>\\n                            \")).appendTo(ul);\n            } else {\n              var _title = $.rup.i18nParse($.rup.i18n.base, 'rup_language.changeLanguageLiteral') + $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + value);\n\n              $(\"\\n                                <li class=\\\"ui-state-active\\\">\\n                                    <a href=\\\"javascript:void(0);\\\"\\n                                        class=\\\"rup-language_portal_list_active ui-corner-all\\\"\\n                                        title=\\\"\".concat(_title, \"\\\">\\n                                        \").concat(txt, \"\\n                                    </a>\\n                                </li>\\n                            \")).appendTo(ul);\n            } //div.appendTo(ulPrincipal);\n\n\n            if (key < lng_lenght - 1) {\n              ul.append($('<div>').html('|').addClass('rup-language_portal_separator'));\n            }\n          });\n          self.append(ul);\n        } else if (_this.options.modo === 'classic' || _this.options.modo === 'jquery-ui') {\n          // Carga de los valores por defecto para los atributos que no ha introducido el usuario\n          var _ul = $('<ul>').attr('id', 'ulGeneral'),\n              liIdiomaActivo = $('<li>').attr('id', 'rup_active_language').addClass('rup-language_active').text($.rup.i18nParse($.rup.i18n.base, 'rup_language.' + _this.options.active)).attr('title', $.rup.i18nParse($.rup.i18n.base, 'rup_language.changeLanguageLiteral') + $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + active)),\n              liEnlace = $('<li>').addClass('rup-language_change').attr('id', 'rup_language_link'),\n              liListado = $('<li>').attr('id', 'rup_language_list').addClass('rup-language_change_opened').css('visibility', 'hidden'),\n              divCajaIdiomas = $('<div>'),\n              listadoIdiomas = $('<div>').addClass('rup-language_language_list'),\n              cerrarIdioma = $('<a>').addClass('rup-language_close_languages').attr('id', 'rup_language_close').attr('href', '#').attr('title', $.rup.i18nParse($.rup.i18n.base, 'rup_language.closingLiteral')).html($.rup.i18nParse($.rup.i18n.base, 'rup_global.cerrar')),\n              ulPrincipal = $('<ul>');\n\n          _ul.append(liIdiomaActivo);\n\n          $('<a>').attr('href', '#').text($.rup.i18nParse($.rup.i18n.base, 'rup_language.changeLanguage')).appendTo(liEnlace);\n\n          _ul.append(liEnlace);\n\n          divCajaIdiomas.append(aChangeLang);\n          listadoIdiomas.append(cerrarIdioma);\n          $.each(_this.options.languages, function (key, value) {\n            value = value.replace(/^\\s*|\\s*$/g, '');\n            var liIdioma = $('<li>').attr('id', 'rup_language_lng_' + value),\n                txt = $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + value);\n\n            if (value !== active) {\n              $('<a>').appendTo(liIdioma).attr('href', '?' + $.rup.LOCALE_PARAM_NAME + '=' + value + hdivStateParam).text(txt).attr('title', $.rup.i18nParse($.rup.i18n.base, 'rup_language.changeLanguageLiteral_' + value) + $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + value));\n            } else {\n              //hacemos que sea el lenguage actual el activo\n              $('<a>').appendTo(liIdioma).attr('href', 'javascript:void(0);').text(txt).attr('title', $.rup.i18nParse($.rup.i18n.base, 'rup_language.changeLanguageLiteral') + $.rup.i18nParse($.rup.i18n.base, 'rup_language.' + value));\n            }\n\n            liIdioma.appendTo(ulPrincipal);\n          });\n          listadoIdiomas.append(ulPrincipal);\n          divCajaIdiomas.append(listadoIdiomas);\n          liListado.append(divCajaIdiomas);\n\n          _ul.append(liListado);\n\n          self.append(_ul);\n          var ajust = listadoIdiomas.css('width', '0.8em').width();\n          var saveMargin = liEnlace.css('margin-right');\n          liEnlace.css('margin-right', '0px');\n          listadoIdiomas.width(liListado.position().left - ajust);\n          listadoIdiomas.css('padding-left', '0.6em');\n          listadoIdiomas.css('padding-right', '0.2em');\n          listadoIdiomas.css('top', liIdiomaActivo.height() - 1);\n          liListado.hide();\n          liListado.css('visibility', '');\n          liEnlace.css('margin-right', saveMargin); //se aplica el lenguage actual el activo\n\n          $('#rup_language_lng_' + $.rup.lang).addClass('ui-state-active'); //evento click para mostrar el listado de idiomas\n\n          liEnlace.click(function () {\n            liEnlace.hide();\n            liListado.show();\n            $('.rup-language_language_list').find('li:not(.rup-language_language_list_active)').first().children('a').focus();\n          }); //evento del enlace de cambio de idioma\n\n          aChangeLang.click(function () {\n            liListado.hide();\n            liEnlace.show();\n          }); //evento del boton de cerrar\n\n          cerrarIdioma.click(function () {\n            liListado.hide();\n            liEnlace.show();\n          }); // gestion de eventos del raton sobre la parte del cambio de idioma\n\n          liListado.mouseenter(function () {\n            self.one('mouseleave', function () {\n              liListado.hide();\n              liEnlace.show();\n            });\n          });\n          self.on('keydown', function (event) {\n            switch (event.keyCode) {\n              case $.ui.keyCode.UP:\n                if ($(event.target).parent().prevAll('li:not(.rup-language_language_list_active)').length > 0) {\n                  $(event.target).parent().prevAll('li:not(.rup-language_language_list_active)').first().children().focus();\n                } else {\n                  $(event.target).parent().siblings('li:not(.rup-language_language_list_active)').last().children().focus();\n                }\n\n                break;\n\n              case $.ui.keyCode.DOWN:\n                if ($(event.target).parent().nextAll('li:not(.rup-language_language_list_active)').length > 0) {\n                  $(event.target).parent().nextAll('li:not(.rup-language_language_list_active)').first().children().focus();\n                } else {\n                  $(event.target).parent().siblings('li:not(.rup-language_language_list_active)').first().children().focus();\n                }\n\n                break;\n\n              case $.ui.keyCode.ESCAPE:\n                liListado.hide();\n                liEnlace.show();\n                break;\n\n              default:\n            }\n          });\n        } // Se aplica el tooltip\n\n\n        self.find('[title]').rup_tooltip({\n          'applyToPortal': true\n        }); //Se audita el componente\n\n        $.rup.auditComponent('rup_lang', 'init');\n      });\n    },\n\n    /**\r\n     * Modifica las opciones de configuración del componente.\r\n     *\r\n     * @function\t_setOption\r\n     * @private\r\n     */\n    _setOption: function _setOption() {\n      $.Widget.prototype._setOption.apply(this, arguments);\n    },\n\n    /**\r\n     * Elimina el componente.\r\n     *\r\n     * @function\tdestroy\r\n     * @example\r\n     * $(\"#idlanguage\").rup_language(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      $.Widget.prototype.destroy.apply(this, arguments);\n    }\n  });\n  /**\r\n   * Opciones por defecto de configuración del componente.\r\n   * @name defaults\r\n   *\r\n   * @property {object} languages - Conjunto de idiomas que serán gestionados con el componente. El listado de los mismos, por configuración general, se gestiona a través de la variable jQuery “$.rup.AVAILABLE_LANGS_ARRAY”. Para mas información, consultar el documento “Anexo-Gestion_idiomatica.doc” de la documentación de UDA.\r\n   * @property {string} [modo] - Determina el tipo de maquetación que utilizara el componente para presentar las diferentes opciones idiomáticas. Si el valor especificado es “portal”, los idiomas se presentaran en un listado horizontal separado por barras (ver ejemplo visual del capítulo/Sección “2. Ejemplo”). En cualquier otro caso, se mostrara el modo por defecto (ver ejemplo visual del capítulo/Sección “2. Ejemplo”).\r\n   */\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.lang.js?");

/***/ }),

/***/ "./src/rup.list.js":
/*!*************************!*\
  !*** ./src/rup.list.js ***!
  \*************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global, jQuery) {/* harmony import */ var printd__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! printd */ \"./node_modules/printd/index.js\");\n/* harmony import */ var printd__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(printd__WEBPACK_IMPORTED_MODULE_0__);\n/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/* eslint-disable no-console */\n\n/**\r\n * Presenta los elementos que presenta una tabla rup_table en formato listado. Pensado para movilidad.\r\n *\r\n * @summary Componente RUP List.\r\n * @module rup_list\r\n * @example\r\n * $('#rup-list').rup_list({\r\n *      action: '/demo/list/filter',\r\n *      filterForm: 'listFilterForm',\r\n *      feedback: 'rup-list-feedback',\r\n *      visiblePages: 3,\r\n *      key: 'codigoPK',\r\n *      selectable: {\r\n *          multi: true,\r\n *          selector: '.list-item'\r\n *      },\r\n *      sidx: {\r\n *          source: [{\r\n *              value: 'USUARIO',\r\n *              i18nCaption: 'Usuario'\r\n *          }, {\r\n *              value: 'EDAD',\r\n *              i18nCaption: 'Edad'\r\n *          }, {\r\n *              value: 'CODCLIENTE',\r\n *              i18nCaption: 'Codigo cliente'\r\n *          }],\r\n *          value: 'EDAD,USUARIO'\r\n *      },\r\n *      rowNum: {\r\n *          source: [{\r\n *              value: '5',\r\n *              i18nCaption: 'Cinco'\r\n *          }, {\r\n *              value: '10',\r\n *              i18nCaption: 'Diez'\r\n *          }, {\r\n *              value: '20',\r\n *              i18nCaption: 'Veinte'\r\n *          }],\r\n *          value: '5'\r\n *      },\r\n *      isMultiSort: true,\r\n *      modElement: (ev, item, json) => {\r\n *          var userVal = item.find('#usuario_value_' + json.codigoPK);\r\n *          userVal.text(userVal.text() + ' -Added');\r\n *      },\r\n *      beforeLoad: () => {},\r\n *      load: () => {}\r\n * });\r\n */\n\n(function (factory) {\n  if (typeof define === 'function' && __webpack_require__(/*! !webpack amd options */ \"./node_modules/webpack/buildin/amd-options.js\")) {\n    // AMD. Register as an anonymous module.\n    define(['jquery', 'rup.base', 'rup.button', 'rup.autocomplete', 'rup.dialog'], factory);\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n})(function ($) {\n  //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  /**\r\n   * @description Opciones por defecto de configuración del componente.\r\n   * @name defaults\r\n   * @property {String} [action=null] - Determina la url contra la que se hacen las llamadas del listado.\r\n   * @property {String} [filterForm=null] - Determina el selector del formulario de filtrado del listado.\r\n   * @property {String} [feedback=null] - Determina el selector del feedback.\r\n   * @property {Number} [visiblePages=5] - Determina el número de páginas que serán visibles desde la paginación (mínimo 3).\r\n   * @property {String} [key=null] - Determina el identificador de cada tarjeta que vendrá especificado en el JSON.\r\n   * @property {Object} [rowNum=Object] - Determina la configuracion de la seleccion de elementos por página.\r\n   * @property {Object} [sidx = Object] - Determina los campos por los que se podrán ordenar los elementos\r\n   * @property {String} [sord=null] - Determina la dirección de la ordenación\r\n   * @property {Number} [page=1] - Determina página en la que se inicia por defecto\r\n   * @property {boolean} [createFooter=true] - Si es true crea una copia del header en la parte inferior del listado\r\n   * @property {String} [sord=null] - Determina la dirección de la ordenación\r\n   * @property {Funcion} [modElement=() =>{}] - Callback que se ejecuta antes del añadido de cada tarjeta al listado\r\n   * @property {Funcion} [beforeLoad=() => {}] - Callback que se ejecuta antes de cada filtrado\r\n   * @property {Funcion} [load=() => {}] - Callback que se ejecuta tras cada filtrado\r\n   * @property {Object} [selectable=Object] - Determina la configuración de la selección\r\n   * @property {boolean} [isMultiSort=false] - Si es true el modo de ordenación cambia a multiordenación\r\n   * @property {boolean} [isScrollList=false] - Si es true quita la paginación a favor de una carga dinámica de las tarjetas\r\n   *\r\n   */\n\n  /**\r\n   * @description Opciones por defecto de configuración de rowNum\r\n   * @name defaultsRowNum\r\n   *\r\n   * @property {Array} [sorce=Array] - Es un array de objetos con las propiedades value e i18nCaption que serán los elementos disponibles para la seleccion de los elementos por página\r\n   * @property {String} [value=5] - Valor del source por defecto\r\n   */\n\n  /**\r\n   * @description Opciones por defecto de configuración de sidx\r\n   * @name defaultsSidx\r\n   *\r\n   * @property {Array} [sorce=Array] - Es un array de objetos con las propiedades value e i18nCaption que serán los elementos disponibles para la seleccion de la ordenacion.\r\n   * @property {String} [value=5] - Valor del source por defecto. En caso de ser multiOrdenacion se pueden añadir campos separados por comas\r\n   */\n\n  /**\r\n   * @description Opciones por defecto de configuración de selectable\r\n   * @name defaultsSelectable\r\n   *\r\n   * @property {boolean} [multi=null] - Si es true será de selección múltiple, de ser false será de seleccion simple.\r\n   * @property {selector} [value=null] - Selctor JQuery sobre el que se deberá hacer click para seleccionar o deseleccionar elementos.\r\n   */\n\n  /**\r\n   * @description Eventos lanzados sobre rup-list\r\n   * @name defaultsEvents\r\n   *\r\n   * @property [initComplete] - Se lanza una vez el componente ha sido inicializado.\r\n   * @property [listAfterMultiselection] - Se lanza tras finalizar operaciones de multiseleccion desde el desplegable.\r\n   * @property [rup_list-mord-inited] - Se lanza una vez se ha inicializado la característica de multiorder\r\n   * @property [rup_list-mord-changed] - Se lanza cuando se vería la multiordenación\r\n   */\n  $.widget('$.rup_list', {\n    isFiltering: $.Deferred(),\n    options: {\n      filterForm: null,\n      action: null,\n      feedback: null,\n      key: null,\n      colNames: {\n        source: [],\n        value: null\n      },\n      rowNum: {\n        source: [{\n          value: '5',\n          i18nCaption: '5'\n        }, {\n          value: '10',\n          i18nCaption: '10'\n        }, {\n          value: '20',\n          i18nCaption: '20'\n        }, {\n          value: '30',\n          i18nCaption: '30'\n        }],\n        value: '5'\n      },\n      page: 1,\n      sidx: {\n        source: [],\n        value: null\n      },\n      sord: 'asc',\n      visiblePages: 5,\n      createFooter: true,\n      loader: function loader() {},\n      modElement: function modElement() {},\n      beforeLoad: function beforeLoad() {},\n      load: function load() {}\n    },\n\n    /**\r\n     * Método interno para cambiar el valor de algunas opciones\r\n     *\r\n     * @name _changeOption\r\n     * @private\r\n     * @function\r\n     * @param {String} key\r\n     * @param {*} value\r\n     */\n    _changeOption: function _changeOption(key, value) {\n      var opciones = this.options;\n\n      switch (key) {\n        case 'rowNum':\n          opciones.rowNum.value = value;\n          opciones.page = 1;\n          this.reload();\n          break;\n\n        case 'page':\n          opciones.page = value;\n          this.reload();\n          break;\n\n        case 'sidx':\n          opciones.sidx.value = value;\n          opciones.page = 1;\n          this.reload();\n          break;\n\n        case 'sord':\n          opciones.sord = value;\n          opciones.page = 1;\n          this.reload();\n          break;\n      }\n    },\n\n    /**\r\n     * Método interno que valida que el esqueleto html es válido para el componente\r\n     * @name _validateSkeleton\r\n     * @private\r\n     * @function\r\n     */\n    _validateSkeleton: function _validateSkeleton() {\n      var id = this.element.attr('id');\n\n      if (this.options.selectable && this.options.selectable.multi) {\n        return $('#' + id + '-header-selectables').length;\n      }\n\n      return $('#' + id + '-content').length && $('#' + id + '-header').length && $('select').filter(function () {\n        return this.id == id + '-header-rowNum';\n      }).length && $('select').filter(function () {\n        return this.id == id + '-header-sidx';\n      }).length && $('button, a').filter(function () {\n        return this.id == id + '-header-sord';\n      }).length && $('nav, div').filter(function () {\n        return this.id == id + '-header-nav';\n      }).length && $('#' + id + '-itemTemplate').length;\n    },\n\n    /**\r\n     * Método interno que configura el componente\r\n     * @name _create\r\n     * @private\r\n     * @function\r\n     */\n    _create: function _create() {\n      var _this = this;\n\n      global.initRupI18nPromise.then(function () {\n        var self = _this;\n        var selfId = self.element.attr('id');\n\n        if (!self._validateSkeleton()) {\n          $.rup_messages('msgAlert', {\n            title: $.rup.i18n.base.rup_list.errors.validateSkeletonDialog.title,\n            message: $.rup.i18n.base.rup_list.errors.validateSkeletonDialog.msg\n          });\n          console.error($.rup.i18n.base.rup_list.errors.validateSkeletonDialog.msg);\n          return;\n        }\n\n        var opciones = self.options;\n        $(self.element).addClass('rup_list'); // A11Y\n\n        $(self.element).attr('role', 'listbox');\n        $(self.element).attr('aria-live', 'polite');\n\n        if (opciones.selectable && opciones.selectable.multi) {\n          $(self.element).attr('aria-multiselectable', 'true');\n        } else {\n          $(self.element).attr('aria-multiselectable', 'false');\n        } // Si el número de páginas visibles se ha definido menor que 3 se eleva a 3 que es el mínimo\n\n\n        opciones.visiblePages = opciones.visiblePages < 3 ? 3 : opciones.visiblePages;\n        /**\r\n         * CONTENT\r\n         */\n\n        opciones._idContent = selfId + '-content';\n        opciones._content = $('#' + opciones._idContent);\n\n        opciones._content.addClass('rup_list-content');\n\n        opciones._content.hide();\n        /**\r\n         * OVERLAY (Lock & Unlock)\r\n         */\n\n\n        self._loader.apply(self);\n        /**\r\n         * FEEDBACK\r\n         */\n\n\n        opciones.feedback = $('#' + opciones.feedback).rup_feedback({\n          gotoTop: false\n        });\n        opciones.feedback.addClass('rup_list-feedback');\n        /**\r\n         * TEMPLATE\r\n         */\n\n        opciones._idItemTemplate = selfId + '-itemTemplate';\n        opciones._itemTemplate = $('#' + opciones._idItemTemplate);\n\n        opciones._itemTemplate.addClass('rup_list-itemTemplate');\n\n        opciones._itemTemplate.hide();\n\n        opciones._itemTemplate.attr('aria-hidden', 'true');\n        /**\r\n         * HEADER & FOOTER\r\n         */\n\n\n        var populateHeaderFooterOpts = function populateHeaderFooterOpts(isFooter) {\n          var idObj = isFooter ? '_idListFooter' : '_idListHeader';\n          var obj = isFooter ? '_footer' : '_header';\n          var label = isFooter ? '-footer' : '-header'; // HEADER ELEMENTS IDs MAP\n\n          opciones[idObj] = {};\n          opciones[idObj].multiSort = {};\n          opciones[idObj].header = selfId + label;\n          opciones[idObj].pagenav = selfId + label + '-nav';\n          opciones[idObj].pagePrev = selfId + label + '-page-prev';\n          opciones[idObj].pageNext = selfId + label + '-page-next';\n          opciones[idObj].pagenav = selfId + label + '-nav';\n          opciones[idObj].rowNum = selfId + label + '-rowNum';\n          opciones[idObj].sidx = selfId + label + '-sidx';\n          opciones[idObj].sord = selfId + label + '-sord';\n          opciones[idObj].selectables = selfId + label + '-selectables'; // HEADER $OBJECTS MAP\n\n          opciones[obj] = {};\n          opciones[obj].obj = $('#' + opciones[idObj].header);\n          opciones[obj].multiSort = {};\n          opciones[obj].pagenav = $('#' + opciones[idObj].pagenav);\n          opciones[obj].pagePrev = $('#' + opciones[idObj].pagePrev);\n          opciones[obj].pageNext = $('#' + opciones[idObj].pageNext);\n          opciones[obj].rowNum = $('#' + opciones[idObj].rowNum);\n          opciones[obj].sidx = $('#' + opciones[idObj].sidx);\n          opciones[obj].sord = $('#' + opciones[idObj].sord);\n          opciones[obj].selectables = $('#' + opciones[idObj].selectables); // HEADER $OBJECTS CLASS ASSIGNMENT\n\n          opciones[obj].obj.addClass('rup_list' + label);\n          opciones[obj].pagenav.addClass('rup_list' + label + '-nav');\n          opciones[obj].pagePrev.addClass('rup_list' + label + '-page-prev');\n          opciones[obj].pageNext.addClass('rup_list' + label + '-page-next');\n          opciones[obj].rowNum.addClass('rup_list' + label + '-rowNum');\n          opciones[obj].sidx.addClass('rup_list' + label + '-sidx');\n          opciones[obj].sord.addClass('rup_list' + label + '-sord');\n          opciones[obj].selectables.addClass('rup_list' + label + '-selectables');\n        };\n\n        populateHeaderFooterOpts();\n\n        if (opciones.createFooter) {\n          var footerHTML = $('<div>').append(opciones._header.obj.clone()).html().replace(/header/g, 'footer');\n          $('#' + selfId).after(footerHTML);\n        }\n\n        populateHeaderFooterOpts(true);\n        /**\r\n         * MULTISORT DIALOG\r\n         */\n\n        opciones._idMultiSortDialog = selfId + '-mord-dialog';\n        /**\r\n         * ROWNUM\r\n         */\n\n        self._rownumInit.apply(self);\n        /**\r\n         * SORT - MULTISORT\r\n         */\n\n\n        if (!opciones.isMultiSort) {\n          // Sidx select to rup-combo\n          self._sidxComboInit.apply(self); // Inicialización sord\n\n\n          self._sordButtonInit(self);\n        } else {\n          // Inicialización del multisort\n          self._multisortInit.apply(self);\n        } // Asociación de eventos\n\n\n        $('#' + self.element[0].id).on('beforeLoad', opciones.beforeLoad);\n        $('#' + self.element[0].id).on('load', opciones.load);\n        $('#' + self.element[0].id).on('modElement', function (e, item, json) {\n          opciones.modElement(e, item, json);\n          self.element.append(item);\n        });\n        /**\r\n         * PAGENAV\r\n         */\n\n        self._pagenavInit.apply(self);\n        /**\r\n         * SELECT/MULTISELECT\r\n         */\n\n\n        if (opciones.selectable) {\n          opciones._header.selectables.show();\n\n          if (opciones.createFooter) {\n            opciones._footer.selectables.show();\n          }\n\n          self._selectablesInit.apply(self);\n        } else {\n          opciones._header.selectables.hide();\n\n          if (opciones.createFooter) {\n            opciones._footer.selectables.hide();\n          }\n        }\n        /**\r\n         * SCROLL LIST\r\n         */\n\n\n        if (opciones.isScrollList) {\n          self._scrollListInit.apply(self);\n        }\n        /**\r\n         * PRINT\r\n         */\n\n\n        if (opciones.print) {\n          self._print.apply(self);\n        }\n        /**\r\n         * MULTIFILTER\r\n         */\n\n\n        if (opciones.isMultiFilter) {\n          self._multiFilter.apply(self);\n        }\n\n        self.isFiltering.resolve();\n        /** \r\n         * INIT COMPLETE EVENT\r\n         */\n\n        if (opciones.isMultisort) {\n          $('#' + self.element[0].id).on('rup_list-mord-inited', function () {\n            $('#' + self.element[0].id).trigger('initComplete');\n          });\n        } else {\n          $('#' + self.element[0].id).trigger('initComplete');\n        } //Se audita el componente\n\n\n        $.rup.auditComponent('rup_list', 'init');\n      })[\"catch\"](function (error) {\n        console.error('Error al inicializar el componente:\\n', error);\n      });\n    },\n\n    /**\r\n     * Método interno que inicializa el listado con seleccionables\r\n     * @name _selectablesInit\r\n     * @private\r\n     * @function\r\n     */\n    _selectablesInit: function _selectablesInit() {\n      var self = this;\n      var opciones = self.options;\n      $('#' + self.element[0].id + '-content').find(opciones.selectable.selector).attr('rup-list-selector', 'enabled');\n      opciones.multiselection = {\n        selectedIds: null,\n        selectedAll: false,\n        selectedRowsPerPage: null\n      };\n\n      if (opciones.selectable.multi) {\n        self._generateSelectablesBtnGroup();\n      }\n\n      var isControl = false,\n          isShift = false,\n          modeAll;\n\n      if (opciones.isSuperSelect) {\n        $(document).on('keydown', function (e) {\n          if (e.keyCode == '17') {\n            isControl = true;\n          } else if (e.keyCode == '16') {\n            isShift = true;\n          }\n        });\n        $(document).on('keyup', function (e) {\n          if (e.keyCode == '17') {\n            isControl = false;\n          } else if (e.keyCode == '16') {\n            isShift = false;\n          }\n        });\n      }\n\n      opciones._content.find(opciones.selectable.selector).on('click keyup', function (e) {\n        var $clickedEl = $(e.currentTarget);\n\n        if (e.type === 'click' || e.type === 'keyup' && (e.keyCode == '13' || e.keyCode == '32')) {\n          var clickedPK = $clickedEl.data('pk');\n\n          if (opciones.multiselection.selectedIds == null) {\n            opciones.multiselection.selectedIds = [];\n          }\n\n          if (opciones.multiselection.selectedRowsPerPage == null) {\n            opciones.multiselection.selectedRowsPerPage = [];\n          }\n\n          if (opciones.multiselection.selectedAll) {\n            modeAll = true;\n          } else {\n            modeAll = false;\n          }\n\n          if (opciones.isSuperSelect) {\n            if (isShift && isControl) {\n              if (opciones.multiselection.selectedIds[opciones.multiselection.selectedIds.length - 1]) {\n                var posicionClicked = getPosicion(opciones.multiselection.selectedIds[opciones.multiselection.selectedIds.length - 1], clickedPK);\n                var newRangeLastClickedPK = opciones.multiselection.selectedIds[opciones.multiselection.selectedIds.length - 1];\n\n                if (posicionClicked[0] > posicionClicked[1]) {\n                  deselect($clickedEl, newRangeLastClickedPK, modeAll);\n                  selectRange(newRangeLastClickedPK, clickedPK, modeAll);\n                } else {\n                  selectRange(newRangeLastClickedPK, clickedPK, modeAll);\n                }\n              } else {\n                select($clickedEl, modeAll);\n              }\n            } else if (!isShift && isControl) {\n              if (opciones.multiselection.selectedIds.includes(clickedPK)) {\n                deselect($clickedEl, modeAll);\n              } else {\n                select($clickedEl, modeAll);\n              }\n            } else if (isShift && !isControl) {\n              if (opciones.multiselection.selectedIds[opciones.multiselection.selectedIds.length - 1]) {\n                var _newRangeLastClickedPK = opciones.multiselection.selectedIds[0];\n                deselectRest(modeAll);\n                selectRange(_newRangeLastClickedPK, clickedPK, modeAll);\n              } else {\n                select($clickedEl, modeAll);\n              }\n            } else if (!isShift && !isControl) {\n              if (opciones.multiselection.selectedIds.includes(clickedPK)) {\n                deselect($clickedEl, modeAll);\n              } else {\n                deselectRest(modeAll);\n                select($clickedEl, modeAll);\n              }\n            }\n          } else {\n            if (opciones.multiselection.selectedIds.includes(clickedPK)) {\n              deselect($clickedEl, modeAll);\n            } else {\n              select($clickedEl, modeAll);\n            }\n          }\n        }\n      });\n\n      var select = function select($clickedEl, modeAll) {\n        var clickedPK = $clickedEl.data('pk');\n\n        if (!opciones.selectable.multi) {\n          opciones.multiselection.selectedAll = false;\n          opciones.multiselection.selectedIds = [];\n          opciones.multiselection.selectedRowsPerPage = [];\n          self.element.find('.rup_list-item-selected').each(function (i, e) {\n            $(e).removeClass('rup_list-item-selected');\n            $(e).attr('aria-selected', 'false');\n          });\n        }\n\n        opciones.multiselection.selectedRowsPerPage.push({\n          id: clickedPK,\n          line: function () {\n            var cont = 0;\n            var _final = 0;\n            self.element.children().toArray().forEach(function (element) {\n              if (element.id == $clickedEl.attr('id')) {\n                _final = cont;\n              }\n\n              cont++;\n            });\n            return _final;\n          }(),\n          page: function () {\n            if (opciones.isScrollList) {\n              return 1;\n            } else {\n              return opciones.page;\n            }\n          }()\n        });\n        opciones.multiselection.selectedIds.push(clickedPK);\n\n        if (!modeAll) {\n          $clickedEl.addClass('rup_list-item-selected');\n          $clickedEl.attr('aria-selected', 'true');\n        } else {\n          $clickedEl.removeClass('rup_list-item-selected');\n          $clickedEl.removeClass('aria-selected', 'false');\n        }\n      };\n\n      var deselect = function deselect($clickedEl, modeAll) {\n        var clickedPK = $clickedEl.data('pk');\n        var index = opciones.multiselection.selectedIds.indexOf(clickedPK);\n        opciones.multiselection.selectedIds.splice(index, 1);\n        opciones.multiselection.selectedRowsPerPage = opciones.multiselection.selectedRowsPerPage.filter(function (elem) {\n          return elem.id != clickedPK;\n        });\n\n        if (!modeAll) {\n          $clickedEl.removeClass('rup_list-item-selected');\n          $clickedEl.attr('aria-selected', 'false');\n        } else {\n          $clickedEl.addClass('rup_list-item-selected');\n          $clickedEl.attr('aria-selected', 'true');\n        }\n      };\n\n      var deselectRest = function deselectRest(modeAll) {\n        var deselectRestItem = function deselectRestItem(index) {\n          var item2SelectPk = String(opciones.content[index][opciones.key]);\n          var deselectRestItem = self.element.find('.rup_list-item').filter(function (i, e) {\n            return $(e).data('pk') == item2SelectPk;\n          });\n\n          if (!modeAll) {\n            deselectRestItem.removeClass('rup_list-item-selected');\n            deselectRestItem.attr('aria-selected', 'false');\n          } else {\n            deselectRestItem.addClass('rup_list-item-selected');\n            deselectRestItem.attr('aria-selected', 'true');\n          }\n        };\n\n        if (!modeAll) {\n          opciones.multiselection.selectedAll = false;\n        } else {\n          opciones.multiselection.selectedAll = true;\n        }\n\n        opciones.multiselection.selectedIds = [];\n        opciones.multiselection.selectedRowsPerPage = [];\n\n        for (var i = 0; i < opciones.content.length; i++) {\n          deselectRestItem(i);\n        }\n      };\n\n      var selectRange = function selectRange(lastClickedPK, clickedPK, modeAll) {\n        var selectRangeItem = function selectRangeItem(index) {\n          var item2SelectPk = String(opciones.content[index][opciones.key]);\n\n          if (!opciones.multiselection.selectedIds.includes(item2SelectPk)) {\n            var $item2Select = $('.rup_list-item').filter(function (i, e) {\n              return $(e).data('pk') == item2SelectPk;\n            });\n            select($item2Select, modeAll);\n          }\n        };\n\n        var posicionClicked = getPosicion(lastClickedPK, clickedPK);\n\n        if (posicionClicked[0] > posicionClicked[1]) {\n          for (var i = posicionClicked[1]; i <= posicionClicked[0]; i++) {\n            selectRangeItem(i);\n          }\n        } else {\n          for (var _i = posicionClicked[1]; _i >= posicionClicked[0]; _i--) {\n            selectRangeItem(_i);\n          }\n        }\n      };\n\n      var getPosicion = function getPosicion(lastClickedPK, clickedPK) {\n        var posicionClicked = {};\n\n        for (var i = 0; i < opciones.content.length; i++) {\n          if (opciones.content[i][opciones.key] == clickedPK) {\n            posicionClicked[0] = i;\n          } else if (opciones.content[i][opciones.key] == lastClickedPK) {\n            posicionClicked[1] = i;\n          }\n        }\n\n        return posicionClicked;\n      };\n    },\n\n    /**\r\n     * Método interno que crea el scrollList\r\n     * @name _scrollListInit\r\n     * @private\r\n     * @function\r\n     */\n    _scrollListInit: function _scrollListInit() {\n      var self = this;\n      self.options.stepLoad = self.element.children().length / self.options.rowNum.value;\n      self.options.stepOnLoad = false;\n      self.options.stepCounter = 0;\n      $(self.element).on('scrollListPageNext', function () {\n        return self.options.page++;\n      });\n      $(self.element).on('scrollListPagePrev', function () {\n        return self.options.page--;\n      });\n      $(window).on('scroll', function () {\n        var windowHeight = document.documentElement.clientHeight,\n            targetOpciones = self.element[0].getBoundingClientRect(),\n            targetHeight = targetOpciones.height,\n            targetTopPoint = targetOpciones.top,\n            targetButtomPoint = targetHeight + targetTopPoint + 150;\n        self.options.stepLoad = self.element.children().length / self.options.rowNum.value;\n\n        if (self.options.stepLoad == self.options.page) {\n          if (targetButtomPoint < windowHeight) {\n            self.options.stepCounter++;\n\n            if (self.options.stepCounter == 1) {\n              if (self.element.children().length <= self.options.rowNum.value * self.options.page) {\n                if (!self.options.stepOnLoad) {\n                  self.options.stepOnLoad = true;\n\n                  self._lock();\n\n                  $(self.element).trigger('scrollListPageNext');\n                  $.when(self.isFiltering).done(function () {\n                    // Reiniciar la promesa de filtrado\n                    delete self.isFiltering;\n                    self.isFiltering = $.Deferred();\n\n                    self._doFilter();\n                  });\n                }\n              }\n            }\n          }\n        }\n      });\n    },\n\n    /**\r\n     * Método que aplica el modo 'sticky' al header\r\n     * @name _headerSticky\r\n     * @private\r\n     * @function\r\n     */\n    _headerSticky: function _headerSticky() {\n      var self = this;\n      var opciones = self.options;\n      $(window).on('resize', function () {\n        opciones._header.obj.css('width', self.element.css('width'));\n      });\n      $(window).on('scroll', function () {\n        if ($('.rup-navbar.navbar').hasClass('rup-navbar-sticky')) {\n          window.scrollHeight = $('.rup-navbar').height();\n        } else {\n          window.scrollHeight = 0;\n        }\n\n        var targetOpciones = opciones._header.obj[0].getBoundingClientRect(),\n            targetTopPoint = targetOpciones.top;\n\n        if (opciones._header.obj.hasClass('rup_list-sticky')) {\n          targetOpciones = self.element[0].getBoundingClientRect();\n          targetTopPoint = targetOpciones.top;\n        }\n\n        opciones._header.obj.css('width', self.element.css('width'));\n\n        if (targetTopPoint < window.scrollHeight) {\n          opciones._header.obj.addClass('rup_list-sticky');\n\n          self.element.css({\n            'padding-top': opciones._header.obj[0].offsetHeight\n          });\n\n          opciones._header.obj.css({\n            'top': window.scrollHeight\n          });\n        } else if (targetTopPoint >= window.scrollHeight) {\n          if (opciones._header.obj.hasClass('rup_list-sticky')) {\n            opciones._header.obj.removeClass('rup_list-sticky');\n\n            self.element.css({\n              'padding-top': 0\n            });\n\n            opciones._header.obj.css({\n              'top': 0\n            });\n          }\n        }\n      });\n    },\n\n    /**\r\n     * Método que crea el loader\r\n     * @name _loader\r\n     * @private\r\n     * @function\r\n     */\n    _loader: function _loader() {\n      var self = this;\n      var opciones = self.options;\n      var selfId = self.element.attr('id');\n\n      if (!opciones._overlay) {\n        opciones._idOverlay = selfId + '-overlay';\n        opciones._overlay = jQuery('<div id=\"' + opciones._idOverlay + '\" class=\"rup_list-overlay\"></div>');\n\n        opciones._overlay.append('<div class=\"rup_list-overlay-layer\"></div>').append('<div class=\"rup_list-overlay-loader\"></div>');\n      }\n\n      opciones.loader(opciones._overlay);\n    },\n\n    /**\r\n     * Método que lanza la impresión HTML\r\n     * @name _print\r\n     * @private\r\n     * @function\r\n     */\n    _print: function _print() {\n      var self = this;\n      var opciones = self.options;\n\n      if ($('#' + opciones.filterForm).find('#listPrint').length == 0) {\n        opciones.btnPrint = $('<button id=\"listPrint\">Imprimir</button>');\n        opciones.btnPrint.appendTo($('#' + opciones.filterForm));\n        opciones.btnPrint[0].disabled = true;\n        opciones.btnPrint.on('click', btnPrintMain);\n      }\n\n      function btnPrintMain(e) {\n        e.preventDefault();\n        var doc = new printd__WEBPACK_IMPORTED_MODULE_0___default.a(),\n            printDoc = $('<div id=\"print-doc\"></div>'),\n            printTagStyle = $('<link>', {\n          'id': 'rup-list-link-print',\n          'rel': 'stylesheet',\n          // 'media': 'print',\n          'href': opciones.print\n        }),\n            sidx = '',\n            sord = '';\n\n        if (opciones.isMultiSort) {\n          sidx = opciones.multiorder.sidx;\n          sord = opciones.multiorder.sord;\n        } else {\n          sidx = opciones.sidx.value;\n          sord = opciones.sord;\n        } // Si el formulario de filtrado indicado es correcto se parsea\n\n\n        var filterForm = {};\n\n        if ($(\"form[id=\\\"\".concat(opciones.filterForm, \"\\\"]\")).length == 1) {\n          filterForm = $('#' + opciones.filterForm).rup_form('formToJson');\n        }\n\n        var filter = {\n          filter: filterForm,\n          page: 1,\n          rows: opciones.records,\n          sidx: sidx,\n          sord: sord,\n          multiselection: opciones.multiselection,\n          core: {\n            pkNames: [opciones.key],\n            pkToken: '~'\n          }\n        };\n        printDoc.append(printTagStyle);\n        jQuery.rup_ajax({\n          url: opciones.action,\n          type: 'POST',\n          dataType: 'json',\n          data: JSON.stringify(filter),\n          contentType: 'application/json',\n          success: function success(xhr) {\n            if (!opciones.multiselection.selectedIds || opciones.multiselection.selectedIds.length == 0) {\n              for (var i = 0; i < xhr.rows.length; i++) {\n                printDoc.append($('<p>' + xhr.rows[i][opciones.key] + '</p>'));\n              }\n            } else {\n              for (var x = 0; x < xhr.rows.length; x++) {\n                for (var y = 0; y < xhr.reorderedSelection.length; y++) {\n                  if (xhr.rows[x][opciones.key] == xhr.reorderedSelection[y].pk[opciones.key]) {\n                    printDoc.append($('<p>' + xhr.rows[x][opciones.key] + '</p>'));\n                  }\n                }\n              }\n            }\n\n            doc.print(printDoc[0]);\n          }\n        });\n      }\n    },\n\n    /**\r\n     * Método interno que configura MultiFilter\r\n     * @name _multiFilter\r\n     * @private\r\n     * @function\r\n     */\n    _multiFilter: function _multiFilter() {\n      var self = this;\n      var opciones = self.options;\n      opciones.multiFilter = {};\n      opciones.multiFilter._filterSelector = 'generated';\n      opciones.multiFilter._filterUser = 'udaPruebas';\n      opciones.multiFilter._dialogId = self.element[0].id + '_dropdownDialog';\n      opciones.multiFilter.$btn = $('#' + opciones.filterForm).find('button').eq(0);\n      opciones.multiFilter.$dialog = $('<div id=\"' + opciones.multiFilter._dialogId + '\" class=\"dialog-content-material\"><div id=\"' + opciones.multiFilter._dialogId + '_feedback\" role=\"alert\"></div><form><div class=\"form-row\"><div class=\"form-groupMaterial col-12\"><label for=\"' + opciones.multiFilter._dialogId + '_combo\">Filtros</label><input id=\"' + opciones.multiFilter._dialogId + '_combo\" /></div></div><div class=\"form-row\"><div class=\"checkbox-material col-12\"><input type=\"checkbox\" id=\"' + opciones.multiFilter._dialogId + '-defaultFilter\" /><label for=\"' + opciones.multiFilter._dialogId + '-defaultFilter\">Filtro por defecto</label></div></div></form></div>');\n      opciones.multiFilter.$btn.after(opciones.multiFilter.$dialog);\n      opciones.multiFilter.$combo = $('#' + opciones.multiFilter._dialogId + '_combo');\n      opciones.multiFilter.$feedback = $('#' + opciones.multiFilter._dialogId + '_feedback');\n      opciones.multiFilter.$feedback.rup_feedback({\n        block: false,\n        delay: 2000\n      }); // Dropdown dialog\n\n      opciones.multiFilter.$btn.rup_button({\n        dropdown: {\n          dropdownDialog: opciones.multiFilter._dialogId,\n          dropdownDialogConfig: {\n            autoOpen: false,\n            modal: true,\n            resizable: true,\n            title: '<i class=\\'mdi mdi-filter\\' aria-hidden=\\'true\\'></i>Administración de filtros',\n            width: '380px',\n            buttons: [{\n              id: opciones.multiFilter._dialogId + '_btn_save',\n              text: 'Guardar',\n              click: function click() {\n                if ($('#' + opciones.filterForm).rup_form('formToJson').length != 0) {\n                  var elem = {\n                    filtro: {\n                      filterSelector: opciones.multiFilter._filterSelector,\n                      filterName: opciones.multiFilter.$label.val(),\n                      filterValue: JSON.stringify($('#' + opciones.filterForm).rup_form('formToJson')),\n                      filterDefault: opciones.multiFilter.$dialog.find('#' + opciones.multiFilter._dialogId + '-defaultFilter')[0].checked,\n                      filterUser: opciones.multiFilter._filterUser\n                    }\n                  };\n                  $.rup_ajax({\n                    url: opciones.action + '/./multiFilter/add',\n                    type: 'POST',\n                    dataType: 'json',\n                    data: JSON.stringify(elem),\n                    contentType: 'application/json',\n                    success: function success() {\n                      opciones.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_jqtable.plugins.multifilter.ok, 'ok');\n                    },\n                    error: function error() {\n                      opciones.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_jqtable.plugins.multifilter.error, 'error');\n                    }\n                  });\n                }\n              }\n            }, {\n              id: opciones.multiFilter._dialogId + '_btn_apply',\n              text: 'Aplicar',\n              click: function click() {\n                if (opciones.multiFilter.selected) {\n                  opciones.multiFilter.$dialog.dialog('close');\n                  self.element.rup_list('filter');\n                }\n              }\n            }, {\n              id: opciones.multiFilter._dialogId + '_btn_delete',\n              text: 'Eliminar',\n              click: function click() {\n                if (opciones.multiFilter.selected) {\n                  var elem = {\n                    filtro: {\n                      filterSelector: opciones.multiFilter.selected.filterSelector,\n                      filterName: opciones.multiFilter.selected.filterName,\n                      filterValue: JSON.stringify(opciones.multiFilter.selected.filterValue),\n                      filterDefault: opciones.multiFilter.selected.filterDefault,\n                      filterUser: opciones.multiFilter.selected.filterUser\n                    }\n                  };\n                  $.rup_ajax({\n                    url: opciones.action + '/./multiFilter/delete',\n                    type: 'POST',\n                    dataType: 'json',\n                    data: JSON.stringify(elem),\n                    contentType: 'application/json',\n                    success: function success() {\n                      opciones.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_jqtable.plugins.multifilter.ok, 'ok');\n                      opciones.multiFilter.$combo.rup_autocomplete('set', '', '');\n                      opciones.multiFilter.$label.data('tmp.loadObjects.term', null);\n                      opciones.multiFilter.$label.data('loadObjects', {});\n                      opciones.multiFilter.$label.data('tmp.data', {});\n                    },\n                    error: function error() {\n                      opciones.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_jqtable.plugins.multifilter.error, 'error');\n                    }\n                  });\n                }\n              }\n            }, {\n              id: opciones.multiFilter._dialogId + '_btn_cancel',\n              text: 'Cancelar',\n              click: function click() {\n                opciones.multiFilter.$dialog.dialog('close');\n              },\n              btnType: $.rup.dialog.LINK\n            }]\n          }\n        }\n      });\n      opciones.multiFilter.$combo.rup_autocomplete({\n        source: opciones.action + '/./multiFilter/getAll?filterSelector=' + opciones.multiFilter._filterSelector + '&user=' + opciones.multiFilter._filterUser,\n        sourceParam: {\n          label: 'filterName',\n          value: 'filterDefault',\n          data: 'filterValue',\n          category: 'filter'\n        },\n        method: 'GET',\n        menuMaxHeight: 325,\n        minLength: 3,\n        combobox: true,\n        contains: true,\n        select: function select() {\n          if (opciones.multiFilter.$combo.rup_autocomplete('getRupValue')) {\n            opciones.multiFilter.selected = {\n              filterSelector: opciones.multiFilter._filterSelector,\n              filterName: opciones.multiFilter.$combo.rup_autocomplete('getRupValue'),\n              filterDefault: opciones.multiFilter.$dialog.find('#' + opciones.multiFilter._dialogId + '-defaultFilter')[0].checked,\n              filterUser: opciones.multiFilter._filterUser\n            };\n            $.rup_ajax({\n              url: opciones.action + '/./multiFilter/getAll?filterSelector=' + opciones.multiFilter._filterSelector + '&user=' + opciones.multiFilter._filterUser,\n              type: 'GET',\n              dataType: 'json',\n              contentType: 'application/json',\n              success: function success(data) {\n                if (opciones.multiFilter.selected.filterName) {\n                  for (var i = 0; i < data.length; i++) {\n                    if (opciones.multiFilter.selected.filterName == data[i].filterName) {\n                      opciones.multiFilter.selected.filterValue = JSON.parse(data[i].filterValue);\n                      opciones.multiFilter.selected.filterDefault = data[i].filterDefault;\n                    }\n                  }\n\n                  if (opciones.multiFilter.selected.filterDefault) {\n                    opciones.multiFilter.$dialog.find('#' + opciones.multiFilter._dialogId + '-defaultFilter')[0].checked = true;\n                  } else {\n                    opciones.multiFilter.$dialog.find('#' + opciones.multiFilter._dialogId + '-defaultFilter')[0].checked = false;\n                  }\n\n                  $('#' + opciones.filterForm).find('input').val('');\n\n                  for (var _i2 = 0; _i2 < $('#' + opciones.filterForm).find('input').length; _i2++) {\n                    if (opciones.multiFilter.selected.filterValue[$('#' + opciones.filterForm).find('input').eq(_i2).attr('name')] != undefined) {\n                      $('#' + opciones.filterForm).find('input').eq(_i2).val(opciones.multiFilter.selected.filterValue[$('#' + opciones.filterForm).find('input').eq(_i2).attr('name')]);\n                    }\n                  }\n                }\n              },\n              error: function error() {\n                opciones.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_jqtable.plugins.multifilter.error, 'error');\n              }\n            });\n          }\n        }\n      });\n      opciones.multiFilter.$label = $('#' + opciones.multiFilter._dialogId + '_combo_label'); //filtro por derecho\n\n      $.rup_ajax({\n        url: opciones.action + '/./multiFilter/getDefault?filterSelector=' + opciones.multiFilter._filterSelector + '&user=' + opciones.multiFilter._filterUser,\n        type: 'GET',\n        dataType: 'json',\n        contentType: 'application/json',\n        success: function success(data) {\n          opciones.multiFilter.$label.val(data.filterName);\n          data.filterValue = JSON.parse(data.filterValue);\n\n          if (data.filterDefault) {\n            opciones.multiFilter.$dialog.find('#' + opciones.multiFilter._dialogId + '-defaultFilter')[0].checked = true;\n          } else {\n            opciones.multiFilter.$dialog.find('#' + opciones.multiFilter._dialogId + '-defaultFilter')[0].checked = false;\n          }\n\n          for (var i = 0; i < $('#' + opciones.filterForm).find('input').length; i++) {\n            if (data.filterValue[$('#' + opciones.filterForm).find('input').eq(i).attr('name')] != undefined) {\n              $('#' + opciones.filterForm).find('input').eq(i).val(data.filterValue[$('#' + opciones.filterForm).find('input').eq(i).attr('name')]);\n            }\n          }\n        }\n      });\n\n      opciones.multiFilter.$label.data('uiAutocomplete')._renderItem = function (ul, item) {\n        return $('<li></li>').data('item.autocomplete', item).append('<a>' + item.label + '</a>').appendTo(ul);\n      };\n\n      opciones.multiFilter.$label.off('blur click');\n    },\n\n    /**\r\n     * Método interno que configura el boton de alternar el sord en la ordenación simple\r\n     * @name _sordButtonInit\r\n     * @private\r\n     * @function\r\n     */\n    _sordButtonInit: function _sordButtonInit() {\n      var self = this;\n      var opciones = self.options;\n      var sordH = opciones._header.sord;\n      var sordF = opciones._footer.sord;\n      sordH.attr('aria-controls', self.element.attr('id'));\n\n      if (opciones.createFooter) {\n        sordF.attr('aria-controls', self.element.attr('id'));\n      }\n\n      if (opciones.sord === 'asc') {\n        sordH.addClass('asc');\n        sordH.removeClass('desc');\n        sordH.attr('aria-label', $.rup.i18n.base.rup_list.sort.asc);\n\n        if (opciones.createFooter) {\n          sordF.addClass('asc');\n          sordF.removeClass('desc');\n          sordF.attr('aria-label', $.rup.i18n.base.rup_list.sort.asc);\n        }\n      } else {\n        sordH.addClass('desc');\n        sordH.removeClass('asc');\n        sordH.attr('aria-label', $.rup.i18n.base.rup_list.sort.desc);\n\n        if (opciones.createFooter) {\n          sordF.addClass('desc');\n          sordF.removeClass('asc');\n          sordF.attr('aria-label', $.rup.i18n.base.rup_list.sort.desc);\n        }\n      } // Funcionamiento botón sord\n\n\n      $('#' + opciones._idListHeader.sord + ', #' + opciones._idListFooter.sord).on('click', function () {\n        sordH.toggleClass('asc');\n        sordH.toggleClass('desc');\n\n        if (opciones.createFooter) {\n          sordF.toggleClass('asc');\n          sordF.toggleClass('desc');\n        }\n\n        var label = sordH.hasClass('asc') ? $.rup.i18n.base.rup_list.sort.asc : $.rup.i18n.base.rup_list.sort.desc;\n        sordH.attr('aria-label', label);\n\n        if (opciones.createFooter) {\n          sordF.attr('aria-label', label);\n        }\n\n        self._changeOption('sord', sordH.hasClass('asc') ? 'asc' : 'desc');\n      });\n    },\n\n    /**\r\n     * Método interno que configura el combo de seleccion de sidx en la ordenación simple\r\n     * @name _sidxComboInit\r\n     * @private\r\n     * @function\r\n     */\n    _sidxComboInit: function _sidxComboInit() {\n      var self = this;\n      var opciones = self.options;\n\n      var doChange = function doChange(obj, change) {\n        if (!$('#' + obj.id).rup_combo('isDisabled')) {\n          var iden = opciones._header.sidx[0].id;\n          $('#' + iden).rup_combo('setRupValue', $('#' + obj.id).rup_combo('getRupValue'));\n\n          if (opciones.createFooter) {\n            iden = opciones._footer.sidx[0].id;\n            $('#' + iden).rup_combo('setRupValue', $('#' + obj.id).rup_combo('getRupValue'));\n          }\n\n          if (change) {\n            self._changeOption('sidx', $('#' + obj.id).rup_combo('getRupValue'));\n          }\n        }\n      };\n\n      var changeH = function changeH() {\n        doChange(this, true);\n      };\n\n      var changeF = function changeF() {\n        doChange(this, false);\n      };\n\n      var sidxRupConf = {\n        source: opciones.sidx.source,\n        width: 'initial',\n        selected: opciones.sidx.value,\n        rowStriping: true,\n        ordered: false,\n        change: changeH\n      };\n\n      opciones._header.sidx.rup_combo(sidxRupConf);\n\n      opciones._header.sidx = $('#' + opciones._idListHeader.sidx);\n\n      if (opciones.createFooter) {\n        var sidxRupConfFoot = {\n          source: opciones.sidx.source,\n          width: 'initial',\n          selected: opciones.sidx.value,\n          rowStriping: true,\n          ordered: false,\n          change: changeF\n        };\n\n        opciones._footer.sidx.rup_combo(sidxRupConfFoot);\n\n        opciones._footer.sidx = $('#' + opciones._idListFooter.sidx);\n      }\n    },\n\n    /**\r\n     * Método interno que configura los elementos de la multiordenación.\r\n     * @name _multisortInit\r\n     * @private\r\n     * @function\r\n     */\n    _multisortInit: function _multisortInit() {\n      var self = this;\n      var opciones = self.options;\n      var selfId = self.element.attr('id'); // Creamos un apartado en opciones\n\n      opciones.multiorder = {\n        sidx: opciones.sidx.value,\n        sord: function () {\n          if (opciones.sord) {\n            var sordArr = opciones.sord.split(',');\n            var sidxArr = opciones.sidx.value.split(',');\n\n            if (sordArr.length == sidxArr.length) {\n              return opciones.sord;\n            }\n\n            if (sordArr.length > sidxArr.length) {\n              return sordArr.splice(0, sidxArr.length).join(',');\n            }\n\n            if (sordArr.length < sidxArr.length) {\n              var diff = sidxArr.length - sordArr.length;\n\n              for (var i = 0; i < diff; i++) {\n                sordArr.push('asc');\n              }\n\n              return sordArr.join(',');\n            }\n          } else {\n            var _sordArr = [];\n\n            for (var _i3 = 0; _i3 < opciones.sidx.value.split(',').length; _i3++) {\n              _sordArr.push('asc');\n            }\n\n            return _sordArr.join(',');\n          }\n        }()\n      };\n\n      var doInit = function doInit(isFooter) {\n        var idObj = isFooter ? '_idListFooter' : '_idListHeader';\n        var obj = isFooter ? '_footer' : '_header';\n        var label = isFooter ? '-footer-' : '-header-';\n        opciones[idObj].multiSort.dialog = selfId + label + 'mord-dialog';\n        opciones[idObj].multiSort.summary = selfId + label + 'mord-summary';\n        opciones[idObj].multiSort.edit = selfId + label + 'mord-edit'; // Generamos un span para el resumen\n\n        var $spanResumen = $('<ul id=\"' + opciones[idObj].multiSort.summary + '\" class=\"rup_list-mord-summary p-0\"></ul>');\n        var $tmpWrapSummary = $('<div class=\"tmp-orderchange\"/>');\n        opciones[obj].sidx.wrap($tmpWrapSummary);\n        $tmpWrapSummary = opciones[obj].sidx.parent();\n        $tmpWrapSummary.children().remove();\n        $tmpWrapSummary.append($spanResumen);\n        $spanResumen.unwrap();\n        opciones[obj].multiSort.summary = $('#' + opciones[idObj].multiSort.summary); // Se rellena el resumen con el order por defecto\n\n        opciones.multiorder.sidx.split(',').map(function (e) {\n          return e.trim();\n        }).forEach(function (e, i) {\n          if (e !== '') {\n            var $tmpSum = $('<li class=\"rup_list-mord-summary-badge badge badge-pill badge-primary rounded-0 mr-1\"></li>');\n\n            var geti18n = function geti18n(val) {\n              var srcVal = opciones.sidx.source.filter(function (x) {\n                return x.value == val;\n              });\n              return srcVal[0].i18nCaption;\n            };\n\n            var sordBadge = $('<span class=\"rup_list-mord-summary-badge-sord\"></span>');\n            sordBadge.text(' ');\n\n            var _arrSord = opciones.multiorder.sord.split(',').map(function (e) {\n              return e.trim();\n            });\n\n            if (_arrSord[i] == 'asc') {\n              sordBadge.addClass('asc mdi mdi-chevron-up');\n              sordBadge.attr('aria-label', $.rup.i18n.base.rup_list.sort.asc);\n            } else {\n              sordBadge.addClass('desc mdi mdi-chevron-down');\n              sordBadge.attr('aria-label', $.rup.i18n.base.rup_list.sort.desc);\n            }\n\n            $tmpSum.append(geti18n(e)).append(sordBadge.clone());\n            $spanResumen.append($tmpSum.clone());\n          }\n        }); // Creamos el botón para el dialogo\n\n        var $btnOrderDialog = $(\"<button id=\\\"\".concat(opciones[idObj].multiSort.edit, \"\\\" class=\\\"rup_list-mord-dialogbtn mdi mdi-pencil\\\"></button>\"));\n        $btnOrderDialog.attr('aria-haspopup', 'true');\n        $btnOrderDialog.attr('aria-expanded', 'false');\n        $btnOrderDialog.attr('aria-label', $.rup.i18n.base.rup_list.openMordDialog);\n        var $tmpWrapEditMord = $('<div class=\"tmp-orderchange\"></div>');\n        opciones[obj].sord.wrap($tmpWrapEditMord);\n        $tmpWrapEditMord = opciones[obj].sord.parent();\n        $tmpWrapEditMord.children().remove();\n        $tmpWrapEditMord.append($btnOrderDialog);\n        $btnOrderDialog.unwrap();\n        opciones[obj].multiSort.edit = $('#' + opciones[idObj].multiSort.edit); // Establecemos el boton para el dialogo\n\n        opciones[obj].multiSort.edit.on('click keyup', function (e) {\n          if (e.type === 'click' || e.type === 'keyup' && e.keyCode == '13') {\n            opciones._multiSortDialog.rup_dialog('open');\n          }\n        });\n        var arrSidx = opciones.multiorder.sidx.split(',').map(function (a) {\n          return a.trim();\n        });\n        var arrSord = opciones.multiorder.sord.split(',').map(function (a) {\n          return a.trim();\n        });\n\n        if (arrSidx.length > 0) {\n          var cont = 0;\n          $(self.element).on('rup_list-mord-changed', function () {\n            cont++;\n\n            if (cont == arrSidx.length) {\n              $(self.element).trigger('rup_list-mord-inited');\n            }\n          });\n          arrSidx.forEach(function (elem, i) {\n            $('button[data-ordValue=\"' + elem + '\"]').trigger('click', [arrSord[i], true]);\n          });\n        } else {\n          $(self.element).trigger('rup_list-mord-inited');\n        }\n      }; //Creamos el dialogo\n\n\n      $('<div id=\"' + opciones._idMultiSortDialog + '\" class=\"rup_list-mord-dialog\" style=\"display:none\"></div>').append(\"\\n                    <div class=\\\"card\\\">\\n                        <div class=\\\"card-body\\\">\\n                            <h4 class=\\\"card-title\\\">\".concat($.rup.i18n.base.rup_list.multiSortDialog.msg1, \"</h5>\\n                            <h5 class=\\\"card-subtitle mb-4 text-muted\\\">\").concat($.rup.i18n.base.rup_list.multiSortDialog.msg2, \"</h5>\\n                            <div id=\\\"\").concat(opciones._idMultiSortDialog, \"-orderfields\\\" class=\\\"rup_list-mord-orderfields\\\" aria-live=\\\"polite\\\"></div>\\n                        </div>\\n                    </div>\\n                    <div class=\\\"card\\\">\\n                        <div class=\\\"card-body\\\">\\n                            <h4 class=\\\"card-title\\\">\").concat($.rup.i18n.base.rup_list.multiSortDialog.msg3, \"</h4>\\n                            <h5 class=\\\"card-subtitle mb-4 text-muted\\\">\").concat($.rup.i18n.base.rup_list.multiSortDialog.msg4, \"</h5>\\n                            <div id=\\\"\").concat(opciones._idMultiSortDialog, \"-ordersort\\\" class=\\\"rup_list-mord-ordersort\\\" aria-live=\\\"polite\\\"></div>\\n                        </div>\\n                    </div>\\n                \")).appendTo('body');\n      opciones._multiSortDialog = $('#' + opciones._idMultiSortDialog); //Creamos el contenido del diálogo\n\n      opciones.sidx.source.forEach(function (el) {\n        var $btn = $(\"\\n                    <button class=\\\"rup_list-mord-field\\\" data-ordValue=\\\"\".concat(el.value, \"\\\">\\n                        \").concat(el.i18nCaption, \"\\n                        <i class=\\\"mdi mdi-plus\\\"></i>\\n                    </button>\\n                \"));\n        $btn.attr('aria-controls', \"\".concat(opciones._idMultiSortDialog, \"-orderfields \").concat(opciones._idMultiSortDialog, \"-ordersort\"));\n        $('.rup_list-mord-orderfields').append($btn.clone());\n      });\n      $('.rup_list-mord-orderfields').children().on('click', function (e, param, isInit) {\n        self._actualizarOrdenMulti.apply(self, [e, param, isInit]);\n      }); //Creamos el componente para el dialogo\n\n      opciones._multiSortDialog.rup_dialog({\n        type: $.rup.dialog.DIV,\n        autoOpen: false,\n        modal: true,\n        resizable: false,\n        width: 'auto',\n        title: $.rup.i18n.base.rup_list.multiSortDialog.title,\n        buttons: [{\n          text: 'cerrar',\n          click: function click() {\n            opciones._multiSortDialog.rup_dialog('close');\n          }\n        }],\n        open: function open() {\n          $(self.element).trigger('rup_list-mord-dialogOpen');\n\n          opciones._header.multiSort.edit.attr('aria-expanded', true);\n\n          if (opciones.createFooter) {\n            opciones._footer.multiSort.edit.attr('aria-expanded', true);\n          }\n        },\n        onBeforeClose: function onBeforeClose() {\n          $(self.element).trigger('rup_list-mord-dialogClose');\n\n          opciones._header.multiSort.edit.attr('aria-expanded', false);\n\n          if (opciones.createFooter) {\n            opciones._footer.multiSort.edit.attr('aria-expanded', false);\n          }\n        }\n      });\n\n      doInit();\n\n      if (opciones.createFooter) {\n        doInit(true);\n      }\n    },\n\n    /**\r\n     * Método interno que configura el combo de elementos de lista por página\r\n     * @name _rownumInit\r\n     * @private\r\n     * @function\r\n     */\n    _rownumInit: function _rownumInit() {\n      var self = this;\n      var opciones = self.options;\n\n      var doChange = function doChange(obj, change) {\n        if (opciones.createFooter) {\n          var _iden = opciones._header.rowNum[0].id;\n\n          if (obj.id == 'rup-list-footer-rowNum') {\n            $('#' + _iden).rup_combo('setRupValue', $('#' + obj.id).rup_combo('getRupValue'));\n          }\n\n          if (obj.id == 'rup-list-header-rowNum') {\n            _iden = opciones._footer.rowNum[0].id;\n            $('#' + _iden).rup_combo('setRupValue', $('#' + obj.id).rup_combo('getRupValue'));\n          }\n        }\n\n        if (change) {\n          self._changeOption('rowNum', $('#' + obj.id).rup_combo('getRupValue'));\n        }\n      };\n\n      var changeH = function changeH() {\n        doChange(this, true);\n      };\n\n      var changeF = function changeF() {\n        doChange(this, false);\n      };\n\n      var rowNumRupConf = {\n        source: opciones.rowNum.source,\n        width: 'initial',\n        selected: opciones.rowNum.value,\n        rowStriping: true,\n        ordered: false,\n        change: changeH\n      };\n      var iden = opciones._header.rowNum[0].id;\n      $('#' + iden).rup_combo(rowNumRupConf);\n      opciones._header.rowNum = $('#' + opciones._idListHeader.rowNum);\n\n      if (opciones.createFooter) {\n        var rowNumRupConfFoot = {\n          source: opciones.rowNum.source,\n          width: 'initial',\n          selected: opciones.rowNum.value,\n          rowStriping: true,\n          ordered: false,\n          change: changeF\n        };\n        var idenFoot = opciones._footer.rowNum[0].id;\n        $('#' + idenFoot).rup_combo(rowNumRupConfFoot);\n        opciones._footer.rowNum = $('#' + opciones._idListFooter.rowNum);\n      }\n    },\n\n    /**\r\n     * Método interno para deshabilitar botones de paginación\r\n     * @private\r\n     * @function\r\n     * @param $navItem Objeto JQuery con el ítem de la navegación sobre el que actuar\r\n     */\n    _disableNavItem: function _disableNavItem($navItem) {\n      $navItem.addClass('disabled');\n      $navItem.attr('aria-disabled', 'true');\n      $navItem.attr('tabindex', '-1');\n    },\n\n    /**\r\n     * Método interno para habilitar botones de paginación\r\n     * @private\r\n     * @function\r\n     * @param $navItem Objeto JQuery con el ítem de la navegación sobre el que actuar\r\n     */\n    _enableNavItem: function _enableNavItem($navItem) {\n      $navItem.removeClass('disabled');\n      $navItem.attr('aria-disabled', 'false');\n      $navItem.attr('tabindex', '0');\n    },\n\n    /**\r\n     * Método interno que configura el nav de la paginación\r\n     * @name _pagenavInit\r\n     * @private\r\n     * @function\r\n     */\n    _pagenavInit: function _pagenavInit() {\n      var self = this;\n      var opciones = self.options;\n      $('.page-separator').hide().attr('aria-hidden', 'true'); // A11Y\n\n      opciones._header.pagenav.attr('aria-label', $.rup.i18n.base.rup_list.paginacion);\n\n      opciones._header.pagenav.attr('aria-controls', self.element.attr('id'));\n\n      opciones._header.pagePrev.attr('role', 'button').attr('aria-controls', self.element.attr('id')).attr('aria-label', $.rup.i18n.base.rup_list.paginaAnterior);\n\n      opciones._header.pageNext.attr('role', 'button').attr('aria-controls', self.element.attr('id')).attr('aria-label', $.rup.i18n.base.rup_list.paginaSiguiente);\n\n      if (opciones.createFooter) {\n        opciones._footer.pagenav.attr('aria-label', $.rup.i18n.base.rup_list.paginacion);\n\n        opciones._footer.pagenav.attr('aria-controls', self.element.attr('id'));\n\n        opciones._footer.pagePrev.attr('role', 'button').attr('aria-controls', self.element.attr('id')).attr('aria-label', $.rup.i18n.base.rup_list.paginaAnterior);\n\n        opciones._footer.pageNext.attr('role', 'button').attr('aria-controls', self.element.attr('id')).attr('aria-label', $.rup.i18n.base.rup_list.paginaSiguiente);\n      }\n\n      var onPageChange = function onPageChange(elem) {\n        if ($(elem).is('.disabled')) {\n          return false;\n        }\n\n        var maxpage = $('.page').eq(-1).attr('data-page');\n\n        var actualPage = opciones._header.pagenav.find('.rup_list-page-item.page.active').attr('data-page');\n\n        if (actualPage == 1) {\n          self._disableNavItem(opciones._header.pagePrev);\n\n          self._enableNavItem(opciones._header.pageNext);\n\n          if (opciones.createFooter) {\n            self._disableNavItem(opciones._footer.pagePrev);\n\n            self._enableNavItem(opciones._footer.pageNext);\n          }\n\n          return true;\n        }\n\n        if (actualPage == maxpage) {\n          self._enableNavItem(opciones._header.pagePrev);\n\n          self._disableNavItem(opciones._header.pageNext);\n\n          if (opciones.createFooter) {\n            self._enableNavItem(opciones._footer.pagePrev);\n\n            self._disableNavItem(opciones._footer.pageNext);\n          }\n\n          return true;\n        }\n\n        self._enableNavItem(opciones._header.pagePrev);\n\n        self._enableNavItem(opciones._header.pageNext);\n\n        if (opciones.createFooter) {\n          self._enableNavItem(opciones._footer.pagePrev);\n\n          self._enableNavItem(opciones._footer.pageNext);\n        }\n\n        return true;\n      };\n\n      opciones._header.pagePrev.on('click', function () {\n        if (!onPageChange(this)) {\n          return;\n        }\n\n        self._changeOption('page', opciones._header.pagenav.find('.rup_list-page-item.page.active').prev('[data-page]').data('page'));\n      });\n\n      opciones._header.pageNext.on('click', function () {\n        if (!onPageChange(this)) {\n          return;\n        }\n\n        self._changeOption('page', opciones._header.pagenav.find('.rup_list-page-item.page.active').next('[data-page]').data('page'));\n      });\n\n      if (opciones.createFooter) {\n        opciones._footer.pagePrev.on('click', function () {\n          if (!onPageChange(this)) {\n            return;\n          }\n\n          self._changeOption('page', opciones._header.pagenav.find('.rup_list-page-item.page.active').prev('[data-page]').data('page'));\n        });\n\n        opciones._footer.pageNext.on('click', function () {\n          if (!onPageChange(this)) {\n            return;\n          }\n\n          self._changeOption('page', opciones._header.pagenav.find('.rup_list-page-item.page.active').next('[data-page]').data('page'));\n        });\n      }\n    },\n\n    /**\r\n     * Método interno que crea la estructura de las líneas en la multiordenación\r\n     *\r\n     * @name _actualizarOrdenMulti\r\n     * @private\r\n     * @function\r\n     * @param {Event} e\r\n     * @param {JQueryObj} self  Objeto JQuery del botón\r\n     * @param {String} ord  Direccion de la ordenación con la que se va a generar la línea\r\n     */\n    _actualizarOrdenMulti: function _actualizarOrdenMulti(e) {\n      var ord = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'asc';\n      var isInit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'false';\n      var self = this;\n      var opciones = self.options;\n      var sortDiv = $('.rup_list-mord-ordersort'); // Añadimos las opciones al componente\n\n      if (opciones.multiorder.sidx.length) {\n        var tmpSidxArr = opciones.multiorder.sidx.split(',').map(function (e) {\n          return e.trim();\n        });\n        var tmpSordArr = opciones.multiorder.sord.split(',').map(function (e) {\n          return e.trim();\n        });\n\n        if (tmpSidxArr.indexOf($(e.target).attr('data-ordValue')) == -1) {\n          tmpSidxArr.push($(e.target).attr('data-ordValue'));\n          tmpSordArr.push(ord);\n        }\n\n        opciones.multiorder.sidx = tmpSidxArr.join(',');\n        opciones.multiorder.sord = tmpSordArr.join(',');\n      } //Creamos la linea\n\n\n      var $operateLine = $(\"\\n                <div id=\\\"\".concat(opciones._idMultiSortDialog, \"-ord-line-\").concat($(e.target).attr('data-ordValue'), \"\\\" \\n                    class=\\\"rup_list-ord-line btn-group mb-3\\\" \\n                    data-ordValue=\\\"\").concat($(e.target).attr('data-ordValue'), \"\\\"\\n                    role=\\\"toolbar\\\" \\n                    aria-controls=\\\"\").concat(self.element[0].id, \"\\\"\\n                    aria-label=\\\"\").concat($(e.target).text().trim(), \", \").concat($.rup.i18n.base.rup_list.sort[ord], \"\\\">\\n                    <div class=\\\"rup_list-apord input-group-text\\\"></div>\\n                    <button class=\\\"rup_list-mord-up btn btn-secondary p-1 mdi mdi-arrow-up\\\"\\n                        aria-label=\\\"\").concat($.rup.i18n.base.rup_list.mordSubir, \"\\\"\\n                        aria-controls=\\\"\").concat(self.element[0].id, \" \").concat(opciones._idMultiSortDialog, \"-ord-line-\").concat($(e.target).attr('data-ordValue'), \"\\\"></button>\\n                    <button class=\\\"rup_list-mord-down btn btn-secondary p-1 mdi mdi-arrow-down\\\"\\n                        aria-label=\\\"\").concat($.rup.i18n.base.rup_list.mordBajar, \"\\\"\\n                        aria-controls=\\\"\").concat(self.element[0].id, \" \").concat(opciones._idMultiSortDialog, \"-ord-line-\").concat($(e.target).attr('data-ordValue'), \"\\\"></button>\\n                    <div class=\\\"rup_list-mord-label input-group-text rounded-0 w-50\\\" aria-hidden=\\\"true\\\">\").concat($(e.target).text(), \"</div>\\n                    <button aria-controls=\\\"\").concat(self.element[0].id, \"\\\"\\n                        class=\\\"rup_list-mord btn btn-secondary mdi\\\" \\n                        data-direction=\\\"\").concat(ord, \"\\\"\\n                        aria-label=\\\"\").concat($.rup.i18n.base.rup_list.sort[ord], \"\\\"></button>\\n                    <button aria-controls=\\\"\").concat(self.element[0].id, \"\\\"\\n                        aria-label=\\\"\").concat($.rup.i18n.base.rup_list.quitarCampoOrden, \"\\\"\\n                        class=\\\"rup_list-mord-remove btn btn-danger mdi mdi-close-circle\\\"></button>\\n                </div>\\n            \"));\n      $operateLine.find('button').rup_button();\n      $(e.target).remove();\n      sortDiv.append($operateLine);\n\n      self._fnOrderOfOrderFields.apply(self, [$('[data-ordValue=\"' + $(e.target).attr('data-ordValue') + '\"]', sortDiv), isInit]);\n    },\n\n    /**\r\n     * Método interno que da funcionalidad a cada línea en la multiordenación\r\n     *\r\n     * @name _fnOrderOfOrderFields\r\n     * @private\r\n     * @function\r\n     * @param {JQuery} ctx La instancia de rup_list\r\n     * @param {JQuery} line Objeto JQuery de la línea a la que se va a dar funcionalidad\r\n     */\n    _fnOrderOfOrderFields: function _fnOrderOfOrderFields(line, isInit) {\n      var _this2 = this;\n\n      var self = this;\n      var opciones = self.options; //Función de guardado de la multiordenación\n\n      var save = function save() {\n        opciones.multiorder.sidx = '';\n        opciones.multiorder.sord = '';\n        var $sortDiv = $('.rup_list-mord-ordersort');\n        var sidxArr = [];\n        var sordArr = [];\n        $sortDiv.children().toArray().forEach(function (elem) {\n          if (sidxArr.indexOf($(elem).attr('data-ordValue')) == -1) {\n            sidxArr.push($(elem).attr('data-ordValue'));\n            sordArr.push($('.rup_list-mord', $(elem)).attr('data-direction'));\n          }\n        });\n\n        if (sidxArr.length > 0) {\n          opciones.multiorder.sidx = sidxArr.join(',');\n          opciones.multiorder.sord = sordArr.join(',');\n        } //Crear el label de resumen\n\n\n        opciones._content.find('.rup_list-mord-summary').empty();\n\n        if (opciones.multiorder.sidx != null && opciones.multiorder.sidx.length > 0) {\n          opciones.multiorder.sidx.split(',').map(function (e) {\n            return e.trim();\n          }).forEach(function (e, i) {\n            var geti18n = function geti18n(val) {\n              var srcVal = opciones.sidx.source.filter(function (x) {\n                return x.value == val;\n              });\n              return srcVal[0].i18nCaption;\n            };\n\n            var sordBadge = $('<span></span>').text(' ');\n            var arrSord = opciones.multiorder.sord.split(',').map(function (e) {\n              return e.trim();\n            });\n\n            if (arrSord[i] == 'asc') {\n              sordBadge.addClass('mdi mdi-chevron-up');\n            } else {\n              sordBadge.addClass('mdi mdi-chevron-down');\n            }\n\n            $('<li class=\"rup_list-mord-summary-badge badge badge-pill badge-primary rounded-0 mr-1\"></li>').append(geti18n(e)).append(sordBadge.clone()).appendTo(opciones._content.find('.rup_list-mord-summary'));\n          });\n        } // Función para dehabilitar los botones de reordenación correspondientes\n\n\n        opciones._multiSortDialog.find('.rup_list-mord-up, .rup_list-mord-down').button('enable');\n\n        opciones._multiSortDialog.find('.rup_list-mord-up, .rup_list-mord-down').attr('aria-disabled', 'false');\n\n        opciones._multiSortDialog.find('.rup_list-mord-up, .rup_list-mord-down').attr('tabindex', '0');\n\n        opciones._multiSortDialog.find('.rup_list-mord-up').first().button('disable');\n\n        opciones._multiSortDialog.find('.rup_list-mord-down').last().button('disable');\n\n        opciones._multiSortDialog.find('.rup_list-mord-up').first().attr('aria-disabled', 'true');\n\n        opciones._multiSortDialog.find('.rup_list-mord-down').last().attr('aria-disabled', 'true');\n\n        opciones._multiSortDialog.find('.rup_list-mord-up').first().attr('tabindex', '-1');\n\n        opciones._multiSortDialog.find('.rup_list-mord-down').last().attr('tabindex', '-1');\n\n        var ariaSummary = $('.rup_list-ord-line').toArray().map(function (e) {\n          return $(e).attr('aria-label') + '; ';\n        }).reduce(function (rest, el) {\n          return rest + el;\n        }, '');\n        $sortDiv.attr('aria-label', ariaSummary ? $.rup.i18n.base.rup_list.ariaSummary + ariaSummary : $.rup.i18n.base.rup_list.ariaSummaryEmpty);\n        $(self.element).trigger('rup_list-mord-changed');\n\n        if (isInit != true) {\n          isInit = false;\n\n          _this2.reload();\n        } else {\n          isInit = false;\n        }\n      }; // Funcionalidad de los botones de reordenación\n\n\n      $('.rup_list-mord-up', line).click(function () {\n        if ($(line).is(':first-child')) {\n          return;\n        }\n\n        $(line).prev().before(line);\n        $(this).focus();\n        save();\n      });\n      $('.rup_list-mord-down', line).click(function () {\n        if ($(line).is(':last-child')) {\n          return;\n        }\n\n        $(line).next().after(line);\n        $(this).focus();\n        save();\n      }); //ponemos icono al sord\n\n      if ($('.rup_list-mord', line).attr('data-direction') == 'asc') {\n        $('.rup_list-mord', line).addClass('mdi-chevron-up');\n      } else {\n        $('.rup_list-mord', line).addClass('mdi-chevron-down');\n      }\n\n      $('.rup_list-mord').text(' '); //funcionalidad del sord\n\n      $('.rup_list-mord', line).off('click');\n      $('.rup_list-mord', line).click(function () {\n        if ($('.rup_list-mord', line).attr('data-direction') == 'asc') {\n          $('.rup_list-mord', line).attr('data-direction', 'desc');\n          $('.rup_list-mord', line).attr('aria-label', $.rup.i18n.base.rup_list.sort.desc);\n          $('.rup_list-mord', line).addClass('mdi-chevron-down');\n          $('.rup_list-mord', line).removeClass('mdi-chevron-up'); // Se cambia el aria-label de la línea entera para que sea entendible\n\n          $('.rup_list-mord', line).parent().attr('aria-label', \"\".concat($('.rup_list-mord', line).parent().text().trim(), \", \").concat($.rup.i18n.base.rup_list.sort.desc));\n        } else {\n          $('.rup_list-mord', line).attr('data-direction', 'asc');\n          $('.rup_list-mord', line).attr('aria-label', $.rup.i18n.base.rup_list.sort.asc);\n          $('.rup_list-mord', line).addClass('mdi-chevron-up');\n          $('.rup_list-mord', line).removeClass('mdi-chevron-down'); // Se cambia el aria-label de la línea entera para que sea entendible\n\n          $('.rup_list-mord', line).parent().attr('aria-label', \"\".concat($('.rup_list-mord', line).parent().text().trim(), \", \").concat($.rup.i18n.base.rup_list.sort.asc));\n        }\n\n        save();\n      }); //funcionalidad de retirar la ordenación\n\n      $('.rup_list-mord-remove', line).click(function () {\n        //recreamos el botón\n        var $btn = $(\"\\n                    <button class=\\\"rup_list-mord-field btn btn-material btn-material-sm btn-material-primary-low-emphasis\\\"\\n                        data-ordValue=\\\"\".concat($(line).attr('data-ordValue'), \"\\\">\\n                        \").concat(opciones.sidx.source.filter(function (x) {\n          return x.value == $(line).attr('data-ordValue');\n        })[0].i18nCaption, \"\\n                        <i class=\\\"mdi mdi-plus\\\"></i>\\n                    </button>\\n                \"));\n        $('.rup_list-mord-orderfields').append($btn.clone());\n        $('.rup_list-mord-orderfields').children().off('click');\n        $('.rup_list-mord-orderfields').children().on('click', function (e) {\n          self._actualizarOrdenMulti.apply(self, [e]);\n        }); // Eliminamos la linea\n\n        $(line).remove();\n        save();\n      });\n      save();\n    },\n\n    /**\r\n     * Método interno para seleccionar todos los elementos de la lista.\r\n     *\r\n     * @name _selectAll\r\n     * @private\r\n     * @function\r\n     */\n    _selectAll: function _selectAll() {\n      var self = this;\n      var opciones = self.options;\n      opciones.multiselection.selectedAll = true;\n      opciones.multiselection.selectedIds = [];\n      opciones.multiselection.selectedRowsPerPage = [];\n\n      self._getPageElementsIds().forEach(function (elem) {\n        $('#' + elem).addClass('rup_list-item-selected');\n        $('#' + elem).attr('aria-selected', 'true');\n      });\n\n      $('#' + self.element[0].id).trigger('listAfterMultiselection');\n    },\n\n    /**\r\n     * Método interno para deseleccionar todos los elementos de la lista\r\n     *\r\n     * @name _deselectAll\r\n     * @private\r\n     * @function\r\n     */\n    _deselectAll: function _deselectAll() {\n      var self = this;\n      var opciones = self.options;\n      opciones.multiselection.selectedAll = false;\n      opciones.multiselection.selectedIds = null;\n      opciones.multiselection.selectedRowsPerPage = null;\n\n      self._getPageElementsIds().forEach(function (elem) {\n        $('#' + elem).removeClass('rup_list-item-selected');\n        $('#' + elem).attr('aria-selected', 'false');\n      });\n\n      $('#' + self.element[0].id).trigger('listAfterMultiselection');\n    },\n\n    /**\r\n     * Método interno para seleccionar todos los elementos en la página actual\r\n     *\r\n     * @name _selectPage\r\n     * @private\r\n     * @function\r\n     */\n    _selectPage: function _selectPage() {\n      var self = this;\n      var opciones = self.options;\n\n      if (opciones.multiselection.selectedIds == null) {\n        opciones.multiselection.selectedIds = [];\n      }\n\n      if (opciones.multiselection.selectedRowsPerPage == null) {\n        opciones.multiselection.selectedRowsPerPage = [];\n      }\n\n      if (opciones.multiselection.selectedAll == false) {\n        self._getPageIds().forEach(function (arrElem) {\n          var tmp = opciones.multiselection.selectedRowsPerPage.filter(function (x) {\n            return x.id == arrElem;\n          });\n\n          if (tmp.length == 0) {\n            var id = arrElem.split('_').pop();\n            opciones.multiselection.selectedIds.push(id);\n            opciones.multiselection.selectedRowsPerPage.push({\n              id: arrElem,\n              line: function () {\n                var cont = 0;\n                var _final2 = 0;\n                self.element.children().toArray().forEach(function (element) {\n                  if (element.id == arrElem) {\n                    _final2 = cont;\n                  }\n\n                  cont++;\n                });\n                return _final2;\n              }(),\n              page: opciones.page\n            });\n            $('#' + self.options._idItemTemplate + '_' + arrElem).addClass('rup_list-item-selected');\n            $('#' + self.options._idItemTemplate + '_' + arrElem).attr('aria-selected', 'true');\n          }\n        });\n      } else {\n        self._getPageIds().forEach(function (arrElem) {\n          var tmp = opciones.multiselection.selectedRowsPerPage.filter(function (x) {\n            return x.id == arrElem;\n          });\n\n          if (tmp.length > 0) {\n            var id = arrElem.split('_').pop();\n            opciones.multiselection.selectedIds = opciones.multiselection.selectedIds.filter(function (z) {\n              return z != id;\n            });\n            opciones.multiselection.selectedRowsPerPage = opciones.multiselection.selectedRowsPerPage.filter(function (z) {\n              return z.id != arrElem;\n            });\n            $('#' + self.options._idItemTemplate + '_' + arrElem).addClass('rup_list-item-selected');\n            $('#' + self.options._idItemTemplate + '_' + arrElem).attr('aria-selected', 'true');\n          }\n        });\n      }\n\n      if (opciones.multiselection.selectedIds.length == 0) {\n        opciones.multiselection.selectedIds = null;\n      }\n\n      if (opciones.multiselection.selectedRowsPerPage.length == 0) {\n        opciones.multiselection.selectedRowsPerPage = null;\n      }\n\n      $('#' + self.element[0].id).trigger('listAfterMultiselection');\n    },\n\n    /**\r\n     * Método interno para deseleccionar todos los elementos en la página actual\r\n     *\r\n     * @name _deselectPage\r\n     * @private\r\n     * @function\r\n     */\n    _deselectPage: function _deselectPage() {\n      var self = this;\n      var opciones = self.options;\n\n      if (opciones.multiselection.selectedIds == null) {\n        opciones.multiselection.selectedIds = [];\n      }\n\n      if (opciones.multiselection.selectedRowsPerPage == null) {\n        opciones.multiselection.selectedRowsPerPage = [];\n      }\n\n      if (opciones.multiselection.selectedAll == false) {\n        self._getPageIds().forEach(function (arrElem) {\n          var tmp = opciones.multiselection.selectedRowsPerPage.filter(function (x) {\n            return x.id == arrElem;\n          });\n\n          if (tmp.length > 0) {\n            var id = arrElem.split('_').pop();\n            opciones.multiselection.selectedIds = opciones.multiselection.selectedIds.filter(function (z) {\n              return z != id;\n            });\n            opciones.multiselection.selectedRowsPerPage = opciones.multiselection.selectedRowsPerPage.filter(function (z) {\n              return z.id != arrElem;\n            });\n            $('#' + self.options._idItemTemplate + '_' + arrElem).removeClass('rup_list-item-selected');\n            $('#' + self.options._idItemTemplate + '_' + arrElem).attr('aria-selected', 'false');\n          }\n        });\n      } else {\n        self._getPageIds().forEach(function (arrElem) {\n          var tmp = opciones.multiselection.selectedRowsPerPage.filter(function (x) {\n            return x.id == arrElem;\n          });\n\n          if (tmp.length == 0) {\n            var id = arrElem.split('_').pop();\n            opciones.multiselection.selectedIds.push(id);\n            opciones.multiselection.selectedRowsPerPage.push({\n              id: arrElem,\n              line: function () {\n                var cont = 0;\n                var _final3 = 0;\n                self.element.children().toArray().forEach(function (element) {\n                  if (element.id == arrElem) {\n                    _final3 = cont;\n                  }\n\n                  cont++;\n                });\n                return _final3;\n              }(),\n              page: opciones.page\n            });\n          }\n\n          $('#' + self.options._idItemTemplate + '_' + arrElem).removeClass('rup_list-item-selected');\n          $('#' + self.options._idItemTemplate + '_' + arrElem).attr('aria-selected', 'false');\n        });\n      }\n\n      if (opciones.multiselection.selectedIds.length == 0) {\n        opciones.multiselection.selectedIds = null;\n      }\n\n      if (opciones.multiselection.selectedRowsPerPage.length == 0) {\n        opciones.multiselection.selectedRowsPerPage = null;\n      }\n\n      $('#' + self.element[0].id).trigger('listAfterMultiselection');\n    },\n\n    /**\r\n     * Método interno que genera el desplegable de multiseleccion\r\n     *\r\n     * @name _generateSelectablesBtnGroup\r\n     * @private\r\n     * @function\r\n     */\n    _generateSelectablesBtnGroup: function _generateSelectablesBtnGroup() {\n      var self = this;\n      var selfId = self.element.attr('id');\n      var opciones = self.options;\n      var $btnGroup = $(\"\\n                <div class=\\\"btn-group h-100\\\" role=\\\"group\\\">\\n                    <button id=\\\"\".concat(selfId + '-display-selectables', \"\\\"\\n                        class=\\\"btn btn-secondary dropdown-toggle\\\" type=\\\"button\\\" data-toggle=\\\"dropdown\\\"\\n                        aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n                        \").concat(opciones._header.selectables.text(), \"\\n                    </button>\\n                    <div class=\\\"dropdown-menu\\\" aria-labelledby=\\\"\").concat(selfId + '-display-selectables', \"\\\">\\n                        <button class=\\\"dropdown-item selectable-selectPage\\\">\\n                            \").concat($.rup.i18n.base.rup_list.multiselection.selectAllPage, \"\\n                        </button>\\n                        <button class=\\\"dropdown-item selectable-deselectPage\\\">\\n                            \").concat($.rup.i18n.base.rup_list.multiselection.deselectAllPage, \"\\n                        </button>\\n                        <button class=\\\"dropdown-item selectable-selectAll\\\">\\n                            \").concat($.rup.i18n.base.rup_list.multiselection.selectAll, \"\\n                        </button>\\n                        <button class=\\\"dropdown-item selectable-deselectAll\\\">\\n                            \").concat($.rup.i18n.base.rup_list.multiselection.deselectAll, \"\\n                        </button>\\n                    </div>\\n                </div>\\n            \"));\n\n      opciones._header.selectables.text('');\n\n      opciones._header.selectables.append($btnGroup.clone());\n\n      if (opciones.createFooter) {\n        opciones._footer.selectables.text('');\n\n        opciones._footer.selectables.append($btnGroup.clone());\n      } //Creamos funcionalidad\n\n\n      $('.selectable-selectAll').on('click', function () {\n        self._selectAll.apply(self);\n      });\n      $('.selectable-deselectAll').on('click', function () {\n        self._deselectAll.apply(self);\n      });\n      $('.selectable-selectPage').on('click', function () {\n        self._selectPage.apply(self);\n      });\n      $('.selectable-deselectPage').on('click', function () {\n        self._deselectPage.apply(self);\n      });\n    },\n\n    /**\r\n     * Método interno para obtener los Ids de los elementos de la página actual\r\n     *\r\n     * @name _getPageElementsIds\r\n     * @private\r\n     * @function\r\n     */\n    _getPageElementsIds: function _getPageElementsIds() {\n      var self = this;\n      var keys = [];\n      $('#' + self.element[0].id).children().toArray().forEach(function (elem) {\n        keys.push(String($(elem)[0].id));\n      });\n      return keys;\n    },\n\n    /**\r\n     * Método interno para obtener los Ids de la página actual\r\n     *\r\n     * @name _getPageIds\r\n     * @private\r\n     * @function\r\n     */\n    _getPageIds: function _getPageIds() {\n      var self = this;\n      var keys = [];\n      $('#' + self.element[0].id).children().toArray().forEach(function (elem) {\n        keys.push(String($(elem).data('pk')));\n      });\n      return keys;\n    },\n\n    /**\r\n     * Método interno que otorga funcionalidad a la paginación\r\n     *\r\n     * @name _pagenavManagement\r\n     * @private\r\n     * @function\r\n     * @param {Number} numPages Número total de páginas\r\n     */\n    _pagenavManagement: function _pagenavManagement(numPages) {\n      var self = this;\n      var opciones = this.options;\n      var $pagenavH = opciones._header.pagenav;\n      var $pagenavH_prev = opciones._header.pagePrev;\n      var $pagenavH_next = opciones._header.pageNext;\n      var $pagenavF = opciones._footer.pagenav;\n      var $pagenavF_prev = opciones._footer.pagePrev;\n      var $pagenavF_next = opciones._footer.pageNext; // Si el número de páginas a mostrar es superior a las configuradas como visibles hay que mostrar el separador\n\n      if (numPages > opciones.visiblePages + 1) {\n        // Mostrar las páginas visibles antes del separador\n        var initPage = 1;\n        var endPage = 1;\n\n        if (opciones.page >= opciones.visiblePages) {\n          if (opciones.page + opciones.visiblePages - 1 > numPages) {\n            initPage = numPages - opciones.visiblePages + 1;\n          } else {\n            initPage = opciones.page - 1;\n          } // Se añade la página inicial\n\n\n          var $page = $('<li data-page=\"' + 1 + '\"><div class=\"page-link\" href=\"javascript:void(0)\">' + 1 + '</div></li>');\n          $page.addClass('rup_list-page-item page-item page');\n          $page.attr('tabindex', '0');\n          $page.attr('role', 'button');\n          $page.attr('aria-controls', self.element.attr('id'));\n          $page.attr('aria-label', $.rup.i18nTemplate($.rup.i18n.base.rup_list, 'paginaLabel', 1, numPages));\n          $pagenavH.find('.page-separator').first().before($page);\n          $pagenavF.find('.page-separator').first().before($page.clone());\n\n          if (opciones.page - opciones.visiblePages > 0) {\n            // Mostrar el separador de inicio\n            $pagenavH.find('.page-separator').first().show();\n            $pagenavH.find('.page-separator').first().attr('aria-hidden', 'false');\n            $pagenavF.find('.page-separator').first().show();\n            $pagenavF.find('.page-separator').first().attr('aria-hidden', 'false');\n          }\n        }\n\n        endPage = initPage + opciones.visiblePages < numPages ? initPage + opciones.visiblePages : numPages + 1;\n\n        for (var i = initPage; i < endPage; i++) {\n          var _$page = $('<li data-page=\"' + i + '\"><div class=\"page-link\" href=\"javascript:void(0)\">' + i + '</div></li>');\n\n          _$page.addClass('rup_list-page-item page-item page');\n\n          _$page.attr('tabindex', '0');\n\n          _$page.attr('role', 'button');\n\n          _$page.attr('aria-controls', self.element.attr('id'));\n\n          _$page.attr('aria-label', $.rup.i18nTemplate($.rup.i18n.base.rup_list, 'paginaLabel', i, numPages));\n\n          $pagenavH.find('.page-separator').last().before(_$page);\n          $pagenavF.find('.page-separator').last().before(_$page.clone());\n        }\n\n        if (opciones.page + opciones.visiblePages - 1 < numPages) {\n          // Mostrar el separador de fin\n          $pagenavH.find('.page-separator').last().show();\n          $pagenavH.find('.page-separator').last().attr('aria-hidden', 'false');\n          $pagenavF.find('.page-separator').last().show();\n          $pagenavF.find('.page-separator').last().attr('aria-hidden', 'false');\n        }\n\n        if (endPage < numPages) {\n          // Añadir el número de la página final\n          var _$page2 = $('<li data-page=\"' + numPages + '\"><div class=\"page-link\" href=\"javascript:void(0)\">' + numPages + '</div></li>');\n\n          _$page2.addClass('rup_list-page-item page-item page');\n\n          _$page2.attr('tabindex', '0');\n\n          _$page2.attr('role', 'button');\n\n          _$page2.attr('aria-controls', self.element.attr('id'));\n\n          _$page2.attr('aria-label', $.rup.i18nTemplate($.rup.i18n.base.rup_list, 'paginaLabel', numPages, numPages));\n\n          $pagenavH.find('.page-separator').last().after(_$page2);\n          $pagenavF.find('.page-separator').last().after(_$page2.clone());\n        }\n      } else {\n        // Añadir todas las páginas al nav\n        for (var _i4 = numPages; _i4 > 0; _i4--) {\n          var _$page3 = $('<li data-page=\"' + _i4 + '\"><div class=\"page-link\" href=\"javascript:void(0)\">' + _i4 + '</div></li>');\n\n          _$page3.addClass('rup_list-page-item page-item page');\n\n          _$page3.attr('tabindex', '0');\n\n          _$page3.attr('role', 'button');\n\n          _$page3.attr('aria-controls', self.element.attr('id'));\n\n          _$page3.attr('aria-label', $.rup.i18nTemplate($.rup.i18n.base.rup_list, 'paginaLabel', _i4, numPages));\n\n          $pagenavH_prev.after(_$page3);\n          $pagenavF_prev.after(_$page3.clone());\n        }\n      } // Ocultar el pagenav si sólo se muestra una única página\n\n\n      if (numPages > 1) {\n        opciones._header.pagenav.show();\n\n        if (opciones.createFooter) {\n          opciones._footer.pagenav.show();\n        }\n      } else {\n        opciones._header.pagenav.hide();\n\n        if (opciones.createFooter) {\n          opciones._footer.pagenav.hide();\n        }\n      }\n\n      var $activePageHeader = $('#' + opciones._idListHeader.pagenav + ' ' + '.page[data-page=\"' + opciones.page + '\"]');\n      var $activePageFooter = $('#' + opciones._idListFooter.pagenav + ' ' + '.page[data-page=\"' + opciones.page + '\"]'); // Marcar la página actual como activa\n\n      $activePageHeader.toggleClass('active');\n      $activePageHeader.attr('aria-current', 'true');\n      $activePageFooter.toggleClass('active');\n      $activePageFooter.attr('aria-current', 'true'); // Funcionamiento del pagenav\n\n      $('#' + opciones._idListHeader.pagenav + ' .rup_list-page-item.page, #' + opciones._idListFooter.pagenav + ' .rup_list-page-item.page').on('click', function () {\n        var $pageActiveHeader = $('#' + opciones._idListHeader.pagenav + ' .rup_list-page-item.page.active');\n        var $pageActiveFooter = $('#' + opciones._idListFooter.pagenav + ' .rup_list-page-item.page.active'); // La página activa se desactiva\n\n        $pageActiveHeader.toggleClass('active');\n        $pageActiveHeader.attr('aria-current', 'false');\n        $pageActiveFooter.toggleClass('active');\n        $pageActiveFooter.attr('aria-current', 'false'); // La página seleccionada se activa\n\n        $(this).toggleClass('active');\n        $(this).attr('aria-current', 'true');\n\n        self._changeOption('page', $(this).data('page'));\n      });\n\n      if (opciones.page > 1) {\n        self._enableNavItem($pagenavH_prev);\n\n        self._enableNavItem($pagenavF_prev);\n      } else {\n        self._disableNavItem($pagenavH_prev);\n\n        self._disableNavItem($pagenavF_prev);\n      }\n\n      if (opciones.page < numPages) {\n        self._enableNavItem($pagenavH_next);\n\n        self._enableNavItem($pagenavF_next);\n      } else {\n        self._disableNavItem($pagenavH_next);\n\n        self._disableNavItem($pagenavF_next);\n      }\n    },\n\n    /**\r\n     * Método interno que se encarga de reordenar del servidor\r\n     *\r\n     * @name _reorderDataFromServer\r\n     * @private\r\n     * @function\r\n     */\n    _reorderDataFromServer: function _reorderDataFromServer(self, opciones, xhr) {\n      var reorderSelection = xhr.reorderedSelection;\n\n      if (reorderSelection !== null && reorderSelection.length > 0 && xhr.records != reorderSelection.length) {\n        //Se mira la nueva reordenacion y se ordena.\n        opciones.multiselection.selectedIds = [];\n        opciones.multiselection.selectedRowsPerPage = []; //Viene del servidor por eso la linea de la pagina es 1 menos.\n\n        $.each(reorderSelection, function (index, p) {\n          var arra = {\n            id: p.pk[opciones.key],\n            page: p.page,\n            line: p.pageLine - 1\n          };\n          opciones.multiselection.selectedIds.splice(index, 0, arra.id);\n          opciones.multiselection.selectedRowsPerPage.splice(index, 0, arra);\n        });\n        $('#' + self.element[0].id).triggerHandler('listAfterReorderData', opciones);\n      }\n    },\n\n    /**\r\n     * Método interno que se encarga del bloqueo del componente\r\n     *\r\n     * @name _lock\r\n     * @private\r\n     * @function\r\n     */\n    _lock: function _lock() {\n      var self = this;\n      var opciones = self.options;\n\n      if (opciones.isScrollList && opciones.stepOnLoad) {\n        $('#' + opciones._idOverlay).remove();\n\n        opciones._overlay.css({\n          'position': 'relative',\n          'height': 'auto'\n        });\n\n        self.element.after(opciones._overlay);\n      } else {\n        opciones._header.obj.css('opacity', '0.3');\n\n        self.element.css('opacity', '0.3');\n\n        if (opciones.createFooter) {\n          opciones._footer.obj.css('opacity', '0.3');\n        }\n\n        $('#' + opciones._idOverlay).remove();\n\n        opciones._overlay.css({\n          'position': 'absolute'\n        });\n\n        opciones._content.prepend(opciones._overlay);\n\n        opciones._overlay.height(opciones._content.height());\n      }\n    },\n\n    /**\r\n     * Método interno que se encarga del desbloqueo del componente\r\n     *\r\n     * @name _unlock\r\n     * @private\r\n     * @function\r\n     */\n    _unlock: function _unlock() {\n      var self = this;\n      var opciones = self.options;\n\n      opciones._header.obj.css('opacity', '1');\n\n      self.element.css('opacity', '1');\n\n      if (opciones.createFooter) {\n        opciones._footer.obj.css('opacity', '1');\n      }\n\n      $('#' + opciones._idOverlay).remove();\n    },\n\n    /**\r\n     * Método para destruir el componente\r\n     *\r\n     * @name destroy\r\n     * @public\r\n     * @function\r\n     * @example\r\n     * $('#rup-list').rup_list('destroy');\r\n     */\n    destroy: function destroy() {\n      var self = this;\n      var opciones = this.options;\n      $(self.element).empty();\n\n      if (opciones.createFooter) {\n        opciones._footer.obj.remove();\n      }\n\n      opciones.feedback.rup_feedback('destroy');\n      $.Widget.prototype.destroy.apply(this, arguments);\n    },\n\n    /**\r\n     * Método interno que se encarga de realizar el filtrado y construir la lista desde los datos recibidos\r\n     *\r\n     * @name _doFilter\r\n     * @private\r\n     * @function\r\n     */\n    _doFilter: function _doFilter() {\n      var self = this;\n      var opciones = this.options;\n      var $itemTemplate = opciones._itemTemplate;\n      var $pagenavH = opciones._header.pagenav;\n      var $pagenavF = opciones._footer.pagenav; // Validar si la ordenacion es simple o múltiple\n\n      var sidx = '';\n      var sord = '';\n\n      if (opciones.isMultiSort) {\n        sidx = opciones.multiorder.sidx;\n        sord = opciones.multiorder.sord;\n      } else {\n        sidx = opciones.sidx.value;\n        sord = opciones.sord;\n      } // Componer el filtro\n\n\n      var filter = {\n        filter: $('#' + opciones.filterForm).rup_form('formToJson'),\n        page: opciones.page,\n        rows: opciones.rowNum.value,\n        sidx: sidx,\n        sord: sord,\n        multiselection: opciones.multiselection,\n        core: {\n          pkNames: [opciones.key],\n          pkToken: '~'\n        }\n      };\n      /**\r\n       * SHOW, HIDE\r\n       */\n\n      if (opciones.show) {\n        if (opciones.show.constructor == Object) {\n          opciones.show = opciones.show;\n        }\n      } else if (opciones.show == false) {\n        opciones.show = {};\n        opciones.animation = false;\n      } else {\n        opciones.show = {};\n        opciones.show.animation = 'drop';\n        opciones.show.delay = 200;\n      }\n\n      if (opciones.hide) {\n        if (opciones.hide.constructor == Object) {\n          opciones.hide = opciones.hide;\n        }\n      } else if (opciones.hide == false) {\n        opciones.hide = {};\n        opciones.animation = false;\n      } else {\n        opciones.hide = {};\n        opciones.hide.animation = 'drop';\n        opciones.hide.delay = 200;\n      }\n\n      if (opciones.btnPrint) {\n        if (opciones.btnPrint[0].disabled) {\n          opciones.btnPrint[0].disabled = false;\n        }\n      } // Si hay formulario de filtrado se valida antes de filtrar\n\n\n      var canFilter = true;\n\n      if ($(\"form[id=\\\"\".concat(opciones.filterForm, \"\\\"]\")).length == 1) {\n        canFilter = $('#' + opciones.filterForm).rup_form('valid');\n      }\n\n      if (canFilter) {\n        jQuery.rup_ajax({\n          url: opciones.action,\n          type: 'POST',\n          dataType: 'json',\n          data: JSON.stringify(filter),\n          contentType: 'application/json',\n          beforeSend: function beforeSend() {\n            self.element.trigger('beforeLoad', filter);\n          },\n          success: function success(xhr) {\n            $pagenavH.find('.page').remove();\n            $pagenavH.find('.page-separator').hide();\n            $pagenavH.find('.page-separator').attr('aria-hidden', 'true');\n            $pagenavF.find('.page').remove();\n            $pagenavF.find('.page-separator').hide();\n            $pagenavF.find('.page-separator').attr('aria-hidden', 'true');\n\n            if (xhr === null || xhr.length === 0) {\n              opciones._header.obj.hide();\n\n              self.element.hide();\n\n              if (opciones.createFooter) {\n                opciones._footer.obj.hide();\n              }\n\n              opciones.records = 0;\n              opciones.feedback.rup_feedback('set', $.rup.i18n.base.rup_table.errors.errorOnGet, 'error');\n\n              opciones._content.slideDown();\n\n              self.element.trigger('load');\n              $(self.element).attr('aria-live', 'polite');\n              self.isFiltering.resolve();\n\n              self._unlock();\n            } else {\n              if (xhr.rows && xhr.rows.length > 0) {\n                self._reorderDataFromServer(self, opciones, xhr);\n\n                var initRecord = (opciones.page - 1) * parseInt(opciones.rowNum.value) + 1;\n                var endRecord = initRecord + xhr.rows.length - 1;\n                var records = parseInt(xhr.records) == 0 ? xhr.rows.length : xhr.records;\n                opciones.records = records;\n                var msgRecords = $.rup.i18nTemplate($.rup.i18n.base.rup_table.defaults, 'recordtext', initRecord, endRecord, records);\n                opciones.feedback.rup_feedback({});\n                opciones.feedback.rup_feedback('set', msgRecords, 'ok');\n\n                self._pagenavManagement(Math.ceil(xhr.records / opciones.rowNum.value));\n\n                $.each(xhr.rows, function (index, elem) {\n                  var $item = $itemTemplate.clone(true, true);\n                  $item.removeClass('rup_list-itemTemplate');\n                  $item.addClass('rup_list-item');\n                  $item.attr('id', $item.attr('id') + '_' + elem[opciones.key]);\n                  $item.data('all', elem);\n                  $item.data('pk', elem[opciones.key]);\n                  var elemArr = $.rup_utils.jsontoarray(elem);\n                  var elemArrKeys = Object.keys($.rup_utils.jsontoarray(elem));\n\n                  if (opciones.selectable) {\n                    var selectorElement = $(opciones.selectable.selector, $item);\n                    selectorElement.attr('id', selectorElement.attr('id') + '_' + elem[opciones.key]);\n                  }\n\n                  if (xhr.reorderedSelection) {\n                    var tmp = xhr.reorderedSelection.filter(function (arrItem) {\n                      return arrItem.pk[opciones.key] == elem[opciones.key];\n                    });\n\n                    if (tmp.length > 0 && !xhr.selectedAll || tmp.length == 0 && xhr.selectedAll || xhr.records == xhr.reorderedSelection.length) {\n                      $item.addClass('rup_list-item-selected');\n                      $item.attr('aria-selected', 'true');\n                    }\n                  }\n\n                  for (var i = 0; i < elemArrKeys.length; ++i) {\n                    $item.find('[id=\"' + elemArrKeys[i] + '_label\"]').text(opciones.colNames[elemArrKeys[i]] ? opciones.colNames[elemArrKeys[i]] : elemArrKeys[i]).attr('id', elemArrKeys[i] + '_label_' + elem[opciones.key]);\n                    $item.find('[id=\"' + elemArrKeys[i] + '_value\"]').text(elemArr[elemArrKeys[i]]).attr('id', elemArrKeys[i] + '_value_' + elem[opciones.key]);\n                  }\n\n                  $('#' + self.element[0].id).trigger('modElement', [$item, elem]);\n                }); // si ha resultados se muestran cabecera/pie y listado\n\n                opciones._header.obj.show();\n\n                self.element.show();\n\n                if (opciones.createFooter) {\n                  opciones._footer.obj.show();\n                } // Si no se está mostrando el content se despliega\n\n\n                opciones._content.slideDown();\n\n                if (!opciones.content) {\n                  opciones.content = {};\n                }\n\n                if (opciones.content.length == 0 || opciones.content.length == undefined) {\n                  opciones.content = xhr.rows;\n                } else {\n                  if (!opciones.isScrollList) {\n                    opciones.content = xhr.rows;\n                  } else {\n                    var x = opciones.content.length;\n\n                    for (var i = 0; i < xhr.rows.length; i++) {\n                      opciones.content[x + i] = xhr.rows[i];\n                    }\n                  }\n                } // A11Y\n\n\n                $('.rup_list-item').attr('role', 'listitem');\n\n                if (opciones.selectable) {\n                  $(opciones.selectable.selector + '.rup_list-item').attr('tabindex', '0');\n                  $(opciones.selectable.selector + '.rup_list-item').attr('role', 'option');\n                }\n              } else {\n                // Si no se devuelven resultados\n                opciones._header.obj.hide();\n\n                self.element.hide();\n\n                if (opciones.createFooter) {\n                  opciones._footer.obj.hide();\n                }\n\n                opciones.records = 0;\n                opciones.feedback.rup_feedback('set', $.rup.i18n.base.rup_table.defaults.emptyrecords, 'alert');\n\n                opciones._content.slideDown();\n\n                self.element.trigger('load');\n                self.isFiltering.resolve();\n\n                self._unlock();\n              }\n            }\n\n            if (opciones.isScrollList) {\n              $pagenavH.hide();\n              $pagenavF.hide();\n            }\n\n            if (opciones.isHeaderSticky) {\n              self._headerSticky.apply(self);\n            }\n\n            self.element.children().each(function (i, e) {\n              setTimeout(function () {\n                $(e).show(opciones.show.animation, {}, opciones.show.delay, function () {\n                  if ($(e).next().length == 0) {\n                    self.element.css('height', 'auto');\n                    self.element.trigger('load');\n\n                    if (opciones.isScrollList && opciones.stepOnLoad) {\n                      self.isFiltering.resolve();\n\n                      self._unlock();\n                    }\n\n                    if (opciones.isScrollList) {\n                      self.options.stepLoad = self.element.children().length / self.options.rowNum.value;\n                      self.options.stepOnLoad = false;\n                      self.options.stepCounter = 0;\n                    }\n                  }\n\n                  if (i === self.element.children().length - 1 && !opciones.stepOnLoad) {\n                    $('.rup_list-item').removeAttr('aria-hidden');\n                    self.isFiltering.resolve();\n\n                    self._unlock();\n                  }\n                });\n\n                if (!opciones.show.animation) {\n                  if ($(e).next().length == 0) {\n                    self.element.css('height', 'auto');\n                    self.element.trigger('load');\n\n                    if (opciones.isScrollList && opciones.stepOnLoad) {\n                      self.isFiltering.resolve();\n\n                      self._unlock();\n                    }\n\n                    if (opciones.isScrollList) {\n                      self.options.stepLoad = self.element.children().length / self.options.rowNum.value;\n                      self.options.stepOnLoad = false;\n                      self.options.stepCounter = 0;\n                    }\n                  }\n                }\n              }, 50 + i * 50);\n            });\n          },\n          error: function error(XMLHttpResponse) {\n            opciones.feedback.rup_feedback('set', XMLHttpResponse.responseText, 'error');\n\n            opciones._header.obj.hide();\n\n            self.element.hide();\n\n            if (opciones.createFooter) {\n              opciones._footer.obj.hide();\n            }\n\n            opciones._content.slideDown();\n\n            self.element.trigger('load');\n            self.isFiltering.resolve();\n\n            self._unlock();\n          }\n        });\n      } else {\n        self.element.trigger('load');\n        self.isFiltering.resolve();\n\n        self._unlock();\n      }\n    },\n\n    /**\r\n     * Método que se encarga de realizar una recarga de la lista\r\n     *\r\n     * @name reload\r\n     * @public\r\n     * @function\r\n     * @example\r\n     * $('#rup-list').rup_list('reload');\r\n     */\n    reload: function reload() {\n      var self = this,\n          opciones = self.options;\n      $.when(self.isFiltering).done(function () {\n        // Reiniciar la promesa de filtrado\n        delete self.isFiltering;\n        self.isFiltering = $.Deferred();\n\n        self._lock();\n\n        if (self.element.children().length > 0) {\n          // Eliminar el listado actual y buscar el nuevo\n          self.element.css('height', self.element.outerHeight() + 16).children().each(function (i, e) {\n            setTimeout(function () {\n              $(e).hide(opciones.hide.animation, {}, opciones.hide.delay, function () {\n                $(this).attr('aria-hidden', 'true');\n                $(this).remove(); // Si hemos llegado al último elemento procedemos a buscar el nuevo listado\n\n                if (self.element.children().length == 0) {\n                  self._doFilter();\n                }\n              });\n            }, 50 + i * 50);\n          });\n        } else {\n          self._doFilter();\n        }\n      });\n    },\n\n    /**\r\n     * Método que se encarga de realizar el filtrado de la lista\r\n     *\r\n     * @name filter\r\n     * @public\r\n     * @function\r\n     * @example\r\n     * $('#rup-list').rup_list('filter');\r\n     */\n    filter: function filter() {\n      var self = this;\n      var opciones = this.options;\n      opciones.page = 1;\n      $.when(self.isFiltering).done(function () {\n        // Reiniciar la promesa de filtrado\n        delete self.isFiltering;\n        self.isFiltering = $.Deferred();\n\n        self._lock();\n\n        if (self.element.children().length > 0) {\n          // Eliminar el listado actual y buscar el nuevo\n          self.element.css('height', self.element.outerHeight() + 16).children().each(function (i, e) {\n            setTimeout(function () {\n              $(e).hide(opciones.hide.animation, {}, opciones.hide.delay, function () {\n                $(this).remove();\n                $(this).attr('aria-hidden', 'true');\n\n                if (opciones.isScrollList) {\n                  self._deselectAll();\n                } // Si hemos llegado al último elemento procedemos a buscar el nuevo listado\n\n\n                if (self.element.children().length == 0) {\n                  self._doFilter();\n                }\n              });\n            }, 50 + i * 50);\n          });\n        } else {\n          self._doFilter();\n        }\n      });\n    },\n\n    /**\r\n     * Método para cambiar la página actual.\r\n     *\r\n     * @name page\r\n     * @public\r\n     * @function\r\n     * @param {Number} page La página a la que navegar\r\n     * @example\r\n     * $('#rup-list').rup_list('page', 3);\r\n     */\n    page: function page(_page) {\n      var self = this;\n\n      self._changeOption('page', _page);\n    },\n\n    /**\r\n     * Método que obtiene la información de la selección actual\r\n     *\r\n     * @name getSelectedIds\r\n     * @public\r\n     * @function\r\n     * @example\r\n     * $('#rup-list').rup_list('getSelectedIds');\r\n     */\n    getSelectedIds: function getSelectedIds() {\n      var self = this;\n      var options = self.options.multiselection;\n      return {\n        selectedIds: options.selectedIds,\n        selectedAll: options.selectedAll\n      };\n    }\n  });\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.list.js?");

/***/ }),

/***/ "./src/rup.menu.js":
/*!*************************!*\
  !*** ./src/rup.menu.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n//require([\"jquery\", \"require-jqueryui\"],function (jQuery, widgetMenu) {\n\n/**\r\n * Menú de la aplicación mantenido a lo largo de todas las páginas de forma consistente que muestra entradas directas a secciones clave de la aplicación.\r\n *\r\n * @summary Componente RUP Menu.\r\n * @module rup_menu\r\n * @example\r\n * var properties={\r\n *   // Propiedades de configuración\r\n * };\r\n *\r\n * $(\"#idMenu\").rup_menu(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n  var rup_menu = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_menu', rup_menu)); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  $.fn.rup_menu('extend', {\n    /**\r\n     * Deshabilita una opción de menú.\r\n     *\r\n     * @function disable\r\n     * @param {string} entryMenuId - Identificador de la opción de menú que se desea deshabilitar.\r\n     * @example\r\n     * $(\"#idlanguage\").rup_menu(\"disable\",\"opAdmin);\r\n     */\n    disable: function disable(entryMenuId) {\n      var entryMenu = $('#' + entryMenuId);\n      entryMenu.addClass('ui-state-disabled'); //\t\t\tentryMenu.on(\"click\", function(event){event.preventDefault(); event.stopImmediatePropagation();});\n    },\n\n    /**\r\n     * Habilita una opción de menú.\r\n     *\r\n     * @name enable\r\n     * @function\r\n     * @param {string} entryMenuId - Identificador de la opción de menú que se desea habilitar.\r\n     * @example\r\n     * $(\"#idlanguage\").rup_menu(\"enable\",\"opAdmin);\r\n     */\n    enable: function enable(entryMenuId) {\n      var entryMenu = $('#' + entryMenuId);\n      entryMenu.removeClass('ui-state-disabled'); //\t\t\tentryMenu.off(\"click\");\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  $.fn.rup_menu('extend', {\n    /**\r\n     * Método de inicialización del componente.\r\n     *\r\n     * @function  _init\r\n     * @private\r\n     * @param {string} args - Opciones de configuración del componente.\r\n     */\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError' + $(this).attr('id')));\n      } else {\n        if (this.length > 0) {\n          //Se recogen y cruzan las paremetrizaciones del objeto\n          var settings = $.extend(true, {}, $.fn.rup_menu.defaults, args[0]),\n              self = this,\n              selectorSelf = this,\n              menuId = self[0].id,\n              json,\n              json_i18n; //visualizacion de los menus\n          //Se oculta la capa para que no aparezca deformada\n\n          selectorSelf.removeClass('rup_invisible_menu'); //Se determina el identificador de los literales y se cargan los mismos\n\n          if (settings.i18nId === undefined) {\n            settings.i18nId = menuId;\n          }\n\n          json_i18n = $.rup.i18n.app[settings.i18nId]; //Obtener estructura y literales\n\n          if (settings.menu !== undefined) {\n            json = settings.menu;\n          } else if (settings.json !== undefined) {\n            json = settings.json;\n          } //Se extienden las funcionalidades del menú para ajustarlas a las necesidades de funcionamiento del rup_menu\n          //\t\t\t\t\t\twidgetMenu.widget( \"ui.rupMenu\", widgetMenu.ui.menu, $.rup.compatibility.menu );\n          //En caso de ser necesario, se secra el objeto que compondra la estructura del menu\n\n\n          if (json !== undefined) {\n            //Generar estructura de menu\n            self._parseJSON(json, json_i18n, selectorSelf, settings.forceAbs);\n\n            selectorSelf = window.widgetMenu('#' + self.attr('id'));\n          } //Se trata el evento de selección para que se produzca una redirección de menú automática\n\n\n          var selectUserEvent = settings.select;\n\n          settings.select = function (event, ui) {\n            if (selectUserEvent !== undefined && selectUserEvent !== null) {\n              if (typeof selectUserEvent === 'function') {\n                if (selectUserEvent(event, ui) === false) {\n                  return false;\n                }\n              }\n            } //Comportamiento por defecto del evento\n\n\n            if (/^keydown/.test(event.originalEvent.type)) {\n              event.stopImmediatePropagation();\n              var redirectObject = $(ui.item.children());\n\n              if (redirectObject.attr('target') !== '_blank') {\n                $(location).attr('href', redirectObject.attr('href'));\n              } else {\n                if ($.rup.browser.isFF) {\n                  var wm = window.Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(window.Components.interfaces.nsIWindowMediator);\n                  var recentWindow = wm.getMostRecentWindow('navigator:browser');\n                  recentWindow.delayedOpenTab(redirectObject.attr('href'), null, null, null, null);\n                } else if ($.rup.browser.isChrome) {\n                  window.chrome.tabs.create({\n                    'url': redirectObject.attr('href')\n                  });\n                } else {\n                  window.open(redirectObject.attr('href'), '_blank');\n                }\n              }\n            }\n\n            return false;\n          }; //Enlaces externos (add icon)\n\n\n          selectorSelf.find('a[target=\\'_blank\\']').append('<span class=\\'ui-icon ui-icon-extlink rup_external_link\\'></span>'); //Se comienza a crear el menu segun el tipo\n\n          if (settings.display === 'horizontal') {\n            //\t\t\t\t\t\t\tselectorSelf.on(\"mouseenter\", \".rup_menu_horizontal_children.ui-menu-item\", function( event ) {\n            //\t\t\t\t\t\t\t\tevent.stopImmediatePropagation();\n            //\t\t\t\t\t\t\t\tevent.preventDefault();\n            //\t\t\t\t\t\t\t\tevent.stopPropagation();\n            //\t\t\t\t\t\t\t\treturn false;\n            //\t\t\t\t\t\t\t});\n            selectorSelf.on('mouseenter', '.ui-menu-item', function (event) {\n              // Ignore mouse events while typeahead is active, see #10458.\n              // Prevents focusing the wrong item when typeahead causes a scroll while the mouse\n              // is over an item in the menu\n              var $uiMenu = selectorSelf.data().uiMenu;\n\n              if ($uiMenu.previousFilter) {\n                return;\n              }\n\n              var target = $(event.currentTarget); //\t\t\t\t\t\t\t\tconsole.log(\"rup-this:\");\n              //\t\t\t\t\t\t\t\tconsole.log($uiMenu);\n              //\t\t\t\t\t\t\t\tconsole.log(\"rup-taget:\");\n              //\t\t\t\t\t\t\t\tconsole.log(target);\n              //\t\t\t\t\t\t\t\tconsole.log(\"position:\");\n              //\t\t\t\t\t\t\t\tconsole.log($uiMenu.options.position);\n\n              if (target.hasClass('rup_menu_horizontal_children')) {\n                $uiMenu.options.position = {\n                  my: 'left top',\n                  at: 'left bottom',\n                  collision: 'none none',\n                  of: this\n                };\n              } else {\n                $uiMenu.options.position = {\n                  my: 'left bottom',\n                  at: 'right bottom'\n                };\n              } // Remove ui-state-active class from siblings of the newly focused menu item\n              // to avoid a jump caused by adjacent elements both having a class with a border\n\n\n              target.siblings('.ui-state-active').removeClass('ui-state-active');\n              $uiMenu.focus(event, target);\n              event.stopImmediatePropagation();\n              event.preventDefault();\n              event.stopPropagation();\n              return false;\n            }); //\t\t\t\t\t\t\tselectorSelf.on(\"mouseenter\", \" .rup_menu_vertical_horizontal.ui-menu\", function( event ) {\n            //\n            //\t\t\t\t\t\t\t\t$(this).addClass(\".ui-state-active\");\n            //\n            //\t\t\t\t\t\t\t\tevent.stopImmediatePropagation();\n            //\t\t\t\t\t\t\t\tevent.preventDefault();\n            //\t\t\t\t\t\t\t\tevent.stopPropagation();\n            //\t\t\t\t\t\t\t\treturn false;\n            //\t\t\t\t\t\t\t});\n            //\t\t\t\t\t\t\tselectorSelf.on(\"mouseleave\",\".rup_menu_horizontal_children.ui-menu-item,.rup_menu_vertical_horizontal.ui-menu\",function(event){\n            //\n            //\t\t\t\t\t\t\t\t$(this).parents(\".ui-state-active\").removeClass(\"ui-state-active\");\n            //\n            //\t\t\t\t\t\t\t\treturn false;\n            //\t\t\t\t\t\t\t});\n\n            selectorSelf.on('keydown', function (event) {\n              var $uiMenu = selectorSelf.data().uiMenu; //\t\t\t\t\t\t\t\tconsole.log($uiMenu.active);\n\n              switch (event.keyCode) {\n                case $.ui.keyCode.UP:\n                  $uiMenu.previous(event);\n                  event.stopImmediatePropagation();\n                  event.preventDefault();\n                  event.stopPropagation();\n                  break;\n\n                case $.ui.keyCode.DOWN:\n                  if ($uiMenu.active && !$uiMenu.active.is('.ui-state-disabled')) {\n                    if ($uiMenu.active.hasClass('rup_menu_horizontal_children')) {\n                      $uiMenu.options.position = {\n                        my: 'left top',\n                        at: 'left bottom',\n                        collision: 'none none',\n                        of: $uiMenu.active\n                      };\n                      $uiMenu.expand(event);\n                    } else {\n                      $uiMenu.next(event);\n                    }\n                  }\n\n                  event.stopImmediatePropagation();\n                  event.preventDefault();\n                  event.stopPropagation();\n                  break;\n\n                case $.ui.keyCode.LEFT:\n                  if (!$uiMenu.active.hasClass('rup_menu_horizontal_children')) {\n                    $uiMenu.collapse(event);\n                  } else {\n                    $uiMenu.previous(event);\n                  }\n\n                  event.stopImmediatePropagation();\n                  event.preventDefault();\n                  event.stopPropagation();\n                  break;\n\n                case $.ui.keyCode.RIGHT:\n                  if (!$uiMenu.active.hasClass('rup_menu_horizontal_children') && $uiMenu.active.is('[aria-haspopup=\\'true\\']')) {\n                    $uiMenu.options.position = {\n                      my: 'left bottom',\n                      at: 'right bottom'\n                    };\n                    $uiMenu.expand(event);\n                  } else {\n                    $uiMenu.next(event);\n                  }\n\n                  event.stopImmediatePropagation();\n                  event.preventDefault();\n                  event.stopPropagation();\n                  break;\n\n                case $.ui.keyCode.HOME:\n                  $uiMenu._move('first', 'first', event);\n\n                  event.stopImmediatePropagation();\n                  event.preventDefault();\n                  event.stopPropagation();\n                  break;\n              }\n            }); //\n            //\t\t\t\t\t\t\tselectorSelf.on(\"click\", \".rup_menu_horizontal_children.ui-menu-item\", function( event ) {\n            //\t\t\t\t\t\t\t\tevent.stopImmediatePropagation();\n            //\t\t\t\t\t\t\t\tevent.preventDefault();\n            //\t\t\t\t\t\t\t\tevent.stopPropagation();\n            //\t\t\t\t\t\t\t\tthis.focus();\n            //\t\t\t\t\t\t\t\treturn false;\n            //\t\t\t\t\t\t\t});\n            //\t\t\t\t\t\t\tselectorSelf.on(\"click\", \".rup_menu_horizontal_children.rup_menu_horizontal_children_double.ui-menu-item\", function( event ) {\n            //\t\t\t\t\t\t\t\tconsole.log(this);\n            ////\t\t\t\t\t\t\t\t$(this).removeClass(\"ui-state-active\");\n            //\n            //\t\t\t\t\t\t\t\tvar $uiMenu = selectorSelf.data().uiMenu;\n            //\n            //\n            ////\t\t\t\t\t\t\t\tvar $submenu = $(this).children(\"ul\");\n            //\t\t\t\t\t\t\t\t$uiMenu.options.position = { my: \"left top\", at: \"left bottom\", collision:\"none none\", of: this };\n            //\n            //\t\t\t\t\t\t\t\tif ( $uiMenu.previousFilter ) {\n            //\t\t\t\t\t\t\t\t\treturn;\n            //\t\t\t\t\t\t\t\t}\n            //\t\t\t\t\t\t\t\tvar target = $( this);\n            //\t\t\t\t\t\t\t\t// Remove ui-state-active class from siblings of the newly focused menu item\n            //\t\t\t\t\t\t\t\t// to avoid a jump caused by adjacent elements both having a class with a border\n            //\t\t\t\t\t\t\t\ttarget.siblings( \".ui-state-active\" ).removeClass( \"ui-state-active\" );\n            //\t\t\t\t\t\t\t\t$uiMenu.focus( event, target );\n            //\n            ////\t\t\t\t\t\t\t\t$submenu\n            ////\t\t\t\t\t\t\t\t\t.show()\n            ////\t\t\t\t\t\t\t\t\t.removeAttr( \"aria-hidden\" )\n            ////\t\t\t\t\t\t\t\t\t.attr( \"aria-expanded\", \"true\" )\n            ////\t\t\t\t\t\t\t\t\t.position($uiMenu.options.position);\n            ////\t\t\t\t\t\t\t\t$(this).removeClass(\"ui-state-active\");\n            ////\t\t\t\t\t\t\t\tevent.stopImmediatePropagation();\n            ////\t\t\t\t\t\t\t\tevent.preventDefault();\n            ////\t\t\t\t\t\t\t\tevent.stopPropagation();\n            ////\t\t\t\t\t\t\t\treturn false;\n            //\t\t\t\t\t\t\t});\n            //Se asocian los estilos específicos del menú horizontal\n\n            selectorSelf.addClass('rup_menu_horizontal').addClass('ui-widget-header');\n            selectorSelf.children().addClass('rup_menu_horizontal_children');\n            selectorSelf.children().children('a').addClass('rup_menu_horizontal_children_entry');\n            selectorSelf.menu(settings); //Se borran las entradas separadoras. En el menu horizontal no tienen sentido.\n\n            selectorSelf.children('.ui-menu-divider').remove(); //Ajustes de estilos para la primera capa del menu horizontal\n\n            selectorSelf.children('.ui-state-disabled').css({\n              'margin-top': '0em',\n              'margin-bottom': '0em'\n            });\n            $('#' + menuId + ' li.rup_menu_horizontal_children > a .ui-icon-caret-1-e').removeClass('ui-icon-caret-1-e').addClass('ui-icon-caret-1-s').addClass('rup-menu_horizontalIcon');\n            selectorSelf.children().children('a').css('font-weight', 'bold');\n            selectorSelf.children().each(function (position, object) {\n              var iconsWidth = 0;\n              $(object).children('.rup_menu_horizontal_children_entry:has(span:not(.rup-menu_horizontalIcon))').each(function (position, object) {\n                if ($(object).find('span').length === 1) {\n                  iconsWidth = $(object).find('span').width();\n                } else {\n                  iconsWidth = $(object).find('span:not(.rup-menu_horizontalIcon)').width() / 2;\n                }\n              });\n              $(object).css('width', $(object).width() + iconsWidth);\n            });\n            selectorSelf.children().children('a').css('font-weight', '');\n            selectorSelf.children(':has(.rup_menu_horizontal_children_entry span:not(.rup-menu_horizontalIcon))').addClass('rup_menu_horizontal_childrenIcon');\n            selectorSelf.find('.rup_menu_horizontal_children_entry span:not(.rup-menu_horizontalIcon)').addClass('rup_menu_horizontal_children_icon');\n            selectorSelf.children(':has(.rup_menu_horizontal_children_entry span.rup-menu_horizontalIcon)').addClass('rup_menu_horizontal_childrenMenuIcon');\n            selectorSelf.children(':has(.rup_menu_horizontal_children_entry span.rup_menu_horizontal_children_icon):has(span.rup-menu_horizontalIcon)').addClass('rup_menu_horizontal_children_double');\n            selectorSelf.children(':last-child').addClass('rup_menu_horizontal_children_last'); //Asignación de los menús desplegables de primer menú\n\n            selectorSelf.children().children('[aria-haspopup=\\'true\\']').parent().attr('rupMenu_firsLevel', 'true');\n            $('#' + menuId + ' [rupmenu_firslevel=\\'true\\'] [role=\\'menu\\']').addClass('rup_menu_vertical_horizontal');\n\n            if (settings.verticalWidth === undefined) {\n              $('#' + menuId + ' [rupmenu_firslevel=\\'true\\'] [role=\\'menu\\']').css('white-space', 'nowrap');\n            } else {\n              $('#' + menuId + ' [rupmenu_firslevel=\\'true\\'] [role=\\'menu\\']').css('width', settings.verticalWidth);\n            } //Enlaces externos en primer nivel: editar estilos\n\n\n            selectorSelf.find('a[target=\\'_blank\\'] span.rup_menu_horizontal_children_icon').each(function (span_pos, span) {\n              //Cambiarlo en span con enlace externo (puede que haya otros span con iconos)\n              if ($(span).is('.ui-icon-extlink')) {\n                $(span).addClass('ui-menu-icon').removeClass('rup_menu_horizontal_children_icon');\n              }\n            }); //Si tiene enlace externo y otro enlace, se debe ampliar el LI y cambiar el margen del ext_link\n\n            var twoIconsLI = selectorSelf.find('a[target=\\'_blank\\'] span.rup_menu_horizontal_children_icon').parents('li');\n            twoIconsLI.css('width', twoIconsLI.width() + 16);\n            twoIconsLI.find('span.ui-icon-extlink').css('margin-left', '-1em');\n          } else if (settings.display === 'vertical') {\n            //Se le especifica el tamaño del menu\n            selectorSelf.addClass('rup_menu_vertical');\n\n            if (settings.verticalWidth === undefined) {\n              selectorSelf.css('white-space', 'nowrap');\n            } else {\n              selectorSelf.css('width', settings.verticalWidth);\n            }\n\n            selectorSelf.children().addClass('rup_menu_vertical_children'); //Se invoca a la generacion del menu\n\n            selectorSelf.menu(settings); //Se ajustan los tamaños de las sub-entradas del menú\n\n            if (settings.verticalWidth !== undefined) {\n              $('#' + menuId + ' .ui-menu .ui-menu-item').css('width', settings.verticalWidth);\n            }\n          } else {\n            $.rup.errorGestor($.rup.i18n.base.rup_menu.displayMenuError);\n          } // Ajuste estilos\n\n\n          selectorSelf.addClass('ui-corner-all');\n          selectorSelf.find('ul.rup_menu_vertical_horizontal').addClass('ui-corner-all'); //Ajuste margen iconos\n\n          var icon = false; //Buscar ULs verticales\n\n          $('ul.rup_menu_vertical, ul.rup_menu_vertical ul, ul.rup_menu_vertical_horizontal').each(function (ul_pos, ul) {\n            //Localizar SPANS\n            $(ul).children('li').children('a').children('span').each(function (span_pos, span) {\n              //Comprobar que el SPAN tiene un icono propio\n              if (!$(span).is('.ui-icon.ui-icon-extlink, .ui-icon.ui-icon-carat-1-e')) {\n                icon = true;\n                return false;\n              }\n            }); //Si tiene icono propio se aplica estilo a todos enlaces (margen)\n\n            if (icon) {\n              $(ul).children('li').children('a').css('padding-left', '2em');\n            } //Restablecer variable\n\n\n            icon = false;\n          }); //Ajuste de estilos para cubrir arista\n          //\t\t\t\t\t\t$(\"#\"+menuId+\" [role = 'menuitem']\").not($(\"[aria-haspopup = 'true']\")).css(\"text-decoration\",\"underline\");\n          //Se deshabilitan los botones desconectados\n\n          selectorSelf.find('a').on('click', function (event) {\n            if ($(event.currentTarget).hasClass('ui-state-disabled')) {\n              event.preventDefault();\n              event.stopImmediatePropagation();\n            }\n          }); //Se asocia un \"tabIndex=-1\" a todos los enlaces deshabilitados\n          //\t\t\t\t\t\tselectorSelf.find(\".ui-state-disabled\").attr(\"tabindex\",\"-1\");\n        }\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_menu', 'init');\n    },\n\n    /**\r\n     * Parsea un objeto json para generar la estructura de menú de acuerdo a la información contenida en el.\r\n     *\r\n     * @function  _parseJSON\r\n     * @private\r\n     */\n    _parseJSON: function _parseJSON(json, json_i18n, self, force) {\n      var submenu,\n          element,\n          objectUrl = '',\n          entry; //Se transforma el objeto base del menu\n\n      if (self.attr('uda-submenu') === 'true') {\n        self.attr('uda-submenu', '');\n      } else {\n        self.replaceWith($('<ul>').attr('id', self.attr('id')).attr('style', self.attr('style')).attr('class', self.attr('class')));\n        self = $('#' + self.attr('id'));\n      } //Recorrer json para añadir elementos\n\n\n      for (var i = json.length; i--;) {\n        element = json[i];\n        entry = $('<a>');\n\n        if (element !== undefined) {\n          if (element.divider !== null && element.divider !== true) {\n            if (element.pathUrl !== undefined || element.url !== undefined) {\n              if (element.pathUrl !== undefined) {\n                if (force === true || element.forceAbs === true) {\n                  objectUrl = $.rup_utils.relToAbsUrl(element.pathUrl);\n                } else {\n                  objectUrl = element.pathUrl;\n                }\n              } else {\n                objectUrl = $.rup.CTX_PATH + element.url;\n              }\n\n              if (element.newWindow !== true) {\n                if (element.icon !== undefined) {\n                  self.prepend($('<li>').append(entry.text($.rup.i18nParse(json_i18n, element.i18nCaption)).attr('href', objectUrl).css('text-decoration', 'underline').append($('<span>').addClass('ui-icon').addClass(element.icon))));\n                } else {\n                  self.prepend($('<li>').append(entry.text($.rup.i18nParse(json_i18n, element.i18nCaption)).attr('href', objectUrl).css('text-decoration', 'underline')));\n                }\n              } else {\n                if (element.icon !== undefined) {\n                  self.prepend($('<li>').append(entry.text($.rup.i18nParse(json_i18n, element.i18nCaption)).attr('href', objectUrl).attr('target', '_blank').css('text-decoration', 'underline').append($('<span>').addClass('ui-icon').addClass(element.icon))));\n                } else {\n                  self.prepend($('<li>').append(entry.text($.rup.i18nParse(json_i18n, element.i18nCaption)).attr('href', objectUrl).attr('target', '_blank').css('text-decoration', 'underline')));\n                }\n              }\n            } else {\n              //Si no tiene enlace es submenu\n              if (element.icon !== undefined) {\n                self.prepend($('<li>').append(entry.text($.rup.i18nParse(json_i18n, element.i18nCaption)).css('cursor', 'default').append($('<span>').addClass('ui-icon').addClass(element.icon))).append($('<ul>').attr('uda-submenu', 'true')));\n              } else {\n                self.prepend($('<li>').append(entry.text($.rup.i18nParse(json_i18n, element.i18nCaption)).css('cursor', 'default')).append($('<ul>').attr('uda-submenu', 'true')));\n              } //Obtener el elemento que va a ser el submenu\n\n\n              submenu = $('[uda-submenu = \\'true\\']'); //Llamada recursiva para añadir subelementos del submenu\n\n              submenu.append(this._parseJSON(element.submenu, json_i18n, submenu));\n            }\n\n            if (element.disabled === true) {\n              entry.parent().addClass('ui-state-disabled');\n            }\n          } else {\n            if (element.i18nCaption === undefined) {\n              self.prepend($('<li>').addClass('ui-widget-content ui-menu-divider'));\n            } else {\n              self.prepend($('<li>').append($('<strong>').text($.rup.i18nParse(json_i18n, element.i18nCaption))));\n            }\n          }\n        }\n      }\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  /**\r\n   * Opciones por defecto de configuración del componente.\r\n   * @name defaults\r\n   *\r\n   * @property {string} [verticalWidth=undefined] - Valor asociado a cada menú que determinara la anchura vertical del mismo. Este parámetro tiene cabida, tanto, en menús verticales, como, en menús horizontales (al fin y al cabo los dos tienen partes verticales). En caso de no especificar ningún valor, cada uno de los submenús verticales se ajustara al ancho máximo de sus literales.\r\n   * @property {string} [display=horizontal] - Orientación del menú: horizontal o vertical.\r\n   * @property {string} [i18nId] - Indica el identificador del objeto JSON para la resolución de los literales del componente. En caso de no definirse se tomará el ID del objeto sobre el que se crea el componente.\r\n   * @property {string} [menus=ul] - Parámetro que determina el tag de html que hará de padre para determinar las entradas del menú (tanto para las entradas normales como para las de los submenús).\r\n   * @property {boolean} [forceAbs=false] - Parámetro de configuración que activa el uso de la función relToAbsUrl. Dicha función hace que todas las llamadas relativas se transformen a absolutas. El uso de este parámetro responde a situaciones en el que el navegador, por diferentes cuestiones funcionales, no gestiona bien las urls relativas (se tratan todas las urls relativas como urls absolutas para evitar el posible problema. Por ejemplo: problemas con portales). Este parámetro se puede aplicar tanto a nivel de entrada como a nivel general del menú.\r\n   *\r\n   * @property {object} [menu] - Estructura del menú se define mediante un array en notación JSON cuyo nombre será el mismo que el identificador del elemento sobre el que se aplica el componente. No se limita el número de submenús. Por coherencia se ha decidido que los elementos que contengan submenús no serán enlaces y viceversa.\r\n   * @property {string} menu.i18nCaption - Define la ruta (url) a seguir cuando se pulse sobre el elemento, en caso de no tener submenú. La especificación de las rutas (urls), se puede hacer de forma relativa o de forma absoluta. (véase el capítulo 11. Formato de las urls).\r\n   * @property {object} menu.submenu - Define una estructura JSON submenú.\r\n   * @property {boolean} [menu.newWindow=false] - Si el valor es true, el enlace del menú se abrirá en una nueva ventana del navegador, en caso contrario (false), se aplicará sobre la ventana que alberga el menu. Todas las entradas de este tipo, serán indicadas mediante el icono “external link”.\r\n   * @property {boolean} [menu.divider=false] - Parámetro encargado de indicar si la entrada del menú es un elemento de división o un objeto del menú. Cuando el valor de “divider” sea true, la entrada en cuestión, es un divisor. Existen dos tipos de divisores que se diferencian en la presencia del parámetro \"i18nCaption\". En caso de no tenerlo, el divisor es únicamente una línea divisora de entradas. En caso contrario, el divisor es una cabecera. En ambos casos, el resto de parámetros no tienen importancia y no serán tomados en cuanta a la hora de componer el menú. Su valor por defecto es false.\r\n   * @property {boolean} menu.disabled - Determina si la entrada del menú esta habilitada o deshabilitada. El valor por defecto del campo es false. Dicho estado puede ser variado mediante las funciones enable y disable del componente.\r\n   * @property {string} menu.icon - Especifica el class que tiene asociado el icono que regirá la entrada de menú.\r\n   */\n\n  $.fn.rup_menu.defaults = {\n    verticalWidth: undefined,\n    display: 'horizontal',\n    forceAbs: false,\n    i18nId: undefined,\n    menus: 'ul',\n    position: {\n      my: 'left bottom',\n      at: 'right bottom'\n    }\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup.menu.js?");

/***/ }),

/***/ "./src/rup.message.js":
/*!****************************!*\
  !*** ./src/rup.message.js ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n *\tTiene como objetivo mostrar al usuario de forma homogénea, clara y llamativa, los posibles mensajes que pueden desencadenar las acciones en la aplicación. Estos mensajes predefinidos pueden ser de diferente tipología: error, confirmación, aviso o alerta.\r\n *\r\n *\t@summary Componente RUP Message.\r\n *\t@module rup_messages\r\n *\r\n *\t@example\r\n *\t$.rup_messages(\"msgOK\", {\r\n *\t\ttitle: \"Correcto\",\r\n *\t\tmessage: \"Todo ha ido OK.\",\r\n *\t\tbuttonText: $.rup.i18nParse($.rup.i18n.app, \"message.acceptOK\")\r\n *\t});\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n  var rup_messages = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupObjectConstructor('rup_messages', rup_messages));\n\n  window.alert = function (text) {\n    $.rup_messages('msgAlert', {\n      title: $.rup.i18nParse($.rup.i18n.base, 'rup_message.alert'),\n      message: text\n    });\n  }; //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  /**\r\n   * Función a ejecutar justo antes de que se cierre la ventana.\r\n   *\r\n   * @callback jQuery.rup_messages~beforeCloseCallback\r\n   * @param {Object} event - Objeto Event de jQuery.\r\n   */\n\n  /**\r\n   * Función a ejecutar cuando el usuario pulsa el botón de Aceptar.\r\n   *\r\n   * @callback jQuery.rup_messages~OKFunctionCallback\r\n   * @param {Object} event - Objeto Event de jQuery.\r\n   * @param {Object} ui - Objeto de tipo jQueryUi Dialog.\r\n   */\n\n  /**\r\n   * Función a ejecutar cuando el usuario pulsa el enlace de Cancelar.\r\n   *\r\n   * @callback jQuery.rup_messages~CANCELFunctionCallback\r\n   * @param {Object} event - Objeto Event de jQuery.\r\n   * @param {Object} ui - Objeto de tipo jQueryUi Dialog\r\n   */\n\n\n  $.rup_messages('extend', {\n    /**\r\n     *\tMuestra un mensaje de error.\r\n     *\r\n     *\t@function  msgError\r\n     *\t@param {Object} properties - Objeto de configuración del mensaje de error.\r\n     *\t@param {String} properties.title - Función a ejecutar justo antes de que se cierre la ventana.\r\n     *\t@param {String} properties.message - El mensaje de error que se quiere mostrar. Dicho mensaje se situará a la derecha de la imagen de error. El mensaje puede ser texto plano o contener etiquetas HTML que se reflejarán en el mismo.\r\n     *\t@param {String} properties.buttonText - Literal a mostrar como texto del botón.\r\n     *\t@param {jQuery.rup_messages~beforeCloseCallback} properties.beforeClose - Texto que aparecerá en la barra del titulo del mensaje.\r\n     *\r\n     *\t@example\r\n     *\t// Mostrar un mensaje de error.\r\n     *\t$.rup_messages(\"msgError\", {\r\n     *\t\ttitle: \"Error grave\",\r\n     *\t\tmessage: \"<p>Se ha producido un error a la hora de intentar guardar el registro.<br>Consulte con el administrador.</p>\",\r\n     *\t\tbuttonText: $.rup.i18nParse($.rup.i18n.app, \"message.acceptError\")\r\n     *\t});\r\n     */\n    msgError: function msgError(properties) {\n      //Se recogen y cruzan las paremetrizaciones del objeto\n      var $this = this,\n          settings = $.extend({}, $.rup_messages.defaults, properties),\n          docHeight,\n          docWidth,\n          focused = $(document.activeElement);\n\n      this._rupProperties(settings, $.rup.i18nParse($.rup.i18n.base, 'rup_message.tituloError'));\n\n      settings._close = settings.close;\n\n      settings.close = function () {\n        focused.focus();\n\n        if (settings._close !== undefined) {\n          $this._destroy(self);\n        }\n      }; //parámetros específicos de tipo de mensaje\n\n\n      settings.buttons = [{\n        text: properties.buttonText != undefined ? properties.buttonText : $.rup.i18nParse($.rup.i18n.base, 'rup_message.aceptar'),\n        \"class\": $.rup.adapter[$.rup_messages.defaults.adapter].classComponent('error'),\n        click: function click() {\n          $this._destroy(self);\n        }\n      }];\n\n      var self = this._createDiv().appendTo('body');\n\n      self.dialog(settings);\n\n      if (self.data('uiDialog')) {\n        self.data('uiDialog').uiDialog.addClass('rup-message rup-message-error');\n      }\n\n      this._createCloseLink(self);\n\n      this._addStyles(self, 'error', settings.message);\n\n      docHeight = $(document).height();\n      docWidth = $(document).width();\n      self.dialog('open');\n\n      this._dialogInPortal(docWidth, docHeight, self, settings); // Limpieza del componente\n\n\n      if (self.data('uiDialog')) {\n        self.data('uiDialog').uiDialog.find('button.ui-dialog-titlebar-close').remove();\n        self.data('uiDialog').uiDialog.find('button').removeClass('ui-button ui-corner-all ui-widget');\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_message', 'init');\n    },\n\n    /**\r\n     *\tMuestra un mensaje de confirmación.\r\n     *\r\n     *\t@function  msgConfirm\r\n     *\t@param {Object} properties - Objeto de configuración del mensaje de error.\r\n     *\t@param {String} properties.title - Texto que aparecerá en la barra del titulo del mensaje.\r\n     *\t@param {String} properties.message - El mensaje de error que se quiere mostrar. Dicho mensaje se situará a la derecha de la imagen de error. El mensaje puede ser texto plano o contener etiquetas HTML que se reflejarán en el mismo.\r\n     *\t@param {String} properties.OKText - Literal a mostrar como texto del botón de aceptar.\r\n     *\t@param {String} properties.CANCELText - Literal a mostrar como texto del botón de cancelar.\r\n     *\t@param {jQuery.rup_messages~beforeCloseCallback} properties.beforeClose - Función a ejecutar justo antes de que se cierre la ventana.\r\n     *\t@param {jQuery.rup_messages~OKFunctionCallback} properties.OKFunction - Función a ejecutar cuando el usuario pulsa el botón de Aceptar.\r\n     *\t@param {jQuery.rup_messages~CANCELFunctionCallback} properties.CANCELFunction - Función a ejecutar cuando el usuario pulsa el enlace de Cancelar.\r\n     * \r\n     *\t@example\r\n     *\t// funciones de callback.\r\n     *\tfunction acceptClicked() { alert(\"Ha pulsado aceptar.\"); }\r\n     *\tfunction cancelClicked() { alert(\"Ha pulsado cancelar.\"); }\r\n     *\r\n     *\t// Mostrar un mensaje de error.\r\n     *\t$.rup_messages(\"msgConfirm\", {\r\n     *\t\ttitle: \"Confirmación\",\r\n     *\t\tmessage: \"¿Está seguro que desea cancelar?\",\r\n     *\t\tOKFunction : acceptClicked,\r\n     *\t\tOKText: $.rup.i18nParse($.rup.i18n.app, \"message.OK\"),\r\n     *\t\tCANCELFunction : cancelClicked,\r\n     *\t\tCANCELText: $.rup.i18nParse($.rup.i18n.app, \"message.CANCEL\")\r\n     *\t});\r\n     */\n    msgConfirm: function msgConfirm(properties) {\n      //Se recogen y cruzan las paremetrizaciones del objeto\n      var $this = this,\n          settings = $.extend({}, $.rup_messages.defaults, properties),\n          docHeight,\n          docWidth,\n          focused = $(document.activeElement);\n\n      this._rupProperties(settings, $.rup.i18nParse($.rup.i18n.base, 'rup_message.confirmacion'));\n\n      settings._close = settings.close;\n\n      settings.close = function () {\n        focused.focus();\n\n        if (settings._close !== undefined) {\n          $this._destroy(self);\n        }\n      };\n\n      var self = this._createDiv().appendTo('body'),\n          acceptButton;\n\n      self.dialog(settings);\n      self.data('uiDialog').uiDialog.addClass('rup-message rup-message-confirm'); //parámetros específicos de tipo de mensaje\n\n      acceptButton = [{\n        text: properties.OKText != undefined ? properties.OKText : $.rup.i18nParse($.rup.i18n.base, 'rup_message.aceptar'),\n        \"class\": $.rup.adapter[$.rup_messages.defaults.adapter].classComponent('confirm'),\n        click: function click() {\n          $this._destroy(self);\n\n          settings.OKFunction.call(this, self);\n        }\n      }];\n      self.dialog('option', 'buttons', acceptButton);\n\n      this._createCloseLink(self, settings.CLOSEFunction);\n\n      this._addStyles(self, 'confirm', settings.message);\n\n      this._createLinkButton(self, settings);\n\n      docHeight = $(document).height();\n      docWidth = $(document).width();\n      self.dialog('open');\n\n      this._dialogInPortal(docWidth, docHeight, self, settings); // Limpieza del componente\n\n\n      self.data('uiDialog').uiDialog.find('button.ui-dialog-titlebar-close').remove();\n      self.data('uiDialog').uiDialog.find('button').removeClass('ui-button ui-corner-all ui-widget'); //Le ponemos el foco al botón aceptar en vez de al enlace\n\n      $('div[aria-describedby=' + self[0].id + '] .ui-dialog-buttonpane button').last().focus(); //Se audita el componente\n\n      $.rup.auditComponent('rup_message', 'init');\n    },\n\n    /**\r\n     *\tMuestra un mensaje de aviso.\r\n     *\r\n     *\t@function  msgOK\r\n     *\t@param {Object} properties - Objeto de configuración del mensaje de aviso.\r\n     *\t@param {String} properties.title - Texto que aparecerá en la barra del titulo del mensaje.\r\n     *\t@param {String} properties.message - El mensaje de error que se quiere mostrar. Dicho mensaje se situará a la derecha de la imagen de error. El mensaje puede ser texto plano o contener etiquetas HTML que se reflejarán en el mismo.\r\n     *\t@param {String} properties.buttonText - Literal a mostrar como texto del botón.\r\n     *\t@param {jQuery.rup_messages~beforeCloseCallback} properties.beforeClose - Función a ejecutar justo antes de que se cierre la ventana.\r\n     *\r\n     *\t@example\r\n     *\t// Mostrar un mensaje de aviso.\r\n     *\t$.rup_messages(\"msgOK\", {\r\n     *\t\ttitle: \"Correcto\",\r\n     *\t\tmessage: \"Todo ha ido OK.\",\r\n     *\t\tbuttonText: $.rup.i18nParse($.rup.i18n.app, \"message.acceptOK\")\r\n     *\t});\r\n     */\n    msgOK: function msgOK(properties) {\n      //Se recogen y cruzan las paremetrizaciones del objeto\n      var $this = this,\n          settings = $.extend({}, $.rup_messages.defaults, properties),\n          docHeight,\n          docWidth,\n          focused = $(document.activeElement);\n\n      this._rupProperties(settings, $.rup.i18nParse($.rup.i18n.base, 'rup_message.correct'));\n\n      settings._close = settings.close;\n\n      settings.close = function () {\n        focused.focus();\n\n        if (settings._close !== undefined) {\n          $this._destroy(self);\n        }\n      }; //parámetros específicos de tipo de mensaje\n\n\n      settings.buttons = [{\n        text: properties.buttonText != undefined ? properties.buttonText : $.rup.i18nParse($.rup.i18n.base, 'rup_message.aceptar'),\n        \"class\": $.rup.adapter[$.rup_messages.defaults.adapter].classComponent('ok'),\n        click: function click() {\n          $this._destroy(self);\n        }\n      }];\n\n      var self = this._createDiv().appendTo('body');\n\n      self.dialog(settings);\n\n      if (self.data('uiDialog')) {\n        self.data('uiDialog').uiDialog.addClass('rup-message rup-message-ok');\n      }\n\n      this._createCloseLink(self, settings.CLOSEFunction);\n\n      this._addStyles(self, 'ok', settings.message);\n\n      docHeight = $(document).height();\n      docWidth = $(document).width();\n      self.dialog('open');\n\n      this._dialogInPortal(docWidth, docHeight, self, settings); // Limpieza del componente\n\n\n      if (self.data('uiDialog')) {\n        self.data('uiDialog').uiDialog.find('button.ui-dialog-titlebar-close').remove();\n        self.data('uiDialog').uiDialog.find('button').removeClass('ui-button ui-corner-all ui-widget');\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_message', 'init');\n    },\n\n    /**\r\n     *\tMuestra un mensaje de alerta.\r\n     *\r\n     *\t@function  msgAlert\r\n     *\t@param {Object} properties - Objeto de configuración del mensaje de alerta.\r\n     *\t@param {String} properties.title - Texto que aparecerá en la barra del titulo del mensaje.\r\n     *\t@param {String} properties.message - El mensaje de error que se quiere mostrar. Dicho mensaje se situará a la derecha de la imagen de error. El mensaje puede ser texto plano o contener etiquetas HTML que se reflejarán en el mismo.\r\n     *\t@param {String} properties.buttonText - Literal a mostrar como texto del botón.\r\n     *\t@param {jQuery.rup_messages~beforeCloseCallback} properties.beforeClose - Función a ejecutar justo antes de que se cierre la ventana.\r\n     *\r\n     *\t@example\r\n     *\t// Mostrar un mensaje de aviso.\r\n     *\t$.rup_messages(\"msgAlert\", {\r\n     *\t\ttitle: \"Alerta\",\r\n     *\t\tmessage: \"Esto es una alerta.\",\r\n     *\t\tbuttonText: $.rup.i18nParse($.rup.i18n.app, \"message.acceptAlert\")\r\n     *\t});\r\n     */\n    msgAlert: function msgAlert(properties) {\n      //Se recogen y cruzan las paremetrizaciones del objeto\n      var $this = this,\n          settings = $.extend({}, $.rup_messages.defaults, properties),\n          docHeight,\n          docWidth,\n          focused = $(document.activeElement);\n\n      this._rupProperties(settings, $.rup.i18nParse($.rup.i18n.base, 'rup_message.alert'));\n\n      settings._close = settings.close;\n\n      settings.close = function () {\n        focused.focus();\n\n        if (settings._close !== undefined) {\n          $this._destroy(self);\n        }\n      }; //parámetros específicos de tipo de mensaje\n\n\n      settings.buttons = [{\n        text: properties.buttonText != undefined ? properties.buttonText : $.rup.i18nParse($.rup.i18n.base, 'rup_message.aceptar'),\n        \"class\": $.rup.adapter[$.rup_messages.defaults.adapter].classComponent('alert'),\n        click: function click() {\n          $this._destroy(self);\n        }\n      }];\n\n      var self = this._createDiv().appendTo('body');\n\n      self.dialog(settings);\n      self.data('uiDialog').uiDialog.addClass('rup-message rup-message-alert');\n\n      this._createCloseLink(self, settings.CLOSEFunction);\n\n      this._addStyles(self, 'alert', settings.message);\n\n      docHeight = $(document).height();\n      docWidth = $(document).width();\n      self.dialog('open');\n\n      this._dialogInPortal(docWidth, docHeight, self, settings); // Limpieza del componente\n\n\n      self.data('uiDialog').uiDialog.find('button.ui-dialog-titlebar-close').remove();\n      self.data('uiDialog').uiDialog.find('button').removeClass('ui-button ui-corner-all ui-widget'); //Se audita el componente\n\n      $.rup.auditComponent('rup_message', 'init');\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  $.rup_messages('extend', {\n    _destroy: function _destroy(self) {\n      self.dialog('destroy').remove();\n    },\n\n    /**\r\n     * Crea los divs de los mensajes.\r\n     *\r\n     * @function  _createDiv\r\n     * @private\r\n     */\n    _createDiv: function _createDiv() {\n      return $('<div></div>').attr('id', 'rup_msgDIV_' + new Date().getTime()).attr('rup_message', 'true').addClass('row py-4');\n    },\n\n    /**\r\n     * Crea los el enlace de cerrar en el título del mensaje de acuerdo a los estándares de accesibilidad.\r\n     *\r\n     * @param {Object} self - Referencia a la propia instancia.\r\n     * @function  _createCloseLink\r\n     * @private\r\n     */\n    _createCloseLink: function _createCloseLink(self, CLOSEFunction) {\n      //Crea el enlace de cerrar junto a la x de cerrar.\n      self.prev('div').append('<i class=\"mdi mdi-close float-right pointer\" aria-hidden=\"true\"></i>').on('click', 'i.mdi', function () {\n        self.dialog('close');\n\n        if (CLOSEFunction !== undefined) {\n          CLOSEFunction.call(this, self);\n        }\n\n        return false;\n      });\n    },\n\n    /**\r\n     * Aplica el estilo correspondiente al tipo de mensaje a mostrar así como el contenido del mensaje en sí.\r\n     *\r\n     * @param {Object} self - Referencia a la propia instancia.\r\n     * @param {string} css - Clase css correspondiente al tipo de mensaje a mostrar.\r\n     * @param {string} message - Cuerpo del mensaje a visualizar.\r\n     * @function  _addStyles\r\n     * @private\r\n     */\n    _addStyles: function _addStyles(self, css, message) {\n      //Le añade los divs del mensaje a mostrar y el icono correpondiente\n      // Establecemos el icono dependiendo del tipo de mensaje\n      var icon = '';\n\n      switch (css) {\n        case 'error':\n          icon = '<i class=\"mdi mdi-alert-circle\" aria-hidden=\"true\"></i>';\n          break;\n\n        case 'confirm':\n          icon = '<i class=\"mdi mdi-alert\" aria-hidden=\"true\"></i>';\n          break;\n\n        case 'ok':\n          icon = '<i class=\"mdi mdi-check-circle\" aria-hidden=\"true\"></i>';\n          break;\n\n        case 'alert':\n          icon = '<i class=\"mdi mdi-message-alert\" aria-hidden=\"true\"></i>';\n          break;\n\n        default:\n          icon = '<i class=\"mdi mdi-alert\" aria-hidden=\"true\"></i>';\n      }\n\n      var divMessageIcon = $('<div>').attr('id', 'rup_msgDIV_msg_icon').addClass('col-2').append(icon),\n          divMessage = $('<div>').attr('id', 'rup_msgDIV_msg').addClass('col-10').html(message);\n      self.append(divMessageIcon);\n      self.append(divMessage);\n    },\n\n    /**\r\n     *\tGenera un botón \"Cancelar\" para el mensaje de tipo confirmación.\r\n     *\r\n     *\t@param {Object} self - Referencia a la propia instancia.\r\n     *\t@param {Object} settings - Propiedades de configuración.\r\n     *\t@function  _createLinkButton\r\n     *\t@private\r\n     */\n    _createLinkButton: function _createLinkButton(self, settings) {\n      var clickFnc = settings.CANCELFunction,\n          cancelHREF = $('<button></button>').attr('type', 'button').attr('id', self[0].id + '_cancel').addClass($.rup.adapter[$.rup_messages.defaults.adapter].classComponent()).html(settings.CANCELText != undefined ? settings.CANCELText : $.rup.i18nParse($.rup.i18n.base, 'rup_global.cancel')).click(function () {\n        self.dialog('close');\n\n        if (clickFnc !== undefined) {\n          clickFnc.call(this, self);\n        }\n\n        return false;\n      });\n      $('div[aria-describedby=' + self[0].id + '] .ui-dialog-buttonset ').prepend(cancelHREF);\n    },\n\n    /**\r\n     * Ajuste en la visualización del mensaje para que se muestre correctamente en aplicaciones integradas en portal.\r\n     *\r\n     * @param {Number} docWidth - Anchura en pixeles del objeto document.\r\n     * @param {Number} docHeight - Altura en pixeles del objeto document.\r\n     * @param {Object} $self - Referencia a la propia instancia.\r\n     * @param {Object} settings - Objeto de configuración del componente.\r\n     * @function  _dialogInPortal\r\n     * @private\r\n     */\n    _dialogInPortal: function _dialogInPortal(docWidth, docHeight, $self, settings) {\n      var $overlayEl;\n\n      if ($.rup_utils.aplicatioInPortal()) {\n        if ($self.data('uiDialog').overlay !== null) {\n          $overlayEl = $self.data('uiDialog').overlay;\n          $overlayEl.css('height', docHeight).css('width', docWidth);\n          $('.r01gContainer').append($overlayEl).append($self.data('uiDialog').uiDialog);\n        }\n\n        if (settings.position === undefined || settings.position === null) {\n          $self.data('uiDialog').uiDialog.css('position', 'absolute').css('top', docHeight / 2 - $('.ui-dialog:visible').height() / 2);\n        }\n      }\n    },\n\n    /**\r\n     * Realiza la inicialización de las propiedades utilizadas para configurar correctamente el plugin jQueryUi Dialog. </br></br>\r\n     * La inicialización se realiza sobre las propiedades introducidas por el usuario de modo que se garantiza que la visualización del componente es siempre la adecuada.\r\n     *\r\n     * @name _rupProperties\r\n     * @param {Object} properties - Propiedades de configuración sobre las que se va a realizar la inicialización-\r\n     * @param {string} title - Titulo a mostrar en el mensaje.\r\n     * @function\r\n     * @private\r\n     */\n    _rupProperties: function _rupProperties(properties, title) {\n      properties.autoOpen = false;\n      properties.modal = true;\n      properties.resizable = false;\n\n      if (properties.title === null || properties.title === '') {\n        properties.title = title;\n      }\n\n      properties.closeText = $.rup.i18nParse($.rup.i18n.base, 'rup_message.tituloError.cerrar');\n\n      properties.close = function () {\n        $(this).remove();\n      };\n    }\n  }); //******************************************************\n  // DEFINICIN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  /**\r\n   * @description Opciones por defecto de configuración del componente.\r\n   *\r\n   * @name defaults\r\n   *\r\n   * @property {Number}  [minHeight=100] - Altura mínima con la que se va a mostrar el mensaje.\r\n   * @property {string} adapter - Permite cambiar el aspecto visual del componente.\r\n   */\n\n  $.rup_messages.defaults = {\n    minHeight: 100,\n    adapter: 'message_material'\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup.message.js?");

/***/ }),

/***/ "./src/rup.navbar.js":
/*!***************************!*\
  !*** ./src/rup.navbar.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Proporciona una herramienta para navegar a través de las aplicación web.\r\n * \r\n * @summary Componente RUP Navbar\r\n * @module rup_navbar\r\n * @example\r\n * var html = '<nav class=\"rup-navbar navbar\">\\\r\n                <button type=\"button\" class=\"navbar-toggler hidden-lg-up navbar-toggle\" \\\r\n                    type=\"button\" data-toggle=\"rup-collapse\" data-target=\"#navbarResponsive\"\\\r\n                    aria-controls=\"navbarResponsive\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\\\r\n                </button>\\\r\n                <a class=\"navbar-brand\" href=\"#\">Uda</a>\\\r\n                    <ul class=\"nav navbar-nav\">\\\r\n                        <li class=\"nav-item dropdown\">\\\r\n                            <a class=\"nav-link dropdown-toggle\" href=\"#\"\\\r\n                                id=\"navDropdownUno\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\\\r\n                                Padre1\\\r\n                            </a>\\\r\n                            <div class=\"collapse dropdown-toggle\" aria-labelledby=\"navDropdownUno\">\\\r\n                                <a href=\"#\" class=\"dropdown-item\">Elem11</a>\\\r\n                                <a href=\"#\" class=\"dropdown-item\">Elem12</a>\\\r\n                            </div>\\\r\n                        </li>\\\r\n                        <li class=\"nav-item dropdown\">\\\r\n                                <a class=\"nav-link dropdown-toggle\" href=\"#\"\\\r\n                                    id=\"navDropdownUno\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\\\r\n                                    Padre2\\\r\n                                </a>\\\r\n                                <div class=\"collapse dropdown-toggle\" aria-labelledby=\"navDropdownUno\">\\\r\n                                    <a href=\"#\" class=\"dropdown-item\">Elem21</a>\\\r\n                                    <a href=\"#\" class=\"dropdown-item\">Elem22</a>\\\r\n                                </div>\\\r\n                            </li>\\\r\n                    </ul>\\\r\n                    <ul class=\"nav navbar-nav float-md-right rup-nav-tools\">\\\r\n                        <li class=\"nav-item dropdown\">\\\r\n                            <a class=\"nav-link dropdown-toggle\" href=\"#\"\\\r\n                                id=\"navDropdownUno\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\\\r\n                                Padre3\\\r\n                            </a>\\\r\n                            <div class=\"collapse dropdown-toggle\" aria-labelledby=\"navDropdownUno\">\\\r\n                                <a href=\"#\" class=\"dropdown-item\">Elem31</a>\\\r\n                                <a href=\"#\" class=\"dropdown-item\">Elem32</a>\\\r\n                            </div>\\\r\n                        </li>\\\r\n                        <li class=\"nav-item dropdown\">\\\r\n                                <a class=\"nav-link dropdown-toggle\" href=\"#\"\\\r\n                                    id=\"navDropdownUno\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\\\r\n                                    Padre4\\\r\n                                </a>\\\r\n                                <div class=\"collapse dropdown-toggle\" aria-labelledby=\"navDropdownUno\">\\\r\n                                    <a href=\"#\" class=\"dropdown-item\">Elem41</a>\\\r\n                                    <a href=\"#\" class=\"dropdown-item\">Elem42</a>\\\r\n                                </div>\\\r\n                            </li>\\\r\n                    </ul>\\\r\n              </nav>';\r\n        $('#content').append(html);\r\n        $('nav').rup_navbar(); \r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./external/util */ \"./src/external/util.js\"), __webpack_require__(/*! ./external/dropdown */ \"./src/external/dropdown.js\"), __webpack_require__(/*! ./rup.sticky */ \"./src/rup.sticky.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  var rup_navbar = {};\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  }; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_navbar', rup_navbar)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_navbar('extend', {});\n  $.fn.rup_navbar('extend', {\n    /**\r\n     * Funcion que alterna el estado del navbar entre desplegado y oculto.\r\n     * @function\r\n     * @name toggle\r\n     * @example\r\n     * $('nav').rup_navbar('toggle');\r\n     */\n    toggle: function toggle() {\n      this.click();\n    },\n\n    /**\r\n     * Funcion que despliega el navbar.\r\n     * @function\r\n     * @name show\r\n     * @example\r\n     * $('nav').rup_navbar('show');\r\n     */\n    show: function show() {\n      if (!$('[aria-labelledby=\"' + this.attr('id') + '\"]').is(':visible')) {\n        this.rup_navbar('toggle');\n      }\n    },\n\n    /**\r\n     * Funcion que oculta el navbar.\r\n     * @function\r\n     * @name hide\r\n     * @example\r\n     * $('nav').rup_navbar('hide');\r\n     */\n    hide: function hide() {\n      if ($('[aria-labelledby=\"' + this.attr('id') + '\"]').is(':visible')) {\n        this.rup_navbar('toggle');\n      }\n    },\n\n    /**\r\n     * Define si habrá o no transición al desplegar y ocultar el navbar\r\n     * @function\r\n     * @name setTransitioning\r\n     * @param {boolean} transición -True: hay transicion; False: no hay transicion\r\n     * @example\r\n     * $('nav').rup_navbar('setTransitioning', true);\r\n     */\n    setTransitioning: function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    },\n    _getDimension: function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    },\n    _init: function _init() {\n      var $self = this;\n      $self._isTransitioning = false;\n      $self._element = $self[0];\n      $self._triggerArray = $.makeArray($(\"[data-toggle=\\\"rup-colapse\\\"][href=\\\"#\".concat($self._element.id, \"\\\"],\") + \"[data-toggle=\\\"rup-colapse\\\"][data-target=\\\"#\".concat($self._element.id, \"\\\"]\"))); //Lo añadimos a data para mantenerlo\n\n      $self.data('_triggerArray', $self._triggerArray);\n      $self.data('_element', $self._element); // El botón de volver a la parte superior del contenido\n\n      $('nav .swingTop').off('click').on('click', function () {\n        $('.navbar-toggler:visible').click();\n        $.rup_utils.swing2Top();\n      }); // Hacer click fuera de menú lo cierra\n\n      $('#overlay').on('click tap', function () {\n        $('.navbar-toggler:visible').click();\n      }); // Funcionamiento de apertura del menú\n\n      $('.navbar-toggler').on('click tap', function () {\n        $self.toggle();\n        $('#overlay').toggleClass('on');\n        $('.navbar-toggleable-md .rup-open').removeClass('rup-open');\n      }); // Cierre de menú al navegar a un item\n\n      $('nav .dropdown-item').not('.dropdown-toggle').on('click', function () {\n        $('.navbar-toggler:visible').click();\n      }); // Funcionamiento acordeón entre desplegables en el menú\n\n      $('nav .dropdown>a').on('click tap', function () {\n        $('nav .dropdown>a').not($(this)).parent().removeClass('rup-open');\n        $(this).parent().toggleClass('rup-open'); //Al pinchar deben estar todos ocultos de primeras.\n\n        $('.navbar-toggleable-md div.dropdown-submenu.open').removeClass('open');\n      });\n      $('.dropdown-toggle', $self).dropdown($('.dropdown-toggle', $self)); // Funcionamiento de apertura de sub-desplegables en el menú\n\n      $('nav .dropdown-submenu a').on('click tap', function () {\n        ///  $('nav .dropdown-submenu a').not($(this)).parent().removeClass('rup-open');\n        $(this).parent().toggleClass('rup-open');\n        var menuScrollPos = 0;\n        var end = $(this).parent().index();\n        $(this).parent().siblings().each(function (i, e) {\n          if (i < end) {\n            if ($(e).children('.dropdown-menu').length > 0) {\n              menuScrollPos += $(e).children('.dropdown-item').first().outerHeight(true);\n            } else {\n              menuScrollPos += $(e).outerHeight(true);\n            }\n          }\n        });\n        $(this).parent().parent().animate({\n          scrollTop: menuScrollPos\n        }, 500);\n      }); //Se audita el componente\n\n      $.rup.auditComponent('rup_navbar', 'init'); //Añadimos un handler para cuando esté en modo responsive\n\n      $('button.navbar-toggler', $(this).parent()).on('click', function () {\n        $('div.navbar-toggleable-md', $(this).parent()).toggleClass('collapse');\n      });\n    }\n  });\n});\n\n//# sourceURL=webpack://rup/./src/rup.navbar.js?");

/***/ }),

/***/ "./src/rup.progressbar.js":
/*!********************************!*\
  !*** ./src/rup.progressbar.js ***!
  \********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Tiene como objetivo mostrar al usuario de manera gráfica el estado de avance de una tarea o proceso.\r\n *\r\n * @summary Componente RUP ProgressBar.\r\n * @module rup_progressbar\r\n * @see El componente está basado en el plugin {@link https://jqueryui.com/progressbar/|jQuery UI ProgressBar}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://api.jqueryui.com/progressbar/|aquí}.\r\n * @example\r\n * var properties = {\r\n *\t\tvalue: 50\r\n *\t};\r\n * $(\"#idProgressbar\").rup_progressbar(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_progressbar = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_progressbar', rup_progressbar)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_progressbar('extend', {\n    /**\r\n     * Método utilizado para obtener el valor del componente. Este método es el utilizado por el resto de componentes RUP para estandarizar la obtención del valor de la barra de progreso.\r\n     *\r\n     * @name getRupValue\r\n     * @function\r\n     * @return {number} - Devuelve el valor actual del componente. El valor retornado se corresponderá con el progreso actual.\r\n     * @example\r\n     * $(\"#idProgressbar\").rup_progressbar(\"getRupValue\");\r\n     */\n    getRupValue: function getRupValue() {\n      var $self = this;\n      return $self.progressbar('value');\n    },\n\n    /**\r\n     * Método utilizado para asignar el valor al componente. Este método es el utilizado por\r\n    el resto de componentes RUP para estandarizar la asignación del valor a la barra de progreso.\r\n     *\r\n     * @name setRupValue\r\n     * @function\r\n     * @param {number} param - Valor que se va a asignar al componente.\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * $(\"#idProgressbar\").rup_progressbar(\"setRupValue\", 50);\r\n     */\n    setRupValue: function setRupValue(param) {\n      var $self = this;\n      $self.progressbar('value', param);\n      return $self;\n    },\n\n    /**\r\n     * Elimina las modificaciones realizadas sobre elemento del DOM.\r\n     *\r\n     * @name destroy\r\n     * @function\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * // Elimina la barra de progreso\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      var $self = this;\n      $self.removeClass('rup_progressbar');\n      $self.removeAttr('ruptype');\n      $self.progressbar('destroy');\n      $self.find('div.rup-progressbar-label').remove();\n      return $self;\n    },\n\n    /**\r\n     * Deshabilita la barra de progreso.\r\n     *\r\n     * @name disable\r\n     * @function\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"disable\");\r\n     */\n    disable: function disable() {\n      this.progressbar('disable');\n      this.addClass('rup-progressbar-disabled');\n      return this;\n    },\n\n    /**\r\n     * Habilita la barra de progreso.\r\n     *\r\n     * @name enable\r\n     * @function\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"enable\");\r\n     */\n    enable: function enable() {\n      this.progressbar('enable');\n      this.removeClass('rup-progressbar-disabled');\n      return this;\n    },\n\n    /**\r\n     * Devuelve la instancia de jQueryUI asociada a la barra de progreso. Si no ha sido inicializada retorna undefined.\r\n     *\r\n     * @name instance\r\n     * @function\r\n     * @return {object} - Instancia de jQueryUI asociada.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"instance\");\r\n     */\n    instance: function instance() {\n      return this.progressbar('instance');\n    },\n\n    /**\r\n     * Devuelve un objeto clave/valor que contiene las propiedades de configuración de la barra de progreso.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @return {object} - Objeto clave/valor con las propiedades de configuración.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"option\");\r\n     */\n\n    /**\r\n     * Devuelve el valor asociado a la propiedad identificada por parámetro.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @param {string} paramName - Nombre de la propiedad.\r\n     * @return {object} - Valor asociado a la propiedad.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"option\", \"value\");\r\n     */\n\n    /**\r\n     * Asigna un valor a la propiedad indentificada por parámetro.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @param {string} paramName - Nombre de la propiedad.\r\n     * @param {object} paramValue - Valor de la propiedad.\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"option\", \"value\", 50);\r\n     */\n\n    /**\r\n     * Permite asignar el valor de una o varias propiedades de configuración.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @param {object} param - Objeto clave/valor con las propiedades de configuración y sus valores.\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"option\", {value:50, max:0});\r\n     */\n    option: function option() {\n      if (arguments.length === 0) {\n        return this.progressbar('option');\n      } else if (arguments.length === 1) {\n        return this.progressbar('option', arguments[0]);\n      } else {\n        return this.progressbar('option', arguments[0], arguments[1]);\n      }\n    },\n\n    /**\r\n     * Devuelve el valor actual de la barra de progreso.\r\n     *\r\n     * @name value\r\n     * @function\r\n     * @return {number} - Valor actual de la barra de progreso.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"value\");\r\n     */\n\n    /**\r\n     * Asigna un valor a la barra de progreso.\r\n     *\r\n     * @name value\r\n     * @function\r\n     * @param {number} value - Valor a asignar.\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"value\", 50);\r\n     */\n    value: function value(args) {\n      return this.progressbar('value', args);\n    },\n\n    /**\r\n     * Devuelve el objeto widget de jQuery que contiene la barra de progreso.\r\n     *\r\n     * @name widget\r\n     * @function\r\n     * @return {jQuery} - Objeto widget jQuery.\r\n     * @example\r\n     * jQuery(\"#idProgressbar\").rup_progressbar(\"widget\");\r\n     */\n    widget: function widget() {\n      return this.progressbar('widget');\n    }\n  });\n  $.fn.rup_progressbar('extend', {\n    _printLabel: function _printLabel() {}\n  }); //*******************************\n  // MÉTODO DE INICIALIZACION\n  //*******************************\n\n  $.fn.rup_progressbar('extend', {\n    _init: function _init(args) {\n      var $self = this,\n          settings = $.extend({}, $.fn.rup_progressbar.defaults, args[0]);\n      $self.addClass('rup-progressbar');\n      $self.attr('ruptype', 'progressbar');\n      $self.progressbar(settings);\n\n      if (settings.label) {\n        settings.$label = $('<div>').addClass('rup-progressbar-label');\n        $self.append(settings.$label);\n        settings.$label.html(settings.label.replace('${value}', $self.rup_progressbar('getRupValue')).replace('${max}', $self.rup_progressbar('option', 'max')));\n        $self.on('progressbarchange', function () {\n          settings.$label.html(settings.label.replace('${value}', $self.rup_progressbar('getRupValue')).replace('${max}', $self.rup_progressbar('option', 'max')));\n        });\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_progressbar', 'init');\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  /**\r\n   * @description Propiedades de configuración del componente.\r\n   *\r\n   * @name defaults\r\n   * @property {boolean} [disabled=false] - Determina si la barra de progreso está habilitada o deshabilitada.\r\n   * @property {number} [max=100] - Indica el valor máximo que determinará el 100% de progreso.\r\n   * @property {number} [value=0] - Determina el valor de progreso con el que se incializará la barra de progreso.\r\n   */\n\n  $.fn.rup_progressbar.defaults = {\n    disabled: false,\n    max: 100,\n    value: 0,\n    label: undefined\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup.progressbar.js?");

/***/ }),

/***/ "./src/rup.report.js":
/*!***************************!*\
  !*** ./src/rup.report.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * El objetivo principal del componente es mejorar la experiencia del usuario a la hora de generar informes mediante la presentación de diálogos de espera.\r\n *\r\n * @summary Componente RUP Report.\r\n * @module rup_report\r\n * @example\r\n * var properties={\r\n *   // Propiedades de configuración\r\n * };\r\n *\r\n * $.rup_report(properties);\r\n */\n\n/* eslint no-console:0 */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./core/utils/jquery.fileDownload */ \"./src/core/utils/jquery.fileDownload.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n  var rup_report = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupObjectConstructor('rup_report', rup_report)); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  $.rup_report('extend', {}); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  $.rup_report('extend', {\n    /**\r\n    * Función de inicialización del componente.\r\n    *\r\n    * @name _init\r\n    * @function\r\n    * @private\r\n    * @param {object} args - Propiedades de configuración.\r\n    */\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18n.base.rup_global.initError + $(this).attr('id'));\n      } else {\n        //Se recogen y cruzan las paremetrizaciones del objeto\n        var self = this,\n            settings = $.extend(true, {}, $.rup_report.defaults, args[0]),\n            //Objetos componente (params)\n        buttons = settings.buttons,\n            defaultDialog = settings.dialog,\n            customDialog = settings.customDialog,\n            //Contenedor de botones\n        $container = $.find('[id=\\'' + settings.appendTo + '\\']'); //Existe capa contenedora ?\n\n        if ($.isEmptyObject($container)) {\n          alert('No existe objeto al que añadir el componente');\n          return false;\n        }\n\n        $container = $($container[0]); //Guardar settings\n\n        $container.data('report', settings); //Añadir dialogo por defecto\n\n        var $defaultDialog_wait = $('<div></div>').attr('id', 'reportFileWait').attr('title', defaultDialog.wait.title).text(defaultDialog.wait.msg).addClass('rup_report').hide() //progressbar\n        .append($('<div></div>').addClass('ui-progressbar ui-progressbar-value ui-corner-left ui-corner-right')),\n            $defaultDialog_error = $('<div></div>').attr('id', 'reportFileError').attr('title', defaultDialog.error.title).text(defaultDialog.error.msg).addClass('rup_report').hide(),\n            $defaultDialog = $('<div></div>').attr('id', 'rup_report_dialogsContainer').append($defaultDialog_wait).append($defaultDialog_error);\n        $container.after($defaultDialog); //Guardar datos dialogo por defecto\n\n        defaultDialog.waitDiv = 'reportFileWait';\n        defaultDialog.errorDiv = 'reportFileError'; //El contenedor es un mButton\n\n        var isMButton = false,\n            $mbutton;\n\n        if ($container.hasClass('rup-toolbar_menuButtonContainer')) {\n          $mbutton = $('[id=\\'' + $container.attr('id').substring('8') + '\\']');\n          $container = $mbutton.parents('.rup-toolbar');\n          isMButton = true;\n\n          if ($.grep(buttons, function (object) {\n            return object.buttons !== undefined;\n          }).length > 0) {\n            alert('No se pueden añadir MButtons a un contenedor MButton');\n            return false;\n          }\n        } //Recorrer los botones\n\n\n        var errors = [];\n        $.each(buttons, function (index, object) {\n          if (object.buttons !== undefined) {\n            //MBUTTON\n            object.click = $container.showMButton;\n            $mbutton = $container.addMButton(object, object.json_i18n);\n            $container.addButtonsToMButton(object.buttons, $mbutton, object.json_i18n); //add click\n\n            $.each(object.buttons, function (index, object) {\n              self._checkButton(object, errors);\n\n              self._configureButton(object, defaultDialog, customDialog, settings);\n            });\n          } else {\n            //BUTTON\n            if (!isMButton) {\n              $container.addButton(object, object.json_i18n);\n              object.id = $container.attr('id') + '##' + (object.id ? object.id : object.i18nCaption);\n            } else {\n              //Añadir botones a un MButton ya existente\n              $container.addButtonsToMButton(new Array(object), $mbutton, object.json_i18n); //Mover el botón al final\n\n              var $mbuttonDiv = $('[id=\\'mbutton_' + $mbutton.attr('id') + '\\']');\n              $mbuttonDiv.find('li:first').appendTo($mbuttonDiv.children('ul'));\n            } //add click\n\n\n            self._checkButton(object, errors);\n\n            self._configureButton(object, defaultDialog, customDialog, settings);\n          }\n        });\n\n        if (errors.length > 0) {\n          var txtErrors = '';\n\n          for (var i = 0; i < errors.length; i++) {\n            txtErrors += errors[i] + '<br/>';\n          }\n\n          alert(txtErrors);\n        }\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_report', 'init');\n    },\n    _checkButton: function _checkButton(button, errors) {\n      var buttonId = button.id.substring(button.id.lastIndexOf('##') + 2); //Tiene URL?\n\n      if (button.url === undefined) {\n        errors.push(buttonId + ': no tiene URL asociada');\n      } //Existe grid asociado para columnas ?\n\n\n      if (button.columns !== undefined) {\n        //Existe grid asociado ?\n        var $grid = $.find('#' + button.columns.grid);\n\n        if ($.isEmptyObject($grid)) {\n          errors.push(buttonId + ': no existe el Grid asociado');\n        }\n      }\n    },\n    _configureButton: function _configureButton(button, defaultDialog, customDialog, settings) {\n      var self = this,\n          dialog = {};\n      $.extend(dialog, defaultDialog); //Copiar el dialogo de por defecto\n      //isInline a false por defecto\n\n      button.isInline = button.isInline === undefined ? false : button.isInline; //Si no es inLine\n\n      if (!button.isInline) {\n        $('[id=\\'' + button.id + '\\']').on('click', function () {\n          //Ocultar MButton\n          var $container = $(this).parents('div.rup-toolbar_menuButtonContainer');\n\n          if ($container.length > 0) {\n            $container.showMButton();\n            $container.removeClass('rup-toolbar_menuButtonSlided');\n          } //Controlar columnas\n\n\n          var data = {};\n\n          if (button.columns !== undefined) {\n            //GridParams\n            var $grid = $($.find('#' + button.columns.grid)[0]);\n\n            if (jQuery.isFunction(settings.fncGetGridParam)) {\n              data = jQuery.proxy(settings.fncGetGridParam, $grid)();\n            } else {\n              data = $grid.jqGrid('getGridParam', 'postData');\n            }\n\n            data.columns = $.toJSON(self._getColumns($grid, button.columns));\n          } //Dialogo propio?\n\n\n          var standarDialog = true;\n\n          if (button.customDialog !== undefined) {\n            //Buscar el dialogo correspondiente\n            var actualDialog = customDialog[button.customDialog];\n            /** WAIT **/\n            //Sobreescritura del defaultDialog-wait\n\n            if (actualDialog.waitDiv === undefined) {\n              dialog.wait = actualDialog.wait; //Dialogo propio completo\n            } else {\n              dialog.waitDiv = actualDialog.waitDiv;\n              $('#' + dialog.waitDiv).addClass('rup_report');\n            }\n            /** ERROR **/\n            //Sobreescritura del defaultDialog-error\n\n\n            if (actualDialog.errorDiv === undefined) {\n              dialog.error = actualDialog.error; //Dialogo propio completo\n            } else {\n              dialog.errorDiv = actualDialog.errorDiv;\n              $('#' + dialog.errorDiv).addClass('rup_report');\n            }\n\n            dialog.successCallback = actualDialog.successCallback;\n            dialog.failCallback = actualDialog.failCallback;\n          } //Dialogo de espera\n\n\n          var $reportFileWait = $('#' + dialog.waitDiv);\n          $reportFileWait.rup_dialog({\n            type: $.rup.dialog.TEXT,\n            autoOpen: false,\n            modal: true,\n            resizable: false\n          });\n\n          if (standarDialog) {\n            //Titulo\n            $reportFileWait.rup_dialog('setOption', 'title', dialog.wait.title); //Contenido\n\n            var content = $reportFileWait.html().split($reportFileWait.text()),\n                html = '';\n\n            for (var i = 0; i < content.length; i++) {\n              if (content[i] === '') {\n                html += dialog.wait.msg;\n              } else {\n                html += content[i];\n              }\n            }\n\n            $reportFileWait.html(html);\n          }\n\n          $reportFileWait.rup_dialog('open'); //Lanzar petición\n\n          $.fileDownload($.rup_utils.setNoPortalParam(button.url), {\n            httpMethod: 'POST',\n            data: jQuery.rup_utils.unnestjson(data),\n            successCallback: function successCallback() {\n              if (dialog.successCallback !== undefined) {\n                dialog.successCallback();\n              }\n\n              $reportFileWait.rup_dialog('close');\n            },\n            failCallback: function failCallback(responseHtml, url) {\n              try {\n                if ($('#' + $reportFileWait.attr('id')).length > 0) {\n                  $reportFileWait.rup_dialog('close');\n                }\n              } catch (e) {\n                console.error('ERROR', e);\n              }\n\n              if ($('#' + dialog.errorDiv).length > 0) {\n                var $reportFileError = $('#' + dialog.errorDiv);\n                $reportFileError.rup_dialog({\n                  type: $.rup.dialog.TEXT,\n                  autoOpen: false,\n                  modal: true,\n                  resizable: false\n                });\n\n                if (standarDialog) {\n                  //Titulo\n                  $reportFileError.rup_dialog('setOption', 'title', dialog.error.title); //Contenido\n\n                  $reportFileError.rup_dialog('setOption', 'message', dialog.error.msg);\n                }\n\n                $reportFileError.rup_dialog('open');\n              }\n\n              if (dialog.failCallback !== undefined) {\n                dialog.failCallback(responseHtml, url);\n              }\n            }\n          });\n          return false;\n        });\n      } else {\n        $('[id=\\'' + button.id + '\\']').on('click', function () {\n          window.open(button.url + '?isInline=true', '_blank');\n        });\n      }\n    },\n    _getColumns: function _getColumns($grid, columns) {\n      //Preparar datos\n      var colModel = $grid.jqGrid('getGridParam', 'colModel'),\n          colNames = $grid.jqGrid('getGridParam', 'colNames'),\n          colNumber = colNames.length,\n          columnsArray = [],\n          customNames = columns.customNames,\n          hidden = columns.hidden === true ? true : false; //Todas las columnas\n\n      if (customNames === undefined) {\n        for (var i = 0; i < colNumber; i++) {\n          //Omitir columna multiselección\n          if (colNames[i].indexOf('type=\\'checkbox\\'') !== -1) {\n            continue;\n          } //Obtener columna si se requieren todas o si solo se quieren visibles + es visible\n\n\n          if (hidden || !hidden && colModel[i].hidden === false) {\n            var column = [];\n            column.push(colModel[i].name);\n            column.push(colNames[i]);\n            columnsArray.push(column);\n          }\n        } //Columnas por nombre\n\n      } else {\n        for (var _i = 0; _i < colNumber; _i++) {\n          if ($.inArray(colModel[_i].name, customNames) !== -1) {\n            var _column = [];\n\n            _column.push(colModel[_i].name);\n\n            _column.push(colNames[_i]);\n\n            columnsArray.push(_column);\n          }\n        }\n      }\n\n      return columnsArray;\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  $.rup_report.defaults = {\n    fncGetGridParam: null,\n    dialog: {\n      wait: {\n        title: $.rup.i18nParse($.rup.i18n.base, 'rup_report.waitTitle'),\n        msg: $.rup.i18nParse($.rup.i18n.base, 'rup_report.waitMsg')\n      },\n      error: {\n        title: $.rup.i18nParse($.rup.i18n.base, 'rup_report.errorTitle'),\n        msg: $.rup.i18nParse($.rup.i18n.base, 'rup_report.errorMsg')\n      }\n    }\n  };\n  /**\r\n  * Opciones por defecto de configuración del componente.\r\n  *\r\n  * @name options\r\n  *\r\n  * @property {string} appendTo - Identificador del elemento al que se añadirá el botón o botones. Puede ser una capa, una botonera o un mbutton. En el caso de ser un mbutton sólo podrán añadirse botones, no mbuttons.\r\n  * @property {array<module:rup_report~button>} buttons - Array de botones a añadir. Su declaración es similar a los del componente rup.toolbar pero tienen algunos parámetros extra\r\n  * @property {module:rup_report~dialog} dialog - Objeto para sobrescribir los literales por defecto del diálogo del componente y asociar funciones de callback\r\n  * @property {module:rup_report~customDialog} customDialog - Objeto para definir los diálogos propios definidos por el usuario. Puede modificar simplemente los literales para un botón determinado o puede definir sus propias capas para sus diálogos completamente personalizados\r\n  */\n\n  /**\r\n  * @typedef module:rup_report~button\r\n  * @property {string} \ti18nCaption - Texto que se mostrará en el botón. Obtenido del fichero de literales de la aplicación.\r\n  * @property {string} \tjson_i18n - Objeto JSON del que se obtienen los literales a mostrar.\r\n  * @property {string} css - Define el estilo a aplicar. Se utilizará para mostrar imágenes a la izquierda del botón.\r\n  * @property {function} click - Función javascript que se ejecutará cuando se pulse el botón al que se ha asociado. La función podrá recibir un parámetro “event” que contendrá el identificador y el texto del botón y se accederá a ellos mediante la sentencia “event.data.id” y “event.data.caption” respectivamente.\r\n  * @property {array<module:rup_report~button>} buttons - Array para definir sub-botones con lo que la definición se convierte en un mbutton.\r\n  * @property {string} url - Ruta al Controller encargado de generar el informe\r\n  * @property {module:rup_report~columns} columns - Objeto que define si se van a enviar los datos de las columnas (nombres y posiciones):\r\n  * @property {string} \tcustomDialog - Identificador del dialogo propio definido en el componente\r\n  * @property {boolean} \t[isInline=false] - Indica que el informe se genera en una pestaña nueva del navegador. Sólo soportado en PDF\r\n  */\n\n  /**\r\n  * Objeto que define si se van a enviar los datos de las columnas (nombres y posiciones):\r\n  * @typedef module:rup_report~columns\r\n  * @property {string} grid - identificador del grid del que obtener las columnas.\r\n  * @property {array} customNames - array que indica el nombre de las columnas a incluir (atributo name del grid).\r\n  * @property {boolean} [hidden=false] - Indica si se desean incluir las columnas ocultas.\r\n  */\n\n  /**\r\n  *  Objeto para sobrescribir los literales por defecto del diálogo del componente y asociar funciones de callback\r\n  *  @typedef module:rup_report~dialog\r\n  *  @property {object} wait - Objeto para definir el diálogo de espera mientras se genera el informe\r\n  *  @property {string} wait.title - Título del diálogo\r\n  *  @property {string} wait.msg - mensaje del diálogo\r\n  *  @property {object} error - objeto para definir el diálogo que se muestra si se produce un error:\r\n  *  @property {string} error.title - Título del diálogo\r\n  *  @property {string} error.msg - mensaje del diálogo\r\n  *  @property {function} successCallback - Función que se ejecuta cuando se genera correctamente el informe.\r\n  *  @property {fucntion} failCallback - Función que se ejecuta cuando no se genera correctamente el informe\r\n  */\n\n  /**\r\n  *  Objeto para definir los diálogos propios definidos por el usuario. Puede modificar simplemente los literales para un botón determinado o puede definir sus propias capas para sus diálogos completamente personalizados\r\n  *  @typedef module:rup_report~customDialog\r\n  *  @property {string} nombre - identificador del diálogo que se define en el botón\r\n  *  @property {function} successCallback - Función que se ejecuta cuando se genera correctamente el informe.\r\n  *  @property {fucntion} failCallback - Función que se ejecuta cuando no se genera correctamente el informe\r\n  *  @property {object} wait - Objeto para definir el diálogo de espera mientras se genera el informe\r\n  *  @property {string} wait.title - Título del diálogo\r\n  *  @property {string} wait.msg - mensaje del diálogo\r\n  *  @property {object} error - objeto para definir el diálogo que se muestra si se produce un error:\r\n  *  @property {string} error.title - Título del diálogo\r\n  *  @property {string} error.msg - mensaje del diálogo\r\n  *  @property {string} waitDiv - Identificador de la tabla para el diálogo de espera.\r\n  *  @property {string}  errorDiv - Identificador de la capara para el diálogo de error    identificador de la capara para el diálogo de error\r\n  */\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.report.js?");

/***/ }),

/***/ "./src/rup.select.js":
/*!***************************!*\
  !*** ./src/rup.select.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery, global, $) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/* eslint-disable no-useless-escape */\n\n/*!\r\n * Copyright 2021 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permite al usuario recuperar un elemento de una gran lista de elementos o de\r\n * varias listas dependientes de forma sencilla y ocupando poco espacio en la\r\n * interfaz.\r\n * \r\n * @summary Componente RUP Select.\r\n * @module rup_select\r\n * @see El componente está basado en el plugin\r\n *      {@link https://select2.org//|Select2}. Para mas información acerca de\r\n *      las funcionalidades y opciones de configuración pinche\r\n *      {@link https://select2.org//|aquí}.\r\n * @example $(\"#idSelect\").rup_select({ source : \"selectSimple/remote\",\r\n *          sourceParam : {label:\"desc\"+$.rup_utils.capitalizedLang(),\r\n *          value:\"code\", style:\"css\"} });\r\n */\n\n/* global define */\n\n/* global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./rup.message */ \"./src/rup.message.js\"), __webpack_require__(/*! select2 */ \"./node_modules/select2/dist/js/select2.js\"), __webpack_require__(/*! ./external/select2MultiCheckboxes */ \"./src/external/select2MultiCheckboxes.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  // ****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que\n  // contendrá los métodos y la función de jQuery)\n  // ****************************************************************************************************************\n  var rup_select = {};\n  var FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE = $.rup.i18nParse($.rup.i18n.base, 'rup_global.functionNotSupportedError');\n  var FUNCTION_NOT_SUPPORTED_ERROR_TITLE = $.rup.i18nParse($.rup.i18n.base, 'rup_global.error'); // Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_select', rup_select)); // *******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  // *******************************\n\n  $.fn.rup_select('extend', {\n    /**\r\n    * Método utilizado para obtener el valor del componente. Este método es\r\n    * el utilizado por el resto de componentes RUP para estandarizar la\r\n    * obtención del valor del select.\r\n    * \r\n    * @function getRupValue\r\n    * @return {string | number} - Devuelve el valor actual del componente\r\n    *         seleccionado por el usuario.\r\n    * @example $(\"#idSelect\").rup_select(\"getRupValue\");\r\n    */\n    getRupValue: function getRupValue() {\n      var $self = $(this),\n          settings = $self.data('settings'),\n          value;\n      var values = $self.select2('data');\n\n      if ((values == undefined || values.length == 0) && !settings.multiple) {\n        value = '';\n      } else if (values.length == 1 && !settings.multiple) {\n        value = values[0].id;\n      } else {\n        value = [];\n        $.each(values, function (ind, elem) {\n          value.push(elem.id);\n        });\n      }\n\n      if (settings !== undefined && settings.submitAsJSON !== undefined && settings.submitAsJSON) {\n        var name = $self.attr('name');\n\n        if (name == undefined) {\n          name = $self.attr('id');\n        }\n\n        return jQuery.rup_utils.getRupValueAsJson(name, value);\n      }\n\n      return value;\n    },\n\n    /**\r\n    * Método utilizado para asignar el valor al componente. Este método es\r\n    * el utilizado por el resto de componentes RUP para estandarizar la\r\n    * asignación del valor al Select.\r\n    * \r\n    * @function setRupValue\r\n    * @param {string |\r\n    *            number} param - Valor que se va a asignar al componente.\r\n    * @example $(\"#idSelect\").rup_select('setRupValue', 'Si');\r\n    */\n    setRupValue: function setRupValue(param) {\n      var $self = $(this),\n          settings = $self.data('settings'); // Tipo de select\n\n      if (this.length === 0 || settings !== undefined && !settings.multiple) {\n        var texto = undefined; // normal.\n        // Simple\n\n        if (settings !== undefined && settings.data === undefined && settings.options !== undefined) {\n          // si\n          // es\n          // remoto\n          // crear\n          // el\n          // option\n          var data = {};\n\n          if (settings.groups) {\n            data = $.grep(settings.optionsGroups, function (v) {\n              return v.nid === param || v.id == param;\n            });\n          } else {\n            data = $.grep(settings.options, function (v) {\n              return v.nid === param || v.id == param;\n            });\n          }\n\n          if (data[0] !== undefined) {\n            if ($('#' + settings.id).find(\"option[value='\" + data[0].id + \"']\").length == 0) {\n              data = data[0];\n\n              _this._createOption(settings, data);\n\n              param = data.id; // mantenga el cifrado\n\n              texto = data.text;\n            } else {\n              param = data[0].id; // mantenga el cifrado\n\n              texto = data[0].text;\n            }\n          }\n        }\n\n        var dataSelect2 = $self.data('select2');\n\n        if (dataSelect2 !== undefined) {\n          if (dataSelect2.$selection.find('input').length == 1) {\n            if (settings.defaultValueAutocompleteNotLoaded == false) {\n              dataSelect2.$selection.find('input').val('');\n            } else {\n              dataSelect2.$selection.find('input').val(param);\n            }\n          }\n\n          var $search = dataSelect2.dropdown.$search || dataSelect2.selection.$search;\n\n          if ($search != undefined && texto !== undefined) {\n            //sifnifica que esta abierto\n            var lis = dataSelect2.dropdown.$dropdown.find('li');\n            var selectedDate = $.grep(lis, function (v) {\n              return $(v).text() === texto;\n            });\n            lis.attr('aria-selected', false);\n            $(selectedDate).attr('aria-selected', true);\n          }\n\n          $self.val(param).trigger('change');\n          $('#' + settings.id).rup_select('change');\n        }\n      } else {\n        // Multiple > multiselect - falta\n        if (_typeof(param) === 'object' && settings.options !== undefined) {\n          // si\n          // es\n          // remoto\n          // crear\n          // el\n          // option\n          var arrayDatos = [];\n          $.each(param, function (key, value) {\n            var data = {};\n\n            if (settings.groups) {\n              data = $.grep(settings.optionsGroups, function (v) {\n                return v.nid === value || v.id == value;\n              });\n            } else {\n              data = $.grep(settings.options, function (v) {\n                return v.nid === value || v.id == value;\n              });\n            }\n\n            if (data[0] != undefined && $('#' + settings.id).find(\"option[value='\" + data[0].id + \"']\").length == 0) {\n              data = data[0];\n\n              _this._createOption(settings, data);\n\n              arrayDatos.push(data.id);\n            } else {\n              arrayDatos.push(value);\n            }\n          });\n          $('#' + settings.id).val(arrayDatos).trigger('change');\n        }\n      }\n    },\n\n    /**\r\n    * Método que limpia el valor seleccionado en el select. En el caso de\r\n    * selección múltiple los valores seleccionados.\r\n    * \r\n    * @function clear\r\n    * @example $(\"#idSelect\").rup_select(\"clear\");\r\n    */\n    clear: function clear() {\n      var $self = $(this); // init de select\n\n      if (this.length > 0) {\n        var dataSelect2 = $self.data('select2');\n        dataSelect2.$selection.find('input').val(''); // Simple y multi\n\n        if ($self.data('settings').blank !== undefined) {\n          $self.val($self.data('settings').blank).trigger('change');\n        } else {\n          $self.val(null).trigger('change');\n        }\n      }\n    },\n\n    /**\r\n    * Método que lanza el evento change del componente.\r\n    * \r\n    * @function change\r\n    * @example $(\"#idSelect\").rup_select(\"change\");\r\n    */\n    change: function change() {\n      // Tipo de select\n      if ($(this).data('settings').change) {\n        $(this).data('settings').change();\n      }\n    },\n\n    /**\r\n    * Selecciona todos los elementos en el caso de tratarse de un select\r\n    * multilesección.\r\n    * \r\n    * @function checkAll\r\n    * @example $(\"#idSelect\").rup_select(\"checkAll\");\r\n    */\n    checkAll: function checkAll() {\n      // Tipo de select\n      if ($(this).data('settings').multiple) {\n        // Multiple > multiselect\n        var selectedItems = [];\n        var allOptions = $(\"#\" + $(this)[0].id + \" option\");\n        allOptions.each(function () {\n          selectedItems.push($(this).val());\n        });\n        $(this).rup_select('setRupValue', selectedItems);\n      } else {\n        // Simple > selectmenu\n        alert('Función no soportada.');\n      }\n    },\n\n    /**\r\n    * Selecciona el elemento del select que contiene como texto el\r\n    * indicado. En caso de no existir el texto a buscar el se no sufrirá\r\n    * cambios En el caso de selección múltiple el parámetro será un array.\r\n    * \r\n    * @function selectByLabel\r\n    * @param {string |\r\n    *            string[]} param - Parámetro utilzado para determinar los\r\n    *            elementos a seleccionar.\r\n    * @example // Simple $(\"#idSelect\").rup_select(\"selectByLabel\", \"No\"); //\r\n    *          Multiple $(\"#idSelect\").rup_select(\"selectByLabel\",\r\n    *          [\"No\",\"Si\"]);\r\n    */\n    selectByLabel: function selectByLabel(param) {\n      // Tipo de select\n      var settings = $(this).data('settings');\n\n      if (settings.options !== undefined) {\n        var options = settings.options;\n\n        if (settings.groups) {\n          options = settings.optionsGroups;\n        }\n\n        if (!settings.multiple) {\n          // Simple > selectmenu\n          var data = $.grep(options, function (v) {\n            return v.text === param;\n          });\n\n          if (data[0] !== undefined) {\n            $(this).rup_select('setRupValue', data[0].id);\n          }\n        } else {\n          // Ejemplo\n          // $('#idSelect').rup_select('selectByLabel',['php_value','java_value'])\n          var datos = [];\n          $.each(param, function (key, value) {\n            var data = $.grep(options, function (v) {\n              return v.text === value;\n            });\n\n            if (data[0] !== undefined) {\n              datos.push(data[0].id);\n            }\n          });\n          $(this).rup_select('setRupValue', datos);\n        }\n      }\n    },\n\n    /**\r\n     * Selecciona el elemento enviado como parámetro. En caso de ser un numérico se selecciona por la posición (comenzando en 0) y si es un literal se selecciona por el valor. En el caso de selección múltiple el parámetro será un array.\r\n     *\r\n     * @function  select\r\n     * @param {string | number | string[] | number[]} param - Parámetro utilzado para determinar los elementos a seleccionar.\r\n     * @example\r\n     * // Simple\r\n     * $(\"#idSelect\").rup_select(\"select\", 2);\r\n     * // Multiple\r\n     * $(\"#idSelect\").rup_select(\"select\", [0,2]);\r\n     */\n    select: function select(param) {\n      var settings = $(this).data().settings;\n      var datas = settings.data || settings.options;\n\n      if (settings.groups) {\n        datas = settings.optionsGroups;\n      }\n\n      if (settings.multiple) {\n        var datos = [];\n        $.each(param, function (key, value) {\n          if (datas.length >= value) {\n            datos.push(datas[value].id);\n          }\n        });\n        $(this).rup_select('setRupValue', datos);\n      } else {\n        if (datas.length >= param) {\n          $(this).rup_select('setRupValue', datas[param].id);\n        }\n      }\n    },\n\n    /**\r\n    * Método que devuelve el label asociado al valor seleccionado en el\r\n    * select. En el caso de la selección múltiple se devolverá un array.\r\n    * \r\n    * @function label\r\n    * @return {string | string[]} - Texto del elemento o elementos\r\n    *         seleccionado.\r\n    * @example $(\"#idSelect\").rup_select(\"label\");\r\n    */\n    label: function label() {\n      // Tipo de select\n      var data = $(this).select2('data');\n\n      if (!$(this).data('settings').multiple) {\n        return data[0].text;\n      } else {\n        // Multiple > multiselect\n        var retorno = [];\n\n        for (var i = 0; i < data.length; i++) {\n          retorno.push(data[i].text);\n        }\n\n        return retorno;\n      }\n    },\n\n    /**\r\n    * Devuelve el índice de la opción seleccionada en el select (empezando\r\n    * en 1). En el caso de la selección múltiple se devolverá un array.\r\n    * \r\n    * @function index\r\n    * @return {number | number[]} - Índice del elemento o elementos\r\n    *         seleccionados.\r\n    * @example $(\"#idSelect\").rup_select(\"index\");\r\n    */\n    index: function index() {\n      // Tipo de select\n      var settings = $(this).data('settings');\n\n      if (settings.options !== undefined) {\n        var options = settings.options;\n\n        if (settings.groups) {\n          options = settings.optionsGroups;\n        }\n\n        var count = 0;\n        var data = $(this).select2('data');\n\n        if (!settings.multiple) {\n          // Simple > selectmenu\n          $.each(options, function (key, value) {\n            if (settings.blank !== value.id.toString()) {\n              count = count + 1;\n            }\n\n            if (value.id.toString() === data[0].id.toString()) {\n              return false;\n            }\n          });\n        } else {\n          var listaCount = [];\n          $.each(data, function (key, value) {\n            count = 0;\n            $.each(options, function (cont, valor) {\n              if (settings.blank !== value.id.toString()) {\n                count = count + 1;\n              }\n\n              if (value.id.toString() === valor.id.toString()) {\n                listaCount.push(count);\n                return false;\n              }\n            });\n          });\n          return listaCount;\n        }\n\n        return count;\n      }\n    },\n\n    /**\r\n    * Deshabilita el select.\r\n    * \r\n    * @function disable\r\n    * @example $(\"#idSelect\").rup_select(\"disable\");\r\n    */\n    disable: function disable() {\n      // Tipo de select\n      var $self = $(this);\n      $self.prop(\"disabled\", true);\n    },\n\n    /**\r\n    * Habilita el select.\r\n    * \r\n    * @function enable\r\n    * @example $(\"#idSelect\").rup_select(\"enable\");\r\n    */\n    enable: function enable() {\n      var $self = $(this);\n      $self.prop(\"disabled\", false);\n    },\n\n    /**\r\n    * Indica si el select está deshabilitado o no.\r\n    * \r\n    * @function isDisabled\r\n    * @param {boolean} -\r\n    *            Devuelve si el select está deshabilitado o no.\r\n    * @example $(\"#idSelect\").rup_select(\"isDisabled\");\r\n    */\n    isDisabled: function isDisabled() {\n      if ($(this).attr('disabled') === 'disabled') {\n        return true;\n      } else {\n        return false;\n      }\n    },\n\n    /**\r\n    * Realiza una recarga de los select.\r\n    * \r\n    * @function reload\r\n    * @example $(\"#idSelect\").rup_select(\"reload\");\r\n    */\n    reload: function reload(removeOptions) {\n      var settings = $(this).data('settings');\n      $(this).select2(\"destroy\");\n\n      if (removeOptions) {\n        $(this).find('option').remove();\n      }\n\n      $(this).rup_select(settings);\n    },\n\n    /**\r\n    * Cambia el source del select y recarga el componente para que este\r\n    * comience a usarlo.\r\n    * \r\n    * @function setSource\r\n    * @param {string}\r\n    *    source - Source desde el cual se obtendran los datos a\r\n    *    sourceParam  - Se puede cambiar los parámetros de la cabecera..\r\n    * @example $(\"#idSelect\").rup_select(\"setSource\", source, sourceParam);\r\n    */\n    setSource: function setSource(source, sourceParam) {\n      if (source !== undefined && source !== '') {\n        var $self = $(this);\n        var settings = $self.data().settings;\n        var dataSelect2 = $self.data('select2');\n\n        if ($self.data().settings.data === undefined) {\n          // remoto\n          dataSelect2.dataAdapter.ajaxOptions.url = source;\n\n          if (sourceParam != undefined) {\n            dataSelect2.dataAdapter.ajaxOptions.headers = $.toJSON(sourceParam);\n          }\n        } else {\n          // local\n          settings.data = source;\n          settings.options = undefined;\n          $self.data('settings', settings);\n\n          if (dataSelect2.$selection != undefined) {\n            dataSelect2.$selection.find('input').val('');\n          }\n\n          $self.empty();\n\n          if (settings.data !== undefined && settings.autocomplete) {\n            $.each(settings.data, function () {\n              _this._createOption(settings, this);\n            });\n          } else {\n            $self.select2({\n              data: settings.data\n            });\n          }\n        }\n\n        if (settings.multiple == true) {\n          $self.rup_select('reload');\n        }\n      }\n    },\n\n    /**\r\n    * Método que devuelve los datos, de los elementos seleccionados.\r\n    * \r\n    * @function getDataSelected\r\n    * @return {string | string[]} - Texto del elemento o elementos\r\n    *         seleccionado.\r\n    * @example $(\"#idSelect\").rup_select(\"label\");\r\n    */\n    getDataSelected: function getDataSelected() {\n      // Tipo de select\n      var data = $(this).select2('data');\n\n      if (!$(this).data('settings').multiple) {\n        //Validar que venga el nid\n        if (data[0] != undefined && data[0].nid == undefined && $(this).data('settings').options != undefined) {\n          var seleccionado = $.grep($(this).data('settings').options, function (v, index) {\n            return v.id === data[0].id;\n          });\n\n          if (seleccionado != undefined && seleccionado.length == 1) {\n            data[0].nid = seleccionado[0].nid;\n          }\n        }\n\n        return data[0];\n      } else {\n        return data;\n      }\n    },\n\n    /**\r\n    * Método que añade un option al select en local\r\n    * \r\n    * @function addOption\r\n    * id:\tidentificador del nuevo option\r\n    * text: texto del nuevo option\r\n    * label: en Caso de ser grupos, el label donde se va a meter(obligatorio)\r\n    * @example $(\"#idSelect\").rup_select(\"label\");\r\n    */\n    addOption: function addOption(id, text, label) {\n      // Tipo de select\n      var newOpt = new Option(id, text);\n\n      if ($(this).data('settings').groups && label != undefined) {\n        var options = $(this).data('select2').options.options;\n        $(this).find('optgroup[label=\"' + label + '\"]').append(newOpt);\n        var seleccionado = $.grep(options.data, function (v, index) {\n          return v.text === label;\n        });\n\n        if (seleccionado != undefined && seleccionado.length == 1) {\n          seleccionado[0].children[seleccionado[0].children.length] = {\n            id: id,\n            text: text\n          };\n        }\n      } else {\n        $(this).append(newOpt);\n      }\n    },\n\n    /**\r\n     * Deshabilita una opción de un select multiselección.\r\n     *\r\n     * @function  disableOpt\r\n     * @param {string} optValue - Value del option que queremos deshabilitar.\r\n     * @example\r\n     * $(\"#idSelect\").rup_select(\"disableOpt\", \"opt1\");\r\n     */\n    disableOpt: function disableOpt(optValue) {\n      if ($(this).data('settings').multiple) {\n        //Deshabilitar select\n        this.find('[value=\\'' + optValue + '\\']').attr('disabled', 'disabled'); //Si pertenece a OptGroup y es el último en deshabilitarse > Cambiar estilos optGroupLabel\n\n        if ($(this).data('settings').sourceGroup != undefined) {\n          //Obtener inicio optGroup\n          var li = obj.parentsUntil('ul').last().prevAll('li.ui-multiselect-optgroup-label').first(),\n              inputs = li.nextUntil('li.ui-multiselect-optgroup-label').find('input'),\n              allDisabled = true;\n\n          for (var i = 0; i < inputs.length; i++) {\n            if (!inputs[i].disabled) {\n              allDisabled = false;\n              break;\n            }\n          }\n\n          if (allDisabled) {\n            //Estilos optGroup\n            li.css('color', 'grey');\n            li.children('a').remove();\n            li.children('span').not('.rup-combo_multiOptgroupLabel').remove();\n          }\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Deshabilita varias opciones del select. Las opciones se identifican mediante un array.\r\n     *\r\n     * @function disableOptArr\r\n     * @param {string[]} optValueArr - Array en el que se indican los values de las opciones a deshabilitar.\r\n     * @example\r\n     * $(\"#idSelect\").rup_select(\"disableOptArr\", [\"opt1\",\"opt2\"]);\r\n     */\n    disableOptArr: function disableOptArr(optValueArr) {\n      if ($(this).data('settings').multiple) {\n        for (var i = 0; i < optValueArr.length; i++) {\n          $(this).rup_select('disableOpt', optValueArr[i]);\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Habilita una opción de un select multiselección.\r\n     *\r\n     * @function enableOpt\r\n     * @param {string} enableOpt - Value del option que queremos habilitar.\r\n     * @example\r\n     * $(\"#idSelect\").rup_select(\"enableOpt\", \"opt1\");\r\n     */\n    enableOpt: function enableOpt(optValue) {\n      if ($(this).data('settings').multiple) {\n        //Habilitar select\n        this.find('[value=\\'' + optValue + '\\']').removeAttr('disabled');\n        var obj = $('#rup-multiCombo_' + $(this).attr('id')).find('[value=\\'' + optValue + '\\']'); //Habilitar input\n\n        obj.removeAttr('disabled'); //Estilos línea (label)\n\n        obj.parent().css('color', 'black'); //Si pertenece a OptGroup y es el primero en habilitarse > Cambiar estilos optGroupLabel\n\n        if ($(this).data('settings').sourceGroup != undefined) {\n          //Obtener inicio optGroup\n          var li = obj.parentsUntil('ul').last().prevAll('li.ui-multiselect-optgroup-label').first(); //Estilos optGroup\n\n          if (li.children('a').length === 0) {\n            li.css('color', 'black');\n\n            this._generateOptGroupLabel(li, $(this).data('settings').multiOptgroupIconText);\n          }\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Habilita varias opciones del select. Las opciones se identifican mediante un array.\r\n     *\r\n     * @function enableOptArr\r\n     * @param {string[]} optValueArr - Array en el que se indican los values de las opciones a habilitar.\r\n     * @example\r\n     * $(\"#idSelect\").rup_select(\"enableOptArr\", [\"opt1\",\"opt2\"]);\r\n     */\n    enableOptArr: function enableOptArr(optValueArr) {\n      if ($(this).data('settings').multiple) {\n        for (var i = 0; i < optValueArr.length; i++) {\n          $(this).rup_select('enableOpt', optValueArr[i]);\n        }\n      } else {\n        $.rup.errorGestor(FUNCTION_NOT_SUPPORTED_ERROR_MESSAGE, FUNCTION_NOT_SUPPORTED_ERROR_TITLE);\n      }\n    },\n\n    /**\r\n     * Ordena alfanumericamente y en orden ascendente el combo sobre el que se aplica. Se invoca por defecto al cargarse los combos a no ser que se cambie el valor del atributo ordered en la creación.\r\n     *\r\n     * @function  order\r\n     * @param {boolean} orderedByValue - Indica si la búsqueda es por texto (por defecto) o si la búsqueda es por el valor.\r\n     * @param {boolean} orderAsNumber - Indica si se debe ordenar como valores numéricos en vez de alfabéticos.\r\n     * @param {boolean} skipFirst - Determina si se debe obviar el primer elemento.\r\n     * @example\r\n     * $(\"#idSelect\").rup_select(\"order\", orderedByValue, orderAsNumber, skipFirst);\r\n     */\n    order: function order(groups, orderedByValue, orderAsNumber) {\n      /* Get options */\n      var selector = $(this).data('select2') || $(this).parent().data('select2');\n      var settings = selector.options.options;\n\n      if (groups) {\n        $(this).find('optgroup').each(function () {\n          $(this).rup_select('order', false, orderedByValue, orderAsNumber);\n        }); //Order children\n\n        if (settings.data != undefined) {\n          $(settings.data).each(function () {\n            if (this.children != undefined && this.children.length > 0) {\n              this.children = this.children.sort(function (a, b) {\n                return a.text.localeCompare(b.text);\n              });\n            }\n          });\n        }\n      } else {\n        var selectList = $(this).find('option').not('[value=' + settings.blank + ']');\n        var option = $(this).find('option[value=' + settings.blank + ']');\n        /* Order by innerText (case insensitive) */\n\n        selectList.sort(function (a, b) {\n          return a.innerText.localeCompare(b.innerText);\n        });\n        /* Re-do select HTML */\n\n        $(this).html(selectList);\n\n        if (option.length == 1) {\n          $(this).prepend(option);\n        }\n      }\n    },\n\n    /**\r\n           * Lanza una búsqueda en el autocomplete con el parámetro indicado y el foco va a parar al input.\r\n           *\r\n           * @param {string} term - Cadena de texto utilizada para realizar la búsqueda.\r\n           * @param {boolean} notOthersClose - Si deseas cerrar el resto de componentes.\r\n           * @function search\r\n           * \r\n           * @example\r\n           * $(\"#idSelect\").rup_select(\"search\", \"java\");\r\n           */\n    search: function search(term, notOthersClose) {\n      var $search = $(this).data('select2').dropdown.$search || $(this).data('select2').mySelect.selection.$search;\n\n      if (!notOthersClose) {\n        $('.select2-hidden-accessible').select2('close');\n      }\n\n      $(this).data('select2').$container.find('input').val(term);\n\n      if ($search != undefined) {\n        $search.val(term);\n        $search.trigger('keyup');\n      }\n    },\n\n    /**\r\n        * Permite consultar y modificar la configuración del componente.\r\n        *\r\n        * @param {string | object} optionName - Nombre de la propiedad que se desea gestionar o objeto de compuesto de varias propiedades.\r\n        * @param {*} [value] - Corresponde al valor de la propiedad en caso de haberse especificado el nombre de la misma en el primér parámetro.\r\n        * @param {*} aux - Parámetro extra de confirguración para la propiedad \"source\".\r\n        * @function option\r\n        * @example\r\n        * // Establecer una propiedad\r\n        * $(\"#idSelect\").rup_select(\"option\", \"minLegth\", 2);\r\n        * // Establecer varias propiedad\r\n        * $(\"#idSelect\").rup_select(\"option\", {minLegth:2, delay:1000});\r\n        */\n    option: function option(optionName, value, removeOptions) {\n      var settings = $(this).data('settings');\n      settings[optionName] = value;\n      $(this).select2(\"destroy\");\n\n      if (removeOptions) {\n        $(this).find('option').remove();\n      }\n\n      $(this).rup_select(settings);\n    },\n\n    /**\r\n        * Permite abrir el componente.\r\n        *\r\n        * @param {boolean} notOthersClose - Si deseas cerrar el resto de componentes.\r\n        * @function open\r\n        * @example\r\n        * // Establecer una propiedad\r\n        * $(\"#idSelect\").rup_select(\"option\", true);\r\n        */\n    open: function open(notOthersClose) {\n      if (!notOthersClose) {\n        $('.select2-hidden-accessible').select2('close');\n      }\n\n      $(this).select2('open');\n    },\n\n    /**\r\n        * Permite cerrar el componente.\r\n        *\r\n        * @param {boolean} notOthersClose - Si deseas cerrar el resto de componentes.\r\n        * @function close\r\n        * @example\r\n        * // Establecer una propiedad\r\n        * $(\"#idSelect\").rup_select(\"option\", true);\r\n        */\n    close: function close(notOthersClose) {\n      if (!notOthersClose) {\n        $('.select2-hidden-accessible').select2('close');\n      }\n\n      $(this).select2('close');\n    },\n\n    /**\r\n           * Elimina el autocomplete.\r\n           *\r\n           * @function destroy\r\n           * @example\r\n           * $(\"#idSelect\").rup_select(\"destroy\");\r\n           */\n    destroy: function destroy(notRemoveOptions) {\n      $(this).select2(\"destroy\");\n\n      if (!notRemoveOptions) {\n        $(this).find('option').remove();\n      }\n    }\n  }); // *******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  // *******************************\n\n  $.fn.rup_select('extend', {\n    /**\r\n    * Selecciona el elemento correspondiente al label indicado\r\n    * \r\n    * @function _selectLabel\r\n    * @private\r\n    * @param {object}\r\n    *            selector - Referencia al objeto jQuery del select.\r\n    * @param {object}\r\n    *            param - Value correspondiente.\r\n    */\n    _selectLabel: function _selectLabel(selector, param) {\n      var $option;\n\n      for (var i = 0; i < $('option', selector).length; i = i + 1) {\n        $option = jQuery(selector).find('option').eq(i);\n\n        if (jQuery(selector).find('option').eq(i).text() === param) {\n          $(selector).selectmenu('index', $option.prop('index'));\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    /**\r\n    * Obtener la opción vacía a partir del fichero de internacionalización\r\n    * de la aplicación o del fichero por defecto.\r\n    * \r\n    * @function _getBlankLabel\r\n    * @private\r\n    * @param {string}\r\n    *            id - Identificador del fichero\r\n    */\n    _getBlankLabel: function _getBlankLabel(id) {\n      var app = $.rup.i18n.app; // Comprueba si el select tiene su propio texto personalizado\n\n      if (app[id] && app[id]._blank) {\n        return app[id]._blank;\n      } // Comprueba si la aplicacion tiene un texto definido para todos los\n      // blank\n      else if (app.rup_select && app.rup_select.blank) {\n        return app.rup_select.blank;\n      } // Si no hay textos definidos para los blank obtiene el por defecto\n      // de UDA\n\n\n      return $.rup.i18n.base.rup_select.blankNotDefined;\n    },\n\n    /**\r\n    * Obtener valores de los selects padres (si no están cargados o valores\r\n    * 'vacíos' devuelve null). En caso de disponer de varios selects padres\r\n    * se devolverán separados por un caracter delimitador.\r\n    * \r\n    * @function _getParentsValues\r\n    * @private\r\n    * @param {object[]}\r\n    *            settings - Array con los elementos de configuración.\r\n    * @param {boolean}\r\n    *            remote - Determina si la fuente de datos es remota o no.\r\n    * @return {string} - Devuelve los values seleccionados de los selects\r\n    *         padres.\r\n    */\n    _getParentsValues: function _getParentsValues(settings, remote, multiValueToken) {\n      var retorno = '';\n      var parent = [];\n\n      if (settings.parent == undefined) {\n        return '';\n      }\n\n      if (typeof settings.parent == 'string') {\n        parent.push(settings.parent);\n      } else {\n        parent = settings.parent;\n      }\n\n      var parentsFull = 0;\n      $.each(parent, function (idx, parentId) {\n        if (parentId != undefined && $('#' + parentId).val() != null && $('#' + parentId).val().trim() !== '') {\n          if (settings.blank == $('#' + parentId).val()) {\n            retorno = '';\n          } else {\n            if (remote) {\n              // PAra remoto\n              retorno += $('#' + parentId).attr('name') + '=' + $('#' + parentId).val() + '&';\n            } else {\n              // PAra local\n              if (retorno != '') {\n                retorno = retorno + multiValueToken + $('#' + parentId).val();\n              } else {\n                retorno = $('#' + parentId).val();\n              }\n            }\n\n            parentsFull = parentsFull + 1;\n          }\n        }\n      });\n\n      if (parentsFull < parent.length) {\n        // si no estan todos los padres no\n        // se busca.\n        return '';\n      } // Evitar & o multiValueToken finales\n\n\n      if (retorno !== '' && remote) {\n        retorno = retorno.substring(0, retorno.length - 1);\n      }\n\n      return retorno;\n    },\n\n    /**\r\n    * Procesa el conjunto de registros devueltos por una petición sobre un\r\n    * origen de datos local.\r\n    * \r\n    * @function _parseLOCAL\r\n    * @private\r\n    * @param {object[]}\r\n    *            data - Array de registros obtenidos a partir del origen de\r\n    *            datos.\r\n    * @param {object}\r\n    *            i18nId - Opciones de idioma.\r\n    * @param {jQuery}\r\n    *            isParent - Si tiene datos en forma parent.\r\n    */\n    _parseLOCAL: function _parseLOCAL(data, i18nId, isParent) {\n      var text;\n      var array = data;\n\n      if (isParent) {\n        // Si es padre llamar a la recursividad\n        if (Array.isArray(data)) {\n          data = data[0];\n        }\n\n        $.each(data, function (key, value) {\n          data[key] = _this._parseLOCAL(data[key], i18nId, false);\n        });\n      } else {\n        data = [];\n\n        for (var i = 0; i < array.length; i = i + 1) {\n          if (_typeof(array[i]) === 'object') {\n            // multi-idioma\n            if (array[i].i18nCaption) {\n              text = $.rup.i18nParse($.rup.i18n.app[i18nId], array[i].i18nCaption);\n            } else {\n              text = array[i].text;\n            }\n\n            array[i].text = text;\n          } else {\n            // El id es el mismo que el texto.\n            data[i] = {\n              id: array[i],\n              text: array[i]\n            };\n          }\n        }\n\n        if (data.length > 0) {\n          // El id es el mismo que el texto.\n          return data;\n        }\n      }\n\n      return array;\n    },\n\n    /**\r\n    * Procesa el conjunto de registros devueltos por una petición sobre un\r\n    * origen de datos remoto.\r\n    * \r\n    * @function _parseRemoteGroup\r\n    * @private\r\n    * @param {object[]}\r\n    *            array - Array de registros obtenidos a partir del origen\r\n    *            de datos.\r\n    * @param {object}\r\n    *            settings - Objeto de propiedades de configuración con el\r\n    *            que se ha inicializado el componente.\r\n    */\n    _parseRemoteGroup: function _parseRemoteGroup(array, settings) {\n      var item;\n      var data = [];\n\n      for (var i = 0; i < array.length; i = i + 1) {\n        item = array[i];\n        var key = Object.keys(item)[0];\n        var dato = {};\n        dato.text = key;\n        dato.children = item[key];\n        dato.id = \"group__\" + i;\n        data.push(dato);\n      }\n\n      return data;\n    },\n\n    /**\r\n    * Prepara la petición AJAX que se va a realizar para obtener los\r\n    * registros a partir de un origen remoto. Se añaden las cabeceras RUP\r\n    * correspondientes para realizar la serialización json de manera\r\n    * correcta.\r\n    * \r\n    * @function _ajaxBeforeSend\r\n    * @private\r\n    * @param {object}\r\n    *            xhr - Objeto xhr que se va a enviar en la petición\r\n    * @param {object}\r\n    *            settings - Objeto de propiedades de configuración con el\r\n    *            que se ha inicializado el componente.\r\n    * @param {jQuery}\r\n    *            html - Referencia al objeto jQuery que contiene los\r\n    *            elementos.\r\n    */\n    _ajaxBeforeSend: function _ajaxBeforeSend(xhr, settings, html) {\n      // Crear select (vacío) y deshabilitarlo\n      if (html !== undefined) {\n        $('#' + settings.id).replaceWith(html);\n      } // Si no es 'reload' se debe inicializar vacío\n\n\n      $('#' + settings.id).rup_select('disable'); // LOADING...\n\n      $('#' + settings.id + '-button span:first-child').removeClass(\"ui-icon ui-icon-triangle-1-s\").addClass('rup-select_loadingText').text($.rup.i18n.base.rup_select.loadingText);\n      var icon = $('#' + settings.id + '-button span:last-child');\n      $(icon).removeClass('ui-icon-triangle-1-s');\n      $(icon).text(''); // Evita errores de visualización con el icono\n\n      $(icon).addClass('rup-select_loading'); // Cabecera RUP\n\n      xhr.setRequestHeader('RUP', $.toJSON(settings.sourceParam));\n    },\n\n    /**\r\n    * Procesa la respuesta de la petición AJAX en el caso de que se haya\r\n    * producido un error en la misma.\r\n    * \r\n    * @function _ajaxError\r\n    * @private\r\n    * @param {object}\r\n    *            xhr - Objeto xhr enviado en la respuesta.\r\n    * @param {string}\r\n    *            textStatus - Cadena identificadora del error que se ha\r\n    *            producido en la petición.\r\n    * @param {object}\r\n    *            errorThrown - Objeto error correspondiente al que se ha\r\n    *            producido en la petición.\r\n    * @param {object}\r\n    *            settings - Objeto de propiedades de configuración con el\r\n    *            que se ha inicializado el componente.\r\n    */\n    _ajaxError: function _ajaxError(xhr) {\n      if (xhr.responseText !== null && xhr.responseTex !== undefined && xhr.responseText.length < 200) {\n        $.rup.showErrorToUser(xhr.responseText);\n      } else {\n        $.rup.showErrorToUser($.rup.i18n.base.rup_select.ajaxError);\n      }\n    },\n\n    /**\r\n    * Carga la opción remoto.\r\n    * \r\n    * @function _loadRemote\r\n    * @private\r\n    * @param {object}\r\n    *            settings - Objeto de propiedades de configuración con\r\n    *            el que se ha inicializado el componente.\r\n    * @return {jQuery} - Objeto jQuery con referencia al elemento que\r\n    *         contiene el foco.\r\n    */\n    _loadRemote: function _loadRemote(settings, first) {\n      var rupSelect = this;\n      settings.ajax = {\n        url: function url() {\n          return rupSelect._generateUrl(settings, _this._getParentsValues(settings, true));\n        },\n        dataType: settings.dataType,\n        processResults: function processResults(response) {\n          // Require id y text, podemos permitir que no venga.\n          if (settings.placeholder != undefined && !settings.multiple) {\n            var elBlank = response.find(function (x) {\n              return x.id == settings.blank;\n            });\n\n            if (elBlank == undefined && !settings.autocomplete) {\n              response.unshift({\n                id: settings.blank,\n                text: settings.placeholder\n              });\n            }\n          }\n\n          if (settings.groups) {\n            // PArsear para grupos.\n            var results = [];\n            $.each(response, function (index, value) {\n              var key = Object.keys(value)[0];\n              results[index] = {\n                'text': key,\n                'children': value[key]\n              };\n            });\n            response = results;\n          }\n\n          settings.options = response;\n          $('#' + settings.id).data('settings', settings);\n          return {\n            results: response\n          };\n        },\n        cache: false,\n        data: function data() {\n          // Es necesario enviarlo vacío para que el componente subyacente no genere parámetros extra que Hdiv bloqueará.\n          //se hará en el transport\n          return _this._getParentsValues(settings, true);\n        },\n        error: function error(xhr, textStatus, errorThrown) {\n          if (settings.onLoadError !== null) {\n            jQuery(settings.onLoadError(xhr, textStatus, errorThrown));\n          } else {\n            if (textStatus != 'abort') {\n              //Si se hacen 2 llamadas se cancela la primera.\n              rupSelect._ajaxError(xhr, textStatus, errorThrown);\n            }\n\n            console.log(textStatus);\n          }\n        }\n      };\n\n      if (settings.selected || settings.autocomplete && settings.defaultValue != undefined) {\n        settings.firstLoad = true;\n      }\n\n      if (settings.parent != undefined && ($('#' + settings.parent).val() == null || $('#' + settings.parent).val().trim() === '')) {\n        settings.firstLoad = false;\n      }\n\n      var __cache = [];\n      var __lastQuery = null;\n\n      settings.ajax.transport = function (params, success, failure) {\n        // retrieve the cached key or default to _ALL_\n        var __cachekey = params.data || '_ALL_'; //Se actualiza el data, para mantener la misma función, con hdiv ya no se mandan los data\n\n\n        if (!settings.autocomplete) {\n          params.data = \"\";\n        }\n\n        var mySelect = $('#' + settings.id).data('select2');\n\n        if (settings.autocomplete) {\n          params.data.q = mySelect.$container.find('input').val();\n          __cachekey = params.data.q;\n        }\n\n        if (__lastQuery !== __cachekey) {\n          // remove caches not from last query\n          __cache = [];\n        }\n\n        __lastQuery = __cachekey; //Si esta cacheado, no busca\n\n        if (settings.cache == true && 'undefined' !== typeof __cache[__cachekey]) {\n          // display the cached results\n          success(__cache[__cachekey]);\n          return;\n        }\n\n        mySelect.$results.find('li').addClass('disabledButtonsTable');\n        mySelect.$selection.find('input').addClass('disabledButtonsTable');\n        mySelect.$selection.find('input').blur(); //Si tiene padres deshabilitarlos\n\n        if (settings.parent) {\n          if (typeof settings.parent === 'string') {\n            $('#' + settings.parent).rup_select(\"disable\");\n          } else {\n            $.each(settings.parent, function (ind, elem) {\n              $('#' + elem).rup_select(\"disable\");\n            });\n          }\n        }\n\n        var $request = undefined;\n\n        if (settings.autocomplete) {\n          //Meter busqueda accentFolding\n          var term = '';\n          term = params.data.q;\n          term = term.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n          params.data = $.extend({\n            q: term,\n            c: settings.contains\n          }, settings.extraParams);\n        }\n\n        if (settings.parent) {\n          var datosParent = _this._getParentsValues(settings, true);\n\n          if (datosParent != '') {\n            if (settings.autocomplete) {\n              //añadir el data del padre\n              var padres = datosParent.split('&'); //split por si tiene varios padres\t\n\n              $.each(padres, function () {\n                if (this !== undefined) {\n                  var cad = this.split('=');\n\n                  if (cad != undefined && cad.length > 0) {\n                    params.data[cad[0]] = cad[1];\n                    __cachekey = __cachekey + cad[1]; //se añade la parte del padre\n                  }\n                }\n              });\n            } else if (params.url.indexOf(datosParent) < 0) {\n              //Aseguramos que mete el valor del padre.\n              params.url = params.url + '?' + datosParent;\n            }\n\n            $request = $.ajax(params);\n          }\n        } else {\n          $request = $.ajax(params);\n        }\n\n        if ($request != undefined) {\n          $request.then(function (data) {\n            // Vuelve la peticion\n            // store data in cache\n            __cache[__cachekey] = data; // display the results\n\n            $('#' + settings.id).rup_select(\"enable\"); //Si tiene padres deshabilitarlos\n\n            if (settings.parent) {\n              if (typeof settings.parent === 'string') {\n                $('#' + settings.parent).rup_select(\"enable\");\n              } else {\n                $.each(settings.parent, function (ind, elem) {\n                  $('#' + elem).rup_select(\"enable\");\n                });\n              }\n            }\n\n            success(__cache[__cachekey]); // Actualizar seleccionado en la lista//css\n\n            var positions = [];\n            var valueSelect = $('#' + settings.id).rup_select('getRupValue');\n\n            if (settings.groups) {\n              var i;\n\n              (function () {\n                // Parseo de grupos para\n                // seleccionar\n                var allFacts = []; // grupos\n\n                for (i = 0; i < data.length; i = i + 1) {\n                  if (_typeof(data[i]) === 'object') {\n                    $.each(data[i], function (key, value) {\n                      if (_typeof(value) === 'object') {\n                        $.each(value, function () {\n                          this.id = String(this.id);\n                          allFacts.push(this);\n                        });\n                      }\n                    });\n                  }\n                }\n\n                data = allFacts;\n                settings.optionsGroups = data;\n              })();\n            } //Se obliga a que las claves sean String recomendado por select2\n\n\n            var seleccionado = $.grep(data, function (v, index) {\n              v.id = String(v.id);\n\n              if (v.text === undefined && v[settings.sourceParam.text] !== undefined) {\n                v.text = v[settings.sourceParam.text];\n              }\n\n              if (v.id == valueSelect) {\n                positions.push(index);\n              }\n\n              return v.nid == settings.selected || v.id == settings.selected;\n            });\n\n            if ($('#' + settings.id).rup_select('getRupValue') != '') {\n              seleccionado = $.grep(data, function (v) {\n                return v.id == $('#' + settings.id).rup_select('getRupValue');\n              });\n            } // Si es el mismo, no cambia porque esta abirendo\n\n\n            var mySelect = $('#' + settings.id).data('select2');\n\n            if (seleccionado !== undefined && seleccionado.length == 1 && $('#' + settings.id).rup_select('getRupValue') != seleccionado[0].id) {\n              if (settings.multiple) {\n                // Revisar varios selects\n                $('#' + settings.id).rup_select('setRupValue', [seleccionado[0].id]);\n              } else {\n                $('#' + settings.id).rup_select('setRupValue', seleccionado[0].id);\n              }\n\n              $.each(positions, function (index, valor) {\n                var $option = mySelect.$results.find('li')[valor];\n\n                if ($option != undefined) {\n                  $($option).attr('aria-selected', 'true');\n                }\n              });\n            } else {\n              if (settings.autocomplete) {\n                var valorInput = mySelect.selection.$selection.find('input').val();\n                $('#' + settings.id).rup_select('setRupValue', settings.blank);\n                mySelect.selection.$selection.find('input').val(valorInput);\n                mySelect.selection.$selection.find('input').focus();\n              } else {\n                $('#' + settings.id).rup_select('setRupValue', settings.blank);\n              }\n            }\n\n            if (settings.onLoadSuccess !== null && settings.onLoadSuccess !== undefined) {\n              jQuery(settings.onLoadSuccess($('#' + settings.id)));\n            }\n\n            $('#' + settings.id).data('settings', settings);\n            $('#' + settings.id).triggerHandler('selectAjaxSuccess', [data]);\n\n            if (settings.firstLoad) {\n              if (settings.autocomplete && settings.selected == undefined && settings.defaultValue != undefined && data != undefined && ($('#' + settings.id).rup_select('getRupValue') == '' || $('#' + settings.id).rup_select('getRupValue') == settings.blank)) {\n                //setear el valor para el defaultValue\n                var datos2 = $.grep(data, function (v) {\n                  return v.text.toUpperCase() === settings.defaultValue.toUpperCase();\n                });\n\n                if (datos2[0] != undefined) {\n                  $('#' + settings.id).rup_select('setRupValue', datos2[0].id);\n                }\n              }\n\n              settings.firstLoad = false;\n              settings.selected = '';\n            }\n          });\n          $request.fail(failure);\n        } else {\n          // cerrar\n          $('#' + settings.id).select2('close');\n\n          if (settings.parent) {\n            if (typeof settings.parent === 'string') {\n              $('#' + settings.parent).rup_select(\"enable\");\n            } else {\n              $.each(settings.parent, function (ind, elem) {\n                $('#' + elem).rup_select(\"enable\");\n              });\n            }\n          }\n        }\n\n        return $request;\n      };\n\n      if (settings.ajax !== undefined) {\n        if (settings.data !== undefined) {\n          // PAra añadir más parametros de\n          // busqueda\n          settings.ajax.data = settings.data;\n        }\n\n        if (settings.autocomplete) {\n          //busqueda accentFolding\n          var term = '';\n          var mySelect = $('#' + settings.id).data('select2');\n\n          if ($('input.select2-search__field') != undefined && $('input.select2-search__field').val() != undefined) {\n            term = $('input.select2-search__field').val();\n          }\n\n          if (settings.contains == undefined) {\n            settings.contains = true;\n          }\n\n          term = term.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n          settings.ajax.data = $.extend({\n            q: term,\n            c: settings.contains\n          }, settings.extraParams);\n        }\n\n        if (settings.sourceParam) {\n          // modifica el header para parsear\n          // la response\n          settings.ajax.headers = {\n            'RUP': $.toJSON(settings.sourceParam)\n          };\n        }\n\n        if (settings.processResults) {\n          // modifica los results\n          settings.ajax.processResults = settings.processResults;\n        }\n      }\n\n      if (settings.multiple) {\n        $('#' + settings.id).select2MultiCheckboxes(settings);\n      } else {\n        if (settings.placeholder == undefined || settings.placeholder == '') {\n          // si es vació se asigna el label\n          settings.placeholder = rupSelect._getBlankLabel(settings.id);\n        }\n\n        if (settings.autocomplete) {\n          $('#' + settings.id).select2MultiCheckboxes(settings);\n        } else {\n          $('#' + settings.id).select2(settings);\n        }\n      }\n\n      if (settings.firstLoad) {\n        // ejecutar los datos\n        var $el = $('#' + settings.id);\n\n        var _mySelect = $el.data('select2');\n\n        var $search = _mySelect.dropdown.$search || _mySelect.selection.$search;\n\n        if (settings.autocomplete && settings.defaultValue != undefined) {\n          _mySelect.$container.find('input').val(settings.defaultValue);\n        }\n\n        if ($search != undefined) {\n          $search.trigger('keyup');\n          $el.select2('close');\n        } else {\n          _mySelect.selection.trigger('toggle');\n\n          $el.select2('close');\n        }\n      }\n    },\n\n    /**\r\n    * Método de inicialización del componente.\r\n    * \r\n    * @function _textIcon\r\n    * @private\r\n    * @param {object}\r\n    *            data - Dato que llega, por cada registro.\r\n    */\n    _textIcon: function _textIcon(data) {\n      var stylePosition = 'M'; // B - Before , M - middle , A - After\n      // adjust for custom placeholder values, restaurar\n\n      if (data.stylePosition === undefined) {\n        // usar la de defecto\n        data.stylePosition = stylePosition;\n      }\n\n      var _span = $('<span/>');\n\n      var icon = $('<i class=\"mdi mdi-' + data.style + '\"></i>');\n\n      if (data.imgStyle) {\n        // en lugar d mdi,clase icon.\n        _span.addClass(data.style);\n\n        icon = $('<span class=\"ui-selectmenu-item-icon ui-icon \"></span>');\n\n        if (data.stylePosition.toUpperCase() === 'M') {\n          data.stylePosition = 'B'; // en caso de ser span, no\n          // admite texto en medio\n        }\n      }\n\n      if (data.stylePosition.toUpperCase() === 'M') {\n        icon.prepend(data.text);\n      } else if (data.stylePosition.toUpperCase() === 'B') {\n        _span.prepend(data.text);\n      }\n\n      _span.prepend(icon);\n\n      if (data.stylePosition.toUpperCase() === 'A') {\n        _span.prepend(data.text);\n      }\n\n      return _span;\n    },\n\n    /**\r\n    * Método de inicialización del componente.\r\n    * \r\n    * @function _createOption\r\n    * @private\r\n    * @param {object}\r\n    *            settings - Objeto de propiedades de configuración con el\r\n    *            que se ha inicializado el componente.\r\n    * @param {object}\r\n    *            data - Dato que llega, por cada registro.\r\n    */\n    _createOption: function _createOption(settings, data) {\n      var newOption = new Option(data.text, data.id, false, false);\n\n      if (data.style != null) {\n        newOption.setAttribute('style', data.style);\n        newOption.setAttribute('imgStyle', data.imgStyle);\n      }\n\n      $('#' + settings.id).append(newOption);\n    },\n\n    /**\r\n     * Gestiona los parámetros a añadir en la URL para que Hdiv permita la llamada.\r\n     *\r\n     * @function _generateUrl\r\n     * @since UDA 5.2.0\r\n     * @private\r\n     * @param {object} settings - Configuración del componente.\r\n     * @param {string} [data] - Valores de búsqueda cuando tiene autocompletado e identificador de los padres en caso de ser enlazados.\r\n     */\n    _generateUrl: function _generateUrl(settings, data) {\n      var _settings$inlineEdit3, _settings$inlineEdit4;\n\n      var $form;\n\n      if (settings.$forceForm) {\n        $form = settings.$forceForm;\n      } else {\n        var _settings$inlineEdit, _settings$inlineEdit2;\n\n        $form = (_settings$inlineEdit = settings.inlineEdit) !== null && _settings$inlineEdit !== void 0 && _settings$inlineEdit.$auxForm ? (_settings$inlineEdit2 = settings.inlineEdit) === null || _settings$inlineEdit2 === void 0 ? void 0 : _settings$inlineEdit2.$auxForm : $('#' + settings.id).closest('form');\n      }\n\n      var name = (_settings$inlineEdit3 = settings.inlineEdit) !== null && _settings$inlineEdit3 !== void 0 && _settings$inlineEdit3.auxSiblingFieldName ? (_settings$inlineEdit4 = settings.inlineEdit) === null || _settings$inlineEdit4 === void 0 ? void 0 : _settings$inlineEdit4.auxSiblingFieldName : settings.name;\n\n      if ($form.length === 1) {\n        var url = settings.url + (settings.url.includes('?') ? '&' : '?') + '_MODIFY_HDIV_STATE_=' + $.fn.getHDIV_STATE(undefined, $form);\n\n        if (data) {\n          // Escapa los caracteres '#' para evitar problemas en la petición.\n          url += \"&\" + data.replaceAll('#', '%23');\n        }\n\n        return url + '&MODIFY_FORM_FIELD_NAME=' + name;\n      } else {\n        return settings.url;\n      }\n    },\n\n    /**\r\n    * Método de inicialización del componente.\r\n    * \r\n    * @function _init\r\n    * @private\r\n    * @param {object}\r\n    *            args - Parámetros de inicialización del componente.\r\n    */\n    _init: function _init(args) {\n      var _this2 = this;\n\n      _this = this;\n      global.initRupI18nPromise.then(function () {\n        if (args.length > 1) {\n          $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(_this2).attr('id'));\n        } else {\n          // Se recogen y cruzan las paremetrizaciones del objeto\n          var settings = $.extend({}, $.fn.rup_select.defaults, args[0]),\n              html,\n              loadAsLocal = false,\n              isValidableElem = false,\n              attrs; // Se recoge el tabindex indicado en el elemento\n\n          settings.tabindex = $(_this2).attr('tabindex'); // Sobreescribir literales por defecto para\n          // multiselect:REVISAR\n          // $.extend($.ech.multiselect.prototype.options,\n          // $.rup.i18n.base.rup_select.multiselect);\n          // Se carga el identificador del padre del patron\n\n          settings.id = $.rup_utils.escapeId($(_this2).attr('id'));\n\n          if ($(_this2).attr('name') === undefined) {\n            $(_this2).attr('name', settings.id);\n          }\n\n          settings.name = $(_this2).attr('name');\n          $('#' + settings.id).attr('ruptype', 'select'); // Si no se recibe identificador para el acceso a literales\n          // se usa el ID del objeto\n\n          if (!settings.i18nId) {\n            settings.i18nId = settings.id;\n          } // Guardar valor del INPUT\n\n\n          settings.inputValue = $('#' + settings.id).val() === null ? $('#' + settings.id).prop('value') : $('#' + settings.id).val();\n          attrs = $(_this2).prop('attributes'); // Revisar apra el select\n\n          if (settings.firstLoad === null && $(_this2).is('select') && settings.loadFromSelect) {\n            loadAsLocal = true;\n          } // Asociar evento CHANGE para propagar cambios a los hijos\n\n\n          $('#' + settings.id).on('change', function () {}); // tratar placeHolder\n\n          if (settings.placeholder !== undefined && typeof settings.placeholder == 'string') {\n            if (!settings.allowClear) {\n              settings.templateSelection = function (data, span) {\n                if (data.id === settings.blank) {\n                  // adjust\n                  // for\n                  // custom\n                  // placeholder\n                  // values,\n                  // restaurar\n                  return $('<span class=\"select2-selection__placeholder\">' + data.text + '</span>');\n                }\n\n                chargedStyles(data);\n\n                if (data.style != null && data.id !== settings.blank) {\n                  // adjust for custom placeholder values,\n                  // restaurar\n                  return _this._textIcon(data);\n                }\n\n                return data.text;\n              };\n\n              if (settings.placeholder == '') {\n                // si es vació se\n                // asigna el label\n                settings.placeholder = _this2._getBlankLabel(settings.id);\n              }\n\n              if (settings.data !== undefined && !settings.multiple) {\n                // y si\n                // no\n                // es\n                // multiple\n                if (settings.parent == undefined) {\n                  // Si no tiene padre se mete en todos los\n                  // valores, sino solo al data,\n                  settings.data.unshift({\n                    id: settings.blank,\n                    text: settings.placeholder\n                  });\n                } else {\n                  $.each(settings.data, function (index, value) {\n                    value.unshift({\n                      id: settings.blank,\n                      text: settings.placeholder\n                    });\n                  });\n                }\n              }\n            } else if ($('#' + settings.id).find('option').length == 0) {\n              // revisar\n              // y\n              // crear\n              // option\n              // vacio.\n              $('#' + settings.id).append(new Option(\"\", \"\"));\n            }\n          } // Crear mi template, myTemplate\n\n\n          if (settings.myTemplate !== undefined) {\n            settings.templateSelection = settings.myTemplate;\n          }\n\n          if (settings.templateResult === undefined) {\n            if (settings.multiple && settings.udaSkill) {\n              // Si es\n              // multiple,\n              // los\n              // results\n              // cambian\n              // settings.templateSelection\n              settings.templateSelection = function (data, span) {\n                // Template de Uda\n                return data.text;\n              };\n            } else {\n              // si no es multiple\n              if (settings.templateSelection !== undefined) {\n                // mirar\n                // los\n                // iconos\n                settings.templateResult = function (data, span) {\n                  chargedStyles(data);\n\n                  if (data.id === settings.blank) {\n                    return $('<span class=\"select2-selection__placeholder\">' + data.text + '</span>');\n                  } else if (data.style != null && data.id !== settings.blank) {\n                    // adjust\n                    // for\n                    // custom\n                    // placeholder\n                    // values,\n                    // restaurar\n                    return _this._textIcon(data);\n                  }\n\n                  return data.text;\n                };\n              } else {\n                settings.templateResult = function (data, span) {\n                  chargedStyles(data);\n\n                  if (data.style != null && data.id !== settings.blank) {\n                    // adjust\n                    // for\n                    // custom\n                    // placeholder\n                    // values,\n                    // restaurar\n                    return _this._textIcon(data);\n                  }\n\n                  return data.text;\n                };\n\n                settings.templateSelection = settings.templateResult;\n              }\n            }\n          } // Borrar referencia\n          // delete html;\n          // Ocultar posibles elementos de fechas/horas\n\n\n          $('#' + settings.id).next('a').click(function () {\n            $('#ui-datepicker-div').hide();\n          }); // Se audita el componente\n\n          $.rup.auditComponent('rup_select', 'init'); // Añade clase Personalizada\n\n          if (settings.customClasses) {\n            $.each(settings.customClasses, function (index, value) {\n              $('#' + settings.id + '-button' + ', #' + settings.id + '-menu').addClass(value);\n              $('[for=' + settings.id + ']').addClass(value);\n            });\n          } // Si no se recibe identificador para el acceso a literales\n          // se usa el ID del objeto\n\n\n          if (!settings.i18nId) {\n            settings.i18nId = settings.id;\n          } // ORDEN\n\n\n          var ordenFunction = function ordenFunction(data) {\n            if (typeof data === 'string') {\n              var dates = data.sort(function (a, b) {\n                return a.text.localeCompare(b.text);\n              });\n              var mySettings = $('#' + settings.id).data('settings');\n              mySettings.options = dates;\n              $('#' + settings.id).data('settings', mySettings);\n              return dates;\n            }\n\n            return data;\n          };\n\n          if (settings.data || settings.dataGroups) {\n            // local y\n            // groups\n            if (settings.sortered === true) {\n              // PAra añadir\n              // ordenación, en local\n              // hay que marcarlo\n              settings.sorter = ordenFunction;\n            } else if (settings.sortered !== false) {\n              settings.sorter = settings.sortered;\n            }\n\n            if (settings.dataGroups === undefined) {\n              // LOcal\n              settings.data = _this2._parseLOCAL(settings.data, settings.i18nId, settings.parent);\n            } else {\n              // grupos\n              var optionsGroups = [];\n\n              for (var i = 0; i < settings.dataGroups.length; i = i + 1) {\n                if (_typeof(settings.dataGroups[i]) === 'object') {\n                  settings.dataGroups[i].children = _this2._parseLOCAL(settings.dataGroups[i].children, settings.i18nId, settings.parent);\n\n                  for (var j = 0; j < settings.dataGroups[i].children.length; j = j + 1) {\n                    optionsGroups.push(settings.dataGroups[i].children[j]);\n                  }\n                }\n              }\n\n              settings.optionsGroups = optionsGroups;\n              settings.data = settings.dataGroups;\n            }\n          } else if (!settings.ajax && settings.url != null) {\n            // remoto\n            if (settings.sortered === undefined) {\n              // PAra añadir\n              // ordenación, en\n              // remoto siempre se\n              // ordena por\n              // defecto.\n              settings.sorter = ordenFunction;\n            } else if (settings.sortered !== false) {\n              settings.sorter = settings.sortered;\n            }\n\n            _this2._loadRemote(settings, true);\n          } else {\n            // por si viene cargado de un select\n            settings.data = true;\n\n            if (settings.parent) {\n              //convertir el data, formato parent\t\n              settings.data = [];\n              $('#' + settings.id).find('option').each(function () {\n                var idPadre = $(this).data('idpadre');\n\n                if (idPadre != undefined) {\n                  //si no existe\n                  if (settings.data[idPadre] === undefined) {\n                    settings.data[idPadre] = [];\n\n                    if (settings.placeholder != undefined || settings.placeholder != '') {\n                      settings.data[idPadre].push({\n                        id: settings.blank,\n                        text: settings.placeholder\n                      });\n                    }\n                  }\n\n                  settings.data[idPadre].push({\n                    id: $(this).val(),\n                    text: $(this).text()\n                  });\n                }\n              });\n            }\n          } // Init eventos: El resto van en el propio subyacente\n          // Change\n\n\n          if (settings.change) {\n            if (!settings.clean) {\n              $('#' + settings.id).off('select2:clearing');\n              $('#' + settings.id).on('select2:clearing', function (e) {\n                settings.change(e);\n              });\n            }\n          } // clean\n\n\n          if (settings.clean) {\n            $('#' + settings.id).off('select2:clearing');\n            $('#' + settings.id).on('select2:clearing', function (e) {\n              settings.clean(e);\n            });\n          } // event select\n\n\n          $('#' + settings.id).off('select2:select');\n          $('#' + settings.id).on('select2:select', function (e) {\n            if (settings.autocomplete) {\n              //Change input\n              var mySelect2 = $('#' + settings.id).data('select2');\n              var data = $(this).select2('data')[0];\n              mySelect2.$selection.find('input').val(data.text);\n            }\n\n            if (settings.select) {\n              settings.select(e);\n            }\n\n            if (settings.change) {\n              settings.change(e);\n            }\n          });\n\n          if (settings.data) {\n            // local y groups\n            if (settings.parent) {\n              // si depende de otro selects.\n              // Si es uno meterlo como string - local\n              if (_typeof(settings.parent) == 'object' && settings.parent.length == 1) {\n                settings.parent = settings.parent[0];\n              }\n\n              if (settings.dataParents === undefined) {\n                // la\n                // primera\n                // vez carga\n                // los datos\n                // fijos.\n                settings.dataParents = settings.data;\n              }\n\n              var valorValue = _this._getParentsValues(settings, false, settings.multiValueToken);\n\n              if (valorValue != '') {\n                valoresParent = settings.dataParents[valorValue];\n\n                if (valoresParent == undefined && settings.dataParents[0] != undefined) {\n                  valoresParent = settings.dataParents[0][valorValue];\n                }\n\n                settings.data = valoresParent;\n\n                if (settings.data == undefined) {\n                  settings.data = [];\n                }\n              }\n            }\n\n            if (settings.multiple) {\n              $('#' + settings.id).select2MultiCheckboxes(settings);\n            } else {\n              if (settings.placeholder == undefined || settings.placeholder == '') {\n                // si es vació se asigna el label\n                settings.placeholder = _this._getBlankLabel(settings.id);\n              }\n\n              if (settings.autocomplete) {\n                //local y autocomplete\n                if (settings.matcher == undefined && settings.accentFolding == false) {\n                  settings.matcher = udaMatcher;\n                }\n\n                $('#' + settings.id).select2MultiCheckboxes(settings);\n\n                if (settings.defaultValue != undefined) {\n                  var mySelect2 = $('#' + settings.id).data('select2');\n                  mySelect2.$selection.find('input').val(settings.defaultValue);\n\n                  if (settings.selected == undefined && mySelect2.dataAdapter._dataToConvert != undefined && mySelect2.dataAdapter._dataToConvert.length > 0) {\n                    var data = $.grep(mySelect2.dataAdapter._dataToConvert, function (v) {\n                      return v.text.toUpperCase() === settings.defaultValue.toUpperCase();\n                    });\n\n                    if (data[0] != undefined) {\n                      settings.selected = data[0].id;\n                    }\n                  }\n                }\n              } else {\n                $('#' + settings.id).select2(settings);\n              } //Propiedad para deselecionar una mismo en simple.\n\n\n              if (settings.deleteOnDeselect) {\n                var _mySelect2 = $('#' + settings.id).data('select2');\n\n                _mySelect2.on('close', function (e) {\n                  if (Object.keys(e).length === 1) {\n                    _mySelect2.$selection.find('input').val('');\n\n                    $('#' + settings.id).val(null).trigger('change');\n\n                    if (!settings.closeOnSelect) {\n                      $('#' + settings.id).select2('open');\n                    }\n                  }\n                });\n              }\n            }\n\n            if (settings.selected) {\n              $('#' + settings.id).val(settings.selected).trigger('change');\n            } // cargar los options\n\n\n            settings.options = settings.data;\n          } else {\n            //Remotos\n            //Propiedad para deselecionar una mismo en simple.\n            if (settings.deleteOnDeselect) {\n              var remotoSelect = $('#' + settings.id).data('select2');\n              remotoSelect.on('close', function (e) {\n                if (Object.keys(e).length === 1) {\n                  remotoSelect.$selection.find('input').val('');\n                  $('#' + settings.id).val(null).trigger('change');\n\n                  if (!settings.closeOnSelect) {\n                    $('#' + settings.id).select2('open');\n                  }\n                }\n              });\n            }\n          }\n\n          if (settings.parent) {\n            // si dependen de otros selects\n            // Mirar si es simple o no\n            var parent = [];\n\n            if (typeof settings.parent == 'string') {\n              parent.push(settings.parent);\n            } else {\n              // Si es uno meterlo como string -remoto\n              if (settings.parent.length == 1) {\n                settings.parent = settings.parent[0];\n                parent.push(settings.parent);\n              } else {\n                parent = settings.parent;\n              }\n            } // Bucle para eventos Padres\n\n\n            $.each(parent, function (idx, eventoPadre) {\n              $('#' + eventoPadre).off('change.parent' + settings.id);\n              $('#' + eventoPadre).on('change.parent' + settings.id, function () {\n                // Cambios\n                // para\n                // los\n                // hijos,onchange\n                // del\n                // padre\n                // Si soy local\n                if (settings.data !== undefined) {\n                  if (_typeof(settings.parent) == 'object') {\n                    // Si\n                    // tiene\n                    // más\n                    // de\n                    // un\n                    // padre\n                    var clave = '';\n                    var ClaveNoCifrar = '';\n\n                    if (settings.multiValueToken == undefined) {\n                      settings.multiValueToken = '';\n                    }\n\n                    $.each(settings.parent, function (ind, elem) {\n                      var val = $('#' + elem).rup_select('getRupValue');\n                      clave = clave + val + settings.multiValueToken;\n                      var dataSelected = $('#' + elem).rup_select(\"getDataSelected\");\n\n                      if (dataSelected !== undefined) {\n                        val = dataSelected.nid || dataSelected.id;\n                        ClaveNoCifrar = ClaveNoCifrar + val + settings.multiValueToken;\n                      }\n                    });\n                    clave = clave.substring(0, clave.length - settings.multiValueToken.length);\n                    ClaveNoCifrar = ClaveNoCifrar.substring(0, ClaveNoCifrar.length - settings.multiValueToken.length);\n                    var datosParents = settings.dataParents[0] || settings.dataParents;\n\n                    if (datosParents[clave] != undefined || datosParents[ClaveNoCifrar] != undefined) {\n                      // Datos\n                      // Cargados\n                      var valores = datosParents[clave] || datosParents[ClaveNoCifrar];\n                      settings.data = datosParents;\n                      $('#' + settings.id).rup_select(\"setSource\", valores);\n                    }\n                  } else {\n                    // si tiene un solo padre\n                    var val = $('#' + settings.parent).rup_select('getRupValue');\n\n                    if (val != settings.blank && val != '') {\n                      $('#' + settings.id).rup_select(\"enable\");\n                      var _valores = settings.dataParents[val];\n\n                      if (_valores == undefined && $('#' + settings.parent).rup_select(\"getDataSelected\") !== undefined) {\n                        var nid = $('#' + settings.parent).rup_select(\"getDataSelected\").nid;\n                        _valores = settings.dataParents[nid]; //si vine cifrado de un remoto.\n                      }\n\n                      settings.data = settings.dataParents;\n\n                      if (_valores == undefined) {\n                        // Si no\n                        // hay\n                        // valor,\n                        // se\n                        // inicializa\n                        _valores = [];\n                      }\n\n                      $('#' + settings.id).rup_select(\"setSource\", _valores);\n                    } else {\n                      //deshabilitamos el hijo\n                      $('#' + settings.id).rup_select(\"disable\");\n                    }\n                  } // Aseguramos el valor limpio al cambiar el\n                  // padre\n\n\n                  $('#' + settings.id).rup_select(\"setRupValue\", settings.blank);\n                } else {\n                  // si soy Remoto\n                  var datosParent = _this._getParentsValues(settings, true); // Sola llamar si el padre tiene valor.\n\n\n                  if (datosParent != '') {\n                    $('#' + settings.id).rup_select(\"disable\"); // ejecutar los datos\n\n                    var $el = $('#' + settings.id);\n                    var $search = $el.data('select2').dropdown.$search || $el.data('select2').selection.$search;\n\n                    if (settings.autocomplete) {\n                      $el.data('select2').$container.find('input').val('');\n                    }\n\n                    if ($search != undefined) {\n                      $search.trigger('keyup');\n                      $el.select2('close');\n                    }\n\n                    if ($(\"#\" + settings.id).val() != null && $(\"#\" + settings.id).val().trim() != '') {\n                      $(\"#\" + settings.id).val(null).trigger('change');\n                    }\n\n                    setTimeout($('#' + settings.id).rup_select(\"enable\"), 200);\n                  } else if ($(\"#\" + settings.id).val() != null && $(\"#\" + settings.id).val().trim() != '') {\n                    // Se llama al cambio del trigger.\n                    $(\"#\" + settings.id).val(null).trigger('change');\n                    $('#' + settings.id).rup_select(\"disable\");\n                  }\n                }\n              });\n            }); // Fin funcion evento padre\n          }\n\n          $('#' + settings.id).data('settings', settings); //Si es remoto, el último evento es: selectAjaxSuccess\n\n          $('#' + settings.id).triggerHandler('selectFinish', settings);\n        }\n      })[\"catch\"](function (error) {\n        console.error('Error al inicializar el componente:\\n', error);\n      });\n    }\n  }); // ******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  // ******************************************************\n\n  /**\r\n  * Función a ejecutar en caso de producirse un error a la hora de obtener\r\n  * los elementos a mostrar.\r\n  * \r\n  * @callback jQuery.rup_select~onLoadError\r\n  * @param {Object}\r\n  *            xhr - Objeto XHR que contiene la respuesta de la petición\r\n  *            realizada.\r\n  * @param {string}\r\n  *            textStatus - Texto que identifica el error producido.\r\n  * @param {Object}\r\n  *            errorThrown - Objeto error que contiene las propiedades del\r\n  *            error devuelto en la petición.\r\n  */\n\n  /**\r\n  * Función a ejecutar en caso de producirse un error a la hora de obtener\r\n  * los elementos a mostrar.\r\n  * \r\n  * @callback jQuery.rup_select~onLoadSuccess\r\n  * @param {jQuery}\r\n  *            self - Referencia al objeto jQuery del propio select.\r\n  */\n\n  /**\r\n  * @description Opciones por defecto de configuración del componente.\r\n  * \r\n  * @name defaults\r\n  * \r\n  * @property {jQuery.rup_select~onLoadError} [onLoadError] - Función de\r\n  *           callback a ejecutar en caso de que se produzca un error en la\r\n  *           petición de obtención de la lista de elementos a mostrar.\r\n  * @property {string} [width='100%'] - Determina el tamaño del componente \r\n  *           tanto en píxeles como en porcentaje. Su valor por defecto es '100%'.\r\n  * @property {string} [blank=null] - Se utiliza para declarar un valor\r\n  *           independiente de la lógica de negocio y en ocasiones se\r\n  *           representa como \"Seleccione un elemento\". Permite establecer un\r\n  *           mensaje independiente por cada select haciendo uso de\r\n  *           $.rup.i18n.app.id._blank (sustituyendo id por el propio de cada\r\n  *           select) o uno genérico por aplicación haciendo uso de\r\n  *           $.rup.i18n.app.rup_select.blank. En caso de no definir ninguno,\r\n  *           se usará el genérico de UDA,\r\n  *           $.rup.i18n.base.rup_select.blankNotDefined.\r\n  * @property {string} [token=\"|\"] - Define el separador a utilizar cuando se\r\n  *           muestra el valor asociado al select concatenado al literal.\r\n  * @property {string} [multiValueToken=\"##\"] - Define el separador a\r\n  *           utilizar en selects enlazados locales.\r\n  * @property {boolean} [ordered=true] - Indica si el select debe ordenarse.\r\n  * @property {boolean} [orderedByValue=false] - Indica si el la ordenación\r\n  *           del seelct debe realizarse por el valor de los elementos en\r\n  *           lugar de por el texto.\r\n  * @property {jQuery.rup_select~onLoadSuccess} [onLoadSuccess=null] - Función\r\n  *           de callback a ejecutar en el caso de que la petición de carga\r\n  *           de datos se haya producido correctamente.\r\n  * @property {boolean} [loadFromSelect=false] - Determina si se debe de\r\n  *           utilizar los elementos option del elemento html sobre el que se\r\n  *           inicializa el componente para inicializar los datos del\r\n  *           elemento.\r\n  * @property {boolean} [multiOptgroupIconText=false] - Indica si se desea\r\n  *           que en la selección múltiple con grupos, el nombre del grupo\r\n  *           tenga descripción en los iconos para seleccionar/deseleccionar\r\n  *           los elementos del grupo.\r\n  * @property {boolean} [submitAsString=false] - Indica si el envío de los\r\n  *           elementos seleccionados en la selección múltiple se realiza\r\n  *           como un literal separados por coma.\r\n  * @property {boolean} [submitAsJSON=false] - Indica si el envío de los\r\n  *           elementos seleccionados en la selección múltiple se realiza\r\n  *           como un array JSON donde el nombre del mapa será el nombre del\r\n  *           select. En el caso de que el nombre contenga notación dot se\r\n  *           tomará el último literal. Ej: [{id:1}, {id:2}, …].\r\n  * @property {boolean} [readAsString=false] - Determina si la asignación de\r\n  *           un valor inicial se va a realizar a partir de un string con los\r\n  *           ids de los elementos separados por comas en vez de un array de\r\n  *           json.\r\n  * @property {boolean} [rowStriping=false] - Indica si se debe aplicar un\r\n  *           estilo diferente a las filas pares e impares para poder\r\n  *           distinguirlas mediante un color diferente.\r\n  * @property {number} [typeAhead=false] - Especifica en milisegundos el\r\n  *           tiempo de espera que toma el componente antes de procesar los\r\n  *           eventos de escritura realizados por el usuario.\r\n  * @property {number} [legacyWrapMode=false] - Determina si se emplea el\r\n  *           método obsoleto a la hora de empaquetar en objetos json los\r\n  *           elementos seleccionados. Su propósito es mantener la\r\n  *           retrocompatibilidad.\r\n  */\n\n  $.fn.rup_select.defaults = {\n    onLoadError: null,\n    width: '100%',\n    customClasses: ['select-material'],\n    blank: \"-1\",\n    minimumResultsForSearch: Infinity,\n    submitAsJSON: false,\n    dataType: 'json',\n    cache: true,\n    multiple: false,\n    defaultValueAutocompleteNotLoaded: false,\n    multiValueToken: '##'\n  };\n});\n\nfunction chargedStyles(data) {\n  if (data.style === undefined && data.element !== undefined) {\n    // mirar estilo\n    data.style = data.element.getAttribute('style');\n    data.imgStyle = data.element.getAttribute('imgStyle');\n\n    if (data.style == null || data.style == 'undefined') {\n      data.style = undefined;\n    }\n\n    if (data.style == null || data.imgStyle == 'undefined') {\n      data.imgStyle = undefined;\n    }\n  }\n}\n\nfunction udaMatcher(params, data) {\n  // Always return the object if there is nothing to compare\n  if ($.trim(params.term) === '') {\n    return data;\n  } // Do a recursive check for options with children\n\n\n  if (data.children && data.children.length > 0) {\n    // Clone the data object if there are children\n    // This is required as we modify the object to remove any non-matches\n    var match = $.extend(true, {}, data); // Check each child of the option\n\n    for (var c = data.children.length - 1; c >= 0; c--) {\n      var child = data.children[c];\n      var matches = matcher(params, child); // If there wasn't a match, remove the object in the array\n\n      if (matches == null) {\n        match.children.splice(c, 1);\n      }\n    } // If any children matched, return the new object\n\n\n    if (match.children.length > 0) {\n      return match;\n    } // If there were no matching children, check just the plain object\n\n\n    return matcher(params, match);\n  }\n\n  var original = data.text.toUpperCase();\n  var term = params.term.toUpperCase(); // Check if the text contains the term\n\n  if (original.indexOf(term) > -1) {\n    return data;\n  } // If it doesn't contain the term, don't return anything\n\n\n  return null;\n}\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.select.js?");

/***/ }),

/***/ "./src/rup.slider.js":
/*!***************************!*\
  !*** ./src/rup.slider.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Tiene como objetivo permitir al usuario introducir datos mediante un control que se desplaza dentro de un rango de valores.\r\n *\r\n * @summary Componente RUP Slider.\r\n * @module rup_slider\r\n * @see El componente está basado en el plugin {@link https://jqueryui.com/slider/|jQuery UI Slider}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://api.jqueryui.com/slider/|aquí}.\r\n * @example\r\n * var properties = {\r\n *\t\tmin: 0,\r\n *\t\tmax: 500\r\n *\t};\r\n * $(\"#idSlider\").rup_slider(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_slider = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_slider', rup_slider)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_slider('extend', {\n    /**\r\n     * Método utilizado para obtener el valor del componente. Este método es el utilizado por el resto de componentes RUP para estandarizar la obtención del valor del componente Slider.\r\n     *\r\n     * @name getRupValue\r\n     * @function\r\n     * @return {number} - Devuelve el valor actual del componente.\r\n     * @example\r\n     * $(\"#idSlider\").rup_slider(\"getRupValue\");\r\n     */\n    getRupValue: function getRupValue() {\n      var $self = this,\n          value;\n      value = $self.slider('values');\n\n      if (value.length === 0) {\n        return $self.slider('value');\n      } else {\n        return value;\n      }\n    },\n\n    /**\r\n     * Método utilizado para asignar el valor al componente. Este método es el utilizado por el resto de componentes RUP para estandarizar la asignación del valor al componente Slider.\r\n     *\r\n     * @name setRupValue\r\n     * @function\r\n     * @param {number} param - Valor que se va a asignar al componente.\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * // Un único desplazador\r\n     * $(\"#idSlider\").rup_slider(\"setRupValue\", 40);\r\n     * // Varios desplazadores\r\n     * $(\"#idSlider\").rup_slider(\"setRupValue\", [10,60]);\r\n     */\n    setRupValue: function setRupValue(value) {\n      var $self = this;\n\n      if (Array.isArray(value)) {\n        $self.slider('values', value);\n      } else {\n        $self.slider('value', value);\n      }\n\n      return $self;\n    },\n\n    /**\r\n     * Elimina las modificaciones realizadas sobre elemento del DOM.\r\n     *\r\n     * @name destroy\r\n     * @function\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * // Elimina el control slider\r\n     * jQuery(\"#idSlider\").rup_slider(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      var $self = this;\n      $self.slider('destroy');\n      $self.removeClass('rup-slider');\n      $self.removeAttr('ruptype');\n      return $self;\n    },\n\n    /**\r\n     * Habilita el control.\r\n     *\r\n     * @name enable\r\n     * @function\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idSlider\").rup_slider(\"enable\");\r\n     */\n    enable: function enable() {\n      var $self = this;\n      $self.slider('enable');\n      $self.removeClass('rup-slider-disabled');\n      return $self;\n    },\n\n    /**\r\n     * Deshabilita el control.\r\n     *\r\n     * @name disable\r\n     * @function\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idSlider\").rup_slider(\"disable\");\r\n     */\n    disable: function disable() {\n      var $self = this;\n      $self.slider('disable');\n      $self.addClass('rup-slider-disabled');\n      return $self;\n    },\n\n    /**\r\n     * Devuelve la instancia de jQueryUI asociada al control. Si no ha sido inicializada retorna undefined.\r\n     *\r\n     * @name instance\r\n     * @function\r\n     * @return {object} - Instancia de jQueryUI asociada.\r\n     * @example\r\n     * jQuery(\"#idSlider\").rup_slider(\"instance\");\r\n     */\n    instance: function instance() {\n      return this.slider('instance');\n    },\n\n    /**\r\n     * Devuelve un objeto clave/valor que contiene las propiedades de configuración del control.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @return {object} - Objeto clave/valor con las propiedades de configuración.\r\n     * @example\r\n     * jQuery(\"#idSlider\").rup_slider(\"option\");\r\n     */\n\n    /**\r\n     * Devuelve el valor asociado a la propiedad identificada por parámetro.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @param {string} paramName - Nombre de la propiedad.\r\n     * @return {object} - Valor asociado a la propiedad.\r\n     * @example\r\n     * jQuery(\"#idSlider\").rup_slider(\"option\", \"min\");\r\n     */\n\n    /**\r\n     * Asigna un valor a la propiedad indentificada por parámetro.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @param {string} paramName - Nombre de la propiedad.\r\n     * @param {object} paramValue - Valor de la propiedad.\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idSlider\").rup_slider(\"option\", \"min\", 50);\r\n     */\n\n    /**\r\n     * Permite asignar el valor de una o varias propiedades de configuración.\r\n     *\r\n     * @name option\r\n     * @function\r\n     * @param {object} param - Objeto clave/valor con las propiedades de configuración y sus valores.\r\n     * @return {jQuery} - Retorna la referencia al elemento.\r\n     * @example\r\n     * jQuery(\"#idSlider\").rup_slider(\"option\", {min:10, max:60});\r\n     */\n    option: function option() {\n      if (arguments.length === 0) {\n        return this.slider('option');\n      } else if (arguments.length === 1) {\n        return this.slider('option', arguments[0]);\n      } else {\n        return this.slider('option', arguments[0], arguments[1]);\n      }\n    },\n    value: function value(args) {\n      return this.slider('value', args);\n    },\n    values: function values(args) {\n      return this.slider('values', args);\n    },\n    widget: function widget() {\n      return this.slider('widget');\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_slider('extend', {\n    _bar: function _bar() {\n      return this;\n    }\n  }); //*******************************\n  // MÉTODO DE INICIALIZACION\n  //*******************************\n\n  $.fn.rup_slider('extend', {\n    _init: function _init(args) {\n      var $self = this,\n          settings = $.extend({}, $.fn.rup_slider.defaults, args[0]);\n      $self.addClass('rup-slider');\n      $self.attr('ruptype', 'slider');\n      $self.slider(settings); //Se audita el componente\n\n      $.rup.auditComponent('rup_slider', 'init'); // TODO : Invocación al plugin\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  $.fn.rup_slider.defaults = {\n    foobar: false\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup.slider.js?");

/***/ }),

/***/ "./src/rup.spinner.js":
/*!****************************!*\
  !*** ./src/rup.spinner.js ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2014 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_spinner = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_spinner', rup_spinner)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_spinner('extend', {\n    /**\r\n        * @description Método utilizado para obtener el valor del componente. Este método es el utilizado\r\n       \tpor el resto de componentes RUP para estandarizar la obtención del valor del Spinner.\r\n        *\r\n        * @function getRupValue\r\n        * @return {number} - Devuelve el valor actual del componente seleccionado por el usuario.\r\n        * @example\r\n        * $(\"#idSpinner\").rup_spinner(\"getRupValue\");\r\n        */\n    getRupValue: function getRupValue() {\n      return this.spinner('value');\n    },\n\n    /**\r\n     * @description Método utilizado para asignar el valor al componente. Este método es el utilizado por\r\n    el resto de componentes RUP para estandarizar la asignación del valor al Spinner.\r\n     *\r\n     * @function setRupValue\r\n     * @param {string | number} param - Valor que se va a asignar al componente.\r\n     * @example\r\n     * $(\"#idSpinner\").rup_spinner(\"setRupValue\", 5);\r\n     */\n    setRupValue: function setRupValue(value) {\n      var $self = this;\n      $self.spinner('value', value);\n      return $self;\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_spinner('extend', {\n    _bar: function _bar() {\n      return this;\n    }\n  }); //*******************************\n  // MÉTODO DE INICIALIZACION\n  //*******************************\n\n  $.fn.rup_spinner('extend', {\n    _init: function _init(args) {\n      var $self = this,\n          settings = $.extend({}, $.fn.rup_spinner.defaults, args[0]);\n      $self.addClass('rup_spinner');\n      $self.attr('ruptype', 'spinner');\n      $self.spinner(settings); //Se audita el componente\n\n      $.rup.auditComponent('rup_spinner', 'init');\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  $.fn.rup_spinner.defaults = {\n    foobar: false\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup.spinner.js?");

/***/ }),

/***/ "./src/rup.sticky.js":
/*!***************************!*\
  !*** ./src/rup.sticky.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n  * Encargado de aplicar la propiedad sticky a los componentes\r\n  *\r\n  * @summary \t\tComponente RUP Sticky\r\n  * @module\t\t\t\"rup.sticky\"\r\n  * @version     1.0.0\r\n  * @license\r\n  * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n  * Solo podrá usarse esta obra si se respeta la Licencia.\r\n  * Puede obtenerse una copia de la Licencia en\r\n  *\r\n  *      http://ec.europa.eu/idabc/eupl.html\r\n  *\r\n  * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n  * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n  * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n  * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n  * que establece la Licencia.\r\n  * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n  *\r\n  */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_sticky = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_sticky', rup_sticky)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_sticky('extend', {\n    /**\r\n    * Gestiona las inicializaciones de componentes en modo 'sticky'\r\n    *\r\n    * @name stickyManager\r\n      * @function\r\n      * @since UDA 3.3.0 // Sticky 1.0.0\r\n        *\r\n    */\n    stickyManager: function stickyManager() {\n      var self = this;\n      var settings = $.extend({}, $.fn.rup_sticky.defaults);\n\n      if (settings.sticky_nav) {\n        self._navbarSticky();\n      }\n\n      if (settings.sticky_wizard) {\n        self._wizardSticky();\n      }\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_sticky('extend', {\n    /**\r\n        * Aplica el modo 'sticky' al navbar\r\n        *\r\n    * @name _navbarSticky\r\n      * @function\r\n      * @since UDA 3.3.0 // Sticky 1.0.0\r\n        *\r\n        */\n    _navbarSticky: function _navbarSticky() {\n      if ($('.rup-navbar')[0]) {\n        var headerOuterHeight = $('header').length != 0 ? $('header').outerHeight(true) : 0,\n            parent,\n            shadowElem = $('<div>', {\n          id: 'shadow-elem-sticky'\n        });\n        window.scrollHeight = 0;\n        $(window).scroll(function () {\n          headerOuterHeight = $('header').outerHeight();\n          parent = $('.rup-navbar.navbar').parent();\n          parent.append(shadowElem);\n\n          if ($(this).scrollTop() <= headerOuterHeight) {\n            if ($('.rup-navbar.navbar').hasClass('rup-navbar-sticky')) {\n              $('.rup-navbar.navbar').removeClass('rup-navbar-sticky');\n              $('#shadow-elem-sticky').css({\n                'padding-top': 0\n              });\n            }\n          } else if ($(this).scrollTop() > headerOuterHeight) {\n            $('#shadow-elem-sticky').css({\n              'padding-top': $('.rup-navbar.navbar')[0].offsetHeight\n            });\n            $('.rup-navbar.navbar').addClass('rup-navbar-sticky');\n          }\n        });\n      }\n    },\n\n    /**\r\n        * Aplica el modo 'sticky' al menu del wizard\r\n        *\r\n    * @name _wizardSticky\r\n      * @function\r\n      * @since UDA 3.3.0 // Sticky 1.0.0\r\n        *\r\n        */\n    _wizardSticky: function _wizardSticky() {\n      var headerOuterHeight = $('header').outerHeight();\n      $(window).scroll(function () {\n        headerOuterHeight = $('header').outerHeight();\n\n        if ($(this).scrollTop() < headerOuterHeight * 2) {\n          if ($('.rup-wizard_stepsDescContainer').hasClass('rup-wizard_stepsDescContainer-sticky')) {\n            $('.rup-wizard_stepsDescContainer').removeClass('rup-wizard_stepsDescContainer-sticky');\n          }\n        } else if ($(this).scrollTop() >= headerOuterHeight * 2) {\n          $('.rup-wizard_stepsDescContainer').addClass('rup-wizard_stepsDescContainer-sticky');\n        }\n      });\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  $.fn.rup_sticky.defaults = {\n    sticky_nav: true,\n    sticky_wizard: true\n  }; // Inicializamos la gestión de las propiedades 'sticky'\n\n  $.fn.rup_sticky('stickyManager');\n});\n\n//# sourceURL=webpack://rup/./src/rup.sticky.js?");

/***/ }),

/***/ "./src/rup.tabs.js":
/*!*************************!*\
  !*** ./src/rup.tabs.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function($) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permiten dar acceso de forma compacta a grupos de contenidos mutuamente excluyentes pudiendo ser integradas en zonas muy reducidas de la interfaz.\r\n *\r\n * @summary Componente RUP Tabs.\r\n * @module rup_tabs\r\n * @see El componente está basado en el plugin {@link https://jqueryui.com/tabs/|jQuery UI Tabs}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://api.jqueryui.com/tabs/|aquí}.\r\n * @example\r\n * $(\"#ejemploArbolDiv\").rup_tabs(properties);\r\n *\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./templates */ \"./src/templates.js\"), __webpack_require__(/*! jquery.scrollto */ \"./node_modules/jquery.scrollto/jquery.scrollTo.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./rup.tooltip */ \"./src/rup.tooltip.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (jQuery, Rup) {\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n  var rup_tabs = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_tabs', rup_tabs)); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  $.fn.rup_tabs('extend', {\n    /**\r\n     * Función encargada de deshabilitar una o un conjunto de pestañas de un mismo sub-nivel\r\n     * @function\r\n     * @name disableTabs\r\n     * @param  {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer|object} args.position - Posición de las pestañas a deshabilitar\r\n     * @example\r\n     * //Una única pestaña:\r\n     * $(\"#tabs\").rup_tabs(\"disableTabs\",{\r\n     *    idTab: \"tabs\",\r\n     *    position: 1\r\n     *    });\r\n     * //Un conjunto de pestañas:\r\n     * $(\"#tabs\").rup_tabs(\"disableTabs\",{\r\n     *    idTab: \"tabs\",\r\n     *    position: [0,1,2]\r\n     * });\r\n     */\n    disableTabs: function disableTabs(args) {\n      var tab;\n\n      if (typeof args.position === 'number') {\n        $('#' + args.idTab).tabs('disable', args.position);\n        this.trigger('disable', null, tab, $('#' + args.idTab));\n      } else if (_typeof(args.position) === 'object') {\n        for (var i in args.position) {\n          $('#' + args.idTab).tabs('disable', args.position[i]);\n          this.trigger('disable', null, tab, $('#' + args.idTab));\n        }\n      } else if (typeof args.position === 'undefined') {\n        //deshabilitacion de toda la pestanya del nivel (de momento no se aplica por errores en el plug-in subyacente).\n        $('#' + args.idTab).tabs('disable');\n        var lengthTab = $('#' + args.idTab).find('.ui-tabs-nav li').length;\n\n        for (var j = 1; j <= lengthTab; j++) {\n          tab = $('#' + args.idTab).find('.ui-tabs-nav li').eq(j);\n          this.trigger('disable', null, tab, $('#' + args.idTab));\n        }\n      }\n    },\n\n    /**\r\n     * Función encargada de habilitar una o un conjunto de pestañas de un mismo subnivel.\r\n     * @function\r\n     * @name enableTabs\r\n     * @param  {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer|object} args.position - Posición de las pestañas a habilitar\r\n     * @example\r\n     * //Una única pestaña:\r\n     * $(\"#tabs\").rup_tabs(\"enableTabs \",{\r\n     *    idTab: \"tabs\",\r\n     *    position: 1\r\n     *  });\r\n     * //Un conjunto de pestañas:\r\n     *  $(\"#tabs\").rup_tabs(\"enableTabs\",{\r\n     *    idTab: \"tabs\",\r\n     *    position: [0,1,2]\r\n     *  });\r\n     */\n    enableTabs: function enableTabs(args) {\n      var tab;\n\n      if (typeof args.position === 'number') {\n        tab = $('#' + args.idTab).find('.ui-tabs-nav li').eq(args.position);\n        $('#' + args.idTab).tabs('enable', args.position);\n        this.trigger('enable', null, tab, $('#' + args.idTab));\n      } else if (_typeof(args.position) === 'object') {\n        for (var i in args.position) {\n          tab = $('#' + args.idTab).find('.ui-tabs-nav li').eq(args.position[i]);\n          $('#' + args.idTab).tabs('enable', args.position[i]);\n          this.trigger('enable', null, tab, $('#' + args.idTab));\n        }\n      } else if (typeof args.position === 'undefined') {\n        //deshabilitacion de toda la pestanya del nivel (de momento no se aplica por errores en el plug-in subyacente).\n        $('#' + args.idTab).tabs('enable');\n        var lengthTab = $('#' + args.idTab).find('.ui-tabs-nav li').length;\n\n        for (var j = 1; j <= lengthTab; j++) {\n          tab = $('#' + args.idTab).find('.ui-tabs-nav li').eq(j);\n          this.trigger('enable', null, tab, $('#' + args.idTab));\n        }\n      }\n    },\n\n    /**\r\n     * Función que fuerza la recarga de una pestaña. Si se especifica una nueva url, además de recargar la página con la nueva url, se inserta ésta como nueva url de la pestaña\r\n     * @function  Función que fuerza la recarga de una pestaña. Si se especifica una nueva url, además de recargar la página con la nueva url, se inserta ésta como nueva url de la pestaña\r\n     * @name\tloadTab\r\n     * @param  {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer} args.position - Posición de la pestaña a recargar\r\n     * @param {string} args.url - Nueva url a cargar.\r\n     * @example\r\n     * //\tRecarga simple:\r\n     * $(\"#tabs\").rup_tabs(\"loadTab\",{\r\n     *    idTab: \"tabs\",\r\n     *    position: 2\r\n     *  });\r\n     * //\tRecarga con cambio de url:\r\n     * $(\"#tabs\").rup_tabs(\"loadTab\", {\r\n     *   idTab: \"tabs\",\r\n     *   position: 2,\r\n     *   url: \"/nuevoFragmento\" *\r\n     * });\r\n     */\n    loadTab: function loadTab(args) {\n      if (!args.url) {\n        $('#' + args.idTab).tabs('load', args.position);\n      } else {\n        this._changeUrlTab({\n          idTab: args.idTab,\n          position: args.position,\n          url: $.rup_utils.setNoPortalParam(args.url)\n        });\n      }\n    },\n\n    /**\r\n     *\r\n     *  Función encargada de actualizar la url de invocación de una pestaña determinada\r\n     * @function\r\n     * @name changeUrlTab\r\n     * @param  {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer} args.position - Posición de la pestaña a cambiar\r\n     * @param {string} args.url - Nueva url a cargar.\r\n     * @example\r\n     * $(\"#tabs\").rup_tabs(\"changeUrlTab\",{\r\n     *    idTab: \"tabs\",\r\n     *     position: 1,\r\n     *    url: \"nuevaUrl\"\r\n     *  });\r\n     */\n    changeUrlTab: function changeUrlTab(args) {\n      //$(\"#\" + args.idTab).tabs(\"url\", args.position, $.rup_utils.setNoPortalParam(args.url));\n      // $(\"#\" + args.idTab + ' > ul > li').eq(args.position).attr('href',$.rup_utils.setNoPortalParam(args.url));\n      // $(\"#\" + args.idTab).tabs('load', args.position);\n      this._changeUrlTab({\n        idTab: args.idTab,\n        position: args.position,\n        url: $.rup_utils.setNoPortalParam(args.url)\n      });\n    },\n\n    /**\r\n     * Función encargada de actualizar la capa html, previamente cargada, que se muestra en la pestaña determinada\r\n     * @function\r\n     * @name  changeLayerTab\r\n     * @param {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer} args.position - Posición de la pestaña a cambiar\r\n     * @param {string} args.layer - Selector de la capa a cargar.\r\n     * @example\r\n     * $(\"#tabs\").rup_tabs(\"changeLayerTab\",{\r\n     *    idTab: \"tabs\",\r\n     *   position: 2,\r\n     *   layer: \"nuevaSelector\"\r\n     * });\r\n     */\n    changeLayerTab: function changeLayerTab(args) {\n      this._includeLayer($('#' + args.idTab + ' ul:first-child'), args.layer, $($('#' + args.idTab + ' ul li a').get(args.position)));\n    },\n\n    /**\r\n     * Función encargada de seleccionar una pestaña determinada. El comportamiento es idéntico al click con el ratón.\r\n     * @function\r\n     * @name  selectTab\r\n     * @param {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer} args.position - Posición de la pestaña a seleccionar\r\n     * @example\r\n     * $(\"#tabs\").rup_tabs(\"selectTab\",{\r\n     *    idTab: \"tabs\",\r\n     *    position: 1,\r\n     *  });\r\n     */\n    selectTab: function selectTab(args) {\n      $('#' + args.idTab).tabs('option', 'active', args.position);\n    },\n\n    /**\r\n     * Función encargada de añadir una nueva pestaña cuando el componente ya está creado. Es posible añadir una nueva pestaña al final o entre otras pestañas.\r\n     * @function\r\n     * @name addTab\r\n     * @param {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer} args.position - Posición de las pestaña a añadir\r\n     * @param {string} args.url - la url a añadir a la pestaña.\r\n     * @param {string} args.label - Literal a mostrar en la pestaña.\r\n     * @example\r\n     * $(\"#tabs\").rup_tabs(\"addTab\",{\r\n     *    idTab: \"tabs\",\r\n     *  position: 2,\r\n     *   url: \"fragmento3\"\r\n     *  });\r\n     */\n    addTab: function addTab(args) {\n      var newTab,\n          auxTabName,\n          nameLiteral = 'rup-tabs-',\n          insertIndex = 0,\n          title = ''; //limitacion de numero de pestañas abiertas\n\n      if (args.maxNumberTabs !== undefined) {\n        var numPestanas = $('#' + args.idTab + ' li').length; //si sobrepasamos numero de pestañas lanzamos limitTabs\n\n        if (numPestanas + 1 > args.maxNumberTabs) {\n          $('#' + args.idTab).trigger('limitTabs');\n          return false;\n        }\n      } // para acortar a n caracteres el literalal de la pestana\n\n\n      if (args.lengthLiteral !== undefined) {\n        title = args.label;\n\n        if (args.label.length > args.lengthLiteral) {\n          args.label = args.label.substr(0, args.lengthLiteral).concat('...');\n        }\n      }\n\n      if (args.tabs !== undefined) {\n        if (args.idNewTab !== undefined && $('#' + args.idNewTab).length === 0) {\n          newTab = $('<div>').attr('id', args.idNewTab);\n          newTab.appendTo('body');\n          auxTabName = this._includeLayer($('#' + args.idTab + ' > ul:first-child'), '#' + args.idNewTab, null);\n          newTab.rup_tabs(args); //$(\"#\" + args.idTab).tabs(\"add\", \"#\" + args.idNewTab, args.label, args.position);\n\n          this._addTab({\n            idTab: args.idTab,\n            url: args.idNewTab,\n            label: args.label,\n            position: args.position,\n            orientation: args.orientation\n          });\n\n          $(auxTabName).remove();\n        } else {\n          $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.parameterError'));\n          return false;\n        }\n      } else if (args.layer !== undefined) {\n        //LAYER => Recoge una capa ya cargada de la Jsp\n        args.layer = this._includeLayer($('#' + args.idTab + ' > ul:first-child'), args.layer, null); //$(\"#\" + args.idTab).tabs(\"add\", args.layer, args.label, args.position);\n\n        this._addTab({\n          idTab: args.idTab,\n          url: args.layer,\n          label: args.label,\n          position: args.position,\n          orientation: args.orientation\n        });\n\n        $.each($('#' + args.idTab + ' div[id*=\\'' + nameLiteral + '\\']'), function (index, object) {\n          if (insertIndex < parseFloat(object.id.split(nameLiteral)[1])) {\n            insertIndex = object.id.split(nameLiteral)[1];\n          }\n        }); //$(\"#\"+args.idTab+\" div[id='rup-tabs-\"+insertIndex+\"']\").addClass(\"ui-tabs-hide\");\n      } else {\n        //$(\"#\" + args.idTab).tabs(\"add\", $.rup_utils.setNoPortalParam(args.url), args.label, args.position);\n        this._addTab({\n          idTab: args.idTab,\n          url: $.rup_utils.setNoPortalParam(args.url),\n          label: args.label,\n          position: args.position,\n          orientation: args.orientation\n        });\n\n        $.each($('#' + args.idTab + ' div[id*=\\'' + nameLiteral + '\\']'), function (index, object) {\n          if (insertIndex < parseFloat(object.id.split(nameLiteral)[1])) {\n            insertIndex = object.id.split(nameLiteral)[1];\n          }\n        });\n        $('#' + args.idTab + ' div[id=\\'rup-tabs-' + insertIndex + '\\']').addClass('ui-tabs-hide'); //altura fija\n\n        if (undefined !== args.fixedHeight) {\n          $('#' + args.idTab + ' div[id=\\'rup-tabs-' + insertIndex + '\\']').css('height', args.fixedHeight);\n        }\n      }\n\n      $('#' + args.idTab + ' ul').first().find('li:nth-child(' + (args.position + 1) + ') a').attr('title', title).rup_tooltip({});\n\n      if (args.tabsAtBottom) {\n        var loadLi = $('#' + args.idTab + ' ul li').last().not('.rup-tabs_loading');\n        loadLi.removeClass('ui-corner-top').addClass('ui-corner-botttom');\n      }\n\n      var pos = args.position;\n\n      if (args.orientation !== undefined) {\n        pos = pos - 1;\n      }\n\n      var loadSpan = $('#' + args.idTab + ' ul li a').eq(pos);\n\n      if (args.close === true) {\n        loadSpan.text('');\n        var texto = $.rup.i18nParse($.rup.i18n.app[$(this).attr('id')], args.label);\n\n        if (args.label !== undefined && args.label !== '') {\n          texto = args.label;\n        }\n\n        loadSpan.append($('<div>').addClass('rup-tabs_title').text(texto)).append($('<span>').addClass('rup-tabs_loading')).append('<span class=\"ui-icon ui-icon-close\" role=\"presentation\">Remove Tab</span>'); //evento close\n\n        $('span.ui-icon-close').on('click', function () {\n          var div = $(this).parent().parent().parent().parent();\n          var tabContentId = $(this).parent().attr('href');\n          $(this).parent().parent().remove(); //remove li of tab\n\n          $(tabContentId).remove(); //remove respective tab content\n\n          div.tabs('refresh');\n        }); //efecto hover del boton cerrar\n\n        $('span.ui-icon-close').addClass('rup-tabs-close');\n        $('span.ui-icon-close').on({\n          mouseenter: function mouseenter() {\n            $(this).addClass('rup-tabs-close-hover');\n          },\n          mouseleave: function mouseleave() {\n            $(this).removeClass('rup-tabs-close-hover');\n          }\n        });\n      } else {\n        loadSpan.text('');\n        var textoNoClose = $.rup.i18nParse($.rup.i18n.app[$(this).attr('id')], args.label);\n\n        if (args.label !== undefined && args.label !== '') {\n          textoNoClose = args.label;\n        }\n\n        loadSpan.append($('<div>').addClass('rup-tabs_title').text(textoNoClose)).append($('<span>').addClass('rup-tabs_loading'));\n      } //loadSpan.remove();\n\n    },\n\n    /**\r\n     * Función encargada de eliminar una nueva pestaña cuando el componente ya está creado\r\n     * @param {string} args.idTab - Selector del componente pestaña\r\n     * @param {integer} args.position - Posición de las pestaña a eliminar\r\n     */\n    removeTab: function removeTab(args) {\n      //$(\"#\" + args.idTab).tabs(\"remove\", args.position);\n      this._removeTab({\n        idTab: args.idTab,\n        position: args.position\n      });\n    },\n    selected: 0\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  $.fn.rup_tabs('extend', {\n    _init: function _init(args) {\n      var $self = $(this);\n\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        //Se recogen y cruzan las paremetrizaciones del objeto\n        var settings = $.extend({}, $.fn.rup_tabs.defaults, args[0]);\n        settings.id = $(this).attr('id');\n        settings.iniLoad = false;\n        this.on('tabsload', function () {\n          setTimeout(function () {\n            $self.trigger('afterTabDataLoad');\n          }, 300);\n        }); //Establecemos el ancho general de las pestañas en caso de venir informado\n\n        if (undefined !== settings.width) {\n          $('#' + settings.id).css('width', settings.width).addClass('rup-tabs_overflow');\n        } //Establecemos la altura general de las pestañas en caso de venir informada\n\n\n        if (undefined !== settings.height) {\n          $('#' + settings.id).css('height', settings.height).addClass('rup-tabs_overflow');\n        }\n\n        var structure = settings.tabs,\n            profun = 0;\n\n        while (structure !== undefined) {\n          profun = profun + 1;\n          structure = structure[0].tabs;\n        }\n\n        settings.profun = profun; //Generar estructura\n\n        this._parseJSON(settings.tabs, $.rup.i18n.app[settings.id], $('#' + settings.id), '', 1, settings); //Una vez creadas todas las pestanyas, se permite la carga normal de las mismas\n\n\n        settings.iniLoad = true; //Convertir en pestanyas\n\n        this._tabify($('#' + settings.id), settings); //altura\n\n\n        if (undefined !== settings.fixedHeight) {\n          $('#' + settings.id + '>.ui-tabs-panel').css('height', settings.fixedHeight);\n        } //Añadir evento de conversión a pestanyas en los enlaces\n        //$('#'+settings.id).find(\"a[rupLevel]\").click ({disabled: settings.disabled}, tabClick);\n        //evento limite de numero de pestañas\n\n\n        $('#' + settings.id).on('limitTabs', function () {\n          $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_tabs.tabLimitError'));\n        }); //Deshabilitar las pestanyas indicadas\n\n        if (settings.disabled !== undefined) {\n          for (var i in settings.disabled) {\n            $('#' + settings.id).rup_tabs('disableTabs', {\n              idTab: i,\n              position: settings.disabled[i]\n            });\n          }\n        }\n\n        $('#' + settings.id).triggerHandler('load');\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_tabs', 'init');\n    },\n    //Funcion encargada de crear los distintos tab's\n    _tabify: function _tabify(div, settings) {\n      //Se especifica el estilo asociado a la pestanya contenedora de pestanyas\n      div.addClass('rup-tabs_container'); //Se cargan los Setting de cada objeto en su campo \"data\" correspondiente\n\n      div.data('settings', settings); //Se especifica el control del evento \"select\" por parte del patron\n\n      var select = function select(event, ui) {\n        //Se gestiona la primera carga de la primera pestanya de cada tab\n        if ($(ui.panel).data('cargado') !== undefined && $(ui.panel).data('cargado') === false && $(ui.panel).length > 0) {\n          $(ui.panel).tabs('load', settings.selected);\n          $(ui.panel).data('cargado', true);\n        }\n\n        if (settings.select !== undefined && settings.select !== null && typeof settings.select === 'function') {\n          settings.select(event, ui);\n        } //Nuevos cargar para la versión jquery 1.12, es la primera vez\n        // if ($(ui.newPanel).data('cargado') !== undefined){\n        // \tui.newTab.children('a').attr('href',ui.newTab.children('a').attr('id'));\n        // }\n\n\n        $(ui.newPanel).data('cargado', true);\n      }; //se cargan las extensiones de los usuarios en los eventos de las peticiones Ajax\n\n\n      var ajaxOptions = $.extend({}, settings.ajaxOptions);\n\n      ajaxOptions.beforeSend = function () {\n        if (settings.ajaxOptions.beforeSend !== undefined && settings.ajaxOptions.beforeSend !== null && typeof settings.ajaxOptions.beforeSend === 'function') {\n          settings.ajaxOptions.beforeSend.call();\n        }\n\n        if (!settings.iniLoad) {\n          div.data('cargado', false);\n          return false;\n        }\n      };\n\n      ajaxOptions.complete = function (XMLHttpRequest, textStatus) {\n        //se elimina el objeto de visualizacion de carga\n        div.find('span.rup-tabs_loading_img').remove();\n\n        if (settings.ajaxOptions.complete !== undefined && settings.ajaxOptions.complete !== null && typeof settings.ajaxOptions.complete === 'function') {\n          settings.ajaxOptions.complete(XMLHttpRequest, textStatus);\n        }\n      };\n\n      ajaxOptions.success = function (data, textStatus, XMLHttpRequest) {\n        if (settings.ajaxOptions.success !== undefined && settings.ajaxOptions.success !== null && typeof settings.ajaxOptions.success === 'function') {\n          settings.ajaxOptions.success(data, textStatus, XMLHttpRequest);\n        }\n      };\n\n      ajaxOptions.error = function (xhr, s, t) {\n        var userFunction;\n\n        if (settings.ajaxOptions.error !== undefined && settings.ajaxOptions.error !== null && typeof settings.ajaxOptions.error === 'function') {\n          userFunction = function userFunction() {\n            settings.ajaxOptions.error(xhr, s, t);\n          };\n        }\n\n        $.rup_messages('msgError', {\n          title: $.rup.i18nParse($.rup.i18n.base, 'rup_global.developerError'),\n          message: '<p>' + $.rup.i18nParse($.rup.i18n.base, 'rup_tabs.serverError') + '<b> ' + s + ':  ' + xhr.status + ' - ' + xhr.statusText + '.</b>' + '</p>',\n          width: '40%',\n          beforeClose: userFunction\n        });\n      }; //if (settings.navigation!==true){\n\n\n      $(div).tabs({\n        ajaxOptions: settings.cache === false ? $.extend(ajaxOptions, {\n          cache: false\n        }) : ajaxOptions,\n        cache: settings.cache,\n        cookie: null,\n        //cookie: settings.cookie, //Se deja para una mejora\n        //disabled: true, //Bajo funcionalidades\n        show: settings.fx ? settings.fx[0] : null,\n        //son los efectos que se aplican al presentar  una pestanya\n        hide: settings.fx ? settings.fx[1] : null,\n        //son los efectos que se aplican al ocultar una pestanya\n        idPrefix: 'rup-tabs-',\n        panelTemplate: settings.panelTemplate,\n        active: settings.selected,\n        //deprecado en jquery ui 1.10, ahora es active\n        spinner: '<span class=\\'rup-tabs_loading_img\\'></span>',\n        //eventos\n        create: settings.create,\n        beforeActivate: select,\n        //deprecado en jquery ui 1.10, ahora es beforeActivate\n        load: settings.load,\n        activate: settings.show,\n        //deprecated show como evento desde jquery ui 1.10\n        add: settings.add,\n        remove: settings.remove //enable: settings.enable,\n        //disable: settings.disable\n\n      }); //}\n\n      if (settings.scrollable === true) {\n        this._scrollable(settings);\n      } // Tabs at bottoms\n\n\n      if (settings.tabsAtBottom === true) {\n        $(div).addClass('tabs-bottom');\n        $(div).find('.tabs-spacer').css('float', 'left').css('height', '200px');\n        $('.ui-tabs-nav, .ui-tabs-nav > *', $(div)).removeClass('ui-corner-all ui-corner-top').addClass('ui-corner-bottom');\n        $('.ui-tabs-panel.ui-widget-content.ui-corner-bottom', $(div)).removeClass('ui-corner-bottom').addClass('ui-corner-top'); // move the nav to the bottom\n\n        $('.ui-tabs-nav', $(div)).appendTo('.tabs-bottom');\n      }\n    },\n    _parseJSON: function _parseJSON(json, json_i18n, tabs, pos, profundidad, settings) {\n      var element,\n          rupLevel,\n          label,\n          title = ''; // Añadir contenedor de pestanyas\n\n      var $tabsContainer = $(Rup.Templates.rup.tabs.container());\n      tabs.append($tabsContainer);\n      tabs = $(tabs).children('ul');\n\n      function closeLinkClick() {\n        var tabContentId = $(this).parent().attr('href');\n        $(this).parent().parent().remove(); // remove li of\n        // tab\n\n        $(tabContentId).remove(); // remove respective tab\n        // content\n\n        tabs.parent().tabs('refresh');\n      }\n\n      function closeLinkMouseEnter() {\n        $(this).addClass('rup-tabs-close-hover');\n      }\n\n      function closeLinkMouseLeave() {\n        $(this).removeClass('rup-tabs-close-hover');\n      } // pestanyas\n\n\n      for (var i = 0; i < json.length; i++) {\n        rupLevel = pos + i; // Indicador de nivel de la pestanya\n\n        element = json[i];\n\n        if (i === 0 && profundidad === settings.profun) {\n          settings.iniLoad = true;\n        } else {\n          settings.iniLoad = false;\n        }\n\n        label = $.rup.i18nParse(json_i18n, element.i18nCaption);\n\n        if (settings.lengthLiteral !== undefined) {\n          title = label;\n\n          if (label.length > settings.lengthLiteral) {\n            label = label.substr(0, settings.lengthLiteral).concat('...');\n          }\n        }\n\n        if (element.layer !== undefined) {\n          // LAYER => Recoge una capa ya cargada de la Jsp\n          element.layer = this._includeLayer(tabs, element.layer, null);\n          $tabsContainer.append(Rup.Templates.rup.tabs.tab({\n            'id': element.i18nCaption,\n            'href': element.layer,\n            'rupLevel': rupLevel,\n            'title': title,\n            'aria-controls': title,\n            'alt': title,\n            'label': label,\n            'btnClose': settings.close\n          })); // evento close\n\n          $('span.ui-icon-close').on('click', closeLinkClick); // efecto hover del boton cerrar\n\n          $('span.ui-icon-close').addClass('rup-tabs-close');\n          $('span.ui-icon-close').on({\n            mouseenter: closeLinkMouseEnter,\n            mouseleave: closeLinkMouseLeave\n          });\n        } else if (element.url !== undefined) {\n          // URL => Cargar contenido al pulsar\n          $tabsContainer.append(Rup.Templates.rup.tabs.tab({\n            'id': '#' + element.i18nCaption,\n            'href': $.rup_utils.setNoPortalParam(element.url),\n            'rupLevel': rupLevel,\n            'title': title,\n            'aria-controls': title,\n            'alt': title,\n            'label': label,\n            'btnClose': settings.close\n          }));\n        } else if (element.tabs !== undefined) {\n          // TABS => Subpestanyas\n          $tabsContainer.append(Rup.Templates.rup.tabs.tab({\n            'id': '#' + element.i18nCaption,\n            'href': '#' + element.i18nCaption,\n            'rupLevel': rupLevel,\n            'title': title,\n            'aria-controls': title,\n            'alt': title,\n            'label': label,\n            'btnClose': settings.close,\n            'tabs': element.tabs\n          })); // Gestionar capa contenedora subpestanyas\n\n          tabs = $(tabs).parent(); // Añadir contenedor de capa asociada a pestanya\n\n          var capaId = 'rupRandomLayerId-' + $.rup_utils.autoGenerateIdNum++;\n          var $capa = $(Rup.Templates.rup.tabs.subtab({\n            'rupRandomLayerId': capaId,\n            'id': element.i18nCaption,\n            'actualTab': true\n          }));\n          tabs.append($capa); // tabs.append(capa); //Añadir contenedor de capa\n          // asociada a pestanya\n\n          tabs = $(tabs).children('#' + capaId); //Seleccionar\n          // capa contenedora\n          // Gestionar capa de la subpestanya\n\n          tabs.prepend($('<div>').attr('id', element.i18nCaption).attr('actualTab', true)); // //Añadir capa asociada a la pestanya\n\n          tabs = $(tabs).children('div:first-child'); // Seleccionar\n          // capa\n          // Subpestanyas\n\n          var subsettings = jQuery.extend(true, {}, settings);\n          subsettings.selected = element.selected; // tabs.append(this._parseJSON(element.tabs, json_i18n,\n          // tabs, rupLevel, profundidad+1, subsettings));\n\n          tabs.append(this._parseJSON(element.tabs, json_i18n, tabs, rupLevel, profundidad + 1, subsettings));\n\n          this._tabify(tabs, subsettings); // Si no tiene 1\n          // es que es el\n          // primer\n          // elemento y lo\n          // convertimos a\n          // pestanyas\n\n        }\n      }\n    },\n    //Funcion encargada de gestionar el objeto definido por el usuario (se parsea el JSon y se actua en consecuencia)\n    // _parseJSON : function (json, json_i18n, tabs, pos, profundidad, settings) {\n    // \tvar element, rupLevel, label, title=\"\";\n    //\n    // \ttabs.append($('<ul>'));  //Añadir contenedor de pestanyas\n    // \ttabs = $(tabs).children('ul'); //Seleccionar pestanya\n    //\n    // \t//pestanyas\n    // \tfor (var i = json.length; i--; ) {\n    // \t\trupLevel = pos+i; //Indicador de nivel de la pestanya\n    // \t\telement = json[i];\n    // \t\tif (i === 0 && profundidad === settings.profun){\n    // \t\t\tsettings.iniLoad = true;\n    // \t\t} else {\n    // \t\t\tsettings.iniLoad = false;\n    // \t\t}\n    //\n    // \t\tlabel = $.rup.i18nParse(json_i18n,element.i18nCaption);\n    //\n    // \t\tif (settings.lengthLiteral!==undefined){\n    // \t\t\ttitle = label;\n    // \t\t\tif(label.length>settings.lengthLiteral){\n    // \t\t\t\tlabel = label.substr(0,settings.lengthLiteral).concat(\"...\");\n    // \t\t\t}\n    //\n    // \t\t}\n    //\n    // \t\tif (element.layer !== undefined){\n    // \t\t\t//LAYER => Recoge una capa ya cargada de la Jsp\n    // \t\t\telement.layer = this._includeLayer(tabs, element.layer, null);\n    // \t\t\t//si quiero con boton de cerrar pestana\n    // \t\t\tif (settings.close===true){\n    // \t\t\t\ttabs.prepend($('<li>').append(\n    // \t\t\t\t\t$('<a>').attr('href',element.layer)\n    // \t\t\t\t\t.attr({\n    // \t\t\t\t\t\t'rupLevel':rupLevel,\n    // \t\t\t\t\t\t'title':title,\n    // \t\t\t\t\t\t'alt':title\n    // \t\t\t\t\t}).rup_tooltip({})\n    // \t\t\t\t\t.css('padding-left', '1.4em')\n    // \t\t\t\t\t.css('padding-right', '0.3em')\n    // \t\t\t\t\t.append ($('<div>').addClass('rup-tabs_title').text(label))\n    // \t\t\t\t\t.append ($('<span>').addClass('rup-tabs_loading'))\n    // \t\t\t\t\t.append('<span class=\"ui-icon ui-icon-close\" role=\"presentation\">Remove Tab</span>')\n    // \t\t\t));\n    //\n    // \t\t\t//evento close\n    // \t\t\t$(\"span.ui-icon-close\").on( \"click\", function() {\n    //\n    // \t\t\t\tvar tabContentId = $(this).parent().attr(\"href\");\n    // \t\t        $(this).parent().parent().remove(); //remove li of tab\n    // \t\t        $(tabContentId).remove(); //remove respective tab content\n    //\n    // \t\t\t\t tabs.tabs( \"refresh\" );\n    // \t\t\t\t });\n    //\n    // \t\t\t//efecto hover del boton cerrar\n    // \t\t\t$(\"span.ui-icon-close\").addClass('rup-tabs-close');\n    // \t\t\t$(\"span.ui-icon-close\").on({\n    // \t\t\t\tmouseenter: function () {\n    // \t\t\t\t\t$(this).addClass('rup-tabs-close-hover');\n    // \t\t\t\t},\n    //\n    // \t\t\t\tmouseleave: function () {\n    // \t\t\t\t\t$(this).removeClass('rup-tabs-close-hover');\n    // \t\t\t\t}\n    // \t\t\t});\n    //\n    // \t\t\t}else{\n    // \t\t\t\ttabs.prepend($('<li>').append(\n    // \t\t\t\t\t\t$('<a>').attr('href',element.layer)\n    // \t\t\t\t\t\t.attr({\n    // \t\t\t\t\t\t\t'rupLevel':rupLevel,\n    // \t\t\t\t\t\t\t'title':title,\n    // \t\t\t\t\t\t\t'alt':title\n    // \t\t\t\t\t\t}).rup_tooltip({})\n    // \t\t\t\t\t\t.css('padding-left', '1.4em')\n    // \t\t\t\t\t\t.css('padding-right', '0.3em')\n    // \t\t\t\t\t\t.append ($('<div>').addClass('rup-tabs_title').text(label))\n    // \t\t\t\t\t\t.append ($('<span>').addClass('rup-tabs_loading'))\n    // \t\t\t\t));\n    // \t\t\t}\n    //\n    // \t\t} else if (element.url !== undefined){\n    // \t\t\t//URL => Cargar contenido al pulsar\n    // \t\t\ttabs.prepend($('<li>').append(\n    // \t\t\t\t$('<a>').attr('href',$.rup_utils.setNoPortalParam(element.url))\n    // \t\t\t\t\t.attr({\n    // \t\t\t\t\t\t'rupLevel':rupLevel,\n    // \t\t\t\t\t\t'title':title,\n    // \t\t\t\t\t\t'alt':title\n    // \t\t\t\t\t}).rup_tooltip({})\n    // \t\t\t\t\t.css('padding-left', '1.4em')\n    // \t\t\t\t\t.css('padding-right', '0.3em')\n    // \t\t\t\t\t.append ($('<div>').addClass('rup-tabs_title').text(label))\n    // \t\t\t\t\t.append ($('<span>').addClass('rup-tabs_loading'))\n    // \t\t\t));\n    // \t\t} else if (element.tabs !== undefined){\n    // \t\t\t//TABS => Subpestanyas\n    // \t\t\ttabs.prepend($('<li>').append(\n    // \t\t\t\t$('<a>').attr('id','#'+element.i18nCaption)\n    // \t\t\t\t\t.attr('href','#'+element.i18nCaption)\n    // \t\t\t\t\t.attr({\n    // \t\t\t\t\t\t'rupLevel':rupLevel,\n    // \t\t\t\t\t\t'title':title,\n    // \t\t\t\t\t\t'alt':title\n    // \t\t\t\t\t}).rup_tooltip({})\n    // \t\t\t\t\t.css('padding-left', '1.4em')\n    // \t\t\t\t\t.css('padding-right', '0.3em')\n    // \t\t\t\t\t.append ($('<div>').addClass('rup-tabs_title').text(label))\n    // \t\t\t\t\t.append ($('<span>').addClass('rup-tabs_loading'))\n    // \t\t\t));\n    //\n    // \t\t\t//Gestionar capa contenedora subpestanyas\n    // \t\t\ttabs = $(tabs).parent();\n    //\n    // \t\t\tvar capa = $('<div>'),\n    // \t\t\t\tcapaId = $.rup_utils.randomIdGenerator(capa);\n    // \t\t\ttabs.append(capa); \t\t\t\t\t\t//Añadir contenedor de capa asociada a pestanya\n    // \t\t\ttabs = $(tabs).children(\"#\"+capaId); \t//Seleccionar capa contenedora\n    //\n    // \t\t\t//Gestionar capa de la subpestanya\n    // \t\t\ttabs.prepend($('<div>').attr('id', element.i18nCaption).attr('actualTab',true)); //Añadir capa asociada a la pestanya\n    // \t\t\ttabs = $(tabs).children('div:first-child'); //Seleccionar capa\n    //\n    // \t\t\t//Subpestanyas\n    // \t\t\tvar subsettings = jQuery.extend(true, {}, settings);\n    // \t\t\tsubsettings.selected = element.selected;\n    // \t\t\ttabs.append(this._parseJSON(element.tabs, json_i18n, tabs, rupLevel, profundidad+1, subsettings));\n    //\n    // \t\t\tthis._tabify(tabs,subsettings); //Si no tiene 1 es que es el primer elemento y lo convertimos a pestanyas\n    //\n    // \t\t\t//Reposicionar 'puntero' para siguiente pasada del bucle\n    // \t\t\ttabs = $(tabs).parents(\"div[actualTab=true]\").find(\"ul\").first();\n    // \t\t\tif (tabs.length===0){\n    // \t\t\t\ttabs = $(\"#\"+settings.id).find(\"ul\").first();\n    // \t\t\t}\n    //\n    // \t\t}\n    // \t}\n    // \t$(tabs).parents(\"div[actualTab=true]\").first().removeAttr(\"actualTab\");\n    // \tdelete tabs;\n    // },\n    //Función encargada de validar e incluir la capa que contendrá la pestanya. De no tener identificador se le asocia uno.\n    _includeLayer: function _includeLayer(tabs, layerSelector, pestanya) {\n      var content, selectObject;\n\n      if ($(layerSelector).length > 0) {\n        if ($(layerSelector).length === 1) {\n          selectObject = $(layerSelector).css('display', '');\n        } else {\n          selectObject = $('<div>').append($(layerSelector).css('display', ''));\n        }\n\n        if (pestanya === null) {\n          content = $('<div>').append(selectObject);\n          tabs.parent().append(content);\n          layerSelector = '#' + $.rup_utils.randomIdGenerator(content);\n        } else {\n          layerSelector = pestanya.attr('href');\n          content = $(pestanya.attr('href'));\n          content.children().remove();\n          content.append(selectObject);\n        }\n      } else {\n        layerSelector = '#load-tab-error';\n\n        if (pestanya === null) {\n          tabs.parent().append($('<div>').attr('id', 'load-tab-error').append($('<div>').addClass('rup-loading_tab_error').append($.rup.i18nParse($.rup.i18n.base, 'rup_global.selectorError'))));\n        } else {\n          layerSelector = pestanya.attr('href');\n          content = $(pestanya.attr('href'));\n          content.children().remove();\n          content.append($('<div>').attr('id', 'load-tab-error').append($('<div>').addClass('rup-loading_tab_error').append($.rup.i18nParse($.rup.i18n.base, 'rup_global.selectorError'))));\n        }\n      }\n\n      return layerSelector;\n    },\n    _scrollable: function _scrollable(settings) {\n      var o = $.extend({}, settings),\n          $tabs = $(this),\n          $tabsNav = $tabs.find('.ui-tabs-nav'),\n          $nav; //referencia al wrapper\n      //ajuste del css\n\n      $tabs.css({\n        'padding': 2,\n        'position': 'relative'\n      }); //wrapper del contenido\n\n      $tabs.wrap('<div id=\"stTabswrapper\" class=\"stTabsMainWrapper\" style=\"position:relative\"></div>').find('.ui-tabs-nav').css('overflow', 'hidden').wrapInner('<div class=\"stTabsInnerWrapper\" style=\"width:30000px\"><span class=\"stWidthChecker\"></span></div>');\n      var $tabsWrapper = $tabs.parents('#stTabswrapper').width($tabs.outerWidth(true)); //correción de bug en safari\n\n      if ($.browser.safari) {\n        $tabsWrapper.width($tabs.width() + 6);\n      } //alert($tabsWrapper.width());\n\n\n      if (o.resizable) {\n        if ($.fn.resizable) {\n          $tabsWrapper.resizable({\n            minWidth: $tabsWrapper.width(),\n            maxWidth: $tabsWrapper.width() * 2,\n            minHeight: $tabsWrapper.height(),\n            maxHeight: $tabsWrapper.height() * 2,\n            handles: o.resizeHandles,\n            alsoResize: $tabs,\n            //start : function(){  },\n            resize: function resize() {\n              $tabs.trigger('resized');\n            } //stop: function(){ $tabs.trigger('scrollToTab',$tabsNav.find('li.ui-tabs-active')); }\n\n          });\n        } else {\n          $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_tabs.resizeError'));\n        }\n      } //añade iconos de navegación\n      //console.log(parseInt($tabsNav.innerHeight(true)));\n      //Total height of nav/2 - total height of arrow/2\n      //var arrowsTopMargin = (parseInt(parseInt($tabsNav.innerHeight(true)/2)-8)),\n      //\tarrowsCommonCss={'cursor':'pointer','z-index':1000,'position':'absolute','top':3,'height':$tabsNav.outerHeight()-($.browser.safari ? 2 : 1)};\n\n\n      var arrowsTopMargin = parseInt(parseInt($tabsNav.innerHeight() / 2) - 8),\n          arrowsCommonCss = {\n        'cursor': 'pointer',\n        'z-index': 1000,\n        'position': 'absolute',\n        'top': 3,\n        'height': $tabsNav.outerHeight() - ($.browser.safari ? 2 : 1)\n      };\n      $tabsWrapper.prepend($nav = $('<div></div>').disableSelection().css({\n        'position': 'relative',\n        'z-index': 3000,\n        'display': 'block'\n      }).append($('<span></span>').disableSelection().attr('title', 'Previous tab').css(arrowsCommonCss).addClass('ui-state-active ui-corner-tl ui-corner-bl stPrev stNav').css('left', 3).append($('<span/>').disableSelection().addClass('ui-icon ui-icon-carat-1-w').html('Previous tab').css('margin-top', arrowsTopMargin)).click(function () {\n        //comprueba si esta deshabilitado\n        if ($(this).hasClass('ui-state-disabled')) return; //selecciona el tab anterior y lanza el evento scrollToTab\n\n        var prevIndex = $tabsNav.find('li.ui-tabs-active').prevAll().length - 1; //seleeciona el tab\n\n        $tabsNav.find('li').eq(prevIndex).find('a').trigger('click');\n        return false;\n      }), $('<span></span>').disableSelection().attr('title', 'Next tab').css(arrowsCommonCss).addClass('ui-state-active ui-corner-tr ui-corner-br stNext stNav').css({\n        'right': 3\n      }).append($('<span></span>').addClass('ui-icon ui-icon-carat-1-e').html('Next tab').css('margin-top', arrowsTopMargin)).click(function () {\n        //selecciona el tab anterior y lanza el evento scrollToTab\n        var nextIndex = $tabsNav.find('li.ui-tabs-active').prevAll().length + 1; //selecciona el tab\n\n        $tabsNav.find('li').eq(nextIndex).find('a').trigger('click');\n        return false;\n      }))); //Binding de los eventos con las pestañas\n\n      $tabs.on('navEnabler', function () {\n        setTimeout(function () {\n          //comprueba si la ultima o la primera  pestaña esta seleccionada y en ese caso deshabilita las flechas\n          var isLast = $tabsNav.find('.ui-tabs-active').is(':last-child'),\n              isFirst = $tabsNav.find('.ui-tabs-active').is(':first-child'),\n              $ntNav = $tabsWrapper.find('.stNext'),\n              $pvNav = $tabsWrapper.find('.stPrev'); //debug('isLast = '+isLast+' - isFirst = '+isFirst);\n\n          if (isLast) {\n            $pvNav.removeClass('ui-state-disabled');\n            $ntNav.addClass('ui-state-disabled');\n          } else if (isFirst) {\n            $ntNav.removeClass('ui-state-disabled');\n            $pvNav.addClass('ui-state-disabled');\n          } else {\n            $ntNav.removeClass('ui-state-disabled');\n            $pvNav.removeClass('ui-state-disabled');\n          }\n        }, o.animationSpeed);\n      }) //Comprueba si hace face falta la navegacion (si hay demasiadas pestañas visibles)\n      .on('navHandler', function () {\n        //Si $widthCheker es mayor tabnav  lo oculto\n        //console.log($widthChecker.width());\n        //console.log($tabsNav.width());\n        //if($widthChecker.width()>$tabsNav.width())\n        if ($('.stWidthChecker').children().length > 5) {\n          $nav.show(); //añade cierto margen  a la primera pestaña para hacerla visible si esta seleccionada\n\n          $tabsNav.find('li').first().css('margin-left', $nav.find('.stPrev').outerWidth(true));\n        } else {\n          $nav.hide(); //elima el margen del primer elemento\n\n          $tabsNav.find('li').first().css('margin-left', 0);\n        }\n      }) //Bind el evento de mover el scroll\n      .on('scrollToTab', function (event, $tabToScrollTo, clickedFrom, hiddenOnSide) {\n        //Si no se provee una pestaña como parametro ,scroll a la ultima pestaña\n        $tabToScrollTo = typeof $tabToScrollTo != 'undefined' ? $($tabToScrollTo) : $tabsNav.find('li.ui-tabs-active');\n        var navWidth = $nav.is(':visible') ? $nav.find('.stPrev').outerWidth(true) : 0; //debug($tabToScrollTo.prevAll().length)\n\n        var offsetLeft = -($tabs.width() - ($tabToScrollTo.outerWidth(true) + navWidth + parseInt($tabsNav.find('li').last().css('margin-right'), 10)));\n        offsetLeft = clickedFrom == 'tabClicked' && hiddenOnSide == 'left' ? -navWidth : offsetLeft;\n        offsetLeft = clickedFrom == 'tabClicked' && hiddenOnSide == 'right' ? offsetLeft : offsetLeft; //debug(offsetLeft);\n\n        var scrollSettings = {\n          'axis': 'x',\n          'margin': true,\n          'offset': {\n            'left': offsetLeft\n          },\n          'easing': o.easing || ''\n        }; //debug(-($tabs.width()-(116+navWidth)));\n\n        $tabsNav.scrollTo($tabToScrollTo, o.animationSpeed, scrollSettings);\n      }).on('bindTabClick', function () {\n        //Controla el scroll cuando un usuario clickea manualmente en la pestaña\n        $tabsNav.find('a').click(function () {\n          var $liClicked = $(this).parents('li');\n          var navWidth = $nav.find('.stPrev').outerWidth(true); //debug('left='+($liClicked.offset().left)+' and tabs width = '+ ($tabs.width()-navWidth));\n\n          if ($liClicked.position().left - navWidth < 0) {\n            $tabs.trigger('scrollToTab', [$liClicked, 'tabClicked', 'left']);\n          } else if ($liClicked.outerWidth() + $liClicked.position().left > $tabs.width() - navWidth) {\n            $tabs.trigger('scrollToTab', [$liClicked, 'tabClicked', 'right']);\n          } //Des/habilita las flechas de navegacion\n\n\n          $tabs.trigger('navEnabler');\n          return false;\n        });\n      }).on('resized', function () {\n        $tabs.trigger('navHandler');\n        $tabs.trigger('scrollToTab', $tabsNav.find('li.ui-tabs-active'));\n      }) //triggers\n      .trigger('navHandler').trigger('navEnabler').trigger('bindTabClick');\n    },\n\n    /* deprecado el metodo \"add\" en jquery ui 1.10\r\n         * Este método sustituye su utilidad\r\n         * */\n    _addTab: function _addTab(args) {\n      if (args.url === undefined) {\n        args.url = '#';\n      }\n\n      var previousTab = $('#' + args.idTab).find('.ui-tabs-nav li').eq(args.position - 1);\n\n      if (args.orientation !== undefined) {\n        $('<li><a href=\\'' + args.url + '\\'>' + args.label + '</a></li>').insertBefore(previousTab);\n      } else {\n        $('<li><a href=\\'' + args.url + '\\'>' + args.label + '</a></li>').insertAfter(previousTab);\n      }\n\n      $('#' + args.idTab).tabs('refresh');\n    },\n\n    /* deprecado el metodo \"remove\" en jquery ui 1.10\r\n         * Este método sustituye su utilidad\r\n         * */\n    _removeTab: function _removeTab(args) {\n      // Remove the tab\n      $('#' + args.idTab).find('.ui-tabs-nav li').eq(args.position - 1).remove(); // Refresh the tabs widget\n\n      $('#' + args.idTab).tabs('refresh');\n    },\n\n    /* deprecado el metodo \"url\" en jquery ui 1.10\r\n         * Este método sustituye su utilidad\r\n         * */\n    _changeUrlTab: function _changeUrlTab(args) {\n      // if(args.idTab == 'mockTab') {\n      // \tdebugger;\n      // }\n      var tab = $('#' + args.idTab).find('ul > li').eq(args.position).find('> a');\n      $(tab).attr('href', args.url);\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  /**\r\n   * @name options\r\n   * @property {object}  disabled - Permite especificar el conjunto de pestañas que, inicialmente, estarán deshabilitadas\r\n   * @property {boolean} [close=false] - Determina si se debe mostrar un icono de cerrar pestaña junto al label de las mismas.\r\n   * @property {integer} \tfixedHeight - Permite especificar una altura fija para el contenedor de las pestañas\r\n   * @property {integer}  [lengthLiteral=undefined] - Permite especificar un número máximo de caracteres a mostrar en el label de la pestaña antes de aplicar ellipsis.\r\n   * @property {integer} maxNumberTabs - Parámetro que determina el número máximo de pestañas que va a permitir el componente que se añadan de manera dinámica\r\n   * @property {boolean} [scrollable=false] - Determina si la pestaña permite el mostrar scroll en la capa contenedora\r\n   * @property {string} layer - Parámetro que permite especificar fragmentos html previamente cargados para el contenido de una pestaña. El parámetro acepta cualquier tipo de selector válido de JQuery para determinar que fragmento html se ubica en la pestaña. En caso de precisarse un selector de JQuery que devuelva más de un elemento, éstos se incluirán en la pestaña correspondiente dispuestos verticalmente (esta forma de trabajar no es muy ortodoxa pero es factible).\r\n   * @property {integer} width - Permite definir la anchura del componente.\r\n   * @property {integer} height - Permite difinir la altura del componente.\r\n   * @property {boolean} [tabsAtBottom=false] - Parámetro que determina si las pestañas se van a mostrar en la parte inferior en vez de en la superior\r\n   *\r\n   *\r\n   */\n\n  $.fn.rup_tabs.defaults = {\n    ajaxOptions: {},\n    cache: true,\n    cookie: null,\n    show: null,\n    hide: null,\n    panelTemplate: '<div></div>',\n    profun: 0,\n    active: 0,\n    //deprecated selected option, ahora es active\n    //eventos\n    create: null,\n    beforeActivate: null,\n    load: null,\n    activate: null,\n    //deprecated show event, ahora es activate\n    add: null,\n    remove: null,\n    enable: null,\n    disable: null,\n    tabsAtBottom: false\n  };\n  /* **********/\n\n  /* EVENTOS */\n\n  /* **********/\n\n  /**\r\n   * Se lanza cada vez que se crea una pestaña\r\n   * @event module:rup_tabs#create\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ create: function(){...} });\r\n   */\n\n  /**\r\n   * Se lanza el evento cada vez que se hace click sobre una pestaña\r\n   * @event module:rup_tabs#select\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ select: function(){...} });\r\n   */\n\n  /**\r\n   * Este evento se desencadena después de que el contenido de una pestaña se ha cargado.\r\n   * @event module:rup_tabs#load\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ load: function(){...} });\r\n   */\n\n  /**\r\n   * Este evento ocurre cuando una pestaña está preparada para ser mostrada.\r\n   * @event module:rup_tabs#activate\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ activate: function(){...} });\r\n   */\n\n  /**\r\n   * Este evento se desencadena cuando se añade una pestaña\r\n   * @event module:rup_tabs#add\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ add: function(){...} });\r\n   */\n\n  /**\r\n   * Este evento se desencadena cuando se elimina una pestaña\r\n   * @event module:rup_tabs#remove\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ remove: function(){...} });\r\n   */\n\n  /**\r\n   * Este evento se desencadena cuando se habilita una pestaña\r\n   * @event module:rup_tabs#enable\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ enable: function(){...} });\r\n   */\n\n  /**\r\n   * Este evento se desencadena cuando se deshabilita una pestaña\r\n   * @event module:rup_tabs#disable\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(selector).rup_tabs ({ disable: function(){...} });\r\n   */\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.tabs.js?");

/***/ }),

/***/ "./src/rup.time.js":
/*!*************************!*\
  !*** ./src/rup.time.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * El usuario puede introducir y seleccionar una hora tanto de forma manual como visual, moviéndose fácilmente por las horas y los minutos, recibiendo ayudas y sugerencias para minimizar las posibilidades de introducir una hora incorrecta.\r\n *\r\n * @summary Componente RUP Time.\r\n * @module rup_time\r\n * @example\r\n * var properties = {\r\n *   labelMaskId : \"hora-mask\",\r\n *   showSecond : true,\r\n *   timeFormat: 'hh:mm:ss',\r\n *   showButtonPanel: true\r\n * };\r\n *\r\n * $(\"#idTime\").rup_time(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./core/ui/jquery-ui.timepicker */ \"./src/core/ui/jquery-ui.timepicker.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  var rup_time = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_time', rup_time)); // DEFINICIÓN DE MÉTODOS PÚBLICOS\n\n  $.fn.rup_time('extend', {\n    /**\r\n    * Método utilizado para obtener el valor del componente. Este método es el utilizado por el resto de componentes RUP para estandarizar la obtención del valor.\r\n    *\r\n    * @name getRupValue\r\n    * @function\r\n    * @return {string} - Devuelve el valor actual del componente seleccionado por el usuario.\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"getRupValue\");\r\n    */\n    getRupValue: function getRupValue() {\n      var timeformat, dateObj;\n      timeformat = $(this).data('datepicker').settings.timeFormat;\n      dateObj = $.datepicker.parseTime(timeformat, $(this).rup_time('getTime'));\n      return dateObj ? $.datepicker.formatTime('hh:mm:ss', dateObj) : '';\n    },\n\n    /**\r\n    * Método utilizado para asignar el valor al componente. Este método es el utilizado por el resto de componentes RUP para estandarizar la asignación del valor.\r\n    *\r\n    * @name setRupValue\r\n    * @function\r\n    * @param {string} param - Valor que se va a asignar al componente. En caso de tratarse de uan configuración en la que se permite seleccionar varias fechas se indicará mediante un array.\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"setRupValue\", \"10:25:16\");\r\n    */\n    setRupValue: function setRupValue(param) {\n      var timeformat, tmpDate, formattedTime;\n      timeformat = $(this).data('datepicker').settings.timeFormat;\n      tmpDate = $.datepicker.parseTime('hh:mm:ss', param);\n\n      if (!tmpDate) {\n        // se añade la mascara de seg por sino se ha metido.\n        tmpDate = $.datepicker.parseTime('hh:mm:ss', param + \":00\");\n      }\n\n      formattedTime = tmpDate ? $.datepicker.formatTime(timeformat, tmpDate) : '';\n      $(this).val(formattedTime);\n    },\n\n    /**\r\n    * Elimina el componente de la pantalla. En caso de tener máscara también se restaura el label con un texto vacío.\r\n    *\r\n    * @name destroy\r\n    * @function\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"destroy\");\r\n    */\n    destroy: function destroy() {\n      //Eliminar máscara\n      var labelMaskId = $(this).data('datepicker').settings.labelMaskId;\n\n      if (labelMaskId) {\n        $('#' + labelMaskId).text('');\n      } //Eliminar imagen (reloj)\n\n\n      $(this).next('img').remove();\n      $(this).timepicker('destroy');\n    },\n\n    /**\r\n    * Deshabilita el componente en pantalla no pudiendo introducirse ninguna hora ni se despliega el calendario.\r\n    *\r\n    * @name disable\r\n    * @function\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"disable\");\r\n    */\n    disable: function disable() {\n      $(this).timepicker('disable');\n    },\n\n    /**\r\n    * Habilita el componente permitiendo introducir la hora tanto mediante teclado como mediante el desplegable.\r\n    *\r\n    * @name enable\r\n    * @function\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"enable\");\r\n    */\n    enable: function enable() {\n      $(this).timepicker('enable');\n    },\n\n    /**\r\n    * Indica si el componente se encuentra deshabilitado o no.\r\n    *\r\n    * @name isDisabled\r\n    * @function\r\n    * @return {boolean} - Determina si el componente está deshabilitado o no.\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"isDisabled\");\r\n    */\n    isDisabled: function isDisabled() {\n      return $(this).timepicker('isDisabled');\n    },\n\n    /**\r\n    * Oculta el desplegable para seleccionar una hora.\r\n    *\r\n    * @function\r\n    * @name hide\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"hide\");\r\n    */\n    hide: function hide() {\n      $('#ui-datepicker-div').css('display', 'none');\n    },\n\n    /**\r\n    * Muestra el desplegable para seleccionar una hora.\r\n    *\r\n    * @function\r\n    * @name show\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"show\");\r\n    */\n    show: function show() {\n      $(this).timepicker('show');\n    },\n\n    /**\r\n    * Devuelve la hora seleccionada, si no se ha seleccionado nada devuelve vacío.\r\n    *\r\n    * @name getTime\r\n    * @function\r\n    * @return {string} - Devuelve la hora seleccionada por el usuario utilizando.\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"getTime\");\r\n    */\n    getTime: function getTime() {\n      return $(this).val();\n    },\n\n    /**\r\n    * Establece la hora del componente.\r\n    *\r\n    * @name setTime\r\n    * @function\r\n    * @return {date} time - Hora que se desea asignar al componente.\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"setTime\", time);\r\n    */\n    setTime: function setTime(time) {\n      $(this).timepicker('refresh'); //Necesario para 'inicializar' el componente\n      //Consideramos que el uso de esta función es una seleccion.\n\n      if ($(this).data('datepicker').settings.onSelect) {\n        $(this).data('datepicker').settings.onSelect();\n      }\n\n      $.datepicker._setTime($.datepicker._getInst($('#' + $(this).data('datepicker').settings.id)[0]), time);\n    },\n\n    /**\r\n    * Refresca el calendario desplegado por si ha habido algún cambio.\r\n    *\r\n    * @name refresh\r\n    * @function\r\n    * @example\r\n    * $(\"#idTime\").rup_time(\"refresh\");\r\n    */\n    refresh: function refresh() {\n      $(this).timepicker('refresh');\n    },\n\n    /**\r\n    * Permite consultar y modificar la configuración del componente.\r\n    *\r\n    * @name option\r\n    * @param {string | object} optionName - Nombre de la propiedad que se desea gestionar o objeto de compuesto de varias propiedades.\r\n    * @param {*} [value] - Corresponde al valor de la propiedad en caso de haberse especificado el nombre de la misma en el primér parámetro.\r\n    * @function\r\n    * @example\r\n    * // Consultar una propiedad\r\n    * $(\"#idTime\").rup_time(\"option\", \"showSecond\");\r\n    * // Establecer una propiedad\r\n    * $(\"#idTime\").rup_time(\"option\", \"showSecond\", true);\r\n    * // Establecer varias propiedad\r\n    * $(\"#idTime\").rup_time(\"option\", {showSecond: true, showButtonPanel: true});\r\n    */\n    option: function option(optionName, value) {\n      //JqueryUI.timepicker no trae método option por defecto. Lo implementamos aquí.\n      if (value === undefined) {\n        return $(this).data('datepicker').settings[optionName];\n      } else {\n        $(this).data('datepicker').settings[optionName] = value;\n      }\n    } //No soportadas: widget, dialog\n\n  }); // DEFINICIÓN DE MÉTODOS PRIVADOS\n\n  $.fn.rup_time('extend', {\n    /**\r\n    * Método de inicialización del componente\r\n    *\r\n    * @name _init\r\n    * @function\r\n    * @private\r\n    */\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        //Se recogen y cruzan las paremetrizaciones del objeto\n        var $self = $(this),\n            self = $self[0],\n            settings = $.extend({}, $.fn.rup_time.defaults, args[0]);\n        self._ADAPTER = $.rup.adapter[settings.adapter]; //Se carga el identificador del padre del patron\n\n        settings.id = $self.attr('id');\n        $self.attr('ruptype', 'time'); //Carga de propiedades/literales\n\n        var literales = $.rup.i18n.base.rup_time;\n\n        for (var key in literales) {\n          $.timepicker._defaults[key] = literales[key];\n        } //Mostrar máscara\n\n\n        if (settings.labelMaskId) {\n          $('#' + settings.labelMaskId).text($.rup.i18nParse($.rup.i18n.base, 'rup_time.mask') + ' ');\n        } //Mostrar placeholder\n\n\n        if (settings.placeholderMask) {\n          $self.attr('placeholder', $.rup.i18nParse($.rup.i18n.base, 'rup_time.mask'));\n        } //Imagen del reloj\n\n\n        settings.buttonImage = $.rup.STATICS + (settings.buttonImage ? settings.buttonImage : '/rup/css/images/clock.png'); //Atributos NO MODIFICABLES\n        //Timepicker\n\n        $self.timepicker(settings); //Max-Length\n        //$(\"#\"+settings.id).attr(\"maxlength\",literales[\"mask\"].length-2);\n        //Añadir imagen\n\n        self._ADAPTER.initIconTrigger.bind($self)(settings); //Ajuste para el comportamiento de portales\n\n\n        if ($.rup_utils.aplicatioInPortal() && !$self.is('div')) {\n          $('.r01gContainer').append($('.ui-datepicker:not(.r01gContainer .ui-datepicker)'));\n        } //Deshabilitar\n\n\n        if (settings.disabled) {\n          $self.rup_time('disable');\n        } // Se aplica el tooltip\n\n\n        $self.parent().find('[title]').rup_tooltip({\n          'applyToPortal': true\n        }); //Se audita el componente\n\n        $.rup.auditComponent('rup_time', 'init');\n      }\n    }\n  }); // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n\n  $.fn.rup_time.defaults = {\n    adapter: 'time_material',\n    placeholderMask: false,\n    stepHour: 1,\n    stepMinute: 1,\n    stepSecond: 1,\n    showButtonPanel: false,\n    timeOnly: true\n  }; //Sobreescribir EVENTOS\n\n  $.datepicker._timepicker_doKeyPress = $.datepicker._doKeyPress;\n\n  $.datepicker._doKeyPress = function (event) {\n    var instance = $.datepicker._get($.datepicker._getInst(event.target), 'timepicker');\n\n    switch (event.keyCode) {\n      //Izquierda\n      case 37:\n        if (event.ctrlKey && !(event.altKey || event.shiftKey)) {\n          //Ctrl\n          instance.hour_slider.slider('option', 'value', instance.hour_slider.slider('option', 'value') - instance._defaults.stepHour);\n        } else if (event.ctrlKey && event.shiftKey && !event.altKey) {\n          //Ctrl + Shift\n          instance.minute_slider.slider('option', 'value', instance.minute_slider.slider('option', 'value') - instance._defaults.stepMinute);\n        } else if (event.ctrlKey && event.shiftKey && event.altKey) {\n          //Ctrl + Shfit + Alt\n          instance.second_slider.slider('option', 'value', instance.second_slider.slider('option', 'value') - instance._defaults.stepSecond);\n        }\n\n        break;\n      //Derecha\n\n      case 39:\n        if (event.ctrlKey && !(event.altKey || event.shiftKey)) {\n          //Ctrl\n          instance.hour_slider.slider('option', 'value', instance.hour_slider.slider('option', 'value') + instance._defaults.stepHour);\n        } else if (event.ctrlKey && event.shiftKey && !event.altKey) {\n          //Ctrl + Shift\n          instance.minute_slider.slider('option', 'value', instance.minute_slider.slider('option', 'value') + instance._defaults.stepMinute);\n        } else if (event.ctrlKey && event.shiftKey && event.altKey) {\n          //Ctrl + Shfit + Alt\n          instance.second_slider.slider('option', 'value', instance.second_slider.slider('option', 'value') + instance._defaults.stepSecond);\n        }\n\n        break;\n    }\n\n    if (instance) {\n      instance._onTimeChange();\n    }\n\n    return $.datepicker._timepicker_doKeyPress(event);\n  };\n  /**\r\n  * @description Propiedades de configuración del componente.\r\n  *\r\n  * @name defaults\r\n  *\r\n  * @property {boolean} [disabled=false] - Indica si el componente debe aparecer deshabilitado o no.\r\n  * @property {string} [labelMaskId] - Identificador del label que contendrá la máscara que indica el formato de la hora.\r\n  * @property {string} [timeFormat=hh:mm] - Formato en el que se muestra la hora. Los posibles modificadores son: <ul><li> h: modificador relativo a las horas. En caso de querer que las horas inferiores a 10 muestren el 0 deberá incluirse por duplicado (hh). </li><li> m: modificador relativo a los minutos. En caso de querer que las horas inferiores a 10 muestren el 0 deberá incluirse por duplicado (mm). </li><li>s: modificador relativo a los segundos. En caso de querer que las horas inferiores a 10 muestren el 0 deberá incluirse por duplicado (ss). </li></ul>\r\n  * @property {Integer} [hour=0] - Valor con el que se carga inicialmente las horas del componente..\r\n  * @property {Integer} [minute=0] - Valor con el que se carga inicialmente los minutos del componente.\r\n  * @property {Integer} [second=0] - Valor con el que se carga inicialmente los segundos del componente.\r\n  * @property {Integer} [hourMin=0] - Valor mínimo seleccionable en las horas del componente.\r\n  * @property {Integer} [hourMax=23] - Valor máximo seleccionable en las horas del componente.\r\n  * @property {Integer} [minuteMin=0] - Valor mínimo seleccionable en los minutos del componente.\r\n  * @property {Integer} [minuteMax=59] - Valor máximo seleccionable en los minutos del componente.\r\n  * @property {Integer} [secondMin=0] - Valor mínimo seleccionable en los segundos del componente.\r\n  * @property {Integer} [secondMax=59] - Valor mínimo seleccionable en los segundos del componente.\r\n  * @property {boolean} [showHour=true] - Indica si se muestran o no las horas.\r\n  * @property {boolean} [showMinute=true] - Indica si se muestran o no los minutos.\r\n  * @property {boolean} [showSecond=false] - Indica si se muestran o no los segundos.\r\n  * @property {Integer} [stepHour=1] - Establece el incremento de la barra de scroll relativa a las horas.\r\n  * @property {Integer} [stepMinute=1] - Establece el incremento de la barra de scroll relativa a los minutos.\r\n  * @property {Integer} [stepSecond=1] - establece el incremento de la barra de scroll relativa a los segundos.\r\n  * @property {Integer} [hourGrid=0] - Indica el intervalo de los números que aparecen bajo la barra de scroll relativa a las horas. Al pinchar sobre dichos números se selecciona ese valor.\r\n  * @property {Integer} [minuteGrid=0] - Indica el intervalo de los números que aparecen bajo la barra de scroll relativa a los minutos. Al pinchar sobre dichos números se selecciona ese valor.\r\n  * @property {Integer} [secondGrid=0] - Indica el intervalo de los números que aparecen bajo la barra de scroll relativa a los segundos. Al pinchar sobre dichos números se selecciona ese valor.\r\n  * @property {boolean} [showTime=true] - Determina si se desea mostrar o no la fecha en el desplegable.\r\n  * @property {boolean} [ampm=false] - Determina si en lugar de mostrar la hora en formato 0-24 se muestra con el literal am/pm.\r\n  * @property {boolean} [showButtonPanel=false] - Indica si se muestran los botones de la parte inferior (ahora y cerrar).\r\n  * @property {string} [mask] - Texto empleado para la máscara de la fecha. Su valor por defecto se obtiene del fichero de idioma.\r\n  * @property {string} [buttonText] - Texto alternativo de la imagen que se muestra junto al campo de la fecha. Su valor por defecto se obtiene del fichero de idioma.\r\n  * @property {string} [closeText] - Texto a mostrar en el botón que se muestra en el panel inferior (requiere el activarlo mediante el atributo showButtonPanel) para cerrar el desplegable. Su valor por defecto se obtiene del fichero de idioma..\r\n  * @property {string} [currentText] - Texto a mostrar en el botón que se muestra en el panel inferior (requiere el activarlo mediante el atributo showButtonPanel) para seleccionar la hora actual en el desplegable. Su valor por defecto se obtiene del fichero de idioma.\r\n  * @property {string} [timeOnlyTitle] - Texto que aparece en la cabecera del desplegable. Su valor por defecto se obtiene del fichero de idioma.\r\n  * @property {string} [timeText] - Texto que aparece delante de la hora seleccionada (en caso de que esté activo el atributo showTime). Su valor por defecto se obtiene del fichero de idioma.\r\n  * @property {string} [hourText] - Texto que aparece delante de la barra de scroll de selección de horas. Su valor por defecto se obtiene del fichero de idioma.\r\n  * @property {string} [minuteText] - Texto que aparece delante de la barra de scroll de selección de minutos. Su valor por defecto se obtiene del fichero de idioma.\r\n  * @property {string} [secondText] - Texto que aparece delante de la barra de scroll de selección de segundos. Su valor por defecto se obtiene del fichero de idioma.\r\n  */\n  //eventos\n\n  /**\r\n  * Permite asociar una función que se ejecutará cuando se modifique alguno de los valores del desplegable (hora, minutos o segundos). Los parámetros recibidos son la hora seleccionada (texto) y la instancia del componente\r\n  * @event module:rup_time#onSelect\r\n  * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n  * @example\r\n  * $(selector).rup_time({ onSelect: function(dateText, inst){...} });\r\n  */\n\n  /**\r\n  * Permite asociar una función que se ejecutará cuando se oculte el desplegable. Los parámetros recibidos son la hora seleccionada (texto) y la instancia del componente\r\n  * @event module:rup_time#onClose\r\n  * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n  * @example\r\n  * $(selector).rup_time({ onClose: function(dateText, inst){...} });\r\n  */\n\n});\n\n//# sourceURL=webpack://rup/./src/rup.time.js?");

/***/ }),

/***/ "./src/rup.toolbar.js":
/*!****************************!*\
  !*** ./src/rup.toolbar.js ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Se les presenta a los usuarios una barra de botones con diversas funcionalidades relacionadas a elementos de la página. Gracias a este componente se presentan, ordenan y agrupan las distintas funcionalidades gestionadas por las aplicaciones.\r\n *\r\n * @summary Componente RUP Toolbar.\r\n * @module rup_toolbar\r\n * @example\r\n * var properties = {\r\n *\twidth: 1000,\r\n *\tbuttons:[\r\n *\t\t{i18nCaption:\"buscar\", css:\"buscar\", click: handlerBoton },\r\n *       {i18nCaption:\"editar\", css:\"editar\", click: handlerMButtons},\r\n *\t\t{id : \"mbuton2\", i18nCaption:\"ficheros\", buttons:[\r\n *\t\t    {i18nCaption:\"DLL\", css:\"dll\", click: handlerMButtons },\r\n *\t\t\t{i18nCaption:\"DOC\", css:\"doc\", click: handlerMButtons},\r\n *\t\t\t{i18nCaption:\"EXE\", css:\"exe\", click: handlerMButtons},\r\n *\t\t\t{i18nCaption:\"GIF\", css:\"gif\", click: handlerMButtons},\r\n *\t\t]},\r\n *\t\t{i18nCaption:\"filtrar\", css:\"filtrar\", click: handlerMButtons}\r\n *\t]\r\n * };\r\n *\r\n * $(\"#idToolbar\").rup_toolbar(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! block-ui */ \"./node_modules/block-ui/jquery.blockUI.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.rup_toolbar = $.rup_toolbar || {};\n  $.extend($.rup_toolbar, {\n    extend: function extend(methods) {\n      $.fn.extend(methods);\n    }\n  });\n  /**\r\n   * Función de callback a ejecutar cuando se realiza un click sobre un botón de la botonera.\r\n   *\r\n   * @callback module:rup_toolbar~buttonClick\r\n   * @param {Event} event - Objeto correspondiente al evento click realizado sobre el botón.\r\n   * @param {string} event.data.id - Identificador del botón que ha lanzado el evento.\r\n   * @param {string} event.data.caption - Texto del botón que ha lanzado el evento.\r\n   * @example\r\n   * var newButton = {\r\n   *   i18nCaption:\"editButton\",\r\n   *   click: function(event){\r\n   *\r\n   *   }\r\n   * };\r\n   *\r\n   * $(\"#idToolbar\").rup_toolbar(\"addButton\", newButton);\r\n   */\n\n  /**\r\n   * Definición del tipo de objeto que representa un botón de la botonera.\r\n   *\r\n   * @typedef {Object} module:rup_toolbar~button\r\n   * @property {string} [id] - Identificador único del botón con menú.\r\n   * @property {string} [i18nCaption] - Texto que se mostrará en el botón. Se indica el key del literar que se obtendrá de los ficheros de internacionalización correspondientes.\r\n   * @property {string} [css] - Define el estilo a aplicar. Se utilizará para mostrar imágenes a la izquierda del botón.\r\n   * @property {boolean} [right=false] - Determina si el botón aparece alineado a la derecha (true) o a la izquierda (false).\r\n   * @property {module:rup_toolbar~buttonClick} click - Función javascript que se ejecutará cuando se pulse el botón al que se ha asociado.\r\n   */\n\n  /**\r\n   * Definición del tipo de objeto que representa un mButton de la botonera.\r\n   *\r\n   * @typedef {Object} module:rup_toolbar~mButton\r\n   * @property {string} id - Identificador único del botón con menú.\r\n   * @property {string} [i18nCaption] - Texto que se mostrará en el botón. Se indica el key del literar que se obtendrá de los ficheros de internacionalización correspondientes.\r\n   * @property {string} [css] - Define el estilo a aplicar. Se utilizará para mostrar imágenes a la izquierda del botón.\r\n   * @property {boolean} [right=false] - Determina si el botón aparece alineado a la derecha (true) o a la izquierda (false).\r\n   * @property {module:rup_toolbar~button[]} buttons - Botones que va a incluir el botón con menú.\r\n   */\n  //Variable interna del toolbar para gestión de MButtons\n\n  $.rup_toolbar.showingMB = null;\n  $.rup_toolbar.extend({\n    /**\r\n     * Añade un nuevo botón a la botonera. Las características del botón se especifican en los parámetros del método.\r\n     *\r\n     * @name addButton\r\n     * @function\r\n     * @property {module:rup_toolbar~button} obj - Objeto que define el botón a añadir.\r\n     * @property {object} json_i18n - Objeto json con los recursos de i18n.\r\n     * @example\r\n     * var button = {\r\n     *   i18nCaption:\"editButton\",\r\n     *   css:\"editar\"\r\n     * };\r\n     *\r\n     * $(\"#idToolbar\").rup_date(\"addButton\", button);\r\n     */\n    addButton: function addButton(obj, json_i18n) {\n      return this[0]._ADAPTER.addButton.bind(this)(obj, json_i18n);\n    },\n\n    /**\r\n     * Añade un nuevo menu button a la botonera. Las características del mButton se especifican en los parámetros del método.\r\n     *\r\n     * @name addMButton\r\n     * @function\r\n     * @property {module:rup_toolbar~mButton} obj - Objeto que define el mButton a añadir.\r\n     * @property {object} json_i18n - Objeto json con los recursos de i18n.\r\n     * @example\r\n     * var mButton = {\r\n     *   id: \"mbuton1\", i18nCaption:\"otros\", buttons:[\r\n     *\t    {i18nCaption:\"nuevo\", css:\"nuevo\", click: handlerMButtons},\r\n     *       {i18nCaption:\"editar\", css:\"editar\", click: handlerMButtons},\r\n     *       {i18nCaption:\"cancelar\", css:\"cancelar\", click: handlerMButtons}\r\n     *   ]\r\n     * };\r\n     *\r\n     * $(\"#idToolbar\").rup_date(\"addMButton\", mButton);\r\n     */\n    addMButton: function addMButton(obj, json_i18n) {\n      if (obj.idParent === undefined) {\n        obj.idParent = this.id;\n      }\n\n      if (!obj.click) {\n        obj.click = this.showMButton;\n      }\n\n      return this[0]._ADAPTER.addMButton.bind(this)(obj, json_i18n);\n    },\n\n    /**\r\n     * Se añaden un conjunto de botones a un menu button existente.\r\n     *\r\n     * @name addButtonsToMButton\r\n     * @function\r\n     * @property {module:rup_toolbar~button[]} buttons - Array de botones a añadir al menu button.\r\n     * @property {string} menuButton - Identificador del menu button al que vamos a añadir los botones.\r\n     * @property {object} json_i18n - Objeto json con los recursos de i18n.\r\n     * @example\r\n     * var buttons = [\r\n     *\t    {i18nCaption:\"nuevo\", css:\"nuevo\", click: handlerMButtons},\r\n     *       {i18nCaption:\"editar\", css:\"editar\", click: handlerMButtons},\r\n     *       {i18nCaption:\"cancelar\", css:\"cancelar\", click: handlerMButtons}\r\n     * ];\r\n     *\r\n     * $(\"#idToolbar\").rup_date(\"addMButton\", \"mbuton1\", buttons);\r\n     */\n    addButtonsToMButton: function addButtonsToMButton(buttons, menuButton, json_i18n) {\n      return this[0]._ADAPTER.addButtonsToMButton.bind(this)(buttons, menuButton, json_i18n);\n    },\n\n    /**\r\n     * Se muestra la capa con los mButtons\r\n     *\r\n     * @function showMButton\r\n     * @example\r\n     * $(\"#idToolbar\").rup_date(\"showMButton\");\r\n     */\n    showMButton: function showMButton() {\n      //Muestra la capa con los mbuttons\n      var self = $(this),\n          showingMB = $.rup_toolbar.showingMB,\n          actualMB = this.id;\n\n      if (showingMB === actualMB) {\n        $('ul[id*=\\'' + showingMB + '\\']').slideUp('fast');\n        self.removeClass('rup-toolbar_menuButtonSlided');\n        showingMB = null; //Se pulsa sobre otro elemento\n      } else {\n        $('ul[id*=\\'' + showingMB + '\\']').slideUp('fast');\n        $('ul[id*=\\'' + actualMB + '\\']').slideDown('fast');\n        $('[id=\\'' + showingMB + '\\']').removeClass('rup-toolbar_menuButtonSlided');\n        self.addClass('rup-toolbar_menuButtonSlided');\n        showingMB = actualMB;\n      }\n\n      $.rup_toolbar.showingMB = showingMB;\n      return false;\n    },\n\n    /**\r\n     * Desabilita el botón correspondiente al identificador indicado.\r\n     *\r\n     * @function  disableButton\r\n     * @param {string} id - Identificador del botón que se desea deshabilitar.\r\n     * @example\r\n     * $(\"#idToolbar\").rup_date(\"disableButton\",\"idEditButton\");\r\n     */\n    disableButton: function disableButton(id) {\n      if (id.indexOf(this.attr('id')) === -1) {\n        id = this.attr('id') + '##' + id;\n      }\n\n      $('[id=\\'' + id + '\\']').button('disable').attr('disabled', true);\n    },\n\n    /**\r\n     * Habilita el botón correspondiente al identificador indicado.\r\n     *\r\n     * @function enableButton\r\n     * @param {string} id - Identificador del botón que se desea habilitar.\r\n     * @example\r\n     * $(\"#idToolbar\").rup_date(\"enableButton\",\"idEditButton\");\r\n     */\n    enableButton: function enableButton(id) {\n      if (id.indexOf(this.attr('id')) === -1) {\n        id = this.attr('id') + '##' + id;\n      }\n\n      $('[id=\\'' + id + '\\']').button('enable').attr('disabled', false);\n    },\n\n    /**\r\n     * Añade el estilo de css indicado para simular un estado press en el botón.\r\n     *\r\n     * @function pressButton\r\n     * @param {string} id - Identificador del botón.\r\n     * @param {string} css - Css asociado al estado press.\r\n     * @example\r\n     * $(\"#idToolbar\").rup_date(\"pressButton\",\"idEditButton\",\"preesed-button\");\r\n     */\n    pressButton: function pressButton(id, css) {\n      if (id.indexOf(this.attr('id')) === -1) {\n        id = this.attr('id') + '##' + id;\n      }\n\n      $('[id=\\'' + id + '\\']').addClass(css);\n    },\n\n    /**\r\n     * Elimina el estilo de css indicado para simular un estado press en el botón.\r\n     *\r\n     * @function  unpressButton\r\n     * @param {string} id - Identificador del botón.\r\n     * @param {string} css - Css asociado al estado press.\r\n     * @example\r\n     * $(\"#idToolbar\").rup_date(\"unpressButton\",\"idEditButton\",\"preesed-button\");\r\n     */\n    unpressButton: function unpressButton(id, css) {\n      if (id.indexOf(this.attr('id')) === -1) {\n        id = this.attr('id') + '##' + id;\n      }\n\n      $('[id=\\'' + id + '\\']').removeClass(css);\n    },\n\n    /**\r\n     * Alterna el estado del estilo de css indicado para simular un estado press en el botón.\r\n     *\r\n     * @function  tooglePressButton\r\n     * @param {string} id - Identificador del botón.\r\n     * @param {string} css - Css asociado al estado press.\r\n     * @example\r\n     * $(\"#idToolbar\").rup_date(\"tooglePressButton\",\"idEditButton\",\"preesed-button\");\r\n     */\n    tooglePressButton: function tooglePressButton(id, css) {\n      if (id.indexOf(this.attr('id')) === -1) {\n        id = this.attr('id') + '##' + id;\n      }\n\n      $('[id=\\'' + id + '\\']').toggleClass(css);\n    },\n\n    /**\r\n     * Actualiza el botón al estado que determina la configuración actual.\r\n     *\r\n     * @function  refresh\r\n     * @param {string} id - Identificador del botón.\r\n     * @example\r\n     * $(\"#idToolbar\").rup_date(\"refresh\");\r\n     */\n    refreshButton: function refreshButton(id) {\n      if (id.indexOf(this.attr('id')) === -1) {\n        id = this.attr('id') + '##' + id;\n      }\n\n      $('[id=\\'' + id + '\\']').button('refresh');\n    },\n\n    /**\r\n     * Configura la gestión de eventos de teclado en el botón.\r\n     *\r\n     * @function  _setKeyDown\r\n     * @private\r\n     * @param {object} boton - Referencia al button.\r\n     */\n    _setKeyDown: function _setKeyDown(boton) {\n      boton.on('keydown', function (event) {\n        var object = $(event.currentTarget),\n            objectParent = object.parent(),\n            nextObject;\n\n        switch (event.keyCode) {\n          case $.ui.keyCode.TAB:\n            if (!event.shiftKey) {\n              if (object.next().attr('id') !== objectParent.attr('id') + '-rightButtons') {\n                //Siguiente boton\n                nextObject = object.next(':focusable');\n              } else {\n                //Primer botón de los alineados derecha\n                nextObject = object.next().children(':focusable').first();\n              } //Navegar entre botones\n\n\n              if (nextObject.length === 1) {\n                nextObject.focus();\n                $.rup_toolbar.focusedExternally[objectParent.attr('id')] = true;\n                return false;\n              }\n            }\n\n        }\n      });\n    }\n  });\n\n  $.rup_toolbar.hideMButtons = function () {\n    var showingMB = $.rup_toolbar.showingMB;\n    $('ul[id*=\\'' + showingMB + '\\']').slideUp('fast');\n    $('[id=\\'' + showingMB + '\\']').removeClass('rup-toolbar_menuButtonSlided');\n    showingMB = null;\n    $.rup_toolbar.showingMB = showingMB;\n  };\n\n  $.fn.getTotalHeight = function () {\n    //Función auxilliar que obtiene el alto total del boton, teniendo en cuenta todos los posibles paddings\n    return $(this).height() + parseInt($(this).css('paddingTop')) + parseInt($(this).css('paddingBottom')) + parseInt($(this).css('borderTopWidth')) + parseInt($(this).css('borderBottomWidth'));\n  };\n\n  $.fn.rup_toolbar = function () {\n    for (var _len = arguments.length, properties = new Array(_len), _key = 0; _key < _len; _key++) {\n      properties[_key] = arguments[_key];\n    }\n\n    if (typeof properties[0] == 'string') {\n      this[properties[0]].apply(this, properties.splice(1));\n      return undefined;\n    }\n\n    return this.each(function () {\n      //Carga de los valores por defecto para los atributos que no ha introducido el usuario\n      var settings = $.extend({}, $.fn.rup_toolbar.defaults, properties[0]),\n          t = $(this),\n          json_i18n,\n          rightButtons = [];\n      this._ADAPTER = $.rup.adapter[settings.adapter]; //Se guarda el marcador de foco de la botonera\n\n      if ($.rup_toolbar.focusedExternally === undefined) {\n        $.rup_toolbar.focusedExternally = {};\n      }\n\n      $.rup_toolbar.focusedExternally[this.id] = false;\n      settings.id = this.id; //Literales\n\n      json_i18n = $.rup.i18n.app[settings.id]; //Anyadir estilo\n\n      t.addClass('rup-toolbar ui-widget-header ui-widget ui-widget-content'); //Tamanyo\n\n      if (settings.width != null) {\n        t.width(settings.width);\n      } //Asignar evento de ocultación de mbuttons cuando se pinche fuera de ellos\n\n\n      $(document).add('ul li').on('click', $.rup_toolbar.hideMButtons); //Botones\n\n      for (var i = 0; i < settings.buttons.length; i += 1) {\n        var obj = settings.buttons[i]; // Se apartan, para respetar la gestión del tabulador, los botones derechos para ser tratados posteriormente\n\n        if (!(obj.right !== undefined && obj.right === true)) {\n          //MButton\n          if (obj.buttons) {\n            // el boton dispone de una definicion de botones anidados, por lo que es un mbutton\n            var mbutton = t.addMButton($.extend({\n              idParent: this.id,\n              id: obj.id,\n              i18nCaption: obj.i18nCaption,\n              css: obj.css,\n              click: t.showMButton\n            }, obj), json_i18n);\n\n            if (mbutton !== null) {\n              t.addButtonsToMButton(obj.buttons, mbutton, json_i18n);\n            } //Button\n\n          } else {\n            t.addButton(obj, json_i18n);\n          }\n        } else {\n          rightButtons.push(obj);\n        }\n      }\n\n      for (var _i = 0; _i < rightButtons.length; _i += 1) {\n        var dObj = rightButtons[_i]; //MButton\n\n        if (dObj.buttons) {\n          // el boton dispone de una definicion de botones anidados, por lo que es un mbutton\n          var _mbutton = t.addMButton({\n            id: dObj.id,\n            i18nCaption: dObj.i18nCaption,\n            css: dObj.css,\n            click: t.showMButton,\n            right: dObj.right\n          }, json_i18n);\n\n          if (_mbutton !== null) {\n            t.addButtonsToMButton(dObj.buttons, _mbutton, json_i18n);\n          } //Button\n\n        } else {\n          t.addButton(dObj, json_i18n);\n        }\n      } //Se audita el componente\n\n\n      $.rup.auditComponent('rup_toolbar', 'init');\n    });\n  };\n  /* VALORES POR DEFECTO */\n\n\n  $.fn.rup_toolbar.defaults = {\n    width: null,\n    buttons: [],\n    mbuttons: null,\n    adapter: 'toolbar_material'\n  };\n  /**\r\n   * @description Propiedades de configuración del componente.\r\n   *\r\n   * @name options\r\n   * @property {Integer} [width=null] - Tamaño que tendrá la botonera. Por defecto ocupará toda la página.\r\n   * @property {module:rup_toolbar~button[]} [buttons] - Array de botones a mostrar.\r\n   * @property {module:rup_toolbar~mButton[]} [mbuttons] - Array de botones con menú a mostrar.\r\n   */\n});\n\n//# sourceURL=webpack://rup/./src/rup.toolbar.js?");

/***/ }),

/***/ "./src/rup.tooltip.js":
/*!****************************!*\
  !*** ./src/rup.tooltip.js ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Se les presenta a los usuarios una barra de botones con diversas funcionalidades relacionadas a elementos de la página. Gracias a este componente se presentan, ordenan y agrupan las distintas funcionalidades gestionadas por las aplicaciones.\r\n *\r\n * @summary Componente RUP Tooltip.\r\n * @module rup_tooltip\r\n * @see El componente está basado en el plugin {@link http://qtip2.com/options|qTip2}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://qtip2.com/options|aquí}.\r\n * @example\r\n * $(\"[title]\").rup_tooltip({});\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! qtip2 */ \"./node_modules/qtip2/dist/jquery.qtip.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_tooltip = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_tooltip', rup_tooltip)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_tooltip('extend', {\n    /**\r\n     * Muestra el tooltip.\r\n     *\r\n     * @function open\r\n     * @example\r\n     * $(\"#idTooltip\").rup_tooltip(\"open\");\r\n     */\n    open: function open() {\n      $(this).qtip('show', true);\n    },\n\n    /**\r\n     * Oculta el tooltip.\r\n     *\r\n     * @function close\r\n     * @example\r\n     * $(\"#idTooltip\").rup_tooltip(\"close\");\r\n     */\n    close: function close() {\n      $(this).qtip('hide', true);\n    },\n\n    /**\r\n     * Habilita el tooltip.\r\n     *\r\n     * @function  enable\r\n     * @example\r\n     * $(\"#idTooltip\").rup_tooltip(\"enable\");\r\n     */\n    enable: function enable() {\n      $(this).qtip('enable', true);\n    },\n\n    /**\r\n     * Deshabilita el tooltip.\r\n     *\r\n     * @function  disable\r\n     * @example\r\n     * $(\"#idTooltip\").rup_tooltip(\"disable\");\r\n     */\n    disable: function disable() {\n      $(this).rup_tooltip('close');\n      $(this).qtip('disable', true);\n    },\n\n    /**\r\n     * Elimina el tooltip.\r\n     *\r\n     * @function  destroy\r\n     * @example\r\n     * $(\"#idTooltip\").rup_tooltip(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      $(this).rup_tooltip('disable');\n      $(this).qtip('destroy');\n    },\n\n    /**\r\n     * Obtiene o establece la configuración del tooltip.\r\n     *\r\n     * @param {string} option - Nombre de la propiedad que se desea gestionar.\r\n     * @param {*} [value] - Corresponde al valor de la propiedad en caso de haberse especificado el nombre de la misma en el primér parámetro.\r\n     * @function  option\r\n     * @example\r\n     * // Obtener el valor de la posición\r\n     * $(\"#idTooltip\").rup_tooltip(\"option\", \"position\");\r\n     * // Establecer el valor de la posición\r\n     * $(\"#idTooltip\").rup_tooltip(\"option\", \"position\", {offset: \"15 15\"});\r\n     */\n    option: function option(_option, value) {\n      return $(this).qtip('option', _option, value);\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_tooltip('extend', {\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        if ($(this).length > 0) {\n          //Evitar invocaciones sin objetos (grid)\n          var settings = $.extend({}, $.fn.rup_tooltip.defaults, args[0]),\n              isGrid = this[0].className.indexOf('rup-grid') !== -1; //Identificador de la capa del tooltip\n\n          if (settings.id === undefined) {\n            settings.id = $(this).attr('id');\n          }\n\n          if (isGrid) {\n            $(this) //Modificar atributo 'title' por 'rup_tooltip'\n            .each(function (index, element) {\n              $.attr(this, 'rup_tooltip', $.attr(this, 'title'));\n\n              if (element.localName === 'img') {\n                $(element).parents('td').attr('rup_tooltip', $(element).attr('rup_tooltip'));\n              }\n            }) //Eliminar atributo 'title'\n            .removeAttr('title');\n            settings = {\n              content: ' ',\n              position: {\n                target: 'event',\n                effect: false\n              },\n              show: {\n                delay: settings.show.delay\n              },\n              hide: {\n                delay: 0 //Para que funcione correctamente en las tablas\n\n              },\n              events: {\n                show: function show(event, api) {\n                  var target = $(event.originalEvent.target);\n\n                  if (target.length) {\n                    //Recorrer hasta encontrar atributo o ser columna\n                    while (target.attr('rup_tooltip') === undefined && target[0].nodeName !== 'TD') {\n                      target = $(target).parent();\n                    } //Correción para datos vacíos\n\n\n                    api.set('content.text', target.attr('rup_tooltip') === '' ? ' ' : target.attr('rup_tooltip'));\n\n                    if (target.attr('rup_tooltip') === '' || target.attr('rup_tooltip') === ' ') {\n                      target.qtip('destroy');\n                    } //Si es última columna que comience en la izquierda\n                    //Obtenemos la columna (puede que el target sea A, IMG, ...)\n\n\n                    if (target[0].nodeName !== 'TD') {\n                      target = $(target).parents('td');\n                    } //Cambiamos posición tooltip\n\n\n                    if (target.nextAll('td:visible').length == 0) {\n                      api.set('position.my.x', 'right'); //Última columna\n                    } else {\n                      api.set('position.my.x', 'left'); //Otra columna\n                    } //Cambiamos el objetivo del tooltip (puede que el target sea A, IMG, ...)\n\n\n                    api.set('position.target', target);\n                  }\n                },\n                render: function render() {\n                  if ($.rup_utils.aplicatioInPortal()) {\n                    $('div.r01gContainer').append($(this));\n\n                    if ($('#qtip-overlay').length !== 0) {\n                      $('div.r01gContainer').append($('#qtip-overlay'));\n                    }\n                  }\n                }\n              }\n            }; //Unificar en una capa el TOOLTIP\n\n            $(this).qtip(settings);\n          } else {\n            var thisPortal;\n            thisPortal = this;\n\n            if (settings.open !== undefined) {\n              settings.events.show = settings.open;\n            }\n\n            if (settings.close !== undefined) {\n              settings.events.hide = settings.close;\n            }\n\n            settings.events.render = function () {\n              if ($.rup_utils.aplicatioInPortal()) {\n                $('div.r01gContainer').append($(this));\n\n                if ($('#qtip-overlay').length !== 0) {\n                  $('div.r01gContainer').append($('#qtip-overlay'));\n                }\n              }\n            };\n\n            $(thisPortal).qtip(settings);\n\n            if (settings.disabled) {\n              $(thisPortal).qtip('disable');\n            }\n          }\n        } //Se audita el componente\n        //$.rup.auditComponent('rup_tooltip', 'init');\n\n      }\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  $.fn.rup_tooltip.defaults = {\n    disabled: false,\n    applyToPortal: false,\n    show: {\n      delay: 0\n    },\n    //tooltip\n    position: {\n      my: 'top left',\n      at: 'bottom right',\n      target: 'event',\n      effect: false\n    },\n    events: {}\n  };\n  /**\r\n   * Función que se ejecutará cuando se muestre el tooltip.\r\n   *\r\n   * @callback jQuery.rup_tooltip~onOpen\r\n   * @example\r\n   * $(\"#idTooltip\").rup_tooltip({\r\n   *   open: function(){\r\n   *   }\r\n   * });\r\n   */\n\n  /**\r\n   * Función que se ejecutará cuando se oculte el tooltip.\r\n   *\r\n   * @callback jQuery.rup_tooltip~onClose\r\n   * @example\r\n   * $(\"#idTooltip\").rup_tooltip({\r\n   *   close: function(){\r\n   *   }\r\n   * });\r\n   */\n\n  /**\r\n   * @description Propiedades de configuración del componente.\r\n   * @see Para mas información consulte la documentación acerca de las opciones de configuración del plugin {@link http://qtip2.com/options|qTip2}.\r\n   *\r\n   * @name jQuery.rup_tooltip#options\r\n   * @property {boolean} [disabled=false] - booleano que indica si el tooltip está habilitado o no.\r\n   * @property {boolean} [applyToPortal=false] - Parámetro encargado de determinar si el componente tooltip se aplica, también, al código html adscrito a los portales de la infraestructura de EJIE. El parámetro acepta el valor true, para indicar que se aplique al portal, y el valor false, para indicar que no se aplique al portal.\r\n   * @property {object} [content] - Configura el texto del tooltip (si no se ha definido en el title).\r\n   * @property {string} [content.text] - Texto del tooltip.\r\n   * @property {string} [content.title] - Tooltip en formato diálogo y este parámetro define el título del mismo.\r\n   * @property {object} [position] - Configura la posición del tooltip y tiene (entre otros) los siguientes parámetros.\r\n   * @property {string} position.my=top left - Posición en la que es colocado el tooltip a mostrar parámetros.\r\n   * @property {string} position.at=bottom left - Posición respecto al objeto al que se aplica el tooltip.\r\n   * @property {string} position.target - Si se quiere definir sobre qué elemento debe aplicarse el tooltip. parámetros.\r\n   * @property {object} [show] - Configura el modo/evento en el que se despliega el tooltip.\r\n   * @property {string} show.event=mouseenter - Evento con el que se muestra el tooltip.\r\n   * @property {object} show.modal - Configura el modo/evento en el que se despliega el tooltip.\r\n   * @property {object} [hide] - Configura el modo/evento en el que se oculta el tooltip.\r\n   * @property {object} hide.event=mouseleave - Evento con el que se oculta el tooltip.\r\n   * @property {jQuery.rup_tooltip~onOpen} [open] - Permite asociar una función que se ejecutará cuando se muestre el tooltip.\r\n   * @property {jQuery.rup_tooltip~onClose} [close] - Permite asociar una función que se ejecutará cuando se oculte el tooltip.\r\n   */\n});\n\n//# sourceURL=webpack://rup/./src/rup.tooltip.js?");

/***/ }),

/***/ "./src/rup.tree.js":
/*!*************************!*\
  !*** ./src/rup.tree.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2013 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permite al usuario mostrar y ocultar de manera selectiva, información mostrada en una estructura jerárquica.\r\n *\r\n * @summary Componente RUP Tree.\r\n * @module rup_tree\r\n * @see El componente está basado en el plugin {@link https://www.jstree.com|jsTree}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link https://www.jstree.com/api|aquí}.\r\n * @example\r\n * $(\"#ejemploArbolDiv\").rup_tree(properties);\r\n *\r\n */\n\n/*global define */\n\n/*global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! jstree */ \"./node_modules/jstree/dist/jstree.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n  var rup_tree = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  jQuery.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_tree', rup_tree)); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  jQuery.fn.rup_tree('extend', {\n    // Métodos públicos propios del componente.\n\n    /**\r\n     * Método utilizado para obtener el valor del componente.\r\n     *\r\n     * @method\r\n     * @name getRupValue\r\n     * @return {string|number} - Devuelve el valor actual del componente seleccionado por el usuario.\r\n     * @example\r\n     * $(selector).rup_tree(\"getRupValue\");\r\n     */\n    getRupValue: function getRupValue() {\n      var $self = this,\n          settings = $self.data('settings'),\n          selectedItems,\n          tmpId,\n          name = $self.attr('name');\n\n      if (jQuery.inArray('checkbox', settings.plugins) !== -1) {\n        selectedItems = $self.rup_tree('getChecked', false);\n      } else {\n        selectedItems = $self.rup_tree('getSelected', false);\n      }\n\n      var returnArray = jQuery.map(selectedItems, function (item) {\n        var $item = jQuery('#' + item);\n\n        if (typeof settings.core.getValue === \"function\") {\n          return settings.core.getValue.bind($self)($item, $item.data());\n        }\n\n        return item ? item : $item.text();\n      });\n\n      if (settings.core.submitAsJSON) {\n        return jQuery.rup_utils.getRupValueAsJson(name, returnArray);\n      } else {\n        if (settings.core.submitAsString) {\n          return jQuery.rup_utils.getRupValueWrapped(name, returnArray.toString());\n        } else {\n          return jQuery.rup_utils.getRupValueWrapped(name, returnArray);\n        }\n      }\n    },\n\n    /**\r\n     * Método utilizado para asignar el valor al componente.\r\n     *\r\n     * @method\r\n     * @name setRupValue\r\n     * @param {string|number} values - Valor que se va a asignar al componente.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"setRupValue\", value);\r\n     */\n    setRupValue: function setRupValue(values) {\n      var $self = this,\n          settings = $self.data('settings'),\n          $items,\n          $item,\n          itemValue,\n          tmpId,\n          dataArray;\n\n      if (jQuery.inArray('checkbox', settings.plugins) >= 0) {\n        $self.rup_tree('uncheckAll');\n        $items = $self.jstree().get_container_ul().find('li');\n        dataArray = settings.core.readAsString === true ? values.split(',') : values;\n        jQuery.each($items, function (index, item) {\n          $item = jQuery(item);\n\n          if (typeof settings.core.getValue === \"function\") {\n            itemValue = settings.core.getValue.bind($self)($item, $item.data());\n          } else {\n            tmpId = $item.attr('id');\n            itemValue = tmpId ? tmpId : $item.text();\n          }\n\n          if (jQuery.inArray(itemValue, dataArray) !== -1) {\n            $self.rup_tree('checkNode', item);\n          }\n        });\n      } else {\n        if (typeof values !== 'string') {\n          throw Error('Invalid Args (setRupValue)');\n        }\n\n        if ($('li#' + values, $self).length === 1) {\n          $('li#' + values + ' > a', $self).click();\n        }\n      }\n    },\n\n    /**\r\n     * Establece el foco sobre el componente.\r\n     *\r\n     * @method\r\n     * @name setFocus\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"setFocus\");\r\n     */\n    setFocus: function setFocus() {\n      $(this).focus();\n    },\n\n    /**\r\n     * Quita el foco del componente.\r\n     *\r\n     * @method\r\n     * @name unsetFocus\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"unsetFocus\");\r\n     */\n    unsetFocus: function unsetFocus() {\n      $(this).blur();\n    },\n\n    /**\r\n     * Comprueba si el componente tiene el foco.\r\n     *\r\n     * @method\r\n     * @name isFocused\r\n     * @since UDA 5.1.0\r\n     * @return {boolean} - Confirma si el componente tiene el foco.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isFocused\");\r\n     */\n    isFocused: function isFocused() {\n      return $(this).is(\":focus\");\n    },\n    // Métodos públicos del core.\n\n    /**\r\n     * Destruye la instancia.\r\n     *\r\n     * @method\r\n     * @name destroy\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} [keep_html] - Permite mantener la estructura en el DOM.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"destroy\");\r\n     */\n    destroy: function destroy(keep_html) {\n      $(this).jstree('destroy', keep_html);\n    },\n\n    /**\r\n     * Crea un nodo prototipo.\r\n     *\r\n     * @method\r\n     * @name createPrototypeNode\r\n     * @since UDA 5.1.0\r\n     * @return {DOMElement}\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"createPrototypeNode\");\r\n     */\n    createPrototypeNode: function createPrototypeNode() {\n      return $(this).jstree('_create_prototype_node');\n    },\n\n    /**\r\n     * Devuelve el contenedor de la instancia.\r\n     *\r\n     * @method\r\n     * @name getContainer\r\n     * @since UDA 5.1.0\r\n     * @return {jQuery} - Contenedor de la instancia.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getContainer\");\r\n     */\n    getContainer: function getContainer() {\n      return $(this).jstree('get_container');\n    },\n\n    /**\r\n     * Obtiene la representación en JSON del nodo.\r\n     *\r\n     * @method\r\n     * @name getNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean} as_dom - Permite definir si devolverá un nodo de jQuery.\r\n     * @return {Object|jQuery} - Representación del nodo.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getNode\", obj, as_dom);\r\n     */\n    getNode: function getNode(obj, as_dom) {\n      return $(this).jstree('get_node', obj, as_dom);\n    },\n\n    /**\r\n     * Obtiene la ruta a un nodo utilizando el texto de los nodos o sus identificadores.\r\n     *\r\n     * @method\r\n     * @name getPath\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {string} glue - Cuando se requiera la ruta en string, se debe de pasar el \"pegamento\" como argumento (ej. `/`). \r\n     * En los demás casos, se devolerá un array.\r\n     * @param {boolean} ids - En caso verdadero se devolverá la ruta usando el identificador, de lo contrario, se usará el texto del nodo.\r\n     * @return {string|Array} - Ruta del nodo.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getPath\", obj, glue, ids);\r\n     */\n    getPath: function getPath(obj, glue, ids) {\n      return $(this).jstree('get_path', obj, glue, ids);\n    },\n\n    /**\r\n     * Devuelve el siguiente nodo visible que esté por debajo del nodo pasado como argumento.\r\n     *\r\n     * @method\r\n     * @name getNextDom\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean} strict - En caso verdadero solo se devolverán los nodos hermanos.\r\n     * @return {jQuery} - Siguiente nodo visible.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getNextDom\", obj, strict);\r\n     */\n    getNextDom: function getNextDom(obj, strict) {\n      return $(this).jstree('get_next_dom', obj, strict);\n    },\n\n    /**\r\n     * Devuelve el anterior nodo visible que esté por encima del nodo pasado como argumento.\r\n     *\r\n     * @method\r\n     * @name getPrevDom\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean} strict - En caso verdadero solo se devolverán los nodos hermanos.\r\n     * @return {jQuery} - Anterior nodo visible.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getPrevDom\", obj, strict);\r\n     */\n    getPrevDom: function getPrevDom(obj, strict) {\n      return $(this).jstree('get_prev_dom', obj, strict);\n    },\n\n    /**\r\n     * Devuelve el identificador del nodo padre.\r\n     *\r\n     * @method\r\n     * @name getParent\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {string} - Identificador del nodo padre.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getParent\", obj);\r\n     */\n    getParent: function getParent(obj) {\n      return $(this).jstree('get_parent', obj);\n    },\n\n    /**\r\n     * Devuelve una colección de los hijos de un nodo (deben de ser visibles).\r\n     *\r\n     * @method\r\n     * @name getChildrenDom\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {jQuery|boolean} - Colección de hijos o booleano falso (significa que algo fue mal).\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getChildrenDom\", obj);\r\n     */\n    getChildrenDom: function getChildrenDom(obj) {\n      return $(this).jstree('get_children_dom', obj);\n    },\n\n    /**\r\n     * Comprueba si un nodo tiene hijos.\r\n     *\r\n     * @method\r\n     * @name isParent\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Devuelve si es o no padre.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isParent\", obj);\r\n     */\n    isParent: function isParent(obj) {\n      return $(this).jstree('is_parent', obj);\n    },\n\n    /**\r\n     * Comprueba si un nodo ha sido cargado (los hijos han de estar disponibles).\r\n     *\r\n     * @method\r\n     * @name isLoaded\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si ha sido cargado.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isLoaded\", obj);\r\n     */\n    isLoaded: function isLoaded(obj) {\n      return $(this).jstree('is_loaded', obj);\n    },\n\n    /**\r\n     * Comprueba si un nodo está siendo cargado (los hijos han de cargándose).\r\n     *\r\n     * @method\r\n     * @name isLoading\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo está siendo cargado.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isLoading\", obj);\r\n     */\n    isLoading: function isLoading(obj) {\n      return $(this).jstree('is_loading', obj);\n    },\n\n    /**\r\n     * Comprueba si un nodo está desplegado.\r\n     *\r\n     * @method\r\n     * @name isOpen\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo se encuentra desplegado.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isOpen\", obj);\r\n     */\n    isOpen: function isOpen(obj) {\n      return $(this).jstree('is_open', obj);\n    },\n\n    /**\r\n     * Comprueba si un nodo está contraído.\r\n     *\r\n     * @method\r\n     * @name isClosed\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo se encuentra contraído.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isClosed\", obj);\r\n     */\n    isClosed: function isClosed(obj) {\n      return $(this).jstree('is_closed', obj);\n    },\n\n    /**\r\n     * Comprueba si un nodo no tiene hijos.\r\n     *\r\n     * @method\r\n     * @name isLeaf\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo no tiene hijos.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isLeaf\", obj);\r\n     */\n    isLeaf: function isLeaf(obj) {\n      return $(this).jstree('is_leaf', obj);\n    },\n\n    /**\r\n     * Carga un nodo (obtiene los hijos mediante el ajuste `core.data`). \r\n     * Es posible cargar múltiples nodos pasando un array como argumento.\r\n     *\r\n     * @method\r\n     * @name loadNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a cargar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {function} callback - Función a ejecutar cuando la carga del nodo haya sido completada. Se ejecuta en\r\n     *  el ámbito de la instancia y recibe dos parámetros, el nodo y un estado de tipo booleano.\r\n     * @return {boolean} - Notifica si la carga fue realizada.\r\n     * @fires load_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"loadNode\", obj, callback);\r\n     */\n    loadNode: function loadNode(obj, callback) {\n      return $(this).jstree('load_node', obj, callback);\n    },\n\n    /**\r\n     * Carga todos los nodos.\r\n     *\r\n     * @method\r\n     * @name loadAll\r\n     * @since UDA 5.1.0\r\n     * @param {*} [obj] - Nodo a cargar de forma recursiva. De omitirlo, se cargarían todos los nodos del árbol.\r\n     * @param {function} callback - Función a ejecutar cuando la carga de los nodos haya sido completada.\r\n     * @fires load_all.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"loadAll\", obj, callback);\r\n     */\n    loadAll: function loadAll(obj, callback) {\n      $(this).jstree('load_all', obj, callback);\n    },\n\n    /**\r\n     * Vuelve a dibujar los nodos que así lo requieran.\r\n     *\r\n     * @method\r\n     * @name redraw\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, todos los nodos del árbol volverán a ser dibujados.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"redraw\", full);\r\n     */\n    redraw: function redraw(full) {\n      $(this).jstree('redraw', full);\n    },\n\n    /**\r\n     * Vuelve a dibujar los nodos que así lo requieran.\r\n     *\r\n     * @method\r\n     * @name openNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a abrir. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {function} callback - Función a ejecutar cuando el nodo haya sido abierto.\r\n     * @param {number|boolean} animation - Duración de la animación de apertura del nodo en milisegundos (sobrescribe el\r\n     * ajuste `core.animation`). Utilizar `false` para deshabilitar la animación.\r\n     * @fires open_node.jstree, after_open.jstree, before_open.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"openNode\", obj, callback, animation);\r\n     */\n    openNode: function openNode(obj, callback, animation) {\n      $(this).jstree('open_node', obj, callback, animation);\n    },\n\n    /**\r\n     * Cierra el nodo, ocultando sus hijos.\r\n     *\r\n     * @method\r\n     * @name closeNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a cerrar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {number|boolean} animation - Duración de la animación de apertura del nodo en milisegundos (sobrescribe el\r\n     * ajuste `core.animation`). Utilizar `false` para deshabilitar la animación.\r\n     * @fires close_node.jstree, after_close.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"closeNode\", obj, animation);\r\n     */\n    closeNode: function closeNode(obj, animation) {\n      $(this).jstree('close_node', obj, animation);\n    },\n\n    /**\r\n     * Alterna el estado de un nodo, cerrándolo si está abierto o abriéndolo si está cerrado.\r\n     *\r\n     * @method\r\n     * @name toggleNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"toggleNode\", obj);\r\n     */\n    toggleNode: function toggleNode(obj) {\n      $(this).jstree('toggle_node', obj);\n    },\n\n    /**\r\n     * Abre todos los nodos que se encuentren dentro de un nodo o de un árbol y a su vez muestra todos sus hijos.\r\n     * Si el nodo no ha sido cargado previamente, será cargado y abierto una vez esté listo.\r\n     *\r\n     * @method\r\n     * @name openAll\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a abrir de forma recursiva. Permite usar el elemento del DOM, el identificador, el selector, etc. Si se omite,\r\n     * se abrirán todos los nodos del árbol.\r\n     * @param {number|boolean} animation - Duración de la animación de apertura del nodo en milisegundos (sobrescribe el\r\n     * ajuste `core.animation`). Utilizar `false` para deshabilitar la animación.\r\n     * @param {jQuery} original_obj - Referencia al nodo que inició el proceso (uso interno del componente subyacente).\r\n     * @fires open_all.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"openAll\", obj, animation, original_obj);\r\n     */\n    openAll: function openAll(obj, animation, original_obj) {\n      $(this).jstree('open_all', obj, animation, original_obj);\n    },\n\n    /**\r\n     * Cierra todos los nodos que se encuentren dentro de un nodo o de un árbol.\r\n     *\r\n     * @method\r\n     * @name closeAll\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a cerrar de forma recursiva. Permite usar el elemento del DOM, el identificador, el selector, etc. Si se omite,\r\n     * se cerrarán todos los nodos del árbol.\r\n     * @param {number|boolean} animation - Duración de la animación de apertura del nodo en milisegundos (sobrescribe el\r\n     * ajuste `core.animation`). Utilizar `false` para deshabilitar la animación.\r\n     * @fires close_all.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"closeAll\", obj, animation);\r\n     */\n    closeAll: function closeAll(obj, animation) {\n      $(this).jstree('close_all', obj, animation);\n    },\n\n    /**\r\n     * Comprueba si el nodo está desactivado (no es seleccionable).\r\n     *\r\n     * @method\r\n     * @name isDisabled\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo está desactivado.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isDisabled\", obj);\r\n     */\n    isDisabled: function isDisabled(obj) {\n      return $(this).jstree('is_disabled', obj);\n    },\n\n    /**\r\n     * Habilita un nodo para permitir su selección.\r\n     *\r\n     * @method\r\n     * @name enableNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a habilitar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @fires enable_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"enableNode\", obj);\r\n     */\n    enableNode: function enableNode(obj) {\n      $(this).jstree('enable_node', obj);\n    },\n\n    /**\r\n     * Deshabilita un nodo para no permitir su selección.\r\n     *\r\n     * @method\r\n     * @name disableNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a deshabilitar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @fires disable_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"disableNode\", obj);\r\n     */\n    disableNode: function disableNode(obj) {\n      $(this).jstree('disable_node', obj);\n    },\n\n    /**\r\n     * Determina si un nodo está oculto.\r\n     *\r\n     * @method\r\n     * @name isHidden\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo está oculto.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isHidden\", obj);\r\n     */\n    isHidden: function isHidden(obj) {\n      return $(this).jstree('is_hidden', obj);\n    },\n\n    /**\r\n     * Oculta un nodo. Permanecerá en la estructura pero no será visible.\r\n     *\r\n     * @method\r\n     * @name hideNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a ocultar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean} skip_redraw - Argumento interno del componente subyacente que controla si se llama o no al método `redraw`.\r\n     * @fires hide_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideNode\", obj, skip_redraw);\r\n     */\n    hideNode: function hideNode(obj, skip_redraw) {\n      $(this).jstree('hide_node', obj, skip_redraw);\n    },\n\n    /**\r\n     * Muestra un nodo.\r\n     *\r\n     * @method\r\n     * @name showNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a mostrar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean} skip_redraw - Argumento interno del componente subyacente que controla si se llama o no al método `redraw`.\r\n     * @fires show_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showNode\", obj, skip_redraw);\r\n     */\n    showNode: function showNode(obj, skip_redraw) {\n      $(this).jstree('show_node', obj, skip_redraw);\n    },\n\n    /**\r\n     * Oculta todos los nodos.\r\n     *\r\n     * @method\r\n     * @name hideAll\r\n     * @since UDA 5.1.0\r\n     * @fires hide_all.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideAll\");\r\n     */\n    hideAll: function hideAll() {\n      $(this).jstree('hide_all');\n    },\n\n    /**\r\n     * Muestra todos los nodos.\r\n     *\r\n     * @method\r\n     * @name showAll\r\n     * @since UDA 5.1.0\r\n     * @fires show_all.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showAll\");\r\n     */\n    showAll: function showAll() {\n      $(this).jstree('show_all');\n    },\n\n    /**\r\n     * Selecciona un nodo.\r\n     *\r\n     * @method\r\n     * @name selectNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a seleccionar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean} supress_event - Si se define a `true`, el evento `changed.jstree` no será lanzado.\r\n     * @param {boolean} prevent_open - Si se define a `true`, los padres del nodo seleccionado no serán abiertos.\r\n     * @fires select_node.jstree, changed.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"selectNode\", obj, supress_event, prevent_open);\r\n     */\n    selectNode: function selectNode(obj, supress_event, prevent_open) {\n      $(this).jstree('select_node', obj, supress_event, prevent_open);\n    },\n\n    /**\r\n     * Deselecciona un nodo.\r\n     *\r\n     * @method\r\n     * @name deselectNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a deseleccionar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean} supress_event - Si se define a `true`, el evento `changed.jstree` no será lanzado.\r\n     * @fires deselect_node.jstree, changed.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"deselectNode\", obj, supress_event);\r\n     */\n    deselectNode: function deselectNode(obj, supress_event) {\n      $(this).jstree('deselect_node', obj, supress_event);\n    },\n\n    /**\r\n     * Selecciona todos los nodos del árbol.\r\n     *\r\n     * @method\r\n     * @name selectAll\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} supress_event - Si se define a `true`, el evento `changed.jstree` no será lanzado.\r\n     * @fires select_all.jstree, changed.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"selectAll\", supress_event);\r\n     */\n    selectAll: function selectAll(supress_event) {\n      $(this).jstree('select_all', supress_event);\n    },\n\n    /**\r\n     * Deselecciona todos los nodos seleccionados.\r\n     *\r\n     * @method\r\n     * @name deselectAll\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} supress_event - Si se define a `true`, el evento `changed.jstree` no será lanzado.\r\n     * @fires deselect_all.jstree, changed.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"deselectAll\", supress_event);\r\n     */\n    deselectAll: function deselectAll(supress_event) {\n      $(this).jstree('deselect_all', supress_event);\n    },\n\n    /**\r\n     * Comprueba si un nodo se encuentra seleccionado.\r\n     *\r\n     * @method\r\n     * @name isSelected\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo se encuentra seleccionado.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isSelected\", obj);\r\n     */\n    isSelected: function isSelected(obj) {\n      return $(this).jstree('is_selected', obj);\n    },\n\n    /**\r\n     * Permite obtener un array de todos los nodos seleccionados.\r\n     *\r\n     * @method\r\n     * @name getSelected\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, el array devuelto contendrá los objetos completos de los nodos, \r\n     * de lo contrario, solo tendrá los identificadores.\r\n     * @return {Array} - Contiene los nodos seleccionados.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getSelected\", full);\r\n     */\n    getSelected: function getSelected(full) {\n      return $(this).jstree('get_selected', full);\n    },\n\n    /**\r\n     * Permite obtener un array de todos los nodos de alto nivel que estén seleccionados (ignora los hijos seleccionados).\r\n     *\r\n     * @method\r\n     * @name getTopSelected\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, el array devuelto contendrá los objetos completos de los nodos, \r\n     * de lo contrario, solo tendrá los identificadores.\r\n     * @return {Array} - Contiene los nodos de alto nivel seleccionados.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getTopSelected\", full);\r\n     */\n    getTopSelected: function getTopSelected(full) {\n      return $(this).jstree('get_top_selected', full);\n    },\n\n    /**\r\n     * Permite obtener un array de todos los nodos de bajo nivel que estén seleccionados (ignora los padres seleccionados).\r\n     *\r\n     * @method\r\n     * @name getBottomSelected\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, el array devuelto contendrá los objetos completos de los nodos, \r\n     * de lo contrario, solo tendrá los identificadores.\r\n     * @return {Array} - Contiene los nodos de alto nivel seleccionados.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getBottomSelected\", full);\r\n     */\n    getBottomSelected: function getBottomSelected(full) {\n      return $(this).jstree('get_bottom_selected', full);\n    },\n\n    /**\r\n     * Refresca el árbol. Todos los nodos son recargados con llamadas a `load_node`.\r\n     *\r\n     * @method\r\n     * @name refresh\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} skip_loading - Opción para evitar mostrar el indicador de carga.\r\n     * @param {boolean|function} forget_state - Si se define a `true` el estado no volverá a ser aplicado, en cambio, \r\n     * si se define una función que reciba el estado actual como parámetro, el resultado de esa función será usado como estado.\r\n     * @fires refresh.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"refresh\", skip_loading, forget_state);\r\n     */\n    refresh: function refresh(skip_loading, forget_state) {\n      $(this).jstree('refresh', skip_loading, forget_state);\n    },\n\n    /**\r\n     * Refresca un nodo del árbol incluyendo sus hijos. Todos los nodos hijos que estén desplegados son recargados con llamadas a `load_node`.\r\n     *\r\n     * @method\r\n     * @name refreshNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @fires refresh_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"refreshNode\", obj);\r\n     */\n    refreshNode: function refreshNode(obj) {\n      $(this).jstree('refresh_node', obj);\n    },\n\n    /**\r\n     * Establece (cambia) el identificador de un nodo.\r\n     *\r\n     * @method\r\n     * @name setId\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {string} id - El nuevo identificador a definir.\r\n     * @return {boolean} - Notifica si el proceso termina con éxito o no.\r\n     * @fires set_id.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"setId\", obj, id);\r\n     */\n    setId: function setId(obj, id) {\n      return $(this).jstree('set_id', obj, id);\n    },\n\n    /**\r\n     * Obtiene el texto de un nodo.\r\n     *\r\n     * @method\r\n     * @name getText\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {string} - Texto del nodo.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getText\", obj);\r\n     */\n    getText: function getText(obj) {\n      return $(this).jstree('get_text', obj);\n    },\n\n    /**\r\n     * Obtiene una representación en JSON del nodo o incluso del árbol completo.\r\n     *\r\n     * @method\r\n     * @name getJson\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {Object} options - Objeto con propiedades a usar para la obtención del JSON.\r\n     * @param {boolean} options.no_state - Para evitar la devolución de la información del estado.\r\n     * @param {boolean} options.no_id - Para evitar la devolución del identificador.\r\n     * @param {boolean} options.no_children - Para evitar la inclusión de los hijos.\r\n     * @param {boolean} options.no_data - Para evitar la inclusión de los datos del nodo.\r\n     * @param {boolean} options.no_li_attr - Para evitar la devolución de los atributos del elemento `li`.\r\n     * @param {boolean} options.no_a_attr - Para evitar la devolución de los atributos del elemento `a`.\r\n     * @param {boolean} options.flat - Para devolver un JSON plano en vez de anidado.\r\n     * @return {Object} - Representación en JSON.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getJson\", obj, options);\r\n     */\n    getJson: function getJson(obj, options) {\n      return $(this).jstree('get_json', obj, options);\n    },\n\n    /**\r\n     * Crea un nuevo nodo (no confundir con `load_node`).\r\n     *\r\n     * @method\r\n     * @name createNode\r\n     * @since UDA 5.1.0\r\n     * @param {?string} par - El nodo padre. Para crear un nodo raíz se puede utilizar tanto `#` como `null`.\r\n     * @param {Object|string} node - Los datos para el nuevo nodo. Tiene que ser un objeto JSON válido, o una cadena simple que contenga el nombre.\r\n     * @param {number|string} [pos=\"last\"] - Índice en el que insertar el nodo. Además de soportar la posición de forma numérica (integer), \r\n     * también es posible usar las cadenas `first` y `last` o `before` y `after`.\r\n     * @param {function} callback - Función a ejecutar cuando el nodo haya sido creado.\r\n     * @param {boolean} is_loaded - Argumento interno del componente subyacente que indica si la carga del nodo padre es satisfactoria.\r\n     * @return {string} - El identificador del nodo recién creado.\r\n     * @fires model.jstree, create_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"createNode\", par, node, pos, callback, is_loaded);\r\n     */\n    createNode: function createNode(par, node, pos, callback, is_loaded) {\n      return $(this).jstree('create_node', par, node, pos, callback, is_loaded);\n    },\n\n    /**\r\n     * Establece el texto de un nodo.\r\n     *\r\n     * @method\r\n     * @name renameNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Es posible utilizar un array para renombrar múltiples nodos a la vez.\r\n     * @param {string} val - El nuevo texto.\r\n     * @return {boolean} - Notifica si el proceso termina con éxito o no.\r\n     * @fires rename_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"renameNode\", obj, val);\r\n     */\n    renameNode: function renameNode(obj, val) {\n      return $(this).jstree('rename_node', obj, val);\n    },\n\n    /**\r\n     * Elimina un nodo.\r\n     *\r\n     * @method\r\n     * @name deleteNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a eliminar. Es posible utilizar un array para eliminar múltiples nodos a la vez.\r\n     * @return {boolean} - Notifica si el proceso termina con éxito o no.\r\n     * @fires delete_node.jstree, changed.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"deleteNode\", obj, val);\r\n     */\n    deleteNode: function deleteNode(obj) {\n      return $(this).jstree('delete_node', obj);\n    },\n\n    /**\r\n     * Obtener el último error.\r\n     *\r\n     * @method\r\n     * @name lastError\r\n     * @since UDA 5.1.0\r\n     * @return {Object} - Contiene el error.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"lastError\");\r\n     */\n    lastError: function lastError() {\n      return $(this).jstree('last_error');\n    },\n\n    /**\r\n     * Mueve el nodo a un nuevo padre.\r\n     *\r\n     * @method\r\n     * @name moveNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a mover. Es posible utilizar un array para mover múltiples nodos a la vez.\r\n     * @param {*} par - El nuevo padre.\r\n     * @param {number|string} [pos=0] - Índice en el que insertar el nodo. Además de soportar la posición de forma numérica (integer), \r\n     * también es posible usar las cadenas `first` y `last` o `before` y `after`.\r\n     * @param {function} callback - Función a ejecutar cuando la migración haya sido completada. Recibe tres parámetros, el nodo,\r\n     * el nuevo padre y la posición.\r\n     * @param {boolean} is_loaded - Parámetro interno que indica si el nodo padre ha sido cargado.\r\n     * @param {boolean} skip_redraw - Parámetro interno que indica si el árbol debería de ser repintado.\r\n     * @param {boolean} instance - Parámetro interno que indica si el nodo viene de otra instancia.\r\n     * @fires move_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"moveNode\", obj, par, pos, callback, is_loaded, skip_redraw, instance);\r\n     */\n    moveNode: function moveNode(obj, par, pos, callback, is_loaded, skip_redraw, instance) {\n      $(this).jstree('move_node', obj, par, pos, callback, is_loaded, skip_redraw, instance);\n    },\n\n    /**\r\n     * Copia el nodo a un nuevo padre.\r\n     *\r\n     * @method\r\n     * @name copyNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a copiar. Es posible utilizar un array para copiar múltiples nodos a la vez.\r\n     * @param {*} par - El nuevo padre.\r\n     * @param {number|string} [pos=0] - Índice en el que insertar el nodo. Además de soportar la posición de forma numérica (integer), \r\n     * también es posible usar las cadenas `first` y `last` o `before` y `after`.\r\n     * @param {function} callback - Función a ejecutar cuando la migración haya sido completada. Recibe tres parámetros, el nodo,\r\n     * el nuevo padre y la posición.\r\n     * @param {boolean} is_loaded - Parámetro interno que indica si el nodo padre ha sido cargado.\r\n     * @param {boolean} skip_redraw - Parámetro interno que indica si el árbol debería de ser repintado.\r\n     * @param {boolean} instance - Parámetro interno que indica si el nodo viene de otra instancia.\r\n     * @fires model.jstree, copy_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"copyNode\", obj, par, pos, callback, is_loaded, skip_redraw, instance);\r\n     */\n    copyNode: function copyNode(obj, par, pos, callback, is_loaded, skip_redraw, instance) {\n      $(this).jstree('copy_node', obj, par, pos, callback, is_loaded, skip_redraw, instance);\n    },\n\n    /**\r\n     * Corta un nodo que podrá ser pegado llamando al método `paste(obj)`.\r\n     *\r\n     * @method\r\n     * @name cut\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a cortar. Es posible utilizar un array para cortar múltiples nodos a la vez.\r\n     * @fires cut.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"cut\", obj);\r\n     */\n    cut: function cut(obj) {\n      $(this).jstree('cut', obj);\n    },\n\n    /**\r\n     * Copia un nodo que podrá ser pegado llamando al método `paste(obj)`.\r\n     *\r\n     * @method\r\n     * @name copy\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a copiar. Es posible utilizar un array para copiar múltiples nodos a la vez.\r\n     * @fires copy.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"copy\", obj);\r\n     */\n    copy: function copy(obj) {\n      $(this).jstree('copy', obj);\n    },\n\n    /**\r\n     * Obtiene el buffer actual (nodos a la espera de ser pegados).\r\n     *\r\n     * @method\r\n     * @name getBuffer\r\n     * @since UDA 5.1.0\r\n     * @return {Object} - Contiene el tipo de operación en la propiedad `mode` y puede contener `copy_node` o `move_node`.\r\n     * También alberga un array de objetos con los nodos en cola en la propiedad `node` y la instancia en la propiedad `inst`.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getBuffer\");\r\n     */\n    getBuffer: function getBuffer() {\n      return $(this).jstree('get_buffer');\n    },\n\n    /**\r\n     * Comprueba en el buffer si existe algún nodo que pueda ser pegado.\r\n     *\r\n     * @method\r\n     * @name canPaste\r\n     * @since UDA 5.1.0\r\n     * @return {boolean} - Indica si la operación de pegado puede ser o no realizada.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"canPaste\");\r\n     */\n    canPaste: function canPaste() {\n      return $(this).jstree('can_paste');\n    },\n\n    /**\r\n     * Copia o mueve los nodos cortados o copiados previamente a un nuevo padre.\r\n     *\r\n     * @method\r\n     * @name paste\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - El nuevo padre.\r\n     * @param {number|string} [pos=0] - Índice en el que insertar el nodo. Además de soportar la posición de forma numérica (integer), \r\n     * también es posible usar las cadenas `first` y `last`.\r\n     * @fires paste.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"paste\", obj, pos);\r\n     */\n    paste: function paste(obj, pos) {\n      $(this).jstree('paste', obj, pos);\n    },\n\n    /**\r\n     * Limpia el buffer de elementos copiados o cortados.\r\n     *\r\n     * @method\r\n     * @name clearBuffer\r\n     * @since UDA 5.1.0\r\n     * @fires clear_buffer.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"clearBuffer\");\r\n     */\n    clearBuffer: function clearBuffer() {\n      $(this).jstree('clear_buffer');\n    },\n\n    /**\r\n     * Activa el modo de edición sobre un nodo (genera un campo de texto para renombrar el nodo).\r\n     *\r\n     * @method\r\n     * @name edit\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {string} default_text - Valor a cargar en el campo de texto. Si se omite o define a un valor que no sea de tipo string,\r\n     * se usará el valor que contenga el nodo.\r\n     * @param {function} callback - Función a ejecutar cuando el campo de texto pierda el foco. Es llamado en el ámbito de la instancia\r\n     * y recibe como parámetros el nodo, el estado (con valor `true` si el renombrado es exitoso, de lo contrario con valor `false`), \r\n     * un booleano que indica si el usuario canceló la edición y el valor original sin escapar provisto por el usuario.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"edit\", obj, default_text, callback);\r\n     */\n    edit: function edit(obj, default_text, callback) {\n      $(this).jstree('edit', obj, default_text, callback);\n    },\n\n    /**\r\n     * Cambia el tema.\r\n     *\r\n     * @method\r\n     * @name setTheme\r\n     * @since UDA 5.1.0\r\n     * @param {string} theme_name - Nombre del tema a aplicar.\r\n     * @param {boolean|string} theme_url - Ubicación del CSS del tema a aplicar. Si el fichero ha sido incluido manualmente, se debe omitir el argumento\r\n     * o definirlo a `false`. Para cargarlo automáticamente del directorio establecido en `core.themes.dir`, será necesario fijarlo a `true`.\r\n     * @fires set_theme.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"setTheme\", theme_name, theme_url);\r\n     */\n    setTheme: function setTheme(theme_name, theme_url) {\n      $(this).jstree('set_theme', theme_name, theme_url);\n    },\n\n    /**\r\n     * Obtiene el nombre del tema en uso.\r\n     *\r\n     * @method\r\n     * @name getTheme\r\n     * @since UDA 5.1.0\r\n     * @return {string} - Nombre del tema.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getTheme\");\r\n     */\n    getTheme: function getTheme() {\n      return $(this).jstree('get_theme');\n    },\n\n    /**\r\n     * Cambia la variante del tema en uso (si el tema dispone de variantes).\r\n     *\r\n     * @method\r\n     * @name setThemeVariant\r\n     * @since UDA 5.1.0\r\n     * @param {string|boolean} variant_name - Variante a aplicar. Si se define a `false` la variante actual es eliminada.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"setThemeVariant\", variant_name);\r\n     */\n    setThemeVariant: function setThemeVariant(variant_name) {\n      $(this).jstree('set_theme_variant', variant_name);\n    },\n\n    /**\r\n     * Obtiene la variante del tema en uso.\r\n     *\r\n     * @method\r\n     * @name getThemeVariant\r\n     * @since UDA 5.1.0\r\n     * @return {string} - Variante del tema.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"get_theme_variant\");\r\n     */\n    getThemeVariant: function getThemeVariant() {\n      return $(this).jstree('get_theme_variant');\n    },\n\n    /**\r\n     * Muestra líneas de fondo en el contenedor (solo si el tema en uso lo soporta).\r\n     *\r\n     * @method\r\n     * @name showStripes\r\n     * @since UDA 5.1.0\r\n     * @fires show_stripes.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showStripes\");\r\n     */\n    showStripes: function showStripes() {\n      $(this).jstree('show_stripes');\n    },\n\n    /**\r\n     * Oculta las líneas de fondo del contenedor.\r\n     *\r\n     * @method\r\n     * @name hideStripes\r\n     * @since UDA 5.1.0\r\n     * @fires hide_stripes.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideStripes\");\r\n     */\n    hideStripes: function hideStripes() {\n      $(this).jstree('hide_stripes');\n    },\n\n    /**\r\n     * Alterna entre mostrar u ocultar las líneas de fondo del contenedor.\r\n     *\r\n     * @method\r\n     * @name toggleStripes\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"toggleStripes\");\r\n     */\n    toggleStripes: function toggleStripes() {\n      $(this).jstree('toggle_stripes');\n    },\n\n    /**\r\n     * Muestra los puntos conectores entre nodos (solo si el tema en uso lo soporta).\r\n     *\r\n     * @method\r\n     * @name showDots\r\n     * @since UDA 5.1.0\r\n     * @fires show_dots.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showDots\");\r\n     */\n    showDots: function showDots() {\n      $(this).jstree('show_dots');\n    },\n\n    /**\r\n     * Oculta los puntos conectores entre nodos.\r\n     *\r\n     * @method\r\n     * @name hideDots\r\n     * @since UDA 5.1.0\r\n     * @fires hide_dots.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideDots\");\r\n     */\n    hideDots: function hideDots() {\n      $(this).jstree('hide_dots');\n    },\n\n    /**\r\n     * Alterna entre mostrar u ocultar los puntos conectores entre nodos.\r\n     *\r\n     * @method\r\n     * @name toggleDots\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"toggleDots\");\r\n     */\n    toggleDots: function toggleDots() {\n      $(this).jstree('toggle_dots');\n    },\n\n    /**\r\n     * Muestra iconos en los nodos.\r\n     *\r\n     * @method\r\n     * @name showIcons\r\n     * @since UDA 5.1.0\r\n     * @fires show_icons.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showIcons\");\r\n     */\n    showIcons: function showIcons() {\n      $(this).jstree('show_icons');\n    },\n\n    /**\r\n     * Oculta los iconos en los nodos.\r\n     *\r\n     * @method\r\n     * @name hideIcons\r\n     * @since UDA 5.1.0\r\n     * @fires hide_icons.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideIcons\");\r\n     */\n    hideIcons: function hideIcons() {\n      $(this).jstree('hide_icons');\n    },\n\n    /**\r\n     * Alterna entre mostrar u ocultar los iconos en los nodos.\r\n     *\r\n     * @method\r\n     * @name toggleIcons\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"toggleIcons\");\r\n     */\n    toggleIcons: function toggleIcons() {\n      $(this).jstree('toggle_icons');\n    },\n\n    /**\r\n     * Muestra la elipsis de los nodos.\r\n     *\r\n     * @method\r\n     * @name showEllipsis\r\n     * @since UDA 5.1.0\r\n     * @fires show_ellipsis.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showEllipsis\");\r\n     */\n    showEllipsis: function showEllipsis() {\n      $(this).jstree('show_ellipsis');\n    },\n\n    /**\r\n     * Oculta la elipsis de los nodos.\r\n     *\r\n     * @method\r\n     * @name hideEllipsis\r\n     * @since UDA 5.1.0\r\n     * @fires hide_ellipsis.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideEllipsis\");\r\n     */\n    hideEllipsis: function hideEllipsis() {\n      $(this).jstree('hide_ellipsis');\n    },\n\n    /**\r\n     * Alterna entre mostrar u ocultar la elipsis de los nodos.\r\n     *\r\n     * @method\r\n     * @name toggleEllipsis\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"toggleEllipsis\");\r\n     */\n    toggleEllipsis: function toggleEllipsis() {\n      $(this).jstree('toggle_ellipsis');\n    },\n\n    /**\r\n     * Define el icono a usar en un nodo.\r\n     *\r\n     * @method\r\n     * @name setIcon\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {string} icon - El nuevo icono. Puede ser definida una ruta o una clase. Si se define una ruta a una imagen \r\n     * que esté en el mismo directorio, se ha de usar el prefijo `./`, de lo contrario, se interpretará como una clase.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"setIcon\", obj, icon);\r\n     */\n    setIcon: function setIcon(obj, icon) {\n      $(this).jstree('set_icon', obj, icon);\n    },\n\n    /**\r\n     * Obtener el icono en uso en un nodo.\r\n     *\r\n     * @method\r\n     * @name getIcon\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {string} - Icono en uso.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getIcon\", obj);\r\n     */\n    getIcon: function getIcon(obj) {\n      return $(this).jstree('get_icon', obj);\n    },\n\n    /**\r\n     * Oculta el icono de un nodo.\r\n     *\r\n     * @method\r\n     * @name hideIcon\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideIcon\", obj);\r\n     */\n    hideIcon: function hideIcon(obj) {\n      $(this).jstree('hide_icon', obj);\n    },\n\n    /**\r\n     * Muestra el icono de un nodo.\r\n     *\r\n     * @method\r\n     * @name showIcon\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showIcon\", obj);\r\n     */\n    showIcon: function showIcon(obj) {\n      $(this).jstree('show_icon', obj);\n    },\n    // Métodos públicos del checkbox.\n\n    /**\r\n     * Obtener un array de todos los nodos con un estado \"indeterminado\".\r\n     *\r\n     * @method\r\n     * @name getUndetermined\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, el array devuelto contendrá los objetos completos de los nodos, \r\n     * de lo contrario, solo tendrá los identificadores.\r\n     * @return {Array} - Contiene los nodos obtenidos.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getUndetermined\", full);\r\n     */\n    getUndetermined: function getUndetermined(full) {\n      return $(this).jstree('get_undetermined', full);\n    },\n\n    /**\r\n     * Muestra los iconos checkbox en los nodos.\r\n     *\r\n     * @method\r\n     * @name showCheckboxes\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showCheckboxes\");\r\n     */\n    showCheckboxes: function showCheckboxes() {\n      $(this).jstree('show_checkboxes');\n    },\n\n    /**\r\n     * Oculta los iconos checkbox en los nodos.\r\n     *\r\n     * @method\r\n     * @name hideCheckboxes\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"hideCheckboxes\");\r\n     */\n    hideCheckboxes: function hideCheckboxes() {\n      $(this).jstree('hide_checkboxes');\n    },\n\n    /**\r\n     * Alterna entre mostrar u ocultar los iconos checkbox en los nodos.\r\n     *\r\n     * @method\r\n     * @name toggleCheckboxes\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"toggleCheckboxes\");\r\n     */\n    toggleCheckboxes: function toggleCheckboxes() {\n      $(this).jstree('toggle_checkboxes');\n    },\n\n    /**\r\n     * Comprueba si el nodo está en un estado \"indeterminado\".\r\n     *\r\n     * @method\r\n     * @name isUndetermined\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Informa si el estado del nodo es \"indeterminado\".\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isUndetermined\", obj);\r\n     */\n    isUndetermined: function isUndetermined(obj) {\n      return $(this).jstree('is_undetermined', obj);\n    },\n\n    /**\r\n     * Deshabilita el checkbox de un nodo.\r\n     *\r\n     * @method\r\n     * @name disableCheckbox\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc. También es posible \r\n     * cargar múltiples nodos pasando un array.\r\n     * @fires disable_checkbox.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"disableCheckbox\", obj);\r\n     */\n    disableCheckbox: function disableCheckbox(obj) {\n      $(this).jstree('disable_checkbox', obj);\n    },\n\n    /**\r\n     * Habilita el checkbox de un nodo.\r\n     *\r\n     * @method\r\n     * @name enableCheckbox\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc. También es posible \r\n     * cargar múltiples nodos pasando un array.\r\n     * @fires enable_checkbox.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"enableCheckbox\", obj);\r\n     */\n    enableCheckbox: function enableCheckbox(obj) {\n      $(this).jstree('enable_checkbox', obj);\n    },\n\n    /**\r\n     * Obtiene los identificadores de los nodos seleccionados en la rama del árbol (no incluye el identificador del nodo pasado \r\n     * como argumento).\r\n     *\r\n     * @method\r\n     * @name getCheckedDescendants\r\n     * @since UDA 5.1.0\r\n     * @param {string} id - Identificador del nodo.\r\n     * @return {Array} - Contiene los identificadores de los nodos obtenidos.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getCheckedDescendants\", id);\r\n     */\n    getCheckedDescendants: function getCheckedDescendants(id) {\n      return $(this).jstree('get_checked_descendants', id);\n    },\n\n    /**\r\n     * Marca el checkbox de un nodo (solo si en los ajustes del checkbox `tie_selection` contiene un valor `false`, de lo contrario, \r\n     * se recurrirá a `select_node`).\r\n     *\r\n     * @method\r\n     * @name checkNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc. También es posible \r\n     * marcar los checkbox de múltiples nodos pasando un array.\r\n     * @fires check_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"checkNode\", obj);\r\n     */\n    checkNode: function checkNode(obj) {\n      $(this).jstree('check_node', obj);\n    },\n\n    /**\r\n     * Desmarca el checkbox de un nodo (solo si en los ajustes del checkbox `tie_selection` contiene un valor `false`, de lo contrario, \r\n     * se recurrirá a `deselect_node`).\r\n     *\r\n     * @method\r\n     * @name uncheckNode\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc. También es posible \r\n     * desmarcar los checkbox de múltiples nodos pasando un array.\r\n     * @fires uncheck_node.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"uncheckNode\", obj);\r\n     */\n    uncheckNode: function uncheckNode(obj) {\n      $(this).jstree('uncheck_node', obj);\n    },\n\n    /**\r\n     * Marca todos los checkbox de un árbol (solo si en los ajustes del checkbox `tie_selection` contiene un valor `false`, \r\n     * de lo contrario, se recurrirá a `select_all`).\r\n     *\r\n     * @method\r\n     * @name checkAll\r\n     * @since UDA 5.1.0\r\n     * @fires check_all.jstree, changed.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"checkAll\");\r\n     */\n    checkAll: function checkAll() {\n      $(this).jstree('check_all');\n    },\n\n    /**\r\n     * Desmarca todos los checkbox de un árbol (solo si en los ajustes del checkbox `tie_selection` contiene un valor `false`, \r\n     * de lo contrario, se recurrirá a `deselect_all`).\r\n     *\r\n     * @method\r\n     * @name uncheckAll\r\n     * @since UDA 5.1.0\r\n     * @fires uncheck_all.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"uncheckAll\");\r\n     */\n    uncheckAll: function uncheckAll() {\n      $(this).jstree('uncheck_all');\n    },\n\n    /**\r\n     * Comprueba si el checkbox de un nodo está marcado (si en los ajustes del checkbox `tie_selection` contiene un valor `true`, \r\n     * este método devolerá lo mismo que `is_selected`).\r\n     *\r\n     * @method\r\n     * @name isChecked\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {boolean} - Notifica si el nodo se encuentra marcado.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"isChecked\", obj);\r\n     */\n    isChecked: function isChecked(obj) {\n      return $(this).jstree('is_checked', obj);\n    },\n\n    /**\r\n     * Obtiene un array de todos los nodos marcados (si en los ajustes del checkbox `tie_selection` contiene un valor `true`, \r\n     * este método devolerá lo mismo que `get_selected`).\r\n     *\r\n     * @method\r\n     * @name getChecked\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, el array devuelto contendrá los objetos completos de los nodos, \r\n     * de lo contrario, solo tendrá los identificadores.\r\n     * @return {Array} - Contiene los nodos obtenidos.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getChecked\", full);\r\n     */\n    getChecked: function getChecked(full) {\n      return $(this).jstree('get_checked', full);\n    },\n\n    /**\r\n     * Obtiene un array de todos los nodos de alto nivel que estén marcados (si en los ajustes del checkbox `tie_selection` \r\n     * contiene un valor `true`, este método devolerá lo mismo que `get_top_selected`).\r\n     *\r\n     * @method\r\n     * @name getTopChecked\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, el array devuelto contendrá los objetos completos de los nodos, \r\n     * de lo contrario, solo tendrá los identificadores.\r\n     * @return {Array} - Contiene los nodos obtenidos.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getTopChecked\", full);\r\n     */\n    getTopChecked: function getTopChecked(full) {\n      return $(this).jstree('get_top_checked', full);\n    },\n\n    /**\r\n     * Obtiene un array de todos los nodos de bajo nivel que estén marcados (si en los ajustes del checkbox `tie_selection` \r\n     * contiene un valor `true`, este método devolerá lo mismo que `get_bottom_selected`).\r\n     *\r\n     * @method\r\n     * @name getBottomChecked\r\n     * @since UDA 5.1.0\r\n     * @param {boolean} full - Si se define a `true`, el array devuelto contendrá los objetos completos de los nodos, \r\n     * de lo contrario, solo tendrá los identificadores.\r\n     * @return {Array} - Contiene los nodos obtenidos.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getBottomChecked\", full);\r\n     */\n    getBottomChecked: function getBottomChecked(full) {\n      return $(this).jstree('get_bottom_checked', full);\n    },\n    // Métodos públicos del contextmenu.\n\n    /**\r\n     * Prepara y muestra el menú contextual de un nodo.\r\n     *\r\n     * @method\r\n     * @name showContextmenu\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {number} x - Coordenada del eje x relativa al documento donde se mostrará el menú contextual.\r\n     * @param {number} y - Coordenada del eje y relativa al documento donde se mostrará el menú contextual.\r\n     * @fires show_contextmenu.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"showContextmenu\", obj, x, y);\r\n     */\n    showContextmenu: function showContextmenu(obj, x, y) {\n      $(this).jstree('show_contextmenu', obj, x, y);\n    },\n    // Métodos públicos del search.\n\n    /**\r\n     * Busca entre los nodos del árbol la cadena proporcionada.\r\n     *\r\n     * @method\r\n     * @name search\r\n     * @since UDA 5.1.0\r\n     * @param {string} str - La cadena a usar para la búsqueda.\r\n     * @param {boolean} skip_async - Si se define a `true`, no se hará la petición al servidor, aunque así esté configurado.\r\n     * @param {boolean} show_only_matches - Si se define a `true`, solo se mostrarán los nodos que coincidan (hay que tener en cuenta \r\n     * que esta opción puede ser muy lenta en árboles grandes o navegadores antiguos).\r\n     * @param {*} [inside] - Nodo opcional sobre el que limitar la búsqueda (sobre sus hijos).\r\n     * @param {boolean} append - Si se define a `true`, los resultados de la búsqueda serán añadidos a los de la anterior consulta.\r\n     * @fires search.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"search\", str, skip_async, show_only_matches, inside, append);\r\n     */\n    search: function search(str, skip_async, show_only_matches, inside, append) {\n      $(this).jstree('search', str, skip_async, show_only_matches, inside, append);\n    },\n\n    /**\r\n     * Limpia los resultados de la última búsqueda (elimina las clases y muestra todos los nodos si el filtrado está habilitado).\r\n     *\r\n     * @method\r\n     * @name clearSearch\r\n     * @since UDA 5.1.0\r\n     * @fires clear_search.jstree\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"clearSearch\");\r\n     */\n    clearSearch: function clearSearch() {\n      $(this).jstree('clear_search');\n    },\n    // Métodos públicos del state.\n\n    /**\r\n     * Guarda el estado.\r\n     *\r\n     * @method\r\n     * @name saveState\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"saveState\");\r\n     */\n    saveState: function saveState() {\n      $(this).jstree('save_state');\n    },\n\n    /**\r\n     * Restaura el estado desde el ordenador del usuario.\r\n     *\r\n     * @method\r\n     * @name restoreState\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"restoreState\");\r\n     */\n    restoreState: function restoreState() {\n      $(this).jstree('restore_state');\n    },\n\n    /**\r\n     * Limpia el estado en el ordenador del usuario.\r\n     *\r\n     * @method\r\n     * @name clearState\r\n     * @since UDA 5.1.0\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"clearState\");\r\n     */\n    clearState: function clearState() {\n      $(this).jstree('clear_state');\n    },\n    // Metodos públicos de la especificación de types.\n\n    /**\r\n     * Obtiene las reglas del plugin `type` de un nodo.\r\n     *\r\n     * @method\r\n     * @name getRules\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @return {Object} - Contiene las reglas obtenidas.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getRules\", obj);\r\n     */\n    getRules: function getRules(obj) {\n      return $(this).jstree('get_rules', obj);\n    },\n\n    /**\r\n     * Obtiene del nodo el tipo o los ajustes en un objecto.\r\n     *\r\n     * @method\r\n     * @name getType\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a tratar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {boolean|string} rules -  Si se pasa un booleano con valor `true` en vez de una cadena, se devolerá \r\n     * un objecto que contenga los ajustes.\r\n     * @return {string|Object} - Contiene las reglas obtenidas.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"getType\", obj, rules);\r\n     */\n    getType: function getType(obj, rules) {\n      return $(this).jstree('get_type', obj, rules);\n    },\n\n    /**\r\n     * Cambia el tipo de un nodo.\r\n     *\r\n     * @method\r\n     * @name setType\r\n     * @since UDA 5.1.0\r\n     * @param {*} obj - Nodo a cambiar. Permite usar el elemento del DOM, el identificador, el selector, etc.\r\n     * @param {string} type -  Nuevo tipo a definir.\r\n     * @example\r\n     * $(\"#selector\").rup_tree(\"setType\", obj, type);\r\n     */\n    setType: function setType(obj, type) {\n      $(this).jstree('set_type', obj, type);\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  jQuery.fn.rup_tree('extend', {\n    _init: function _init(args) {\n      var _this = this;\n\n      global.initRupI18nPromise.then(function () {\n        if (args.length > 1) {\n          jQuery.rup.errorGestor(jQuery.rup.i18n.base.rup_global.initError + jQuery(_this).attr('id'));\n        } else {\n          // Se recogen y cruzan las paremetrizaciones.\n          if (args.length > 0) {\n            if (args[0].select) {\n              args[0].ui = args[0].select;\n              delete args[0].select;\n            }\n\n            if (args[0].jQueryUIStyles) {\n              args[0].themeroller = args[0].jQueryUIStyles;\n              delete args[0].jQueryUIStyles;\n            }\n          }\n\n          var settings = jQuery.extend(true, {}, jQuery.fn.rup_tree.defaults, args[0]),\n              selectorSelf = _this; // Guardar referencia al $self.\n\n          settings.$self = $(_this);\n          settings.$self.attr('ruptype', 'tree');\n          $(_this).data('settings', settings); // Se tapa la creación del arbol para evitar visualizaciones inapropiadas. Es recomendable que inicialmente, \n          // el componente sea invisible. Para ello se dispone de la clase \"rup_tree\".\n\n          selectorSelf.addClass('rup_tree'); // Almacenar los ajustes en el data del elemento.\n\n          selectorSelf.data('settings', settings); // Cración del árbol.\n\n          selectorSelf.jstree(settings); // Evento de inicializacion.\n\n          selectorSelf.on('ready.jstree', function () {\n            // Una vez creados y cargados todos los nodos, se libera la visualización del componente.\n            $(this).removeClass('rup_tree');\n          }); // Auditar el componente.\n\n          $.rup.auditComponent('rup_tree', 'init');\n        }\n      })[\"catch\"](function (error) {\n        console.error('Error al inicializar el componente:\\n', error);\n      });\n    }\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  /**\r\n   * @description Propiedades de configuración del componente.\r\n   * @see Para mas información consulte la documentación acerca de las opciones de configuración del plugin {@link https://www.jstree.com/api|jsTree}.\r\n   * @name defaults\r\n   * @property {Object} defaults - Preferencias por defecto ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults|API jsTree}).\r\n   * @property {Object<Array<string>>} [defaults.plugins=[]] - Plugins del componente \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.plugins|API jsTree}).\r\n   * @property {Object} defaults.core - Preferencias del núcleo ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core|API jsTree}).\r\n   * @property {*} [defaults.core.data=false] - Configuración de los datos ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.data|API jsTree}).\r\n   * @property {boolean|Object} [defaults.core.strings=false] - Configura las múltiples cadenas que son usados en el componente \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.strings|API jsTree}).\r\n   * @property {boolean} [defaults.core.check_callback=true] - Determina qué sucede cuando un usuario trata de modificar la estructura del árbol \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.check_callback|API jsTree}).\r\n   * @property {function} defaults.core.error - Callback llamado con un único argumento compuesto por un objecto simple cuando algo falla  \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.error|API jsTree}).\r\n   * @property {number|boolean} [defaults.core.animation=200] - Duración en milisegundos de la acción de apertura y cierre. Es posible deshabilitar la \r\n   * animación si se define a `false` ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.animation|API jsTree}).\r\n   * @property {boolean} [defaults.core.multiple=false] - Indica si es posible seleccionar múltiples nodos \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.multiple|API jsTree}).\r\n   * @property {Object} defaults.core.themes - Preferencias del tema ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes|API jsTree}).\r\n   * @property {boolean|string} [defaults.core.themes.name=false] - Nombre del tema a usar \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.name|API jsTree}).\r\n   * @property {boolean|string} [defaults.core.themes.url=false] - Ubicación del CSS del tema a aplicar. Si el fichero es incluido manualmente, \r\n   * se debe definir a `false`. Para cargarlo automáticamente del directorio establecido en `defaults.core.themes.dir`, será necesario fijarlo a `true`. \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.url|API jsTree}).\r\n   * @property {boolean|string} [defaults.core.themes.dir=false] - Ubicación de los temas del componente. Solamente se debe usar si `defaults.core.themes.dir` \r\n   * es definido a `true` ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.dir|API jsTree}).\r\n   * @property {boolean} [defaults.core.themes.dots=false] - Permite mostrar los puntos conectores entre nodos \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.dots|API jsTree}).\r\n   * @property {boolean} [defaults.core.themes.icons=true] - Permite mostrar los iconos en los nodos \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.icons|API jsTree}).\r\n   * @property {boolean} [defaults.core.themes.ellipsis=false] - Indica si se debe mostrar la elipsis de los nodos \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.ellipsis|API jsTree}).\r\n   * @property {boolean} [defaults.core.themes.stripes=false] - Indica si se deben mostrar las líneas de fondo en el contenedor \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.stripes|API jsTree}).\r\n   * @property {boolean|string} [defaults.core.themes.variant='default'] - Especifica la variante a usar del tema actual \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.variant|API jsTree}).\r\n   * @property {boolean} [defaults.core.themes.responsive=true] - Especifica si se debería usar la versión responsiva de los temas en las pantallas pequeñas \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.themes.responsive|API jsTree}).\r\n   * @property {boolean} [defaults.core.expand_selected_onload=false] - Si se define a `true` todos los padres de nodos seleccionados serán desplegados \r\n   * una vez el árbol haya sido cargado ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.expand_selected_onload|API jsTree}).\r\n   * @property {boolean} [defaults.core.worker=false] - Permite utilizar \"web workers\" para parsear el JSON recibido sin bloquear la interfaz \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.worker|API jsTree}).\r\n   * @property {boolean} [defaults.core.force_text=false] - Fuerza el texto del nodo a texto plano y a escapar el HTML \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.force_text|API jsTree}).\r\n   * @property {boolean} [defaults.core.dblclick_toggle=true] - Indica si el nodo tendría que ser alternado entre abierto y cerrado si se hace una doble \r\n   * pulsación sobre él ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.dblclick_toggle|API jsTree}).\r\n   * @property {boolean} [defaults.core.loaded_state=false] - Indica si los nodos cargados deberían formar parte del estado \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.loaded_state|API jsTree}).\r\n   * @property {boolean} [defaults.core.restore_focus=true] - Permite devolver el foco al último nodo que lo tuvo antes de perderlo \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.restore_focus|API jsTree}).\r\n   * @property {boolean} [defaults.core.compute_elements_positions=false] - Fuerza la computación y el establecimiento de `aria-setsize` y `aria-posinset` de manera \r\n   * explícita para cada ítem del árbol ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.compute_elements_positions|API jsTree}).\r\n   * @property {Object} defaults.core.keyboard - Permite definir atajos de teclado \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.core.keyboard|API jsTree}).\r\n   * @property {Object} defaults.checkbox - Preferencias para los checkbox ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox|API jsTree}).\r\n   * @property {boolean} [defaults.checkbox.visible=true] - Define la visibilidad de los checkbox \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox|API jsTree}).\r\n   * @property {boolean} [defaults.checkbox.three_state=true] - Define si al seleccionar un nodo padre deberían de marcarse también sus hijos y dejarlos con un \r\n   * estado indeterminado ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox.three_state|API jsTree}).\r\n   * @property {boolean} [defaults.checkbox.whole_node=true] - Permite seleccionar el nodo cuando se pulsa sobre cualquier parte de él, haciéndolo actuar como \r\n   * si se pulsara sobre el checkbox ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox.whole_node|API jsTree}).\r\n   * @property {string} [defaults.checkbox.cascade=''] - Controla cómo se aplican los cambios en cascada y la indeterminación \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox.cascade|API jsTree}).\r\n   * @property {boolean} [defaults.checkbox.tie_selection=true] - Controla si los checkbox están vinculados a la selección general del árbol o a un array interno \r\n   * mantenido por el plugin del checkbox ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox.tie_selection|API jsTree}).\r\n   * @property {boolean} [defaults.checkbox.cascade_to_disabled=true] - Controla si los cambios en cascada afectan a los checkbox deshabilitados \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox.cascade_to_disabled|API jsTree}).\r\n   * @property {boolean} [defaults.checkbox.cascade_to_hidden=true] - Controla si los cambios en cascada afectan a los checkbox ocultos \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.checkbox.cascade_to_hidden|API jsTree}).\r\n   * @property {boolean} [defaults.conditionalselect=true] - Define un callback que recibe dos parámetros (el nodo y el evento) para permitir o prevenir la interacción con \r\n   * los nodos por parte del usuario. También es posible definirlo a `false` para prevenir la interacción del usuario con los nodos o a `true` para permitirlo a través \r\n   * de la invocación a `activate_node`.\r\n   * @property {Object} defaults.contextmenu - Preferencias del menú contextual ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.contextmenu|API jsTree}).\r\n   * @property {boolean} [defaults.contextmenu.select_node=true] - Indica si el nodo puede ser seleccionado cuando el menú contextual ha sido invocado sobre él \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.contextmenu.select_node|API jsTree}).\r\n   * @property {boolean} [defaults.contextmenu.show_at_node=true] - Indica si el menú contextual debería de ser mostrado alineado con el nodo. Si no se habilita, se usan \r\n   * las coordenadas del ratón para ubicarlo ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.contextmenu.show_at_node|API jsTree}).\r\n   * @property {Object} defaults.contextmenu.items - Permite definir múltiples características del menú contextual \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.contextmenu.items|API jsTree}).\r\n   * @property {Object} defaults.dnd - Preferencias de \"drag'n'drop\" ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd|API jsTree}).\r\n   * @property {boolean} [defaults.dnd.copy=true] - Habilita la copia mientras se mueve un nodo \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.copy|API jsTree}).\r\n   * @property {number} [defaults.dnd.open_timeout=500] - Número que indica cuánto tiempo es necesario para empezar a mover un nodo \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.open_timeout|API jsTree}).\r\n   * @property {boolean|function} [defaults.dnd.is_draggable=true] - Función invocada cada vez que un nodo vaya a ser movido. Recibe como parámetros el nodo \r\n   * a mover (en un array) y el evento que comenzó el movimiento ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.is_draggable|API jsTree}).\r\n   * @property {boolean} [defaults.dnd.check_while_dragging=true] - Indica si se deberían de realizar comprobaciones de manera constante mientras el usuario esté \r\n   * moviendo un nodo ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.check_while_dragging|API jsTree}).\r\n   * @property {boolean} [defaults.dnd.always_copy=false] - Indica si los nodos de un árbol solo pueden ser copiados mediante el movimiento de arrastre \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.always_copy|API jsTree}).\r\n   * @property {number|string} [defaults.dnd.inside_pos=0] - Este ajuste indica cuando se mueve un nodo dentro de otro, en qué posición debería de ir el nuevo nodo. \r\n   * Además de marcar la posición números, también se pueden usar las cadenas `first` (primera posición) y `last` (última posición) \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.inside_pos|API jsTree}).\r\n   * @property {boolean} [defaults.dnd.drag_selection=true] - Cuando se comienza a mover un nodo que está seleccionado, este ajuste controla si se deberían mover todos \r\n   * los nodos seleccionados o únicamente el que se está moviendo ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.drag_selection|API jsTree}).\r\n   * @property {boolean|string} [defaults.dnd.touch=true] - Permite habilitar el movimiento de nodos en pantallas táctiles y también cómo se comporta en caso de \r\n   * habilitiarlo ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.touch|API jsTree}).\r\n   * @property {boolean} [defaults.dnd.large_drop_target=false] - Controla si los items pueden ser soltados en cualquier parte del nodo \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.large_drop_target|API jsTree}).\r\n   * @property {boolean} [defaults.dnd.large_drag_target=false] - Controla si el movimiento de un nodo puede ser comenzado desde cualquier parte de él o únicamente \r\n   * desde el texto o icono ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.large_drag_target|API jsTree}).\r\n   * @property {boolean} [defaults.dnd.use_html5=true] - Permite usar la API de HTML5 en lugar de la clásica \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.dnd.use_html5|API jsTree}).\r\n   * @property {Object|function} defaults.massload - Configuración de carga masiva ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.massload|API jsTree}).\r\n   * @property {Object} defaults.search - Configuración de la búsqueda ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search|API jsTree}).\r\n   * @property {boolean|Object|function} [defaults.search.ajax=false] - Permite configurar AJAX \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.ajax|API jsTree}).\r\n   * @property {boolean} [defaults.search.fuzzy=false] - Indica si la búsqueda debería ser menos estricta \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.fuzzy|API jsTree}).\r\n   * @property {boolean} [defaults.search.case_sensitive=false] - Indica si la búsqueda debe distinguir entre mayúsculas y minúsculas \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.case_sensitive|API jsTree}).\r\n   * @property {boolean} [defaults.search.show_only_matches=false] - Indica si el árbol debería de ser filtrado por defecto para que solo muestre los nodos que \r\n   * coinciden ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.show_only_matches|API jsTree}).\r\n   * @property {boolean} [defaults.search.show_only_matches_children=false] - Permite indicar si los hijos de los nodos coincidentes serán mostrados \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.show_only_matches_children|API jsTree}).\r\n   * @property {boolean} [defaults.search.close_opened_onclear=true] - Indica si todos los nodos que se encuentren abiertos mostrando el resultado de la búsqueda \r\n   * deberían de ser cerrados una vez la búsqueda haya sido borrada o realizada de nuevo \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.close_opened_onclear|API jsTree}).\r\n   * @property {boolean} [defaults.search.search_leaves_only=false] - Configura si los nodos hoja deberían de ser los únicos nodos mostrados en las búsquedas \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.search_leaves_only|API jsTree}).\r\n   * @property {boolean} [defaults.search.search_callback=false] - Permite lanzar un callback por cada nodo que haya en la estructura una vez se realiza \r\n   * una búsqueda ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.search.search_callback|API jsTree}).\r\n   * @property {number} defaults.sort - Configuración de la ordenación ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.sort|API jsTree}).\r\n   * @property {Object} defaults.state - Preferencias del estado ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.state|API jsTree}).\r\n   * @property {string} [defaults.state.key='jstree'] - Cadena a usar en la clave cuando se guarde el estado del árbol. Debería cambiarse cuando se utilicen \r\n   * múltiples árboles en una misma vista ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.state.key|API jsTree}).\r\n   * @property {string} [defaults.state.events='changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree'] - Lista de eventos separados \r\n   * por un espacio que desencadenan un guardado de estado ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.state.events|API jsTree}).\r\n   * @property {boolean|number} [defaults.state.ttl=false] - Tiempo en milisegundos hasta que el estado expire \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.state.ttl|API jsTree}).\r\n   * @property {boolean|function} [defaults.state.filter=false] - Función que se ejecuta antes de restaurar el estado y recibe el estado como parámetro \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.state.filter|API jsTree}).\r\n   * @property {boolean} [defaults.state.preserve_loaded=false] - Indica si los nodos cargados deberían de ser restaurados \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.state.preserve_loaded|API jsTree}).\r\n   * @property {Object} defaults.types - Preferencias de tipos ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.types|API jsTree}).\r\n   * @property {Object} defaults.unique - Preferencias de exclusividad ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.unique|API jsTree}).\r\n   * @property {boolean} [defaults.unique.case_sensitive=false] - Indica si la comparación debe distinguir entre mayúsculas y minúsculas \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.unique.case_sensitive|API jsTree}).\r\n   * @property {boolean} [defaults.unique.trim_whitespace=false] - Indica si se deben eliminar los espacios en blanco antes de la comparación \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.unique.trim_whitespace|API jsTree}).\r\n   * @property {function} defaults.unique.duplicate - Callback a ejecutar cuando un nuevo nodo es creado y el nombre ya está siendo usado por otro nodo \r\n   * ({@link https://www.jstree.com/api/#/?f=$.jstree.defaults.unique.duplicate|API jsTree}).\r\n   */\n\n  jQuery.fn.rup_tree.defaults = {\n    'plugins': [],\n    'core': {\n      'data': false,\n      'strings': false,\n      'check_callback': true,\n      'animation': 200,\n      'multiple': false,\n      'themes': {\n        'name': false,\n        'url': false,\n        'dir': false,\n        'dots': false,\n        'icons': true,\n        'ellipsis': false,\n        'stripes': false,\n        'variant': 'default',\n        'responsive': true\n      },\n      'expand_selected_onload': false,\n      'worker': false,\n      'force_text': false,\n      'dblclick_toggle': true,\n      'loaded_state': false,\n      'restore_focus': true,\n      'compute_elements_positions': false\n    },\n    'checkbox': {\n      'visible': true,\n      'three_state': true,\n      'whole_node': true,\n      'keep_selected_style': true,\n      'cascade': '',\n      'tie_selection': true,\n      'cascade_to_disabled': true,\n      'cascade_to_hidden': true\n    },\n    'conditionalselect': true,\n    'contextmenu': {\n      'select_node': true,\n      'show_at_node': true,\n      'items': function items(o, cb) {\n        // Could be an object directly\n        return {\n          'create': {\n            'separator_before': false,\n            'separator_after': true,\n            '_disabled': false,\n            //(this.check('create_node', data.reference, {}, 'last')),\n            'label': $.rup.i18nParse($.rup.i18n.base, 'rup_tree.create'),\n            'action': function action(data) {\n              var inst = $.jstree.reference(data.reference),\n                  obj = inst.get_node(data.reference);\n              inst.create_node(obj, {}, 'last', function (new_node) {\n                try {\n                  inst.edit(new_node);\n                } catch (ex) {\n                  setTimeout(function () {\n                    inst.edit(new_node);\n                  }, 0);\n                }\n              });\n            }\n          },\n          'rename': {\n            'separator_before': false,\n            'separator_after': false,\n            '_disabled': false,\n            //(this.check('rename_node', data.reference, this.get_parent(data.reference), '')),\n            'label': $.rup.i18nParse($.rup.i18n.base, 'rup_tree.rename'),\n\n            /*!\r\n            'shortcut'\t\t\t: 113,\r\n            'shortcut_label'\t: 'F2',\r\n            'icon'\t\t\t\t: 'glyphicon glyphicon-leaf',\r\n            */\n            'action': function action(data) {\n              var inst = $.jstree.reference(data.reference),\n                  obj = inst.get_node(data.reference);\n              inst.edit(obj);\n            }\n          },\n          'remove': {\n            'separator_before': false,\n            'icon': false,\n            'separator_after': false,\n            '_disabled': false,\n            //(this.check('delete_node', data.reference, this.get_parent(data.reference), '')),\n            'label': $.rup.i18nParse($.rup.i18n.base, 'rup_tree.remove'),\n            'action': function action(data) {\n              var inst = $.jstree.reference(data.reference),\n                  obj = inst.get_node(data.reference);\n\n              if (inst.is_selected(obj)) {\n                inst.delete_node(inst.get_selected());\n              } else {\n                inst.delete_node(obj);\n              }\n            }\n          },\n          'ccp': {\n            'separator_before': true,\n            'icon': false,\n            'separator_after': false,\n            'label': $.rup.i18nParse($.rup.i18n.base, 'rup_tree.ccp.label'),\n            'action': false,\n            'submenu': {\n              'cut': {\n                'separator_before': false,\n                'separator_after': false,\n                'label': $.rup.i18nParse($.rup.i18n.base, 'rup_tree.ccp.cut'),\n                'action': function action(data) {\n                  var inst = $.jstree.reference(data.reference),\n                      obj = inst.get_node(data.reference);\n\n                  if (inst.is_selected(obj)) {\n                    inst.cut(inst.get_top_selected());\n                  } else {\n                    inst.cut(obj);\n                  }\n                }\n              },\n              'copy': {\n                'separator_before': false,\n                'icon': false,\n                'separator_after': false,\n                'label': $.rup.i18nParse($.rup.i18n.base, 'rup_tree.ccp.copy'),\n                'action': function action(data) {\n                  var inst = $.jstree.reference(data.reference),\n                      obj = inst.get_node(data.reference);\n\n                  if (inst.is_selected(obj)) {\n                    inst.copy(inst.get_top_selected());\n                  } else {\n                    inst.copy(obj);\n                  }\n                }\n              },\n              'paste': {\n                'separator_before': false,\n                'icon': false,\n                '_disabled': function _disabled(data) {\n                  return !$.jstree.reference(data.reference).can_paste();\n                },\n                'separator_after': false,\n                'label': $.rup.i18nParse($.rup.i18n.base, 'rup_tree.ccp.paste'),\n                'action': function action(data) {\n                  var inst = $.jstree.reference(data.reference),\n                      obj = inst.get_node(data.reference);\n                  inst.paste(obj);\n                }\n              }\n            }\n          }\n        };\n      }\n    },\n    'dnd': {\n      'copy': true,\n      'open_timeout': 500,\n      'is_draggable': true,\n      'check_while_dragging': true,\n      'always_copy': false,\n      'inside_pos': 0,\n      'drag_selection': true,\n      'touch': true,\n      'large_drop_target': false,\n      'large_drag_target': false,\n      'use_html5': true\n    },\n    'search': {\n      'ajax': false,\n      'fuzzy': false,\n      'case_sensitive': false,\n      'show_only_matches': false,\n      'show_only_matches_children': false,\n      'close_opened_onclear': true,\n      'search_leaves_only': false,\n      'search_callback': false\n    },\n    'state': {\n      'key': 'jstree',\n      'events': 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',\n      'ttl': false,\n      'filter': false,\n      'preserve_loaded': false\n    },\n    'unique': {\n      'case_sensitive': false,\n      'trim_whitespace': false\n    }\n  };\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.tree.js?");

/***/ }),

/***/ "./src/rup.upload.js":
/*!***************************!*\
  !*** ./src/rup.upload.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permite al usuario seleccionar uno o varios archivos de su equipo y subirlos a la aplicación.\r\n *\r\n * @summary Componente RUP Upload.\r\n * @module rup_upload\r\n * @see El componente está basado en el plugin {@link https://blueimp.github.io/jQuery-File-Upload/|jQuery File Upload}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link https://blueimp.github.io/jQuery-File-Upload/|aquí}.\r\n * @example\r\n * $(\"#idUpload\").rup_upload({});\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! ./core/utils/jquery.iframe-transport */ \"./src/core/utils/jquery.iframe-transport.js\"), __webpack_require__(/*! blueimp-file-upload/js/jquery.fileupload-ui.js */ \"./node_modules/blueimp-file-upload/js/jquery.fileupload-ui.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.widget('blueimp.fileupload', $.blueimp.fileupload, {\n    options: {\n      errorMessages: {\n        maxFileSize: $.rup.i18nParse($.rup.i18n.base, 'rup_upload.maxFileSizeError'),\n        minFileSize: $.rup.i18nParse($.rup.i18n.base, 'rup_upload.minFileSizeError'),\n        acceptFileTypes: $.rup.i18nParse($.rup.i18n.base, 'rup_upload.acceptFileTypesError'),\n        maxNumberOfFiles: $.rup.i18nParse($.rup.i18n.base, 'rup_upload.maxNumberOfFilesError')\n      },\n      getFilesFromResponse: function getFilesFromResponse(data) {\n        if (data.result && Array.isArray(data.result)) {\n          // return data.result;\n          return data.result.map(function (elem) {\n            return $.extend(elem, {\n              deleteType: elem.delete_type,\n              deleteUrl: elem.delete_url\n            });\n          });\n        }\n\n        return [];\n      }\n    },\n    _renderUploadTemplate: function _renderUploadTemplate(files) {\n      var that = this,\n          rows = $();\n      var settings = $.data(this.element[0], 'settings');\n      $.each(files, function (index, file) {\n        // file = that._uploadTemplateHelper(file);\n        var row = $('<tr class=\"template-upload\"><td>' + '<div class=\"formulario_columna_cnt\">' + '<span class=\"izq_float file_icon\">&nbsp;</span>' + '<div class=\"izq_float name\"><b></b></div>' + '<div class=\"formulario_columna_cnt\">' + '<div class=\"izq_float type\"></div>' + '<div class=\"izq_float size\"></div>' + (settings.submitInForm ? '<div class=\"izq_float cancel\" style><button>' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.cancelUpload') + '</button></div>' : '') + '</div>' + (!settings.submitInForm ? '<div class=\"formulario_columna_cnt\">' + (file.error ? '<div class=\"izq_float error\" ></div>' : '<button>' + '<div class=\"izq_float progress\"><div></div></div>' + '<div class=\"izq_float start fileupload-buttonbar ui-button\">' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.startUpload') + '</button></div>') + '<div class=\"izq_float cancel\"><button>' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.cancelUpload') + '</button></div>' + '</div>' : '<div class=\"izq_float start fileupload-buttonbar ui-button\" style=\"display:none\"><button>' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.startUpload') + '</button></div>') + '</td></tr>');\n        row.find('.name b').text(file.name);\n        row.find('.size').text(file.sizef);\n        row.find('.type').text(file.type);\n\n        if (file.error) {\n          row.addClass('ui-state-error');\n          row.find('.error').text(that.options.errorMessages[file.error] || file.error);\n        }\n\n        rows = rows.add(row);\n      });\n      return rows;\n    },\n    _renderDownloadTemplate: function _renderDownloadTemplate(files) {\n      var that = this,\n          rows = $();\n      $.each(files, function (index, file) {\n        // file = that._downloadTemplateHelper(file);\n        var row = $('<tr class=\"template-download\"><td>' + (file.error ? '<td class=\"file_icon\"></td>' + '<td class=\"name\"></td>' + '<td class=\"size\"></td>' + '<td class=\"error\" colspan=\"2\"></td>' : '<div class=\"formulario_columna_cnt\">' + '<span class=\"izq_float file_icon\">&nbsp;</span>' + '<div class=\"izq_float name\"><a></a></div>' + '</div>' + '<div class=\"formulario_columna_cnt\">' + '<div class=\"izq_float type\"></div>' + '<div class=\"izq_float size\"></div>' + '</div>' + '<div class=\"formulario_columna_cnt\">' + '<a><div class=\"izq_float\">' + '<div class=\"file_download\" >' + '<span class=\"file_download_icon\">&nbsp;</span>' + '<span class=\"file_download_text\">' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.openUploaded') + '</span></div>' + '</div></a>' + '<div class=\"izq_float delete\"><button>' + $.rup.i18nParse($.rup.i18n.base, 'rup_upload.deleteUploaded') + '</button></div>' + '</div>') + '</td></tr>');\n        row.find('.size').text(file.sizef);\n        row.find('.type').text(file.type);\n\n        if (file.error) {\n          row.find('.name').text(file.name);\n          row.addClass('ui-state-error');\n          row.find('.error').text(that.options.errorMessages[file.error] || file.error);\n        } else {\n          row.find('.name a').text(file.name);\n\n          if (file.thumbnail_url) {\n            row.find('.preview').append('<a><img></a>').find('img').prop('src', file.thumbnail_url);\n            row.find('a').prop('target', '_blank');\n          }\n\n          row.find('a').prop('href', $.rup_utils.setNoPortalParam(file.url));\n          row.find('.delete button').attr('data-type', file.delete_type).attr('data-url', $.rup_utils.setNoPortalParam(file.delete_url));\n        }\n\n        rows = rows.add(row);\n      });\n      return rows;\n    },\n    _initFileUploadButtonBar: function _initFileUploadButtonBar() {\n      var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'),\n          filesList = this.element.find('.files'),\n          ns = this.options.namespace;\n      fileUploadButtonBar.find('.start button').button({\n        icons: {\n          primary: 'ui-icon-circle-arrow-e'\n        }\n      }).on('click.' + ns, function (e) {\n        e.preventDefault();\n        filesList.find('.start button').click();\n      });\n      fileUploadButtonBar.find('.cancel').button({\n        icons: {\n          primary: 'ui-icon-cancel'\n        }\n      }).on('click.' + ns, function (e) {\n        e.preventDefault();\n        filesList.find('.cancel button').click();\n      });\n      fileUploadButtonBar.find('.delete').button({\n        icons: {\n          primary: 'ui-icon-trash'\n        }\n      }).on('click.' + ns, function (e) {\n        e.preventDefault(); //\t                filesList.find('.delete input:checked')\n        //\t                    .siblings('button').click();\n\n        filesList.find('.delete button').click();\n      });\n      fileUploadButtonBar.find('.toggle').on('change.' + ns, function () {\n        filesList.find('.delete input').prop('checked', $(this).is(':checked'));\n      });\n    },\n    _getAJAXSettings: function _getAJAXSettings(data) {\n      var options = $.extend({}, this.options, data);\n\n      this._initFormSettings(options);\n\n      this._initDataSettings(options);\n\n      return options;\n    }\n  }); //*********************************************\n  // ESPECIFICACÍON DE LOS TIPOS BASE DEL PATRÓN\n  //*********************************************\n  //*****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //*****************************************************************************************************************\n\n  var rup_upload = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_upload', rup_upload)); //********************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //********************************\n\n  $.fn.rup_upload('extend', {\n    option: function option(args) {\n      $(this).fileupload('option', args);\n    },\n\n    /**\r\n     * Elimina los objetos jQuery asociados al elemento identificado por el selector, durante el proceso de creación del componente upload\r\n     * @function\r\n     * @name destroy\r\n     * @example\r\n     * $(selector).rup_combo(\"destroy\");\r\n     */\n    destroy: function destroy() {\n      $(this).fileupload('destroy');\n    },\n\n    /**\r\n     *\r\n     * @function Habilita el componente upload\r\n     * @name enable\r\n     * @example\r\n     * $(selector).rup_upload(\"enable\");\r\n     */\n    enable: function enable() {\n      $(this).fileupload('enable');\n    },\n\n    /**\r\n     * Deshabilita el componente upload\r\n     * @function\r\n     * @name disable\r\n     * @example\r\n     * $(selector).rup_upload(\"disable\");\r\n     */\n    disable: function disable() {\n      $(this).fileupload('disable');\n    },\n\n    /**\r\n     * Permite asociar una función que se ejecutará cuando se añada un fichero mediante el componente. muestre el desplegable del combo\r\n     * @function\r\n     * @name add\r\n     * @listens add\r\n     */\n    add: function add(data) {\n      $(this).fileupload('add', data);\n    },\n    send: function send(data) {\n      $(this).fileupload('send', data);\n    }\n  }); //********************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //********************************\n\n  $.fn.rup_upload('extend', {\n    _init: function _init(args) {\n      var settings = $.extend({}, $.fn.rup_upload.defaults, args[0]),\n          upload = this;\n      upload._ADAPTER = $.rup.adapter[settings.adapter];\n      settings.self = upload; // Se configura el uso del PIF\n\n      if (settings.pif !== null) {\n        var pifSettings = jQuery.extend(true, $.fn.rup_upload.pif.defaults, settings.pif);\n\n        if (pifSettings.userFolder !== true && pifSettings.folderPath === undefined) {\n          $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_upload.pifError'));\n          return -1;\n        }\n\n        jQuery.extend(true, settings, {\n          formData: {\n            base_url: settings.url,\n            hadoop_folder_path: pifSettings.folderPath,\n            hadoop_preserve_name: pifSettings.preserveName,\n            y31_ttl: pifSettings.fileTtl,\n            securityToken: pifSettings.securityToken\n          }\n        });\n      }\n\n      $.data(this[0], 'settings', settings);\n      $(this).fileupload(settings);\n\n      if (settings.submitInForm) {\n        $(this).rup_upload('option', {\n          singleFileUploads: false,\n          maxNumberOfFiles: 1,\n          replaceFileInput: false\n        });\n      }\n\n      $(this).on({\n        fileuploadadd: function fileuploadadd() {\n          if (settings.submitInForm) {\n            $(this).find('.template-upload').hide();\n            $(this).find('.template-upload .cancel button').off('click');\n            $(this).find('.template-upload .cancel button').click();\n          }\n        },\n        fileuploadsend: function fileuploadsend(e, data) {\n          data.url = $.rup_utils.setNoPortalParam(data.url);\n\n          if (!$.rup.browser.xhrFileUploadSupport || settings.forceIframeTransport === true) {\n            data.url = data.url + (data.url.match('\\\\?') === null ? '?' : '&') + '_emulate_iframe_http_status=true';\n          }\n        },\n        fileuploadprocessfail: function fileuploadprocessfail(e, data) {\n          data.context.addClass('error');\n        }\n      }); //Se audita el componente\n\n      $.rup.auditComponent('rup_upload', 'init');\n    },\n    _private: function _private() {}\n  }); //*******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //*******************************************************\n\n  $.fn.rup_upload.defaults = {\n    // label:null,\n    // fileInput:null,\n    adapter: 'upload_bootstrap',\n    submitInForm: false,\n    submitFormButton: undefined,\n    pif: null,\n    //filesContainer: '.files',\n    uploadTemplateId: false,\n    downloadTemplateId: false,\n    uploadTemplate: function uploadTemplate(o) {\n      return o.options.self._ADAPTER.uploadTemplate.bind(this)(o);\n    },\n    downloadTemplate: function downloadTemplate(o) {\n      return o.options.self._ADAPTER.downloadTemplate.bind(this)(o);\n    },\n    // By default, the file input field is replaced with a clone after\n    // each input field change event. This is required for iframe transport\n    // queues and allows change events to be fired for the same file\n    // selection, but can be disabled by setting the following option to false:\n    replaceFileInput: false\n  };\n  $.fn.rup_upload.pif = {};\n  $.fn.rup_upload.pif.defaults = {\n    fileTtl: 129600,\n    preserveName: false,\n    _JANO_PUT_SERVLET: '/y31ApiJSWAR/Y31JanoServicePutServlet',\n    securityToken: 'app'\n  };\n  /**\r\n  * @description Propiedades de configuración del componente.\r\n  * @see Para mas información consulte la documentación acerca de las opciones de configuración del plugin {@link https://github.com/blueimp/jQuery-File-Upload/wiki/Options|jQuery File Upload}.\r\n  *\r\n  * @name options\r\n  * @property {string} [namespace] - Se utiliza para asociar el capturador de eventos del dropZone y del fileInpurt. Por defecto toma el valor del widget (“fileupload”).\r\n  * @property {jQuery} [dropZone=$(document)] - Indica el objeto jQuery que representa el área de dropZone. Para deshabilitar el soporte drag & drop se deberá indicar el valor null.\r\n  * @property {jQuery} [fileInput] - Objeto jQuery sobre el cual se monitorizarán los eventos de cambio del mismo. En caso de no especificarse se tomarán los input de tipo file existentes dentro del objeto sobre el que se ha creado el componente upload. Para deshabilitar el capturador de eventos se deberá indicar el valor null.\r\n  * @property {boolean} [replaceFileInput=true] - Determinar si el campo file es reemplazado por un nuevo objeto a partir de un clone.\r\n  * @property {string} [paramName] - Indica el nombre del parámetro de la request mediante el cual se enviará la información del fichero. En caso de no especificarse, se tomará el valor de la propiedad name del campo file. En caso de no especificarse dicha propiedad se tomará el valor files[] por defecto.\r\n  * @property {boolean} [singleFileUploads=true] - Especifica si la subida de ficheros se realizar de manera individual, es decir, si se realiza una petición XHR por cada uno de los ficheros que se deben de enviar.\r\n  * @property {boolean} [limitMultiFileUploads=true] -Especifica el número de ficheros que pueden ser enviados en una única petición XHR.\r\n  * @property {boolean} [sequentialUploads=false] - Especifica si el envío de los ficheros se realizan de manera secuencial en vez de manera simultánea.\r\n  * @property {Integer} [limitConcurrentUploads] - Indica el número máximo de peticiones concurrentes para la\r\n  subida de ficheros.\r\n  * @property {boolean} [forceIframeTransport=false] - Determina si se debe forzar el uso de iframe al realizar la subida de ficheros. Esta opción puede ser útil en caso de subida de ficheros entre diferentes dominios.\r\n  * @property {boolean} [multipart=true] - Indica si la subida de ficheros se realiza como multipart/form-data.\r\n  * @property {boolean} [recalculateProgress=true] - Por defecto, los envíos de ficheros erróneos o cancelados son excluidos del cálculo del progreso global de subida de ficheros. Para evitar el recálculo del progreso global se deberá de especificar esta opción como false.\r\n  * @property {object | object[] | function} [formData] - Información adicional que se desea enviar al realizarse la subida de ficheros. El parámetro acepta lo siguiente: <ul><li>Array de objetos con propiedades</li><li>Objeto simple</li><li>Función que retorna uno de los tipos de datos especificados anteriormente.</li></ul>\r\n  */\n\n  /***********/\n\n  /* EVENTOS */\n\n  /***********/\n\n  /**\r\n   * Permite asociar una función que se ejecutará cuando se añada un fichero mediante el componente.\r\n   *\r\n   * @event module:rup_upload#fileuploadadd\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadadd\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará cuando se añada un fichero mediante el componente.\r\n   *\r\n   * @event module:rup_upload#fileuploadsubmit\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @return {boolean} - Si la función retorna false el envío no se realiza.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadsubmit\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al iniciarse el envío de cada fichero.\r\n   *\r\n   * @event module:rup_upload#fileuploadsend\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @return {boolean} - Si la función retorna false el envío no se realiza.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadsend\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al realizarse de manera satisfactoria el envío de los ficheros.\r\n   *\r\n   * @event module:rup_upload#fileuploaddone\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploaddone\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al producirse un error en el envío de los ficheros o al abortarse el envío.\r\n   *\r\n   * @event module:rup_upload#fileuploadfail\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadfail\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al producirse un envío correcto, erróneo o se aborte.\r\n   *\r\n   * @event module:rup_upload#fileuploadalways\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadalways\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al producirse un evento relacionado con el indicador de progreso del envío de ficheros.\r\n   *\r\n   * @event module:rup_upload#fileuploadprogress\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadprogress\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al producirse un evento relacionado el indicador de progreso global de envío de ficheros.\r\n   *\r\n   * @event module:rup_upload#fileuploadprogressall\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @property {object} data - Objeto que contiene la información relativa a la subida de los ficheros.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadprogressall\", function (e, data) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al inicio del envío de los ficheros.\r\n   *\r\n   * @event module:rup_upload#fileuploadstart\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadstart\", function (e) {\r\n   * });\r\n   */\n\n  /**\r\n   * Permite asociar una función que se ejecutará al detenerse el proceso de envío de ficheros.\r\n   *\r\n   * @event module:rup_upload#fileuploadstop\r\n   * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n   * @example\r\n   * $(\"#fileupload\").on(\"fileuploadstop\", function (e) {\r\n   * });\r\n   */\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.upload.js?");

/***/ }),

/***/ "./src/rup.utils.js":
/*!**************************!*\
  !*** ./src/rup.utils.js ***!
  \**************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/*!\n * Copyright 2016 E.J.I.E., S.A.\n *\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\n * Solo podrá usarse esta obra si se respeta la Licencia.\n * Puede obtenerse una copia de la Licencia en\n *\n *      http://ec.europa.eu/idabc/eupl.html\n *\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\n * que establece la Licencia.\n */\n\n/**\n * Módulo de utilidades comunes a todos los componentes RUP. <br/><br/>\n * Implementa métodos para la manipulación de JSON, formularios, formatos...\n *\n * @summary Librería de utilidades para los componentes RUP.\n * @module rup_utils\n * @memberOf jQuery\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! jqueryUI */ \"./node_modules/jquery-ui-dist/jquery-ui.js\"), __webpack_require__(/*! ./core/utils/jquery.json-2.2 */ \"./src/core/utils/jquery.json-2.2.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  $.rup_utils = {};\n  $.rup_utils.arr = [];\n  $.rup_utils.autoGenerateIdNum = 0;\n  $.rup_utils.swinging = false;\n  $.extend($.rup_utils, {\n    /**\n     * Retorna el idioma actual capitalizado.\n     *\n     * El idioma actual se obtiene de la variable $.rup.lang\n     *\n     * @name jQuery.rup_utils#capitalizedLang\n     * @function\n     * @example\n     * // Retorna \"Es\" para un valor \"es\" en $.rup.lang.\n     * $.rup_utils.capitalizedLang();\n     * @returns {string} - Idioma actual capitalizado\n     */\n    capitalizedLang: function capitalizedLang() {\n      if ($.rup.lang == null) {\n        return '';\n      }\n\n      return $.rup.lang.charAt(0).toUpperCase() + $.rup.lang.slice(1);\n    },\n    getJson: function getJson(obj, path) {\n      var ret = $.extend({}, obj),\n          split = path.split('.');\n\n      if (split.length === 1) {\n        return obj[split[0]];\n      }\n\n      for (var i = 0; i < split.length; i++) {\n        ret = ret[split[i]];\n      }\n\n      return ret;\n    },\n    setJson: function setJson(obj, path, value) {\n      var aux = obj,\n          split = path.split('.');\n\n      if (split.length === 1) {\n        obj[split[0]] = value;\n      } else {\n        for (var i = 0; i < split.length - 1; i++) {\n          aux = aux[split[i]];\n        }\n\n        aux[split[split.length - 1]] = value;\n      }\n    },\n\n    /**\n     * Transforma un objeto JSON en un array Javascript.\n     *\n     * @name jQuery.rup_utils#jsontoarray\n     * @function\n     * @param {Object} obj - Objeto JSON que se desea transformar en un array.\n     * @returns {Object} - Array JavaScript.\n     * @example\n     * // Transforma un json obj={'prop':'value'} en un array arr['prop'] -> 'value'\n     * var obj={'prop':'value'};\n     * $.rup_utils.jsontoarray(obj);\n     * @example\n     * // Transforma un json obj={'propA':{'propAA':'value'}} en un array arr['propA.propAA'] -> 'value'\n     * var obj={'propA':{'propAA':'value'}};\n     * $.rup_utils.jsontoarray(obj);\n     * @example\n     * // Transforma un json obj={'propA':{'propAA':['a','b','c','d']}} en un array arr['propA.propAA[0]']\n     * var obj={'propA':{'propAA':['a','b','c','d']}};\n     * $.rup_utils.jsontoarray(obj);\n     */\n    jsontoarray: function jsontoarray(obj) {\n      var arr = [];\n\n      function parseJSON(obj, path) {\n        // parsea un json a un array\n        path = path || ''; // iteracion a traves (objects / arrays)\n\n        if (obj === undefined || obj === null) {\n          // Si no existe un valor para el path indicado se envia ''\n          parseJSON('', path);\n        } else if (obj.constructor == Object) {\n          for (var prop in obj) {\n            //var name = path + (path == '' ? prop : '[' + prop + ']');\n            var name = path + (path == '' ? prop : '.' + prop);\n            parseJSON(obj[prop], name);\n          }\n        } else if (obj.constructor == Array) {\n          if (obj.length == 0) {\n            parseJSON('[]', path);\n          } else {\n            for (var i = 0; i < obj.length; i++) {\n              var index = '[' + i + ']',\n                  _name = path + index;\n\n              parseJSON(obj[i], _name);\n            }\n          }\n        } else {\n          // assignment (values) if the element name hasn't yet been defined, create it as a single value\n          if (arr[path] == undefined) {\n            arr[path] = obj;\n          } else if (arr[path].constructor != Array) {\n            // if the element name HAS been defined, but it's a single value, convert to an array and add the new value\n            arr[path] = [arr[path], obj];\n          } else {\n            // if the element name HAS been defined, and is already an array, push the single value on the end of the stack\n            arr[path].push(obj);\n          }\n        }\n      }\n\n      parseJSON(obj);\n      return arr;\n    },\n\n    /**\n     * Realiza una desanidacion del json pasado (p.e.: {entidad:{propiedad:valor}}  --> {'entidad.propiedad':valor}.\n     *\n     * @name jQuery.rup_utils#unnestjson\n     * @function\n     * @param {Object} obj - Objeto JSON que se desea desanidar.\n     * @returns {Object} -  Objeto JSON desanidado.\n     * @example\n     * // Transforma un json obj={'propA':{'propAA':'valueAA'}} en un json obj={'propA.propAA':'valueAA'}}\n     * var obj={'propA':{'propAA':'valueAA'}};\n     * $.rup_utils.unnestjson(obj);\n     */\n    unnestjson: function unnestjson(obj) {\n      var array = $.rup_utils.jsontoarray(obj);\n      var json = {};\n\n      for (var key in array) {\n        if (typeof array[key] !== \"function\") {\n          json[key] = array[key];\n        }\n      }\n\n      return json;\n    },\n\n    /**\n     * Formatea una fecha a la fecha deseada \n     *\n     * @name jQuery.rup_utils#formatoFecha\n     * @function\n     * @param {date} fechaFinal - Formato de la fecha final a conseguir.\n     * @param {date} fechaInicial - Fecha inicial que se quiere manipular.\t\t\n     * @returns {array} -  Devuelve un array con la fecha modificada.\n     * @example\n     * $.formatoFecha(\"yyyy/mm/dd\" ,\"20/02/2023 15:23:21\");\n     */\n    formatoFecha: function formatoFecha(fechaFinal, fechaInicial) {\n      var fechaInicialArray = fechaInicial.split(' ');\n      var fechaFinalArray = fechaFinal.split(' ');\n      var fechaInicialString = fechaInicialArray[0]; // Verificar si la fecha está en el formato dd/mm/yyyy\n\n      var formatoCorrecto = /^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(fechaInicialString);\n\n      if (fechaFinalArray[0] === \"dd/mm/yyyy\" && formatoCorrecto) {\n        if (fechaFinalArray[1] !== undefined) {\n          return [fechaInicialArray[0], fechaInicialArray[1]];\n        } else {\n          return [fechaInicialArray[0]];\n        }\n      } else if (fechaFinalArray[0] === \"dd/mm/yyyy\" && !formatoCorrecto) {\n        var fechaArrayNuevo = fechaInicialString.split('/');\n        var nuevaFechaFormato = fechaArrayNuevo[2] + '/' + fechaArrayNuevo[1] + '/' + fechaArrayNuevo[0];\n\n        if (fechaFinalArray[1] !== undefined) {\n          return [nuevaFechaFormato, fechaInicialArray[1]];\n        } else {\n          return [nuevaFechaFormato];\n        }\n      } else if (fechaFinalArray[0] === \"yyyy/mm/dd\" && !formatoCorrecto) {\n        if (fechaFinalArray[1] !== undefined) {\n          return [fechaInicialArray[0], fechaInicialArray[1]];\n        } else {\n          return [fechaInicialArray[0]];\n        }\n      } else if (fechaFinalArray[0] === \"(dd/mm/aaaa)\" && formatoCorrecto) {\n        if (fechaFinalArray[1] !== undefined) {\n          return [fechaInicialArray[0], fechaInicialArray[1]];\n        } else {\n          return [fechaInicialArray[0]];\n        }\n      } else if (fechaFinalArray[0] === \"(dd/mm/aaaa)\" && !formatoCorrecto) {\n        var fechaArrayNuevo = fechaInicialString.split('/');\n        var nuevaFechaFormato = fechaArrayNuevo[2] + '/' + fechaArrayNuevo[1] + '/' + fechaArrayNuevo[0];\n\n        if (fechaFinalArray[1] !== undefined) {\n          return [nuevaFechaFormato, fechaInicialArray[1]];\n        } else {\n          return [nuevaFechaFormato];\n        }\n      } else if (fechaFinalArray[0] === \"(aaaa/mm/dd)\" && formatoCorrecto) {\n        var fechaArrayNuevo = fechaInicialString.split('/');\n        var nuevaFechaFormato = fechaArrayNuevo[2] + '/' + fechaArrayNuevo[1] + '/' + fechaArrayNuevo[0];\n\n        if (fechaFinalArray[1] !== undefined) {\n          return [nuevaFechaFormato, fechaInicialArray[1]];\n        } else {\n          return [nuevaFechaFormato];\n        }\n      } else if (fechaFinalArray[0] === \"(aaaa/mm/dd)\" && !formatoCorrecto) {\n        if (fechaFinalArray[1] !== undefined) {\n          return [fechaInicialArray[0], fechaInicialArray[1]];\n        } else {\n          return [fechaInicialArray[0]];\n        }\n      } else {\n        var fechaArrayNuevo = fechaInicialString.split('/');\n        var nuevaFechaFormato = fechaArrayNuevo[2] + '/' + fechaArrayNuevo[1] + '/' + fechaArrayNuevo[0];\n\n        if (fechaFinalArray[1] !== undefined) {\n          return [nuevaFechaFormato, fechaInicialArray[1]];\n        } else {\n          return [nuevaFechaFormato];\n        }\n      }\n    },\n\n    /**\n     * Devuelve el objeto del dom existente en la posición indicada.\n     *\n     * @name jQuery.rup_utils#elementFromPoint\n     * @function\n     * @param {number} x - Coordenada x de la posición en la pantalla.\n     * @param {number} y - Coordenada y de la posición en la pantalla.\n     * @param {boolean} [argCheck=true] - Determina si debe de ajustarse en base al scroll realizado en la pantalla .\n     * @returns {Object} -  Objeto del DOM correspodiente a la posición indicada.\n     * @example\n     * $.rup_utils.elementFromPoint(120,140);\n     */\n    elementFromPoint: function elementFromPoint(x, y, argCheck) {\n      var isRelative = true,\n          check = argCheck || true;\n      if (!document.elementFromPoint) return null;\n\n      if (!check) {\n        var sl;\n\n        if ((sl = $(document).scrollTop()) > 0) {\n          isRelative = document.elementFromPoint(0, sl + $(window).height() - 1) == null;\n        } else if ((sl = $(document).scrollLeft()) > 0) {\n          isRelative = document.elementFromPoint(sl + $(window).width() - 1, 0) == null;\n        }\n\n        check = sl > 0;\n      }\n\n      if (!isRelative) {\n        x += $(document).scrollLeft();\n        y += $(document).scrollTop();\n      }\n\n      return document.elementFromPoint(x, y);\n    },\n\n    /**\n     * Convierte en mínusculas el primer caracter de la cadena de caracteres pasada como parámetro.\n     *\n     * @name jQuery.rup_utils#firstCharToLowerCase\n     * @function\n     * @param {string} cadena - Cadena de caracteres inicial.\n     * @returns {string} - Cadena de caracteres resultante con su primer caracter convertido a minúsculas.\n     * @example\n     * // Convierte a minúsculas el primer caracter de la cadena \"AbCdEfg\" -> \"abCdEfg\"\n     * $.rup_utils.firstCharToLowerCase(\"AbCdEfg\");\n     */\n    firstCharToLowerCase: function firstCharToLowerCase(cadena) {\n      return cadena.substring(0, 1).toLowerCase() + cadena.substring(1);\n    },\n\n    /**\n     * Devuelve un string que puede ser utilizado como selector de jQuery mediante el id ('#'). El método permite también escapar los caracteres reservados en los selectores de jQuery\n     *\n     * @name jQuery.rup_utils#firstCharToLowerCase\n     * @function\n     * @param {string} cadena - Cadena de caracteres inicial.\n     * @returns {string} - Cadena de caracteres resultante con su primer caracter convertido a minúsculas.\n     * @example\n     * // Convierte a minúsculas el primer caracter de la cadena \"AbCdEfg\" -> \"abCdEfg\"\n     * $.rup_utils.firstCharToLowerCase(\"AbCdEfg\");\n     */\n    getJQueryId: function getJQueryId(sid, escaped) {\n      var returnIdSelector;\n\n      if (typeof sid === 'string') {\n        returnIdSelector = sid;\n\n        if (escaped === true) {\n          returnIdSelector = String(returnIdSelector).replace(/[!\"#$%&'()*+,./:; <=>?@[\\\\\\]^`{|}~]/g, '\\\\$&');\n        }\n\n        return returnIdSelector[0] === '#' ? returnIdSelector : '#' + returnIdSelector;\n      }\n\n      return null;\n    },\n\n    /**\n     * Convierte una cadena querystring en un objeto json.\n     *\n     * @name jQuery.rup_utils#queryStringToJson\n     * @function\n     * @param {string} queryString - Query string a transformar en un objeto json.\n     * @param {string} [serializerSplitter=&] - Cadena a usar para separar los campos.\n     * @param {boolean} [allowAllCharacters=false] - Habilita la posibilidad de incluir cualquier carácter en los campos.\n     * @returns {object} - Objeto JSON creado a partir de la query string indicada.\n     * @example\n     * // Obtene un json a partir del query string \"keyA=valueA&keyB=valueB&keyC=valueC\" -> \"{keyA:'valueA', keyB:'valueB', keyC:'valueC'}\"\n     * $.rup_utils.queryStringToJson(\"keyA=valueA&keyB=valueB&keyC=valueC\");\n     */\n    queryStringToJson: function queryStringToJson(queryString) {\n      var serializerSplitter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '&';\n      var allowAllCharacters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      function setValue(root, path, value) {\n        if (path.length > 1) {\n          var dir = path.shift();\n\n          if (typeof root[dir] == 'undefined') {\n            root[dir] = path[0] == '' ? [] : {};\n          }\n\n          arguments.callee(root[dir], path, value);\n        } else {\n          if (root instanceof Array) {\n            root.push(value);\n          } else if (path[0].indexOf('.') != -1) {\n            // Entra por aquí en caso de que uno de los path sea un objeto\n            var padre = path[0].slice(0, path[0].indexOf('.'));\n            var hijo = path[0].slice(path[0].indexOf('.') + 1, path[0].length);\n\n            if (root[padre] != undefined) {\n              root[padre][hijo] = value;\n            } else {\n              root[padre] = _defineProperty({}, hijo, value);\n            }\n          } else {\n            root[path] = value;\n          }\n        }\n      }\n\n      var nvp = [],\n          nvpBruto = queryString.split(serializerSplitter),\n          data = {},\n          pair,\n          name,\n          value,\n          path,\n          first; //Se revisa la correcta gestion de los campos\n\n      for (var i = 0; i < nvpBruto.length; i++) {\n        pair = nvpBruto[i].split('=');\n\n        if (pair.length >= 2) {\n          nvp.push(nvpBruto[i]);\n        } else if (pair.length == 1) {\n          nvp[i - 1] = nvp[i - 1] + serializerSplitter + nvpBruto[i];\n        }\n      }\n\n      for (var i = 0; i < nvp.length; i++) {\n        pair = nvp[i].split('=');\n\n        if (pair.length > 2) {\n          var pairAux = '';\n\n          for (var j = 1; j < pair.length; j++) {\n            if (j == 1) {\n              pairAux = pair[j];\n            } else {\n              pairAux = pairAux + \"=\" + pair[j];\n            }\n          }\n\n          pair[pair.length - 1] = pairAux;\n        }\n\n        name = decodeURIComponent(pair[0]);\n\n        if (pair[pair.length - 1].includes(\"%\")) {\n          if (allowAllCharacters && !pair[pair.length - 1].includes(\"%25\")) {\n            pair[pair.length - 1] = encodeURIComponent(pair[pair.length - 1]);\n          } else if (!allowAllCharacters) {\n            $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_utils.illegalChar'));\n          }\n        }\n\n        value = decodeURIComponent(pair[pair.length - 1]);\n        path = name.match(/(^[^[]+)(\\[.*\\]$)?/);\n        first = path[1];\n\n        if (path[2]) {\n          // case of 'array[level1]' ||\n          // 'array[level1][level2]'\n          path = path[2].match(/(?=\\[(.*)\\]$)/)[1].split('][');\n        } else {\n          // case of 'name'\n          path = [];\n        }\n\n        path.unshift(first);\n        setValue(data, path, value);\n      }\n\n      return data;\n    },\n\n    /**\n     * Devuelve un string con los caracteres sencillos.\n     *\n     * @name normalize\n     * @function\n     * @since UDA 3.3.0\n     * \n     * @param {string} texto - Cadena de caracteres inicial.\n     * @returns {string} - Cadena de caracteres sin accentFolding.\n     * \n     * @example\n     * // Convierte los caracteres de la cadena \"áéíóu\" a \"aeiou\"\n     * $.rup_utils.normalize(\"áéíóu\");\n     */\n    normalize: function normalize(texto) {\n      var accentMap = {\n        'á': 'a',\n        'é': 'e',\n        'í': 'i',\n        'ó': 'o',\n        'ú': 'u',\n        'Á': 'A',\n        'É': 'E',\n        'Í': 'I',\n        'Ó': 'O',\n        'Ú': 'U'\n      };\n      var cadena = '';\n\n      for (var i = 0; i < texto.length; i++) {\n        cadena += accentMap[texto.charAt(i)] || texto.charAt(i);\n      }\n\n      return cadena;\n    },\n    populateForm: function populateForm(aData, formid) {\n      //rellena un formulario que recibe como segundo parametro con los datos que recibe en el segundo parametro\n      var formElem;\n      var tree_data, selectorArray;\n\n      function loadedJstreeEvent() {\n        var selectorArbol = this.id; //$(this).rup_tree(\"setRupValue\",$arbol[selectorArbol]);\n\n        $(this).trigger('rup_filter_treeLoaded', $arbol[selectorArbol]);\n      }\n\n      function populateRadioCheckbox() {\n        if ($(this).val() == aData[i]) {\n          $(this).prop('checked', true);\n        } else {\n          $(this).prop('checked', false);\n        }\n      }\n\n      if (aData) {\n        for (var i in aData) {\n          tree_data = [];\n          formElem = $('[name=\\'' + i + '\\']', formid);\n\n          if (formElem.length == 0) {\n            selectorArray = i.substr(0, i.indexOf('['));\n            formElem = $('[name=\\'' + selectorArray + '\\']', formid);\n          }\n\n          if (formElem.is('[ruptype]')) {\n            if (formElem.hasClass('jstree')) {\n              for (var a in aData) {\n                if (a.substr(0, a.indexOf('[')) == selectorArray) {\n                  tree_data.push(aData[a]);\n                }\n              }\n\n              formElem['rup_' + formElem.attr('ruptype')]('setRupValue', tree_data);\n              var $arbol = [];\n              $arbol[selectorArray] = tree_data;\n              formElem.on('loaded.jstree', loadedJstreeEvent);\n            } else {\n              // Forma de evitar el EVAL\n              formElem['rup_' + formElem.attr('ruptype')]('setRupValue', aData[i]);\n            }\n          } else if (formElem.is('input:radio') || formElem.is('input:checkbox')) {\n            formElem.each(populateRadioCheckbox);\n          } else if (formElem.is('select')) {\n            formElem.val(aData[i]).click();\n          } else if (formElem.is(':not(img)')) {\n            // this is very slow on big table and form.\n            formElem.val(aData[i]);\n          }\n        }\n      }\n    },\n    //DATE UTILS\n    createDate: function createDate(day, month, year) {\n      return $.datepicker.formatDate($.rup.i18n.base.rup_date.dateFormat, new Date(year, month - 1, day));\n    },\n    createTime: function createTime(hour, minute, second) {\n      return new Date(null, null, null, hour, minute, second);\n    },\n\n    /*!\n     * jQuery CooQuery Plugin v2\n     * http://cooquery.lenonmarcel.com.br/\n     *\n     * Copyright 2009, 2010 Lenon Marcel\n     * Dual licensed under the MIT and GPL licenses.\n     * http://www.opensource.org/licenses/mit-license.php\n     * http://www.gnu.org/licenses/gpl.html\n     *\n     * Date: 2010-01-24 (Sun, 24 January 2010)\n     */\n    //TODO: Documentacion -> http://plugins.jquery.com/project/cooquery\n    setCookie: function setCookie(name, value, options) {\n      if (typeof name === 'undefined' || typeof value === 'undefined' || name === null || value === null) {\n        $.rup.errorGestor('[' + $.rup.i18nParse($.rup.i18n.base, 'rup_global.metodError') + 'setCookie] - ' + $.rup.i18nParse($.rup.i18n.base, 'rup_utils.paramsError'));\n        return false;\n      }\n\n      var str = name + '=' + encodeURIComponent(value);\n\n      if (typeof options !== 'undefined' && options !== null) {\n        if (options.domain) str += '; domain=' + options.domain;\n        if (options.path) str += '; path=' + options.path;\n\n        if (options.duration) {\n          var date = new Date();\n          date.setTime(date.getTime() + options.duration * 24 * 60 * 60 * 1000);\n          str += '; expires=' + date.toGMTString();\n        }\n\n        if (options.secure) str += '; secure';\n      }\n\n      return document.cookie = str;\n    },\n    delCookie: function delCookie(name) {\n      if (typeof name === 'undefined' || name === null) {\n        $.rup.errorGestor('[' + $.rup.i18nParse($.rup.i18n.base, 'rup_global.metodError') + 'delCookie] - ' + $.rup.i18nParse($.rup.i18n.base, 'rup_utils.paramsError'));\n        return false;\n      }\n\n      return $.rup_utils.setCookie(name, '', {\n        duration: -1\n      });\n    },\n    readCookie: function readCookie(name) {\n      if (typeof name === 'undefined' || name === null) {\n        $.rup.errorGestor('[' + $.rup.i18nParse($.rup.i18n.base, 'rup_global.metodError') + 'readCookie] - ' + $.rup.i18nParse($.rup.i18n.base, 'rup_utils.paramsError'));\n        return false;\n      }\n\n      var value = document.cookie.match('(?:^|;)\\\\s*' + name.replace(/([-.*+?^${}()|[\\]/\\\\])/g, '\\\\$1') + '=([^;]*)');\n      return value ? decodeURIComponent(value[1]) : null;\n    },\n    get: function get(name, json) {\n      var cookieValue = null;\n\n      if (document.cookie && document.cookie != '') {\n        var cookies = document.cookie.split(';');\n\n        for (var i = 0; i < cookies.length; i++) {\n          var cookie = cookies[i].trim();\n\n          if (cookie.substring(0, name.length + 1) == name + '=') {\n            cookieValue = json ? $.JSON.decode(decodeURIComponent(cookie.substring(name.length + 1))) : decodeURIComponent(cookie.substring(name.length + 1));\n            break;\n          }\n        }\n      }\n\n      return cookieValue;\n    },\n    set: function set(name, value, options) {\n      options = $.extend({}, options);\n\n      if (value === null) {\n        value = '';\n        options.expires = -1;\n      }\n\n      var expires = '';\n\n      if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {\n        var date;\n\n        if (typeof options.expires == 'number') {\n          date = new Date();\n          date.setTime(date.getTime() + options.expires * 24 * 60 * 60 * 1000);\n        } else {\n          date = options.expires;\n        }\n\n        expires = '; expires=' + date.toUTCString();\n      }\n\n      value = options.json ? encodeURIComponent($.JSON.encode(value)) : encodeURIComponent(value);\n      var path = options.path ? '; path=' + options.path : '';\n      var domain = options.domain ? '; domain=' + options.domain : '';\n      var secure = options.secure ? '; secure' : '';\n      document.cookie = [name, '=', value, expires, path, domain, secure].join('');\n    },\n    //compare objects function\n    compareObjects: function compareObjects(x, y) {\n      var objectsAreSame = true;\n\n      if (Object.keys(x).length !== Object.keys(y).length) {\n        return false;\n      }\n\n      for (var propertyName in x) {\n        if (_typeof(x[propertyName]) == 'object' && _typeof(y[propertyName]) == 'object') {\n          objectsAreSame = this.compareObjects(x[propertyName], y[propertyName]);\n          if (!objectsAreSame) break;\n        } else {\n          if (x[propertyName] !== y[propertyName]) {\n            objectsAreSame = false;\n            break;\n          }\n        }\n      }\n\n      return objectsAreSame;\n    },\n    escapeId: function escapeId(id) {\n      if (id) {\n        return id.replace(/([ #;&,.+*~':\"!^$[\\]()=>|/@])/g, '\\\\$1');\n      }\n\n      return '';\n    },\n    selectorId: function selectorId(id) {\n      if (typeof id === 'string' && id.substring(0, 1) !== '#') {\n        return '#' + id;\n      } else {\n        return id;\n      }\n    },\n    //Genera un identificador aleatorio para un objeto determinado\n    randomIdGenerator: function randomIdGenerator(selectObject) {\n      var id = 'rupRandomLayerId-' + $.rup_utils.autoGenerateIdNum;\n      selectObject.attr('id', id).addClass('rupRandomLayerId');\n      $.rup_utils.autoGenerateIdNum = $.rup_utils.autoGenerateIdNum + 1;\n      return id;\n    },\n    //Función encargada de gestionar las url's de las aplicaciones en portal\n    setNoPortalParam: function setNoPortalParam(url) {\n      if (url !== undefined && url !== null) {\n        if ($.rup_utils.readCookie('r01PortalInfo') !== null && url.match('R01HNoPortal') === null && $('div.r01gContainer').length > 0 || $('div.r01gApplication').length > 0) {\n          return url + (url.match('\\\\?') === null ? '?' : '&') + 'R01HNoPortal=true';\n        }\n      }\n\n      return url;\n    },\n    //Función encargada de detectar si la aplicación esta integrada en portal\n    aplicatioInPortal: function aplicatioInPortal() {\n      if (!($.rup_utils.readCookie('r01PortalInfo') !== null && $('div.r01gContainer').length > 0)) {\n        return false;\n      } else {\n        return true;\n      }\n    },\n    //Funcion encargada de pasar las urls relativas a absolutas.\n    //Esta diseñado para terminar con los problemas de comportamientos anómalo de los navegadores en la redirecciones relativas\n    relToAbsUrl: function relToAbsUrl(url) {\n      var urlPage = $(location);\n\n      if (typeof url === 'string') {\n        var fChar1 = url.substring(0, 1);\n        var fChar2 = url.substring(1, 2);\n\n        if ($.url(url).attr('protocol') === undefined || $.url(url).attr('protocol') === '') {\n          if (fChar1 === '/') {\n            if (fChar2 === undefined || fChar2 !== '/') {\n              return urlPage.attr('protocol') + '//' + urlPage.attr('host') + url;\n            } else {\n              return urlPage.attr('protocol') + url;\n            }\n          } else if (fChar1 === '.') {\n            if (fChar2 === undefined) {\n              $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_utils.relToAbsUrlParamError') + url + $.rup.i18nParse($.rup.i18n.base, 'rup_utils.relToAbsUrlParamErrorEnd'));\n              return undefined;\n            } else if (fChar2 === '/') {\n              var analyzedUrl = $.url(urlPage.attr('href'), true);\n              return analyzedUrl.attr('base') + analyzedUrl.attr('directory') + url.substring(2, url.length);\n            } else if (fChar2 === '.') {\n              var urlPageFragments = urlPage.attr('pathname').split('/');\n              var urlPageLength = urlPageFragments.length - 2;\n\n              if (url.substring(2, 3) !== undefined && url.substring(2, 3) === '/') {\n                var urlFragments = url.split('../');\n                var urlLength = urlFragments.length - 1;\n\n                if (urlLength >= urlPageLength) {\n                  return urlPage.attr('protocol') + '//' + urlPage.attr('host') + '/' + urlFragments[urlFragments.length - 1];\n                } else {\n                  var cade = '';\n\n                  for (var i = urlPageLength - urlLength; i > 0; i--) {\n                    cade = urlPageFragments[i] + '/' + cade;\n                  }\n\n                  return urlPage.attr('protocol') + '//' + urlPage.attr('host') + '/' + cade + urlFragments[urlFragments.length - 1];\n                }\n              } else {\n                var _urlFragments = url.split('..');\n\n                var _urlLength = _urlFragments.length - 1;\n\n                if (_urlLength >= urlPageLength) {\n                  return urlPage.attr('protocol') + '//' + urlPage.attr('host') + _urlFragments[_urlFragments.length - 1];\n                } else {\n                  var _cade = '';\n\n                  for (var _i = urlPageLength - _urlLength; _i > 0; _i--) {\n                    _cade = urlPageFragments[_i] + '/' + _cade;\n                  }\n\n                  return urlPage.attr('protocol') + '//' + urlPage.attr('host') + '/' + _cade + _urlFragments[_urlFragments.length - 1];\n                }\n              }\n            } else {\n              $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_utils.relToAbsUrlParamError') + url + $.rup.i18nParse($.rup.i18n.base, 'rup_utils.relToAbsUrlParamErrorEnd'));\n              return undefined;\n            }\n          } else {\n            var _analyzedUrl = $.url(urlPage.attr('href'), true);\n\n            return _analyzedUrl.attr('base') + _analyzedUrl.attr('directory') + url;\n          }\n        } else {\n          return url;\n        }\n      } else {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_utils.relToAbsUrlParamFormatError'));\n        return undefined;\n      }\n    },\n    printMsg: function printMsg(msg) {\n      var ret = '';\n\n      if (typeof msg === 'string') {\n        return msg + '<br/>';\n      } else if (_typeof(msg) === 'object') {\n        if (Array.isArray(msg)) {\n          for (var i = 0; i < msg.length; i++) {\n            ret += $.rup_utils.printMsgAux(msg[i], 1);\n          }\n\n          return ret;\n        } else {\n          ret += $.rup_utils.printMsgAux(msg, 1);\n        }\n      }\n\n      return ret;\n    },\n    printMsgAux: function printMsgAux(msg, nivel) {\n      var ret = '';\n\n      if (typeof msg === 'string') {\n        return $('<span>').append(msg)[0].outerHTML + '<br/>';\n      } else if (_typeof(msg) === 'object') {\n        if (Array.isArray(msg)) {\n          var ul = $('<ul>').addClass('rup-maint_feedbackUL');\n\n          for (var i = 0; i < msg.length; i++) {\n            //\t\t\t\t\t\tif (typeof msg[i]===\"string\" || (typeof msg[i]===\"object\" && !Array.isArray(msg))){\n            if (nivel === 1) {\n              ul.append($('<li>').append($.rup_utils.printMsgAux(msg[i], nivel + 1)));\n            } else {\n              ul.append($.rup_utils.printMsgAux(msg[i], nivel + 1));\n            }\n          }\n\n          return ret += ul[0].outerHTML;\n        } else {\n          var span = $('<span>');\n\n          if (msg.style !== undefined) {\n            span.addClass(msg.style);\n          }\n\n          if (msg.label !== undefined) {\n            span.append(msg.label);\n          }\n\n          return span[0].outerHTML + '<br/>';\n        }\n      }\n    },\n    //Función encargada de recuperar todas las variables pasadas por QueryString (en la url)\n    getUrlVars: function getUrlVars() {\n      if ($.rup.getParams === undefined) {\n        var vars = {},\n            hash;\n        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');\n\n        for (var i = 0; i < hashes.length; i++) {\n          hash = decodeURIComponent(hashes[i]).split('=');\n          vars[hash[0]] = hash[1];\n        }\n\n        $.rup.getParams = vars;\n      }\n\n      return $.rup.getParams;\n    },\n    //Función encargada de recuperar una variable especifica de las pasadas por QueryString (en la url)\n    getUrlVar: function getUrlVar(name) {\n      return $.rup_utils.getUrlVars()[name];\n    },\n    sortArray: function sortArray(array, sortFnc) {\n      function defaultSortFnc(obj1, obj2) {\n        return obj1 - obj2;\n      }\n\n      function bubbleSort(a, fnc) {\n        var swapped;\n\n        do {\n          swapped = false;\n\n          for (var i = 0; i < a.length - 1; i++) {\n            if (fnc(a[i], a[i + 1]) < 0) {\n              var temp = a[i];\n              a[i] = a[i + 1];\n              a[i + 1] = temp;\n              swapped = true;\n            }\n          }\n        } while (swapped);\n      }\n\n      if (!Array.isArray(array)) {\n        return undefined;\n      }\n\n      if (typeof sortFnc === \"function\") {\n        bubbleSort(array, sortFnc);\n      } else {\n        bubbleSort(array, defaultSortFnc);\n      }\n    },\n    insertSorted: function insertSorted(array, elem, sortFnc) {\n      function defaultSortFnc(obj1, obj2) {\n        return obj2 - obj1;\n      }\n\n      if (!Array.isArray(array)) {\n        return undefined;\n      }\n\n      array.push(elem);\n\n      if (typeof sortFnc === \"function\") {\n        $.rup_utils.sortArray(array, sortFnc);\n      } else {\n        $.rup_utils.sortArray(array, defaultSortFnc);\n      }\n\n      return $.inArray(elem, array);\n    },\n    getRupValueAsJson: function getRupValueAsJson(name, value) {\n      var arrTmp,\n          dotNotation = false,\n          dotProperty,\n          tmpJson,\n          returnArray = [];\n\n      if (name) {\n        // Miramos si el name contiene notación dot\n        arrTmp = name.split('.');\n\n        if (arrTmp.length > 1) {\n          dotNotation = true;\n          dotProperty = arrTmp[arrTmp.length - 1];\n        } else {\n          dotProperty = arrTmp[0];\n        }\n\n        if (Array.isArray(value)) {\n          //issue [utils] getRupValueAsJson provoca error con los arrays vacíos #24\n          //https://github.com/UDA-EJIE/udaRUP/issues/24\n          if (value.length !== 0) {\n            // Devolvemos un array de resultados.\n            for (var i = 0; i < value.length; i++) {\n              tmpJson = {};\n\n              if (dotNotation) {\n                tmpJson[dotProperty] = value[i];\n                returnArray.push(tmpJson);\n              } else {\n                tmpJson[dotProperty] = value[i];\n                returnArray.push(tmpJson);\n              }\n            }\n\n            return returnArray;\n          }\n        } else {\n          // Devolvemos un único valor.\n          tmpJson = {};\n          tmpJson[dotProperty] = value;\n          return tmpJson;\n        }\n      }\n\n      return null;\n    },\n    getRupValueWrapped: function getRupValueWrapped(name, value) {\n      var arrTmp,\n          dotProperty,\n          wrapObj = {};\n\n      if (name) {\n        // Miramos si el name contiene notación dot\n        arrTmp = name.split('.');\n\n        if (arrTmp.length > 1) {\n          dotProperty = arrTmp[arrTmp.length - 1];\n        } else {\n          return value;\n        }\n\n        wrapObj[dotProperty] = value;\n        return wrapObj;\n      }\n\n      return null;\n    },\n    swing2Top: function swing2Top() {\n      if (!$.rup_utils.swinging) {\n        $.rup_utils.swinging = true;\n        $('html, body').animate({\n          scrollTop: 0\n        }, '1000', 'swing', function () {\n          $.rup_utils.swinging = false;\n        });\n      }\n    },\n    format: function format(_format) {\n      var args = $.makeArray(arguments).slice(1);\n\n      if (_format == null) {\n        _format = '';\n      }\n\n      return _format.replace(/\\{(\\d+)\\}/g, function (m, i) {\n        return args[i];\n      });\n    },\n    deepCopy: function deepCopy(obj, deep) {\n      var deepCont = 0;\n      var objBox = [];\n\n      var fnc = function fnc(obj) {\n        var objtmp;\n\n        if (obj instanceof Array) {\n          objtmp = [];\n        } else {\n          objtmp = {};\n        }\n\n        if (obj === null || obj === undefined) {\n          return {};\n        }\n\n        Object.keys(obj).forEach(function (e) {\n          if (['string', 'number', 'boolean', 'function'].includes(_typeof(obj[e]))) {\n            objtmp[e] = obj[e];\n          } else {\n            if (!objBox.includes(obj[e]) && deepCont <= deep) {\n              objBox.push(obj[e]);\n              deepCont++;\n              objtmp[e] = $.rup_utils.deepCopy(obj[e]);\n            } else {\n              if (deepCont > deep) {\n                objtmp[e] = obj[e];\n              } else {\n                objtmp[e] = '__ciclico__';\n              }\n            }\n          }\n        });\n        return objtmp;\n      };\n\n      return fnc(obj);\n    },\n\n    /**\n        * Comprueba si el parámetro es un número. \n        * Sustituye al método isNumeric de jQuery que fue deprecado en la versión 3.3.\n        *\n        * @name isNumeric\n        * @function\n        * @since UDA 5.1.0\n        *\n        * @param {number|string|boolean|object} field - Campo a comprobar.\n        *\n        * @return {boolean} Indica si es un número.\n        * \n        * @example\n     * $.rup_utils.isNumeric(6);\n        */\n    isNumeric: function isNumeric(field) {\n      return !isNaN(parseFloat(field)) && isFinite(field);\n    }\n  }); //Utilidades de los formularios\n\n  $.fn.serializeToObject = function () {\n    //Para enviar los campos que contienen valor (!= \"\")\n    var o = {},\n        a = this.serializeArrayWithoutNulls();\n    $.each(a, function () {\n      if (o[this.name]) {\n        if (!o[this.name].push) {\n          o[this.name] = [o[this.name]];\n        }\n\n        o[this.name].push(this.value || '');\n      } else {\n        o[this.name] = this.value;\n      }\n    });\n    return o;\n  };\n\n  $.fn.serializeArrayWithoutNulls = function () {\n    //crea un array con campos de un formulario que tienen valor !=\"\"\n    return this.map(function () {\n      return this.elements ? jQuery.makeArray(this.elements) : this;\n    }).filter(function () {\n      return this.name && !this.disabled && (this.checked || /select|textarea/i.test(this.nodeName) || /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i.test(this.type));\n    }).map(function (i, elem) {\n      var val = jQuery(this).val();\n\n      if (jQuery(this).hasClass('numeric') || jQuery(this).hasClass('datepicker')\n      /*&& val === \"\"*/\n      ) {\n        return {\n          name: elem.name,\n          value: null\n        };\n      }\n\n      return val === null || val === '' ? null : Array.isArray(val) ? jQuery.map(val, function (val) {\n        return {\n          name: elem.name,\n          value: val\n        };\n      }) : {\n        name: elem.name,\n        value: val\n      };\n    }).get();\n  };\n\n  $.fn.serializeObject = function () {\n    //Para enviar los campos nulos con null en vez de en blanco\n    var o = {},\n        a = this.serializeArrayNull();\n    $.each(a, function () {\n      if (o[this.name]) {\n        if (!o[this.name].push) {\n          o[this.name] = [o[this.name]];\n        }\n\n        o[this.name].push(this.value || '');\n      } else {\n        o[this.name] = this.value;\n      }\n    });\n    return o;\n  };\n\n  $.fn.serializeArrayNull = function () {\n    return this.map(function () {\n      return this.elements ? jQuery.makeArray(this.elements) : this;\n    }).filter(function () {\n      return this.name && !this.disabled && (this.checked || /select|textarea/i.test(this.nodeName) || /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i.test(this.type));\n    }).map(function (i, elem) {\n      var val = jQuery(this).val();\n\n      if ((jQuery(this).hasClass('numeric') || jQuery(this).hasClass('datepicker')) && val === '') {\n        return {\n          name: elem.name,\n          value: null\n        };\n      }\n\n      return val === null ? null : Array.isArray(val) ? jQuery.map(val, function (val) {\n        return {\n          name: elem.name,\n          value: val\n        };\n      }) : {\n        name: elem.name,\n        value: val\n      };\n    }).get();\n  };\n  /**\n      * Elimina el campo autogenerado por el componente combo de un objeto. \n      * Dicho campo sólo sirve para gestión interna, por lo tanto, es seguro y recomendable eliminarlo.\n      *\n      * @name deleteMulticomboLabelFromObject\n      * @function\n      * @since UDA 4.2.2\n      *\n      * @param {object} obj - Objeto del que se quiere eliminar el campo autogenerado.\n      * @param {object} container - Contenedor del componente.\n      */\n\n\n  $.fn.deleteMulticomboLabelFromObject = function (obj, container) {\n    if (obj !== undefined && obj !== null && container !== undefined && container !== null) {\n      Object.keys(obj).filter(function (key) {\n        // Se escapan todos los puntos para evitar errores sintácticos\n        var escapedKey = key.replaceAll('.', '\\\\.'); // Si container es un fila de la tabla (tr) significa que la función ha sido llamada desde rup.table.inlineEdit y es necesario añadir el sufijo _inline\n\n        var suffix = container.is('tr') ? '_inline' : '';\n        var element = container.find(\"[name$=\" + escapedKey + suffix + \"]\");\n\n        if (element.length > 1 && $(element[0]).prop('multiple')) {\n          delete obj[\"_\" + key];\n        }\n      });\n    }\n  };\n  /**\n   * Elimina el campo autogenerado por el componente autocomplete de un objeto. \n   * Dicho campo sólo sirve para gestión interna, por lo tanto, es seguro y recomendable eliminarlo.\n   *\n   * @name deleteAutocompleteLabelFromObject\n   * @function\n   * @since UDA 4.2.2\n   *\n   * @param {object} obj - Objeto del que se quiere eliminar el campo autogenerado.\n   */\n\n\n  $.fn.deleteAutocompleteLabelFromObject = function (obj) {\n    if (obj !== undefined && obj !== null) {\n      var flattenedObj = $.fn.flattenJSON(obj); // Nos aseguramos de que el campo _label provenga de un autocomplete\n\n      Object.keys(flattenedObj).filter(function (key) {\n        if (/_label$/.test(key)) {\n          if (Object.prototype.hasOwnProperty.call(flattenedObj, key.substring(0, key.indexOf('_label')))) {\n            // Necesario hacer un split por si la clave a usar está anidada\n            var keys = key.split('.'); // Eliminamos el _label\n\n            var recursiveRemoveKey = function recursiveRemoveKey(object, deleteKey) {\n              if (object[deleteKey] != undefined) {\n                delete object[deleteKey];\n              } else {\n                Object.values(object).forEach(function (val) {\n                  if (_typeof(val) === 'object') {\n                    recursiveRemoveKey(val, deleteKey);\n                  }\n                });\n              }\n            };\n\n            recursiveRemoveKey(obj, keys[keys.length - 1]);\n          }\n        }\n      });\n    }\n  };\n  /**\n      * Convierte un JSON con múltiples niveles en un JSON con un único nivel.\n      *\n      * @name flattenJSON\n      * @function\n      * @since UDA 5.0.2\n      *\n      * @param {object} originalObj - Objeto con varios niveles (admite también un único nivel, pero no tiene sentido llamar a la función en ese caso).\n      * @param {object} flattenedObj - Objeto con un único nivel. Se incluye entre los parámetros porque la función lo usará si se llama a sí misma.\n      * @param {string} extraKey - Clave necesaria cuando hay más de un nivel. Se incluye entre los parámetros porque la función lo usará si se llama a sí misma.\n      * \n      * @return {object} Objeto con un único nivel.\n      */\n\n\n  $.fn.flattenJSON = function (originalObj) {\n    var flattenedObj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var extraKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    for (var key in originalObj) {\n      if (_typeof(originalObj[key]) !== 'object') {\n        flattenedObj[extraKey + key] = originalObj[key];\n      } else {\n        $.fn.flattenJSON(originalObj[key], flattenedObj, \"\".concat(extraKey).concat(key, \".\"));\n      }\n    }\n\n    return flattenedObj;\n  };\n  /**\n      * Comprueba si el parámetro ha sido cifrado por Hdiv.\n      *\n      * @name isHdiv\n      * @function\n      * @since UDA 5.0.0 (backported)\n      *\n      * @param {string} id - Identificador de la entidad.\n      *\n      * @return {boolean} Verdadero si el parámetro ha sido cifrado por Hdiv.\n      */\n\n\n  $.fn.isHdiv = function (id) {\n    return /(.+)-([0-9a-fA-F]{3})-(.{8}-([0-9a-fA-FU]{1,33})-\\d+-.+)/.test(id);\n  };\n  /**\n      * Procesa el identificador recibido para poder devolver la parte que no altera su cifrado entre peticiones.\n      * Es útil cuando se necesita comparar identificadores cifrados.\n      *\n      * @name getStaticHdivID\n      * @function\n      * @since UDA 5.0.0 (backported)\n      *\n      * @param {string} id - Identificador de la entidad.\n      *\n      * @return {string} Identificador de la entidad con la parte dinámica del cifrado eliminada.\n      */\n\n\n  $.fn.getStaticHdivID = function (id) {\n    var regex = /([0-9a-fA-F]+)-([0-9a-fA-F]+)-([0-9a-fA-F]+)$/;\n\n    if (regex.test(id)) {\n      id = id.replace(regex, '');\n    }\n\n    return id;\n  };\n  /**\n      * Obtiene el parámetro HDIV_STATE de la URL o de un formulario.\n      *\n      * @name getHDIV_STATE\n      * @function\n      * @since UDA 5.0.0 (backported)\n      *\n      * @param {boolean} hasMoreParams - Parámetro necesario para peticiones GET. Se utilizará para saber si el parámetro HDIV_STATE es el único existente en la URL.\n      * @param {object} $form - Formulario del que extraer el parámetro HDIV_STATE. Este parámetro tiene prioridad respecto a hasMoreParams, por lo tanto, si se recibe será el que se use.\n      *\n      * @return {string} Parámetro HDIV_STATE.\n      */\n\n\n  $.fn.getHDIV_STATE = function (hasMoreParams, $form) {\n    var hdivStateParam = ''; // Cuando se recibe un formulario se extrae directamente de ahí el parámetro HDIV_STATE\n\n    if ($form != undefined && $form.length == 1) {\n      var fieldHdiv = $form.find('input[name=\"_HDIV_STATE_\"]');\n      hdivStateParam = fieldHdiv.length == 1 ? fieldHdiv.val() : '';\n    } else {\n      // Si el parámetro HDIV_STATE está disponible se obtiene y se devuelve, en caso contrario, se devuelve vacío\n      var searchParams = new URLSearchParams(window.location.search);\n      hdivStateParam = searchParams.get('_HDIV_STATE_');\n      var prefix = ''; // Si se ha especificado un valor booleano en el parámetro recibido es porque se trata de una petición GET\n\n      if (hasMoreParams !== undefined && hasMoreParams !== null && typeof hasMoreParams === \"boolean\") {\n        prefix = (hasMoreParams ? '&' : '?') + '_HDIV_STATE_=';\n      }\n\n      if (hdivStateParam != undefined && hdivStateParam != null && hdivStateParam != '') {\n        hdivStateParam = prefix + hdivStateParam;\n      } else {\n        hdivStateParam = '';\n      }\n    }\n\n    return hdivStateParam;\n  };\n  /**\n      * Reinicia por completo los autocomplete de un formulario para que no sigan filtrando.\n      *\n      * @name resetAutocomplete\n      * @function\n      * @since UDA 4.2.2\n      *\n      * @param {string} type - Valor del atributo type.\n      * @param {object} obj - Formulario del que obtener los autocompletes a reiniciar.\n      */\n\n\n  $.fn.resetAutocomplete = function (type, obj) {\n    jQuery.each($('input[ruptype=autocomplete][type=' + type + ']', obj), function (index, elem) {\n      $(\"#\" + elem.id).rup_autocomplete(\"setRupValue\", \"\");\n    });\n  };\n\n  jQuery.rup_utils.base64 = {\n    // private property\n    _keyStr: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n    // public method for encoding\n    encode: function encode(input) {\n      var output = '';\n      var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n      var i = 0;\n      input = jQuery.rup_utils.base64._utf8_encode(input);\n\n      while (i < input.length) {\n        chr1 = input.charCodeAt(i++);\n        chr2 = input.charCodeAt(i++);\n        chr3 = input.charCodeAt(i++);\n        enc1 = chr1 >> 2;\n        enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n        enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n        enc4 = chr3 & 63;\n\n        if (isNaN(chr2)) {\n          enc3 = enc4 = 64;\n        } else if (isNaN(chr3)) {\n          enc4 = 64;\n        }\n\n        output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);\n      }\n\n      return output;\n    },\n    // public method for decoding\n    decode: function decode(input) {\n      var output = '';\n      var chr1, chr2, chr3;\n      var enc1, enc2, enc3, enc4;\n      var i = 0;\n      input = input.replace(/[^A-Za-z0-9+/=]/g, '');\n\n      while (i < input.length) {\n        enc1 = this._keyStr.indexOf(input.charAt(i++));\n        enc2 = this._keyStr.indexOf(input.charAt(i++));\n        enc3 = this._keyStr.indexOf(input.charAt(i++));\n        enc4 = this._keyStr.indexOf(input.charAt(i++));\n        chr1 = enc1 << 2 | enc2 >> 4;\n        chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n        chr3 = (enc3 & 3) << 6 | enc4;\n        output = output + String.fromCharCode(chr1);\n\n        if (enc3 != 64) {\n          output = output + String.fromCharCode(chr2);\n        }\n\n        if (enc4 != 64) {\n          output = output + String.fromCharCode(chr3);\n        }\n      }\n\n      output = jQuery.rup_utils.base64._utf8_decode(output);\n      return output;\n    },\n    // private method for UTF-8 encoding\n    _utf8_encode: function _utf8_encode(string) {\n      string = string.replace(/\\r\\n/g, '\\n');\n      var utftext = '';\n\n      for (var n = 0; n < string.length; n++) {\n        var c = string.charCodeAt(n);\n\n        if (c < 128) {\n          utftext += String.fromCharCode(c);\n        } else if (c > 127 && c < 2048) {\n          utftext += String.fromCharCode(c >> 6 | 192);\n          utftext += String.fromCharCode(c & 63 | 128);\n        } else {\n          utftext += String.fromCharCode(c >> 12 | 224);\n          utftext += String.fromCharCode(c >> 6 & 63 | 128);\n          utftext += String.fromCharCode(c & 63 | 128);\n        }\n      }\n\n      return utftext;\n    },\n    // private method for UTF-8 decoding\n    _utf8_decode: function _utf8_decode(utftext) {\n      var string = '';\n      var i = 0;\n      var c1 = 0;\n      var c2 = 0;\n      var c3 = 0;\n\n      while (i < utftext.length) {\n        c1 = utftext.charCodeAt(i);\n\n        if (c1 < 128) {\n          string += String.fromCharCode(c1);\n          i++;\n        } else if (c1 > 191 && c1 < 224) {\n          c2 = utftext.charCodeAt(i + 1);\n          string += String.fromCharCode((c1 & 31) << 6 | c2 & 63);\n          i += 2;\n        } else {\n          c2 = utftext.charCodeAt(i + 1);\n          c3 = utftext.charCodeAt(i + 2);\n          string += String.fromCharCode((c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63);\n          i += 3;\n        }\n      }\n\n      return string;\n    }\n  };\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.utils.js?");

/***/ }),

/***/ "./src/rup.validate.js":
/*!*****************************!*\
  !*** ./src/rup.validate.js ***!
  \*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(global, $) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permite al usuario validar los datos introducidos en los campos que se presentan en la aplicación.\r\n *\r\n * @summary Componente RUP Validate.\r\n * @module rup_validate\r\n * @see El componente está basado en el plugin {@link http://jqueryvalidation.org/|jQuery Validation Plugin}. Para mas información acerca de las funcionalidades y opciones de configuración pinche {@link http://jqueryvalidation.org/|aquí}.\r\n * @example\r\n * var properties={\r\n *   rules:{\r\n *       \"campoObligatorio\":{required:true},\r\n *       \"dni\":{required:true,dni:true}\r\n *   }\r\n * };\r\n * $(\"#formValidaciones\").rup_validate(properties);\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\"), __webpack_require__(/*! jquery-validation */ \"./node_modules/jquery-validation/dist/jquery.validate.js\"), __webpack_require__(/*! jquery-validation/dist/additional-methods */ \"./node_modules/jquery-validation/dist/additional-methods.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (jQuery) {\n  global.initRupI18nPromise.then(function () {\n    //*********************************************\n    // ESPECIFICACÍON DE LOS TIPOS BASE DEL PATRÓN\n    //*********************************************\n    //*****************************************************************************************************************\n    // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n    //*****************************************************************************************************************\n    var rup_validate = {};\n    $.rup_validate = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n    $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_validate', rup_validate)); // Se configuran los mensajes idiomaticos.\n\n    var messages = {}; // Es necesario identificar los mensajes parametrizables. Para ello se buscan los fragmentos de tipo {i} para ser tratados por la funcion format del validador.\n\n    var regularExpr = new RegExp('\\\\{\\\\d\\\\}');\n    $.each($.rup.i18n.base.rup_validate.messages, function (key, value) {\n      if (value.match(regularExpr) !== null) {\n        messages[key] = jQuery.validator.format(value);\n      } else {\n        messages[key] = value;\n      }\n    }); // Se configruran los mensajes de las reglas de validacion a partir de los definidos en los ficheros idiomaticos.\n\n    $.extend($.validator.messages, messages);\n    /*\r\n     * VALIDACIONES\r\n     */\n    //sobreescritura\n    //\n    //\n\n    jQuery.validator.addMethod('dni', function (value, element) {\n      return this.optional(element) || window.euroNif(value);\n    });\n\n    function nif(dni) {\n      if (dni.length === 9) {\n        var numero = dni.substr(0, 8);\n        numero = numero % 23;\n        var letra = 'TRWAGMYFPDXBNJZSQVHLCKET';\n        letra = letra.substring(numero, numero + 1);\n\n        if (letra != dni.substr(dni.length - 1, dni.length).toUpperCase()) {\n          return false;\n        } else {\n          return true;\n        }\n      } else {\n        return false;\n      }\n    }\n\n    function stripHtml(value) {\n      // remove html tags and space chars\n      return value.replace(/<.[^<>]*?>/g, ' ').replace(/&nbsp;|&#160;/gi, ' ') // remove numbers and punctuation\n      .replace(/[0-9.(),;:!?%#$'\"_+=/-]*/g, '');\n    } // Dni\n\n\n    jQuery.validator.addMethod('dni', function (value, element) {\n      return this.optional(element) || nif(value);\n    }); // Numero maximo de palabras\n\n    jQuery.validator.addMethod('maxWords', function (value, element, params) {\n      return this.optional(element) || stripHtml(value).match(/\\b\\w+\\b/g).length < params;\n    }); // Numero minimo de palabras\n\n    jQuery.validator.addMethod('minWords', function (value, element, params) {\n      return this.optional(element) || stripHtml(value).match(/\\b\\w+\\b/g).length >= params;\n    }); // Intervalo de palabras\n\n    jQuery.validator.addMethod('rangeWords', function (value, element, params) {\n      return this.optional(element) || stripHtml(value).match(/\\b\\w+\\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1];\n    }); // Letras y caracteres de puntuacion\n\n    jQuery.validator.addMethod('letterswithbasicpunc', function (value, element) {\n      return this.optional(element) || /^[a-z-.,()'\"\\s]+$/i.test(value);\n    }); // Letras (unicode), tildes y caracteres de puntuación.\n\n    jQuery.validator.addMethod('lettersunicodewithbasicpunc', function (value, element) {\n      return this.optional(element) || /^(?:[\\t-\\r \"'-\\),\\.A-Za-z\\xA0\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3000\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFEFF\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE3F\\uDE40\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDF02\\uDF04-\\uDF10\\uDF12-\\uDF33\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883\\uD885-\\uD887][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F\\uDC41-\\uDC46]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD32\\uDD50-\\uDD52\\uDD55\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E\\uDF25-\\uDF2A]|\\uD838[\\uDC30-\\uDC6D\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDCD0-\\uDCEB\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF39\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A\\uDF50-\\uDFFF]|\\uD888[\\uDC00-\\uDFAF])+$/i.test(value);\n    }); // Letras, numeros, espacios o guiones bajos\n\n    jQuery.validator.addMethod('alphanumeric', function (value, element) {\n      return this.optional(element) || /^\\w+$/i.test(value);\n    }); // Solo letras\n\n    jQuery.validator.addMethod('lettersonly', function (value, element) {\n      return this.optional(element) || /^[a-z]+$/i.test(value);\n    }); // Solo letras (unicode) y tildes.\n\n    jQuery.validator.addMethod('lettersunicodeonly', function (value, element) {\n      return this.optional(element) || /^(?:[A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE3F\\uDE40\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDF02\\uDF04-\\uDF10\\uDF12-\\uDF33\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883\\uD885-\\uD887][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F\\uDC41-\\uDC46]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD32\\uDD50-\\uDD52\\uDD55\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E\\uDF25-\\uDF2A]|\\uD838[\\uDC30-\\uDC6D\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDCD0-\\uDCEB\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF39\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A\\uDF50-\\uDFFF]|\\uD888[\\uDC00-\\uDFAF])+$/i.test(value);\n    }); // Solo letras y permite espacios.\n\n    jQuery.validator.addMethod('letters', function (value, element) {\n      return this.optional(element) || /^[a-z\\s]+$/i.test(value);\n    }); // Solo letras (unicode), tildes y permite espacios.\n\n    jQuery.validator.addMethod('lettersunicode', function (value, element) {\n      return this.optional(element) || /^(?:[\\t-\\r A-Za-z\\xA0\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3000\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFEFF\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE3F\\uDE40\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDF02\\uDF04-\\uDF10\\uDF12-\\uDF33\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883\\uD885-\\uD887][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F\\uDC41-\\uDC46]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD32\\uDD50-\\uDD52\\uDD55\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E\\uDF25-\\uDF2A]|\\uD838[\\uDC30-\\uDC6D\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDCD0-\\uDCEB\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF39\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A\\uDF50-\\uDFFF]|\\uD888[\\uDC00-\\uDFAF])+$/i.test(value);\n    }); // Espacios no permitidos\n\n    jQuery.validator.addMethod('nowhitespace', function (value, element) {\n      return this.optional(element) || /^\\S+$/i.test(value);\n    }); // Entero positivo o negativo\n\n    jQuery.validator.addMethod('integer', function (value, element) {\n      return this.optional(element) || /^-?\\d+$/.test(value);\n    }); // Patron\n\n    jQuery.validator.addMethod('pattern', function (value, element, param) {\n      return this.optional(element) || param.test(value);\n    }); // Validacion de campo numerico. Tiene en cuenta el formato dependiendo de la locale\n\n    jQuery.validator.addMethod('number', function (value, element) {\n      var expr = new RegExp($.rup.i18n.base.rup_validate.regexp.decimal);\n      return this.optional(element) || expr.test(value);\n    }); // Validacion de fecha. Tiene en cuanta el formato dependiendo de la locale\n\n    jQuery.validator.addMethod('date', function (value, element, param) {\n      var format;\n\n      if (typeof param === 'boolean') {\n        if (param === true) {\n          format = $.rup.i18n.base.rup_validate.format.date;\n        } else {\n          return true;\n        }\n      } else {\n        format = param;\n      }\n\n      return this.optional(element) || $.rup_validate.checkDate(format, value);\n    }); // Validacion email.De acuerdo a la oficial RFC 5322 http://www.ietf.org/rfc/rfc5322.txt\n\n    jQuery.validator.addMethod('email', function (value, element) {\n      var expr = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n      return this.optional(element) || expr.test(value);\n    }); //********************************\n    // DEFINICIÓN DE MÉTODOS PÚBLICOS\n    //********************************\n\n    $.extend($.rup_validate, {\n      // Metodo que valida una fecha de acuerdo al formato indicado\n      checkDate: function checkDate(format, date) {\n        var daysInFebruary = function daysInFebruary(year) {\n          return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28;\n        },\n            DaysArray = function DaysArray(n) {\n          var rdo = [];\n\n          for (var i = 1; i <= n; i++) {\n            rdo[i] = 31;\n\n            if (i == 4 || i == 6 || i == 9 || i == 11) {\n              rdo[i] = 30;\n            }\n\n            if (i == 2) {\n              rdo[i] = 29;\n            }\n          }\n\n          return rdo;\n        };\n\n        var tsp = {},\n            sep;\n        format = format.toLowerCase(); // Se busca el separador de fecha entre los caracteres \"/\",\"-\",\".\"\n\n        if (format.indexOf('/') != -1) {\n          sep = '/';\n        } else if (format.indexOf('-') != -1) {\n          sep = '-';\n        } else if (format.indexOf('.') != -1) {\n          sep = '.';\n        } else {\n          sep = '/';\n        }\n\n        format = format.split(sep);\n        date = date.split(sep);\n\n        if (date.length != 3) {\n          return false;\n        }\n\n        var j = -1,\n            yln,\n            dln = -1,\n            mln = -1;\n\n        for (var i = 0; i < format.length; i++) {\n          var dv = date[i] === null || date[i] === '' || isNaN(date[i]) ? 0 : parseInt(date[i], 10);\n          tsp[format[i]] = dv;\n          yln = format[i];\n\n          if (yln.indexOf('y') != -1) {\n            j = i;\n          }\n\n          if (yln.indexOf('m') != -1) {\n            mln = i;\n          }\n\n          if (yln.indexOf('d') != -1) {\n            dln = i;\n          }\n        }\n\n        if (format[j] == 'y' || format[j] == 'yyyy') {\n          yln = 4;\n        } else if (format[j] == 'yy') {\n          yln = 2;\n        } else {\n          yln = -1;\n        }\n\n        var daysInMonth = DaysArray(12),\n            strDate;\n\n        if (j === -1) {\n          return false;\n        } else {\n          strDate = tsp[format[j]].toString();\n\n          if (yln == 2 && strDate.length == 1) {\n            yln = 1;\n          }\n\n          if (strDate.length != yln || tsp[format[j]] === 0 && date[j] != '00') {\n            return false;\n          }\n        }\n\n        if (mln === -1) {\n          return false;\n        } else {\n          strDate = tsp[format[mln]].toString();\n\n          if (strDate.length < 1 || tsp[format[mln]] < 1 || tsp[format[mln]] > 12) {\n            return false;\n          }\n        }\n\n        if (dln === -1) {\n          return false;\n        } else {\n          strDate = tsp[format[dln]].toString();\n\n          if (strDate.length < 1 || tsp[format[dln]] < 1 || tsp[format[dln]] > 31 || tsp[format[mln]] == 2 && tsp[format[dln]] > daysInFebruary(tsp[format[j]]) || tsp[format[dln]] > daysInMonth[tsp[format[mln]]]) {\n            return false;\n          }\n        }\n\n        return true;\n      }\n    });\n    $.fn.rup_validate('extend', {\n      /**\r\n       * Se eliminan todos los objetos y eventos credos por el componente.\r\n       *\r\n       * @function destroy\r\n       * @example\r\n       * $(\"#formValidaciones\").rup_validate(\"destroy\");\r\n       */\n      destroy: function destroy() {\n        var self = this; // Se eliminan los mensajes de error.\n\n        self.rup_validate('resetForm'); // Se elimina la informacion almacenada en el objeto.\n\n        $.removeData(self[0]); // Se eliminan los eventos asociados al objeto.\n\n        self.off();\n      },\n\n      /**\r\n       * Se realiza un reset del formulario y se eliminan los mensajes de error de las reglas de validacion.\r\n       *\r\n       * @function resetForm\r\n       * @example\r\n       * $(\"#formValidaciones\").rup_validate(\"resetForm\");\r\n       */\n      resetForm: function resetForm() {\n        var self = this,\n            settings = self.data('settings'),\n            combos = $('[ruptype=\\'combo\\']', self); // En caso de mostrarse el feedback de error se oculta.\n\n        if (settings != null && settings.feedback !== undefined && settings.showErrorsInFeedback) {\n          settings.feedback.rup_feedback('hide');\n        } // Limpiar los combos por completo. Es importante hacerlo antes de la llamada a \"resetForm\" porque si no la limpieza de los labels no es llevada a cabo.\n\n\n        if (combos.length > 0) {\n          combos.rup_combo('clear');\n        } // Se reinician los mensajes de error.\n\n\n        self.validate().resetForm();\n      },\n\n      /**\r\n       * Se eliminan los menssajes de error de las reglas de validacion.\r\n       *\r\n       * @function resetForm\r\n       * @example\r\n       * $(\"#formValidaciones\").rup_validate(\"resetElements\");\r\n       */\n      resetElements: function resetElements() {\n        var self = this,\n            validator = self.validate();\n        validator.resetElements(validator.elements());\n      }\n    }); // Corrección para el establecimiento del foco tras las validaciones del combo y autocomplete.\n\n    $.extend($.validator.prototype, {\n      focusInvalid: function focusInvalid() {\n        if (this.settings.focusInvalid) {\n          try {\n            var $element = $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []);\n\n            if ($element.attr('rupType') === 'combo') {\n              $element = $('#' + $element.attr('id') + '-button');\n            } else if ($element.attr('rupType') === 'autocomplete') {\n              $element = $('#' + $element.attr('id') + '_label');\n            } // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\n\n            $element.filter(\":visible\").focus().trigger(\"focusin\");\n          } catch (e) {// Ignore IE throwing errors when focusing hidden elements\n          }\n        }\n      }\n    }); //********************************\n    // DEFINICIÓN DE MÉTODOS PRIVADOS\n    //********************************\n\n    $.fn.rup_validate('extend', {}); //*****************************\n    // INICIALIZACION DE VARIABLES\n    //*****************************\n    // Propiedades de configuracion predeterminadas para cada una de las posibles parametrizaciones de los errores.\n\n    var presetSettings = {\n      // Configruacion del componente por defecto\n      defaultPresetSettings: {\n        showErrors: function showErrors(errors) {\n          var self = this,\n              errorText,\n              feedback,\n              field,\n              errorKey,\n              fieldError,\n              fieldErrorMsg,\n              error,\n              label; // Se comprueba si el parametro que contiene los errores está vacío. En este caso se\n\n          if (self.currentElements.length === 1) {\n            if ($.isEmptyObject(errors)) {\n              delete self.invalid[self.currentElements.attr('name')];\n            }\n          }\n          /*\r\n           * Mostrar mensaje de error de validaciones en el feedback\r\n           */\n\n\n          feedback = self.settings.feedback;\n\n          if (self.settings.showErrorsInFeedback && feedback !== undefined && feedback !== null) {\n            errorText = $('<ul>').addClass('rup-maint_feedbackUL').prepend(self.settings.feedbackErrorConfig.errorMsg);\n\n            if (jQuery.isEmptyObject(self.invalid)) {\n              feedback.rup_feedback('close');\n            } else {\n              if (self.settings.showFieldErrorsInFeedback) {\n                $.each(!jQuery.isEmptyObject(self.submitted) ? self.submitted : self.invalid, function (key, value) {\n                  if (self.invalid[key] !== undefined) {\n                    field = self.settings.feedbackErrorConfig.getField(self, self.currentForm, key);\n                    errorKey = self.settings.feedbackErrorConfig.getFieldName(self, self.currentForm, field);\n                    fieldError = self.settings.feedbackErrorConfig.getFieldErrorLabel(self, self.currentForm, field, errorKey);\n                    fieldErrorMsg = self.settings.feedbackErrorConfig.getFieldErrorMsg(self, self.currentForm, field, value);\n                    fieldError.append(fieldErrorMsg);\n                    errorText.append(fieldError);\n                  }\n                });\n              }\n\n              feedback.rup_feedback('option', self.settings.feedbackOptions);\n              feedback.rup_feedback('set', errorText, 'error');\n            }\n          }\n          /*\r\n           * Mostrar detalle de errores en el feedback\r\n           */\n\n\n          if (self.settings.showFieldErrorAsDefault) {\n            for (var i = 0; self.errorList[i]; i++) {\n              error = self.errorList[i];\n\n              if (error.element !== undefined) {\n                label = self.errorsFor(error.element);\n\n                if (label.length) {\n                  label.remove();\n                }\n              }\n            }\n          }\n          /* En caso de utilizar el tratamiento por defecto del componente de jquery.validate,\r\n           * no es posible indicarle varios mensajes de error para un campo.\r\n           * Por ello deberemos concatenar estos mensajes de error en caso de que se de el caso.\r\n           */\n\n\n          for (var _i = 0; _i < self.errorList.length; _i++) {\n            if (self.errorList[_i].element === undefined) {\n              $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_validate.messages.fieldError'), $.rup.i18nParse($.rup.i18n.base, 'rup_validate.messages.validationErrorTitle'));\n            }\n\n            if (Array.isArray(self.errorList[_i].message)) {\n              // En caso de que el mensaje de error sea un array de mensajes, se debera de recorrer y concatenar\n              var newMessage = '';\n\n              for (var j = 0; j < self.errorList[_i].message.length; j++) {\n                newMessage += self.errorList[_i].message[j];\n\n                if (j !== self.errorList[_i].message.length - 1) {\n                  newMessage += ', ';\n                }\n              }\n\n              self.errorList[_i].message = newMessage;\n            }\n          } //Se eliminan los iconos duplicados\n\n\n          var elements = self.currentForm.getElementsByClassName('rup-validate-error-icon');\n\n          while (elements !== undefined && elements.length > 0) {\n            elements[0].parentNode.removeChild(elements[0]);\n          } // Se invoca al metodo por defecto del plugin subyacente\n\n\n          self.defaultShowErrors();\n        },\n        showErrorsInFeedback: function showErrorsInFeedback() {},\n        errorPlacement: function errorPlacement(label, element) {\n          if (element.attr('ruptype') === 'combo') {\n            var comboElem = $('#' + element.attr('id') + '-button');\n\n            if (comboElem) {\n              label.insertAfter(comboElem);\n            }\n          } else {\n            label.insertAfter(element);\n          }\n        }\n      },\n      // Configuracion de las propiedades a aplicar en caso de que se deban mostrar los errores mediante la visualizacion por defecto.\n      showFieldErrorAsDefault: {\n        errorElement: 'img',\n        errorPlacement: function errorPlacement(error, element) {\n          var errorElem = error.attr('src', this.errorImage).addClass('rup-maint_validateIcon').html('').rup_tooltip({\n            'applyToPortal': true\n          });\n\n          if (element.attr('ruptype') === 'combo') {\n            var comboElem = $('#' + element.attr('id') + '-button');\n\n            if (comboElem) {\n              errorElem.insertAfter(comboElem);\n            }\n          } else {\n            errorElem.insertAfter(element);\n          }\n        }\n      }\n    };\n    $.fn.rup_validate('extend', {\n      _init: function _init(args) {\n        var self = this,\n            settingsAdapter,\n            defaultPresetSettings,\n            settings;\n        settingsAdapter = $.extend(true, {}, {\n          adapter: $.fn.rup_validate.defaults.adapter\n        }, {\n          adapter: presetSettings.defaultPresetSettings.adapter\n        }, {\n          adapter: args[0].adapter\n        });\n        self[0]._ADAPTER = $.rup.adapter[settingsAdapter.adapter];\n        defaultPresetSettings = $.extend(true, {}, presetSettings.defaultPresetSettings, {\n          showFieldErrorAsDefault: {\n            highlight: self[0]._ADAPTER.highlight,\n            unhighlight: self[0]._ADAPTER.unhighlight,\n            errorElement: self[0]._ADAPTER.errorElement,\n            errorPlacement: self[0]._ADAPTER.errorPlacement\n          }\n        }); // settings = $.extend(true,{},$.fn.rup_validate.defaults, presetSettings.defaultPresetSettings, args[0]);\n\n        settings = $.extend(true, {}, $.fn.rup_validate.defaults, defaultPresetSettings, args[0]); // settings = $.extend(true, {}, defaultSettings, args[0]);\n        // Anadimos al formulario el class rup_validate para identificarlo como componente formulario.\n\n        self.addClass('rup_validate'); // Anadimos el ruptype validate\n\n        self.attr('ruptype', 'validate');\n        /*\r\n         * Configuracion del componente de validaciones.\r\n         */\n        // En caso de que se deban mostrar los errores mediante la visualizacion predeterminada se configuran los presets correspondientes.\n\n        if (settings.showFieldErrorAsDefault) {\n          settings = $.extend(true, settings, defaultPresetSettings.showFieldErrorAsDefault);\n        }\n\n        settings = $.extend(true, {}, settings, args[0]);\n\n        if (settings.onSubmitHandler !== undefined) {\n          settings.submitHandler = settings.onSubmitHandler;\n        } // Se realiza la invocacion al plugin jquery.validate\n\n\n        self.validate(settings);\n\n        if (settings.showFieldErrorAsDefault) {\n          self.validate().showLabel = self[0]._ADAPTER.showLabel;\n        } // Si se ha configurado el componente para que no se realicen validaciones al vuelo de los campos, se eliminan los eventos correspondientes.\n\n\n        if (!settings.liveCheckingErrors) {\n          self.off('click').off('focusin').off('focusout').off('keyup');\n        } // Se captura el evento invalid-form del plugin subyacente para generar un evento propio\n\n\n        self.on('invalid-form.rupValidate_formValidationError', function () {\n          self.off('invalid-form.rupValidate_formValidationError');\n          self.triggerHandler('rupValidate_formValidationError', [this]);\n        }); // Se almacena la configuracion del componente en el objeto dom para poder recuperarla en sucesivas invocaciones a los metodos del componente.\n\n        self.data('settings', settings); //Se audita el componente\n\n        $.rup.auditComponent('rup_validate', 'init');\n        self.trigger('load');\n      }\n    }); //*******************************************************\n    // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n    //*******************************************************\n\n    $.fn.rup_validate.defaults = {\n      adapter: 'validate_material',\n      ignore: ':hidden[ruptype!=\\'autocomplete\\'][ruptype!=\\'combo\\'] , .select2-selection__rendered input',\n      feedbackOptions: {\n        gotoTop: false,\n        fadeSpeed: null,\n        delay: null\n      },\n      feedbackErrorConfig: {\n        errorMsg: $.rup.i18nParse($.rup.i18n.base, 'rup_jqtable.validateError'),\n        getField: function getField(self, form, fieldName) {\n          return $('[name=\\'' + fieldName + '\\']', form);\n        },\n        getFieldName: function getFieldName(self, form, field) {\n          var fieldTmp, labelAttributes, labelElem;\n          fieldTmp = jQuery(field.length > 1 ? field[0] : field);\n          labelAttributes = {\n            labelForId: fieldTmp.attr('id'),\n            labelForName: fieldTmp.attr('name'),\n            labelForTitle: fieldTmp.attr('oldtitle')\n          };\n          labelElem = $.rup.adapter[$.fn.rup_validate.defaults.adapter];\n\n          if ($.fn.rup_validate.defaults.adapter === 'validate_bootstrap' || 'validate_material') {\n            labelElem = labelElem.forLabelElement(form, labelAttributes);\n          } else {\n            if (labelAttributes.labelForTitle === undefined || labelAttributes.labelForTitle === '') {\n              labelElem = labelElem.forLabelElement(form, labelAttributes);\n            } else {\n              return labelElem.forLabelElement(fieldTmp, labelAttributes);\n            }\n          }\n\n          if (labelElem !== undefined && labelElem !== '') {\n            return labelElem.replace(':', '');\n          } else {\n            labelElem = $.rup.adapter[$.fn.rup_validate.defaults.adapter].forInputIdElement(form, labelAttributes);\n\n            if (labelElem !== undefined && labelElem !== '') {\n              return labelElem.id;\n            }\n\n            labelElem = $.rup.adapter[$.fn.rup_validate.defaults.adapter].forInputNameElement(form, labelAttributes);\n\n            if (labelElem !== undefined && labelElem !== '') {\n              return labelElem.name;\n            }\n          }\n\n          return fieldTmp.attr('title');\n        },\n        getFieldErrorLabel: function getFieldErrorLabel(self, form, field, errorLabel) {\n          return $('<li>').append('<b>' + errorLabel + ':</b>');\n        },\n        getFieldErrorMsg: function getFieldErrorMsg(self, form, field, errorMsg) {\n          /* En caso de utilizar el tratamiento por defecto del componente de jquery.validate,\r\n           * no es posible indicarle varios mensajes de error para un campo.\r\n           * Por ello deberemos concatenar estos mensajes de error en caso de que se de el caso.\r\n           */\n          if (Array.isArray(errorMsg)) {\n            // En caso de que el mensaje de error sea un array de mensajes, se debera de recorrer y concatenar\n            var baseUl = $('<ul>');\n\n            for (var i = 0; i < errorMsg.length; i++) {\n              baseUl.append($('<li>').append(errorMsg[i]));\n            }\n\n            return baseUl;\n          } else {\n            return $('<ul>').append($('<li>').append(errorMsg));\n          }\n        }\n      },\n      liveCheckingErrors: false,\n      showErrorsInFeedback: true,\n      showFieldErrorAsDefault: true,\n      showFieldErrorsInFeedback: true,\n      errorImage: $.rup.STATICS + '/rup/css/images/exclamation.png'\n    };\n    /**\r\n    * Función de callback que se ejecutará cuando el formulario sea válido.\r\n    *\r\n    * @callback module:rup_validate~onSubmitHandler\r\n    * @param {Element} form - Referencia al objeto DOM del formulario que está siendo validado.\r\n    * @example <caption>Envia el formulario cuando este es válido.</caption>\r\n    * $(\"#idFormulario\").rup_tooltip({\r\n    *   onSubmitHandler: function(form){\r\n    *       $(form).ajaxSubmit();\r\n    *   }\r\n    * });\r\n    * @example <caption>Realizar otras operaciones cuando el formulario es válido.</caption>\r\n    * $(\"#idFormulario\").rup_tooltip({\r\n    *   onSubmitHandler: function(form){\r\n        // Operaciones extra\r\n    *       $(form).ajaxSubmit();\r\n    *   }\r\n    * });\r\n    */\n\n    /**\r\n     * Función que se ejecutará cuando el formulario presente errores de validación.\r\n     *\r\n     * @callback module:rup_validate~onInvalidHandler\r\n     * @param {Event} event - Objeto event asociado al evento lanzado.\r\n     * @param {object} validator - Instancia del validador asociada al formulario actual.\r\n     * @example\r\n     * $(\".selector\").validate({\r\n     *   invalidHandler: function(event, validator) {\r\n     *    // 'this' refers to the form\r\n     *    var errors = validator.numberOfInvalids();\r\n     *    if (errors) {\r\n     *      var message = errors == 1\r\n     *        ? 'You missed 1 field. It has been highlighted'\r\n     *        : 'You missed ' + errors + ' fields. They have been highlighted';\r\n     *      $(\"div.error span\").html(message);\r\n     *      $(\"div.error\").show();\r\n     *    } else {\r\n     *      $(\"div.error\").hide();\r\n     *    }\r\n     *  }\r\n     * });\r\n     */\n\n    /**\r\n     * Función que se ejecutará cuando se produzca la validación de los datos permitiendo personalizar los errores de validación.\r\n     *\r\n     * @callback module:rup_validate~onShowErrors\r\n     * @param {Object} errorMap - Pares de clave/valor, donde el key se corresponde con el name del campo del formulario y el value con el mensaje que se va a mostrar para ese campo.\r\n     * @param {Object[]} errorList - Array de objetos correspondientes a los campos validados.\r\n     * @param {String} errorList.message - Mensaje que va mostrarse para ese campo.\r\n     * @param {Element} errorList.element - Objeto del DOM correspondiente a ese campo.\r\n     * @example\r\n     * $(\".selector\").validate({\r\n     *  showErrors: function(errorMap, errorList) {\r\n     *    $(\"#summary\").html(\"Your form contains \"\r\n     *      + this.numberOfInvalids()\r\n     *      + \" errors, see details below.\");\r\n     *    this.defaultShowErrors();\r\n     *  }\r\n     * });\r\n     */\n\n    /**\r\n     * Función de callback que permite personalizar el lugar en el que se posicionarán los mensajes de error.\r\n     *\r\n     * @callback module:rup_validate~onErrorPlacement\r\n     * @param {jQuery} error - Referencia al objeto label que va a ser insertado en el DOM para visualizar los errores.\r\n     * @param {jQuery} element - Referencia al campo validado.\r\n     * @example\r\n     * $(\"#myform\").validate({\r\n     *   errorPlacement: function(error, element) {\r\n     *       error.appendTo( element.parent(\"td\").next(\"td\") );\r\n     *   }\r\n     * });\r\n     */\n\n    /**\r\n     * Función de callback para determinar como se debe resaltar los campos inválidos.\r\n     *\r\n     * @callback module:rup_validate~onHighlight\r\n     * @param {jQuery} element - Referencia al campo validado.\r\n     * @param {String} errorClass - Valor actual del parámetro errorClass.\r\n     * @param {String} validClass - Valor actual del parámetro validClass.\r\n     * @example\r\n     * $(\".selector\").validate({\r\n     *   highlight: function(element, errorClass, validClass) {\r\n     *        $(element).fadeOut(function() {\r\n     *            $(element).fadeIn();\r\n     *        });\r\n     *   }\r\n     * });\r\n     */\n\n    /**\r\n     * Función de callback para determinar como se debe resaltar los campos inválidos.\r\n     *\r\n     * @callback module:rup_validate~onUnhighlight\r\n     * @param {jQuery} element - Referencia al campo validado.\r\n     * @param {String} errorClass - Valor actual del parámetro errorClass.\r\n     * @param {String} validClass - Valor actual del parámetro validClass.\r\n     * @example\r\n     * $(\".selector\").validate({\r\n     *  highlight: function(element, errorClass, validClass) {\r\n     *    $(element).addClass(errorClass).removeClass(validClass);\r\n     *    $(element.form).find(\"label[for=\" + element.id + \"]\")\r\n     *      .addClass(errorClass);\r\n     *  },\r\n     *  unhighlight: function(element, errorClass, validClass) {\r\n     *    $(element).removeClass(errorClass).addClass(validClass);\r\n     *    $(element.form).find(\"label[for=\" + element.id + \"]\")\r\n     *      .removeClass(errorClass);\r\n     *  }\r\n     * });\r\n     */\n\n    /**\r\n     * @description Propiedades de configuración del componente.\r\n     * @see Para mas información consulte la documentación acerca de las opciones de configuración del plugin {@link http://jqueryvalidation.org/validate/|jQuery Validation Plugin}.\r\n     *\r\n     * @name options\r\n     * @property {boolean} [debug=false] - Activa el modo debug. En caso de estar activado el formulario no se envía el formulario y los errores de ejecución que se hayan producido se visualizan en la consola. Requiere Firebug o Firebug lite.\r\n     * @property {module:rup_validate~onSubmitHandler} [submitHandler] - Método callback utilizado para capturar el evento submit cuando el formulario es válido. Reemplaza el submit por defecto. Es el método utilizado para realizar un submit mediante AJAX después de ser validado.\r\n     * @property {module:rup_validate~onInvalidHandler} [invalidHandler] - Método callback que se ejecuta cuando un formulario presenta errores de validación.\r\n     * @property {Selector} [ignore] - Selector jQuery que identifica los elementos del formulario que van a ser ignorados al realizarse las validaciones.\r\n     * @property {object} [messages] - Utilizado para indicar mensajes propios para las validaciones. Estos se especifican mediante pares de clave/valor. La clave es el nombre del elemento mientras que el valor es el texto que se ha de mostrar en caso de producirse un error en la validación.\r\n     * @property {object} [groups] - Se utiliza para realizar agrupamientos de mensajes de error.\r\n     * @property {boolean} [onsubmit=true] - Determina si se valida el formulario al realizarse el submit. Marcar como false para realizar las validaciones mediante el resto de eventos.\r\n     * @property {boolean} [ofocusout=true] - Determina si se realiza la validación de los campos (excepto los checkbox y radio) al lanzarse los eventos blur. Estas validaciones se realizan únicamente una vez que un campo ha sido marcado como inválido.\r\n     * @property {boolean} [okeyup=true] - Determina si se realiza la validación de los campos (excepto los checkbox y radio) al lanzarse los eventos keyup. Las validaciones se realizan únicamente una vez que un campo ha sido marcado como inválido.\r\n     * @property {boolean} [onclick=true] - Determina si se realizan las validaciones de los checkbox y radio al realizar un click sobre los mismos.\r\n     * @property {boolean} [focusInvalid=true] - Posiciona el foco en el último campo activo o en el primer campo inválido la realizarse la validación de los campos. En caso de encontrarse el foco en un campo al realizarse la validación se mantiene en dicho campo. En caso de no encontrarse el foco en un campo, se posicionará en el primer campo inválido existente.\r\n     * @property {boolean} [focusCleanup=false] - En caso de activarse, elimina el errorClass correspondiente y oculta los mensajes de error de los campos que reciben el foco. Evitar utilizar esta propiedad en conjunción con focusInvalid.\r\n     * @property {Selector} [meta] - En caso de utilizar metainformación en los campos que sea utilizada por otros plugins, es posible indicar un identificador para envolver la metadata correspondiente al el componente validate dentro de un objeto propio.\r\n     * @property {String} [errorClass=error] - Determina el nombre del class que va a aplicarse a los campos que presenten errores de validación.\r\n     * @property {String} [validClass=valid] - Determina el nombre del class que va a aplicarse a los campos que han sido validados y no presenten errores.\r\n     * @property {String} [errorElement=label] - Determina el tipo del elemento que va a utilizarse para generar los mensajes de error.\r\n     * @property {String} [wrapper=window] - Recubre los mensajes de error con el elemento especificado. Util en conjunción la propiedad errorLabelContainer para crear listado de errores.\r\n     * @property {Selector} [errorLabelContainer] - Determina el objeto contenedor en el que se van a mostrar los mensajes de error.\r\n     * @property {Selector} [errorContainer] - Determina un contenedor adicional para los mensajes de error.\r\n     * @property {boolean} [ignoreTitle=false] - Determina si se evita el obtener los mensajes a partir del atributo title.\r\n     * @property {module:rup_validate~onShowErrors} [showErrors] - Función callback para realizar un tratamiento  personalizado de los errores de validación.\r\n     * @property {module:rup_validate~onErrorPlacement} [errorPlacement] - Función de callback que permite personalizar el lugar en el que se posicionarán los mensajes de error.\r\n     * @property {module:rup_validate~onHighlight} [highlight] - Función de callback para determinar como se debe resaltar los campos inválidos.\r\n     * @property {module:rup_validate~onUnhighlight} [unhighlight] - Función de callback para restaurar los cambios realizados por la función indicada en la propiedad highlight.\r\n     */\n\n    /* **********/\n\n    /* EVENTOS */\n\n    /* **********/\n\n    /**\r\n     * Este evento es lanzado cuando se produce alguna violación entre las reglas de validación especificadas para ser aplicadas sobre los campos del formulario.\r\n     *\r\n     * @event module:rup_validate#rupValidate_formValidationError\r\n     * @property {Event} e - Objeto Event correspondiente al evento disparado.\r\n     * @example\r\n     * $(\"#idFormulario\").on(\"rupValidate_formValidationError\", function(event){\r\n     * });\r\n     */\n  })[\"catch\"](function (error) {\n    console.error('Error al inicializar el componente:\\n', error);\n  });\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.validate.js?");

/***/ }),

/***/ "./src/rup.wizard.js":
/*!***************************!*\
  !*** ./src/rup.wizard.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Copyright 2016 E.J.I.E., S.A.\r\n *\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n */\n\n/**\r\n * Permitir guiar al usuario paso a paso a través de un proceso realizando las tareas dentro de un orden señalado.\r\n *\r\n * @summary Componente RUP Wizard.\r\n * @module rup_wizard\r\n * @example\r\n * var properties = {};\r\n * $(\"#id_form\").rup_wizard(properties)\r\n */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.base */ \"./src/rup.base.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var rup_wizard = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_wizard', rup_wizard)); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_wizard('extend', {\n    /**\r\n     * Selecciona el paso recibido como parámetro [0..n].\r\n     *\r\n     * @function step\r\n     * @param {Integer} step - Identificador del paso que se desea seleccionar.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"step\", 1);\r\n     */\n    step: function step(stepNumber) {\n      //controlar si está deshabilitado\n      if ($('#stepDesc' + stepNumber).hasClass('disabled')) {\n        return false;\n      }\n\n      var currentId = $('#steps li.current').attr('id'); //Gestionar cabeceras\n\n      $('#steps li').removeClass('current');\n      $('#stepDesc' + stepNumber).addClass('current'); //Estilo flecha paso anterior\n\n      $('#steps li').removeClass('visited');\n\n      if (stepNumber != 0) {\n        $('#stepDesc' + (stepNumber - 1)).addClass('visited');\n      } //Gestionar capas\n\n\n      $('#step' + currentId.substring(8)).hide();\n      $('#step' + stepNumber).show(); //Gestionar submitButton\n\n      if (!this.rup_wizard('isCurrentStepLast')) {\n        $('.rup-wizard_submitButton').hide();\n      } else {\n        $('.rup-wizard_submitButton').show(); //Mover botón si no es resumen\n\n        if (!this.rup_wizard('isCurrentStepSummary')) {\n          $('#step' + stepNumber).find('p[id$=\\'commands\\']').append($('.rup-wizard_submitButton'));\n        }\n      }\n    },\n\n    /**\r\n     * Selecciona el primer paso del asistente.\r\n     *\r\n     * @function first\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"first\");\r\n     */\n    first: function first() {\n      this.rup_wizard('step', 0);\n    },\n\n    /**\r\n     * Selecciona el último paso del asistente.\r\n     *\r\n     * @function last\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"last\");\r\n     */\n    last: function last() {\n      this.rup_wizard('step', $('#steps').children().length - 1);\n    },\n\n    /**\r\n     * Devuelve el número del paso actual.\r\n     *\r\n     * @function getCurrentStep\r\n     * @return {Integer} - Número de paso actual.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"getCurrentStep\");\r\n     */\n    getCurrentStep: function getCurrentStep() {\n      return parseInt($('#steps li.current').attr('id').substring(8));\n    },\n\n    /**\r\n     * Indica si el paso recibido como parámetro es el activo.\r\n     *\r\n     * @function isCurrentStep\r\n     * @param {Integer} step - Número de paso.\r\n     * @return {boolean} - Devuelve true en caso de que el paso indicado sea el actual y false en caso de que no.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"isCurrentStep\", 2);\r\n     */\n    isCurrentStep: function isCurrentStep(i) {\n      return this.rup_wizard('getCurrentStep') === i;\n    },\n\n    /**\r\n     * Indica si el paso activo es el primero.\r\n     *\r\n     * @function isCurrentStepFirst\r\n     * @return {boolean} - Devuelve true en caso de que el último paso sea el activo y false en caso de que no.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"isCurrentStepFirst\");\r\n     */\n    isCurrentStepFirst: function isCurrentStepFirst() {\n      return this.rup_wizard('isCurrentStep', 0);\n    },\n\n    /**\r\n     * Indica si el paso activo es el último.\r\n     *\r\n     * @function isCurrentStepLast\r\n     * @return {boolean} - Devuelve true en caso de que el primer paso sea el activo y false en caso de que no.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"isCurrentStepLast\");\r\n     */\n    isCurrentStepLast: function isCurrentStepLast() {\n      return $('#steps').children().length - 1 === this.rup_wizard('getCurrentStep');\n    },\n\n    /**\r\n     * Indica si el paso activo es el resumen.\r\n     *\r\n     * @function isCurrentStepSummary\r\n     * @return {boolean} - Devuelve true en caso de que el paso activo sea el del resumen y false en caso de que no.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"isCurrentStepSummary\");\r\n     */\n    isCurrentStepSummary: function isCurrentStepSummary() {\n      return $('#stepDesc' + this.rup_wizard('getCurrentStep')).hasClass('rup-wizard_summary');\n    },\n\n    /**\r\n     * Habilita el paso recibido como parámetro.\r\n     *\r\n     * @function enableStep\r\n     * @param {Integer} step - Numero que identifica el paso que deseamos habilitar.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"enableStep\", 2);\r\n     */\n    enableStep: function enableStep(stepNumber) {\n      $('#stepDesc' + stepNumber).removeClass('disabled');\n    },\n\n    /**\r\n     * Deshabilita el paso recibido como parámetro.\r\n     *\r\n     * @function disableStep\r\n     * @param {Integer} step - Numero que identifica el paso que deseamos deshabilitar.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"disableStep\", 2);\r\n     */\n    disableStep: function disableStep(stepNumber) {\n      $('#stepDesc' + stepNumber).addClass('disabled');\n    },\n\n    /**\r\n     * Indica si el paso recibido como parámetro está deshabilitado.\r\n     *\r\n     * @function isStepDisabled\r\n     * @param {Integer} step - Numero que identifica el paso que deseamos deshabilitar.\r\n     * @return {boolean} - Devuelve true si el paso indicado está deshabilitado y false en caso de que no.\r\n     * @example\r\n     * $(\"#idForm\").rup_wizard(\"isStepDisabled\", 2);\r\n     */\n    isStepDisabled: function isStepDisabled(stepNumber) {\n      return $('#stepDesc' + stepNumber).hasClass('disabled');\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_wizard('extend', {\n    _init: function _init(args) {\n      if (args.length > 1) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_global.initError') + $(this).attr('id'));\n      } else {\n        var settings = $.extend({}, $.fn.rup_wizard.defaults, args[0]),\n            rupWizard = this; //referencia\n\n        this.addClass('rup-wizard');\n\n        this._formToWizard(settings); //Contenedor (UL)\n\n\n        $('#steps').addClass('rup-wizard_stepsDescContainer'); //Paso (LI)\n\n        $('#steps').children().each(function (index, element) {\n          $(element).addClass('rup-wizard_stepDesc') //Estilo paso (LI)\n          .click(function (event) {\n            //Click en cabecera para cambio de paso\n            var step = $(this).attr('id').substring(8);\n\n            if (!rupWizard.isStepDisabled(step)) {\n              if (settings.stepFnc[step] !== undefined) {\n                if (settings.stepFnc[step].call() === false) {\n                  event.stopImmediatePropagation();\n                  return false;\n                }\n              }\n\n              $(this).rup_wizard('step', step);\n            }\n          }); //Eliminar \"Step X\"\n\n          var span = $(element).children();\n          $(span).text(index + 1 + '. ' + $(span).text());\n          $(element).text('').append(span);\n        }); //Botones Anterior/Siguiente\n\n        $('p[id$=\\'commands\\'] .prev') //Estilo\n        .removeClass('prev').addClass('rup-wizard_prev') //Texto\n        .text($.rup.i18nParse($.rup.i18n.base, 'rup_wizard.prev')) //Evento 'click'\n        .off('click').click(function (event) {\n          //Paso anterior\n          rupWizard._gotoPrevStep(rupWizard, settings, event);\n        });\n        $('p[id$=\\'commands\\'] .next') //Estilo\n        .removeClass('next').addClass('rup-wizard_next') //Texto\n        .text($.rup.i18nParse($.rup.i18n.base, 'rup_wizard.next')) //Evento 'click'\n        .off('click').click(function (event) {\n          //Siguiente paso\n          rupWizard._gotoNextStep(rupWizard, settings, event);\n        }); //Estilo botón submit (sirve de ID)\n\n        $('#' + settings.submitButton).addClass('rup-wizard_submitButton');\n\n        if (settings.submitFnc) {\n          $('#' + settings.submitButton).click(settings.submitFnc);\n        } //Estilos firstStep y finalStep\n\n\n        $('#steps li').first().addClass('rup-wizard_firstStepDesc');\n        $('#steps li').last().addClass('rup-wizard_lastStepDesc'); //Paso de RESUMEN\n\n        if (settings.summary) {\n          //Cabecera\n          $('#steps li').last().removeClass('rup-wizard_lastStepDesc');\n          var stepNumber = $('#steps').children().length,\n              stepDesc = $('<li>').attr('id', 'stepDesc' + stepNumber).addClass('rup-wizard_stepDesc rup-wizard_summary rup-wizard_lastStepDesc').append('<a>' + (stepNumber + 1) + '. ' + $.rup.i18nParse($.rup.i18n.base, 'rup_wizard.summary') + '</a>').click(function (event) {\n            //Paso final\n            $(this).rup_wizard('step', $(this).attr('id').substring(8)); //Resumen\n\n            rupWizard._generateSummary(stepNumber, rupWizard, settings);\n\n            event.preventDefault();\n          });\n          $('#steps').append(stepDesc); //Capa\n\n          if (stepNumber > 1) {\n            $('div[id=\\'step' + (stepNumber - 1) + '\\']').after('<div id=\\'step' + stepNumber + '\\' style=\\'display: none;\\'></div>'); //Añadir botón siguiente anteúltimo paso\n\n            var nextButton = $('<a>').attr('id', 'step' + (stepNumber - 1) + 'Next').html($.rup.i18nParse($.rup.i18n.base, 'rup_wizard.next')).addClass('rup-wizard_next').off('click').click(function (event) {\n              //Siguiente paso\n              rupWizard._gotoNextStep(rupWizard, settings, event); //Resumen\n\n\n              rupWizard._generateSummary(stepNumber, rupWizard, settings);\n\n              event.preventDefault();\n            });\n            $('#step' + (stepNumber - 1) + 'commands').append(nextButton);\n          }\n        } //Disabled\n\n\n        if (settings.disabled !== undefined) {\n          $.each(settings.disabled, function (index, element) {\n            if (typeof element === 'number') {\n              $(this).rup_wizard('disableStep', element);\n            } else if (typeof element === 'string') {\n              var begin = parseInt(element.substring(0, element.indexOf('-'))),\n                  end = parseInt(element.substring(element.indexOf('-') + 1, element.length));\n\n              for (var i = begin; i <= end; i++) {\n                $(this).rup_wizard('disableStep', i);\n              }\n            }\n          });\n        } //Se audita el componente\n\n\n        $.rup.auditComponent('rup_wizard', 'init');\n      } //Ir al paso inicial\n\n\n      this.rup_wizard('step', 0);\n    },\n    _gotoNextStep: function _gotoNextStep(rupWizard, settings, event) {\n      // Obtener paso siguiente\n      var nextStep = parseInt($('#steps li.current').attr('id').substring(8)) + 1; // Comprobar que no está deshabilitado (o buscar el\n      // siguiente\n      // habilitado)\n\n      if (rupWizard.isStepDisabled(nextStep)) {\n        nextStep = $('#stepDesc' + (nextStep - 1)).nextAll('li:not(.disabled)').first().attr('id');\n\n        if (nextStep !== undefined) {\n          nextStep = parseInt(nextStep.substring(8));\n        } else {\n          return false;\n        } // Si fuera necesario, se generar el resumen\n\n\n        if (jQuery('#steps').children().length - 1 === nextStep) {\n          rupWizard._generateSummary(nextStep, rupWizard, settings);\n        }\n      } // Invocar f(x) del paso (si existe)\n\n\n      if (settings.stepFnc[nextStep] !== undefined) {\n        if ($('#stepDesc' + nextStep).not('.rup-wizard_summary').length > 0) {\n          // Evitar\n          // resumen\n          // (mala\n          // configuracion\n          // desarrollador)\n          if (settings.stepFnc[nextStep].call() === false) {\n            event.stopImmediatePropagation();\n            return false;\n          }\n        }\n      } // Cambiar de paso\n\n\n      $('#stepDesc' + nextStep).rup_wizard('step', nextStep);\n    },\n    _gotoPrevStep: function _gotoPrevStep(rupWizard, settings, event) {\n      //Obtener paso anterior\n      var prevStep = parseInt($('#steps li.current').attr('id').substring(8)) - 1; //Comprobar que no está deshabilitado (o buscar el anterior habilitado)\n\n      if (rupWizard.isStepDisabled(prevStep)) {\n        prevStep = $('#stepDesc' + (prevStep + 1)).prevAll('li:not(.disabled)').first().attr('id');\n\n        if (prevStep !== undefined) {\n          prevStep = parseInt(prevStep.substring(8));\n        } else {\n          return false;\n        }\n      } //Invocar f(x) del paso (si existe)\n\n\n      if (settings.stepFnc[prevStep] !== undefined) {\n        if (settings.stepFnc[prevStep].call() === false) {\n          event.stopImmediatePropagation();\n          return false;\n        }\n      } //Cambiar de paso\n\n\n      $('#stepDesc' + prevStep).rup_wizard('step', prevStep);\n    },\n    _generateSummary: function _generateSummary(stepNumber, rupWizard, settings) {\n      //controlar si está deshabilitado\n      if ($('#stepDesc' + stepNumber).hasClass('disabled')) {\n        return false;\n      } //Devolver botón submit a su lugar\n\n\n      $('#step' + stepNumber).parent().append($('.rup-wizard_submitButton'));\n      /** DEVELOPER SummaryFnc_PRE **/\n\n      if (settings.summaryFnc_PRE && settings.summaryFnc_PRE.call() === false) {\n        return false;\n      } //Reiniciar capa (si hacemos .empty() no funciona accordion la segunda vez)\n\n\n      $('#step' + stepNumber).remove();\n      $('div[id=\\'step' + (stepNumber - 1) + '\\']').after('<div id=\\'step' + stepNumber + '\\' style=\\'display: none;\\'></div>'); //Copiar capas anteriores\n\n      for (var i = 0; i < stepNumber; i++) {\n        if (!rupWizard.isStepDisabled(i)) {\n          //Comprobar pasos deshabilitados\n          $('#step' + stepNumber).append($('#step' + i).children().clone());\n        }\n      } //Eliminar botones\n\n\n      $('#step' + stepNumber + ' p[id$=\\'commands\\']').remove(); //Botón anterior\n\n      $('div[id=\\'step' + stepNumber + '\\'] fieldset').last().append('<p id=\\'step' + stepNumber + 'commands\\'></p>');\n      var prevButton = $('<a>').attr('id', 'step' + stepNumber + 'Prev').html($.rup.i18nParse($.rup.i18n.base, 'rup_wizard.prev')).addClass('rup-wizard_prev').off('click').click(function (event) {\n        //Paso anterior\n        rupWizard._gotoPrevStep(rupWizard, settings, event);\n      });\n      $('#step' + stepNumber + 'commands').append(prevButton);\n      /** DEVELOPER SummaryFnc_INTER **/\n\n      if (settings.summaryFnc_INTER && settings.summaryFnc_INTER.call() === false) {\n        return false;\n      } //RUP_MULTICOMBO\n\n\n      $('#step' + stepNumber + ' .ui-multiselect').each(function () {\n        var selectObj = $('#' + $(this).prev().attr('id'));\n\n        if (selectObj.data('settings') !== undefined) {\n          var seleccionados = selectObj.rup_combo('label');\n\n          if (seleccionados.length > 0) {\n            //Existen elementos seleccionados?\n            if (selectObj.data('settings').summaryInline == undefined) {\n              //Tratamiento por defecto\n              var contenedor = $('<div></div>').addClass('rup-wizard_summaryMultivalue').insertAfter(this);\n\n              for (var i = 0; i < seleccionados.length; i++) {\n                $(settings.labelElement, {\n                  text: '- ' + seleccionados[i],\n                  'class': 'rup-wizard_summaryValue'\n                }).appendTo(contenedor);\n                $('<br/>').appendTo(contenedor);\n              }\n            } else {\n              //Tratamiento en línea\n              $(settings.labelElement, {\n                text: seleccionados.toString().replace(/,/g, ', '),\n                'class': 'rup-wizard_summaryValue'\n              }).insertAfter(this);\n            }\n          } else {\n            $(settings.labelElement, {\n              html: '&nbsp;',\n              'class': 'rup-wizard_summaryValue'\n            }).insertAfter(this);\n          }\n\n          $(this).prev().remove();\n          $(this).remove();\n        }\n      }); //Gestionar INPUTS\n\n      $('#step' + stepNumber + ' input').each(function () {\n        if (this.type === 'text') {\n          $(settings.labelElement, {\n            text: this.value,\n            'class': 'rup-wizard_summaryValue'\n          }).insertAfter(this);\n        } else if (this.type === 'password') {\n          $(settings.labelElement, {\n            text: rupWizard._hidePassword(this.value),\n            'class': 'rup-wizard_summaryValue'\n          }).insertAfter(this);\n        } else if (this.type === 'radio') {\n          if (this.checked) {\n            $(settings.labelElement, {\n              text: $('#step' + stepNumber + ' label[for=\\'' + this.id + '\\']').text(),\n              'class': 'rup-wizard_summaryValue'\n            }).insertAfter(this);\n            $('#' + this.id).attr('checked', 'checked'); //Restablecer selección que se pierde al clonar\n          } //\t\t\t\t\t\tif (this.checked){\n          //\t\t\t\t\t\t\t$(settings.labelElement, { text: \"(*) \" + $(\"#step\"+stepNumber+\" label[for='\"+this.id+\"']\").text(), \"class\":\"rup-wizard_summaryValue\" }).insertAfter(this);\n          //\t\t\t\t\t\t\t$(\"#\"+this.id).attr(\"checked\",\"checked\"); //Restablecer selección que se pierde al clonar\n          //\t\t\t\t\t\t} else {\n          //\t\t\t\t\t\t\t$(settings.labelElement, { text: \"( ) \" + $(\"#step\"+stepNumber+\" label[for='\"+this.id+\"']\").text(), \"class\":\"rup-wizard_summaryValue\" }).insertAfter(this);\n          //\t\t\t\t\t\t}\n\n\n          $('#step' + stepNumber + ' label[for=\\'' + this.id + '\\']').remove();\n        } else if (this.type === 'checkbox') {\n          if (this.checked) {\n            $(settings.labelElement, {\n              text: '[X] ' + $('#step' + stepNumber + ' label[for=\\'' + this.id + '\\']').text(),\n              'class': 'rup-wizard_summaryValue'\n            }).insertAfter(this);\n          } else {\n            $(settings.labelElement, {\n              text: '[ ] ' + $('#step' + stepNumber + ' label[for=\\'' + this.id + '\\']').text(),\n              'class': 'rup-wizard_summaryValue'\n            }).insertAfter(this);\n          }\n\n          $('#step' + stepNumber + ' label[for=\\'' + this.id + '\\']').remove();\n        }\n\n        $(this).remove();\n      }); //Gestionar TEXTAREAS\n\n      $('#step' + stepNumber + ' textarea').each(function () {\n        $(settings.textareaElement, {\n          text: $('#' + $(this).attr('id')).val(),\n          'class': 'rup-wizard_summaryParagraph'\n        }).insertAfter(this);\n        $(this).remove();\n      }); //Gestionar SELECTS\n\n      $('#step' + stepNumber + ' select:not(\\'.ui-pg-selbox\\')').each(function () {\n        $(settings.labelElement, {\n          text: $('#' + this.id + ' option:selected').text() !== '&nbsp;' ? $('#' + this.id + ' option:selected').text() : '',\n          'class': 'rup-wizard_summaryValue'\n        }).insertAfter(this);\n        $(this).remove();\n      }); //Gestionar LABELS\n\n      $('#step' + stepNumber + ' label').each(function () {\n        $(settings.labelSeparatorElement, {\n          html: settings.labelSeparatorText,\n          'class': 'rup-wizard_separator'\n        }).insertAfter(this);\n        $(settings.labelElement, {\n          text: this.innerHTML,\n          'class': 'rup-wizard_summaryLabel'\n        }).insertAfter(this);\n        $(this).remove();\n      }); //Gestionar componentes RUP\n      //rup_accordion\n\n      $('#step' + stepNumber + ' .ui-accordion').each(function () {\n        $(this).attr('id', $(this).attr('id') + '_summary');\n        $(this).removeAttr('class');\n        $(this).children('h1').removeAttr('class');\n        $(this).children('h1').children('span.ui-icon').first().remove();\n        $(this).children('div').removeAttr('class');\n\n        if ($.isEmptyObject(settings.rupAccordion)) {\n          $(this).rup_accordion(settings.accordion);\n        } else {\n          $(this).rup_accordion(settings.rupAccordion);\n        }\n      }); //rup_combo (multicombo se procesa antes)\n\n      $('#step' + stepNumber + ' .rup_combo').each(function () {\n        $(this).remove();\n      }); //rup_date\n\n      $('#step' + stepNumber + ' img.ui-datepicker-trigger').each(function () {\n        $(this).remove();\n      }); //rup_time\n\n      $('#step' + stepNumber + ' img.ui-timepicker-trigger').each(function () {\n        $(this).remove();\n      }); //rup_tabs\n\n      var maxLevel = 0; //Control de estilos cuando las pestañas pasan a accordion\n\n      if (settings.summaryTabs2Accordion) {\n        settings.rupTabsElement = '<a></a>';\n      }\n\n      $('#step' + stepNumber + ' > fieldset').children('.rup-tabs_container').each(function () {\n        var labelTabs = [],\n            idTabs = [],\n            fieldset = $(this).parent().attr('accordionable', true),\n            //Donde se deben anidar las pestañas\n        containerTab = []; //Obtención de valores/ids de pestañas (labelTabs & idTabs)\n\n        rupWizard._getRupTabs(rupWizard, $(this), labelTabs, idTabs); //Procesar pestañas\n\n\n        var tab = null,\n            pointer = $(fieldset);\n\n        for (var i = 0; i < labelTabs.length; i++) {\n          tab = $(settings.rupTabsElement).text(labelTabs[i]); //LABEL pestaña\n\n          if (idTabs[i].indexOf('rupRandomLayerId') !== -1) {\n            //Es pestaña\n            tab = $(tab).wrap('<div class=\\'IE8_fix\\'>');\n            tab = $(tab).parent().append($(this).find(idTabs[i]).html());\n            $(tab).children('div').addClass('rup-wizard_tabLevel-' + containerTab.length);\n            tab = $(tab).children().unwrap();\n          } else {\n            //Es contenedor de pestañas\n            tab = $(tab).attr('tabContainer', true);\n            tab = $(tab).wrap('<div class=\\'IE8_fix\\'>');\n            tab = $(tab).parent().append($('<div>').attr('id', 'subtab_' + labelTabs[i]).attr('accordionable', true).addClass('rup-wizard_tabContainerLevel-' + containerTab.length));\n            tab = $(tab).children().unwrap();\n            containerTab.push(labelTabs[i]);\n            maxLevel++;\n            $(pointer).append(tab);\n            pointer = $('#subtab_' + labelTabs[i]);\n            continue;\n          } //Comprobamos si es subelemento\n\n\n          if ($('#' + containerTab[containerTab.length - 1]).find(idTabs[i]).length === 0) {\n            //No es subpestaña, se debe mover el puntero de dónde se deba añadir la capa\n            pointer = $(fieldset);\n\n            do {\n              containerTab.pop(); //Extraer contenedor de pestañas\n              //Comprobar si es subelemento\n\n              if ($('#' + containerTab[containerTab.length - 1]).find(idTabs[i]).length > 0) {\n                pointer = $('#subtab_' + containerTab[containerTab.length - 1]);\n                break;\n              } else {\n                //Recalcular estilo (valor del nivel)\n                $($(tab).get(1)).removeAttr('class').addClass('rup-wizard_tabLevel-' + containerTab.length);\n              }\n            } while (containerTab.length > 0);\n          } //Añadir la capa\n\n\n          $(pointer).append(tab);\n        } // rup_jqtable\n\n\n        $('#step' + stepNumber + ' .rup-table-container').each(function () {\n          var $table = $(this);\n          $table.fluidWidth({\n            fluidBaseLayer: '#' + $table.parent().attr('id')\n          });\n        }); //h1 a /h1 para Pesatañas\n\n        if (settings.summaryTabs2Accordion) {\n          $(fieldset).find('a').each(function () {\n            if (!$(this).hasClass('rup-wizard_prev') && !$(this).hasClass('rup-wizard_next')) {\n              //Controlar que no sea botón\n              $(this).wrap('<h1>');\n            }\n          });\n        } //Eliminar contenedor\n\n\n        $(this).remove();\n      }); //summaryWithAccordion\n\n      if (settings.summaryWithAccordion) {\n        //Convertir estructura\n        $('#step' + stepNumber).find('legend').each(function (index, element) {\n          //legend -> h1 a /h1\n          $('<a></a>').text(element.innerHTML).insertBefore($(element).parent()).wrap('<h1></h1>'); //fieldset -> div\n\n          $(element).parent().replaceWith($('<div></div>').attr('accordionable', $(element).parent().attr('accordionable') === undefined ? false : true).append($(element).parent().children())); //remove legend\n\n          $(element).remove();\n        }); //convertir en rup-accordion\n\n        if ($.isEmptyObject(settings.summaryAccordion)) {\n          $('#step' + stepNumber).rup_accordion(settings.accordion);\n        } else {\n          $('#step' + stepNumber).rup_accordion(settings.summaryAccordion);\n        } //Botón anterior (sacar de accordion)\n\n\n        $('<fieldset></fieldset>').attr('id', 'commands_fieldset').addClass('commands-fieldset').append($('#step' + stepNumber).find('p[id=\\'step' + stepNumber + 'commands\\']')).appendTo($('#step' + stepNumber)); //Espacio para separarlo de los pasos\n\n        if (settings.summaryWithAccordionSpaceBefore) {\n          $('#step' + stepNumber).prepend('</br>');\n        } //Espacio para separarlo de los botones\n\n\n        if (settings.summaryWithAccordionSpaceAfter) {\n          $('#commands_fieldset').prepend('</br>');\n        }\n      } //tabs2Accordion\n\n\n      if (settings.summaryTabs2Accordion) {\n        //Eliminar estilos para no accordion\n        for (var _i = 0; _i <= maxLevel; _i++) {\n          $('.rup-wizard_tabLevel-' + _i).removeClass('rup-wizard_tabLevel-' + _i);\n          $('.rup-wizard_tabContainerLevel-' + _i).removeClass('rup-wizard_tabContainerLevel-' + _i);\n        }\n\n        $('[accordionable=true]').each(function (index, element) {\n          if (element.nodeName === 'FIELDSET') {\n            var legend = $(element).find('legend')[0],\n                buttons = $(element).find('p[id=\\'step' + stepNumber + 'commands\\']'),\n                object = $('<div></div>').attr('accordionable', $(element).attr('accordionable') === undefined ? false : true).append($(element).children()); //Cambiar estructura\n\n            $(element).replaceWith(object); //Eliminar extras (LEGEND y BOTONES)\n\n            $(legend).remove();\n            $(buttons).remove(); //Accordion\n\n            if ($.isEmptyObject(settings.tabAccordion)) {\n              $(object).rup_accordion(settings.accordion);\n            } else {\n              $(object).rup_accordion(settings.tabAccordion);\n            } //Restablecer extras (LEGEND y BOTONES)\n\n\n            $(object).prepend(legend);\n            $(object).append($('<fieldset></fieldset>').append(buttons));\n          } else {\n            if ($.isEmptyObject(settings.tabAccordion)) {\n              $(element).rup_accordion(settings.accordion);\n            } else {\n              $(element).rup_accordion(settings.tabAccordion);\n            }\n          }\n        });\n      } //Eliminar posibles atributos y estilos extra\n\n\n      $('[accordionable]').removeAttr('accordionable'); //Mover botón submit\n\n      $('#step' + stepNumber).find('p[id$=\\'commands\\']').append($('.rup-wizard_submitButton')); //Mostrar paso\n\n      $('#step' + stepNumber).show();\n      /** DEVELOPER SummaryFnc_POST **/\n\n      if (settings.summaryFnc_POST) {\n        settings.summaryFnc_POST.call();\n      }\n    },\n    _getRupTabs: function _getRupTabs(rupWizard, object, labelTabs, idTabs) {\n      //Recorrer los enlaces a pestañas\n      $(object).find('.rup-tabs_title').each(function (index, element) {\n        //Comprobar que si el elemento ya existe (subpestaña) por recursividad, se omite\n        if ($.inArray(element.innerHTML, labelTabs) !== -1) {\n          return;\n        } //Obtener ID y LABEL\n\n\n        idTabs.push($(element).parent().attr('href'));\n        labelTabs.push(element.innerHTML); //Es un contenedor de pestañas (llamada recursiva para pre-procesar los hijos)\n\n        if (idTabs[idTabs.length - 1].substring(1) === labelTabs[labelTabs.length - 1]) {\n          rupWizard._getRupTabs(rupWizard, $('#' + labelTabs[labelTabs.length - 1]), labelTabs, idTabs);\n        }\n      });\n    },\n    _hidePassword: function _hidePassword(password) {\n      var value = '';\n\n      for (var i = 0; i < password.length; i++) {\n        value += '*';\n      }\n\n      return value;\n    },\n\n    /* Created by jankoatwarpspeed.com */\n    //http://www.jankoatwarpspeed.com/post/2009/09/28/webform-wizard-jquery.aspx\n    //Modificaciones:\n    //\t- SPAN por A en los pasos para poder navegar con el tabulador\n    _formToWizard: function _formToWizard(options) {\n      options = $.extend({\n        submitButton: ''\n      }, options);\n      var element = this;\n      var steps = $(element).find('fieldset');\n      var count = steps.length;\n      var submmitButtonName = '#' + options.submitButton;\n      $(submmitButtonName).hide(); // 2\n\n      $(element).before('<ul id=\\'steps\\'></ul>');\n      steps.each(function (i) {\n        $(this).wrap('<div id=\\'step' + i + '\\'></div>');\n        $(this).append('<p id=\\'step' + i + 'commands\\'></p>'); // 2\n\n        var name = $(this).find('legend').html();\n        $('#steps').append('<li id=\\'stepDesc' + i + '\\'>Step ' + (i + 1) + '<a>' + name + '</a></li>');\n\n        if (i == 0) {\n          createNextButton(i);\n          selectStep(i);\n        } else if (i == count - 1) {\n          $('#step' + i).hide();\n          createPrevButton(i);\n        } else {\n          $('#step' + i).hide();\n          createPrevButton(i);\n          createNextButton(i);\n        }\n      });\n\n      function createPrevButton(i) {\n        var stepName = 'step' + i;\n        $('#' + stepName + 'commands').append('<a id=\\'' + stepName + 'Prev\\' class=\\'prev\\'>< Back</a>');\n        $('#' + stepName + 'Prev').on('click', function (e) {\n          $('#' + stepName).hide();\n          $('#step' + (i - 1)).show();\n          $(submmitButtonName).hide();\n          selectStep(i - 1);\n          e.preventDefault();\n        });\n      }\n\n      function createNextButton(i) {\n        var stepName = 'step' + i;\n        $('#' + stepName + 'commands').append('<a id=\\'' + stepName + 'Next\\' class=\\'next\\'>Next ></a>');\n        $('#' + stepName + 'Next').on('click', function (e) {\n          $('#' + stepName).hide();\n          $('#step' + (i + 1)).show();\n          if (i + 2 == count) $(submmitButtonName).show();\n          selectStep(i + 1);\n          e.preventDefault();\n        });\n      }\n\n      function selectStep(i) {\n        $('#steps li').removeClass('current');\n        $('#stepDesc' + i).addClass('current');\n      }\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  $.fn.rup_wizard.defaults = {\n    summary: true,\n    summaryWithAccordion: false,\n    summaryWithAccordionSpaceBefore: true,\n    summaryWithAccordionSpaceAfter: true,\n    summaryTabs2Accordion: false,\n    stepFnc: {},\n    //funciones de cada paso\n    accordion: {\n      animated: 'bounceslide',\n      active: false,\n      autoHeight: false,\n      collapsible: true,\n      heightStyle: 'content'\n    },\n    rupAccordion: {},\n    //accordion (config) definidos en el formulario\n    summaryAccordion: {},\n    //accordion (config) para generar resumen\n    tabAccordion: {},\n    //accorion (config) para pestañas del resumen\n    rupTabsElement: '<h4></h4>',\n    labelElement: '<span></span>',\n    labelSeparatorElement: '<span></span>',\n    labelSeparatorText: '&nbsp;&nbsp;&nbsp;',\n    textareaElement: '<p></p>'\n  };\n  /**\r\n   * Función de callback que se ejecuta previamente al envío del formulario.\r\n   *\r\n   * @callback module:rup_wizard~onSubmitFnc\r\n   * @example\r\n   * $(\"#idForm\").rup_wizard({\r\n   *   submitFnc: function(){\r\n   *   }\r\n   * });\r\n   */\n\n  /**\r\n   * Función de callback que se invocará previamente a la generación del paso.\r\n   *\r\n   * @callback module:rup_wizard~onSummaryFnc_PRE\r\n   * @return {boolean} - En caso de devolver false no se generaría el resumen.\r\n   * @example\r\n   * $(\"#idForm\").rup_wizard({\r\n   *   summaryFnc_PRE: function(){\r\n   *   }\r\n   * });\r\n   */\n\n  /**\r\n   * Función de callback que se ejecuta una vez ha comenzado la generación del paso resumen.\r\n   *\r\n   * @callback module:rup_wizard~onSummaryFnc_INTER\r\n   * @return {boolean} - En caso de devolver false no se continuaría con el procesado del contenido de los pasos\r\n   * @example\r\n   * $(\"#idForm\").rup_wizard({\r\n   *   summaryFnc_INTER: function(){\r\n   *   }\r\n   * });\r\n   */\n\n  /**\r\n   * Función de callback que se invocará una vez se ha generado el paso resumen.\r\n   *\r\n   * @callback module:rup_wizard~onSummaryFnc_POST\r\n   * @example\r\n   * $(\"#idForm\").rup_wizard({\r\n   *   summaryFnc_POST: function(){\r\n   *   }\r\n   * });\r\n   */\n\n  /**\r\n   * @description Propiedades de configuración del componente.\r\n   *\r\n   * @name options\r\n   *\r\n   * @property {Selector} submitButton - Identificador del botón de envío del formulario. Sirve para que dicho botón solo se muestre en el último paso del asistente.\r\n   * @property {module:rup_validate~onSubmitFnc} [submitFnc] - Función que se ejecuta previamente al envío del formulario.\r\n   * @property {boolean} [summary=true] - Indica si se debe generar o no el paso resumen. Este paso mostrará (como texto plano) los valores seleccionados en los diferentes pasos habilitados. Si un paso se encuentra deshabilitado no se utilizarán sus valores para la generación del resumen. El paso de resumen se genera cuando se navega hacia él.\r\n   * @property {boolean} [summaryWithAccordion=false] - Indica si el paso resumen debe formatear los diferentes pasos del asistente mediante elementos que usan el componente accordion.\r\n   * @property {boolean} [summaryWithAccordionSpaceBefore=true] - Indica si cuando se genera un resumen con los diferentes pasos presentados con accordion, se debe dejar un espacio (</br>) entre el contenido y la barra con los pasos.\r\n   * @property {boolean} [summaryWithAccordionSpaceAfter=true] - Indica si cuando se genera un resumen con los diferentes pasos presentados con accordion, se debe dejar un espacio (</br>) entre el contenido y el contenedor de botones (siguiente y enviar).\r\n   * @property {boolean} [summaryTabs2Accordion=false] - Indica si los componentes rup_tab de los diferentes pasos del wizard se deben convertir en elementos del componente accordion a la hora de generar el paso resumen.\r\n   * @property {module:rup_wizard~onSummaryFnc_PRE} [summaryFnc_PRE] - Función que se invocará previamente a la generación del paso resumen. En caso de devolver false no se generaría el resumen.\r\n   * @property {module:rup_wizard~onSummaryFnc_INTER} [summaryFnc_INTER] -Función que se ejecuta una vez ha comenzado la generación del paso resumen. Se habrá generado la capa contenedora y duplicado el contenido de los pasos anteriores pero sin llegar a procesarse (cambiarse por texto plano). En caso de devolver false no se continuaría con el procesado del contenido de los pasos.\r\n   * @property {module:rup_wizard~onSummaryFnc_POST} [summaryFnc_POST] - Función que se ejecuta una vez se ha generado el paso resumen.\r\n   * @property {object} [stepFnc] - Objeto json que contiene las diferentes funciones a ejecutar al navegar hacia cada uno de los pasos. En caso de devolver false no se continuaría la navegación hacia dicho paso. La clave de cada elemento será el número del paso y el valor será la función a ejecutar.\r\n   * @property {Integer[]} [disabled] - Array que indica los pasos a deshabilitar al inicio. En caso de que el elemento del array sea un número (numeric) se deshabilitará dicho paso y en caso de que sea un literal (string) se procesará como un intervalo que deberá definirse como “X-Y”.\r\n   * @property {object} [accordion] - Define de forma general el funcionamiento del componente rup_accordion en el paso de resumen.\r\n   * @property {object} [rupAccordion] - Define el funcionamiento del patrón rup_accordion en el resumen (de los objetos rup_accordion existentes en los pasos anteriores). No tiene valor por defecto, por lo que en caso de no definirse se toma el valor del parámetro accordion.\r\n   * @property {object} [summaryAccordion] - Define el funcionamiento del patrón rup_accordion en el resumen para cada uno de los pasos que lo componen (si configura la generación de resumen y conversión de pasos en accordion). No tiene valor por defecto, por lo que en caso de no definirse se toma el valor del parámetro accordion.\r\n   * @property {object} [tabAccordion] - Define el funcionamiento del patrón rup_accordion en el resumen, para cada los objetos rup_tab existentes en los pasos anteriores (si configura la generación de resumen y conversión de pestañas en accordion). No tiene valor por defecto, por lo que en caso de no definirse se toma el valor del parámetro accordion.\r\n   * @property {string} [rupTabsElement=<h4></h4>] - Define el funcionamiento del patrón rup_accordion en el resumen, para cada los objetos rup_tab existentes en los pasos anteriores (si configura la generación de resumen y conversión de pestañas en accordion). No tiene valor por defecto, por lo que en caso de no definirse se toma el valor del parámetro accordion.\r\n   * @property {string} [labelElement=<span></span>] - Indica el tipo de objeto HTML en el que se convierten los objetos label en el paso de resumen.\r\n   * @property {string} [labelSeparatorElement=<span></span>] - Indica el tipo de objeto HTML que se utilizará para separar los valores de sus correspondientes labels en el paso de resumen.\r\n   * @property {string} [labelSeparatorText=&nbsp;&nbsp;&nbsp;] - Indica el contenido del objeto HTML que se utilizará para separar los valores de sus correspondientes labels en el paso de resumen.\r\n   * @property {string} [textareaElement=<p></p>] - Indica el tipo de objeto HTML en el que se convierten los objetos textarea en el paso de resumen.\r\n   */\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup.wizard.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.buttons.js":
/*!********************************************!*\
  !*** ./src/rup_table/rup.table.buttons.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Genera los botones del table\r\n *\r\n * @summary \t\tExtensión del componente RUP Datatable\r\n * @module\t\t\t\"rup.table.buttons\"\r\n * @version     1.5.1\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n *\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Used for namespacing events added to the document by each instance, so they\n  // can be removed on destroy\n\n  var _instCounter = 0; // Button namespacing counter for namespacing events on individual buttons\n\n  var _buttonCounter = 0; // Default ID naming counter\n\n  var _buttonIdCounter = 1;\n  var _dtButtons = DataTable.ext.buttons;\n  /**\r\n   * Botones\r\n   *\r\n   * @name Buttons\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt\r\n   * @param {object} config\r\n   *\r\n   */\n\n  var Buttons = function Buttons(dt, config) {\n    var idTable = dt.context[0].sTableId;\n    var ctx = dt.context[0];\n    ctx.ext = DataTable.ext;\n    ctx.ext.buttons = {};\n    ctx.ext.buttons.defaults = {\n      buttons: ['addButton', 'editButton', 'cloneButton', 'deleteButton', 'reportsButton'],\n      name: 'main',\n      tabIndex: 0,\n      dom: {\n        container: {\n          tag: 'div',\n          className: 'dt-buttons row'\n        },\n        collection: {\n          tag: 'div',\n          className: 'dt-button-collection'\n        },\n        button: {\n          tag: 'button',\n          className: 'col-12 col-sm-auto btn-material',\n          active: 'active',\n          disabled: 'disabled'\n        },\n        buttonLiner: {\n          tag: 'span',\n          className: ''\n        }\n      }\n    };\n    ctx.ext.buttons.copyButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.reports.copyButton');\n      },\n      id: idTable + 'copyButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-low-emphasis buttons-copyButton',\n      displayRegex: /^\\d+$/,\n      // Se muestra siempre que sea un numero positivo o neutro\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'copyButton',\n      request: {\n        url: '/clipboardReport',\n        method: 'POST',\n        contentType: 'application/json',\n        dataType: 'json',\n        reportsExportAllColumns: false\n      },\n      init: function init(dt, node, config) {\n        ctx.ext.buttons.copyButton.eventDT = dt;\n      },\n      action: function action(e, dt, button, config) {\n        // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n        // del if evita un error\n        if (this.processing !== undefined) {\n          this.processing(true);\n        }\n\n        var that = this;\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeCopyClick', [dt, button, config]);\n\n        _reports(dt, that, config);\n\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterCopyClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.excelButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.reports.excelButton');\n      },\n      id: idTable + 'excelButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-low-emphasis buttons-copyButton',\n      displayRegex: /^\\d+$/,\n      // Se muestra siempre que sea un numero positivo o neutro\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'excelButton',\n      request: {\n        url: '/xlsxReport',\n        method: 'POST',\n        contentType: 'application/json',\n        dataType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n        reportsExportAllColumns: false,\n        fileName: 'reportExcel',\n        sheetTitle: 'Usuario'\n      },\n      action: function action(e, dt, button, config) {\n        // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n        // del if evita un error\n        if (this.processing !== undefined) {\n          this.processing(true);\n        }\n\n        var that = this;\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeExcelClick', [dt, button, config]);\n\n        _reports(dt, that, config);\n\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterExcelClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.pdfButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.reports.pdfButton');\n      },\n      id: idTable + 'pdfButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-low-emphasis buttons-copyButton',\n      displayRegex: /^\\d+$/,\n      // Se muestra siempre que sea un numero positivo o neutro\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'pdfButton',\n      request: {\n        url: '/pdfReport',\n        method: 'POST',\n        contentType: 'application/json',\n        dataType: 'application/pdf',\n        reportsExportAllColumns: false,\n        fileName: 'reportPDF'\n      },\n      action: function action(e, dt, button, config) {\n        // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n        // del if evita un error\n        if (this.processing !== undefined) {\n          this.processing(true);\n        }\n\n        var that = this;\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforePdfClick', [dt, button, config]);\n\n        _reports(dt, that, config);\n\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterPdfClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.odsButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.reports.odsButton');\n      },\n      id: idTable + 'odsButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-low-emphasis buttons-copyButton',\n      displayRegex: /^\\d+$/,\n      // Se muestra siempre que sea un numero positivo o neutro\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'odsButton',\n      request: {\n        url: '/odsReport',\n        method: 'POST',\n        contentType: 'application/json',\n        dataType: 'application/vnd.oasis.opendocument.spreadsheet',\n        reportsExportAllColumns: false,\n        fileName: 'reportODS',\n        sheetTitle: 'Usuario'\n      },\n      action: function action(e, dt, button, config) {\n        // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n        // del if evita un error\n        if (this.processing !== undefined) {\n          this.processing(true);\n        }\n\n        var that = this;\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeOdsClick', [dt, button, config]);\n\n        _reports(dt, that, config);\n\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterOdsClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.csvButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.reports.csvButton');\n      },\n      id: idTable + 'csvButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-low-emphasis buttons-copyButton',\n      displayRegex: /^\\d+$/,\n      // Se muestra siempre que sea un numero positivo o neutro\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'csvButton',\n      request: {\n        url: '/csvReport',\n        method: 'POST',\n        contentType: 'application/json',\n        dataType: 'text/csv',\n        reportsExportAllColumns: false,\n        fileName: 'reportCSV',\n        sheetTitle: 'Usuario'\n      },\n      action: function action(e, dt, button, config) {\n        // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n        // del if evita un error\n        if (this.processing !== undefined) {\n          this.processing(true);\n        }\n\n        var that = this;\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeCsvClick', [dt, button, config]);\n\n        _reports(dt, that, config);\n\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterCsvClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.addButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.add');\n      },\n      id: idTable + 'addButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-high-emphasis table_toolbar_btnAdd order-1',\n      displayRegex: /^\\d+$/,\n      // Se muestra siempre que sea un numero positivo o neutro\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'add',\n      init: function init(dt, button, config) {\n        ctx.ext.buttons.addButton.eventDT = dt;\n      },\n      action: function action(e, dt, button, config) {\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeAddClick', [dt, button, config]);\n        DataTable.Api().buttons.actions(dt, config);\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterAddClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.editButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.edit');\n      },\n      id: idTable + 'editButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-high-emphasis table_toolbar_btnEdit order-2',\n      displayRegex: /^[1-9][0-9]*$/,\n      // Se muestra siempre que sea un numero mayor a 0\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'edit',\n      init: function init(dt, button, config) {\n        ctx.ext.buttons.editButton.eventDT = dt;\n      },\n      action: function action(e, dt, button, config) {\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeEditClick', [dt, button, config]);\n        DataTable.Api().buttons.actions(dt, config);\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterEditClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.cloneButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.clone');\n      },\n      id: idTable + 'cloneButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-high-emphasis table_toolbar_btnClone order-3',\n      displayRegex: /^1$/,\n      // Se muestra solo cuando sea igual a 1\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'clone',\n      init: function init(dt, button, config) {\n        ctx.ext.buttons.cloneButton.eventDT = dt;\n      },\n      action: function action(e, dt, button, config) {\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeCloneClick', [dt, button, config]);\n        DataTable.Api().buttons.actions(dt, config);\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterCloneClick', [dt, button, config]);\n      }\n    };\n    ctx.ext.buttons.deleteButton = {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.delete');\n      },\n      id: idTable + 'deleteButton_1',\n      // Campo obligatorio si se quiere usar desde el contextMenu\n      className: 'btn-material-primary-high-emphasis table_toolbar_btnDelete order-4',\n      displayRegex: /^[1-9][0-9]*$/,\n      // Se muestra siempre que sea un numero mayor a 0\n      insideContextMenu: ctx.oInit.buttons.contextMenu,\n      // Independientemente de este valor, sera 'false' si no tiene un id definido\n      type: 'delete',\n      init: function init(dt, button, config) {\n        ctx.ext.buttons.deleteButton.eventDT = dt;\n      },\n      action: function action(e, dt, button, config) {\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeDeleteClick', [dt, button, config]);\n        DataTable.Api().buttons.actions(dt, config);\n        $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterDeleteClick', [dt, button, config]);\n      }\n    };\n    var listadoExports = ['copyButton', 'excelButton', 'pdfButton', 'odsButton', 'csvButton'];\n    ctx.ext.buttons.reportsButton = {\n      extend: 'collection',\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.reports.main');\n      },\n      id: idTable + 'informes_01',\n      className: 'btn-material-primary-medium-emphasis order-last ml-1 ml-lg-auto',\n      displayRegex: /^\\d+$/,\n      // Se muestra siempre que sea un numero positivo o neutro\n      autoClose: true,\n      type: 'reports',\n      reportsExportAllColumns: false,\n      buttons: listadoExports\n    }; // Almacena los identificadores de los botones personalizados.\n\n    ctx.ext.buttons.custom = []; // Ajusta el tamaño de los botones por defecto en caso de que haya sido especificado en las preferencias\n\n    if (ctx.oInit.buttons.size !== undefined) {\n      $.each(ctx.ext.buttons, function (name, item) {\n        if (item.className !== undefined) {\n          if (ctx.oInit.buttons.size === 'lg') {\n            item.className += \" btn-material-lg\";\n          } else if (ctx.oInit.buttons.size === 'sm') {\n            item.className += \" btn-material-sm\";\n          }\n        }\n      });\n    }\n\n    if (ctx.oInit.buttons.blackListButtons !== undefined) {\n      if (ctx.oInit.buttons.blackListButtons === 'all') {\n        //si no se quiere ninguno se elimina\n        listadoExports = [];\n        ctx.ext.buttons.defaults.buttons = [];\n      } else if (ctx.oInit.buttons.blackListButtons && ctx.oInit.buttons.blackListButtons.length > 0) {\n        $.each(ctx.oInit.buttons.blackListButtons, function () {\n          var name = this;\n          var pos = $.inArray(name, listadoExports);\n\n          if (pos >= 0) {\n            listadoExports.splice(pos, 1);\n          } //Resto de botones\n\n\n          var posBoton = $.inArray(name, ctx.ext.buttons.defaults.buttons);\n\n          if (posBoton >= 0) {\n            ctx.ext.buttons.defaults.buttons.splice(posBoton, 1);\n          }\n        });\n      }\n    } // Añadir los botones de la edición en línea.\n\n\n    if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined) {\n      $.extend(ctx.ext.buttons, ctx.oInit.inlineEdit.myButtons);\n\n      for (var nameButton in ctx.oInit.inlineEdit.myButtons) {\n        ctx.ext.buttons.defaults.buttons.push(nameButton);\n      }\n    } // Añadir los botones personalizados.\n\n\n    if (ctx.oInit.buttons.myButtons !== undefined) {\n      $.extend(ctx.ext.buttons, ctx.oInit.buttons.myButtons);\n\n      for (var _nameButton in ctx.oInit.buttons.myButtons) {\n        ctx.ext.buttons.defaults.buttons.push(_nameButton);\n        ctx.ext.buttons.custom.push(ctx.oInit.buttons.myButtons[_nameButton].id);\n      }\n    } // If there is no config set it to an empty object\n\n\n    if (typeof config === 'undefined') {\n      config = {};\n    } // Allow a boolean true for defaults\n\n\n    if (config === true) {\n      config = {};\n    } // For easy configuration of buttons an array can be given\n\n\n    if (Array.isArray(config)) {\n      config = {\n        buttons: config\n      };\n    }\n\n    this.c = $.extend(true, {}, ctx.ext.buttons.defaults, config); // Don't want a deep copy for the buttons\n\n    if (config.buttons) {\n      this.c.buttons = config.buttons;\n    }\n\n    this.s = {\n      dt: new DataTable.Api(dt),\n      buttons: [],\n      listenKeys: '',\n      namespace: 'dtb' + _instCounter++\n    };\n    this.dom = {\n      container: $('<' + this.c.dom.container.tag + '></' + this.c.dom.container.tag + '>').addClass(this.c.dom.container.className).attr('id', ctx.sTableId + '_containerToolbar')\n    };\n\n    this._constructor();\n  };\n\n  $.extend(Buttons.prototype, {\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n     * Public methods\r\n     */\n\n    /**\r\n     * Get the action of a button\r\n     *\r\n     * @name action\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {int|string} Button index\r\n     * @return {function}\r\n     *\r\n     */\n\n    /**\r\n     * Set the action of a button\r\n     *\r\n     * @name action\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button element\r\n     * @param  {function} action Function to set\r\n     * @return {Buttons} Self for chaining\r\n     *\r\n     */\n    action: function action(node, _action) {\n      var button = this._nodeToButton(node);\n\n      if (_action === undefined) {\n        return button.conf.action;\n      }\n\n      button.conf.action = _action;\n      return this;\n    },\n\n    /**\r\n     * Add an active class to the button to make to look active or get current\r\n     * active state.\r\n     *\r\n     * @name active\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button element\r\n     * @param  {boolean} [flag] Enable / disable flag\r\n     * @return {Buttons} Self for chaining or boolean for getter\r\n     *\r\n     */\n    active: function active(node, flag) {\n      var button = this._nodeToButton(node);\n\n      var klass = this.c.dom.button.active;\n      var jqNode = $(button.node);\n\n      if (flag === undefined) {\n        return jqNode.hasClass(klass);\n      }\n\n      jqNode.toggleClass(klass, flag === undefined ? true : flag);\n      return this;\n    },\n\n    /**\r\n     * Add a new button\r\n     *\r\n     * @name add\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} config Button configuration object, base string name or function\r\n     * @param {int|string} [idx] Button index for where to insert the button\r\n     * @return {Buttons} Self for chaining\r\n     *\r\n     */\n    add: function add(config, idx) {\n      var buttons = this.s.buttons;\n\n      if (typeof idx === 'string') {\n        var split = idx.split('-');\n        var base = this.s;\n\n        for (var i = 0, ien = split.length - 1; i < ien; i++) {\n          base = base.buttons[split[i] * 1];\n        }\n\n        buttons = base.buttons;\n        idx = split[split.length - 1] * 1;\n      }\n\n      this._expandButton(buttons, config, false, idx);\n\n      this._draw();\n\n      return this;\n    },\n\n    /**\r\n     * Get the container node for the buttons\r\n     *\r\n     * @name container\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @return {jQuery} Buttons node\r\n     *\r\n     */\n    container: function container() {\n      return this.dom.container;\n    },\n\n    /**\r\n     * Disable a button\r\n     *\r\n     * @name disable\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button node\r\n     * @return {Buttons} Self for chaining\r\n     *\r\n     */\n    disable: function disable(node, contextMenu) {\n      var button = this._nodeToButton(node);\n\n      $(button.node).addClass(this.c.dom.button.disabled);\n\n      if (contextMenu) {\n        $('#' + button.node.id + '_contextMenuToolbar').addClass(this.c.dom.button.disabled);\n      }\n\n      return this;\n    },\n\n    /**\r\n     * Destroy the instance, cleaning up event handlers and removing DOM\r\n     * elements\r\n     *\r\n     * @name destroy\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @return {Buttons} Self for chaining\r\n     *\r\n     */\n    destroy: function destroy() {\n      // Key event listener\n      $('body').off('keyup.' + this.s.namespace); // Individual button destroy (so they can remove their own events if\n      // needed). Take a copy as the array is modified by `remove`\n\n      var buttons = this.s.buttons.slice();\n      var i, ien;\n\n      for (i = 0, ien = buttons.length; i < ien; i++) {\n        this.remove(buttons[i].node);\n      } // Container\n\n\n      this.dom.container.remove(); // Remove from the settings object collection\n\n      var buttonInsts = this.s.dt.settings()[0];\n\n      for (i = 0, ien = buttonInsts.length; i < ien; i++) {\n        if (buttonInsts.inst === this) {\n          buttonInsts.splice(i, 1);\n          break;\n        }\n      }\n\n      return this;\n    },\n\n    /**\r\n     * Enable / disable a button\r\n     *\r\n     * @name enable\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button node\r\n     * @param  {boolean} [flag=true] Enable / disable flag\r\n     * @return {Buttons} Self for chaining\r\n     *\r\n     */\n    enable: function enable(node, flag, contextMenu) {\n      if (flag === false) {\n        return this.disable(node);\n      }\n\n      var button = this._nodeToButton(node);\n\n      $(button.node).removeClass(this.c.dom.button.disabled);\n\n      if (contextMenu) {\n        $('#' + button.node.id + '_contextMenuToolbar').removeClass(this.c.dom.button.disabled);\n      }\n\n      return this;\n    },\n\n    /**\r\n     * Get the instance name for the button set selector\r\n     *\r\n     * @name name\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @return {string} Instance name\r\n     *\r\n     */\n    name: function name() {\n      return this.c.name;\n    },\n\n    /**\r\n     * Get a button's node\r\n     *\r\n     * @name node\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button node\r\n     * @return {jQuery} Button element\r\n     *\r\n     */\n    node: function node(_node) {\n      var button = this._nodeToButton(_node);\n\n      return $(button.node);\n    },\n\n    /**\r\n     * Set / get a processing class on the selected button\r\n     *\r\n     * @name processing\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {boolean} flag true to add, false to remove, undefined to get\r\n     * @return {boolean|Buttons} Getter value or this if a setter.\r\n     *\r\n     */\n    processing: function processing(node, flag) {\n      var button = this._nodeToButton(node);\n\n      if (flag === undefined) {\n        return $(button.node).hasClass('processing');\n      }\n\n      $(button.node).toggleClass('processing', flag);\n      return this;\n    },\n\n    /**\r\n     * Remove a button.\r\n     *\r\n     * @name remove\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button node\r\n     * @return {Buttons} Self for chaining\r\n     *\r\n     */\n    remove: function remove(node) {\n      var button = this._nodeToButton(node);\n\n      var host = this._nodeToHost(node);\n\n      var dt = this.s.dt; // Remove any child buttons first\n\n      if (button.buttons.length) {\n        for (var i = button.buttons.length - 1; i >= 0; i--) {\n          this.remove(button.buttons[i].node);\n        }\n      } // Allow the button to remove event handlers, etc\n\n\n      if (button.conf.destroy) {\n        button.conf.destroy.call(dt.button(node), dt, $(node), button.conf);\n      }\n\n      this._removeKey(button.conf);\n\n      $(button.node).remove();\n      var idx = $.inArray(button, host);\n      host.splice(idx, 1);\n      return this;\n    },\n\n    /**\r\n     * Get the text for a button\r\n     *\r\n     * @name text\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {int|string} node Button index\r\n     * @return {string} Button text\r\n     *\r\n     */\n\n    /**\r\n     * Set the text for a button\r\n     *\r\n     * @name text\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {int|string|function} node Button index\r\n     * @param  {string} label Text\r\n     * @return {Buttons} Self for chaining\r\n     *\r\n     */\n    text: function text(node, label) {\n      var button = this._nodeToButton(node);\n\n      var buttonLiner = this.c.dom.collection.buttonLiner;\n      var linerTag = button.inCollection && buttonLiner && buttonLiner.tag ? buttonLiner.tag : this.c.dom.buttonLiner.tag;\n      var dt = this.s.dt;\n      var jqNode = $(button.node);\n\n      var text = function text(opt) {\n        return typeof opt === 'function' ? opt(dt, jqNode, button.conf) : opt;\n      };\n\n      if (label === undefined) {\n        return text(button.conf.text);\n      }\n\n      button.conf.text = label;\n\n      if (linerTag) {\n        jqNode.children(linerTag).html(text(label));\n      } else {\n        jqNode.html(text(label));\n      }\n\n      return this;\n    },\n\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n     * Constructor\r\n     */\n\n    /**\r\n     * Buttons constructor\r\n     *\r\n     * @name _constructor\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     */\n    _constructor: function _constructor() {\n      var that = this;\n      var dt = this.s.dt;\n      var dtSettings = dt.settings()[0];\n      var buttons = this.c.buttons;\n\n      if (!dtSettings._buttons) {\n        dtSettings._buttons = [];\n      }\n\n      dtSettings._buttons.push({\n        inst: this,\n        name: this.c.name\n      });\n\n      for (var i = 0, ien = buttons.length; i < ien; i++) {\n        this.add(buttons[i]);\n      }\n\n      dt.on('destroy', function () {\n        that.destroy();\n      }); // Global key event binding to listen for button keys\n\n      $('body').on('keyup.' + this.s.namespace, function (e) {\n        if (!document.activeElement || document.activeElement === document.body) {\n          // SUse a string of characters for fast lookup of if we need to\n          // handle this\n          var character = String.fromCharCode(e.keyCode).toLowerCase();\n\n          if (that.s.listenKeys.toLowerCase().indexOf(character) !== -1) {\n            that._keypress(character, e);\n          }\n        }\n      });\n    },\n\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n     * Private methods\r\n     */\n\n    /**\r\n     * Add a new button to the key press listener\r\n     *\r\n     * @name _addKey\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} conf Resolved button configuration object\r\n     *\r\n     */\n    _addKey: function _addKey(conf) {\n      if (conf.key) {\n        this.s.listenKeys += $.isPlainObject(conf.key) ? conf.key.key : conf.key;\n      }\n    },\n\n    /**\r\n     * Insert the buttons into the container. Call without parameters!\r\n     *\r\n     * @name _draw\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} [container] Recursive only - Insert point\r\n     * @param  {array} [buttons] Recursive only - Buttons array\r\n     *\r\n     */\n    _draw: function _draw(container, buttons) {\n      if (!container) {\n        container = this.dom.container;\n        buttons = this.s.buttons;\n      }\n\n      container.children().detach();\n\n      for (var i = 0, ien = buttons.length; i < ien; i++) {\n        container.append(buttons[i].inserter);\n        container.append(' ');\n\n        if (buttons[i].buttons && buttons[i].buttons.length) {\n          this._draw(buttons[i].collection, buttons[i].buttons);\n        }\n      }\n    },\n\n    /**\r\n     * Create buttons from an array of buttons\r\n     *\r\n     * @name _expandButton\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {array} attachTo Buttons array to attach to\r\n     * @param  {object} button Button definition\r\n     * @param  {boolean} inCollection true if the button is in a collection\r\n     *\r\n     */\n    _expandButton: function _expandButton(attachTo, button, inCollection, attachPoint) {\n      var dt = this.s.dt;\n      var buttonCounter = 0;\n      var buttons = !Array.isArray(button) ? [button] : button;\n\n      for (var i = 0, ien = buttons.length; i < ien; i++) {\n        var conf = this._resolveExtends(buttons[i]);\n\n        if (!conf) {\n          continue;\n        } // If the configuration is an array, then expand the buttons at this\n        // point\n\n\n        if (Array.isArray(conf)) {\n          this._expandButton(attachTo, conf, inCollection, attachPoint);\n\n          continue;\n        }\n\n        var built = this._buildButton(conf, inCollection);\n\n        if (!built) {\n          continue;\n        }\n\n        if (attachPoint !== undefined) {\n          attachTo.splice(attachPoint, 0, built);\n          attachPoint++;\n        } else {\n          attachTo.push(built);\n        }\n\n        if (built.conf.buttons) {\n          var collectionDom = this.c.dom.collection;\n          built.collection = $('<' + collectionDom.tag + '></' + collectionDom.tag + '>').addClass(collectionDom.className).attr('role', 'menu');\n          built.conf._collection = built.collection;\n\n          this._expandButton(built.buttons, built.conf.buttons, true, attachPoint);\n        } // init call is made here, rather than buildButton as it needs to\n        // be selectable, and for that it needs to be in the buttons array\n\n\n        if (conf.init) {\n          conf.init.call(dt.button(built.node), dt, $(built.node), conf);\n        }\n\n        buttonCounter++;\n      }\n    },\n\n    /**\r\n     * Create an individual button\r\n     *\r\n     * @name _buildButton\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {object} config            Resolved button configuration\r\n     * @param  {boolean} inCollection `true` if a collection button\r\n     * @return {jQuery} Created button node (jQuery)\r\n     *\r\n     */\n    _buildButton: function _buildButton(config, inCollection) {\n      var buttonDom = this.c.dom.button;\n      var linerDom = this.c.dom.buttonLiner;\n      var collectionDom = this.c.dom.collection;\n      var dt = this.s.dt;\n      var ctx = dt.settings()[0];\n\n      var text = function text(opt) {\n        return typeof opt === 'function' ? opt(dt, button, config) : opt;\n      };\n\n      if (inCollection && collectionDom.button) {\n        buttonDom = collectionDom.button;\n      }\n\n      if (inCollection && collectionDom.buttonLiner) {\n        linerDom = collectionDom.buttonLiner;\n      } // Make sure that the button is available based on whatever requirements\n      // it has. For example, Flash buttons require Flash\n\n\n      if (config.available && !config.available(dt, config)) {\n        return false;\n      }\n\n      var action = function action(e, dt, button, config) {\n        config.action.call(dt.button(button), e, dt, button, config);\n        $(dt.table().node()).triggerHandler('buttons-action.dt', [dt.button(button), dt, button, config]);\n      };\n\n      var button = $('<' + buttonDom.tag + '></' + buttonDom.tag + '>').addClass(buttonDom.className).attr('tabindex', this.s.dt.settings()[0].iTabIndex).attr('aria-controls', this.s.dt.table().node().id).on('click.dtb', function (e) {\n        e.preventDefault();\n\n        if (!button.hasClass(buttonDom.disabled) && config.action) {\n          action(e, dt, button, config);\n        }\n\n        button.blur();\n      }); // Make `a` tags act like a link\n\n      if (buttonDom.tag.toLowerCase() === 'a') {\n        button.attr('href', '#');\n      }\n\n      if (linerDom.tag) {\n        var liner = $('<' + linerDom.tag + '></' + linerDom.tag + '>').html(text(config.text)).addClass(linerDom.className);\n\n        if (linerDom.tag.toLowerCase() === 'a') {\n          liner.attr('href', '#');\n        }\n\n        button.append(liner);\n      } else {\n        button.html(text(config.text));\n      }\n\n      if (config.id) {\n        button.attr('id', config.id);\n      } else {\n        // Se desactiva el acceso desde el contextMenu por no tener un id establecido\n        config.insideContextMenu = false; // Se asigna un id dinamico en funcion del nombre del table al que pertenece\n\n        config.id = ctx.sTableId + '_button_' + _buttonIdCounter++;\n        button.attr('id', config.id);\n      }\n\n      if (config.className) {\n        button.addClass(config.className);\n      }\n\n      if (config.titleAttr) {\n        button.attr('title', text(config.titleAttr));\n      }\n\n      if (config.attr) {\n        button.attr(config.attr);\n      }\n\n      if (!config.namespace) {\n        config.namespace = '.dt-button-' + _buttonCounter++;\n      }\n\n      if (!config.icon) {\n        // Comprueba si es alguno de los botones con iconos definidos por defecto\n        switch (config.type) {\n          case 'add':\n            config.icon = 'mdi-plus';\n            break;\n\n          case 'edit':\n            config.icon = 'mdi-playlist-edit';\n            break;\n\n          case 'clone':\n            config.icon = 'mdi-content-copy';\n            break;\n\n          case 'delete':\n            config.icon = 'mdi-trash-can-outline';\n            break;\n\n          case 'reports':\n            config.icon = 'mdi-file-export';\n            break;\n\n          case 'copyButton':\n            config.icon = 'mdi-clipboard-text-outline';\n            break;\n\n          case 'excelButton':\n            config.icon = 'mdi-file-excel';\n            break;\n\n          case 'pdfButton':\n            config.icon = 'mdi-file-pdf';\n            break;\n\n          case 'odsButton':\n            config.icon = 'mdi-file';\n            break;\n\n          case 'csvButton':\n            config.icon = 'mdi-file';\n            break;\n\n          default:\n            config.icon = 'mdi-settings';\n        }\n      }\n\n      var buttonContainer = this.c.dom.buttonContainer;\n      var inserter;\n\n      if (buttonContainer && buttonContainer.tag) {\n        inserter = $('<' + buttonContainer.tag + '></' + buttonContainer.tag + '>').addClass(buttonContainer.className).append(button);\n      } else {\n        inserter = button;\n      }\n\n      this._addKey(config);\n\n      return {\n        conf: config,\n        node: button.get(0),\n        inserter: inserter,\n        buttons: [],\n        inCollection: inCollection,\n        collection: null\n      };\n    },\n\n    /**\r\n     * Get the button object from a node (recursive)\r\n     *\r\n     * @name _nodeToButton\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button node\r\n     * @param  {array} [buttons] Button array, uses base if not defined\r\n     * @return {object} Button object\r\n     *\r\n     */\n    _nodeToButton: function _nodeToButton(node, buttons) {\n      if (!buttons) {\n        buttons = this.s.buttons;\n      }\n\n      for (var i = 0, ien = buttons.length; i < ien; i++) {\n        if (buttons[i].node === node) {\n          return buttons[i];\n        }\n\n        if (buttons[i].buttons.length) {\n          var ret = this._nodeToButton(node, buttons[i].buttons);\n\n          if (ret) {\n            return ret;\n          }\n        }\n      }\n    },\n\n    /**\r\n     * Get container array for a button from a button node (recursive)\r\n     *\r\n     * @name _nodeToHost\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {node} node Button node\r\n     * @param  {array} [buttons] Button array, uses base if not defined\r\n     * @return {array} Button's host array\r\n     *\r\n     */\n    _nodeToHost: function _nodeToHost(node, buttons) {\n      if (!buttons) {\n        buttons = this.s.buttons;\n      }\n\n      for (var i = 0, ien = buttons.length; i < ien; i++) {\n        if (buttons[i].node === node) {\n          return buttons;\n        }\n\n        if (buttons[i].buttons.length) {\n          var ret = this._nodeToHost(node, buttons[i].buttons);\n\n          if (ret) {\n            return ret;\n          }\n        }\n      }\n    },\n\n    /**\r\n     * Handle a key press - determine if any button's key configured matches\r\n     * what was typed and trigger the action if so.\r\n     *\r\n     * @name _keypress\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {string} character The character pressed\r\n     * @param  {object} e Key event that triggered this call\r\n     *\r\n     */\n    _keypress: function _keypress(character, e) {\n      // Check if this button press already activated on another instance of Buttons\n      if (e._buttonsHandled) {\n        return;\n      }\n\n      var run = function run(conf, node) {\n        if (!conf.key) {\n          return;\n        }\n\n        if (conf.key === character) {\n          e._buttonsHandled = true;\n          $(node).click();\n        } else if ($.isPlainObject(conf.key)) {\n          if (conf.key.key !== character) {\n            return;\n          }\n\n          if (conf.key.shiftKey && !e.shiftKey) {\n            return;\n          }\n\n          if (conf.key.altKey && !e.altKey) {\n            return;\n          }\n\n          if (conf.key.ctrlKey && !e.ctrlKey) {\n            return;\n          }\n\n          if (conf.key.metaKey && !e.metaKey) {\n            return;\n          } // Made it this far - it is good\n\n\n          e._buttonsHandled = true;\n          $(node).click();\n        }\n      };\n\n      var recurse = function recurse(a) {\n        for (var i = 0, ien = a.length; i < ien; i++) {\n          run(a[i].conf, a[i].node);\n\n          if (a[i].buttons.length) {\n            recurse(a[i].buttons);\n          }\n        }\n      };\n\n      recurse(this.s.buttons);\n    },\n\n    /**\r\n     * Remove a key from the key listener for this instance (to be used when a\r\n     * button is removed)\r\n     *\r\n     * @name _removeKey\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {object} conf Button configuration\r\n     *\r\n     */\n    _removeKey: function _removeKey(conf) {\n      if (conf.key) {\n        var character = $.isPlainObject(conf.key) ? conf.key.key : conf.key; // Remove only one character, as multiple buttons could have the\n        // same listening key\n\n        var a = this.s.listenKeys.split('');\n        var idx = $.inArray(character, a);\n        a.splice(idx, 1);\n        this.s.listenKeys = a.join('');\n      }\n    },\n\n    /**\r\n     * Resolve a button configuration\r\n     *\r\n     * @name _resolveExtends\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param  {string|function|object} conf Button config to resolve\r\n     * @return {object} Button configuration\r\n     *\r\n     */\n    _resolveExtends: function _resolveExtends(conf) {\n      var dt = this.s.dt;\n      var i, ien;\n      var ctx = dt.context[0];\n      var _dtButtonsTable = ctx.ext.buttons;\n      _dtButtonsTable.collection = _dtButtons.collection;\n\n      var toConfObject = function toConfObject(base) {\n        var loop = 0; // Loop until we have resolved to a button configuration, or an\n        // array of button configurations (which will be iterated\n        // separately)\n\n        while (!$.isPlainObject(base) && !Array.isArray(base)) {\n          if (base === undefined) {\n            return;\n          }\n\n          if (typeof base === 'function') {\n            base = base(dt, conf);\n\n            if (!base) {\n              return false;\n            }\n          } else if (typeof base === 'string') {\n            if (!_dtButtonsTable[base]) {\n              throw 'Unknown button type: ' + base;\n            }\n\n            base = _dtButtonsTable[base];\n          }\n\n          loop++;\n\n          if (loop > 30) {\n            // Protect against misconfiguration killing the browser\n            throw 'Buttons: Too many iterations';\n          }\n        }\n\n        return Array.isArray(base) ? base : $.extend({}, base);\n      };\n\n      conf = toConfObject(conf);\n\n      while (conf && conf.extend) {\n        // Use `toConfObject` in case the button definition being extended\n        // is itself a string or a function\n        if (!_dtButtonsTable[conf.extend]) {\n          throw 'Cannot extend unknown button type: ' + conf.extend;\n        }\n\n        var objArray = toConfObject(_dtButtonsTable[conf.extend]);\n\n        if (Array.isArray(objArray)) {\n          return objArray;\n        } else if (!objArray) {\n          // This is a little brutal as it might be possible to have a\n          // valid button without the extend, but if there is no extend\n          // then the host button would be acting in an undefined state\n          return false;\n        } // Stash the current class name\n\n\n        var originalClassName = objArray.className;\n        conf = $.extend({}, objArray, conf); // The extend will have overwritten the original class name if the\n        // `conf` object also assigned a class, but we want to concatenate\n        // them so they are list that is combined from all extended buttons\n\n        if (originalClassName && conf.className !== originalClassName) {\n          conf.className = originalClassName + ' ' + conf.className;\n        } // Buttons to be added to a collection  -gives the ability to define\n        // if buttons should be added to the start or end of a collection\n\n\n        var postfixButtons = conf.postfixButtons;\n\n        if (postfixButtons) {\n          if (!conf.buttons) {\n            conf.buttons = [];\n          }\n\n          for (i = 0, ien = postfixButtons.length; i < ien; i++) {\n            conf.buttons.push(postfixButtons[i]);\n          }\n\n          conf.postfixButtons = null;\n        }\n\n        var prefixButtons = conf.prefixButtons;\n\n        if (prefixButtons) {\n          if (!conf.buttons) {\n            conf.buttons = [];\n          }\n\n          for (i = 0, ien = prefixButtons.length; i < ien; i++) {\n            conf.buttons.splice(i, 0, prefixButtons[i]);\n          }\n\n          conf.prefixButtons = null;\n        } // Although we want the `conf` object to overwrite almost all of\n        // the properties of the object being extended, the `extend`\n        // property should come from the object being extended\n\n\n        conf.extend = objArray.extend;\n      }\n\n      return conf;\n    }\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Statics\r\n   */\n\n  /**\r\n   * Show / hide a background layer behind a collection\r\n   *\r\n   * @name Buttons.background\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param  {boolean} Flag to indicate if the background should be shown or\r\n   *   hidden\r\n   * @param  {string} Class to assign to the background\r\n   *\r\n   * @static\r\n   *\r\n   */\n\n  Buttons.background = function (show, className, fade) {\n    if (fade === undefined) {\n      fade = 400;\n    }\n\n    if (show) {\n      $('<div></div>').addClass(className).css('display', 'none').appendTo('body').fadeIn(fade);\n    } else {\n      $('body > div.' + className).fadeOut(fade, function () {\n        $(this).removeClass(className).remove();\n      });\n    }\n  };\n  /**\r\n   * Instance selector - select Buttons instances based on an instance selector\r\n   * value from the buttons assigned to a DataTable. This is only useful if\r\n   * multiple instances are attached to a DataTable.\r\n   *\r\n   * @name Buttons.instanceSelector\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param  {string|int|array} Instance selector - see `instance-selector`\r\n   *   documentation on the DataTables site\r\n   * @param  {array} Button instance array that was attached to the DataTables\r\n   *   settings object\r\n   * @return {array} Buttons instances\r\n   *\r\n   * @static\r\n   *\r\n   */\n\n\n  Buttons.instanceSelector = function (group, buttons) {\n    if (!group) {\n      return $.map(buttons, function (v) {\n        return v.inst;\n      });\n    }\n\n    var ret = [];\n    var names = $.map(buttons, function (v) {\n      return v.name;\n    }); // Flatten the group selector into an array of single options\n\n    var process = function process(input) {\n      if (Array.isArray(input)) {\n        for (var i = 0, ien = input.length; i < ien; i++) {\n          process(input[i]);\n        }\n\n        return;\n      }\n\n      if (typeof input === 'string') {\n        if (input.indexOf(',') !== -1) {\n          // String selector, list of names\n          process(input.split(','));\n        } else {\n          // String selector individual name\n          var idx = $.inArray(input.trim(), names);\n\n          if (idx !== -1) {\n            ret.push(buttons[idx].inst);\n          }\n        }\n      } else if (typeof input === 'number') {\n        // Index selector\n        ret.push(buttons[input].inst);\n      }\n    };\n\n    process(group);\n    return ret;\n  };\n  /**\r\n   * Button selector - select one or more buttons from a selector input so some\r\n   * operation can be performed on them.\r\n   *\r\n   * @name Buttons.buttonSelector\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param  {array} Button instances array that the selector should operate on\r\n   * @param  {string|int|node|jQuery|array} Button selector - see\r\n   *   `button-selector` documentation on the DataTables site\r\n   * @return {array} Array of objects containing `inst` and `idx` properties of\r\n   *   the selected buttons so you know which instance each button belongs to.\r\n   *\r\n   * @static\r\n   *\r\n   */\n\n\n  Buttons.buttonSelector = function (insts, selector) {\n    var ret = [];\n\n    var nodeBuilder = function nodeBuilder(a, buttons, baseIdx) {\n      var button;\n      var idx;\n\n      for (var i = 0, ien = buttons.length; i < ien; i++) {\n        button = buttons[i];\n\n        if (button) {\n          idx = baseIdx !== undefined ? baseIdx + i : i + '';\n          a.push({\n            node: button.node,\n            name: button.conf.name,\n            idx: idx\n          });\n\n          if (button.buttons) {\n            nodeBuilder(a, button.buttons, idx + '-');\n          }\n        }\n      }\n    };\n\n    var run = function run(selector, inst) {\n      var i, ien;\n      var buttons = [];\n      nodeBuilder(buttons, inst.s.buttons);\n      var nodes = $.map(buttons, function (v) {\n        return v.node;\n      });\n\n      if (Array.isArray(selector) || selector instanceof $) {\n        for (i = 0, ien = selector.length; i < ien; i++) {\n          run(selector[i], inst);\n        }\n\n        return;\n      }\n\n      if (selector === null || selector === undefined || selector === '*') {\n        // Select all\n        for (i = 0, ien = buttons.length; i < ien; i++) {\n          ret.push({\n            inst: inst,\n            node: buttons[i].node\n          });\n        }\n      } else if (typeof selector === 'number') {\n        // Main button index selector\n        ret.push({\n          inst: inst,\n          node: inst.s.buttons[selector].node\n        });\n      } else if (typeof selector === 'string') {\n        if (selector.indexOf(',') !== -1) {\n          // Split\n          var a = selector.split(',');\n\n          for (i = 0, ien = a.length; i < ien; i++) {\n            run(a[i].trim(), inst);\n          }\n        } else if (selector.match(/^\\d+(\\-\\d+)*$/)) {\n          // Sub-button index selector\n          var indexes = $.map(buttons, function (v) {\n            return v.idx;\n          });\n          ret.push({\n            inst: inst,\n            node: buttons[$.inArray(selector, indexes)].node\n          });\n        } else if (selector.indexOf(':name') !== -1) {\n          // Button name selector\n          var name = selector.replace(':name', '');\n\n          for (i = 0, ien = buttons.length; i < ien; i++) {\n            if (buttons[i].name === name) {\n              ret.push({\n                inst: inst,\n                node: buttons[i].node\n              });\n            }\n          }\n        } else {\n          // jQuery selector on the nodes\n          $(nodes).filter(selector).each(function () {\n            ret.push({\n              inst: inst,\n              node: this\n            });\n          });\n        }\n      } else if (_typeof(selector) === 'object' && selector.nodeName) {\n        // Node selector\n        var idx = $.inArray(selector, nodes);\n\n        if (idx !== -1) {\n          ret.push({\n            inst: inst,\n            node: nodes[idx]\n          });\n        }\n      }\n    };\n\n    for (var i = 0, ien = insts.length; i < ien; i++) {\n      var inst = insts[i];\n      run(selector, inst);\n    }\n\n    return ret;\n  };\n  /**\r\n   * Version information\r\n   *\r\n   * @name Buttons.version\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @type {string}\r\n   *\r\n   * @static\r\n   *\r\n   */\n\n\n  Buttons.version = '1.5.1';\n  $.extend(_dtButtons, {\n    collection: {\n      text: function text(dt) {\n        return $.rup.i18nParse($.rup.i18n.base, 'rup_table.collection');\n      },\n      className: 'buttons-collection',\n      action: function action(e, dt, button, config) {\n        var host = button;\n        var collectionParent = $(button).parents('div.dt-button-collection');\n        var hostPosition = {\n          top: host.position().top + parseInt(host.css('marginTop'), 10),\n          left: host.position().left + parseInt(host.css('marginLeft'), 10)\n        };\n        var tableContainer = $(dt.table().container());\n        var multiLevel = false;\n        var insertPoint = host; // Remove any old collection\n\n        if (collectionParent.length) {\n          multiLevel = $('.dt-button-collection').position();\n          insertPoint = collectionParent;\n          $('body').trigger('click.dtb-collection');\n        }\n\n        config._collection.addClass(config.collectionLayout).css('display', 'none').insertAfter(insertPoint).fadeIn(config.fade);\n\n        var position = config._collection.css('position');\n\n        if (multiLevel && position === 'absolute') {\n          config._collection.css({\n            top: multiLevel.top,\n            left: multiLevel.left\n          });\n        } else if (position === 'absolute') {\n          config._collection.css({\n            top: hostPosition.top + host.outerHeight(),\n            left: hostPosition.left\n          }); // calculate overflow when positioned beneath\n\n\n          var tableBottom = tableContainer.offset().top + tableContainer.height();\n\n          var listBottom = hostPosition.top + host.outerHeight() + config._collection.outerHeight();\n\n          var bottomOverflow = listBottom - tableBottom; // calculate overflow when positioned above\n\n          var listTop = hostPosition.top - config._collection.outerHeight();\n\n          var tableTop = tableContainer.offset().top;\n          var topOverflow = tableTop - listTop; // if bottom overflow is larger, move to the top because it fits better\n\n          if (bottomOverflow > topOverflow) {\n            config._collection.css('top', hostPosition.top - config._collection.outerHeight() - 5);\n          }\n\n          var listRight = hostPosition.left + config._collection.outerWidth();\n\n          var tableRight = tableContainer.offset().left + tableContainer.width();\n\n          if (listRight > tableRight) {\n            config._collection.css('left', hostPosition.left - (listRight - tableRight));\n          }\n        } else {\n          // Fix position - centre on screen\n          var top = config._collection.height() / 2;\n\n          if (top > $(window).height() / 2) {\n            top = $(window).height() / 2;\n          }\n\n          config._collection.css('marginTop', top * -1);\n        }\n\n        if (config.background) {\n          // Si la tabla se encuentra en un dialogo insertamos el background dentro del dialogo\n          if ($('div.rup-dialog').has('#' + dt.context[0].sTableId + '_wrapper').length ? true : false) {\n            $('div.rup-dialog #' + dt.context[0].sTableId + '_wrapper').append('<div class=\"dt-button-background\"></div>');\n          } // Si no usamos el funcionamiento por defecto\n          else {\n            Buttons.background(true, config.backgroundClassName, config.fade);\n          }\n        } // Need to break the 'thread' for the collection button being\n        // activated by a click - it would also trigger this event\n\n\n        setTimeout(function () {\n          // This is bonkers, but if we don't have a click listener on the\n          // background element, iOS Safari will ignore the body click\n          // listener below. An empty function here is all that is\n          // required to make it work...\n          $('div.dt-button-background').on('click.dtb-collection', function () {});\n          $('body').on('click.dtb-collection', function (e) {\n            // andSelf is deprecated in jQ1.8, but we want 1.7 compat\n            var back = $.fn.addBack ? 'addBack' : 'andSelf';\n\n            if (!$(e.target).parents()[back]().filter(config._collection).length) {\n              config._collection.fadeOut(config.fade, function () {\n                config._collection.detach();\n              });\n\n              $('div.dt-button-background').off('click.dtb-collection'); // Si la tabla se encuentra en un dialogo eliminamos el background de dentro del dialogo\n\n              if ($('div.rup-dialog').has('#' + dt.context[0].sTableId + '_wrapper').length ? true : false) {\n                $('div.dt-button-background').remove();\n              } // Si no usamos el funcionamiento por defecto\n              else {\n                Buttons.background(false, config.backgroundClassName, config.fade);\n              }\n\n              $('body').off('click.dtb-collection');\n              dt.off('buttons-action.b-internal');\n            }\n          });\n        }, 10); // Como el boton se posiciona de manera absoluta hay que establecerle la posicion\n        // cada vez que se cambia el tamaño de la pantalla.\n\n        $(window).on('resize.ajustarCollection', function () {\n          if (!$('div.dt-button-collection').is(':visible')) {\n            $(window).off('resize.ajustarCollection');\n          } else {\n            hostPosition = {\n              top: host.position().top + parseInt(host.css('marginTop'), 10),\n              left: host.position().left + parseInt(host.css('marginLeft'), 10)\n            };\n\n            config._collection.css({\n              top: hostPosition.top + host.outerHeight(),\n              left: hostPosition.left\n            });\n          }\n        });\n\n        if (config.autoClose) {\n          dt.on('buttons-action.b-internal', function () {\n            $('div.dt-button-background').click();\n          });\n        }\n      },\n      background: true,\n      collectionLayout: '',\n      backgroundClassName: 'dt-button-background',\n      autoClose: false,\n      fade: 400,\n      attr: {\n        'aria-haspopup': true\n      }\n    },\n    addButton: function addButton(dt, conf) {\n      var ctx = dt.context[0];\n      var collection = _dtButtons['collection'];\n      _dtButtons = ctx.ext.buttons;\n      _dtButtons.collection = collection;\n\n      if (_dtButtons.addButton) {\n        return 'addButton';\n      }\n    },\n    editButton: function editButton(dt, conf) {\n      if (_dtButtons.editButton) {\n        return 'editButton';\n      }\n    },\n    cloneButton: function cloneButton(dt, conf) {\n      if (_dtButtons.cloneButton) {\n        return 'cloneButton';\n      }\n    },\n    deleteButton: function deleteButton(dt, conf) {\n      if (_dtButtons.deleteButton) {\n        return 'deleteButton';\n      }\n    },\n    reportsButton: function reportsButton(dt, conf) {\n      if (_dtButtons.reportsButton) {\n        return 'reportsButton';\n      }\n    },\n    pageLength: function pageLength(dt) {\n      var lengthMenu = dt.settings()[0].aLengthMenu;\n      var vals = Array.isArray(lengthMenu[0]) ? lengthMenu[0] : lengthMenu;\n      var lang = Array.isArray(lengthMenu[0]) ? lengthMenu[1] : lengthMenu;\n\n      var text = function text(dt) {\n        return dt.i18n('rup_table.pageLength', {\n          '-1': 'Show all rows',\n          _: 'Show %d rows'\n        }, dt.page.len());\n      };\n\n      return {\n        extend: 'collection',\n        text: text,\n        className: 'buttons-page-length',\n        autoClose: true,\n        buttons: $.map(vals, function (val, i) {\n          return {\n            text: lang[i],\n            className: 'button-page-length',\n            action: function action(e, dt) {\n              dt.page.len(val).draw();\n            },\n            init: function init(dt, node, conf) {\n              var that = this;\n\n              var fn = function fn() {\n                that.active(dt.page.len() === val);\n              };\n\n              dt.on('length.dt' + conf.namespace, fn);\n              fn();\n            },\n            destroy: function destroy(dt, node, conf) {\n              dt.off('length.dt' + conf.namespace);\n            }\n          };\n        }),\n        init: function init(dt, node, conf) {\n          var that = this;\n          dt.on('length.dt' + conf.namespace, function () {\n            that.text(text(dt));\n          });\n        },\n        destroy: function destroy(dt, node, conf) {\n          dt.off('length.dt' + conf.namespace);\n        }\n      };\n    }\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables API\r\n   *\r\n   * For complete documentation, please refer to the docs/api directory or the\r\n   * DataTables site\r\n   */\n  // Buttons group and individual button selector\n\n  DataTable.Api.register('buttons()', function (group, selector) {\n    // Argument shifting\n    if (selector === undefined) {\n      selector = group;\n      group = undefined;\n    }\n\n    this.selector.buttonGroup = group;\n    var res = this.iterator(true, 'table', function (ctx) {\n      if (ctx._buttons) {\n        return Buttons.buttonSelector(Buttons.instanceSelector(group, ctx._buttons), selector);\n      }\n    }, true);\n    res._groupSelector = group;\n    return res;\n  }); // Individual button selector\n\n  DataTable.Api.register('button()', function (group, selector) {\n    // just run buttons() and truncate\n    var buttons = this.buttons(group, selector);\n\n    if (buttons.length > 1) {\n      buttons.splice(1, buttons.length);\n    }\n\n    return buttons;\n  }); // Active buttons\n\n  DataTable.Api.registerPlural('buttons().active()', 'button().active()', function (flag) {\n    if (flag === undefined) {\n      return this.map(function (set) {\n        return set.inst.active(set.node);\n      });\n    }\n\n    return this.each(function (set) {\n      set.inst.active(set.node, flag);\n    });\n  }); // Get / set button action\n\n  DataTable.Api.registerPlural('buttons().action()', 'button().action()', function (action) {\n    if (action === undefined) {\n      return this.map(function (set) {\n        return set.inst.action(set.node);\n      });\n    }\n\n    return this.each(function (set) {\n      set.inst.action(set.node, action);\n    });\n  }); // Enable / disable buttons\n\n  DataTable.Api.register(['buttons().enable()', 'button().enable()'], function (flag, contextMenu) {\n    return this.each(function (set) {\n      set.inst.enable(set.node, flag, contextMenu);\n    });\n  }); // Disable buttons\n\n  DataTable.Api.register(['buttons().disable()', 'button().disable()'], function (contextMenu) {\n    return this.each(function (set) {\n      set.inst.disable(set.node, contextMenu);\n    });\n  }); // Get button nodes\n\n  DataTable.Api.registerPlural('buttons().nodes()', 'button().node()', function () {\n    var jq = $(); // jQuery will automatically reduce duplicates to a single entry\n\n    $(this.each(function (set) {\n      jq = jq.add(set.inst.node(set.node));\n    }));\n    return jq;\n  }); // Get / set button processing state\n\n  DataTable.Api.registerPlural('buttons().processing()', 'button().processing()', function (flag) {\n    if (flag === undefined) {\n      return this.map(function (set) {\n        return set.inst.processing(set.node);\n      });\n    }\n\n    return this.each(function (set) {\n      set.inst.processing(set.node, flag);\n    });\n  }); // Get / set button text (i.e. the button labels)\n\n  DataTable.Api.registerPlural('buttons().text()', 'button().text()', function (label) {\n    if (label === undefined) {\n      return this.map(function (set) {\n        return set.inst.text(set.node);\n      });\n    }\n\n    return this.each(function (set) {\n      set.inst.text(set.node, label);\n    });\n  }); // Trigger a button's action\n\n  DataTable.Api.registerPlural('buttons().trigger()', 'button().trigger()', function () {\n    return this.each(function (set) {\n      set.inst.node(set.node).trigger('click');\n    });\n  }); // Get the container elements\n\n  DataTable.Api.registerPlural('buttons().containers()', 'buttons().container()', function () {\n    var jq = $();\n    var groupSelector = this._groupSelector; // We need to use the group selector directly, since if there are no buttons\n    // the result set will be empty\n\n    this.iterator(true, 'table', function (ctx) {\n      if (ctx._buttons) {\n        var insts = Buttons.instanceSelector(groupSelector, ctx._buttons);\n\n        for (var i = 0, ien = insts.length; i < ien; i++) {\n          jq = jq.add(insts[i].container());\n        }\n      }\n    });\n    return jq;\n  }); // Add a new button\n\n  DataTable.Api.register('button().add()', function (idx, conf) {\n    var ctx = this.context;\n    var api = new DataTable.Api(ctx); // Don't use `this` as it could be empty - select the instances directly\n\n    if (ctx.length) {\n      var inst = Buttons.instanceSelector(this._groupSelector, ctx[0]._buttons);\n\n      if (inst.length) {\n        inst[0].add(conf, idx); // Nuevo botón al contextMenu\n\n        _updateContextMenu(this[0].inst.s.buttons, api, ctx[0]);\n      }\n    }\n\n    return this.button(this._groupSelector, idx);\n  }); // Destroy the button sets selected\n\n  DataTable.Api.register('buttons().destroy()', function () {\n    this.pluck('inst').each(function (inst) {\n      inst.destroy();\n    });\n    return this;\n  }); // Remove a button\n\n  DataTable.Api.registerPlural('buttons().remove()', 'buttons().remove()', function () {\n    this.each(function (set) {\n      set.inst.remove(set.node);\n    });\n    return this;\n  }); // Information box that can be used by buttons\n\n  var _infoTimer;\n\n  DataTable.Api.register('buttons.info()', function (title, message, time) {\n    var that = this;\n\n    if (title === false) {\n      $('#table_buttons_info').fadeOut(function () {\n        $(this).remove();\n      });\n      clearTimeout(_infoTimer);\n      _infoTimer = null;\n      return this;\n    }\n\n    if (_infoTimer) {\n      clearTimeout(_infoTimer);\n    }\n\n    if ($('#table_buttons_info').length) {\n      $('#table_buttons_info').remove();\n    }\n\n    title = title ? '<h2>' + title + '</h2>' : '';\n    $('<div id=\"table_buttons_info\" class=\"dt-button-info\"></div>').html(title).append($('<div></div>')[typeof message === 'string' ? 'html' : 'append'](message)).css('display', 'none').appendTo('body').fadeIn();\n\n    if (time !== undefined && time !== 0) {\n      _infoTimer = setTimeout(function () {\n        that.buttons.info(false);\n      }, time);\n    }\n\n    return this;\n  }); // Get data from the table for export - this is common to a number of plug-in\n  // buttons so it is included in the Buttons core library\n\n  DataTable.Api.register('buttons.exportData()', function (options) {\n    if (this.context.length) {\n      return _exportData(new DataTable.Api(this.context[0]), options);\n    }\n  }); // Get information about the export that is common to many of the export data\n  // types (DRY)\n\n  DataTable.Api.register('buttons.exportInfo()', function (conf) {\n    if (!conf) {\n      conf = {};\n    }\n\n    return {\n      filename: _filename(conf),\n      title: _title(conf),\n      messageTop: _message(this, conf.message || conf.messageTop, 'top'),\n      messageBottom: _message(this, conf.messageBottom, 'bottom')\n    };\n  }); // Gestiona las acciones de los botones\n\n  DataTable.Api.register('buttons.actions()', function (dt, config) {\n    var ctx = dt.settings()[0]; // Añade aquí las funciones de tus botones\n\n    switch (config.type) {\n      case 'add':\n        ctx.oInit.buttons.myLastAction = 'add';\n\n        if (ctx.oInit.formEdit !== undefined) {\n          $.when(DataTable.Api().editForm.loadSaveDialogForm(ctx, 'POST')).then(function () {\n            var idTableDetail = ctx.oInit.formEdit.detailForm; // Limpiamos el formulario\n\n            if ($(idTableDetail).find('form')[0] !== undefined) {\n              $(idTableDetail).find('form')[0].reset();\n              jQuery.each($('select.rup_combo', $(idTableDetail)), function (index, elem) {\n                jQuery(elem).rup_combo('refresh');\n              });\n\n              if (ctx.multiselection.numSelected > 0) {\n                $.rup_messages('msgConfirm', {\n                  message: $.rup.i18nParse($.rup.i18n.base, 'rup_table.checkSelectedElems'),\n                  title: $.rup.i18nParse($.rup.i18n.base, 'rup_table.changes'),\n                  OKFunction: function OKFunction() {\n                    // Abrimos el formulario\n                    if (ctx.oInit.seeker !== undefined && ctx.oInit.seeker.activate) {\n                      DataTable.Api().seeker.limpiarSeeker(dt, ctx); // Y deselecionamos los checks y seekers\n                    } else {\n                      if (ctx.oInit.multiSelect !== undefined) {\n                        DataTable.Api().multiSelect.deselectAll(dt); // Y deselecionamos los checks y seekers\n                      } else if (ctx.oInit.select !== undefined) {\n                        DataTable.Api().select.deselect(ctx); // Y deselecionamos los checks y seekers\n                      }\n                    }\n\n                    DataTable.Api().editForm.openSaveDialog('POST', dt, null, ctx.oInit.formEdit.customTitle);\n                  }\n                });\n              } else {\n                DataTable.Api().editForm.openSaveDialog('POST', dt, null, ctx.oInit.formEdit.customTitle);\n              }\n            } else {\n              $.rup_messages('msgError', {\n                title: 'Error grave',\n                message: '<p>Falta definir \"detailForm\" en la inicialización de la tabla.</p>'\n              });\n            }\n          });\n        } else {\n          //edicion en linea\n          ctx.oInit.inlineEdit.currentPos = undefined;\n          DataTable.Api().inlineEdit.add(dt, ctx);\n        }\n\n        break;\n\n      case 'edit':\n        // Abrimos el formulario\n        ctx.oInit.buttons.myLastAction = 'edit';\n\n        if (ctx.oInit.formEdit !== undefined) {\n          // Se busca el idRow con el último seleccionado. En caso de no existir, será el primero.\n          $.when(DataTable.Api().editForm.getRowSelected(dt, 'PUT')).then(function (rowInfo) {\n            if (ctx.oInit.formEdit.$navigationBar === undefined || ctx.oInit.formEdit.$navigationBar.funcionParams === undefined || ctx.oInit.formEdit.$navigationBar.funcionParams[4] === undefined || dt.page() + 1 === Number(ctx.oInit.formEdit.$navigationBar.funcionParams[4])) {\n              DataTable.Api().editForm.openSaveDialog('PUT', dt, rowInfo.line, ctx.oInit.formEdit.customTitle);\n            }\n          });\n        } else {\n          //edicion en linea\n          ctx.oInit.inlineEdit.currentPos = undefined;\n          ctx.oInit.inlineEdit.alta = undefined;\n          var idRowInline = DataTable.Api().inlineEdit.getRowSelected(dt, 'PUT').line;\n        }\n\n        break;\n\n      case 'clone':\n        ctx.oInit.buttons.myLastAction = 'clone'; // Abrimos el formulario\n\n        if (ctx.oInit.formEdit !== undefined) {\n          // Se busca el idRow con el último seleccionado. En caso de no existir, será el primero.\n          $.when(DataTable.Api().editForm.getRowSelected(dt, 'CLONE')).then(function (rowInfo) {\n            DataTable.Api().editForm.openSaveDialog('CLONE', dt, rowInfo.line, ctx.oInit.formEdit.customTitle);\n          });\n        } else {\n          //edicion en linea\n          ctx.oInit.inlineEdit.alta = true;\n          ctx.oInit.inlineEdit.currentPos = undefined;\n          var idRowInline = DataTable.Api().inlineEdit.getRowSelected(dt, 'CLONE').line;\n        }\n\n        break;\n\n      case 'delete':\n        var customEliminar = ctx.oInit.validarEliminar;\n\n        if (typeof customEliminar === \"function\" && customEliminar(ctx)) {\n          return false;\n        }\n\n        ctx.oInit.buttons.myLastAction = 'delete'; // borramos todos los seleccionados.\n\n        if (!ctx.oInit.noEdit && ctx.oInit.formEdit !== undefined) {\n          DataTable.Api().editForm.deleteAllSelects(dt);\n        } else if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined) {\n          //edicion en linea\n          DataTable.Api().inlineEdit.deleteAllSelects(dt);\n        } else {\n          //Delete sin formulario\n          _deleteAllSelects(dt);\n        }\n\n        break;\n    }\n  }); // Detecta el numero de filas seleccionadas y en funcion de eso muestra u oculta los botones.\n\n  DataTable.Api.register('buttons.displayRegex()', function (ctx) {\n    if (ctx._buttons[0].inst.s.disableAllButtons === undefined) {\n      var opts = ctx._buttons[0].inst.s.buttons;\n      var collectionObject;\n      $.each(opts, function (i) {\n        collectionObject = null;\n        var numOfSelectedRows = ctx.multiselection.numSelected;\n\n        if (ctx.oInit.masterDetail !== undefined && this.conf.id === ctx.sTableId + 'addButton_1') {\n          //si es maestro detalle para el boton add ,solo se renderiza cuando hay selección en el padre.\n          var table = $(ctx.oInit.masterDetail.master).DataTable();\n          numOfSelectedRows = table.context[0].multiselection.numSelected; //Nums del padre\n\n          this.conf.displayRegex = /^[1-9][0-9]*$/; //se cambia expresion regular\n        }\n\n        _manageButtonsAndButtonsContextMenu(opts[i], numOfSelectedRows, collectionObject, ctx); // Comprueba si tiene botones hijos\n\n\n        if (this.buttons.length > 0) {\n          collectionObject = this;\n\n          _manageButtonsAndButtonsContextMenu(opts[i], numOfSelectedRows, collectionObject, ctx);\n        }\n      });\n    }\n  });\n  DataTable.Api.register('buttons.disableAllButtons()', function (ctx, exception) {\n    var s = ctx._buttons[0].inst.s;\n    $.each(s.buttons, function () {\n      if (ctx.oInit.noEdit && exception !== undefined && !exception.includes(this.node.id)) {\n        // Deshabilita permanentemente el botón (tanto de la toolbar como del contextMenu).\n        this.conf.displayRegex = undefined;\n      } else if (exception === undefined || !exception.includes(this.node.id)) {\n        // Deshabilita el botón de la toolbar.\n        $(this.node).prop('disabled', true); // Deshabilita el botón del contextMenu.\n\n        $('#' + this.node.id + '_contextMenuToolbar').addClass('disabledButtonsTable');\n      }\n    });\n    s.disableAllButtons = true;\n  });\n  DataTable.Api.register('buttons.initButtons()', function (ctx, opts) {\n    _initButtons(ctx, opts);\n  });\n  DataTable.Api.register('buttons.deleteNotForm()', function (dt) {\n    _deleteAllSelects(dt);\n  });\n  /**\r\n   * Get the file name for an exported file.\r\n   *\r\n   * @name _filename\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object}\tconfig Button configuration\r\n   * @param {boolean} incExtension Include the file name extension\r\n   *\r\n   */\n\n  var _filename = function _filename(config) {\n    // Backwards compatibility\n    var filename = config.filename === '*' && config.title !== '*' && config.title !== undefined && config.title !== null && config.title !== '' ? config.title : config.filename;\n\n    if (typeof filename === 'function') {\n      filename = filename();\n    }\n\n    if (filename === undefined || filename === null) {\n      return null;\n    }\n\n    if (filename.indexOf('*') !== -1) {\n      filename = filename.replace('*', $('head > title').text()).trim();\n    } // Strip characters which the OS will object to\n\n\n    filename = filename.replace(/[^a-zA-Z0-9_\\u00A1-\\uFFFF\\.,\\-_ !\\(\\)]/g, '');\n\n    var extension = _stringOrFunction(config.extension);\n\n    if (!extension) {\n      extension = '';\n    }\n\n    return filename + extension;\n  };\n  /**\r\n   * Simply utility method to allow parameters to be given as a function\r\n   *\r\n   * @name _stringOrFunction\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {undefined|string|function} option Option\r\n   *\r\n   * @return {null|string} Resolved value\r\n   *\r\n   */\n\n\n  var _stringOrFunction = function _stringOrFunction(option) {\n    if (option === null || option === undefined) {\n      return null;\n    } else if (typeof option === 'function') {\n      return option();\n    }\n\n    return option;\n  };\n  /**\r\n   * Get the title for an exported file.\r\n   *\r\n   * @name _title\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} config\tButton configuration\r\n   *\r\n   */\n\n\n  var _title = function _title(config) {\n    var title = _stringOrFunction(config.title);\n\n    return title === null ? null : title.indexOf('*') !== -1 ? title.replace('*', $('head > title').text() || 'Exported data') : title;\n  };\n\n  var _message = function _message(dt, option, position) {\n    var message = _stringOrFunction(option);\n\n    if (message === null) {\n      return null;\n    }\n\n    var caption = $('caption', dt.table().container()).eq(0);\n\n    if (message === '*') {\n      var side = caption.css('caption-side');\n\n      if (side !== position) {\n        return null;\n      }\n\n      return caption.length ? caption.text() : '';\n    }\n\n    return message;\n  };\n\n  var _exportTextarea = $('<textarea></textarea>')[0];\n\n  var _exportData = function _exportData(dt, inOpts) {\n    var config = $.extend(true, {}, {\n      rows: null,\n      columns: '',\n      modifier: {\n        search: 'applied',\n        order: 'applied'\n      },\n      orthogonal: 'display',\n      stripHtml: true,\n      stripNewlines: true,\n      decodeEntities: true,\n      trim: true,\n      format: {\n        header: function header(d) {\n          return strip(d);\n        },\n        footer: function footer(d) {\n          return strip(d);\n        },\n        body: function body(d) {\n          return strip(d);\n        }\n      }\n    }, inOpts);\n\n    var strip = function strip(str) {\n      if (typeof str !== 'string') {\n        return str;\n      } // Always remove script tags\n\n\n      str = str.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n\n      if (config.stripHtml) {\n        str = str.replace(/<[^>]*>/g, '');\n      }\n\n      if (config.trim) {\n        str = str.replace(/^\\s+|\\s+$/g, '');\n      }\n\n      if (config.stripNewlines) {\n        str = str.replace(/\\n/g, ' ');\n      }\n\n      if (config.decodeEntities) {\n        _exportTextarea.innerHTML = str;\n        str = _exportTextarea.value;\n      }\n\n      return str;\n    };\n\n    var header = dt.columns(config.columns).indexes().map(function (idx) {\n      var el = dt.column(idx).header();\n      return config.format.header(el.innerHTML, idx, el);\n    }).toArray();\n    var footer = dt.table().footer() ? dt.columns(config.columns).indexes().map(function (idx) {\n      var el = dt.column(idx).footer();\n      return config.format.footer(el ? el.innerHTML : '', idx, el);\n    }).toArray() : null; // If Select is available on this table, and any rows are selected, limit the export\n    // to the selected rows. If no rows are selected, all rows will be exported. Specify\n    // a `selected` modifier to control directly.\n\n    var modifier = $.extend({}, config.modifier);\n\n    if (dt.select && typeof dt.select.info === 'function' && modifier.selected === undefined) {\n      if (dt.rows(config.rows, $.extend({\n        selected: true\n      }, modifier)).any()) {\n        $.extend(modifier, {\n          selected: true\n        });\n      }\n    }\n\n    var rowIndexes = dt.rows(config.rows, modifier).indexes().toArray();\n    var selectedCells = dt.cells(rowIndexes, config.columns);\n    var cells = selectedCells.render(config.orthogonal).toArray();\n    var cellNodes = selectedCells.nodes().toArray();\n    var columns = header.length;\n    var rows = columns > 0 ? cells.length / columns : 0;\n    var body = [rows];\n    var cellCounter = 0;\n\n    for (var i = 0, ien = rows; i < ien; i++) {\n      var row = [columns];\n\n      for (var j = 0; j < columns; j++) {\n        row[j] = config.format.body(cells[cellCounter], i, j, cellNodes[cellCounter]);\n        cellCounter++;\n      }\n\n      body[i] = row;\n    }\n\n    return {\n      header: header,\n      footer: footer,\n      body: body\n    };\n  };\n  /**\r\n   * Activa la coleccion\r\n   *\r\n   * @name _enableCollection\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {string} id\tId of the button\r\n   *\r\n   */\n\n\n  var _enableCollection = function _enableCollection(id) {\n    $('#' + id).prop('disabled', false);\n  };\n  /**\r\n   * Desactiva la coleccion\r\n   *\r\n   * @name _disableCollection\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {string} id\tId of the button\r\n   *\r\n   */\n\n\n  var _disableCollection = function _disableCollection(id) {\n    $('#' + id).prop('disabled', true);\n  };\n  /**\r\n   * Activa el boton y su opcion dentro del context menu\r\n   *\r\n   * @name _enableButtonAndContextMenuOption\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {string} id\tId of the button\r\n   *\r\n   */\n\n\n  var _enableButtonAndContextMenuOption = function _enableButtonAndContextMenuOption(id) {\n    $('#' + id).prop('disabled', false);\n    $('#' + id + '_contextMenuToolbar').removeClass('disabledButtonsTable');\n  };\n  /**\r\n   * Desactiva el boton y su opcion dentro del context menu\r\n   *\r\n   * @name _disableButtonAndContextMenuOption\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {string} id\tId of the button\r\n   *\r\n   */\n\n\n  var _disableButtonAndContextMenuOption = function _disableButtonAndContextMenuOption(id) {\n    $('#' + id).prop('disabled', true);\n    $('#' + id + '_contextMenuToolbar').addClass('disabledButtonsTable');\n  };\n  /**\r\n   * Gestiona la propiedad de activado/desactivado de los botones y de sus opciones\r\n   * dentro del context menu.\r\n   *\r\n   * @name _manageButtonsAndButtonsContextMenu\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} opts\tButtons properties\r\n   * @param {int} numOfSelectedRows\tNumber of selected rows\r\n   * @param {null|object} collectionObject\tCollection button properties\r\n   *\r\n   */\n\n\n  var _manageButtonsAndButtonsContextMenu = function _manageButtonsAndButtonsContextMenu(opts, numOfSelectedRows, collectionObject, ctx) {\n    if (opts.conf.custom === undefined || !opts.conf.custom) {\n      // Si pertenece a un collection o es un collection\n      if (opts.collection !== null && collectionObject) {\n        var collectionId = collectionObject.conf.id;\n        var collectionDisplayRegex = collectionObject.conf.displayRegex;\n        var alreadyExecuted = false; // Recorre todos los botones dentro del collection\n\n        $.each(collectionObject.buttons, function (key, value) {\n          // Activa/desactiva en funcion de la propiedad 'displayRegex' del padre y los hijos\n          if (collectionDisplayRegex !== undefined && value.conf.displayRegex !== undefined) {\n            if (collectionDisplayRegex.test(numOfSelectedRows) && value.conf.displayRegex.test(numOfSelectedRows)) {\n              _enableButtonAndContextMenuOption(value.conf.id);\n            } else {\n              _disableButtonAndContextMenuOption(value.conf.id);\n            }\n          } // Activa/desactiva en funcion de la propiedad 'displayRegex' de sus hijos\n          else if (collectionDisplayRegex === undefined && value.conf.displayRegex !== undefined) {\n            // Habilita la coleccion si cumple el regex (solo se ejecuta una vez como\n            // maximo gracias al booleano 'alreadyExecuted')\n            if (value.conf.displayRegex.test(numOfSelectedRows) && !alreadyExecuted) {\n              _enableCollection(collectionId);\n\n              alreadyExecuted = true;\n            } // Habilita el boton si cumple el displayRegex\n\n\n            if (value.conf.displayRegex.test(numOfSelectedRows)) {\n              _enableButtonAndContextMenuOption(value.conf.id);\n            } // Como este boton no cumple el 'displayRegex' para ser habilitado, se deshabilitan\n            // tanto el boton como su opcion en el contextMenu\n            else {\n              _disableButtonAndContextMenuOption(value.conf.id);\n            } // En caso de que ningun regex cumpliese, se fuerza la deshabilitacion\n\n\n            if (!alreadyExecuted) {\n              _disableCollection(collectionId);\n            }\n          } // Desactiva todo si ni el collection ni los hijos tienen la propiedad 'displayRegex'\n          // o simplemente si los hijos no tienen la propiedad\n          else {\n            _disableButtonAndContextMenuOption(value.conf.id);\n\n            if (!alreadyExecuted) {\n              _disableCollection(collectionId);\n\n              alreadyExecuted = true;\n            }\n          }\n        }); // Genera un evento encargado de ocultar los botones dentro del collection.\n        // Se comprueba mediante una clase si ya tiene o no el evento, mejorando asi\n        // el rendimiento\n\n        $('#' + collectionId + ':not(.listening)').addClass('listening').on('click', function (e) {\n          // Se establece el valor de 'numOfSelectedRows' porque sino siempre tendria\n          // el valor recibido cuando se creo el evento\n          var numOfSelectedRows = ctx.multiselection.numSelected;\n          $.each(collectionObject.buttons, function (key, value) {\n            // Habilita el boton dentro del collection\n            if (value.conf.displayRegex.test(numOfSelectedRows)) {\n              _enableButtonAndContextMenuOption(value.conf.id);\n            } // Deshabilita el boton dentro del collection\n            else {\n              _disableButtonAndContextMenuOption(value.conf.id);\n            }\n          });\n        });\n      } // Si el boton no tiene un regex definido, permanecera siempre desactivado\n      else if (opts.conf.displayRegex === undefined) {\n        // Deshabilita el boton y su opcion dentro del context menu\n        _disableButtonAndContextMenuOption(opts.conf.id);\n      } // Si tiene un regex definido, lo activa y desactiva en funcion de este\n      else if (opts.conf.displayRegex !== undefined) {\n        // Si el regex recibido de cada boton cumple la sentencia al probarlo contra\n        // el numero de filas seleccionadas, se mostrara, en caso contrario, permanecera\n        // oculto\n        if (opts.conf.displayRegex.test(numOfSelectedRows)) {\n          // Habilita el boton y su opcion dentro del context menu\n          _enableButtonAndContextMenuOption(opts.conf.id);\n        } else {\n          // Deshabilita el boton y su opcion dentro del context menu\n          _disableButtonAndContextMenuOption(opts.conf.id);\n        }\n      }\n    }\n  };\n  /**\r\n   * Establece el tipo de llamada necesario para obtener los datos según lo seleccionado\r\n   * e inicia la gestión para finalmente obtenerlos\r\n   *\r\n   * @name _reports\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt Instancia del table\r\n   * @param {object} that Objeto del boton\r\n   * @param {object} config Configuracion del boton\r\n   *\r\n   */\n\n\n  var _reports = function _reports(dt, that, config) {\n    var ctx = dt.settings()[0];\n    var info = dt.buttons.exportInfo(config);\n    var type;\n    var multiselection = ctx.multiselection;\n    var selectedAll = multiselection.selectedAll;\n    var deselectedIds = multiselection.deselectedIds;\n\n    if (selectedAll) {\n      if (deselectedIds.length > 0) {\n        // Este caso es para cuando se selecciona todo y despues se\n        // deseleccionan algunos registros\n        type = 'all-deselected';\n      } else {\n        // Este caso es para cuando se seleccionan todos los registros\n        type = 'all';\n      }\n    } else if (multiselection.selectedIds.length > 0) {\n      // Este caso para cuando hay determinados registros seleccionados manualmente\n      type = 'selected';\n    } else {\n      // Este caso para cuando no hay registros seleccionados\n      type = 'all';\n      selectedAll = true;\n    }\n\n    $.when(_reportsTypeOfCopy(dt, type, config.request, multiselection, selectedAll, deselectedIds)).then(function (exportData, ajaxOptions) {\n      // Si exportData cumple la siguiente condicion significa que los datos se van a copiar al portapapeles\n      if (exportData !== undefined) {\n        var exportDataRows = exportData.length;\n        var exportDataParsed = JSON.stringify(exportData);\n        var hiddenDiv = $('<div></div>').css({\n          height: 1,\n          width: 1,\n          overflow: 'hidden',\n          position: 'fixed',\n          top: 0,\n          left: 0\n        });\n\n        if (typeof ajaxOptions.data == 'string') {\n          ajaxOptions.data = JSON.parse(ajaxOptions.data);\n        }\n\n        exportDataParsed = _convertToTabulador(ajaxOptions.reportsExportAllColumns, ajaxOptions.data.columns, exportDataParsed, true);\n        var textarea = $('<textarea readonly></textarea>').val(exportDataParsed).appendTo(hiddenDiv);\n\n        _reportsOpenMessage(dt, ctx, that, exportDataRows, hiddenDiv, textarea);\n      } else {\n        // Descargara un fichero\n        _reportsRequestFile(ctx, ajaxOptions);\n      }\n    });\n  };\n  /**\r\n   * Se encarga de mapear los datos de json a datos separados por el tabulador.\r\n   *\r\n   * @name ConvertToTabulador\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {boolean} reportsExportAllColumns true en caso de querer mostrar todas las columnas (incluidas las ocultas)\r\n   * @param {object} columns Objeto que contiene las columnas a mostrar\r\n   * @param {object} objArray Objeto que contiene los datos a exportar\r\n   * @param {boolean} true en caso de querer que se mueste la cabecera\r\n   *\r\n   * @return {object}\r\n   *\r\n   */\n\n\n  var _convertToTabulador = function _convertToTabulador(reportsExportAllColumns, columns, objArray, showLabel) {\n    var array = _typeof(objArray) !== 'object' ? JSON.parse(objArray) : objArray;\n    var separator = \";\";\n    var str = '';\n    var checkColumns = false; // Separador de campos dependiendo del idioma\n\n    if ($.rup.lang === 'en') {\n      separator = \",\";\n    }\n\n    if (!reportsExportAllColumns && columns != undefined) {\n      checkColumns = true;\n    }\n\n    if (showLabel) {\n      // Comprueba si solo se quieren mostrar las columnas definidas/visibles o todas\n      if (checkColumns) {\n        str = '\\\"' + columns.toString().replace(/,/g, '\\\"' + separator + '\\\"') + '\\\"\\r\\n';\n      } else {\n        var row = ''; // Se asignan los nombres de las columnas\n\n        $.each(array[0], function (key, value) {\n          // Comprobar si es un objeto, en caso afirmativo lo recorremos y lo concatenamos\n          if ($.isPlainObject(value)) {\n            var objectName = key;\n            $.each(this, function (key, value) {\n              var keyToCamelKeys = key.substring(0, 1).toLocaleUpperCase() + key.substring(1);\n              row += '\\\"' + objectName + keyToCamelKeys + '\\\"' + separator;\n            });\n          } else {\n            row += '\\\"' + key + '\\\"' + separator;\n          }\n        });\n        row = row.slice(0, -1);\n        str += row + '\\r\\n';\n      }\n    } // Se asignan los valores\n\n\n    $.each(array, function () {\n      var line = '';\n      $.each(this, function (key, value) {\n        // Comprueba si solo se quieren mostrar los valores de las columnas definidas/visibles y evita la insercion de las no que no lo estan\n        if (checkColumns && columns.indexOf(key) == -1) {\n          return;\n        } // Comprobar si es un objeto, en caso afirmativo lo recorremos y lo concatenamos\n\n\n        if ($.isPlainObject(value)) {\n          $.each(this, function (key, value) {\n            line += '\\\"' + value + '\\\"' + separator;\n          });\n        } else {\n          line += '\\\"' + value + '\\\"' + separator;\n        }\n      });\n      line = line.slice(0, -1);\n      str += line + '\\r\\n';\n    });\n    return str;\n  };\n  /**\r\n   * Según el tipo de función de copia solicitada, realiza unas u otras comprobaciones\r\n   * antes de solicitar los datos al servidor\r\n   *\r\n   * @name _reportsTypeOfCopy\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt Instancia del table\r\n   * @param {string} type Tipo de funcion de copia a ejecutar\r\n   * @param {object} request Contiene todos los parametros de la petición AJAX\r\n   * @param {object} multiselection Propiedades de la multiseleccion\r\n   * @param {boolean} selectedAll Cuando es true significa que todas las filas estan marcadas\r\n   * @param {array} [deselectedIds] ID's de las filas deseleccionadas\r\n   *\r\n   * @return {object}\r\n   *\r\n   */\n\n\n  var _reportsTypeOfCopy = function _reportsTypeOfCopy(dt, type, request, multiselection, selectedAll, deselectedIds) {\n    var ctx = dt.settings()[0];\n    var deferred = $.Deferred();\n    var exportData;\n    var selectedIds = multiselection.selectedIds;\n    var selectedRows = multiselection.selectedRowsPerPage;\n    var ajaxOptions = {};\n\n    if (type === 'selected') {\n      var _exportData2 = [];\n\n      if (request.dataType === 'json') {\n        var localAccess = true; // Comprueba si todos los valores seleccionados estan en la misma pagina\n\n        $.each(selectedRows, function (key, value) {\n          if (ctx.json.page != value.page) {\n            localAccess = false;\n            return false;\n          }\n        });\n\n        if (localAccess) {\n          // Puede acceder a los valores seleccionados localmente\n          $.each(selectedRows, function (key, value) {\n            var idPadre = value.id;\n            $.each(ctx.json.rows, function (key, value) {\n              if (DataTable.Api().rupTable.getIdPk(value) === idPadre) {\n                _exportData2.push(value);\n              }\n            });\n          });\n          ajaxOptions.data = {};\n          ajaxOptions.data.columns = _loadDefinedColums(dt, ctx, request);\n\n          if (ctx.oInit.buttons.report !== undefined) {\n            ajaxOptions.data.columnsName = ctx.oInit.buttons.report.columnsName;\n          }\n\n          ajaxOptions.reportsExportAllColumns = request.reportsExportAllColumns;\n          deferred.resolve(_exportData2, ajaxOptions);\n          return deferred.promise();\n        }\n      }\n    }\n\n    if (request.dataType === 'json') {\n      // Accede a los datos mediante el servidor ya que se ha hecho uso de la paginacion\n      // Parametros necesarios para configurar la llamada AJAX\n      ajaxOptions = _reportsPrepareRequestData(dt, ajaxOptions, request, ctx, selectedAll, deselectedIds, selectedIds);\n      $.when(_reportsRequestData(ajaxOptions, ctx)).then(function (data) {\n        exportData = data;\n        deferred.resolve(exportData, ajaxOptions);\n      });\n    } else {\n      // Parametros necesarios para configurar la llamada AJAX\n      ajaxOptions = _reportsPrepareRequestData(dt, ajaxOptions, request, ctx, selectedAll, deselectedIds, selectedIds);\n      deferred.resolve(undefined, ajaxOptions);\n    }\n\n    return deferred.promise();\n  };\n  /**\r\n   * Se encarga de generar las opciones de configuración con las que se llamara a la API\r\n   *\r\n   * @name _reportsPrepareRequestData\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt Instancia del table\r\n   * @param {object} ajaxOptions Parametros de la llamada AJAX\r\n   * @param {object} request Contiene todos los parametros de la petición ajax\r\n   * @param {object} ctx Contexto\r\n   * @param {boolean} selectedAll Cuando es true significa que todas las filas estan marcadas\r\n   * @param {array} [deselectedIds] ID's de las filas deseleccionadas\r\n   * @param {array} [selectedIds] ID's de las filas seleccionadas\r\n   *\r\n   * @return {object}\r\n   *\r\n   */\n\n\n  var _reportsPrepareRequestData = function _reportsPrepareRequestData(dt, ajaxOptions, request, ctx, selectedAll, deselectedIds, selectedIds) {\n    var data = {};\n    data.columns = _loadDefinedColums(dt, ctx, request);\n\n    if (ctx.oInit.buttons.report !== undefined) {\n      data.columnsName = ctx.oInit.buttons.report.columnsName;\n    }\n\n    data.core = {\n      'pkToken': ctx.oInit.multiplePkToken,\n      'pkNames': ctx.oInit.primaryKey\n    }; // Solo se enviara el filtro si contiene algun valor. \n    // Esto facilita la labor de exportacion al servidor ya que no tiene que iterar el filtro para comprobar si todos los campos son nulos.\n\n    if (ctx.oInit.filter.$filterContainer != undefined && !jQuery.isEmptyObject(window.form2object(ctx.oInit.filter.$filterContainer[0]))) {\n      data.filter = window.form2object(ctx.oInit.filter.$filterContainer[0]);\n    }\n\n    data.multiselection = {};\n    data.multiselection.selectedAll = selectedAll;\n\n    if (data.multiselection.selectedAll) {\n      data.multiselection.selectedIds = deselectedIds;\n    } else {\n      data.multiselection.selectedIds = selectedIds;\n    }\n\n    data.reportsParams = []; // Se añaden los parametros definidos por el usuario (solo en caso de haber definido alguno)\n\n    if (ctx.oInit.buttons.report !== undefined && ctx.oInit.buttons.report.reportsParams !== undefined && ctx.oInit.buttons.report.reportsParams.length > 0) {\n      data.reportsParams = ctx.oInit.buttons.report.reportsParams;\n    } // Completa el objeto 'ajaxOptions' con los parametros necesarios para la llamada que se realizara al servidor\n\n\n    ajaxOptions.contentType = request.contentType;\n    ajaxOptions.dataType = request.dataType;\n\n    if (request.url !== undefined) {\n      ajaxOptions.url = ctx.oInit.urlBase + request.url;\n    } else {\n      ajaxOptions.url = ctx.oInit.urlBase;\n    }\n\n    ajaxOptions.reportsExportAllColumns = request.reportsExportAllColumns;\n    ajaxOptions.type = request.method;\n\n    if (request.fileName !== undefined) {\n      data.fileName = request.fileName;\n    }\n\n    if (request.sheetTitle !== undefined) {\n      data.sheetTitle = request.sheetTitle;\n    }\n\n    ajaxOptions.data = $.toJSON(data);\n    return ajaxOptions;\n  };\n  /**\r\n   * Se encarga de devolver las columnas\r\n   *\r\n   * @name _loadDefinedColums\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt Instancia del table\r\n   * @param {object} ctx Contexto\r\n   * @param {object} request Contiene todos los parametros de la petición AJAX\r\n   *\r\n   * @return {object}\r\n   *\r\n   */\n\n\n  var _loadDefinedColums = function _loadDefinedColums(dt, ctx, request) {\n    var columns = [];\n\n    if (request.reportsExportAllColumns == undefined) {\n      request.reportsExportAllColumns = ctx.ext.buttons.reportsButton.reportsExportAllColumns;\n    }\n\n    if (!request.reportsExportAllColumns) {\n      // Se obtienen las columnas a mostrar definidas por el usuario\n      if (ctx.oInit.buttons.report !== undefined && ctx.oInit.buttons.report.columns !== undefined) {\n        columns = ctx.oInit.buttons.report.columns;\n      } else {\n        // En caso contrario se obtienen las columnas de la tabla\n        $.each(ctx.oInit.columns, function (position, name) {\n          // Se comprueba que el name.data no este vacio para evitar añadir\n          // la columna del checkbox de multiseleccion. Tambien se comprueba\n          // que la columna sea visible\n          if (name.data !== \"\" && dt.column(position).visible()) {\n            columns.push(name.data);\n          }\n        });\n      }\n    }\n\n    return columns;\n  };\n  /**\r\n   * Se encarga de llamar a la API y de devolver los datos recibidos\r\n   *\r\n   * @name _reportsRequestData\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ajaxOptions Parametros de la llamada AJAX\r\n   * @param {object} ctx Contexto\r\n   *\r\n   * @return {object}\r\n   *\r\n   */\n\n\n  var _reportsRequestData = function _reportsRequestData(ajaxOptions, ctx) {\n    var deferred = $.Deferred();\n    $.ajax(ajaxOptions).done(function (data) {\n      deferred.resolve(data);\n      $('#' + ctx.sTableId).triggerHandler('tableButtonsSuccessReportsRequestData');\n    }).complete(function () {\n      $('#' + ctx.sTableId).triggerHandler('tableButtonsCompleteReportsRequestData');\n    }).error(function () {\n      $('#' + ctx.sTableId).triggerHandler('tableButtonsErrorReportsRequestData');\n    });\n    return deferred.promise();\n  };\n  /**\r\n   * Se encarga de llamar a la API y de devolver el fichero recibido\r\n   *\r\n   * @name _reportsRequestFile\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx Contexto\r\n   * @param {object} ajaxOptions Parametros de la llamada AJAX\r\n   *\r\n   * @return {object}\r\n   *\r\n   */\n\n\n  var _reportsRequestFile = function _reportsRequestFile(ctx, ajaxOptions) {\n    // Dialogo de espera\n    var $reportFileWait = $('#' + ctx.sTableId + 'reportFileWait');\n    $reportFileWait.rup_dialog({\n      type: $.rup.dialog.TEXT,\n      autoOpen: false,\n      modal: true,\n      resizable: false\n    }); // Titulo\n\n    var title = $.rup.i18nParse($.rup.i18n.base, 'rup_report.waitTitle');\n    var message = $.rup.i18nParse($.rup.i18n.base, 'rup_report.waitMsg');\n\n    if (ctx.oInit.buttons.report !== undefined) {\n      if (ctx.oInit.buttons.report.title !== undefined) {\n        title = ctx.oInit.buttons.report.title;\n      }\n\n      if (ctx.oInit.buttons.report.message !== undefined) {\n        message = ctx.oInit.buttons.report.message;\n      }\n    }\n\n    $reportFileWait.rup_dialog('setOption', 'title', title); // Contenido\n\n    var content = $reportFileWait.html().split($reportFileWait.text()),\n        html = '';\n\n    for (var i = 0; i < content.length; i++) {\n      if (content[i] === '') {\n        html += message;\n      } else {\n        html += content[i];\n      }\n    }\n\n    $reportFileWait.html(html);\n    $reportFileWait.rup_dialog('open');\n    var url = ajaxOptions.url; // Lanzar peticion \n\n    var request = new XMLHttpRequest();\n    request.open(ajaxOptions.type, url, true);\n    request.responseType = 'blob';\n    request.send(ajaxOptions.data);\n\n    request.onload = function (event) {\n      if (this.status == 200) {\n        var blob = request.response;\n        var fileName = null;\n        var contentType = request.getResponseHeader('content-type');\n        var element; // Parece que IE y EDGE no devuelven la misma cabecera en la respuesta\n\n        if (request.getResponseHeader('content-disposition')) {\n          var contentDisposition = request.getResponseHeader('content-disposition');\n          fileName = contentDisposition.substring(contentDisposition.indexOf('=') + 1);\n        } else {\n          fileName = 'report.' + contentType.substring(contentType.indexOf('/') + 1);\n        }\n\n        if (window.navigator.msSaveOrOpenBlob) {\n          // IE y EDGE\n          window.navigator.msSaveOrOpenBlob(blob, fileName);\n        } else {\n          // Para los demas navegadores\n          if (!$('a#rupTableButtonsReportsExport').length) {\n            $('#' + ctx.sTableId + 'rup_report_dialogsContainer').append(\"<a id='rupTableButtonsReportsExport' class='d-none'>rupTableButtonsReportsExport</a>\");\n          }\n\n          element = $('a#rupTableButtonsReportsExport')[0];\n          element.href = window.URL.createObjectURL(blob);\n          element.download = fileName;\n          element.click(); // Eliminamos el ObjectURL y el elemento de DOM generado ya que han sido generados de manera temporal\n\n          window.URL.revokeObjectURL(element.href);\n          element.remove();\n        }\n\n        if ($('#' + $reportFileWait.attr('id')).length > 0) {\n          $reportFileWait.rup_dialog('close');\n        }\n      } else {\n        if ($('#' + $reportFileWait.attr('id')).length > 0) {\n          $reportFileWait.rup_dialog('close');\n          console.info('----------- ERROR -----------');\n        }\n      }\n    };\n\n    request.send();\n    return false;\n  };\n  /**\r\n   * Gestiona la apertura/cierre del mensaje de confirmación de copia\r\n   *\r\n   * @name _reportsOpenMessage\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt Instancia del table\r\n   * @param {object} ctx Contexto\r\n   * @param {object} that Objeto del boton\r\n   * @param {int} exportDataRows Numero de filas a ser exportadas\r\n   * @param {object} hiddenDiv Elemento del DOM\r\n   * @param {object} textarea Elemento del DOM\r\n   *\r\n   */\n\n\n  var _reportsOpenMessage = function _reportsOpenMessage(dt, ctx, that, exportDataRows, hiddenDiv, textarea) {\n    $.rup_messages('msgConfirm', {\n      title: dt.i18n('rup_table.copyButton.changes', 'Copia de registros en clipboard'),\n      message: dt.i18n('rup_table.copyButton.saveAndContinue', {\n        _: '¿Desea copiar %d registros?',\n        1: '¿Desea copiar un registro?'\n      }, exportDataRows),\n      open: function open() {\n        $('#' + dt.context[0].sTableId).trigger('rupTable_confirmMsgOpen');\n      },\n      OKFunction: function OKFunction() {\n        if (ctx.oInit.formEdit !== undefined) {\n          ctx.oInit.formEdit.okCallBack = true;\n        }\n\n        _reportsToClipboard(dt, that, exportDataRows, hiddenDiv, textarea);\n\n        if (ctx.oInit.formEdit !== undefined && !ctx.oInit.formEdit.detailForm.hasClass('d-none')) {\n          //si esta oculto, no hace falta\n          ctx.oInit.formEdit.detailForm.rup_dialog('close');\n        }\n      },\n      beforeClose: function beforeClose() {\n        if (ctx.oInit.formEdit !== undefined) {\n          ctx.oInit.formEdit.okCallBack = false;\n        } // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n        // del if evita un error\n\n\n        if (that.processing !== undefined) {\n          that.processing(false);\n        }\n      }\n    });\n  };\n  /**\r\n   * Copia los datos recibidos al portapapeles\r\n   *\r\n   * @name _reportsToClipboard\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt Instancia del table\r\n   * @param {object} that Objeto del boton\r\n   * @param {int} exportDataRows Numero de filas a ser exportadas\r\n   * @param {object} hiddenDiv Elemento del DOM\r\n   * @param {object} textarea Elemento del DOM\r\n   *\r\n   */\n\n\n  var _reportsToClipboard = function _reportsToClipboard(dt, that, exportDataRows, hiddenDiv, textarea) {\n    // Para los navegadores que soportan el comando de copia 'execCommand'\n    if (document.queryCommandSupported('copy')) {\n      hiddenDiv.appendTo(dt.table().container());\n      textarea[0].focus();\n      textarea[0].select();\n\n      try {\n        var successful = document.execCommand('copy');\n        hiddenDiv.remove();\n\n        if (successful) {\n          dt.buttons.info(dt.i18n('rup_table.copyButton.changes', 'Copia de registros en portapapeles'), dt.i18n('rup_table.copyButton.saved', {\n            _: 'Copiados %d registros al portapapeles',\n            1: 'Copiado un registro al portapapeles'\n          }, exportDataRows), 2000); // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n          // del if evita un error\n\n          if (that.processing !== undefined) {\n            that.processing(false);\n          }\n\n          $('#' + dt.context[0].sTableId).trigger('rupTable_copied');\n          return;\n        }\n      } catch (t) {}\n    } // Si no soportan la copia mediante 'execCommand', se mostrara un text box\n    // con las instrucciones de como copiar los elementos seleccionados\n\n\n    var message = $('<span>' + dt.i18n('rup_table.copyButton.copyKeys', 'Presiona ctrl o ⌘ + C para copiar los datos de la tabla al portapapeles.' + 'Para cancelar, haz click sobre este mensaje o pulsa el botón escape.') + '</span>').append(hiddenDiv);\n    dt.buttons.info(dt.i18n('rup_table.copyButton.copyTitle', 'Copiar al portapapeles'), message, 0); // Selecciona el texto para cuando el usuario accione la copia al portapapeles\n    // se le pegue ese texto\n\n    textarea[0].focus();\n    textarea[0].select(); // Evento que oculta el mensaje cuando el usuario ha terminado con la copia\n\n    var container = $(message).closest('.dt-button-info');\n\n    var close = function close() {\n      container.off('click.buttons-copy');\n      $(document).off('.buttons-copy');\n      dt.buttons.info(false); // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n      // del if evita un error\n\n      if (that.processing !== undefined) {\n        that.processing(false);\n      }\n    };\n\n    container.on('click.buttons-copy', close);\n    $(document).on('keydown.buttons-copy', function (e) {\n      if (e.keyCode === 27) {\n        // esc\n        close();\n      }\n    }).on('copy.buttons-copy cut.buttons-copy', function () {\n      close(); // Si es llamado desde el contextMenu este paso es innecesario y la condicion\n      // del if evita un error\n\n      if (that.processing !== undefined) {\n        that.processing(false);\n      }\n    });\n  };\n\n  var _initContextMenu = function _initContextMenu(ctx, api) {\n    // Creacion del Context Menu\n    if (ctx.oInit.buttons !== undefined && ctx.oInit.buttons.contextMenu) {\n      var botonesToolbar = ctx._buttons[0].inst.s.buttons;\n\n      _updateContextMenu(botonesToolbar, api, ctx);\n    }\n  };\n  /**\r\n   * Metodo que elimina todos los registros seleccionados.\r\n   *\r\n   * @name _deleteAllSelects\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n\n  var _deleteAllSelects = function _deleteAllSelects(dt) {\n    var ctx = dt.settings()[0];\n    var idRow = 0;\n    var regex = new RegExp(ctx.oInit.multiplePkToken, 'g');\n    $.rup_messages('msgConfirm', {\n      message: $.rup.i18nParse($.rup.i18n.base, 'rup_table.deleteAll'),\n      title: $.rup.i18nParse($.rup.i18n.base, 'rup_table.delete'),\n      OKFunction: function OKFunction() {\n        var row = {};\n        row.filter = window.form2object(ctx.oInit.filter.$filterContainer[0]);\n\n        if (ctx.multiselection.selectedIds.length > 1) {\n          row.core = {\n            'pkToken': ctx.oInit.multiplePkToken,\n            'pkNames': ctx.oInit.primaryKey\n          };\n          row.multiselection = {};\n          row.multiselection.selectedAll = ctx.multiselection.selectedAll;\n\n          if (row.multiselection.selectedAll) {\n            row.multiselection.selectedIds = ctx.multiselection.deselectedIds;\n          } else {\n            row.multiselection.selectedIds = ctx.multiselection.selectedIds;\n          }\n\n          _callDelete('POST', dt, ctx, row, '/deleteAll');\n        } else {\n          row = ctx.multiselection.selectedIds[0];\n          row = row.replace(regex, '/');\n\n          _callDelete('DELETE', dt, ctx, idRow, '/' + row);\n        }\n      }\n    });\n  };\n\n  var _callDelete = function _callDelete(actionType, dt, ctx, row, url) {\n    $('#' + ctx.sTableId).triggerHandler('tableBeforeCallDelete');\n\n    var _callFeedbackDelete = function _callFeedbackDelete(ctx, msgFeedBack, type) {\n      $('#' + ctx.sTableId).triggerHandler('tableFeedbackShowDelete');\n      ctx.oInit.feedback.$feedbackContainer.rup_feedback('set', msgFeedBack, type);\n      ctx.oInit.feedback.$feedbackContainer.rup_feedback('show');\n    };\n\n    if (ctx.oInit.masterDetail !== undefined) {\n      //Asegurar que se recoge el idPadre\n      var masterPkObject = DataTable.Api().masterDetail.getMasterTablePkObject(ctx);\n      jQuery.extend(true, masterPkObject, row);\n      row = masterPkObject;\n    }\n\n    var msgFeedBack = $.rup.i18nParse($.rup.i18n.base, 'rup_table.deletedOK');\n    var ajaxOptions = {\n      url: ctx.oInit.urlBase + url,\n      accepts: {\n        '*': '*/*',\n        'html': 'text/html',\n        'json': 'application/json, text/javascript',\n        'script': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript',\n        'text': 'text/plain',\n        'xml': 'application/xml, text/xml'\n      },\n      type: actionType,\n      data: row,\n      dataType: 'json',\n      showLoading: false,\n      contentType: 'application/json',\n      async: true,\n      success: function success() {\n        // Eliminar\n        if (ctx.oInit.multiSelect !== undefined) {\n          DataTable.Api().multiSelect.deselectAll(dt);\n        } else if (ctx.oInit.select !== undefined) {\n          DataTable.Api().select.deselect(ctx);\n        }\n\n        $('#' + ctx.sTableId).triggerHandler('tablefterDelete');\n        ctx._buttons[0].inst.s.disableAllButtons = undefined;\n        DataTable.Api().seeker.disabledButtons(ctx); // Recargar datos\n        // Primer parametro para mandar una funcion a ejecutar, segundo parametro bloquear la pagina si pones false\n\n        dt.ajax.reload(function () {\n          _callFeedbackDelete(ctx, msgFeedBack, 'ok');\n        }, false);\n        $('#' + ctx.sTableId).triggerHandler('tableSuccessCallDelete');\n      },\n      complete: function complete() {\n        $('#' + ctx.sTableId).triggerHandler('tableCompleteCallDelete');\n      },\n      error: function error(xhr) {\n        _callFeedbackDelete(ctx, xhr.responseText, 'error');\n\n        $('#' + ctx.sTableId).triggerHandler('tableErrorCallDelete');\n      },\n      feedback: function feedback() {\n        _callFeedbackDelete(ctx, msgFeedBack, 'ok');\n      }\n    };\n    ajaxOptions.data = JSON.stringify(ajaxOptions.data);\n    $.rup_ajax(ajaxOptions);\n  };\n\n  var _updateContextMenu = function _updateContextMenu(botones, api, ctx) {\n    var items = {};\n    var tableId = ctx.sTableId;\n    $.each(botones, function () {\n      // Entra si tiene marcada la opcion para habilitarlo dentro del contextMenu\n      if (this.conf.insideContextMenu) {\n        // Poblamos el objeto 'items' con los botones habilitados\n        items[this.conf.id] = {\n          id: this.conf.id + '_contextMenuToolbar',\n          name: this.conf.text(api),\n          icon: this.conf.icon,\n          inCollection: this.inCollection,\n          idCollection: undefined\n        };\n      } // Comprueba si tiene botones hijos\n\n\n      if (this.buttons.length > 0) {\n        var idCollection = this.conf.id;\n        $.each(this.buttons, function (i) {\n          // Entra si tiene marcada la opcion para habilitarlo dentro del contextMenu\n          if (this.conf.insideContextMenu) {\n            // Poblamos el objeto 'items' con los botones habilitados\n            items[this.conf.id] = {\n              id: this.conf.id + '_contextMenuToolbar',\n              name: this.conf.text(api),\n              icon: this.conf.icon,\n              inCollection: this.inCollection,\n              idCollection: idCollection\n            };\n          }\n        });\n      }\n    });\n    var tableTrSelector = '#' + tableId + ' > tbody > tr';\n    var tableTr = $(tableTrSelector);\n    tableTr.selector = tableTrSelector;\n\n    if (!jQuery.isEmptyObject(items)) {\n      tableTr.rup_contextMenu('destroy');\n      tableTr.rup_contextMenu({\n        selector: tableTrSelector,\n        callback: function callback(key, options) {\n          var selector = items[key]; // Recogemos el id de la accion pulsada en el context menu\n\n          var contextMenuActionId = selector.id; // Le quitamos la extension '_contextMenuToolbar' para tener asi\n          // el id del boton que queremos accionar\n\n          var buttonId = contextMenuActionId.replace('_contextMenuToolbar', ''); // Variable que nos dira si esta dentro de una coleccion\n\n          var inCollection = selector.inCollection; // Variable que almacena el id de la coleccion (si no pertenece a una\n          // siempre sera 'undefined')\n\n          var idCollection = selector.idCollection; // Comprobamos si existe el elemento con este id\n\n          if (inCollection && idCollection !== undefined) {\n            // Obtenemos la info necesaria del boton y la guardamos en variables\n            var buttonName;\n            var dt = $('#' + ctx.sTableId).DataTable();\n            var eventConfig;\n            $.each(ctx.ext.buttons, function (key) {\n              var buttonObject = ctx.ext.buttons[key];\n\n              if (buttonObject.id === buttonId) {\n                buttonName = key;\n                eventConfig = buttonObject;\n              }\n            }); // Llamamos directamente al action para no hacer aparecer y desaparecer\n            // el boton, empeorando la UX\n\n            ctx.ext.buttons[buttonName].action(undefined, dt, undefined, eventConfig);\n          } else {\n            $('#' + buttonId).trigger('click');\n          }\n        },\n        items: items\n      });\n    }\n  };\n  /**\r\n   * Inicializa los botones\r\n   *\r\n   * @name _initButtons\r\n   * @function\r\n   * @since UDA 3.7.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on\r\n   * @param {List<object>} opts Lista de botones\r\n   *\r\n   */\n\n\n  var _initButtons = function _initButtons(ctx, opts) {\n    $.each(opts, function (i) {\n      // Activa/desactiva los botones en el inicio en funcion de la propiedad\n      // 'displayRegex' que tengan asociada\n      var collectionObject = null;\n      var numOfSelectedRows = ctx.multiselection.numSelected;\n\n      if (ctx.oInit.masterDetail !== undefined && this.conf.id === ctx.sTableId + 'addButton_1') {\n        //si es maestro detalle para el boton add ,solo se renderiza cuando hay selección en el padre.\n        var table = $(ctx.oInit.masterDetail.master).DataTable();\n        numOfSelectedRows = table.context[0].multiselection.numSelected; //Nums del padre\n\n        this.conf.displayRegex = /^[1-9][0-9]*$/; //se cambia expresion regular\n      }\n\n      _manageButtonsAndButtonsContextMenu(opts[i], numOfSelectedRows, collectionObject, ctx); // Comprueba si tiene botones hijos\n\n\n      if (this.buttons.length > 0) {\n        collectionObject = this;\n\n        _manageButtonsAndButtonsContextMenu(opts[i], numOfSelectedRows, collectionObject, ctx);\n      } // Comprueba si tiene un icono asociado\n\n\n      if (this.conf.icon !== undefined) {\n        // Establece el icono de los botones\n        if ($(this.node).find('i').length === 0) {\n          $('#' + this.conf.id).prepend('<i class=\"mdi ' + this.conf.icon + '\" aria-hidden=\"true\"></i>');\n        } // Comprueba si tiene botones hijos\n\n\n        if (this.buttons.length > 0 && $('#' + this.conf.id).length > 0) {\n          // Añadimos un evento para cuando se pulse sobre el boton padre, se le\n          // asignen los iconos a los hijos\n          $('#' + this.conf.id)[0].addEventListener('click', function eventHandler() {\n            var that = this;\n            $.each(opts[i].buttons, function (i) {\n              var selectorCollection = $('#' + this.conf.id); // Establece el icono de los botones hijos\n\n              if ($(this.node).find('i').length === 0) {\n                selectorCollection.prepend('<i class=\"mdi ' + this.conf.icon + '\" aria-hidden=\"true\"></i>');\n              }\n\n              that.removeEventListener('click', eventHandler);\n            });\n          }, false);\n        }\n      }\n    }); //Añadir dialogo por defecto\n\n    var $defaultDialog_wait = $('<div></div>').attr('id', ctx.sTableId + 'reportFileWait').attr('title', 'Tittle Prueba').text('prueba').addClass('rup_report').hide() //progressbar\n    .append($('<div></div>').addClass('ui-progressbar ui-progressbar-value ui-corner-left ui-corner-right')),\n        $defaultDialog_error = $('<div></div>').attr('id', ctx.sTableId + 'reportFileError').attr('title', 'Error').text('error').addClass('rup_report').hide(),\n        $defaultDialog = $('<div></div>').attr('id', ctx.sTableId + 'rup_report_dialogsContainer').append($defaultDialog_wait).append($defaultDialog_error);\n    $('#' + ctx.sTableId).after($defaultDialog);\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables interface\r\n   */\n  // Attach to DataTables objects for global access\n\n\n  $.fn.dataTable.Buttons = Buttons;\n  $.fn.DataTable.Buttons = Buttons;\n\n  function inicio(ctx) {\n    var api = new DataTable.Api(ctx);\n    var defaultButtons = api.init().buttons || DataTable.defaults.buttons;\n    var numOfSelectedRows = ctx.multiselection.numSelected;\n    var collectionObject;\n    $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeToolbarInit');\n\n    if ($('#' + ctx.sTableId + '_filter_form').length > 0) {\n      new Buttons(api, defaultButtons).container().insertBefore($('#' + ctx.sTableId + '_filter_form'));\n    } else {\n      new Buttons(api, defaultButtons).container().insertBefore($('#' + ctx.sTableId + '_wrapper'));\n    }\n\n    var opts = ctx._buttons[0].inst.s.buttons;\n    DataTable.Api().buttons.initButtons(ctx, opts);\n\n    _initContextMenu(ctx, api); // Detecta cuando se selecciona o se deselecciona una fila en el table\n\n\n    $('#' + ctx.sTableId).DataTable().on('select deselect contextmenu', function (event) {\n      DataTable.Api().buttons.displayRegex(ctx);\n    }); // Si la edición está deshabilitada, se deshabilitan todos los botones menos el de informes.\n\n    if (ctx.oInit.noEdit || ctx.oInit.formEdit === undefined && ctx.oInit.inlineEdit === undefined) {\n      var exceptions; // Si existen botones personalizados, se excluyen.\n\n      if (ctx.ext.buttons.custom.length > 0) {\n        exceptions = ctx.ext.buttons.custom;\n        exceptions.push(ctx.sTableId + 'informes_01');\n      } else {\n        exceptions = ctx.sTableId + 'informes_01';\n      }\n\n      DataTable.Api().buttons.disableAllButtons(ctx, exceptions);\n      ctx._buttons[0].inst.s.disableAllButtons = undefined;\n      DataTable.Api().buttons.displayRegex(ctx);\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterToolbarInit');\n  } // DataTables `dom` feature option\n\n\n  DataTable.ext.feature.push({\n    fnInit: function fnInit(settings) {\n      var api = new DataTable.Api(settings);\n      var opts = api.init().buttons || DataTable.defaults.buttons;\n      return new Buttons(api, opts).container();\n    },\n    cFeature: 'B'\n  }); //DataTables creation - check if the buttons have been defined for this table,\n  //they will have been if the `B` option was used in `dom`, otherwise we should\n  //create the buttons instance here so they can be inserted into the document\n  //using the API. Listen for `init` for compatibility with pre 1.10.10, but to\n  //be removed in future.\n\n  $(document).on('plugin-init.dt', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (ctx.oInit.buttons !== undefined && ctx.oInit.buttons.activate !== false) {\n      inicio(ctx);\n    }\n  });\n  return Buttons;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.buttons.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.colReorder.js":
/*!***********************************************!*\
  !*** ./src/rup_table/rup.table.colReorder.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Módulo que permite a los usuarios mover dinámicamente las columnas de las tablas.\r\n * \r\n * @summary     Extensión del componente ColReorder\r\n * @version     1.0.0\r\n * @file        rup.table.colReorder.js\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2022 E.J.I.E., S.A.\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\"), __webpack_require__(/*! datatables.net-bs4 */ \"./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs\"), __webpack_require__(/*! datatables.net-colreorder */ \"./node_modules/datatables.net-colreorder/js/dataTables.colReorder.js\"), __webpack_require__(/*! datatables.net-colreorder-bs4 */ \"./node_modules/datatables.net-colreorder-bs4/js/colReorder.bootstrap4.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  'use strict';\n  /**\r\n   * Switch the key value pairing of an index array to be value key (i.e. the old value is now the\r\n   * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ].\r\n   *  @method  fnInvertKeyValues\r\n   *  @param   array aIn Array to switch around\r\n   *  @returns array\r\n   */\n\n  function fnInvertKeyValues(aIn) {\n    var aRet = [];\n\n    for (var i = 0, iLen = aIn.length; i < iLen; i++) {\n      aRet[aIn[i]] = i;\n    }\n\n    return aRet;\n  }\n  /**\r\n   * Modify an array by switching the position of two elements\r\n   *  @method  fnArraySwitch\r\n   *  @param   array aArray Array to consider, will be modified by reference (i.e. no return)\r\n   *  @param   int iFrom From point\r\n   *  @param   int iTo Insert point\r\n   *  @returns void\r\n   */\n\n\n  function fnArraySwitch(aArray, iFrom, iTo) {\n    var mStore = aArray.splice(iFrom, 1)[0];\n    aArray.splice(iTo, 0, mStore);\n  }\n  /**\r\n   * Switch the positions of nodes in a parent node (note this is specifically designed for\r\n   * table rows). Note this function considers all element nodes under the parent!\r\n   *  @method  fnDomSwitch\r\n   *  @param   string sTag Tag to consider\r\n   *  @param   int iFrom Element to move\r\n   *  @param   int Point to element the element to (before this point), can be null for append\r\n   *  @returns void\r\n   */\n\n\n  function fnDomSwitch(nParent, iFrom, iTo) {\n    var anTags = [];\n\n    for (var i = 0, iLen = nParent.childNodes.length; i < iLen; i++) {\n      if (nParent.childNodes[i].nodeType == 1) {\n        anTags.push(nParent.childNodes[i]);\n      }\n    }\n\n    var nStore = anTags[iFrom];\n\n    if (iTo !== null) {\n      nParent.insertBefore(nStore, anTags[iTo]);\n    } else {\n      nParent.appendChild(nStore);\n    }\n  }\n  /**\r\n   * Plug-in for DataTables which will reorder the internal column structure by taking the column\r\n   * from one position (iFrom) and insert it into a given point (iTo).\r\n   *  @method  $.fn.dataTableExt.oApi.fnColReorder\r\n   *  @param   object oSettings DataTables settings object - automatically added by DataTables!\r\n   *  @param   int iFrom Take the column to be repositioned from this point\r\n   *  @param   int iTo and insert it into this point\r\n   *  @param   bool drop Indicate if the reorder is the final one (i.e. a drop)\r\n   *    not a live reorder\r\n   *  @param   bool invalidateRows speeds up processing if false passed\r\n   *  @returns void\r\n   */\n\n\n  $.fn.dataTableExt.oApi.fnColReorder = function (oSettings, iFrom, iTo, drop, invalidateRows) {\n    var i,\n        iLen,\n        j,\n        jLen,\n        jen,\n        iCols = oSettings.aoColumns.length,\n        nTrs,\n        oCol;\n\n    var attrMap = function attrMap(obj, prop, mapping) {\n      if (!obj[prop] || typeof obj[prop] === 'function') {\n        return;\n      }\n\n      var a = obj[prop].split('.');\n      var num = a.shift();\n\n      if (isNaN(num * 1)) {\n        return;\n      }\n\n      obj[prop] = mapping[num * 1] + '.' + a.join('.');\n    };\n    /* Sanity check in the input */\n\n\n    if (iFrom == iTo) {\n      /* Pointless reorder */\n      return;\n    }\n\n    if (iFrom < 0 || iFrom >= iCols) {\n      this.oApi._fnLog(oSettings, 1, \"ColReorder 'from' index is out of bounds: \" + iFrom);\n\n      return;\n    }\n\n    if (iTo < 0 || iTo >= iCols) {\n      this.oApi._fnLog(oSettings, 1, \"ColReorder 'to' index is out of bounds: \" + iTo);\n\n      return;\n    }\n    /*\r\n     * Calculate the new column array index, so we have a mapping between the old and new\r\n     */\n\n\n    var aiMapping = [];\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      aiMapping[i] = i;\n    }\n\n    fnArraySwitch(aiMapping, iFrom, iTo);\n    var aiInvertMapping = fnInvertKeyValues(aiMapping);\n    /*\r\n     * Convert all internal indexing to the new column order indexes\r\n     */\n\n    /* Sorting */\n\n    for (i = 0, iLen = oSettings.aaSorting.length; i < iLen; i++) {\n      oSettings.aaSorting[i][0] = aiInvertMapping[oSettings.aaSorting[i][0]];\n    }\n    /* Fixed sorting */\n\n\n    if (oSettings.aaSortingFixed !== null) {\n      for (i = 0, iLen = oSettings.aaSortingFixed.length; i < iLen; i++) {\n        oSettings.aaSortingFixed[i][0] = aiInvertMapping[oSettings.aaSortingFixed[i][0]];\n      }\n    }\n    /* Data column sorting (the column which the sort for a given column should take place on) */\n\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      oCol = oSettings.aoColumns[i];\n\n      for (j = 0, jLen = oCol.aDataSort.length; j < jLen; j++) {\n        oCol.aDataSort[j] = aiInvertMapping[oCol.aDataSort[j]];\n      } // Update the column indexes\n\n\n      oCol.idx = aiInvertMapping[oCol.idx];\n    } // Update 1.10 optimised sort class removal variable\n\n\n    $.each(oSettings.aLastSort, function (i, val) {\n      oSettings.aLastSort[i].src = aiInvertMapping[val.src];\n    });\n    /* Update the Get and Set functions for each column */\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      oCol = oSettings.aoColumns[i];\n\n      if (typeof oCol.mData == 'number') {\n        oCol.mData = aiInvertMapping[oCol.mData];\n      } else if ($.isPlainObject(oCol.mData)) {\n        // HTML5 data sourced\n        attrMap(oCol.mData, '_', aiInvertMapping);\n        attrMap(oCol.mData, 'filter', aiInvertMapping);\n        attrMap(oCol.mData, 'sort', aiInvertMapping);\n        attrMap(oCol.mData, 'type', aiInvertMapping);\n      }\n    }\n    /*\r\n     * Move the DOM elements\r\n     */\n\n\n    if (oSettings.aoColumns[iFrom].bVisible) {\n      /* Calculate the current visible index and the point to insert the node before. The insert\r\n       * before needs to take into account that there might not be an element to insert before,\r\n       * in which case it will be null, and an appendChild should be used\r\n       */\n      var iVisibleIndex = this.oApi._fnColumnIndexToVisible(oSettings, iFrom);\n\n      var iInsertBeforeIndex = null;\n      i = iTo < iFrom ? iTo : iTo + 1;\n\n      while (iInsertBeforeIndex === null && i < iCols) {\n        iInsertBeforeIndex = this.oApi._fnColumnIndexToVisible(oSettings, i);\n        i++;\n      }\n      /* Header */\n\n\n      nTrs = oSettings.nTHead.getElementsByTagName('tr');\n\n      for (i = 0, iLen = nTrs.length; i < iLen; i++) {\n        fnDomSwitch(nTrs[i], iVisibleIndex, iInsertBeforeIndex);\n      }\n      /* Footer */\n\n\n      if (oSettings.nTFoot !== null) {\n        nTrs = oSettings.nTFoot.getElementsByTagName('tr');\n        /* Corrección para UDA. Se empieza siempre a partir del segundo tr que lleva el filtro\r\n         * para evitar que el seeker haga fallar al módulo ColReorder.\r\n         */\n\n        for (i = 1, iLen = nTrs.length; i < iLen; i++) {\n          fnDomSwitch(nTrs[i], iVisibleIndex, iInsertBeforeIndex);\n        }\n      }\n      /* Body */\n\n\n      for (i = 0, iLen = oSettings.aoData.length; i < iLen; i++) {\n        if (oSettings.aoData[i].nTr !== null) {\n          fnDomSwitch(oSettings.aoData[i].nTr, iVisibleIndex, iInsertBeforeIndex);\n        }\n      }\n    }\n    /*\r\n     * Move the internal array elements\r\n     */\n\n    /* Columns */\n\n\n    fnArraySwitch(oSettings.aoColumns, iFrom, iTo); // regenerate the get / set functions\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      oSettings.oApi._fnColumnOptions(oSettings, i, {});\n    }\n    /* Search columns */\n\n\n    fnArraySwitch(oSettings.aoPreSearchCols, iFrom, iTo);\n    /* Array array - internal data anodes cache */\n\n    for (i = 0, iLen = oSettings.aoData.length; i < iLen; i++) {\n      var data = oSettings.aoData[i];\n      var cells = data.anCells;\n\n      if (cells) {\n        fnArraySwitch(cells, iFrom, iTo); // Longer term, should this be moved into the DataTables' invalidate\n        // methods?\n\n        for (j = 0, jen = cells.length; j < jen; j++) {\n          if (cells[j] && cells[j]._DT_CellIndex) {\n            cells[j]._DT_CellIndex.column = j;\n          }\n        }\n      } // Swap around array sourced data (object based is left as is)\n\n\n      if (Array.isArray(data._aData)) {\n        fnArraySwitch(data._aData, iFrom, iTo);\n      }\n    }\n    /* Reposition the header elements in the header layout array */\n\n\n    for (i = 0, iLen = oSettings.aoHeader.length; i < iLen; i++) {\n      fnArraySwitch(oSettings.aoHeader[i], iFrom, iTo);\n    }\n\n    if (oSettings.aoFooter !== null) {\n      for (i = 0, iLen = oSettings.aoFooter.length; i < iLen; i++) {\n        fnArraySwitch(oSettings.aoFooter[i], iFrom, iTo);\n      }\n    }\n\n    if (invalidateRows || invalidateRows === undefined) {\n      // Always read from the data object rather than reading back from the DOM\n      // since it could have been changed by a renderer\n      $.fn.dataTable.Api(oSettings).rows().invalidate('data');\n    }\n    /*\r\n     * Update DataTables' event handlers\r\n     */\n\n    /* Sort listener */\n\n\n    for (i = 0, iLen = iCols; i < iLen; i++) {\n      $(oSettings.aoColumns[i].nTh).off('.DT');\n\n      this.oApi._fnSortAttachListener(oSettings, oSettings.aoColumns[i].nTh, i);\n    }\n    /* Fire an event so other plug-ins can update */\n\n\n    $(oSettings.oInstance).trigger('column-reorder.dt', [oSettings, {\n      from: iFrom,\n      to: iTo,\n      mapping: aiInvertMapping,\n      drop: drop,\n      // Old style parameters for compatibility\n      iFrom: iFrom,\n      iTo: iTo,\n      aiInvertMapping: aiInvertMapping\n    }]);\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.colReorder.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.editForm.js":
/*!*********************************************!*\
  !*** ./src/rup_table/rup.table.editForm.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/* eslint-env jquery,amd */\n\n/**\r\n * Módulo que habilita la edicción mediante un formulario.\r\n *\r\n * @summary \t\tExtensión del componente RUP Datatable\r\n * @module\t\t\t\"rup.table.editForm\"\r\n * @version     1.0.0\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n *\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ../core/utils/jquery.form */ \"./src/core/utils/jquery.form.js\"), __webpack_require__(/*! ../rup.form */ \"./src/rup.form.js\"), __webpack_require__(/*! ../rup.combo */ \"./src/rup.combo.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Version information for debugger\n\n  DataTable.editForm = {};\n  DataTable.editForm.version = '1.2.4';\n  /**\r\n   * Configura el componente editForm para su inicialización\r\n   *\r\n   * @name preConfigure\r\n   * @function\r\n   * @since UDA 5.0.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n  DataTable.editForm.preConfigure = function (dt) {\n    var ctx = dt.settings()[0];\n    var init = ctx.oInit.multiSelect;\n    var defaults = DataTable.defaults.multiSelect;\n\n    if (init === undefined) {\n      init = defaults;\n    } // DetailForm se convierte en función y se inicializan los botones\n\n\n    ctx.oInit.formEdit.detailForm = $(ctx.oInit.formEdit.detailForm);\n    ctx.oInit.formEdit.idForm = ctx.oInit.formEdit.detailForm.find('form').first();\n    ctx.oInit.formEdit.id = ctx.oInit.formEdit.detailForm[0].id.replace('_detail_div', '');\n\n    if (ctx.oInit.formEdit.detailForm !== undefined && $('body').find('[aria-describedby=\\'' + ctx.oInit.formEdit.detailForm[0].id + '\\']').length > 0) {\n      $('body').find('[aria-describedby=\\'' + ctx.oInit.formEdit.detailForm[0].id + '\\']').remove();\n    } // Obtiene el adapter y crea la barra de navegación en función de si la multiselección está o no activada\n\n\n    if (ctx.oInit.multiSelect === undefined) {\n      _callNavigationSelectBar(dt);\n    } else {\n      _callNavigationBar(dt);\n    } // Inicializa el paginador del formulario de edición\n\n\n    _updateDetailPagination(ctx, 1, 1); // Añade el botón de cancelar\n\n\n    ctx.oInit.formEdit.buttoCancel = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_button_cancel');\n    ctx.oInit.formEdit.buttoCancel.on('click', function () {\n      _cancelPopup(ctx); // Cierra el dialog\n\n\n      ctx.oInit.formEdit.detailForm.rup_dialog('close');\n    });\n    var idRow;\n    var rowsBody = $(ctx.nTBody); // Gestiona la creación del evento de doble click para editar una fila\n\n    if (ctx.oInit.multiSelect !== undefined || ctx.oInit.select !== undefined) {\n      var sel = ctx.oInit.multiSelect;\n\n      if (sel === undefined) {\n        sel = ctx.oInit.select;\n      } // Propiedad que no genera el evento de doble click en caso de existir y tener un valor true\n\n\n      if (!sel.deleteDoubleClick) {\n        rowsBody.on('dblclick.DT keypress', 'tr:not(.group)', function (e) {\n          // Sólo selecciona si se pulsa sobre el enter o se hace click izquierdo con el ratón\n          if (e.type == 'keypress' && e.which == 13 || e.type === 'dblclick') {\n            idRow = this._DT_RowIndex; // Añadir la selección del mismo\n\n            if (ctx.oInit.multiSelect !== undefined) {\n              dt['row'](idRow).multiSelect();\n            } else {\n              $('tr', rowsBody).removeClass('selected tr-highlight');\n              DataTable.Api().select.selectRowIndex(dt, idRow, true);\n            }\n\n            _getRowSelected(dt, 'PUT');\n\n            DataTable.editForm.fnOpenSaveDialog('PUT', dt, idRow, ctx.oInit.formEdit.customTitle);\n            $('#' + ctx.sTableId).triggerHandler('tableEditFormClickRow', ctx);\n          }\n        });\n      }\n    } // Establece el valor de las propiedades del formulario de edición.\n\n\n    ctx.oInit.formEdit.loadSpinner = typeof ctx.oInit.formEdit.loadSpinner === 'boolean' ? ctx.oInit.formEdit.loadSpinner : true;\n    ctx.oInit.formEdit.detailForm.settings = {\n      type: ctx.oInit.formEdit.type !== undefined ? ctx.oInit.formEdit.type : $.rup.dialog.DIV,\n      width: ctx.oInit.formEdit.width !== undefined ? ctx.oInit.formEdit.width : 569,\n      saveDialog: ctx.oInit.formEdit.confirmDialogs !== undefined && ctx.oInit.formEdit.confirmDialogs.saveDialog !== undefined ? ctx.oInit.formEdit.confirmDialogs.saveDialog : true,\n      cancelDialog: ctx.oInit.formEdit.confirmDialogs !== undefined && ctx.oInit.formEdit.confirmDialogs.cancelDialog !== undefined ? ctx.oInit.formEdit.confirmDialogs.cancelDialog : true,\n      deleteDialog: ctx.oInit.formEdit.confirmDialogs !== undefined && ctx.oInit.formEdit.confirmDialogs.deleteDialog !== undefined ? ctx.oInit.formEdit.confirmDialogs.deleteDialog : true\n    }; // Calcula el responsive\n\n    $(window).on('resize.dtr', DataTable.util.throttle(function () {\n      _addChildIcons(ctx);\n    }));\n  };\n  /**\r\n   * Inicializa el componente editForm\r\n   *\r\n   * @name init\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Contexto del Datatable.\r\n   *\r\n   */\n\n\n  DataTable.editForm.init = function (ctx) {\n    // Capturar evento de cierre\n    ctx.oInit.formEdit.detailForm.on('dialogbeforeclose', function (event) {\n      if (event.originalEvent !== undefined) {\n        //el evento es cerrado por el aspa\n        ctx.oInit.formEdit.okCallBack = false;\n      } // Si es igual no se debe hacer nada\n\n\n      var formSerializado = _editFormSerialize(ctx.oInit.formEdit.idForm, ctx.oInit.formEdit.serializerSplitter);\n\n      if (ctx.oInit.formEdit.dataOrigin === formSerializado || !ctx.oInit.formEdit.detailForm.settings.cancelDialog) {\n        _cancelPopup(ctx);\n\n        return true;\n      }\n\n      if (ctx.oInit.formEdit.dataOrigin !== formSerializado && !ctx.oInit.formEdit.okCallBack) {\n        $.rup_messages('msgConfirm', {\n          message: $.rup.i18nParse($.rup.i18n.base, 'rup_table.saveAndContinue'),\n          title: $.rup.i18nParse($.rup.i18n.base, 'rup_table.changes'),\n          OKFunction: function OKFunction() {\n            _cancelPopup(ctx);\n\n            ctx.oInit.formEdit.okCallBack = true;\n            ctx.oInit.formEdit.detailForm.rup_dialog('close');\n            $('#' + ctx.sTableId).triggerHandler('tableMessageOk', ctx);\n          },\n          CANCELFunction: function CANCELFunction() {\n            ctx.oInit.formEdit.okCallBack = false;\n            $('#' + ctx.sTableId).triggerHandler('tableMessageCancel', ctx);\n          },\n          CLOSEFunction: function CLOSEFunction() {\n            ctx.oInit.formEdit.okCallBack = false;\n            $('#' + ctx.sTableId).triggerHandler('tableMessageClose', ctx);\n          }\n        });\n      } // En caso de aceptar, se cierra y se limpia\n\n\n      if (!ctx.oInit.formEdit.okCallBack || ctx.oInit.formEdit.okCallBack === undefined) {\n        return false;\n      }\n    });\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Local functions\r\n   */\n\n  /**\r\n   * Initialisation of a new table. Attach event handlers and callbacks to allow\r\n   * Select to operate correctly.\r\n   *\r\n   * This will occur _after_ the initial DataTables initialisation, although\r\n   * before Ajax data is rendered, if there is ajax data\r\n   *\r\n   * @name init\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param  {DataTable.settings} ctx Settings object to operate on\r\n   *\r\n   */\n\n\n  function init(ctx) {\n    var api = new DataTable.Api(ctx); // Row callback so that classes can be added to rows and cells if the item\n    // was selected before the element was created. This will happen with the\n    // `deferRender` option enabled.\n    //\n    // This method of attaching to `aoRowCreatedCallback` is a hack until\n    // DataTables has proper events for row manipulation If you are reviewing\n    // this code to create your own plug-ins, please do not do this!\n\n    ctx.aoRowCreatedCallback.push({\n      fn: function fn(row, data, index) {\n        var i, ien;\n        var d = ctx.aoData[index]; // Row\n\n        if (d._multiSelect_selected) {\n          $(row).addClass(ctx._multiSelect.className);\n        } // Cells and columns - if separated out, we would need to do two\n        // loops, so it makes sense to combine them into a single one\n\n\n        for (i = 0, ien = ctx.aoColumns.length; i < ien; i++) {\n          if (ctx.aoColumns[i]._multiSelect_selected || d._selected_cells && d._selected_cells[i]) {\n            $(d.anCells[i]).addClass(ctx._multiSelect.className);\n          }\n        }\n      },\n      sName: 'select-deferRender'\n    }); // On Ajax reload we want to reselect all rows which are currently selected,\n    // if there is an rowId (i.e. a unique value to identify each row with)\n\n    api.on('preXhr.dt.dtSelect', function () {\n      // note that column selection doesn't need to be cached and then\n      // reselected, as they are already selected\n      var rows = api.rows({\n        selected: true\n      }).ids(true).filter(function (d) {\n        return d !== undefined;\n      });\n      var cells = api.cells({\n        selected: true\n      }).eq(0).map(function (cellIdx) {\n        var id = api.row(cellIdx.row).id(true);\n        return id ? {\n          row: id,\n          column: cellIdx.column\n        } : undefined;\n      }).filter(function (d) {\n        return d !== undefined;\n      }); // On the next draw, reselect the currently selected items\n\n      api.one('draw.dt.dtSelect', function () {\n        api.rows(rows).multiSelect(); // `cells` is not a cell index selector, so it needs a loop\n\n        if (cells.any()) {\n          cells.each(function (id) {\n            api.cells(id.row, id.column).multiSelect();\n          });\n        }\n      });\n    }); // Clean up and release\n\n    api.on('destroy.dtSelect', function () {\n      disableMouseSelection(api);\n      api.off('.dtSelect');\n    });\n  }\n\n  function eventTrigger(api, type, args, any) {\n    if (any && !api.flatten().length) {\n      return;\n    }\n\n    if (typeof type === 'string') {\n      type = type + '.dt';\n    }\n\n    args.unshift(api);\n    $(api.table().node()).trigger(type, args);\n  }\n\n  function _cancelPopup(ctx) {\n    ctx.oInit.formEdit.okCallBack = false;\n    var feedback = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_feedback'); //Despues de cerrar\n    //Se limpia los elementos.\n\n    if (ctx.oInit.formEdit.idForm.find('.error').length > 0) {\n      ctx.oInit.formEdit.idForm.rup_validate('resetElements'); //nos aseguramos de borrar todo\n\n      ctx.oInit.formEdit.idForm.find('.error').not('input').remove();\n      ctx.oInit.formEdit.idForm.find('.rup-validate-field-error').removeClass('rup-validate-field-error');\n    } //Se cierran los mensajes del feedback\n\n\n    if (feedback[0].className !== '') {\n      feedback.rup_feedback('hide', 0);\n    }\n  }\n  /**\r\n   * Función que añade las validaciones a un formulario.\r\n   *\r\n   * @name addValidation\r\n   * @function\r\n   * @since UDA 5.0.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Contexto del Datatable.\r\n   *\r\n   */\n\n\n  function _addValidation(ctx) {\n    var idTableDetail = ctx.oInit.formEdit.detailForm;\n    var feed = idTableDetail.find('#' + ctx.sTableId + '_detail_feedback');\n    var validaciones;\n\n    if (ctx.oInit.formEdit.validate !== undefined) {\n      validaciones = ctx.oInit.formEdit.validate.rules;\n    }\n\n    if (feed.length === 0) {\n      feed = $('<div></div>').attr('id', feed[0].id + '_ok').insertBefore(feed);\n    }\n\n    feed.rup_feedback(ctx.oInit.feedback);\n    var propertiesDefault = {\n      liveCheckingErrors: false,\n      showFieldErrorAsDefault: true,\n      showErrorsInFeedback: true,\n      showFieldErrorsInFeedback: true\n    };\n    var propertiesValidate = $.extend(true, {}, propertiesDefault, ctx.oInit.formEdit.propertiesValidate);\n    propertiesValidate.feedback = feed;\n    propertiesValidate.rules = validaciones;\n    ctx.oInit.formEdit.idForm.rup_validate(propertiesValidate);\n  }\n  /**\r\n   * Función que gestiona la carga del diálogo de añadir o editar.\r\n   *\r\n   * @name loadSaveDialogForm\r\n   * @function\r\n   * @since UDA 5.0.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Contexto de la tabla.\r\n   * @param {string} actionType - Acción a ajecutar en el formulario para ir al controller, basado en REST.\r\n   * @param {object} row - Datos para alimentar los campos del formulario.\r\n   *\r\n   * @return {object}\r\n   */\n\n\n  function _loadSaveDialogForm(ctx, actionType, row) {\n    var idForm = ctx.oInit.formEdit !== undefined ? ctx.oInit.formEdit.idForm : undefined; // Servirá para saber si la última llamada a editForm fue para añadir, editar o si aún no ha sido inicializado\n\n    var lastAction = ctx.oInit.formEdit.actionType; // Botón de guardar y continuar\n\n    var buttonContinue = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_button_save_repeat'); // En caso de ser clonado el method ha de ser POST\n\n    if (actionType === 'CLONE') {\n      actionType = 'POST';\n      buttonContinue.hide();\n    } else {\n      buttonContinue.show();\n    } // Si el usuario ha activado los formularios dinámicos y la última acción no es la misma que la actual, es necesario volver a obtener el formulario\n\n\n    if (ctx.oInit.enableDynamicForms && lastAction !== actionType) {\n      // Preparar la información a enviar al servidor. Como mínimo se enviará el actionType.\n      var defaultData = {\n        'actionType': actionType\n      };\n      var data = ctx.oInit.formEdit.data !== undefined ? $.extend({}, defaultData, ctx.oInit.formEdit.data) : defaultData;\n      $('#' + ctx.sTableId).triggerHandler('tableEditFormBeforeLoad', ctx);\n      return $.post(ctx.oInit.formEdit.url !== undefined ? ctx.oInit.formEdit.url : ctx.oInit.urlBase + '/editForm', data, function (form) {\n        // Guardar anterior formulario para poder comprobarlo con el recién recibido\n        var tempForm = idForm !== undefined ? idForm : undefined; // Guardar referencia del formulario recibido\n\n        var receivedForm = $(form).find(\"form\").addBack('form'); // Si existe un formulario previo con el mismo identificador que el recibido, se elimina\n\n        if (tempForm !== undefined && tempForm.length === 1 && tempForm.attr(\"id\") === receivedForm.attr(\"id\")) {\n          tempForm.remove();\n        } // Insertar formulario recibido dentro del contenedor especificado\n\n\n        var formContainerID = '#' + ctx.sTableId + '_detail_form_container';\n        $(formContainerID).prepend(receivedForm);\n        ctx.oInit.formEdit.actionType = actionType;\n        ctx.oInit.formEdit.idForm = $(ctx.oInit.formEdit.detailForm).find('form').first(); // Si el diálogo no ha sido inicializado, se inicializa\n\n        if (lastAction === undefined) {\n          $('#' + ctx.sTableId).triggerHandler('tableEditFormInitialize', ctx);\n        } // Detectar componentes RUP e inicializarlos\n\n\n        _formInitializeRUP(ctx, row, $(formContainerID + ' #' + receivedForm.attr(\"id\"))); // Añadir validaciones\n\n\n        _addValidation(ctx);\n\n        $('#' + ctx.sTableId).triggerHandler('tableEditFormAfterLoad', ctx);\n      }, 'html');\n    } else if (!ctx.oInit.enableDynamicForms && lastAction === undefined) {\n      // Entrará por aquí cuando los formularios dinámicos hayan sido desactivados (comportamiento por defecto) y se necesite inicializar el formulario por ser la primera llamada\n      ctx.oInit.formEdit.actionType = actionType;\n      $.when($('#' + ctx.sTableId).triggerHandler('tableEditFormInitialize', ctx)).then(function () {\n        var deferred = $.Deferred(); // Detectar componentes RUP e inicializarlos\n\n        _formInitializeRUP(ctx, row, idForm); // Añadir validaciones\n\n\n        _addValidation(ctx);\n\n        deferred.resolve();\n        return deferred.promise();\n      });\n    } else {\n      // Para cuando el formulario actual sigue siendo válido (ya sea dinámico o no)\n      var deferred = $.Deferred();\n      ctx.oInit.formEdit.actionType = actionType;\n      deferred.resolve();\n      return deferred.promise();\n    }\n  }\n  /**\r\n   * Detecta los componentes RUP del formulario y los inicializa.\r\n   *\r\n   * @name formInitializeRUP\r\n   * @function\r\n   * @since UDA 5.0.2 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Contexto de la tabla.\r\n   * @param {object} row - Datos para alimentar los campos del formulario.\r\n   * @param {object} form - Formulario en el que hay que inicializar los componentes.\r\n   */\n\n\n  function _formInitializeRUP(ctx, row, form) {\n    if (ctx.oInit.colModel !== undefined && (ctx.oInit.multiSelect !== undefined || ctx.oInit.select !== undefined)) {\n      $.each(ctx.oInit.colModel, function (key, column) {\n        var element = form.find('[name=\"' + column.name + '\"]'); // Comprobar que es un componente RUP y editable. En caso de no ser editable, se añade la propiedad readonly.\n\n        if (column.rupType && column.editable) {\n          if (column.editoptions !== undefined) {\n            if (column.rupType === 'combo') {\n              // Si se recibe una fila con valores, se establece el valor del campo correspondiente como el registro seleccionado en el combo.\n              if (row !== undefined) {\n                column.editoptions.selected = column.name.includes('.') ? $.fn.flattenJSON(row)[column.name] : row[column.name];\n              } // Cuando no se haya definido un elemento al que hacer el append del menú del combo, se hace al \"body\" para evitar problemas de CSS.\n\n\n              if (column.editoptions.appendTo === undefined) {\n                column.editoptions.appendTo = 'body';\n              }\n            } else if (column.rupType === 'autocomplete') {\n              // Establece el valor por defecto.\n              if (row !== undefined) {\n                column.editoptions.defaultValue = row[column.name];\n              }\n\n              if (column.editoptions.menuAppendTo === undefined) {\n                // Cuando no se haya definido un elemento al que hacer el append del menú del autocomplete, se hace al \"body\" para evitar problemas de CSS.\n                column.editoptions.menuAppendTo = 'body';\n              }\n            } else if (column.rupType === 'select') {\n              // Si se recibe una fila con valores, se establece el valor del campo correspondiente como el registro seleccionado en el select.\n              if (row !== undefined) {\n                var rowName = $.fn.getStaticHdivID(row[column.name]);\n                var flatter = $.fn.getStaticHdivID($.fn.flattenJSON(row)[column.name]);\n                column.editoptions.selected = column.name.includes('.') ? flatter : rowName;\n              }\n            } // Inicializar componente.\n\n\n            element['rup_' + column.rupType](column.editoptions);\n          } else if (column.searchoptions === undefined) {\n            console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.errors.wrongColModel'), column.name));\n          }\n        } else if (!column.editable) {\n          element.prop('readonly', true);\n        }\n      });\n    }\n  }\n  /**\r\n   * Función que gestiona el comportamiento de abrir el dialog para añadir o editar un registro.\r\n   *\r\n   * @name openSaveDialog\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {string} actionType - Es la acción que se va a ajecutar en el formulario para ir al controller, basado en rest.\r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {integer} idRow - Número con la posición de la fila que hay que obtener.\r\n   * @param {string} customTitle - Título personalizado.\r\n   *\r\n   */\n\n\n  DataTable.editForm.fnOpenSaveDialog = function _openSaveDialog(actionType, dt, idRow, customTitle) {\n    var ctx = dt.settings()[0]; // Mostrar spinner de carga hasta que el formulario sea visible (sólo si fue activado). La segunda comprobación, evita que aparezca el spinner cuando se pagina dentro de editForm entre registros porque para ese caso, ya existe otro spinner\n\n    if (ctx.oInit.formEdit.loadSpinner && $('#' + ctx.sTableId + '_detail_div_loading').length == 0) {\n      $('body').append('<div id=\"' + ctx.sTableId + '_formEdit_dialog_loading\" class=\"formEdit_dialog_loading_container\">' + '<div></div>' + '<span><i class=\"mx-auto mdi mdi-spin mdi-loading\" aria-hidden=\"true\"></i></span>' + '</div>');\n    }\n\n    if (idRow == null || idRow == undefined || idRow < 0) {\n      idRow = 1;\n    }\n\n    var row;\n\n    if (ctx.json !== undefined && actionType !== 'POST') {\n      //si acción es add, no hace falta coger el row.\n      row = ctx.json.rows[idRow];\n    } // Comprobar si existe un formulario, en caso de no existir o de no contener el action requerido, lo crea\n\n\n    $.when(_loadSaveDialogForm(ctx, actionType, row)).then(function () {\n      var loadPromise = $.Deferred();\n      var idForm = ctx.oInit.formEdit.idForm; // Limpiar los errores en caso de haberlos\n\n      var feed = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_feedback');\n      var divErrorFeedback = ctx.oInit.formEdit.detailForm.find('#' + feed[0].id);\n\n      if (divErrorFeedback.length > 0) {\n        divErrorFeedback.hide();\n      } // Limpiar los elementos\n\n\n      if (idForm.find('.error').length > 0) {\n        idForm.rup_validate('resetElements');\n      } // Botón de guardar\n\n\n      var button = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_button_save'); // Botón de guardar y continuar\n\n      var buttonContinue = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_button_save_repeat');\n      $('#' + ctx.sTableId).triggerHandler('tableEditFormAddEditBeforeInitData', ctx);\n      var rowArray = $.rup_utils.jsontoarray(row);\n      var title = customTitle != (undefined && null) ? customTitle : \"\"; // Actualizar el valor de la variable por si ha sufrido cambios en la función _loadSaveDialogForm() ya que en caso de ser un CLONE, habrá sido convertido a POST\n\n      actionType = ctx.oInit.formEdit.actionType;\n\n      if (actionType === 'PUT') {\n        // Si la opción 'direct' es verdadera, no se solicita el registro a BBDD, en su lugar, se obtiene de la tabla directamente.\n        if (!ctx.oInit.formEdit.direct) {\n          //se obtiene el row entero de bbdd, meter parametro opcional.\n          var pk = DataTable.Api().rupTable.getIdPk(row, ctx.oInit); //se evita slash en la url GET como parámetros.Formateo de fecha.\n\n          var regexSlash = new RegExp('/', 'g');\n          pk = pk.replace(regexSlash, '-');\n          var regex = new RegExp(ctx.oInit.multiplePkToken, 'g');\n          pk = pk.replace(regex, '/');\n          var ajaxOptions = {\n            url: ctx.oInit.urlBase + '/' + pk,\n            accepts: {\n              '*': '*/*',\n              'html': 'text/html',\n              'json': 'application/json, text/javascript',\n              'script': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript',\n              'text': 'text/plain',\n              'xml': 'application/xml, text/xml'\n            },\n            type: 'GET',\n            data: [],\n            dataType: 'json',\n            showLoading: false,\n            contentType: 'application/json',\n            async: false,\n            success: function success(data) {\n              row = data;\n\n              if (ctx.oInit.primaryKey !== undefined && ctx.oInit.primaryKey.length === 1) {\n                //si hdiv esta activo.\n                // Actualizar el nuevo id que viene de HDIV.\n                var idHdiv = \"\" + data[ctx.oInit.primaryKey];\n\n                if (pk == ctx.multiselection.lastSelectedId) {\n                  ctx.multiselection.lastSelectedId = idHdiv;\n                }\n\n                var pos = jQuery.inArray(pk, ctx.multiselection.selectedIds);\n\n                if (pos >= 0) {\n                  ctx.multiselection.selectedIds[pos] = idHdiv;\n                }\n\n                var result = $.grep(ctx.multiselection.selectedRowsPerPage, function (v) {\n                  return v.id == pk;\n                });\n\n                if (result !== undefined && result.length > 0) {\n                  result[0].id = idHdiv;\n                }\n              }\n            },\n            error: function error(xhr) {\n              var divErrorFeedback = feed; //idTableDetail.find('#'+feed[0].id + '_ok');\n\n              if (divErrorFeedback.length === 0) {\n                divErrorFeedback = $('<div></div>').attr('id', feed[0].id + '_ok').insertBefore(feed);\n                divErrorFeedback.rup_feedback(ctx.oInit.feedback);\n              }\n\n              _callFeedbackOk(ctx, divErrorFeedback, xhr.responseText, 'error');\n\n              $('#' + ctx.sTableId).triggerHandler('tableEditFormErrorCallSaveAjaxGet', ctx);\n            },\n            complete: function complete() {\n              if (ctx.oInit.formEdit.$navigationBar.funcionParams && ctx.oInit.formEdit.$navigationBar.funcionParams.length >= 4) {\n                _showOnNav(dt, ctx.oInit.formEdit.$navigationBar.funcionParams[3]);\n              }\n            }\n          };\n          loadPromise = $.rup_ajax(ajaxOptions); //Se carga desde bbdd y se actualiza la fila\n\n          dt.row(idRow).data(row);\n          ctx.json.rows[idRow] = row; // Recrear iconos del responsive en caso de ser necesario.\n\n          _addChildIcons(ctx); //Se mantiene el checked sin quitar.\n\n\n          $('#' + ctx.sTableId + ' > tbody > tr:not(.group)').eq(idRow).find('td.select-checkbox input[type=\"checkbox\"]').prop('checked', true);\n          rowArray = $.rup_utils.jsontoarray(row);\n        }\n\n        $.rup_utils.populateForm(rowArray, idForm);\n        var multiselection = ctx.multiselection;\n        var indexInArray = jQuery.inArray(DataTable.Api().rupTable.getIdPk(row, ctx.oInit), multiselection.selectedIds);\n\n        if (ctx.multiselection.selectedAll) {\n          //Si es selecAll recalcular el numero de los selects. Solo la primera vez es necesario.\n          indexInArray = ctx.oInit.formEdit.$navigationBar.numPosition;\n        }\n\n        if (indexInArray === undefined) {\n          indexInArray = 0;\n          ctx.oInit.formEdit.$navigationBar.numPosition = 0;\n        }\n\n        var numTotal = multiselection.numSelected;\n\n        if (ctx.oInit.multiSelect === undefined) {\n          numTotal = ctx.json.recordsTotal;\n          indexInArray = (Number(ctx.json.page) - 1) * ctx.aBaseJson.length;\n          indexInArray = indexInArray + idRow;\n        }\n\n        $('#' + ctx.sTableId).triggerHandler('tableEditFormAfterFillData', ctx);\n\n        if (ctx.oInit.formEdit.$navigationBar.funcionParams == undefined || ctx.oInit.formEdit.$navigationBar.funcionParams.length == undefined) {\n          _updateDetailPagination(ctx, indexInArray + 1, numTotal);\n        }\n\n        DataTable.Api().rupTable.selectPencil(ctx, idRow); // Se guarda el ultimo id editado.\n\n        ctx.multiselection.lastSelectedId = DataTable.Api().rupTable.getIdPk(row, ctx.oInit); // Se muestra el dialog.\n\n        ctx.oInit.formEdit.$navigationBar.show(); // Si no se ha definido un 'customTitle' asignamos un valor a la variable del título del formulario\n\n        if (customTitle == (undefined || null)) {\n          title = $.rup.i18nParse($.rup.i18n.base, 'rup_table.edit.editCaption');\n        } // Comprobamos si se desea bloquear la edicion de las claves primarias\n\n\n        DataTable.Api().rupTable.blockPKEdit(ctx, actionType);\n      } else if (actionType === 'POST') {\n        //al ser add, s elimpian los combos\n        jQuery.each($('select.rup_combo', idForm), function (index, elem) {\n          jQuery(elem).rup_combo('setRupValue', '');\n        });\n        $.rup_utils.populateForm(rowArray, idForm);\n        ctx.oInit.formEdit.$navigationBar.hide(); // Si no se ha definido un 'customTitle' asignamos un valor a la variable del título del formulario\n\n        if (customTitle == (undefined || null)) {\n          title = $.rup.i18nParse($.rup.i18n.base, 'rup_table.edit.addCaption');\n        } // Comprobamos si hay claves primarias bloqueadas y las desbloqueamos\n\n\n        DataTable.Api().rupTable.blockPKEdit(ctx, actionType);\n      }\n\n      $('#' + ctx.sTableId).triggerHandler('tableEditFormAddEditBeforeShowForm', ctx); // Establecemos el título del formulario\n\n      ctx.oInit.formEdit.detailForm.rup_dialog(ctx.oInit.formEdit.detailForm.settings);\n      ctx.oInit.formEdit.detailForm.rup_dialog('setOption', 'title', title);\n      ctx.oInit.formEdit.detailForm.rup_dialog('open'); // Quitar spinner de carga porque el formulario ya es visible (si fue activado)\n\n      if ($('#' + ctx.sTableId + '_formEdit_dialog_loading').length > 0) {\n        $('#' + ctx.sTableId + '_formEdit_dialog_loading').remove();\n      } // Establecemos el foco al primer elemento input o select que se\n      // encuentre habilitado en el formulario\n\n\n      $(idForm[0]).find('input,select').filter(':not([readonly])').first().focus(); // Se guardan los datos originales\n\n      ctx.oInit.formEdit.dataOrigin = _editFormSerialize(idForm, ctx.oInit.formEdit.serializerSplitter);\n      ctx.oInit.formEdit.okCallBack = false;\n      button.off('click');\n      button.on('click', function () {\n        //Funcion de validacion\n        if (actionType === 'PUT') {\n          var customModificar = ctx.oInit.validarModificar;\n\n          if (typeof customModificar === \"function\" && customModificar(ctx)) {\n            return false;\n          }\n        } else if (actionType === 'POST') {\n          var customAlta = ctx.oInit.validarAlta;\n\n          if (typeof customAlta === \"function\" && customAlta(ctx)) {\n            return false;\n          }\n        } // Comprobar si row ha sido modificada\n        // Se serializa el formulario con los cambios\n\n\n        row = _editFormSerialize(idForm, ctx.oInit.formEdit.serializerSplitter); // Se transforma\n\n        row = $.rup_utils.queryStringToJson(row, ctx.oInit.formEdit.serializerSplitter, ctx.oInit.formEdit.allowAllCharacters); //listas checkbox\n\n        row = _addListType(idForm, row);\n\n        if (actionType === 'PUT') {\n          //Solo al modificar\n          $.each(ctx.oInit.primaryKey, function (index, key) {\n            row[key] = ctx.json.rows[idRow][key];\n          });\n        }\n\n        var idTableDetail = ctx.oInit.formEdit.detailForm; // Muestra un feedback de error por caracter ilegal\n\n        if (!row) {\n          ctx.oInit.formEdit.okCallBack = false;\n\n          var _feed = idTableDetail.find('#' + ctx.sTableId + '_detail_feedback');\n\n          var _divErrorFeedback = _feed;\n\n          if (_divErrorFeedback.length === 0) {\n            _divErrorFeedback = $('<div></div>').attr('id', _feed[0].id + '_ok').insertBefore(_feed);\n\n            _divErrorFeedback.rup_feedback(ctx.oInit.feedback);\n          }\n\n          _callFeedbackOk(ctx, _divErrorFeedback, $.rup.i18nParse($.rup.i18n.base, 'rup_global.charError'), 'error');\n\n          $('#' + ctx.sTableId).triggerHandler('tableEditFormErrorCallSaveAjaxNotRow', ctx);\n        } else {\n          var url = actionType == 'POST' ? '/add' : '/edit'; // Comprobar si se ha definido otra URL en las propiedades, en caso afirmativo, se aplica.\n\n          var property = url.substring(1) + 'Url';\n\n          if (ctx.oInit.formEdit[property]) {\n            url = ctx.oInit.formEdit[property];\n          }\n\n          _callSaveAjax(actionType, dt, row, idRow, false, idTableDetail, url, false);\n        }\n\n        $('#' + ctx.sTableId).triggerHandler('tableButtonSave', ctx);\n      });\n      ctx.oInit.formEdit.detailForm.buttonSaveContinue = buttonContinue;\n      ctx.oInit.formEdit.detailForm.buttonSaveContinue.actionType = actionType;\n      buttonContinue.off('click');\n      buttonContinue.on('click', function () {\n        //Funcion de validacion\n        if (actionType === 'PUT') {\n          var customModificar = ctx.oInit.validarModificarContinuar;\n\n          if (typeof customModificar === \"function\" && customModificar(ctx)) {\n            return false;\n          }\n        } else if (actionType === 'POST') {\n          var customAlta = ctx.oInit.validarAltaContinuar;\n\n          if (typeof customAlta === \"function\" && customAlta(ctx)) {\n            return false;\n          }\n        }\n\n        var actionSaveContinue = ctx.oInit.formEdit.detailForm.buttonSaveContinue.actionType; // Comprobar si row ha sido modificada\n        // Se serializa el formulario con los cambios\n\n        row = _editFormSerialize(idForm, ctx.oInit.formEdit.serializerSplitter); // Se transforma\n\n        row = $.rup_utils.queryStringToJson(row, ctx.oInit.formEdit.serializerSplitter, ctx.oInit.formEdit.allowAllCharacters); //listas checkbox\n\n        row = _addListType(idForm, row);\n\n        if (actionType === 'PUT') {\n          //Solo al modificar\n          $.each(ctx.oInit.primaryKey, function (index, key) {\n            row[key] = ctx.json.rows[idRow][key];\n          });\n        }\n\n        var idTableDetail = ctx.oInit.formEdit.detailForm; // Muestra un feedback de error por caracter ilegal\n\n        if (!row) {\n          ctx.oInit.formEdit.okCallBack = false;\n\n          var _feed2 = idTableDetail.find('#' + ctx.sTableId + '_detail_feedback');\n\n          var _divErrorFeedback2 = _feed2;\n\n          if (_divErrorFeedback2.length === 0) {\n            _divErrorFeedback2 = $('<div></div>').attr('id', _feed2[0].id + '_ok').insertBefore(_feed2);\n\n            _divErrorFeedback2.rup_feedback(ctx.oInit.feedback);\n          }\n\n          _callFeedbackOk(ctx, _divErrorFeedback2, $.rup.i18nParse($.rup.i18n.base, 'rup_global.charError'), 'error');\n\n          $('#' + ctx.sTableId).triggerHandler('tableEditFormErrorCallSaveAjaxNotRow', ctx);\n        } else {\n          var url = actionType == 'POST' ? '/add' : '/edit'; // Comprobar si se ha definido otra URL en las propiedades, en caso afirmativo, se aplica.\n\n          var property = url.substring(1) + 'Url';\n\n          if (ctx.oInit.formEdit[property]) {\n            url = ctx.oInit.formEdit[property];\n          }\n\n          _callSaveAjax(actionSaveContinue, dt, row, idRow, true, idTableDetail, url, false);\n        }\n\n        $('#' + ctx.sTableId).triggerHandler('tableButtonSaveContinue', ctx);\n      });\n      $('#' + ctx.sTableId).triggerHandler('tableEditFormAddEditAfterShowForm', ctx);\n      return loadPromise;\n    });\n  };\n  /**\r\n   * Llamada al servidor con los datos de edición.\r\n   *\r\n   * @name _callSaveAjax\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {string} actionType - Es la acción que se va a ajecutar en el formulario para ir al controller, basado en rest.\r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {object} row - Son los datos que se cargan.\r\n   * @param {integer} idRow - Número con la posición de la fila que hay que obtener.\r\n   * @param {boolean} continuar - Si es true guarda la pagina y se queda en el dialog , si es false guarda y cierra el dialog.\r\n   * @param {string} idTableDetail - Identificdor del detail de la table.\r\n   * @param {string} url - Url que se añade para llamar  al controller.\r\n   * @param {boolean} isDeleting - Evita mostrar el diálogo de confirmación porque la función _deleteAllSelects() tiene el suyo propio.\r\n   *\r\n   */\n\n\n  function _callSaveAjax(actionType, dt, row, idRow, continuar, idTableDetail, url, isDeleting) {\n    var ctx = dt.settings()[0];\n\n    var _makeAjaxCall = function _makeAjaxCall() {\n      $('#' + ctx.sTableId).triggerHandler('tableEditFormBeforeCallAjax', [ctx, actionType, url]); // Añadir filtro\n\n      var feed = idTableDetail.find('#' + ctx.sTableId + '_detail_feedback');\n      var msgFeedBack = $.rup.i18nParse($.rup.i18n.base, 'rup_table.modifyOK');\n      var validaciones = ctx.oInit.formEdit.validate;\n\n      if (url === '/deleteAll' || actionType === 'DELETE') {\n        msgFeedBack = $.rup.i18nParse($.rup.i18n.base, 'rup_table.deletedOK');\n\n        if (validaciones !== undefined) {\n          validaciones.rules = {};\n        }\n      }\n\n      if (ctx.oInit.masterDetail !== undefined) {\n        //Asegurar que se recoge el idPadre\n        var masterPkObject = DataTable.Api().masterDetail.getMasterTablePkObject(ctx);\n        $('#' + ctx.sTableId + '_detail_masterPK').val($('#' + ctx.sTableId + '_filter_masterPK').val());\n        row = jQuery.extend(true, row, masterPkObject);\n      }\n\n      if (ctx.oInit.formEdit.multiPart) {\n        //si es multiPart el row se coje solo.\n        row = {};\n      }\n\n      var ajaxOptions = {\n        url: ctx.oInit.urlBase + url,\n        accepts: {\n          '*': '*/*',\n          'html': 'text/html',\n          'json': 'application/json, text/javascript',\n          'script': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript',\n          'text': 'text/plain',\n          'xml': 'application/xml, text/xml'\n        },\n        type: actionType,\n        data: row,\n        dataType: 'json',\n        showLoading: false,\n        contentType: 'application/json',\n        async: true,\n        success: function success(valor) {\n          ctx.oInit.formEdit.okCallBack = true;\n          ctx.oInit.formEdit.lastValue = valor;\n\n          if (url !== '/deleteAll' && actionType !== 'DELETE') {\n            if (continuar) {\n              //Se crea un feedback_ok, para que no se pise con el de los errores\n              var divOkFeedback = idTableDetail.find('#' + feed[0].id + '_ok');\n\n              if (divOkFeedback.length === 0) {\n                divOkFeedback = $('<div></div>').attr('id', feed[0].id + '_ok').insertBefore(feed);\n                divOkFeedback.rup_feedback(ctx.oInit.feedback);\n              }\n\n              _callFeedbackOk(ctx, divOkFeedback, msgFeedBack, 'ok'); //Se informa, feedback del formulario\n\n            } else {\n              ctx.oInit.formEdit.detailForm.rup_dialog('close');\n\n              _callFeedbackOk(ctx, ctx.oInit.feedback.$feedbackContainer, msgFeedBack, 'ok'); //Se informa feedback de la tabla\n\n            }\n\n            if (actionType === 'PUT') {\n              //Modificar\n              // Sobrescribir valores anteriores con los recibidos desde el servidor\n              row = $.extend({}, row, valor);\n              dt.row(idRow).data(row); // se actualiza al editar\n\n              ctx.json.rows[idRow] = row; // Actualizamos el ultimo id seleccionado (por si ha sido editado)\n\n              var posicion = 0;\n              $.each(ctx.multiselection.selectedRowsPerPage, function (index, p) {\n                if (p.id == ctx.multiselection.lastSelectedId) {\n                  posicion = index;\n                  return;\n                }\n              });\n\n              if (ctx.seeker !== undefined && ctx.seeker.ajaxOption.data !== undefined && ctx.seeker.ajaxOption.data.search !== undefined && ctx.seeker.search.funcionParams !== undefined && ctx.seeker.search.funcionParams.length > 0) {\n                _comprobarSeeker(row, ctx, idRow);\n              }\n\n              ctx.multiselection.lastSelectedId = DataTable.Api().rupTable.getIdPk(row, ctx.oInit);\n              ctx.multiselection.selectedRowsPerPage[posicion].id = DataTable.Api().rupTable.getIdPk(row, ctx.oInit);\n              ctx.oInit.feedback.type = undefined; //se recarga el type no esta definido.\n            } else {\n              // Asegura a cargar los nuevos IDS.\n              $.each(ctx.oInit.primaryKey, function (index, key) {\n                var posibleId = row[key]; // Comprueba si la primaryKey es un subcampo\n\n                if (key.indexOf('.') !== -1) {\n                  row[key] = DataTable.Api().rupTable.getDescendantProperty(valor, key);\n                } else {\n                  row[key] = valor[key];\n                }\n\n                if (row[key] === undefined) {\n                  row[key] = posibleId;\n                }\n              }); // Se actualiza la tabla temporalmente. y deja de ser post para pasar a put(edicion)\n\n              if (ctx.oInit.select !== undefined) {\n                DataTable.Api().select.deselect(ctx);\n              }\n\n              var rowAux = row;\n\n              if (ctx.json !== undefined) {\n                $.each(ctx.json.rows, function (index, r) {\n                  var rowNext = r;\n                  dt.row(index).data(rowAux);\n                  rowAux = rowNext;\n                });\n                ctx.json.rows.pop();\n                ctx.json.rows.splice(0, 0, row);\n              } else {\n                //es el primer registro\n                dt.row.add(rowAux).draw(false);\n                ctx.json = {};\n                ctx.json.rows = [];\n                ctx.json.rows.push(rowAux);\n              } // Se guardan los datos para pasar de nuevo a editable.\n\n\n              if (ctx.oInit.formEdit.saveContinueEdit) {\n                ctx.oInit.formEdit.detailForm.buttonSaveContinue.actionType = 'PUT';\n                DataTable.Api().rupTable.blockPKEdit(ctx, 'PUT');\n              } else {\n                //mantener y borrar\n                ctx.oInit.formEdit.idForm.resetForm();\n              }\n\n              ctx.oInit.formEdit.dataOrigin = _editFormSerialize(ctx.oInit.formEdit.idForm, ctx.oInit.formEdit.serializerSplitter);\n\n              if (ctx.oInit.multiSelect !== undefined) {\n                ctx.oInit.feedback.type = 'noBorrar';\n                dt.row().multiSelect();\n              } // Se actualiza la linea\n\n\n              if (ctx.json.reorderedSelection !== null && ctx.json.reorderedSelection !== undefined) {\n                try {\n                  ctx.multiselection.selectedRowsPerPage[0].line = ctx.json.reorderedSelection[0].pageLine;\n                } catch (err) {\n                  console.log(err.message);\n                }\n              }\n              /* \r\n               * Filtrar para colocar cada registro en su lugar correspondiente. \r\n               * Si no se filtra, aparece un error visual en la selección de registros y otro en el paginador del formulario de edición.\r\n               */\n\n\n              dt.ajax.reload();\n              $('#' + ctx.sTableId).triggerHandler('tableEditFormAfterInsertRow', actionType, ctx);\n            }\n\n            if (actionType === 'PUT') {\n              dt.ajax.reload(function () {\n                $('#' + ctx.sTableId).trigger('tableEditFormSuccessCallSaveAjax', actionType, ctx);\n              }, false);\n            } else {\n              if (ctx.oInit.multiSelect === undefined) {\n                var arra = {\n                  id: DataTable.Api().rupTable.getIdPk(row, ctx.oInit),\n                  page: Number(ctx.json.page),\n                  line: 0\n                };\n                ctx.multiselection.selectedRowsPerPage[0] = arra;\n                DataTable.Api().select.drawSelectId(ctx);\n              }\n\n              $('#' + ctx.sTableId).trigger('tableAddFormSuccessCallSaveAjax', actionType, ctx);\n            }\n          } else {\n            // Eliminar\n            ctx.oInit.feedback.type = 'eliminar';\n            ctx.oInit.feedback.msgFeedBack = msgFeedBack;\n\n            if (ctx.oInit.multiSelect !== undefined) {\n              dt.ajax.reload(function () {\n                $('#' + ctx.sTableId).trigger('tableEditFormSuccessCallSaveAjax', actionType, ctx);\n                DataTable.Api().multiSelect.deselectAll(dt);\n              }, false);\n            } else if (ctx.oInit.select !== undefined) {\n              dt.ajax.reload(function () {\n                $('#' + ctx.sTableId).trigger('tableEditFormSuccessCallSaveAjax', actionType, ctx);\n                DataTable.Api().select.deselect(ctx);\n              }, false);\n            }\n\n            _callFeedbackOk(ctx, ctx.oInit.feedback.$feedbackContainer, msgFeedBack, 'ok'); //Se informa feedback de la tabla\n\n          }\n        },\n        complete: function complete() {\n          $('#' + ctx.sTableId).triggerHandler('tableEditFormCompleteCallSaveAjax', actionType, ctx);\n        },\n        error: function error(xhr) {\n          var divErrorFeedback; // Si es una petición de tipo DELETE o no existe la referencia al feedback de editForm, el feedback utilizado será el de la tabla, en los demás casos, se usará el del editForm.\n\n          if (actionType === 'DELETE' || feed[0] == undefined) {\n            divErrorFeedback = ctx.oInit.feedback.$feedbackContainer;\n          } else {\n            divErrorFeedback = idTableDetail.find('#' + feed[0].id + '_ok');\n          }\n\n          if (divErrorFeedback.length === 0) {\n            divErrorFeedback = $('<div></div>').attr('id', feed[0].id + '_ok').insertBefore(feed);\n            divErrorFeedback.rup_feedback(ctx.oInit.feedback);\n          }\n\n          if (xhr.status === 406 && xhr.responseText !== '') {\n            try {\n              var responseJSON = JSON.parse(xhr.responseText);\n\n              if (responseJSON.rupErrorFields) {\n                if (responseJSON.rupErrorFields !== undefined || responseJSON.rupFeedback !== undefined) {\n                  var $form = ctx.oInit.formEdit.idForm;\n                  $form.validate().submitted = $.extend(true, $form.validate().submitted, responseJSON.rupErrorFields);\n                  $form.validate().invalid = responseJSON.rupErrorFields;\n                  $form.validate().showErrors(responseJSON.rupErrorFields);\n                } else if (errors.rupFeedback !== undefined) {\n                  var mensajeJSON = $.rup_utils.printMsg(responseJSON.rupFeedback.message);\n\n                  _callFeedbackOk(ctx, divErrorFeedback, mensajeJSON, 'error');\n                }\n              }\n            } catch (e) {\n              // El mensaje NO es JSON\n              _callFeedbackOk(ctx, divErrorFeedback, xhr.responseText, 'error');\n            }\n          } else {\n            //cualquier error se devuelve el texto\n            _callFeedbackOk(ctx, divErrorFeedback, xhr.responseText, 'error');\n          }\n\n          $('#' + ctx.sTableId).triggerHandler('tableEditFormErrorCallSaveAjax', actionType, ctx);\n        },\n        validate: validaciones,\n        feedback: feed.rup_feedback({\n          type: 'error',\n          block: false\n        })\n      }; // Se cambia el data\n\n      if (ajaxOptions.data == '') {\n        delete ajaxOptions.data;\n        $.rup_ajax(ajaxOptions);\n      } else if (isDeleting || ctx.oInit.formEdit.idForm.valid()) {\n        // Obtener el valor del parámetro HDIV_STATE (en caso de no estar disponible se devolverá vacío) siempre y cuando no se trate de un deleteAll porque en ese caso ya lo contiene el filtro\n        if (url.indexOf('deleteAll') === -1) {\n          // Elimina los campos _label generados por los autocompletes que no forman parte de la entidad\n          $.fn.deleteAutocompleteLabelFromObject(ajaxOptions.data); // Elimina los campos autogenerados por los multicombos que no forman parte de la entidad\n\n          $.fn.deleteMulticomboLabelFromObject(ajaxOptions.data, ctx.oInit.formEdit.detailForm);\n          var hdivStateParamValue = $.fn.getHDIV_STATE(undefined, ctx.oInit.formEdit.idForm);\n\n          if (hdivStateParamValue !== '') {\n            ajaxOptions.data._HDIV_STATE_ = hdivStateParamValue;\n          }\n        }\n\n        ajaxOptions.data = JSON.stringify(ajaxOptions.data);\n        $.rup_ajax(ajaxOptions);\n      }\n    };\n\n    if (ctx.oInit.formEdit.detailForm.settings.saveDialog && !isDeleting) {\n      $.rup_messages('msgConfirm', {\n        title: actionType == 'POST' ? $.rup.i18nParse($.rup.i18n.base, 'rup_table.add.save') : $.rup.i18nParse($.rup.i18n.base, 'rup_table.edit.save'),\n        message: actionType == 'POST' ? $.rup.i18nParse($.rup.i18n.base, 'rup_table.add.saveData') : $.rup.i18nParse($.rup.i18n.base, 'rup_table.edit.saveData'),\n        OKFunction: function OKFunction() {\n          _makeAjaxCall();\n\n          $('#' + ctx.sTableId).triggerHandler('tableMessageOk', ctx);\n        },\n        CANCELFunction: function CANCELFunction() {\n          $('#' + ctx.sTableId).triggerHandler('tableMessageCancel', ctx);\n        },\n        CLOSEFunction: function CLOSEFunction() {\n          $('#' + ctx.sTableId).triggerHandler('tableMessageClose', ctx);\n        }\n      });\n    } else {\n      _makeAjaxCall();\n    }\n  }\n  /**\r\n   * Llamada para crear el feedback dentro del dialog.\r\n   *\r\n   * @name callFeedbackOk\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {object} feedback - Div donde se va ejecutar el feedback.\r\n   * @param {string} msgFeedBack - Mensaje para el feedback.\r\n   * @param {string} type - Tipos del feedback, mirar en el rup.feedback..\r\n   *\r\n   */\n\n\n  function _callFeedbackOk(ctx, feedback, msgFeedBack, type) {\n    if (ctx.oInit.formEdit.disabledFeedback) {\n      //no muestra el feedback\n      return false;\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableEditFormFeedbackShow', ctx);\n    feedback.rup_feedback('set', msgFeedBack, type);\n    feedback.rup_feedback('show');\n  }\n  /**\r\n   * Se añade el tipo de la lista.\r\n   *\r\n   * @name addListType\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   *\r\n   * @param {object} idForm - Identificador del formulario.\r\n   * @param {string} row - Values ya añadidos al formulario.\r\n   *\r\n   */\n\n\n  function _addListType(idForm, row) {\n    //Listas de checkbox\n    $.each(idForm.find('[data-lista]'), function () {\n      var name = this.dataset.lista;\n      var prop = '';\n      var propSplit = this.name.split(\".\");\n\n      if (propSplit !== undefined && propSplit.length === 2) {\n        prop = propSplit[1];\n      }\n\n      if (row[name] === undefined || !Array.isArray(row[name])) {\n        //si no existe se crea o // si no es de tipo array\n        row[name] = [];\n      }\n\n      var array = {};\n\n      if (prop !== undefined) {\n        var clave = this.dataset.clave;\n\n        if (clave !== undefined) {\n          //si tiene clave es porque es objeto\n          var label = this.dataset.valor; //se manda el valor id.\n\n          array[clave] = label;\n          array[prop] = $(this).is(':checked');\n        } else {\n          //si no tiene clave es porque es string\n          array = $(this).is(':checked');\n        }\n\n        row[name].push(array);\n      }\n    }); //Se buscan los array para que sean listas.combos con multiselect\n\n    $.each(row, function (name) {\n      if (this !== undefined && this.toString() === '[object Object]') {\n        if ($.rup_utils.isNumeric(Object.keys(this)[0])) {\n          //se asegura, que no es una lista de objetos.\n          row[name] = Object.values(this);\n        }\n      }\n    });\n    return row;\n  }\n  /**\r\n   * Actualiza la navegación del dialogo.\r\n   *\r\n   * @name updateDetailPagination\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {integer} currentRowNum - Número de la posición actual del registro selecionado.\r\n   * @param {integer} totalRowNum - Número total de registros seleccionados.\r\n   *\r\n   */\n\n\n  function _updateDetailPagination(ctx, currentRowNum, totalRowNum) {\n    var tableId = ctx.oInit.formEdit.$navigationBar[0].id;\n\n    if (currentRowNum === 1 || currentRowNum === totalRowNum) {\n      var focusedElement = document.activeElement; // Eliminar foco del elemento porque va a ser deshabilitado a continuación\n\n      if ($(ctx.oInit.formEdit.detailForm).find(focusedElement).length > 0) {\n        focusedElement.blur();\n      }\n    }\n\n    if (currentRowNum === 1) {\n      $('#first_' + tableId + ', #back_' + tableId, ctx.oInit.formEdit.detailForm).prop('disabled', true);\n    } else {\n      $('#first_' + tableId + ', #back_' + tableId, ctx.oInit.formEdit.detailForm).prop('disabled', false);\n    }\n\n    if (currentRowNum === totalRowNum) {\n      $('#forward_' + tableId + ', #last_' + tableId, ctx.oInit.formEdit.detailForm).prop('disabled', true);\n    } else {\n      $('#forward_' + tableId + ', #last_' + tableId, ctx.oInit.formEdit.detailForm).prop('disabled', false);\n    }\n\n    $('#rup_table_selectedElements_' + tableId).text($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.defaults.detailForm_pager'), currentRowNum, totalRowNum));\n  }\n  /**\r\n   * Constructor de la barra de navegación.\r\n   *\r\n   * @name callNavigatorBar\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n\n  function _callNavigationBar(dt) {\n    var ctx = dt.settings()[0];\n    ctx.oInit._ADAPTER = $.rup.adapter[jQuery.fn.rup_table.defaults.adapter];\n    ctx.oInit.formEdit.$navigationBar = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_navigation');\n    var settings = {}; // Funcion para obtener los parametros de navegacion.\n\n    settings.fncGetNavigationParams = function getNavigationParams_multiselection(linkType) {\n      var execute = false,\n          changePage = false,\n          index = 0,\n          newPageIndex = 0,\n          npos = ctx.oInit.formEdit.$navigationBar.currentPos,\n          page = dt.page() + 1,\n          newPage = page,\n          lastPage = ctx.json.total;\n      var multiselection = ctx.multiselection;\n      var rowSelected;\n\n      switch (linkType) {\n        case 'first':\n          // Si no se han seleccionado todos los elementos\n          if (!multiselection.selectedAll) {\n            rowSelected = multiselection.selectedRowsPerPage[0];\n            rowSelected.indexSelected = 0;\n          } else {\n            // En el caso de que se hayan seleccionado todos los elementos de la tabla\n            // Recorremos las páginas buscando la primera en la que existan elementos seleccionados\n            ctx.oInit.formEdit.$navigationBar.numPosition = 0;\n            rowSelected = ctx.oInit.formEdit.$navigationBar.currentPos;\n            rowSelected.page = _getNextPageSelected(ctx, 1, 'next');\n\n            if (Number(rowSelected.page) === page) {\n              //Si es la misma pagina.buscar la linea\n              rowSelected.line = _getLineByPageSelected(ctx, -1);\n            } else {\n              rowSelected.line = 0; // luego hay que buscar la linea\n            }\n          }\n\n          break;\n\n        case 'prev':\n          // Si no se han seleccionado todos los elementos\n          if (!multiselection.selectedAll) {\n            var indexPrev = ctx.oInit.formEdit.$navigationBar.currentPos.indexSelected - 1;\n            rowSelected = multiselection.selectedRowsPerPage[indexPrev];\n            rowSelected.indexSelected = indexPrev;\n          } else {\n            ctx.oInit.formEdit.$navigationBar.numPosition--;\n\n            var linea = _getLineByPageSelectedReverse(ctx, ctx.oInit.formEdit.$navigationBar.currentPos.line);\n\n            if (linea === -1) {\n              //Es que hay que cambiar de pagina.\n              //buscarPAgina.\n              rowSelected = ctx.oInit.formEdit.$navigationBar.currentPos;\n              rowSelected.page = _getPrevPageSelected(ctx, page - 1);\n            } else {\n              rowSelected = ctx.oInit.formEdit.$navigationBar.currentPos;\n            }\n          }\n\n          break;\n\n        case 'next':\n          // Si no se han seleccionado todos los elementos\n          if (!multiselection.selectedAll) {\n            var indexNext = ctx.oInit.formEdit.$navigationBar.currentPos.indexSelected + 1;\n            rowSelected = multiselection.selectedRowsPerPage[indexNext];\n            rowSelected.indexSelected = indexNext;\n          } else {\n            ctx.oInit.formEdit.$navigationBar.numPosition++; //2 casos: Si hay que navegar o no.\n\n            var lineaNext = _getLineByPageSelected(ctx, ctx.oInit.formEdit.$navigationBar.currentPos.line);\n\n            if (lineaNext === -1) {\n              //Es que hay que cambiar de pagina.\n              //buscarPAgina.\n              rowSelected = ctx.oInit.formEdit.$navigationBar.currentPos;\n              rowSelected.page = _getNextPageSelected(ctx, page + 1, 'next');\n              rowSelected.line = 0; // luego hay que buscar la linea\n            } else {\n              rowSelected = ctx.oInit.formEdit.$navigationBar.currentPos;\n            }\n          }\n\n          break;\n\n        case 'last':\n          // Si no se han seleccionado todos los elementos\n          if (!multiselection.selectedAll) {\n            var indexLast = multiselection.selectedRowsPerPage.length - 1;\n            rowSelected = multiselection.selectedRowsPerPage[indexLast];\n            rowSelected.indexSelected = indexLast;\n          } else {\n            ctx.oInit.formEdit.$navigationBar.numPosition = ctx.multiselection.numSelected - 1;\n            rowSelected = ctx.oInit.formEdit.$navigationBar.currentPos;\n            rowSelected.page = _getPrevPageSelected(ctx, lastPage);\n\n            if (Number(rowSelected.page) === page) {\n              //Si es la misma pagina.buscar la linea\n              rowSelected.line = _getLineByPageSelectedReverse(ctx, ctx.aBaseJson.length);\n            }\n          }\n\n      }\n\n      _hideOnNav(dt, linkType, function () {\n        var tableId = ctx.sTableId;\n\n        if (Number(rowSelected.page) !== page) {\n          var table = $('#' + tableId).DataTable(); // Ejecutar _fixComboAutocompleteOnEditForm como callback para garantizar la actualización de las filas.\n\n          table.on('draw', function (event, ctx) {\n            _fixComboAutocompleteOnEditForm(ctx);\n          });\n          table.page(rowSelected.page - 1).draw('page'); // Se añaden los parámetros para luego ejecutar la función del dialog\n\n          ctx.oInit.formEdit.$navigationBar.funcionParams = ['PUT', dt, rowSelected.line, linkType];\n        } else {\n          // Llamar directamente a la función\n          $.when(DataTable.editForm.fnOpenSaveDialog('PUT', dt, rowSelected.line, ctx.oInit.formEdit.customTitle)).then(function () {\n            _showOnNav(dt, linkType);\n          }); // Solventar problemas de los componentes combo y autocomplete en los formularios de edición.\n\n          _fixComboAutocompleteOnEditForm(ctx);\n        }\n\n        $('#first_' + tableId + '_detail_navigation' + ', #back_' + tableId + '_detail_navigation' + ', #forward_' + tableId + '_detail_navigation' + ', #last_' + tableId + '_detail_navigation', ctx.oInit.formEdit.detailForm).prop('disabled', true);\n      }); // Actualizar la última posición movida\n\n\n      ctx.oInit.formEdit.$navigationBar.currentPos = rowSelected;\n      return [linkType, execute, changePage, index - 1, npos, newPage, newPageIndex - 1];\n    };\n\n    ctx.oInit.formEdit.$navigationBar.data('settings', settings);\n\n    var barraNavegacion = ctx.oInit._ADAPTER.createDetailNavigation.bind(ctx.oInit.formEdit.$navigationBar);\n\n    ctx.oInit.formEdit.$navigationBar.append(barraNavegacion);\n  }\n\n  function _fixComboAutocompleteOnEditForm(ctx) {\n    // Solventar problemas de los componentes combo y autocomplete en los formularios de edición.\n    if (ctx.oInit.colModel !== undefined) {\n      $.each(ctx.oInit.colModel, function (key, column) {\n        if (column.editable) {\n          if (column.rupType === 'combo') {\n            // Realizar una limpieza total para asegurar un buen funcionamiento.\n            ctx.oInit.formEdit.idForm.find('[name=\"' + column.name + '\"]')['rup_combo']('hardReset');\n          } else if (column.rupType === 'autocomplete') {\n            // Establecer el valor por defecto del componente.\n            var newDefaultValue = ctx.json.rows.find(function (row) {\n              return $.fn.getStaticHdivID(row.id) === $.fn.getStaticHdivID(ctx.oInit.formEdit.$navigationBar.currentPos.id);\n            })[column.name];\n            column.editoptions.defaultValue = newDefaultValue;\n            ctx.oInit.formEdit.idForm.find('[name=\"' + column.name + '\"]').data('rup.autocomplete').$labelField.data('settings').defaultValue = newDefaultValue;\n          }\n        }\n      });\n    }\n  }\n\n  function _hideOnNav(dt, linkType, callback) {\n    var ctx = dt.settings()[0];\n    var direction = linkType === 'prev' || linkType === 'first' ? 'right' : 'left';\n    var $dialogContent = $('#' + ctx.sTableId + '_detail_div .dialog-content-material');\n    $dialogContent.parent().css('overflow-x', 'hidden');\n    $dialogContent.hide('slide', {\n      direction: direction\n    }, 100, function () {\n      $dialogContent.after('<span id=\"' + ctx.sTableId + '_detail_div_loading\" class=\"d-flex font-size-5rem\"><i class=\"mx-auto mdi mdi-spin mdi-loading\" aria-hidden=\"true\"></i></span>');\n      callback();\n    });\n  }\n\n  function _showOnNav(dt, linkType) {\n    var ctx = dt.settings()[0];\n    var direction = linkType === 'prev' || linkType === 'first' ? 'left' : 'right';\n    var $dialogContent = $('#' + ctx.sTableId + '_detail_div .dialog-content-material');\n    $('#' + ctx.sTableId + '_detail_div_loading').remove();\n    $dialogContent.show('slide', {\n      direction: direction\n    }, 100, function () {\n      $dialogContent.parent().css('overflow-x', 'auto');\n    });\n  }\n  /**\r\n   * Constructor de la barra de navegación.\r\n   *\r\n   * @name callNavigatorSelectBar\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n\n  function _callNavigationSelectBar(dt) {\n    var ctx = dt.settings()[0];\n    ctx.oInit._ADAPTER = $.rup.adapter[jQuery.fn.rup_table.defaults.adapter];\n    ctx.oInit.formEdit.$navigationBar = ctx.oInit.formEdit.detailForm.find('#' + ctx.sTableId + '_detail_navigation');\n    var settings = {}; // Funcion para obtener los parametros de navegacion.\n\n    settings.fncGetNavigationParams = function getNavigationParams_multiselection(linkType) {\n      var execute = false,\n          changePage = false,\n          index = 0,\n          newPageIndex = 0,\n          npos = ctx.oInit.formEdit.$navigationBar.currentPos,\n          page = dt.page() + 1,\n          newPage = page,\n          lastPage = ctx.json.total;\n      var futurePage = page;\n\n      switch (linkType) {\n        case 'first':\n          futurePage = 1;\n          ctx.multiselection.selectedRowsPerPage[0].line = 0;\n          break;\n\n        case 'prev':\n          ctx.multiselection.selectedRowsPerPage[0].line = ctx.multiselection.selectedRowsPerPage[0].line - 1;\n\n          if (ctx.json.rows[ctx.multiselection.selectedRowsPerPage[0].line] === undefined) {\n            futurePage = futurePage - 1;\n          }\n\n          break;\n\n        case 'next':\n          ctx.multiselection.selectedRowsPerPage[0].line = ctx.multiselection.selectedRowsPerPage[0].line + 1;\n\n          if (ctx.json.rows[ctx.multiselection.selectedRowsPerPage[0].line] === undefined) {\n            futurePage = futurePage + 1;\n          }\n\n          break;\n\n        case 'last':\n          futurePage = lastPage;\n          ctx.multiselection.selectedRowsPerPage[0].line = ctx.json.rows.length - 1;\n      } // Cambio de pagina\n\n\n      if (Number(futurePage) !== page) {\n        var table = $('#' + ctx.sTableId).DataTable();\n        ctx.select.selectedRowsPerPage = {};\n        ctx.select.selectedRowsPerPage.cambio = linkType;\n        ctx.select.selectedRowsPerPage.page = futurePage;\n        table.page(futurePage - 1).draw('page');\n      } else {\n        //Si no se pagina se abre directamente la funcion.\n        DataTable.editForm.fnOpenSaveDialog('PUT', dt, ctx.multiselection.selectedRowsPerPage[0].line, ctx.oInit.formEdit.customTitle);\n        var rowSelectAux = ctx.json.rows[ctx.multiselection.selectedRowsPerPage[0].line];\n        ctx.multiselection.selectedRowsPerPage[0].id = DataTable.Api().rupTable.getIdPk(rowSelectAux, ctx.oInit);\n        DataTable.Api().select.selectRowIndex(dt, ctx.multiselection.selectedRowsPerPage[0].line, false);\n      } //Se actualiza la ultima posicion movida.\n      //ctx.oInit.formEdit.$navigationBar.currentPos = rowSelected;\n\n\n      var tableId = ctx.sTableId;\n      $('#first_' + tableId + '_detail_navigation' + ', #back_' + tableId + '_detail_navigation' + ', #forward_' + tableId + '_detail_navigation' + ', #last_' + tableId + '_detail_navigation', ctx.oInit.formEdit.detailForm).prop('disabled', true);\n      return [linkType, execute, changePage, index - 1, npos, newPage, newPageIndex - 1];\n    };\n\n    ctx.oInit.formEdit.$navigationBar.data('settings', settings);\n\n    var barraNavegacion = ctx.oInit._ADAPTER.createDetailNavigation.bind(ctx.oInit.formEdit.$navigationBar);\n\n    ctx.oInit.formEdit.$navigationBar.append(barraNavegacion);\n  }\n  /**\r\n   * Método que obtiene la fila siguiente seleccionada.\r\n   *\r\n   * @name getRowSelected\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Instancia de la tabla.\r\n   * @param {string} actionType - Acción a ajecutar en el formulario para ir al controller, basado en REST.\r\n   *\r\n   * @return {object} Contiene el identificador, la página y la línea de la fila seleccionada.\r\n   *\r\n   */\n\n\n  function _getRowSelected(dt, actionType) {\n    var ctx = dt.settings()[0];\n    var rowDefault = {\n      id: 0,\n      page: 1,\n      line: 0\n    };\n    var lastSelectedId = ctx.multiselection.lastSelectedId;\n\n    if (!ctx.multiselection.selectedAll) {\n      $.each(ctx.multiselection.selectedRowsPerPage, function (index, p) {\n        if (p.id == ctx.multiselection.lastSelectedId) {\n          rowDefault.id = p.id;\n          rowDefault.page = p.page;\n          rowDefault.line = p.line;\n          rowDefault.indexSelected = index;\n\n          if (ctx.oInit.formEdit !== undefined) {\n            ctx.oInit.formEdit.$navigationBar.currentPos = rowDefault;\n          }\n\n          return false;\n        }\n      });\n    } else {\n      if (ctx.oInit.formEdit !== undefined) {\n        // Indica los mostrados cuando es selectAll y no se puede calcular. El inicio es 0.\n        ctx.oInit.formEdit.$navigationBar.numPosition = 0;\n      }\n\n      if (lastSelectedId === undefined || lastSelectedId === '') {\n        // Como arranca de primeras, la página es la 1\n        rowDefault.page = _getNextPageSelected(ctx, 1, 'next');\n        rowDefault.line = _getLineByPageSelected(ctx, -1);\n      } else {\n        // Buscar la posición y la página\n        var result = $.grep(ctx.multiselection.selectedRowsPerPage, function (v) {\n          return v.id == ctx.multiselection.lastSelectedId;\n        });\n        rowDefault.page = result[0].page;\n        rowDefault.line = result[0].line;\n        var index = ctx._iDisplayLength * (Number(rowDefault.page) - 1);\n        index = index + 1 + rowDefault.line; // Restar los deselecionados\n\n        result = $.grep(ctx.multiselection.deselectedRowsPerPage, function (v) {\n          return Number(v.page) < Number(rowDefault.page) || Number(rowDefault.page) === Number(v.page) && Number(v.line) < Number(rowDefault.line);\n        }); // Buscar índice\n\n        rowDefault.indexSelected = index - result.length;\n\n        if (ctx.oInit.formEdit !== undefined) {\n          ctx.oInit.formEdit.$navigationBar.numPosition = rowDefault.indexSelected - 1;\n        }\n      }\n\n      if (ctx.oInit.formEdit !== undefined) {\n        ctx.oInit.formEdit.$navigationBar.currentPos = rowDefault;\n      }\n    } // En caso de estar en una página distinta, navegamos a ella\n\n\n    if (dt.page() + 1 !== Number(rowDefault.page)) {\n      var pageActual = dt.page() + 1;\n      var table = $('#' + ctx.sTableId).DataTable();\n      table.page(rowDefault.page - 1).draw('page');\n\n      if (ctx.oInit.formEdit !== undefined) {\n        ctx.oInit.formEdit.$navigationBar.funcionParams = [actionType, dt, rowDefault.line, undefined, pageActual];\n      }\n    }\n\n    return rowDefault;\n  }\n  /**\r\n   * Metodo que obtiene la página siguiente donde esta el primer elemento o elemento seleccionado.\r\n   *\r\n   * @name getNextPageSelected\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {integer} pageInit - Página a partir de la cual hay que mirar, en general serà la 1.\r\n   * @param {string} orden - Pueder ser pre o next, en función de si necesitar ir hacia adelante o hacia atrás.\r\n   *\r\n   * @return integer - devuelve la página\r\n   *\r\n   */\n\n\n  function _getNextPageSelected(ctx, pageInit, orden) {\n    var pagina = pageInit;\n    var pageTotals = ctx.json.total;\n\n    if (orden === 'prev') {\n      //Si es previo se resta.\n      pageTotals = 1;\n    }\n\n    if (ctx.multiselection.deselectedRowsPerPage.length > 0) {\n      var maxPagina = ctx.json.rows.length;\n      var count = 0; //Buscar la pagina donde va estar el seleccionado.\n\n      for (var page = pageInit; page < pageTotals;) {\n        $.each(ctx.multiselection.deselectedRowsPerPage, function (index, p) {\n          if (page === Number(p.page)) {\n            count++;\n          }\n\n          if (count === maxPagina) {\n            return false;\n          }\n        });\n\n        if (count < maxPagina) {\n          pagina = page;\n          page = ctx.json.total; //Se pone el total para salir del bucle.\n        }\n\n        count = 0;\n\n        if (orden === 'next') {\n          page++;\n        } else if (orden === 'prev') {\n          page--;\n        }\n      }\n    }\n\n    return pagina;\n  }\n  /**\r\n   * Metodo que obtiene la página siguiente donde esta el primer elemento o elemento seleccionado.\r\n   *\r\n   * @name getPrevPageSelected\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {integer} pageInit - Página a partir de la cual hay que mirar, en general serà la 1.\r\n   *\r\n   * @return integer - devuele la página\r\n   *\r\n   */\n\n\n  function _getPrevPageSelected(ctx, pageInit) {\n    var pagina = pageInit;\n    var pageTotals = 1;\n\n    if (ctx.multiselection.deselectedRowsPerPage.length > 0) {\n      var maxPagina = ctx.json.rows.length;\n\n      if (ctx.json.total === pagina) {\n        //Es ultima pagina, calcular los registros{\n        maxPagina = ctx.json.records % ctx._iDisplayLength;\n      }\n\n      var count = 0; //Buscar la pagina donde va estar el seleccionado.\n\n      for (var page = pageInit; pageTotals <= page;) {\n        $.each(ctx.multiselection.deselectedRowsPerPage, function (index, p) {\n          if (Number(page) === Number(p.page)) {\n            count++;\n          }\n\n          if (count === maxPagina) {\n            return false;\n          }\n        });\n\n        if (count < maxPagina) {\n          pagina = page;\n          pageTotals = ctx.json.total; //Se pone el total para salir del bucle.\n        }\n\n        count = 0;\n        page--;\n      }\n    }\n\n    return pagina;\n  }\n  /**\r\n   * Metodo que obtiene la linea siguiente donde esta el primer elemento o elemento seleccionado.\r\n   *\r\n   * @name getLineByPageSelected\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {integer} lineInit - Linea a partir de la cual hay que mirar, en general será la 1.\r\n   *\r\n   * @return integer - devuele la linea\r\n   *\r\n   */\n\n\n  function _getLineByPageSelected(ctx, lineInit) {\n    var line = -1;\n    var rows = ctx.json.rows;\n    $.each(rows, function (index, row) {\n      if (index > lineInit) {\n        var indexInArray = jQuery.inArray(DataTable.Api().rupTable.getIdPk(row, ctx.oInit), ctx.multiselection.deselectedIds);\n\n        if (indexInArray === -1) {\n          line = index;\n          var arra = {\n            id: DataTable.Api().rupTable.getIdPk(row, ctx.oInit),\n            page: ctx.json.page,\n            line: index\n          };\n\n          if (ctx.oInit.formEdit !== undefined) {\n            ctx.oInit.formEdit.$navigationBar.currentPos = arra;\n          }\n\n          return false;\n        }\n      }\n    });\n    return line;\n  }\n  /**\r\n   * Metodo que obtiene la última linea siguiente donde esta el primer elemento o elemento seleccionado.\r\n   *\r\n   * @name getLineByPageSelectedReverse\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {integer} lineInit - Linea a partir de la cual hay que mirar.\r\n   *\r\n   * @return integer - devuele la linea\r\n   *\r\n   */\n\n\n  function _getLineByPageSelectedReverse(ctx, lineInit) {\n    var line = -1;\n    var rows = ctx.json.rows;\n\n    for (var index = rows.length - 1; index >= 0; index--) {\n      var row = rows[index];\n\n      if (index < lineInit) {\n        var indexInArray = jQuery.inArray(DataTable.Api().rupTable.getIdPk(row, ctx.oInit), ctx.multiselection.deselectedIds);\n\n        if (indexInArray === -1) {\n          line = index;\n          var arra = {\n            id: DataTable.Api().rupTable.getIdPk(row, ctx.oInit),\n            page: ctx.json.page,\n            line: index\n          };\n          ctx.oInit.formEdit.$navigationBar.currentPos = arra;\n          index = -1;\n        }\n      }\n    }\n\n    return line;\n  }\n  /**\r\n   * Metodo que elimina todos los registros seleccionados.\r\n   *\r\n   * @name _deleteAllSelects\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n\n  function _deleteAllSelects(dt) {\n    var ctx = dt.settings()[0];\n    var idRow = 0;\n    var regex = new RegExp(ctx.oInit.multiplePkToken, 'g');\n    var actionType = ctx.multiselection.selectedIds.length > 1 ? 'POST' : 'DELETE';\n\n    var _doDelete = function _doDelete() {\n      var row = {};\n      row.filter = window.form2object(ctx.oInit.filter.$filterContainer[0]);\n\n      if (ctx.multiselection.selectedIds.length > 1) {\n        row.core = {\n          'pkToken': ctx.oInit.multiplePkToken,\n          'pkNames': ctx.oInit.primaryKey\n        };\n        row.multiselection = {};\n        row.multiselection.selectedAll = ctx.multiselection.selectedAll;\n\n        if (row.multiselection.selectedAll) {\n          row.multiselection.selectedIds = ctx.multiselection.deselectedIds;\n        } else {\n          row.multiselection.selectedIds = ctx.multiselection.selectedIds;\n        }\n\n        _callSaveAjax(actionType, dt, row, idRow, false, ctx.oInit.formEdit.detailForm, '/deleteAll', true);\n      } else {\n        row = ctx.multiselection.selectedIds[0];\n        row = row.replace(regex, '/');\n\n        _callSaveAjax(actionType, dt, '', idRow, false, ctx.oInit.formEdit.detailForm, '/' + row, true);\n      }\n    };\n\n    if (ctx.oInit.formEdit.detailForm.settings.deleteDialog) {\n      $.rup_messages('msgConfirm', {\n        message: $.rup.i18nParse($.rup.i18n.base, 'rup_table.deleteAll'),\n        title: $.rup.i18nParse($.rup.i18n.base, 'rup_table.delete'),\n        OKFunction: function OKFunction() {\n          _doDelete();\n\n          $('#' + ctx.sTableId).triggerHandler('tableMessageOk', ctx);\n        },\n        CANCELFunction: ctx.oInit.formEdit.cancelDeleteFunction\n      });\n    } else {\n      _doDelete();\n    }\n  }\n  /**\r\n   * Método que serializa los datos del formulario.\r\n   *\r\n   * @name _editFormSerialize\r\n   * @function\r\n   * @since UDA 3.6.0 // Table 1.2.0\r\n   *\r\n   * @param {object} idForm - Formulario que alberga los datos.\r\n   * @param {string} [serializerSplitter=&] - Cadena a usar para separar los campos.\r\n   *\r\n   * @return {string} - Devuelve los datos del formulario serializados\r\n   *\r\n   */\n\n\n  function _editFormSerialize(idForm) {\n    var serializerSplitter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '&';\n    var serializedForm = '';\n    var idFormArray = idForm.formToArray();\n    var ultimo = '';\n    var count = 0;\n    $.each(idFormArray, function (key, obj) {\n      if (ultimo != obj.name) {\n        count = 0;\n      }\n\n      var element = idForm.find('[name=\"' + obj.name + '\"]');\n      var ruptype = element.attr('ruptype');\n\n      if (ruptype === undefined) {\n        ruptype = element.data('ruptype');\n      }\n\n      if (obj.type === 'hidden' && element.attr('id') !== undefined || obj.type !== 'hidden' || ruptype === 'autocomplete' || ruptype === 'custom') {\n        var valor = '';\n\n        if ($(idForm).find('[name=\"' + obj.name + '\"]').prop('multiple')) {\n          valor = '[' + count++ + ']';\n        } else if (ultimo === obj.name) {\n          //Se mete como lista\n          //se hace replace del primer valor\n          serializedForm = serializedForm.replace(ultimo + '=', ultimo + '[' + count++ + ']=');\n          valor = '[' + count++ + ']'; //y se mete el array\n        }\n\n        serializedForm += obj.name + valor + '=' + obj.value;\n        serializedForm += serializerSplitter;\n        ultimo = obj.name;\n      }\n    }); // Evitar que el último carácter sea \"&\" o el separador definido por el usuario.\n\n    serializedForm = serializedForm.substring(0, serializedForm.length - serializerSplitter.length);\n    return serializedForm;\n  }\n  /**\r\n   * Metodo que comprueba el seeker.\r\n   *\r\n   * @name _comprobarSeeker\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} row - Son los datos que se cargan.\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {number} idRow - Identificador de la fila.\r\n   *\r\n   */\n\n\n  function _comprobarSeeker(row, ctx, idRow) {\n    var cumple = true;\n    $.each(ctx.seeker.ajaxOption.data.search, function (key, obj) {\n      if (row[key].indexOf(obj) === -1) {\n        cumple = false;\n        return false;\n      }\n    });\n\n    if (!cumple) {\n      // eliminar del seeker, por pagina y linea\t\t\n      ctx.seeker.search.funcionParams = jQuery.grep(ctx.seeker.search.funcionParams, function (search) {\n        return search.page !== Number(ctx.json.page) || search.pageLine !== idRow + 1;\n      }); // se borra el icono\n\n      $('#' + ctx.sTableId + ' tbody tr').eq(idRow).find('td.select-checkbox i.filtered-row').remove();\n      $('#' + ctx.sTableId + ' tbody tr').eq(idRow).find('td i.filtered-row').remove();\n      DataTable.Api().seeker.updateDetailSeekPagination(1, ctx.seeker.search.funcionParams.length, ctx);\n    }\n  }\n  /**\r\n   * Método que gestiona el bloqueo de la edición de las claves primarias.\r\n   *\r\n   * @name _blockPKeditForm\r\n   * @function\r\n   * @since UDA 3.7.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {string} actionType - Método de operación CRUD.\r\n   *\r\n   */\n\n\n  function _blockPKeditForm(ctx, actionType) {\n    var blockPK = ctx.oInit.blockPKeditForm;\n    var idForm = ctx.oInit.formEdit.idForm;\n\n    if (blockPK) {\n      // En caso de ser edición bloqueamos la modificación\n      if (actionType === 'PUT') {\n        $.each(ctx.oInit.primaryKey, function (key, id) {\n          var input = $(idForm[0]).find(':input[name=\\'' + id + '\\']'); // Comprobamos si es un componente rup o no. En caso de serlo usamos el metodo disable.\n\n          if (input.attr('ruptype') === 'date' && !input.rup_date('isDisabled')) {\n            input.rup_date('disable');\n          } else if (input.attr('ruptype') === 'combo' && !input.rup_combo('isDisabled')) {\n            input.rup_combo('disable');\n          } else if (input.attr('ruptype') === 'select' && !input.rup_select('isDisabled')) {\n            input.rup_select('disable');\n          } else if (input.attr('ruptype') === 'time' && !input.rup_time('isDisabled')) {\n            input.rup_time('disable');\n          } else if (input.attr('type') === 'checkbox') {\n            if (!input.hasClass('checkboxPKBloqueado')) {\n              input.addClass('checkboxPKBloqueado');\n            }\n\n            var valorCheck = input.is(':checked') ? 1 : 0;\n            var selectorInputSustituto = $('#' + id + '_bloqueado'); // Comprobamos si es necesario cambiar el check\n\n            if (selectorInputSustituto.attr('valor') !== valorCheck) {\n              if (selectorInputSustituto.attr('valor') !== undefined) {\n                selectorInputSustituto.remove();\n              }\n\n              if (valorCheck === 1) {\n                input.after('<i id=\\'' + id + '_bloqueado\\' class=\\'mdi mdi-check sustitutoCheckboxPKBloqueadoGeneral\\' valor=\\'1\\' aria-hidden=\\'true\\'></i>');\n              } else {\n                input.after('<i id=\\'' + id + '_bloqueado\\' class=\\'mdi mdi-close sustitutoCheckboxPKBloqueadoGeneral sustitutoCheckboxPKBloqueadoCross\\' valor=\\'0\\' aria-hidden=\\'true\\'></i>');\n              }\n            }\n          } else {\n            input.prop('readOnly', true);\n          } // Quitamos el foco del elemento\n\n\n          input.on('mousedown', function (event) {\n            event.preventDefault();\n          });\n        });\n      } // En caso de ser clonación permitimos la edición\n      else if (actionType === 'POST') {\n        $.each(ctx.oInit.primaryKey, function (key, id) {\n          var input = $(idForm[0]).find(':input[name=\\'' + id + '\\']'); // Comprobamos si es un componente rup o no. En caso de serlo usamos el metodo enable.\n\n          if (input.attr('ruptype') === 'date' && input.rup_date('isDisabled')) {\n            input.rup_date('enable');\n          } else if (input.attr('ruptype') === 'combo' && input.rup_combo('isDisabled')) {\n            input.rup_combo('enable');\n          } else if (input.attr('ruptype') === 'select' && input.rup_select('isDisabled')) {\n            input.rup_select('enable');\n          } else if (input.attr('ruptype') === 'time' && input.rup_time('isDisabled')) {\n            input.rup_time('enable');\n          } else if (input.attr('type') === 'checkbox') {\n            input.removeClass('checkboxPKBloqueado');\n            $('#' + id + '_bloqueado').remove();\n          } else {\n            input.prop('readOnly', false);\n          } // Devolvemos el foco al elemento\n\n\n          input.on('mousedown', function (event) {\n            $(this).off(event.preventDefault());\n            input.focus();\n          });\n        });\n      }\n    }\n  }\n  /**\r\n   * Se añaden los iconos al responsive.\r\n   *\r\n   * @name _addChildIcons\r\n   * @function\r\n   * @since UDA 3.7.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Contexto del Datatable.\r\n   *\r\n   */\n\n\n  function _addChildIcons(ctx) {\n    try {\n      var hasHidden = false;\n\n      var columnsVisiblity = ctx.responsive._columnsVisiblity();\n\n      for (var i = 0; i < columnsVisiblity.length; i++) {\n        if (!columnsVisiblity[i]) {\n          if (!ctx.aoColumns[i].className || ctx.aoColumns[i].className.indexOf('never') < 0) {\n            hasHidden = true;\n          }\n        }\n      }\n\n      if (ctx.responsive.c.details.target === 'td span.openResponsive') {\n        //por defecto\n        $('#' + ctx.sTableId).find('tbody td:first-child span.openResponsive').remove();\n\n        if (hasHidden) {\n          //añadir span ala primera fila\n          $.each($('#' + ctx.sTableId).find('tbody td:first-child:not(.child):not(.dataTables_empty)'), function () {\n            var $span = $('<span></span>');\n\n            if ($(this).find('span.openResponsive').length === 0) {\n              $(this).prepend($span.addClass('openResponsive'));\n            } else {\n              //si ya existe se asigna el valor.\n              $span = $(this).find('span.openResponsive');\n            }\n\n            if ($(this).parent().next().hasClass('child')) {\n              $span.addClass('closeResponsive');\n            }\n\n            var $fila = $(this).parent();\n            $span.click(function (event) {\n              if ($fila.hasClass('editable') && $fila.find('.closeResponsive').length) {\n                //no se hace nada. si esta editando\n                event.stopPropagation();\n              } else {\n                if ($span.hasClass('closeResponsive')) {\n                  $span.removeClass('closeResponsive');\n                } else {\n                  $span.addClass('closeResponsive');\n                }\n              }\n            });\n          });\n        }\n      }\n\n      $('#' + ctx.sTableId).triggerHandler('tableEditFormAddChildIcons', ctx);\n    } catch (error) {}\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables API\r\n   *\r\n   * For complete documentation, please refer to the docs/api directory or the\r\n   * DataTables site\r\n   */\n  // Local variables to improve compression\n\n\n  var apiRegister = DataTable.Api.register; // Se declara la variable de editForm para que pueda ser invocada desde cualquier sitio\n\n  apiRegister('editForm.openSaveDialog()', function (actionType, dt, idRow, customTitle) {\n    DataTable.editForm.fnOpenSaveDialog(actionType, dt, idRow, customTitle);\n  });\n  apiRegister('editForm.updateDetailPagination()', function (ctx, currentRowNum, totalRowNum) {\n    _updateDetailPagination(ctx, currentRowNum, totalRowNum);\n  });\n  apiRegister('editForm.loadSaveDialogForm()', function (ctx, actionType, row) {\n    return _loadSaveDialogForm(ctx, actionType, row);\n  });\n  apiRegister('editForm.getRowSelected()', function (dt, actionType) {\n    return _getRowSelected(dt, actionType);\n  });\n  apiRegister('editForm.deleteAllSelects()', function (dt) {\n    return _deleteAllSelects(dt);\n  });\n  apiRegister('editForm.getLineByPageSelected()', function (ctx, linea) {\n    return _getLineByPageSelected(ctx, linea);\n  });\n  apiRegister('editForm.getLineByPageSelectedReverse()', function (ctx, linea) {\n    return _getLineByPageSelectedReverse(ctx, linea);\n  });\n  apiRegister('editForm.addchildIcons()', function (ctx) {\n    _addChildIcons(ctx);\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Initialisation\r\n   */\n  // DataTables creation - check if select has been defined in the options. Note\n  // this required that the table be in the document! If it isn't then something\n  // needs to trigger this method unfortunately. The next major release of\n  // DataTables will rework the events and address this.\n\n  $(document).on('plugin-init.dt', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (!ctx.oInit.noEdit && ctx.oInit.formEdit !== undefined && ctx.oInit.formEdit.activate !== false) {\n      DataTable.editForm.preConfigure(new DataTable.Api(ctx));\n      $('#' + ctx.sTableId).on('tableEditFormInitialize', function (event, ctx) {\n        var deferred = $.Deferred();\n        DataTable.editForm.init(ctx);\n        $(ctx.oInit.formEdit.detailForm).rup_dialog($.extend({}, {\n          type: $.rup.dialog.DIV,\n          autoOpen: false,\n          modal: true,\n          resizable: '',\n          width: ctx.oInit.formEdit.detailForm.settings.width,\n          create: function create() {\n            /* Se encarga de eliminar la clase que oculta los campos del formEdit. Esta clase esta presente\r\n             * en el formEdit para evitar un bug visual en el que hacia que sus campos apareciesen \r\n             * bajo la tabla y fueran visibles previa a la inicializacion del componente rup.dialog.\r\n             */\n            $('#' + ctx.sTableId + '_detail_div.rup-table-formEdit-detail').removeClass('d-none');\n          }\n        }, {}));\n\n        if (ctx.oInit.formEdit.cancelDeleteFunction === undefined) {\n          ctx.oInit.formEdit.cancelDeleteFunction = function cancelClicked() {};\n        }\n\n        deferred.resolve();\n        return deferred.promise();\n      });\n    }\n  });\n  return DataTable.editForm;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.editForm.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.inlineEdit.js":
/*!***********************************************!*\
  !*** ./src/rup_table/rup.table.inlineEdit.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n  * Módulo que habilita la edicción mediante un formulario.\r\n  *\r\n  * @summary\tExtensión del componente RUP Datatable\r\n  * @module\t\t\"rup.table.inlineEdit\"\r\n  * @version\t1.0.0\r\n  * @license\r\n  * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n  * Solo podrá usarse esta obra si se respeta la Licencia.\r\n  * Puede obtenerse una copia de la Licencia en\r\n  *\r\n  *      http://ec.europa.eu/idabc/eupl.html\r\n  *\r\n  * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n  * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n  * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n  * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n  * que establece la Licencia.\r\n  * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n  *\r\n  */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Version information for debugger\n\n  DataTable.inlineEdit = {};\n  DataTable.inlineEdit.version = '1.2.4';\n  /**\r\n  * Se inicializa el componente editInline\r\n  *\r\n  * @name init\r\n  * @function\r\n  * @since UDA 3.4.0 // Table 1.0.0\r\n  *\r\n  * @param {object} dt - Es el objeto table.\r\n  *\r\n  */\n\n  DataTable.inlineEdit.init = function (dt) {\n    var ctx = dt.settings()[0];\n    ctx.inlineEdit = {};\n    var idRow; // Se edita el row/fila.\n\n    var rowsBody = $(ctx.nTBody);\n    rowsBody.on('dblclick.DT keypress', 'tr:not(.group)', function (e) {\n      // Solo selecciona si se pulsa sobre el enter o se hace click izquierdo col raton\n      if (e.type == 'keypress' && e.which == 13 || e.type === 'dblclick') {\n        if ($(this).hasClass('editable')) {\n          return false;\n        }\n\n        idRow = this._DT_RowIndex;\n\n        _editInline(dt, ctx, idRow);\n\n        $('#' + ctx.sTableId).triggerHandler('tableEditInlineClickRow', ctx);\n      }\n    });\n    dt.on('responsive-display', function (e, table, row, showHide) {\n      //si se crea el tr hijo\n      if (showHide && row.child() !== undefined) {\n        row.child().on('dblclick.DT', function () {\n          idRow = row.index();\n\n          _editInline(dt, ctx, idRow);\n        });\n\n        if (ctx.oInit.inlineEdit.rowDefault !== undefined && ctx.oInit.inlineEdit.rowDefault === 'estadoFinal') {\n          ctx.oInit.inlineEdit.rowDefault = undefined;\n\n          _restaurarFila(ctx, true);\n\n          _editInline(dt, ctx, row.index());\n\n          if (ctx.oInit.inlineEdit.currentPos !== null && ctx.oInit.inlineEdit.currentPos.actionType === 'CLONE') {\n            $('#' + ctx.sTableId + ' tbody tr:not(.group)').eq(0).addClass('new');\n            DataTable.Api().rupTable.selectPencil(ctx, 0);\n          }\n        }\n\n        if ($(row.node()).hasClass('selected')) {\n          row.child().addClass('selected tr-highlight');\n        }\n      }\n    });\n    $(window).on('resize.dtr', DataTable.util.throttle(function () {\n      //Se calcula el responsive\n      dt.responsive.recalc();\n    })); //se cambia el nombre de los validadores.\n\n    if (ctx.oInit.inlineEdit.validate !== undefined && ctx.oInit.inlineEdit.validate.rules !== undefined) {\n      var rulesAux = ctx.oInit.inlineEdit.validate.rules;\n      ctx.oInit.inlineEdit.validate.rules = {};\n      $.each(rulesAux, function (name, rule) {\n        ctx.oInit.inlineEdit.validate.rules[name + '_inline'] = rule;\n        ctx.oInit.inlineEdit.validate.rules[name + '_inline_child'] = rule;\n      });\n    }\n\n    var idForm = $('#' + ctx.sTableId + '_search_searchForm'); // Si no existe se crea\n\n    if (idForm.length === 0) {\n      var $searchForm = jQuery('<form>').attr('id', ctx.sTableId + '_search_searchForm');\n      $('#' + ctx.sTableId).wrapAll($searchForm);\n    } // Se añaden las validaciones\n\n\n    var feed = ctx.oInit.feedback.$feedbackContainer;\n    var validaciones;\n\n    if (ctx.oInit.inlineEdit.validate !== undefined) {\n      validaciones = ctx.oInit.inlineEdit.validate.rules;\n    }\n\n    var propertiesDefault = {\n      liveCheckingErrors: false,\n      showFieldErrorAsDefault: true,\n      showErrorsInFeedback: true,\n      showFieldErrorsInFeedback: true\n    };\n    var propertiesValidate = $.extend(true, {}, propertiesDefault, ctx.oInit.inlineEdit.propertiesValidate);\n    propertiesValidate.feedback = feed;\n    propertiesValidate.rules = validaciones;\n    $('#' + ctx.sTableId + '_search_searchForm').rup_validate(propertiesValidate);\n    var borrarGuardar = false;\n    var borrarCancelar = false;\n\n    if (ctx.oInit.buttons !== undefined && ctx.oInit.buttons.blackListButtons !== undefined) {\n      if (ctx.oInit.buttons.blackListButtons === 'all') {\n        borrarGuardar = true;\n        borrarCancelar = true;\n      } else if (ctx.oInit.buttons.blackListButtons && ctx.oInit.buttons.blackListButtons.length > 0) {\n        $.each(ctx.oInit.buttons.blackListButtons, function () {\n          var name = this;\n\n          if (name === 'saveButton') {\n            borrarGuardar = true;\n          }\n\n          if (name === 'cancelButton') {\n            borrarCancelar = true;\n          }\n        });\n      }\n    } // Crear botones Guardar y Cancelar\n\n\n    ctx.oInit.inlineEdit.myButtons = {}; // Boton Guardar\n\n    if (!borrarGuardar) {\n      ctx.oInit.inlineEdit.myButtons.guardar = {\n        text: function text(dt) {\n          return $.rup.i18nParse($.rup.i18n.base, 'rup_table.save');\n        },\n        id: ctx.sTableId + 'saveButton_1',\n        // Campo obligatorio si se quiere usar desde el contextMenu\n        className: 'btn-material-primary-high-emphasis table_toolbar_btnSave order-5',\n        icon: 'mdi-content-save',\n        displayRegex: /asss/,\n        // Se muestra siempre que sea un numero positivo o neutro\n        insideContextMenu: true,\n        // Independientemente de este valor, sera 'false' si no tiene un id definido\n        type: 'save',\n        action: function action(e, dt, button, config) {\n          var $selector = $('#' + ctx.sTableId + ' tbody tr.editable:not(.child)');\n\n          _guardar(ctx, $selector, false);\n        }\n      };\n    }\n\n    if (!borrarCancelar) {\n      // Boton Cancelar\n      ctx.oInit.inlineEdit.myButtons.cancelar = {\n        text: function text(dt) {\n          return $.rup.i18nParse($.rup.i18n.base, 'rup_table.cancel');\n        },\n        id: ctx.sTableId + 'cancelButton_1',\n        // Campo obligatorio si se quiere usar desde el contextMenu\n        className: 'btn-material-primary-high-emphasis table_toolbar_btnCancel order-6',\n        icon: 'mdi-cancel',\n        displayRegex: /asss/,\n        // Se muestra siempre que sea un numero positivo o neutro\n        insideContextMenu: true,\n        // Independientemente de este valor, sera 'false' si no tiene un id definido\n        type: 'cancel',\n        action: function action() {\n          var _cancelRow = function _cancelRow() {\n            $('#' + ctx.sTableId + 'saveButton_1').prop('disabled', true);\n            $('#' + ctx.sTableId + 'saveButton_1_contextMenuToolbar').addClass('disabledButtonsTable');\n            $('#' + ctx.sTableId + 'cancelButton_1').prop('disabled', true);\n            $('#' + ctx.sTableId + 'cancelButton_1_contextMenuToolbar').addClass('disabledButtonsTable');\n            ctx.inlineEdit.lastRow = undefined;\n            ctx.oInit.inlineEdit.alta = undefined;\n            dt.ajax.reload(undefined, false);\n          };\n\n          if (ctx.oInit.inlineEdit.settings.cancelDialog) {\n            $.rup_messages('msgConfirm', {\n              message: $.rup.i18nParse($.rup.i18n.base, 'rup_table.saveAndContinue'),\n              title: $.rup.i18nParse($.rup.i18n.base, 'rup_table.changes'),\n              OKFunction: function OKFunction() {\n                _cancelRow();\n\n                $('#' + ctx.sTableId).triggerHandler('tableMessageOk', ctx);\n              },\n              CANCELFunction: function CANCELFunction() {\n                $('#' + ctx.sTableId).triggerHandler('tableMessageCancel', ctx);\n              },\n              CLOSEFunction: function CLOSEFunction() {\n                $('#' + ctx.sTableId).triggerHandler('tableMessageClose', ctx);\n              }\n            });\n          } else {\n            _cancelRow();\n          }\n        }\n      };\n    }\n\n    ctx.oInit.inlineEdit.settings = {\n      saveDialog: ctx.oInit.inlineEdit.confirmDialogs !== undefined && ctx.oInit.inlineEdit.confirmDialogs.saveDialog !== undefined ? ctx.oInit.inlineEdit.confirmDialogs.saveDialog : true,\n      cancelDialog: ctx.oInit.inlineEdit.confirmDialogs !== undefined && ctx.oInit.inlineEdit.confirmDialogs.cancelDialog !== undefined ? ctx.oInit.inlineEdit.confirmDialogs.cancelDialog : true,\n      deleteDialog: ctx.oInit.inlineEdit.confirmDialogs !== undefined && ctx.oInit.inlineEdit.confirmDialogs.deleteDialog !== undefined ? ctx.oInit.inlineEdit.confirmDialogs.deleteDialog : true\n    };\n    $(window).on('resize.dtr', DataTable.util.throttle(function () {\n      //Se calcula el responsive\n      _addChildIcons(ctx);\n    }));\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Local functions\r\n   */\n\n  /**\r\n   * Initialisation of a new table. Attach event handlers and callbacks to allow\r\n   * Select to operate correctly.\r\n   *\r\n   * This will occur _after_ the initial DataTables initialisation, although\r\n   * before Ajax data is rendered, if there is ajax data\r\n   *\r\n   * @name init\r\n   * @function\r\n   * @since UDA 3.7.0 // Table 1.0.0\r\n   *\r\n   * @param  {DataTable.settings} ctx Settings object to operate on\r\n   *\r\n   */\n\n\n  function init(ctx) {\n    var api = new DataTable.Api(ctx); // Row callback so that classes can be added to rows and cells if the item\n    // was selected before the element was created. This will happen with the\n    // `deferRender` option enabled.\n    //\n    // This method of attaching to `aoRowCreatedCallback` is a hack until\n    // DataTables has proper events for row manipulation If you are reviewing\n    // this code to create your own plug-ins, please do not do this!\n\n    ctx.aoRowCreatedCallback.push({\n      fn: function fn(row, data, index) {\n        var i, ien;\n        var d = ctx.aoData[index]; // Row\n\n        if (d._multiSelect_selected) {\n          $(row).addClass(ctx._multiSelect.className);\n        } // Cells and columns - if separated out, we would need to do two\n        // loops, so it makes sense to combine them into a single one\n\n\n        for (i = 0, ien = ctx.aoColumns.length; i < ien; i++) {\n          if (ctx.aoColumns[i]._multiSelect_selected || d._selected_cells && d._selected_cells[i]) {\n            $(d.anCells[i]).addClass(ctx._multiSelect.className);\n          }\n        }\n      },\n      sName: 'select-deferRender'\n    }); // On Ajax reload we want to reselect all rows which are currently selected,\n    // if there is an rowId (i.e. a unique value to identify each row with)\n\n    api.on('preXhr.dt.dtSelect', function () {\n      // note that column selection doesn't need to be cached and then\n      // reselected, as they are already selected\n      var rows = api.rows({\n        selected: true\n      }).ids(true).filter(function (d) {\n        return d !== undefined;\n      });\n      var cells = api.cells({\n        selected: true\n      }).eq(0).map(function (cellIdx) {\n        var id = api.row(cellIdx.row).id(true);\n        return id ? {\n          row: id,\n          column: cellIdx.column\n        } : undefined;\n      }).filter(function (d) {\n        return d !== undefined;\n      }); // On the next draw, reselect the currently selected items\n\n      api.one('draw.dt.dtSelect', function () {\n        api.rows(rows).multiSelect(); // `cells` is not a cell index selector, so it needs a loop\n\n        if (cells.any()) {\n          cells.each(function (id) {\n            api.cells(id.row, id.column).multiSelect();\n          });\n        }\n      });\n    }); // Clean up and release\n\n    api.on('destroy.dtSelect', function () {\n      disableMouseSelection(api);\n      api.off('.dtSelect');\n    });\n  }\n\n  function eventTrigger(api, type, args, any) {\n    if (any && !api.flatten().length) {\n      return;\n    }\n\n    if (typeof type === 'string') {\n      type = type + '.dt';\n    }\n\n    args.unshift(api);\n    $(api.table().node()).trigger(type, args);\n  }\n  /**\r\n  * Función ejecutada cuando se activa el responsive.\r\n  *\r\n  * @name _onResponsiveResize\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} dt - Es el objeto table.\r\n  *\r\n  */\n\n\n  function _onResponsiveResize(dt) {\n    dt.on('responsive-resize', function (e, settingsTable) {\n      //si hay responsive. Param:: e,settingsTable,columns\n      _addChildIcons(settingsTable.context[0]);\n    });\n  }\n  /**\r\n  * Se añade un nuevo registro.\r\n  *\r\n  * @name _add\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} dt - Es el objeto table.\r\n  * @param {object} ctx - Contexto del Datatable.\r\n  *\r\n  */\n\n\n  function _add(dt, ctx) {\n    if (ctx.multiselection.numSelected > 0) {\n      $.rup_messages('msgConfirm', {\n        message: $.rup.i18nParse($.rup.i18n.base, 'rup_table.checkSelectedElems'),\n        title: $.rup.i18nParse($.rup.i18n.base, 'rup_table.changes'),\n        OKFunction: function OKFunction() {\n          _restaurarFila(ctx, true); // Abrimos el formulario\n\n\n          if (ctx.oInit.seeker !== undefined) {\n            DataTable.Api().seeker.limpiarSeeker(dt, ctx); // Y deselecionamos los checks y seekers\n          } else {\n            if (ctx.oInit.multiSelect !== undefined) {\n              DataTable.Api().multiSelect.deselectAll(dt); // Y deselecionamos los checks y seekers\n            } else if (ctx.oInit.select !== undefined) {\n              DataTable.Api().select.deselect(ctx); // Y deselecionamos los checks y seekers\n            }\n          } //Crear tr ficticio\n\n\n          ctx.oInit.inlineEdit.alta = true;\n          dt.ajax.reload(function () {\n            ctx.oInit.inlineEdit.alta = undefined;\n            $('#' + ctx.sTableId + ' tbody tr:not(.group)').eq(0).addClass('new');\n\n            _editInline(dt, ctx, 0);\n          });\n        }\n      });\n    } else {\n      //Crear tr ficticio\n      ctx.oInit.inlineEdit.alta = true;\n      dt.ajax.reload(function () {\n        ctx.oInit.inlineEdit.alta = undefined;\n        $('#' + ctx.sTableId + ' tbody tr:not(.group)').eq(0).addClass('new');\n\n        _editInline(dt, ctx, 0);\n      });\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableEditInlineAddRow', ctx);\n  }\n  /**\r\n  * Se añaden los iconos al responsive.\r\n  *\r\n  * @name _addChildIcons\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Contexto del Datatable.\r\n  *\r\n  */\n\n\n  function _addChildIcons(ctx) {\n    var hasHidden = false;\n\n    var columnsVisiblity = ctx.responsive._columnsVisiblity();\n\n    for (var i = 0; i < columnsVisiblity.length; i++) {\n      if (!columnsVisiblity[i]) {\n        if (!ctx.aoColumns[i].className || ctx.aoColumns[i].className.indexOf('never') < 0) {\n          hasHidden = true;\n        }\n      }\n    }\n\n    if (ctx.responsive.c.details.target === 'td span.openResponsive') {\n      //por defecto\n      $('#' + ctx.sTableId).find('tbody td:first-child span.openResponsive').remove();\n\n      if (hasHidden) {\n        //añadir span ala primera fila\n        $.each($('#' + ctx.sTableId).find('tbody td:first-child:not(.child):not(.dataTables_empty)'), function () {\n          var $span = $('<span></span>');\n\n          if ($(this).find('span.openResponsive').length === 0) {\n            $(this).prepend($span.addClass('openResponsive'));\n          } else {\n            //si ya existe se asigna el valor.\n            $span = $(this).find('span.openResponsive');\n          }\n\n          if ($(this).parent().next().hasClass('child')) {\n            $span.addClass('closeResponsive');\n          }\n\n          var $fila = $(this).parent();\n          $span.click(function (event) {\n            if ($fila.hasClass('editable') && $fila.find('.closeResponsive').length) {\n              // No se hace nada si esta editando\n              event.stopPropagation();\n            } else {\n              if ($span.hasClass('closeResponsive')) {\n                $span.removeClass('closeResponsive');\n              } else {\n                $span.addClass('closeResponsive');\n              }\n            }\n          });\n\n          if (ctx.inlineEdit !== undefined && $fila.hasClass('editable')) {\n            //setTimeout(_comprobarFila(ctx,$fila), 500);\n            _comprobarFila(ctx, $fila); //console.log('entro al TIMEOUT --------- ---------');\n\n          }\n        });\n      } else {//si la edicion en linea esta activada\n      } //si hay inputs guardados se reemplazan los cambios por el responsive.\n\n\n      if (ctx.inlineEdit !== undefined && ctx.inlineEdit.lastRow !== undefined && ctx.inlineEdit.lastRow.rupValues !== undefined) {\n        var table = $('#' + ctx.sTableId).DataTable();\n        ctx.inlineEdit.lastRow.columnsHidden = table.columns().responsiveHidden();\n        var $row = $('#' + ctx.sTableId + ' tbody tr.editable:not(.child)');\n\n        _asignarInputsValues(ctx, $row);\n      }\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableEditLineAddChildIcons', ctx);\n  }\n  /**\r\n  * Método principal para la edición en línea.\r\n  *\r\n  * @name _add\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} dt - Es el objeto table.\r\n  * @param {object} ctx - Contexto del Datatable.\r\n  * @param {integer} idRow - Número con la posición de la fila que hay que obtener.\r\n  *\r\n  */\n\n\n  function _editInline(dt, ctx, idRow) {\n    if (ctx.inlineEdit.lastRow !== undefined && ctx.inlineEdit.lastRow.idx !== idRow) {\n      //si no es la misma fila.\n      _restaurarFila(ctx, false);\n    }\n\n    var $rowSelect = $('#' + ctx.sTableId + ' > tbody > tr:not(.group)').eq(idRow);\n\n    if (!$rowSelect.hasClass('editable')) {\n      _changeInputsToRup(ctx, idRow); // Se deshabilitan los botones predefinidos de la tabla.\n\n\n      DataTable.Api().buttons.disableAllButtons(ctx, ctx.ext.buttons.custom);\n    } // Habilitamos en la botonera y contextMenu\n\n\n    $('#' + ctx.sTableId + 'saveButton_1').prop('disabled', false);\n    $('#' + ctx.sTableId + 'saveButton_1_contextMenuToolbar').removeClass('disabledButtonsTable');\n    $('#' + ctx.sTableId + 'cancelButton_1').prop('disabled', false);\n    $('#' + ctx.sTableId + 'cancelButton_1_contextMenuToolbar').removeClass('disabledButtonsTable'); // Cuando sea añadir registro no hay que habilitar el boton de informes\n\n    if (!$rowSelect.hasClass('odd new')) {\n      $('#' + ctx.sTableId + 'informes_01').prop('disabled', false);\n    }\n\n    DataTable.Api().seeker.enabledButtons(ctx);\n    $('#' + ctx.sTableId).triggerHandler('tableInlineEdit', ctx);\n    var selectores = {};\n    selectores[0] = $rowSelect;\n\n    if ($rowSelect.next().find('.child').length === 1) {\n      selectores[1] = $rowSelect.next().find('.child');\n    }\n\n    $.each(selectores, function () {\n      //se crea evento para los selectores creados.\n      _crearEventos(ctx, this);\n    });\n\n    if (ctx.oInit.inlineEdit.clone !== true) {\n      //Añadir la seleccion del mismo.\n      if (ctx.oInit.multiSelect !== undefined) {\n        dt['row'](idRow).multiSelect();\n      } else {\n        var rowsBody = $(ctx.nTBody);\n        $('tr', rowsBody).removeClass('selected tr-highlight');\n        DataTable.Api().select.selectRowIndex(dt, idRow, true);\n\n        if (ctx.multiselection.selectedIds == \"\") {\n          //es nuevo\n          ctx.multiselection.selectedIds = [];\n        }\n      }\n    }\n\n    dt.responsive.recalc();\n\n    if (ctx.oInit.inlineEdit.currentPos !== undefined && ctx.oInit.inlineEdit.currentPos.actionType !== undefined && ctx.oInit.inlineEdit.currentPos.actionType === 'CLONE' && $rowSelect.find('span.openResponsive').length === 0) {\n      //revisar cuando es clone por si el responsive falla\n      _addChildIcons(ctx);\n    }\n  }\n  /**\r\n  * Método que obtiene la fila siguiente seleccionada.\r\n  *\r\n  * @name getRowSelected\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} dt - Instancia de la tabla.\r\n  * @param {string} actionType - Acción a ajecutar en el formulario para ir al controller, basado en REST.\r\n  *\r\n  * @return {object} Contiene el identificador, la página y la línea de la fila seleccionada.\r\n  *\r\n  */\n\n\n  function _getRowSelected(dt, actionType) {\n    var ctx = dt.settings()[0];\n    var rowDefault = {\n      id: 0,\n      page: 1,\n      line: 0\n    };\n    var lastSelectedId = ctx.multiselection.lastSelectedId;\n\n    if (!ctx.multiselection.selectedAll) {\n      var staticID = $.fn.getStaticHdivID(ctx.multiselection.lastSelectedId);\n      $.each(ctx.multiselection.selectedRowsPerPage, function (index, p) {\n        // Obtener el último seleccionado para tener el identificador actualizado (solamente es necesario cuando se usa Hdiv porque cambia el cifrado entre peticiones)\n        if ($.fn.isHdiv(p.id) && staticID === $.fn.getStaticHdivID(p.id)) {\n          ctx.multiselection.lastSelectedId = p.id;\n        }\n\n        if (p.id == ctx.multiselection.lastSelectedId) {\n          rowDefault.id = p.id;\n          rowDefault.page = p.page;\n          rowDefault.line = p.line;\n          rowDefault.indexSelected = index;\n\n          if (ctx.oInit.inlineEdit !== undefined) {\n            ctx.oInit.inlineEdit.currentPos = rowDefault;\n          }\n\n          return false;\n        }\n      });\n    } else {\n      if (ctx.oInit.inlineEdit !== undefined) {\n        // Indica los mostrados cuando es selectAll y no se puede calcular. El inicio es 0.\n        ctx.oInit.inlineEdit.numPosition = 0;\n      }\n\n      if (lastSelectedId === undefined || lastSelectedId === '') {\n        // Como arranca de primeras, la página es la 1\n        rowDefault.page = _getNextPageSelected(ctx, 1, 'next');\n        rowDefault.line = _getLineByPageSelected(ctx, -1);\n      } else {\n        // Buscar la posición y la página\n        var result = $.grep(ctx.multiselection.selectedRowsPerPage, function (v) {\n          return v.id == ctx.multiselection.lastSelectedId;\n        });\n        rowDefault.page = result[0].page;\n        rowDefault.line = result[0].line;\n        var index = ctx._iDisplayLength * (Number(rowDefault.page) - 1);\n        index = index + 1 + rowDefault.line; // Restar los deselecionados\n\n        result = $.grep(ctx.multiselection.deselectedRowsPerPage, function (v) {\n          return Number(v.page) < Number(rowDefault.page) || Number(rowDefault.page) === Number(v.page) && Number(v.line) < Number(rowDefault.line);\n        }); // Buscar índice\n\n        rowDefault.indexSelected = index - result.length;\n\n        if (ctx.oInit.inlineEdit !== undefined) {\n          ctx.oInit.inlineEdit.numPosition = rowDefault.indexSelected - 1;\n        }\n      }\n\n      if (ctx.oInit.inlineEdit !== undefined) {\n        ctx.oInit.inlineEdit.currentPos = rowDefault;\n      }\n    } // En caso de estar en una página distinta, navegamos a ella\n\n\n    if (dt.page() + 1 !== Number(rowDefault.page)) {\n      var table = $('#' + ctx.sTableId).DataTable();\n      table.page(rowDefault.page - 1).draw('page');\n\n      if (ctx.oInit.inlineEdit !== undefined) {\n        rowDefault.actionType = actionType;\n        ctx.oInit.inlineEdit.rowDefault = rowDefault;\n      }\n    } else {\n      if (actionType === 'PUT') {\n        _editInline(dt, ctx, rowDefault.line);\n      } else if (actionType === 'CLONE') {\n        dt.ajax.reload(undefined, false);\n        rowDefault.actionType = actionType;\n        ctx.oInit.inlineEdit.rowDefault = rowDefault;\n      }\n    }\n\n    return rowDefault;\n  }\n  /**\r\n  * Método que clona el elemento seleccionado.\r\n  *\r\n  * @name cloneLine\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  *\r\n  * @param {object} dt - Objeto table.\r\n  * @param {object} ctx - Contexto del Datatable.\r\n  * @param {integer} line - Número de la fila.\r\n  *\r\n  */\n\n\n  function _cloneLine(dt, ctx, line) {\n    $('#' + ctx.sTableId).triggerHandler('tableEditInlineClone', ctx);\n    dt.row(0).data(dt.row(line + 1).data());\n\n    if (ctx.oInit.inlineEdit.rowDefault !== undefined) {\n      ctx.oInit.inlineEdit.rowDefault.line = 0;\n    } // Añadir clase necesaria para su futura gestión a la hora de guardar el registro\n\n\n    $('#' + ctx.sTableId + ' tbody tr').eq(0).addClass('new');\n  }\n  /**\r\n  * Método que obtiene la página siguiente donde está el primer elemento o elemento seleccionado.\r\n  *\r\n  * @name getNextPageSelected\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Contexto del Datatable.\r\n  * @param {integer} pageInit - Página a partir de la cual hay que mirar, en general serà la 1.\r\n  * @param {string} orden - Pueder ser pre o next, en función de si necesitar ir hacia adelante o hacia atrás.\r\n  *\r\n  * @return integer - devuele la página\r\n  *\r\n  */\n\n\n  function _getNextPageSelected(ctx, pageInit, orden) {\n    var pagina = pageInit;\n    var pageTotals = ctx.json.total;\n\n    if (orden === 'prev') {\n      //Si es previo se resta.\n      pageTotals = 1;\n    }\n\n    if (ctx.multiselection.deselectedRowsPerPage.length > 0) {\n      var maxPagina = ctx.json.rows.length;\n      var count = 0; //Buscar la pagina donde va estar el seleccionado.\n\n      for (var page = pageInit; page < pageTotals;) {\n        $.each(ctx.multiselection.deselectedRowsPerPage, function (index, p) {\n          if (page === Number(p.page)) {\n            count++;\n          }\n\n          if (count === maxPagina) {\n            return false;\n          }\n        });\n\n        if (count < maxPagina) {\n          pagina = page;\n          page = ctx.json.total; //Se pone el total para salir del bucle.\n        }\n\n        count = 0;\n\n        if (orden === 'next') {\n          page++;\n        } else if (orden === 'prev') {\n          page--;\n        }\n      }\n    }\n\n    return pagina;\n  }\n  /**\r\n  * Método que obtiene la linea siguiente donde está el primer elemento o elemento seleccionado.\r\n  *\r\n  * @name getLineByPageSelected\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Settings object to operate on.\r\n  * @param {integer} lineInit - Linea a partir de la cual hay que mirar, en general será la 1.\r\n  *\r\n  * @return integer - devuele la linea\r\n  *\r\n  */\n\n\n  function _getLineByPageSelected(ctx, lineInit) {\n    var line = -1;\n    var rows = ctx.json.rows;\n    $.each(rows, function (index, row) {\n      if (index > lineInit) {\n        var indexInArray = jQuery.inArray(DataTable.Api().rupTable.getIdPk(row, ctx.oInit), ctx.multiselection.deselectedIds);\n\n        if (indexInArray === -1) {\n          line = index;\n          var arra = {\n            id: DataTable.Api().rupTable.getIdPk(row, ctx.oInit),\n            page: ctx.json.page,\n            line: index\n          };\n\n          if (ctx.oInit.inilineEdit !== undefined) {\n            ctx.oInit.inilineEdit.currentPos = arra;\n          }\n\n          return false;\n        }\n      }\n    });\n    return line;\n  }\n  /**\r\n  * Se restaura la línea(fila) en la edición.\r\n  *\r\n  * @name _restaurarFila\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Contexto del Datatable.\r\n  * @param {boolean} limpiar - Si es true limpia e inicializa todo y si es false solo restaura la línea.\r\n  *\r\n  */\n\n\n  function _restaurarFila(ctx, limpiar) {\n    $('#' + ctx.sTableId).triggerHandler('tableEditInlineRestaurarFilaInit', ctx);\n\n    if (ctx.inlineEdit !== undefined && ctx.inlineEdit.lastRow !== undefined) {\n      var positionLastRow = ctx.inlineEdit.lastRow.idx;\n      var $fila = $('#' + ctx.sTableId + ' > tbody > tr:not(.group)').eq(positionLastRow); //Sin responsive\n\n      _restaurarCeldas(ctx, $fila, $fila.find('td'), 0);\n\n      var contRest = $fila.find('td:not([style*=\"display: none\"])').length;\n\n      if ($fila.find('td.select-checkbox').length > 0) {\n        contRest--;\n      } //con responsive, desplegado\n\n\n      _restaurarCeldas(ctx, $fila.next('.child'), $fila.next('.child').find(ctx.oInit.responsive.selectorResponsive), contRest);\n    }\n\n    if (ctx.inlineEdit !== undefined && limpiar) {\n      //si se limpia, no queda ninguna marcada\n      var $selectorTr = $('#' + ctx.sTableId + ' > tbody > tr:not(.group)').eq(positionLastRow);\n      ctx.inlineEdit.lastRow = undefined;\n\n      if ($selectorTr.data('events') !== undefined) {\n        $selectorTr.off('keydown');\n      }\n\n      DataTable.Api().seeker.disabledButtons(ctx);\n      ctx.oInit.feedback.$feedbackContainer.rup_feedback('hide');\n\n      if ($fila !== undefined && $fila.hasClass('new')) {\n        // se elimna el tr, porque no se guardo\n        $fila.next('.child').remove();\n        $fila.remove(); //se asegura resturar multiselection\n\n        ctx.multiselection.numSelected = 0;\n        ctx.multiselection.selectedIds = [];\n        ctx.multiselection.selectedRowsPerPage = [];\n      } //se habilitan los botones.\n\n\n      ctx._buttons[0].inst.s.disableAllButtons = undefined;\n      DataTable.Api().buttons.displayRegex(ctx);\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableEditLineRestaurarFilaEnd', ctx);\n  }\n  /**\r\n  *Cambia los inputs por los componentes rup.\r\n  *\r\n  * @name _changeInputsToRup\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Contexto del Datatable.\r\n  * @param {integer} idRow - Número con la posición de la fila que hay que obtener.\r\n  *\r\n  */\n\n\n  function _changeInputsToRup(ctx, idRow) {\n    // Se procesan las celdas editables\n    if (ctx.oInit.colModel !== undefined) {\n      var table = $('#' + ctx.sTableId).DataTable();\n      var cont = 0;\n      ctx.inlineEdit.lastRow = $('#' + ctx.sTableId + ' > tbody > tr:not(.group)').eq(idRow);\n      ctx.inlineEdit.lastRow.cellValues = {};\n      ctx.inlineEdit.lastRow.columnsHidden = table.columns().responsiveHidden();\n      ctx.inlineEdit.lastRow.submit = 0;\n      ctx.inlineEdit.lastRow.idx = idRow;\n      ctx.inlineEdit.lastRow.ponerFocus = false; //Si existe el responsive\n      //Campos sin responsive\n\n      var $target = ctx.inlineEdit.lastRow.find(ctx.oInit.responsive.details.target);\n\n      if ($target.length > 0 && ctx.inlineEdit.lastRow.next().find('.child').length === 0) {\n        $target.click();\n      }\n\n      cont = _recorrerCeldas(ctx, ctx.inlineEdit.lastRow, ctx.inlineEdit.lastRow.find('td'), cont);\n\n      if (!ctx.inlineEdit.lastRow.hasClass('new') && !ctx.oInit.inlineEdit.alta) {\n        DataTable.Api().rupTable.blockPKEdit(ctx, 'PUT', '_inline');\n      } //Mirar los campos que estan en responsive.\n\n\n      var $filaChild = ctx.inlineEdit.lastRow.next('.child');\n\n      _recorrerCeldas(ctx, $filaChild, $filaChild.find(ctx.oInit.responsive.selectorResponsive), cont);\n\n      if ($filaChild.length > 0 && !$filaChild.hasClass('new') && !ctx.oInit.inlineEdit.alta) {\n        DataTable.Api().rupTable.blockPKEdit(ctx, 'PUT', '_inline_child');\n      }\n    }\n  }\n  /**\r\n  * Método que recorre las celdas y las procesa.\r\n  *\r\n  * @name _recorrerCeldas\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $fila - fila que se está editando.\r\n  * @param {object} $celdas - Todas las celdas a recorrer.\r\n  * @param {integer} cont - Contador para saber en que celda nos movemos, sobre todo en el responsive.\r\n  *\r\n  */\n\n\n  function _recorrerCeldas(ctx, $fila, $celdas, cont) {\n    $fila.addClass('editable');\n    var colModel = ctx.oInit.colModel;\n    var child = '';\n\n    if ($fila.hasClass('child')) {\n      child = '_child';\n      $fila = $fila.prev();\n    }\n\n    var ocultos = 0;\n    var edicion = true;\n\n    if ($fila.hasClass('new') || ctx.oInit.inlineEdit.alta) {\n      edicion = false;\n    }\n\n    $celdas.each(function () {\n      var celda = $(this);\n      var $celda = $(celda);\n\n      if (!$celda.hasClass('select-checkbox')) {\n        // Si la columna a usar está oculta, se aumenta el contador para usar la siguiente que no lo esté\n        while (colModel[cont].hidden) {\n          cont++;\n        }\n\n        var cellColModel = colModel[cont];\n\n        if (cellColModel.editable === true || !edicion) {\n          var $input = $('<input />').val($celda.text()).attr('name', cellColModel.name + '_inline' + child);\n          var title = cellColModel.name.charAt(0).toUpperCase() + cellColModel.name.slice(1);\n          $input.attr('id', cellColModel.name + '_inline' + child).attr('oldtitle', title); // Si es el primero dejar el focus\n\n          if (ctx.inlineEdit.lastRow.cellValues[0] === undefined) {\n            ctx.inlineEdit.lastRow.ponerFocus = true;\n          }\n\n          ctx.inlineEdit.lastRow.cellValues[cont] = $celda.html();\n          var $span = $celda.find('.openResponsive');\n          $celda.html($input);\n\n          if ($span.length >= 1) {\n            $span.click(function (event) {\n              event.stopPropagation();\n            });\n            $celda.prepend($span);\n          } //Convertir a input.\n\n\n          var searchRupType = cellColModel.editoptions !== undefined && cellColModel.editoptions.rupType !== undefined ? cellColModel.editoptions.rupType : cellColModel.rupType;\n          var colModelName = cellColModel.name;\n          var $elem = $('#' + colModelName + '_inline' + child, ctx.nTBody); // Se añade el title de los elementos de acuerdo al colname\n          // Si ya existe el div necesario para dar los estilos material al input, evitamos duplicarlo.\n\n          if (!$('#' + colModelName + '_inline').parent().hasClass('form-groupMaterial')) {\n            $('#' + colModelName + '_inline').wrap('<div class=\\'form-groupMaterial\\'></div>');\n          } // Lo mismo que el anterior pero cuando se ha aplicado el responsivo.\n\n\n          if (!$('#' + colModelName + '_inline_child').parent().hasClass('form-groupMaterial')) {\n            $('#' + colModelName + '_inline_child').wrap('<div class=\\'form-groupMaterial\\'></div>');\n          }\n\n          $elem.attr({\n            'title': '',\n            'class': 'editable customelement form-control-customer'\n          }).removeAttr('readOnly'); // En caso de tratarse de un componente rup, se inicializa de acuerdo a la configuracón especificada en el colModel\n\n          if (searchRupType !== undefined && cellColModel.editoptions) {\n            var searchEditOptions = cellColModel.editoptions;\n\n            if (searchRupType === 'combo') {\n              //se marca el selected\n              searchEditOptions.selected = ctx.oInit.inlineEdit.useLocalValues ? ctx.inlineEdit.lastRow.cellValues[cont] : ctx.json.rows[$fila.idx][cellColModel.name];\n              searchEditOptions.inlineEditFieldName = cellColModel.name;\n            } else if (searchRupType === 'autocomplete') {\n              var cellValue = ctx.inlineEdit.lastRow.cellValues[cont];\n              searchEditOptions.loadValue = cellValue;\n\n              if (cellValue != null) {\n                searchEditOptions.loadObjectsAuto = _defineProperty({}, cellValue, cellValue);\n              }\n            } else if (searchRupType === 'select') {\n              searchEditOptions.selected = ctx.oInit.inlineEdit.useLocalValues ? ctx.inlineEdit.lastRow.cellValues[cont] : ctx.json.rows[$fila.idx][cellColModel.name] + '';\n              searchEditOptions.inlineEditFieldName = cellColModel.name;\n            }\n\n            if (searchRupType === 'select' || searchRupType === 'combo' || searchRupType === 'autocomplete') {\n              // Permite inicializar el componente con el source correcto.\n              searchEditOptions.inlineEdit = {};\n              searchEditOptions.inlineEdit.$auxForm = ctx.oInit.inlineEdit.idForm;\n              searchEditOptions.inlineEdit.auxSiblingFieldName = cellColModel.name;\n            } //Se Comprueba que los elemnetos menu estan eliminados.\n\n\n            if ($('#' + $elem.attr('id') + '-menu').length > 0) {\n              $('#' + $elem.attr('id') + '-menu').remove('ul');\n            } // Invocación al componente RUP\n\n\n            $elem['rup_' + searchRupType](searchEditOptions);\n          } else if (cellColModel.edittype === 'checkbox') {\n            $elem.prop('type', 'checkbox').parent().toggleClass('form-groupMaterial checkbox-material checkbox-material-inline').append('<label for=\"' + $elem.attr('name') + '\"></label>').closest('td').addClass('text-center');\n            var valueCelda = ctx.inlineEdit.lastRow.cellValues[cont];\n\n            if ($(valueCelda).find('i.mdi-close').length === 1) {\n              $elem.prop('checked', false);\n            } else if ($(valueCelda).find('i.mdi-check').length === 1) {\n              $elem.prop('checked', true);\n            }\n          } //Fin conversion\n          //Nos aseguramos de que el input existe\n\n\n          if (ctx.inlineEdit.lastRow.ponerFocus) {\n            $input.focus();\n            ctx.inlineEdit.lastRow.ponerFocus = false; //Realizar comprobaciones por si el id es NO editable\n\n            if (edicion && ctx.oInit.blockPKeditForm && ctx.oInit.primaryKey.length > 0) {\n              $.each(ctx.oInit.primaryKey, function (key, id) {\n                if (id == cellColModel.name) {\n                  ctx.inlineEdit.lastRow.ponerFocus = true;\n                }\n              });\n            }\n          }\n        }\n\n        cont++;\n\n        if ($celda.css('display') === 'none') {\n          ocultos++;\n        }\n      }\n    });\n    return cont - ocultos;\n  }\n  /**\r\n  * Método para restaurar las celdas.\r\n  *\r\n  * @name _restaurarCeldas\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $fila - Fila que se está editando.\r\n  * @param {object} $celdas - Todas las celdas a recorrer.\r\n  * @param {integer} contRest - Contador para saber en que celda nos movemos, sobre todo en el responsive.\r\n  *\r\n  */\n\n\n  function _restaurarCeldas(ctx, $fila, $celdas, contRest) {\n    if ($fila.hasClass('editable')) {\n      var colModel = ctx.oInit.colModel;\n      $fila.removeClass('editable');\n      $celdas.each(function () {\n        var celda = $(this);\n        var $celda = $(celda);\n\n        if (!$celda.hasClass('select-checkbox')) {\n          // Si la columna a usar está oculta, se aumenta el contador para usar la siguiente que no lo esté\n          while (colModel[contRest].hidden) {\n            contRest++;\n          }\n\n          var cellColModel = colModel[contRest];\n\n          if (cellColModel.editable === true) {\n            $celda.html(ctx.inlineEdit.lastRow.cellValues[contRest]);\n\n            if ($celda.find('span.openResponsive').length) {\n              // si esta volverle a dar la funcionalidad, y es responsive\n              var count = ctx.responsive.s.current.reduce(function (a, b) {\n                return b === false ? a + 1 : a;\n              }, 0);\n\n              if (count > 0) {\n                // si hay responsive\t\n                var $span = $celda.find('span.openResponsive');\n                $span.click(function (event) {\n                  if ($fila.hasClass('editable') && $fila.find('.closeResponsive').length) {\n                    //nose hace nada. si esta editando\n                    event.stopPropagation();\n                  } else {\n                    if ($span.hasClass('closeResponsive')) {\n                      $span.removeClass('closeResponsive');\n                    } else {\n                      $span.addClass('closeResponsive');\n                    }\n                  }\n                });\n              } else {\n                //si NO hay responsive\n                $celda.find('span.openResponsive').remove();\n              }\n            }\n          }\n\n          if (cellColModel.edittype === 'checkbox') {\n            $celda.closest('td').removeClass('text-center');\n          }\n\n          contRest++;\n        }\n      });\n    }\n\n    return contRest;\n  }\n  /**\r\n  * Comprueba que si la fila está en responsive mantenga el diseño.\r\n  *\r\n  * @name _comprobarFila\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $fila - fila que se está editando.\r\n  *\r\n  */\n\n\n  function _comprobarFila(ctx, $fila) {\n    var count = ctx.responsive.s.current.reduce(function (a, b) {\n      return b === false ? a + 1 : a;\n    }, 0);\n    var $span = $fila.find('span.openResponsive');\n\n    if ($fila.next('.child').length === 0) {\n      $span.click();\n    } else {\n      $span.addClass('closeResponsive');\n    }\n\n    var $filaChild = $fila.next('.child');\n    var contFields = ctx.responsive.s.current.length - count;\n\n    if ($fila.find('td.select-checkbox').length) {\n      contFields--;\n    }\n\n    _recorrerCeldas(ctx, $filaChild, $filaChild.find(ctx.oInit.responsive.selectorResponsive), contFields);\n\n    if ($filaChild.length > 0 && !$filaChild.hasClass('new') && !ctx.oInit.inlineEdit.alta) {\n      DataTable.Api().rupTable.blockPKEdit(ctx, 'PUT', '_inline_child');\n    } //Se crea el evento para el tr child de escape\n\n\n    _crearEventos(ctx, $filaChild);\n\n    var tabla = $('#' + ctx.sTableId).DataTable();\n    tabla.responsive.recalc();\n  }\n  /**\r\n  * Crea los eventos asociados a la fila.\r\n  *\r\n  * @name _crearEventos\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $selector - fila que se está editando.\r\n  *\r\n  */\n\n\n  function _crearEventos(ctx, $selector) {\n    if ($selector.data('events') === undefined || $selector.data('events').keydown === undefined) {\n      $selector.keydown(function (e) {\n        if (e.keyCode === 27) {\n          //Esc\n          if ($selector.hasClass('new')) {\n            //si se da alta y se cancela.\n            var dt = $('#' + ctx.sTableId).DataTable();\n            ctx.inlineEdit.lastRow = undefined;\n            ctx.oInit.inlineEdit.alta = undefined; //primer parametro para mandar una funcion a ejecutar, segundo parametro bloquear la pagina si pones false\n\n            dt.ajax.reload(undefined, false);\n          } else {\n            //si se modifica\n            _restaurarFila(ctx, true);\n          }\n        } else if (e.keyCode === 13 || e.keyCode === 9 && _lastIndexEditable(ctx, $(e.target))) {\n          //Intro 13, //Tabulador 9\n          var child = false;\n\n          if ($selector.parent('tr').length > 0) {\n            //si es mayor que cero la seleccion es en el td,hay que pasar al tr.\n            $selector = $selector.parent('tr');\n          }\n\n          if ($selector.find('.child').length === 1 || $selector.hasClass('child')) {\n            child = true;\n          }\n\n          _guardar(ctx, $selector, child);\n\n          return false;\n        }\n      });\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableEditLineCrearEventos', ctx);\n  }\n  /**\r\n  * Método para recorre las celdas y las procesa.\r\n  *\r\n  * @name _lastIndexEditable\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $target - fila que se está editando.\r\n  *\r\n  * @return devuelve si es el último index editado\r\n  */\n\n\n  function _lastIndexEditable(ctx, $target) {\n    var indexTarget = $target.closest('td').index(); //Se recorren las columnas a la inversa, si es editable, se devuelve la posicion\n    //Si llama el hijo calcular index\n\n    if ($target.closest('tr.child').length === 1) {\n      indexTarget = ctx.aoColumns.length - $target.closest('ul').find('li').length + $target.closest('li').index();\n    }\n\n    var index = 0;\n\n    for (var i = ctx.aoColumns.length - 1; i >= 0; i--) {\n      var nombreColumna = ctx.aoColumns[i].data;\n\n      for (var j = 0; j <= ctx.oInit.colModel.length; j++) {\n        var nombreAux = ctx.oInit.colModel[j].name;\n        var editable = ctx.oInit.colModel[j].editable;\n\n        if (editable === true && nombreAux === nombreColumna) {\n          index = i;\n          break;\n        }\n      }\n\n      if (index !== 0) {\n        break;\n      }\n    }\n\n    if (indexTarget === index) {\n      return true;\n    }\n\n    return false;\n  }\n  /**\r\n  * Metodo que serializa los datos del formulario.\r\n  *\r\n  * @name _inlineEditFormSerialize\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.2.0\r\n  *\r\n  * @param {object} $fila - Fila la cual estamos editando.\r\n  * @param {object} ctx - Contexto del table.\r\n  * @param {boolean} child - boolean para saber si tiene hijos en el responsive.\r\n  *\r\n  *\r\n  */\n\n\n  function _inlineEditFormSerialize($fila, ctx, child) {\n    var serializedForm = {};\n    var selectores = {}; //añadir columnas child\n\n    if (child === false) {\n      selectores[0] = $fila;\n\n      if ($fila.next().find('.child').length === 1) {\n        selectores[1] = $fila.next();\n      }\n    } else {\n      //existe child\n      selectores[0] = $fila.prev();\n      selectores[1] = $fila;\n    } //Se vacian las reglas.\n\n\n    $.each(selectores, function () {\n      // Añadir las columnas parent y child.\n      var busqueda = 'td:not([style*=\"display: none\"]):not(\".select-checkbox\") input:not([disabled]),' + 'td:not([style*=\"display: none\"]):not(\".select-checkbox\") select:not([disabled]),' + 'td:not([style*=\"display: none\"]):not(\".select-checkbox\") textarea:not([disabled])'; // Si es el hijo, solo buscar los select, input y textarea que haya.\n\n      if (this.hasClass('child')) {\n        busqueda = 'select,input,textarea';\n      }\n\n      $.each(this.find(busqueda), function (i, obj) {\n        var nombre = obj.id.replace('_inline', '').replace('_child', '');\n        var value = $(obj).val(); // Comprobar si contiene un caracter invalido\n\n        if (value.includes(\"%\")) {\n          serializedForm = false;\n          return false;\n        }\n\n        if ($(obj).prop('type') !== undefined && $(obj).prop('type') === 'checkbox') {\n          value = '0';\n\n          if ($(obj).prop('checked')) {\n            value = '1';\n          }\n        }\n\n        serializedForm[nombre] = value;\n      });\n    }); //añadir los no editables,en caso de SOLO edición, \n\n    if (!selectores[0].hasClass('new') && typeof serializedForm !== \"boolean\") {\n      jQuery.grep(ctx.oInit.colModel, function (n, i) {\n        if (n.editable !== true) {\n          var text = ctx.json.rows[$('tr:not(.group)', $(ctx.nTBody)).index($fila)][n.name];\n          serializedForm[n.name] = text;\n          return n;\n        }\n      });\n    }\n\n    return serializedForm;\n  }\n  /**\r\n  * Método para llamar al ajax de guardado y nuevo.\r\n  *\r\n  * @name _guardar\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $fila - fila que se está editando.\r\n  * @param {boolean} $child - boolean para decir si la llamada es del hijo o del padre\r\n  *\r\n  */\n\n\n  function _guardar(ctx, $fila, child) {\n    //Se serializa el formulario con los cambios\n    var row = _inlineEditFormSerialize($fila, ctx, child);\n\n    $.each(ctx.oInit.primaryKey, function (index, key) {\n      row[key] = ctx.json.rows[$('tr:not(.group)', $(ctx.nTBody)).index($fila)][key];\n    });\n\n    if (!row) {\n      _callFeedbackOk(ctx, $.rup.i18nParse($.rup.i18n.base, 'rup_global.charError'), 'error');\n\n      $('#' + ctx.sTableId).triggerHandler('tableEditInLineErrorCallSaveAjax', ctx);\n    } else {\n      var actionType = 'PUT';\n\n      if ($fila.hasClass('new') || child && $fila.prev().hasClass('new')) {\n        //si ejecurar el child, hay que buscar el padre para saver si es nuevo.\n        actionType = 'POST';\n      }\n\n      if (actionType === 'PUT') {\n        var customModificar = ctx.oInit.validarModificar;\n\n        if (typeof customModificar === \"function\" && customModificar(ctx)) {\n          return false;\n        }\n      } else if (actionType === 'POST') {\n        var customAlta = ctx.oInit.validarAlta;\n\n        if (typeof customAlta === \"function\" && customAlta(ctx)) {\n          return false;\n        }\n      }\n\n      var url = actionType == 'POST' ? '/add' : '/edit'; // Comprobar si se ha definido otra URL en las propiedades, en caso afirmativo, se aplica.\n\n      var property = url.substring(1) + 'Url';\n\n      if (ctx.oInit.inlineEdit[property]) {\n        url = ctx.oInit.inlineEdit[property];\n      }\n\n      _callSaveAjax(actionType, ctx, $fila, row, url, false);\n\n      $('#' + ctx.sTableId).triggerHandler('tableEditlineGuardar', ctx);\n    }\n  }\n  /**\r\n  * Llamada al servidor con los datos de edición.\r\n  *\r\n  * @name _callSaveAjax\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {string} actionType - Es la acción que se va a ajecutar en el formulario para ir al controller, basado en rest.\r\n  * @param {object} ctx - Es el contexto table.\r\n  * @param {object} $fila - Fila que se está editando.\r\n  * @param {object} $row - Son los datos que se cargan.\r\n  * @param {string} url - Url que se añade para llamar  al controller. Añadir, editar o borrar.\r\n  * @param {boolean} isDeleting - Evita mostrar el diálogo de confirmación porque la función _deleteAllSelects() tiene el suyo propio.\r\n  *\r\n  */\n\n\n  function _callSaveAjax(actionType, ctx, $fila, row, url, isDeleting) {\n    var _makeAjaxCall = function _makeAjaxCall() {\n      $('#' + ctx.sTableId).triggerHandler('tableEditInLineBeforeCallAjax', [ctx, actionType, url]); // add Filter\n\n      var feed = ctx.oInit.feedback.$feedbackContainer;\n      var msgFeedBack = $.rup.i18nParse($.rup.i18n.base, 'rup_table.modifyOK');\n\n      if (url === '/deleteAll' || actionType === 'DELETE') {\n        msgFeedBack = $.rup.i18nParse($.rup.i18n.base, 'rup_table.deletedOK');\n      }\n\n      if (ctx.oInit.masterDetail !== undefined) {\n        //Asegurar que se recoge el idPadre\n        var masterPkObject = DataTable.Api().masterDetail.getMasterTablePkObject(ctx);\n        row = jQuery.extend(true, row, masterPkObject);\n      }\n\n      var ajaxOptions = {\n        url: ctx.oInit.urlBase + url,\n        accepts: {\n          '*': '*/*',\n          'html': 'text/html',\n          'json': 'application/json, text/javascript',\n          'script': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript',\n          'text': 'text/plain',\n          'xml': 'application/xml, text/xml'\n        },\n        type: actionType,\n        data: row,\n        dataType: 'json',\n        showLoading: false,\n        contentType: 'application/json',\n        async: true,\n        success: function success(data, status, xhr) {\n          $('#' + ctx.sTableId + 'saveButton_1').prop('disabled', true);\n          $('#' + ctx.sTableId + 'saveButton_1_contextMenuToolbar').addClass('disabledButtonsTable');\n          $('#' + ctx.sTableId + 'cancelButton_1').prop('disabled', true);\n          $('#' + ctx.sTableId + 'cancelButton_1_contextMenuToolbar').addClass('disabledButtonsTable');\n          ctx.oInit.inlineEdit.alta = undefined;\n          var dt = $('#' + ctx.sTableId).DataTable();\n          var idPk = DataTable.Api().rupTable.getIdPk(data, ctx.oInit);\n\n          if (url !== '/deleteAll' && actionType !== 'DELETE') {\n            // Se informa al feedback de la tabla\n            _callFeedbackOk(ctx, msgFeedBack, 'ok');\n\n            if (actionType === 'PUT') {\n              var rowIndex = $('tr:not(.group)', $(ctx.nTBody)).index($fila); // Modificar\n\n              dt.row(rowIndex).data(data);\n              ctx.json.rows[rowIndex] = data; // Actualizamos el último id seleccionado (por si ha sido editado)\n\n              var posicion = 0;\n              $.each(ctx.multiselection.selectedRowsPerPage, function (index, p) {\n                if (p.id == ctx.multiselection.lastSelectedId) {\n                  posicion = index;\n                  return;\n                }\n              });\n\n              if (ctx.seeker !== undefined && !jQuery.isEmptyObject(ctx.seeker.ajaxOption.data.search) && ctx.seeker.search.funcionParams !== undefined && ctx.seeker.search.funcionParams.length > 0) {\n                _comprobarSeeker(data, ctx, rowIndex);\n              }\n\n              ctx.multiselection.lastSelectedId = idPk;\n              ctx.multiselection.selectedRowsPerPage[posicion].id = idPk;\n            } else {\n              // Alta o clonado\n              if (ctx.oInit.inlineEdit.currentPos !== undefined && ctx.oInit.inlineEdit.currentPos.actionType === 'CLONE') {\n                // Clonado (se mantiene seleccionado el registro original)\n                ctx.multiselection.selectedIds.push(idPk); // Si la multiselección está activada se suma el nuevo registro seleccionado, en los demás casos, se establece a uno los registros seleccionados\n\n                ctx.multiselection.numSelected = ctx.oInit.multiSelect ? ctx.multiselection.numSelected + 1 : 1;\n              } else {\n                // Alta nueva\n                ctx.multiselection.selectedIds = [idPk];\n                ctx.multiselection.numSelected = 1;\n              }\n\n              ctx.multiselection.lastSelectedId = idPk;\n              ctx.multiselection.selectedRowsPerPage[0].id = idPk;\n            }\n\n            ctx.inlineEdit.row = data;\n          } else {\n            // Eliminar\n            ctx.oInit.feedback.type = 'eliminar';\n            ctx.oInit.feedback.msgFeedBack = msgFeedBack;\n\n            if (ctx.oInit.multiSelect !== undefined) {\n              DataTable.Api().multiSelect.deselectAll(dt);\n            } else if (ctx.oInit.select !== undefined) {\n              DataTable.Api().select.deselect(ctx);\n\n              _callFeedbackOk(ctx, msgFeedBack, 'ok'); //Se informa feedback de la tabla\n\n            }\n\n            $('#' + ctx.sTableId).triggerHandler('tableEditInLineAfterDelete', ctx);\n          }\n\n          ctx.inlineEdit.row = undefined;\n          ctx.inlineEdit.lastRow = undefined;\n          ctx._buttons[0].inst.s.disableAllButtons = undefined;\n          DataTable.Api().seeker.disabledButtons(ctx); // Recargar datos (el primer parámetro es el callback y el segundo permite permanecer en la página actual cuando es false)\n\n          dt.ajax.reload(function () {\n            _addChildIcons(ctx);\n          }, false);\n        },\n        complete: function complete() {\n          $('#' + ctx.sTableId).triggerHandler('tableEditInLineCompleteCallSaveAjax', ctx);\n        },\n        error: function error(xhr) {\n          if (xhr.status === 406 && xhr.responseText !== '') {\n            try {\n              var responseJSON = JSON.parse(xhr.responseText);\n\n              if (responseJSON.rupErrorFields) {\n                if (responseJSON.rupErrorFields !== undefined || responseJSON.rupFeedback !== undefined) {\n                  //se transforma a inline\n                  var rulesAux = responseJSON.rupErrorFields;\n                  $.each(rulesAux, function (name, rule) {\n                    if ($('#' + name + '_inline').length === 1) {\n                      responseJSON.rupErrorFields[name + '_inline'] = rule;\n                    }\n\n                    if ($('#' + name + '_inline_child').length === 1) {\n                      responseJSON.rupErrorFields[name + '_inline_child'] = rule;\n                    }\n\n                    delete responseJSON.rupErrorFields[name];\n                  });\n                  var $form = $('#' + ctx.sTableId + '_search_searchForm');\n                  $form.validate().submitted = $.extend(true, $form.validate().submitted, responseJSON.rupErrorFields);\n                  $form.validate().invalid = responseJSON.rupErrorFields;\n                  $form.validate().showErrors(responseJSON.rupErrorFields);\n                } else if (errors.rupFeedback !== undefined) {\n                  var mensajeJSON = $.rup_utils.printMsg(responseJSON.rupFeedback.message);\n\n                  _callFeedbackOk(ctx, mensajeJSON, 'error');\n                }\n              }\n            } catch (e) {\n              // El mensaje NO es JSON\n              _callFeedbackOk(ctx, xhr.responseText, 'error');\n            }\n          } else {\n            //cualquier error se devuelve el texto\n            _callFeedbackOk(ctx, xhr.responseText, 'error');\n          }\n\n          $('#' + ctx.sTableId).triggerHandler('tableEditInLineErrorCallSaveAjax', ctx);\n        },\n        validate: ctx.oInit.inlineEdit.validate,\n        feedback: feed\n      };\n\n      if (ctx.inlineEdit.lastRow !== undefined) {\n        ctx.inlineEdit.lastRow.submit = 1;\n      } // Se cambia el data\n\n\n      if (ajaxOptions.data == '') {\n        delete ajaxOptions.data;\n        $.rup_ajax(ajaxOptions);\n      } else if (isDeleting || $('#' + ctx.sTableId + '_search_searchForm').valid()) {\n        // Obtener el valor del parámetro HDIV_STATE (en caso de no estar disponible se devolverá vacío) siempre y cuando no se trate de un deleteAll porque en ese caso ya lo contiene el filtro\n        if (url.indexOf('deleteAll') === -1) {\n          // Elimina los campos _label generados por los autocompletes que no forman parte de la entidad\n          $.fn.deleteAutocompleteLabelFromObject(ajaxOptions.data); // Elimina los campos autogenerados por los multicombos que no forman parte de la entidad\n\n          $.fn.deleteMulticomboLabelFromObject(ajaxOptions.data, $fila);\n          $.when(_loadAuxForm(ctx, actionType)).then(function () {\n            var hdivStateParamValue = $.fn.getHDIV_STATE(undefined, ctx.oInit.inlineEdit.idForm);\n\n            if (hdivStateParamValue !== '') {\n              ajaxOptions.data._HDIV_STATE_ = hdivStateParamValue;\n            }\n\n            ajaxOptions.data = JSON.stringify(ajaxOptions.data);\n            $.rup_ajax(ajaxOptions);\n          });\n        } else {\n          ajaxOptions.data = JSON.stringify(ajaxOptions.data);\n          $.rup_ajax(ajaxOptions);\n        }\n      }\n    };\n\n    if (ctx.oInit.inlineEdit.settings.saveDialog && !isDeleting) {\n      $.rup_messages('msgConfirm', {\n        title: actionType == 'POST' ? $.rup.i18nParse($.rup.i18n.base, 'rup_table.add.save') : $.rup.i18nParse($.rup.i18n.base, 'rup_table.edit.save'),\n        message: actionType == 'POST' ? $.rup.i18nParse($.rup.i18n.base, 'rup_table.add.saveData') : $.rup.i18nParse($.rup.i18n.base, 'rup_table.edit.saveData'),\n        OKFunction: function OKFunction() {\n          _makeAjaxCall();\n\n          $('#' + ctx.sTableId).triggerHandler('tableMessageOk', ctx);\n        },\n        CANCELFunction: function CANCELFunction() {\n          $('#' + ctx.sTableId).triggerHandler('tableMessageCancel', ctx);\n        },\n        CLOSEFunction: function CLOSEFunction() {\n          $('#' + ctx.sTableId).triggerHandler('tableMessageClose', ctx);\n        }\n      });\n    } else {\n      _makeAjaxCall();\n    }\n  }\n  /**\r\n   * Función que gestiona la carga del formulario del que se obtendrá el parámetro HDIV_STATE en función del tipo de method, POST o PUT.\r\n   *\r\n   * @name loadAuxForm\r\n   * @function\r\n   * @since UDA 5.0.0 (backported) // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Contexto del Datatable.\r\n   * @param {string} actionType - Acción a ajecutar en el formulario para ir al controller, basado en REST.\r\n   *\r\n   * @return {object}\r\n   */\n\n\n  function _loadAuxForm(ctx, actionType) {\n    var idForm = ctx.oInit.inlineEdit !== undefined ? ctx.oInit.inlineEdit.idForm : undefined; // Servirá para saber si la última llamada a inlineEdit fue para añadir, editar o si aún no ha sido inicializado\n\n    var lastAction = ctx.oInit.inlineEdit.actionType; // Si el usuario ha activado los formularios dinámicos y la última acción no es la misma que la actual, es necesario volver a obtener el formulario\n\n    if (ctx.oInit.enableDynamicForms && lastAction !== actionType) {\n      // Preparar la información a enviar al servidor. Como mínimo se enviará el actionType y el identificador de la tabla.\n      var defaultData = {\n        'actionType': actionType,\n        'tableID': ctx.sTableId\n      };\n      var data = ctx.oInit.inlineEdit.data !== undefined ? $.extend({}, defaultData, ctx.oInit.inlineEdit.data) : defaultData;\n      return $.post(ctx.oInit.inlineEdit.url !== undefined ? ctx.oInit.inlineEdit.url : ctx.oInit.urlBase + '/inlineEdit', data, function (form) {\n        // Guardar anterior formulario para poder comprobarlo con el recién recibido\n        var tempForm = idForm !== undefined ? idForm : undefined; // Guardar referencia del formulario recibido\n\n        var receivedForm = $(form).find(\"form\").addBack('form'); // Si existe un formulario previo con el mismo identificador que el recibido, se elimina\n\n        if (tempForm !== undefined && tempForm.length === 1 && tempForm.attr(\"id\") === receivedForm.attr(\"id\")) {\n          tempForm.remove();\n        }\n\n        var tableWrapper = $('#' + ctx.sTableId + '_wrapper');\n        tableWrapper.prepend(receivedForm);\n        ctx.oInit.inlineEdit.actionType = actionType;\n        ctx.oInit.inlineEdit.idForm = tableWrapper.find(\"form\").first();\n      }, 'html');\n    } else {\n      // Para cuando el formulario actual sigue siendo válido o los formularios dinámicos están desactivados\n      var deferred = $.Deferred();\n      ctx.oInit.inlineEdit.actionType = actionType;\n      deferred.resolve();\n      return deferred.promise();\n    }\n  }\n  /**\r\n   * Llamada para crear el feedback dentro del dialog.\r\n   *\r\n   * @name callFeedbackOk\r\n   * @function\r\n   * @since UDA 3.7.0 // Table 1.0.0\r\n   *\r\n   * @param {object} ctx - Settings object to operate on.\r\n   * @param {object} feedback - Div donde se va ejecutar el feedback.\r\n   * @param {string} msgFeedBack - Mensaje para el feedback.\r\n   * @param {string} type - Tipos del feedback, mirar en el rup.feedback..\r\n   *\r\n   */\n\n\n  function _callFeedbackOk(ctx, msgFeedBack, type) {\n    if (ctx.oInit.inlineEdit.disabledFeedback) {\n      //no muestra el feedback\n      return false;\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableEditInLineFeedbackShow', ctx);\n    ctx.oInit.feedback.$feedbackContainer.rup_feedback('set', msgFeedBack, type);\n    ctx.oInit.feedback.$feedbackContainer.rup_feedback('show');\n  }\n  /**\r\n  * Cambiar los valores de los inputs de responsive a normal y viciversa.\r\n  *\r\n  * @name _inResponsiveChangeInputsValues\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $fila - fila que se está editando.\r\n  *\r\n  */\n\n\n  function _inResponsiveChangeInputsValues(ctx, $fila) {\n    var table = $('#' + ctx.sTableId).DataTable();\n    ctx.inlineEdit.lastRow.rupValues = [];\n    table.columns().responsiveHidden().each(function (valor, i) {\n      if (!$fila.find('td').eq(i).hasClass('select-checkbox')) {\n        //si la primera columna es de seleccion no entrar.\n        if (valor !== ctx.inlineEdit.lastRow.columnsHidden[i] && ctx.oInit.columns[i].editable) {\n          //Si hay cambio meter el valor al input\n          var value = '';\n\n          if (valor) {\n            //se coge el valor del child.\n            var cont = ctx.inlineEdit.lastRow.columnsHidden.reduce(function (a, b) {\n              return b === false ? a + 1 : a;\n            }, 0);\n            var total = ctx.inlineEdit.lastRow.columnsHidden.length;\n            cont = cont + i - total;\n            var $inputChild = $fila.next('.child').find('li').eq(cont).find('select,input');\n            value = $inputChild.val();\n\n            if ($inputChild.length > 0) {\n              $('#' + $inputChild[0].id.replace('_child', '')).prop('disabled', false);\n            }\n\n            if ($inputChild.is(':checkbox')) {\n              //x si es checkbox\n              if ($inputChild.prop('checked')) {\n                value = true;\n              } else {\n                value = false;\n              }\n            }\n          } else {\n            //se coge el valor de los inputs ocultos.\n            var $input = $fila.find('td').eq(i).find('select,input');\n            value = $input.val();\n            $input.prop('disabled', true);\n\n            if ($input.is(':checkbox')) {\n              //x si es checkbox\n              if ($input.prop('checked')) {\n                value = true;\n              } else {\n                value = false;\n              }\n            }\n          }\n        } else {\n          var contar = ctx.inlineEdit.lastRow.columnsHidden.reduce(function (a, b) {\n            return b === false ? a + 1 : a;\n          }, 0);\n          var totalContar = ctx.inlineEdit.lastRow.columnsHidden.length;\n          contar = contar + i - totalContar; // se asigna valor normal\n\n          if (valor || $fila.next('.child').find('li').eq(contar).find('select,input').length === 0) {\n            var $input2 = $fila.find('td').eq(i).find('select,input');\n            value = $input2.val();\n\n            if ($input2.is(':checkbox')) {\n              //x si es checkbox\n              if ($input2.prop('checked')) {\n                value = true;\n              } else {\n                value = false;\n              }\n            }\n          } else {\n            var $inputChild2 = $fila.next('.child').find('li').eq(contar).find('select,input');\n            value = $inputChild2.val();\n\n            if ($inputChild2.is(':checkbox')) {\n              //x si es checkbox\n              if ($inputChild2.prop('checked')) {\n                value = true;\n              } else {\n                value = false;\n              }\n            }\n          }\n        } //Guardar los inputs\n\n\n        ctx.inlineEdit.lastRow.rupValues.push({\n          idCell: i,\n          value: value,\n          visible: valor\n        });\n      }\n    });\n  }\n  /**\r\n  * Asignar los valores de los inputs en responsive.\r\n  *\r\n  * @name _asignarInputsValues\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $fila - fila que se está editando.\r\n  *\r\n  */\n\n\n  function _asignarInputsValues(ctx, $fila) {\n    var contChild = 0;\n    $.each(ctx.inlineEdit.lastRow.rupValues, function (i, celda) {\n      if (celda.value !== undefined) {\n        if (celda.visible) {\n          // se asignan a los inputs ocultos\n          if ($fila.find('td').eq(celda.idCell).find('select').length > 0) {\n            $fila.find('td').eq(celda.idCell).find('select').rup_combo('setRupValue', celda.value);\n          } else {\n            $fila.find('td').eq(celda.idCell).find('input').val(celda.value);\n\n            if ($fila.find('td').eq(celda.idCell).find('input').is(':checkbox')) {\n              if (celda.value) {\n                $fila.find('td').eq(celda.idCell).find('input').prop('checked', true);\n              } else {\n                $fila.find('td').eq(celda.idCell).find('input').prop('checked', false);\n              }\n            }\n          }\n        } else {\n          //se asignan alos child\n          if ($fila.next('.child').find('li').eq(contChild).find('select').length > 0) {\n            $fila.next('.child').find('li').eq(contChild).find('select').rup_combo('setRupValue', celda.value);\n          } else {\n            $fila.next('.child').find('li').eq(contChild).find('input').val(celda.value);\n\n            if ($fila.next('.child').find('li').eq(contChild).find('input').is(':checkbox')) {\n              if (celda.value) {\n                $fila.next('.child').find('li').eq(contChild).find('input').prop('checked', true);\n              } else {\n                $fila.next('.child').find('li').eq(contChild).find('input').prop('checked', false);\n              }\n            }\n          }\n\n          contChild++;\n        }\n      } else if (!celda.visible) {\n        //si esta oculto, es un child no editable por lo que hay que contarlo.\n        contChild++;\n      }\n    });\n  }\n  /**\r\n  * Se crear un tr ficticio cuando se va a añadir un registro.\r\n  *\r\n  * @name _createTr\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} dt - table\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  * @param {object} $columns - Módelo de columnas de la tabla.\r\n  *\r\n  */\n\n\n  function _createTr(dt, ctx, columns) {\n    var row = {};\n\n    if (ctx.oInit.colModel !== undefined) {\n      jQuery.grep(ctx.oInit.colModel, function (n) {\n        row[n.name] = '';\n      });\n      columns.unshift(row);\n    }\n\n    return columns;\n  }\n  /**\r\n  * Dibujar los iconos del responsive.\r\n  *\r\n  * @name _drawInLineEdit\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} tabla - Api de la tabla\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  *\r\n  */\n\n\n  function _drawInlineEdit(tabla, ctx) {\n    _addChildIcons(ctx);\n\n    var row = ctx.inlineEdit.row;\n\n    if (ctx.inlineEdit.row !== undefined && _notExistOnPage(ctx)) {\n      var rowAux = row;\n      $.each(ctx.json.rows, function (index, r) {\n        var rowNext = r;\n        tabla.row(index).data(rowAux);\n        rowAux = rowNext;\n      });\n      ctx.json.rows.pop();\n      ctx.json.rows.splice(0, 0, row);\n    }\n  }\n  /**\r\n  * Para saber si hay paginación o no.\r\n  *\r\n  * @name _notExistOnPage\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} ctx - Es el contexto de cada tabla.\r\n  *\r\n  *\r\n  *@return {boolean} si existe paginación o no.\r\n  */\n\n\n  function _notExistOnPage(ctx) {\n    var pk = DataTable.Api().rupTable.getIdPk(ctx.inlineEdit.row, ctx.oInit);\n    var encontrado = true;\n    $.each(ctx.json.rows, function (index, r) {\n      if (DataTable.Api().rupTable.getIdPk(r, ctx.oInit) == pk) {\n        encontrado = false;\n        return false;\n      }\n    });\n    ctx.inlineEdit.row = undefined;\n    return encontrado;\n  }\n  /**\r\n  * Metodo que elimina todos los registros seleccionados.\r\n  *\r\n  * @name _deleteAllSelects\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} dt - Es el objeto table.\r\n  *\r\n  */\n\n\n  function _deleteAllSelects(dt) {\n    var ctx = dt.settings()[0];\n    var idRow = 0;\n    var regex = new RegExp(ctx.oInit.multiplePkToken, 'g');\n    var actionType = ctx.multiselection.selectedIds.length > 1 ? 'POST' : 'DELETE';\n\n    var _doDelete = function _doDelete() {\n      var row = {};\n      row.filter = window.form2object(ctx.oInit.filter.$filterContainer[0]);\n\n      if (ctx.multiselection.selectedIds.length > 1) {\n        row.core = {\n          'pkToken': ctx.oInit.multiplePkToken,\n          'pkNames': ctx.oInit.primaryKey\n        };\n        row.multiselection = {};\n        row.multiselection.selectedAll = ctx.multiselection.selectedAll;\n\n        if (row.multiselection.selectedAll) {\n          row.multiselection.selectedIds = ctx.multiselection.deselectedIds;\n        } else {\n          row.multiselection.selectedIds = ctx.multiselection.selectedIds;\n        }\n\n        _callSaveAjax(actionType, ctx, idRow, row, '/deleteAll', true);\n      } else {\n        row = ctx.multiselection.selectedIds[0];\n        row = row.replace(regex, '/');\n\n        _callSaveAjax(actionType, ctx, '', idRow, '/' + row, true);\n      }\n    };\n\n    if (ctx.oInit.inlineEdit.settings.deleteDialog) {\n      $.rup_messages('msgConfirm', {\n        message: $.rup.i18nParse($.rup.i18n.base, 'rup_table.deleteAll'),\n        title: $.rup.i18nParse($.rup.i18n.base, 'rup_table.delete'),\n        OKFunction: function OKFunction() {\n          _doDelete();\n\n          $('#' + ctx.sTableId).triggerHandler('tableMessageOk', ctx);\n        },\n        CANCELFunction: ctx.oInit.inlineEdit.cancelDeleteFunction\n      });\n    } else {\n      _doDelete();\n    }\n  }\n  /**\r\n  * Metodo que comprueba el seeker.\r\n  *\r\n  * @name _comprobarSeeker\r\n  * @function\r\n  * @since UDA 3.7.0 // Table 1.0.0\r\n  *\r\n  * @param {object} row - Son los datos que se cargan.\r\n  * @param {object} ctx - Settings object to operate on.\r\n  * @param {number} idRow - Identificador de la fila.\r\n  *\r\n  */\n\n\n  function _comprobarSeeker(row, ctx, idRow) {\n    var cumple = true;\n    $.each(ctx.seeker.ajaxOption.data.search, function (key, obj) {\n      if (row[key].indexOf(obj) === -1) {\n        cumple = false;\n        return false;\n      }\n    });\n\n    if (!cumple) {\n      // eliminar del seeker, por pagina y linea\t\t\n      ctx.seeker.search.funcionParams = jQuery.grep(ctx.seeker.search.funcionParams, function (search) {\n        return search.page !== Number(ctx.json.page) || search.pageLine !== idRow + 1;\n      }); // se borra el icono\n\n      $('#' + ctx.sTableId + ' tbody tr').eq(idRow).find('td.select-checkbox i.filtered-row').remove();\n      $('#' + ctx.sTableId + ' tbody tr').eq(idRow).find('td i.filtered-row').remove();\n      DataTable.Api().seeker.updateDetailSeekPagination(1, ctx.seeker.search.funcionParams.length, ctx);\n    }\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables API\r\n   *\r\n   * For complete documentation, please refer to the docs/api directory or the\r\n   * DataTables site\r\n   */\n  // Local variables to improve compression\n\n\n  var apiRegister = DataTable.Api.register;\n  apiRegister('inlineEdit.add()', function (dt, ctx) {\n    _add(dt, ctx);\n  });\n  apiRegister('inlineEdit.editInline()', function (dt, ctx, idRow) {\n    _editInline(dt, ctx, idRow);\n  });\n  apiRegister('inlineEdit.restaurarFila()', function (ctx, limpiar) {\n    _restaurarFila(ctx, limpiar);\n  });\n  apiRegister('inlineEdit.editSameLine()', function (ctx, idx) {\n    var mismaLinea = false;\n\n    if (ctx.inlineEdit !== undefined && ctx.inlineEdit.lastRow !== undefined && ctx.inlineEdit.lastRow.idx == idx) {\n      mismaLinea = true;\n    }\n\n    return mismaLinea;\n  });\n  apiRegister('inlineEdit.recorrerCeldas()', function (ctx, $fila, $celdas, cont) {\n    _recorrerCeldas(ctx, $fila, $celdas, cont);\n  });\n  apiRegister('inlineEdit.comprobarFila()', function (ctx, $fila) {\n    _comprobarFila(ctx, $fila);\n  });\n  apiRegister('inlineEdit.inResponsiveChangeInputsValues()', function (ctx, $fila) {\n    _inResponsiveChangeInputsValues(ctx, $fila);\n  });\n  apiRegister('inlineEdit.asignarInputsValues()', function (ctx, $fila) {\n    _asignarInputsValues(ctx, $fila);\n  });\n  apiRegister('inlineEdit.onResponsiveResize()', function (dt) {\n    _onResponsiveResize(dt);\n  });\n  apiRegister('inlineEdit.addchildIcons()', function (ctx) {\n    _addChildIcons(ctx);\n  });\n  apiRegister('inlineEdit.createTr()', function (dt, ctx, columns) {\n    return _createTr(dt, ctx, columns);\n  });\n  apiRegister('inlineEdit.drawInlineEdit()', function (tabla, ctx) {\n    return _drawInlineEdit(tabla, ctx);\n  });\n  apiRegister('inlineEdit.getRowSelected()', function (dt, actionType) {\n    return _getRowSelected(dt, actionType);\n  });\n  apiRegister('inlineEdit.deleteAllSelects()', function (dt) {\n    return _deleteAllSelects(dt);\n  });\n  apiRegister('inlineEdit.cloneLine()', function (dt, ctx, idRow) {\n    _cloneLine(dt, ctx, idRow);\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Initialisation\r\n   */\n  // DataTables creation - check if select has been defined in the options. Note\n  // this required that the table be in the document! If it isn't then something\n  // needs to trigger this method unfortunately. The next major release of\n  // DataTables will rework the events and address this.\n\n  $(document).on('plugin-init.dt', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined && ctx.oInit.inlineEdit.activate !== false) {\n      DataTable.inlineEdit.init(new DataTable.Api(ctx));\n\n      if (ctx.oInit.inlineEdit.cancelDeleteFunction === undefined) {\n        ctx.oInit.inlineEdit.cancelDeleteFunction = function cancelClicked() {};\n      }\n    }\n  });\n  return DataTable.inlineEdit;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.inlineEdit.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.js":
/*!************************************!*\
  !*** ./src/rup_table/rup.table.js ***!
  \************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Genera un table\r\n *\r\n * @summary \t\tComponente RUP Datatable\r\n * @module\t\t\t\"rup.table\"\r\n * @version     1.0.0\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n *\r\n */\n\n/* eslint-disable no-console */\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./rup.table.request */ \"./src/rup_table/rup.table.request.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\"), __webpack_require__(/*! datatables.net-bs4 */ \"./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs\"), __webpack_require__(/*! ./rup.table.responsive */ \"./src/rup_table/rup.table.responsive.js\"), __webpack_require__(/*! ./rup.table.multiSelect */ \"./src/rup_table/rup.table.multiSelect.js\"), __webpack_require__(/*! ./rup.table.seeker */ \"./src/rup_table/rup.table.seeker.js\"), __webpack_require__(/*! ./rup.table.inlineEdit */ \"./src/rup_table/rup.table.inlineEdit.js\"), __webpack_require__(/*! ./rup.table.editForm */ \"./src/rup_table/rup.table.editForm.js\"), __webpack_require__(/*! ./rup.table.buttons */ \"./src/rup_table/rup.table.buttons.js\"), __webpack_require__(/*! ./rup.table.colReorder */ \"./src/rup_table/rup.table.colReorder.js\"), __webpack_require__(/*! ./rup.table.select */ \"./src/rup_table/rup.table.select.js\"), __webpack_require__(/*! ./rup.table.rowGroup */ \"./src/rup_table/rup.table.rowGroup.js\"), __webpack_require__(/*! ./rup.table.masterDetail */ \"./src/rup_table/rup.table.masterDetail.js\"), __webpack_require__(/*! ./rup.table.multiFilter */ \"./src/rup_table/rup.table.multiFilter.js\"), __webpack_require__(/*! ../core/utils/form2object */ \"./src/core/utils/form2object.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, TableRequest) {\n  //****************************************************************************************************************\n  // DEFINICIÓN BASE DEL PATRÓN (definición de la variable privada que contendrá los métodos y la función de jQuery)\n  //****************************************************************************************************************\n  var DataTable = $.fn.dataTable;\n  var rup_table = {}; //Se configura el arranque de UDA para que alberge el nuevo patrón\n\n  $.extend($.rup.iniRup, $.rup.rupSelectorObjectConstructor('rup_table', rup_table)); //*******************************\n  // DEFINICIÓN DE MÉTODOS RUP\n  //*******************************\n\n  $.fn.rup_table('extend', {\n    getRupValue: function getRupValue() {\n      return console.warn($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.warnings.methodNotAvailable')));\n    },\n    setRupValue: function setRupValue() {\n      return console.warn($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.warnings.methodNotAvailable')));\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PÚBLICOS\n  //*******************************\n\n  $.fn.rup_table('extend', {\n    foo: function foo() {\n      return this;\n    },\n\n    /**\r\n     * Indica si un rup_table ya ha sido inicializado sobre el elemento con el identificador provisto.\r\n     *\r\n     * @function isInitialized\r\n     * @since UDA 5.0.3\r\n     * @return {boolean} - Indica si ya ha sido inicializada una tabla sobre el elemento.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"isInitialized\");\r\n     */\n    isInitialized: function isInitialized() {\n      return $(this).attr('ruptype') === 'table' ? true : false;\n    },\n\n    /**\r\n     * Crea y añade un botón en la botonera de la tabla.\r\n     *\r\n     * @function createButton\r\n     * @since UDA 3.7.1\r\n     * @param {Object} - Propiedades del botón.\r\n     * @param {number} - Posición en la que situar el botón.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"createButton\", {\r\n    text: function (dt) {\r\n    return $.rup.i18nParse($.rup.i18n.base, 'rup_table.toolbar.edit');\r\n    },\r\n    id: idTable + 'editButton_1', // Campo obligatorio si se quiere usar desde el contextMenu\r\n    className: 'btn-material-primary-high-emphasis table_toolbar_btnEdit order-2',\r\n    displayRegex: /^[1-9][0-9]*$/, // Se muestra siempre que sea un numero mayor a 0\r\n    insideContextMenu: ctx.oInit.buttons.contextMenu, // Independientemente de este valor, sera 'false' si no tiene un id definido\r\n    type: 'edit',\r\n    init: function (dt, button, config) {\r\n    ctx.ext.buttons.editButton.eventDT = dt;\r\n    },\r\n    action: function (e, dt, button, config) {\r\n    $('#' + ctx.sTableId).triggerHandler('tableButtonsBeforeEditClick', [dt, button, config]);\r\n    DataTable.Api().buttons.actions(dt, config);\r\n    $('#' + ctx.sTableId).triggerHandler('tableButtonsAfterEditClick', [dt, button, config]);\r\n    }\r\n    }, 0);\r\n     */\n    createButton: function createButton(props) {\n      var pos = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var dt = $(this).DataTable();\n      var ctx = dt.context[0];\n\n      if (ctx.oInit.buttons !== undefined && props !== undefined) {\n        if (props.custom === undefined) {\n          props.custom = true;\n        } // Añadimos el boton genérico\n\n\n        dt.button().add(pos, {\n          text: function text() {\n            return props.text;\n          },\n          id: props.id,\n          // Campo obligatorio si se quiere usar desde el contextMenu\n          className: props.className,\n          icon: props.icon,\n          displayRegex: props.regex,\n          // Se muestra siempre que sea un numero positivo o neutro\n          insideContextMenu: props.insideContextMenu,\n          // Independientemente de este valor, sera 'false' si no tiene un id definido\n          action: props.action,\n          custom: props.custom\n        });\n      } else {\n        console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.errors.wrongParams')));\n      }\n    },\n\n    /**\r\n     * Elimina el botón especificado.\r\n     *\r\n     * @function removeButton\r\n     * @since UDA 3.7.1\r\n     * @param {Object} - Selector que contenga un botón de la tabla.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"removeButton\", $('#exampleeditButton_1'));\r\n     */\n    removeButton: function removeButton(selector) {\n      var dt = $(this).DataTable();\n      var ctx = dt.context[0];\n\n      if (ctx.oInit.buttons !== undefined && selector !== undefined) {\n        dt.buttons(selector).remove();\n      } else {\n        console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.errors.wrongParam')));\n      }\n    },\n\n    /**\r\n     * Deshabilita el botón especificado.\r\n     *\r\n     * @function disableButton\r\n     * @since UDA 3.7.1\r\n     * @param {Object} - Selector que contenga un botón de la tabla.\r\n     * @param {boolean} - Permite deshabilitar el botón del menú contextual.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"disableButton\", $('#exampleeditButton_1'), true);\r\n     */\n    disableButton: function disableButton(selector, contextMenu) {\n      var dt = $(this).DataTable();\n      var ctx = dt.context[0];\n\n      if (ctx.oInit.buttons !== undefined && selector !== undefined && contextMenu !== undefined) {\n        dt.buttons(selector).disable(contextMenu);\n      } else {\n        console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.errors.wrongParams')));\n      }\n    },\n\n    /**\r\n     * Habilita el botón especificado.\r\n     *\r\n     * @function enableButton\r\n     * @since UDA 3.7.1\r\n     * @param {Object} - Selector que contenga un botón de la tabla.\r\n     * @param {boolean} - Permite habilitar o deshabilitar el botón de la botonera.\r\n     * @param {boolean} - Permite habilitar el botón del menú contextual.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"enableButton\", $('#exampleeditButton_1'), true, false);\r\n     */\n    enableButton: function enableButton(selector, flag, contextMenu) {\n      var dt = $(this).DataTable();\n      var ctx = dt.context[0];\n\n      if (ctx.oInit.buttons !== undefined && selector !== undefined && flag !== undefined && contextMenu !== undefined) {\n        dt.buttons(selector).enable(flag, contextMenu);\n      } else {\n        console.error($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.errors.wrongParams')));\n      }\n    },\n\n    /**\r\n     * Permite obtener el contexto de la tabla. \r\n     *\r\n     * @function getContext\r\n     * @since UDA 3.7.1\r\n     * @return {Object} - Contexto de la tabla.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"getContext\");\r\n     */\n    getContext: function getContext() {\n      return $(this).DataTable().context[0];\n    },\n\n    /**\r\n     * Devuelve los identificadores de los elementos seleccionados.\r\n     *\r\n     * @function getSelectedIds\r\n     * @since UDA 4.2.1\r\n     * @return {Object[]} - Identificadores de los elementos seleccionados.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"getSelectedIds\");\r\n     */\n    getSelectedIds: function getSelectedIds() {\n      return $(this).DataTable().context[0].multiselection.selectedIds;\n    },\n\n    /**\r\n     * Devuelve el identificador de la última fila seleccionada.\r\n     *\r\n     * @function getLastSelectedId\r\n     * @since UDA 5.0.3\r\n     * @return {string} - Identificador del último registro seleccionado.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"getLastSelectedId\");\r\n     */\n    getLastSelectedId: function getLastSelectedId() {\n      return $(this).DataTable().context[0].multiselection.lastSelectedId;\n    },\n\n    /**\r\n     * Devuelve los campos y valores de las filas seleccionadas.\r\n     *\r\n     * @function getSelectedRows\r\n     * @since UDA 4.2.1\r\n     * @return {Object[]} - Objeto con los campos y valores de las filas seleccionadas.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"getSelectedRows\");\r\n     */\n    getSelectedRows: function getSelectedRows() {\n      var dt = $(this).DataTable();\n      var ctx = dt.context[0];\n      var page = dt.page() + 1;\n      var rows = [];\n\n      if (ctx.json !== undefined && ctx.json.rows !== undefined && ctx.json.rows.length > 0) {\n        var selecteds = $.grep(ctx.multiselection.selectedRowsPerPage, function (v) {\n          return v.page === page;\n        });\n\n        if (selecteds.length === 1) {\n          rows = ctx.json.rows[selecteds[0].line];\n        } else if (selecteds.length > 1) {\n          rows = [];\n          $.each(selecteds, function (index) {\n            rows.push(ctx.json.rows[selecteds[index].line]);\n          });\n        }\n      }\n\n      return rows;\n    },\n\n    /**\r\n     * Devuelve las posiciones de todas las filas seleccionadas en la tabla.\r\n     *\r\n     * @function getSelectedRowPerPage\r\n     * @since UDA 4.2.1\r\n     * @return {Object[]} - Objeto con la posición de cada fila seleccionada en la tabla.\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"getSelectedRowPerPage\");\r\n     */\n    getSelectedRowPerPage: function getSelectedRowPerPage() {\n      return $(this).DataTable().context[0].multiselection.selectedRowsPerPage;\n    },\n\n    /**\r\n     * Limpia todas las filas de la tabla y la deja vacía.\r\n     *\r\n     * @function clear\r\n     * @since UDA 4.3.0\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"clear\");\r\n     */\n    clear: function clear() {\n      $('#' + this[0].id + ' tbody').empty();\n    },\n\n    /**\r\n     * Recarga la tabla.\r\n     *\r\n     * @function reload\r\n     * @since UDA 4.3.0\r\n     * @example\r\n     * $(\"#idTable\").rup_table(\"reload\");\r\n     */\n    reload: function reload() {\n      $(this).DataTable().ajax.reload();\n    }\n  }); //*******************************\n  // DEFINICIÓN DE MÉTODOS PRIVADOS\n  //*******************************\n\n  $.fn.rup_table('extend', {\n    /**\r\n     * Inicializa ciertas opciones del componente\r\n     *\r\n     * @name _initOptions\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} options Opciones del componente\r\n     *\r\n     */\n    _initOptions: function _initOptions(options) {\n      var $self = this;\n      options.processing = true;\n      options.serverSide = true;\n      options.columns = options.columns || $self._getColumns(options); // Urls\n\n      var baseUrl = options.urlBase;\n      options.urls = {\n        base: baseUrl,\n        filter: baseUrl + '/filter'\n      };\n      options.ajax = this._ajaxOptions(options);\n      options.language = {\n        'url': $.rup.RUP + '/resources/rup.i18n_' + $.rup.lang + '.json'\n      }; //Se cargan los metodos en la API, Se referencia al Register\n\n      var apiRegister = DataTable.Api.register;\n      apiRegister('rupTable.selectPencil()', function (ctx, idRow) {\n        //Se elimina el lapicero indicador.\n        $('#' + ctx.sTableId + ' tbody tr td.select-checkbox i.selected-pencil').remove(); //se añade el span con el lapicero\n\n        if (idRow >= 0) {\n          var spanPencil = $('<i></i>').addClass('mdi mdi-pencil ui-icon-rupInfoCol selected-pencil');\n          $($('#' + ctx.sTableId + ' tbody tr td.select-checkbox')[idRow]).append(spanPencil);\n        }\n      });\n      apiRegister('rupTable.reorderDataFromServer()', function (json, ctx) {\n        //Se mira la nueva reordenacion y se ordena.\n        if (ctx.multiselection !== undefined) {\n          ctx.multiselection.selectedIds = [];\n          ctx.multiselection.selectedRowsPerPage = [];\n        }\n\n        var posibleLastselection = \"\"; //Viene del servidor por eso la linea de la pagina es 1 menos.\n\n        $.each(json.reorderedSelection, function (index, p) {\n          var idEntity = DataTable.Api().rupTable.getIdPk(p.pk, ctx.oInit);\n\n          if (ctx.oInit.formEdit !== undefined) {\n            var hdivStateParamValue = $.fn.getHDIV_STATE(undefined, ctx.oInit.formEdit.idForm);\n\n            if (hdivStateParamValue !== '' && index == 0) {\n              ctx.multiselection.lastSelectedId = idEntity;\n            }\n          }\n\n          var arra = {\n            id: idEntity,\n            page: p.page,\n            line: p.pageLine - 1\n          };\n          ctx.multiselection.selectedIds.splice(index, 0, arra.id);\n          ctx.multiselection.selectedRowsPerPage.splice(index, 0, arra);\n        });\n\n        if (ctx.multiselection !== undefined && !ctx.multiselection.selectedAll) {\n          ctx.multiselection.numSelected = ctx.multiselection.selectedIds.length;\n        } // Detecta cuando se pulsa sobre el boton de filtrado o de limpiar lo filtrado\n\n\n        if (ctx.oInit.buttons !== undefined && ctx._buttons !== undefined) {\n          ctx._buttons[0].inst.s.disableAllButtons = undefined;\n          DataTable.Api().buttons.displayRegex(ctx);\n        }\n\n        $('#' + ctx.sTableId).triggerHandler('tableAfterReorderData', ctx);\n      });\n      apiRegister('rupTable.getIdPk()', function (json, optionsParam) {\n        var opts = options;\n\n        if (optionsParam !== undefined) {\n          opts = optionsParam;\n        }\n\n        var id = '';\n        $.each(opts.primaryKey, function (index, key) {\n          // Comprueba si la primaryKey es un subcampo\n          if (Object.prototype.hasOwnProperty.call(json, key)) {\n            id = id + json[key];\n          } else if (key.indexOf('.') !== -1) {\n            id = $self._getDescendantProperty(json, key);\n          }\n\n          if (opts.primaryKey.length > 1 && index < opts.primaryKey.length - 1) {\n            id = id + opts.multiplePkToken;\n          }\n        });\n        return id;\n      });\n      /**\r\n       * Comprueba si dos claves primarias son iguales.\r\n       *\r\n       * @name comparePKs\r\n       * @function\r\n       * @since UDA 5.0.0 (backported) // Table 1.0.0\r\n       * \r\n       * @param {object} firstRow - Fila de la tabla a comparar.\r\n       * @param {object} secondRow - Fila de la tabla a comparar.\r\n       *\r\n       * @return {boolean}\r\n       */\n\n      apiRegister('rupTable.comparePKs()', function (firstRow, secondRow) {\n        var firstRowPK = DataTable.Api().rupTable.getIdPk(firstRow);\n        var secondRowPK = DataTable.Api().rupTable.getIdPk(secondRow); // Si Hdiv está activado se comprueba el parámetro nid en vez de la PK (es lo mismo pero sin cifrar)\n\n        if ($.fn.isHdiv(firstRowPK) && $.fn.isHdiv(secondRowPK)) {\n          return firstRow.nid === secondRow.nid;\n        } else {\n          return firstRowPK === secondRowPK;\n        }\n      });\n      /**\r\n       * Método que gestiona el bloqueo de la edición de las claves primarias.\r\n       *\r\n       * @name blockPKEdit\r\n       * @function\r\n       * @since UDA 3.7.0 // Table 1.0.0\r\n       *\r\n       * @param {object} ctx - Settings object to operate on.\r\n       * @param {string} actionType - Método de operación CRUD.\r\n       *\r\n       */\n\n      apiRegister('rupTable.blockPKEdit()', function (ctx, actionType, sufijo) {\n        var blockPK = ctx.oInit.blockPKeditForm;\n        var idForm = '';\n\n        if (ctx.oInit.formEdit !== undefined) {\n          idForm = ctx.oInit.formEdit.idForm;\n        } else {\n          idForm = $('#' + ctx.sTableId + '_search_searchForm');\n        }\n\n        var primaryKey = ctx.oInit.primaryKey; // Comprobamos si el bloqueo de claves primarias esta activo y la tabla tiene alguna columna definida como clave primaria.\n\n        if (blockPK && primaryKey.length > 0) {\n          // En caso de ser edición bloqueamos la modificación\n          if (actionType === 'PUT') {\n            $.each(primaryKey, function (key, id) {\n              var input = $(idForm[0]).find(':input[name=\\'' + id + '\\']');\n\n              if (sufijo !== undefined) {\n                input = $(idForm[0]).find(':input[name=\\'' + id + sufijo + '\\']');\n              } // Comprobamos si es un componente rup o no. En caso de serlo usamos el metodo disable.\n\n\n              if (input.attr('ruptype') === 'date' && !input.rup_date('isDisabled')) {\n                input.rup_date('disable');\n              } else if (input.attr('ruptype') === 'combo' && !input.rup_combo('isDisabled')) {\n                input.rup_combo('disable');\n              } else if (input.attr('ruptype') === 'time' && !input.rup_time('isDisabled')) {\n                input.rup_time('disable');\n              } else if (input.attr('type') === 'checkbox') {\n                if (!input.hasClass('checkboxPKBloqueado')) {\n                  input.addClass('checkboxPKBloqueado');\n                }\n\n                var valorCheck = input.is(':checked') ? 1 : 0;\n                var selectorInputSustituto = $('#' + id + '_bloqueado'); // Comprobamos si es necesario cambiar el check\n\n                if (selectorInputSustituto.attr('valor') !== valorCheck) {\n                  if (selectorInputSustituto.attr('valor') !== undefined) {\n                    selectorInputSustituto.remove();\n                  }\n\n                  if (valorCheck === 1) {\n                    input.after(\"\\n                                            <i id=\\\"\".concat(id, \"_bloqueado\\\" \\n                                                class=\\\"mdi mdi-check sustitutoCheckboxPKBloqueadoGeneral\\\" \\n                                                valor=\\\"1\\\" aria-hidden=\\\"true\\\"></i>\\n                                        \"));\n                  } else {\n                    input.after(\"\\n                                            <i id=\\\"\".concat(id, \"_bloqueado\\\" \\n                                                class=\\\"mdi mdi-close sustitutoCheckboxPKBloqueadoGeneral sustitutoCheckboxPKBloqueadoCross\\\" \\n                                                valor=\\\"0\\\" aria-hidden=\\\"true\\\"></i>\\n                                        \"));\n                  }\n                }\n              } else {\n                input.prop('readOnly', true);\n              } // Quitamos el foco del elemento\n\n\n              input.on('mousedown', function (event) {\n                event.preventDefault();\n              });\n            });\n          } // En caso de ser clonación permitimos la edición\n          else if (actionType === 'POST') {\n            $.each(primaryKey, function (key, id) {\n              var input = $(idForm[0]).find(':input[name=\\'' + id + '\\']'); // Comprobamos si es un componente rup o no. En caso de serlo usamos el metodo enable.\n\n              if (input.attr('ruptype') === 'date' && input.rup_date('isDisabled')) {\n                input.rup_date('enable');\n              } else if (input.attr('ruptype') === 'combo' && input.rup_combo('isDisabled')) {\n                input.rup_combo('enable');\n              } else if (input.attr('ruptype') === 'time' && input.rup_time('isDisabled')) {\n                input.rup_time('enable');\n              } else if (input.attr('type') === 'checkbox') {\n                input.removeClass('checkboxPKBloqueado');\n                $('#' + id + '_bloqueado').remove();\n              } else {\n                input.prop('readOnly', false);\n              } // Devolvemos el foco al elemento\n\n\n              input.on('mousedown', function (event) {\n                $(this).off(event.preventDefault());\n                input.focus();\n              });\n            });\n          }\n        }\n      });\n      apiRegister('rupTable.getDescendantProperty()', function (json, key) {\n        $self._getDescendantProperty(json, key);\n      });\n\n      if (options.inlineEdit !== undefined) {\n        //RESPONSIVO CON EDITLINE\n        var renderer = function renderer(api, rowIdx, columns) {\n          var data = $.map(columns, function (col) {\n            var colShow = col.hidden ? \"\\n                            <li data-dtr-index=\\\"\".concat(col.columnIndex, \"\\\" data-dt-row=\\\"\").concat(col.rowIndex, \"\\\" data-dt-column=\\\"\").concat(col.columnIndex, \"\\\">\\n                                <span class=\\\"dtr-title\\\">\").concat(col.title, \"</span>\\n                                <span class=\\\"dtr-data\\\">\").concat(col.data, \"</span>\\n                            </li>\\n                            \") : '';\n            return colShow;\n          }).join('');\n          var value = data ? $('<ul data-dtr-index=\"' + rowIdx + '\" class=\"dtr-details\"></ul>').append(data) : false;\n          var ctx = api.context[0];\n          var $row = $('#' + ctx.sTableId + ' tbody tr:not(.child)').eq(rowIdx);\n\n          if ($row.hasClass('editable')) {\n            DataTable.Api().inlineEdit.inResponsiveChangeInputsValues(ctx, $row);\n\n            if (ctx.oInit.inlineEdit.rowDefault !== undefined && ctx.oInit.inlineEdit.rowDefault === 'cambioEstado') {\n              ctx.oInit.inlineEdit.rowDefault = 'estadoFinal';\n            }\n          }\n\n          return value;\n        };\n\n        options.responsive.details.renderer = renderer;\n      }\n\n      return options;\n    },\n\n    /**\r\n     * Obtiene el subcampo\r\n     *\r\n     * @name _getDescendantProperty\r\n     * @function\r\n     * @since UDA 4.1.0 // Table 1.0.0\r\n     *\r\n     * @param {object} obj - Valores de la fila\r\n     * @param {string} key - Clave para extraer el valor\r\n     *\r\n     */\n    _getDescendantProperty: function _getDescendantProperty(obj, key) {\n      var indexes = key.split('.');\n\n      while (indexes.length && obj) {\n        var index = indexes.shift();\n        var match = new RegExp('(.+)\\\\[([0-9]*)\\\\]').exec(index); // Comprueba si es un array y aplica la logica necesaria para obtener el valor\n\n        if (match !== null && match.length == 3) {\n          var arrayData = {\n            arrayName: match[1],\n            arrayIndex: match[2]\n          };\n\n          if (obj[arrayData.arrayName] != undefined) {\n            obj = obj[arrayData.arrayName][arrayData.arrayIndex];\n          } else {\n            obj = undefined;\n          }\n        } else {\n          obj = obj[index];\n        }\n      }\n\n      return obj;\n    },\n\n    /**\r\n     * Obtiene las columnas\r\n     *\r\n     * @name _getColumns\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} options Opciones del componente\r\n     *\r\n     */\n    _getColumns: function _getColumns(options) {\n      var $self = this; // Indica si la primera columna ha sido generada por el componente RUP\n\n      var rupSelectColumn = false; //Se crea la columna del select.\n\n      if (options.columnDefs !== undefined && options.columnDefs.length > 0 && options.columnDefs[0].className !== undefined && options.columnDefs[0].className.indexOf('select-checkbox') > -1 && options.multiSelect !== undefined) {\n        //Se crea el th thead, se añade la columna.\n        var th = $('<th></th>').attr('data-col-prop', '');\n\n        if ($self[0].tHead !== null) {\n          $(th).insertBefore($self[0].tHead.rows[0].cells[0]);\n        } //Se aseguro que no sea orderable\n\n\n        if (options.columnDefs.length > 0) {\n          options.columnDefs[0].orderable = false;\n        } //Se oculta la columna por decision del usuario\n\n\n        if (options.multiSelect !== undefined && options.multiSelect.hideMultiselect) {\n          options.columnDefs[0].visible = false;\n        }\n\n        rupSelectColumn = true;\n      }\n\n      $.each(options.colModel, function (index, column) {\n        // Se ocultan las columnas que así hayan sido definidas en el colModel.\n        if (column.hidden) {\n          options.columnDefs.push({\n            targets: rupSelectColumn ? index + 1 : index,\n            visible: false,\n            className: 'never'\n          });\n        } else if (column.orderable === false) {\n          // Se bloquea la ordenación de las columnas que así hayan sido definidas en el colModel. Solo se hace esta comprobación cuando la columna no ha sido ocultada.\n          options.columnDefs.push({\n            targets: rupSelectColumn ? index + 1 : index,\n            orderable: false\n          });\n        }\n      });\n      $.each(options.colModel, function (index, column) {}); //se crea el tfoot\n\n      var $tfoot = $('<tfoot>').appendTo($self[0]);\n      var $tr = $('<tr>').appendTo($tfoot);\n      var columns = this.find('th[data-col-prop]').map(function (i, e) {\n        //se añaden las columnas al tfoot\n        var $th = $('<th>').appendTo($tr);\n        $th.text($(e).text());\n\n        if (/^checkbox$/i.test(e.getAttribute('data-col-type'))) {\n          options.columnDefs.push({\n            targets: i,\n            data: '',\n            render: function render(data) {\n              var iconCheck = 'mdi-close';\n\n              if (data == '1') {\n                iconCheck = 'mdi-check';\n              }\n\n              return \"\\n                                <div class=\\\"centerOnResponsiveContainer\\\">\\n                                    <i class=\\\"mdi \".concat(iconCheck, \" mx-auto\\\"></i>\\n                                </div>\");\n            }\n          });\n        }\n\n        return {\n          data: e.getAttribute('data-col-prop'),\n          sidx: e.getAttribute('data-col-sidx'),\n          editable: e.getAttribute('data-col-edit') !== 'false'\n        };\n      });\n      columns[0].sDefaultContent = '';\n      return columns;\n    },\n\n    /**\r\n     * Filtrado\r\n     *\r\n     * @name _doFilter\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} options Opciones del componente\r\n     *\r\n     */\n    _doFilter: function _doFilter(options) {\n      var $self = this;\n\n      var reloadTable = function reloadTable() {\n        $self.DataTable().ajax.reload(function () {\n          $('#' + options.id).trigger('tableFilterSearch', options);\n        });\n      };\n\n      if (options.filter && options.filter.$filterContainer) {\n        $self._showSearchCriteria();\n\n        if (options.filter.collapsableLayerHide) {\n          //se oculta el collapsable al filtrar.\n          options.filter.hideLayer();\n        }\n\n        if (options.filter.$filterContainer.valid()) {\n          reloadTable();\n        }\n      } else {\n        reloadTable();\n      }\n    },\n\n    /**\r\n     * Prepara el objeto necesario para la consulta de registros al servidor\r\n     *\r\n     * @name _ajaxOptions\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} options Opciones del componente\r\n     *\r\n     */\n    _ajaxOptions: function _ajaxOptions(options) {\n      options.id = this[0].id;\n      $('#' + options.id).triggerHandler('tableFilterInitialize', options);\n      var ajaxData = {\n        'url': options.urls.filter,\n        'dataSrc': function dataSrc(json) {\n          var ret = {};\n          $('#' + options.id).triggerHandler('tableFilterBeforeShow', options);\n          json.recordsTotal = json.records;\n          json.recordsFiltered = json.records;\n          ret.recordsTotal = json.records;\n          ret.recordsFiltered = json.records;\n          ret.data = json.rows;\n          var table = $('#' + options.id).DataTable();\n          var ctx = table.context[0];\n\n          if (options !== undefined && (options.multiSelect !== undefined || options.select !== undefined)) {\n            DataTable.Api().rupTable.reorderDataFromServer(json, ctx);\n          }\n\n          if (ctx.seeker !== undefined && ctx.seeker.search !== undefined && json.reorderedSeeker !== undefined) {\n            ctx.seeker.search.funcionParams = json.reorderedSeeker;\n          }\n\n          if (ctx.oInit.inlineEdit !== undefined) {\n            if (ctx.oInit.inlineEdit.alta && !$('#' + ctx.sTableId + ' tbody tr').eq(0).hasClass('new')) {\n              ret.data = DataTable.Api().inlineEdit.createTr(table, ctx, ret.data);\n            } else {\n              ctx.oInit.inlineEdit.alta = undefined;\n            }\n\n            DataTable.Api().seeker.disabledButtons(ctx);\n\n            if (ctx.inlineEdit !== undefined && ctx.inlineEdit.lastRow !== undefined) {\n              ctx.inlineEdit.lastRow.idx = -1;\n            }\n          }\n\n          return ret.data;\n        },\n        'type': 'POST',\n        'data': this._ajaxRequestData,\n        'contentType': 'application/json',\n        'dataType': 'json'\n      };\n\n      if (options.customError !== undefined) {\n        ajaxData.error = options.customError;\n      }\n\n      return ajaxData;\n    },\n\n    /**\r\n     * Solicita los datos al servidor\r\n     *\r\n     * @name _ajaxRequestData\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} data Opciones del table\r\n     * @param {object} ctx contexto  del componente table\r\n     *\r\n     */\n    _ajaxRequestData: function _ajaxRequestData(data, ctx) {\n      //Para añadir un id de busqueda distinto al value, como por ejemplo la fecha.\n      if (ctx.oInit.ordering && data.order[0] != undefined && data.order[0].column != undefined) {\n        data.columns[data.order[0].column].colSidx = ctx.aoColumns[data.order[0].column].colSidx;\n      } //El data viene del padre:Jquery.table y como no tiene el prefijo de busqueda se añade.\n\n\n      if (ctx.oInit.filter.$filterContainer) {\n        data.filter = window.form2object(ctx.oInit.filter.$filterContainer[0]);\n      }\n\n      data.multiselection = undefined; //Se pueden meter ids seleccionados por defecto\n\n      if (ctx.oInit.multiSelect !== undefined) {\n        DataTable.Api().multiSelect.defaultsIds(ctx);\n      } else if (ctx.oInit.select !== undefined) {\n        DataTable.Api().select.defaultId(ctx);\n      }\n\n      if (ctx.multiselection !== undefined && ctx.multiselection.selectedIds.length > 0) {\n        data.multiselection = $.rup_utils.deepCopy(ctx.multiselection, 4);\n      }\n\n      if (ctx.seeker !== undefined && ctx.seeker.search !== undefined && ctx.seeker.search.funcionParams !== undefined && ctx.seeker.search.funcionParams.length > 0) {\n        data.seeker = {};\n        data.seeker.selectedIds = [];\n        $.each(ctx.seeker.search.funcionParams, function (index, p) {\n          data.seeker.selectedIds.splice(index, 0, DataTable.Api().rupTable.getIdPk(p.pk, ctx.oInit));\n        });\n      } // Elimina los campos _label generados en los autocompletes del filtro\n\n\n      $.fn.deleteAutocompleteLabelFromObject(data.filter); // Elimina del filtro los campos autogenerados por los multicombos que no forman parte de la entidad\n\n      $.fn.deleteMulticomboLabelFromObject(data.filter, ctx.oInit.filter.$filterContainer);\n\n      if (ctx.oInit.filter.$filterContainer !== undefined) {\n        // Fuerza el mostrado de la primera página cuando se pagina y los criterios de filtrado han cambiado.\n        var newCriteria = ctx.oInit.filter.$filterContainer.serializeArray();\n\n        if (!_.isEqual(ctx.oInit.filter.oldCriteria, newCriteria)) {\n          ctx.oInit.filter.oldCriteria = newCriteria;\n          ctx._iDisplayStart = 0;\n          data.start = 0;\n        }\n      }\n\n      var tableRequest = new TableRequest(data);\n      var json = $.extend({}, data, tableRequest.getData()); //Mantenemos todos los valores, por si se quieren usar.\n\n      json.core.pkNames = ctx.oInit.primaryKey;\n      ctx.aBaseJson = json; // Posibles referencias circulares en json\n\n      var cache = [];\n      var strJson = JSON.stringify(json, function (key, value) {\n        if (_typeof(value) === 'object' && value !== null) {\n          if (cache.indexOf(value) !== -1) {\n            // Si se encuentra una key duplicada se descarta\n            return;\n          } // Se almacena para ver que no se repita\n\n\n          cache.push(value);\n        }\n\n        return value;\n      });\n      cache = null; // Enable garbage collection\n\n      return strJson;\n    },\n\n    /**\r\n     * Gestiona la paginación\r\n     *\r\n     * @name _createSearchPaginator\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} tabla Objeto que contiene la tabla\r\n     * @param {object} settingsT Opciones del componente\r\n     *\r\n     */\n    _createSearchPaginator: function _createSearchPaginator(tabla, settingsT) {\n      //buscar la paginación.\n      if ($('#' + tabla[0].id + '_paginate').length === 1 && settingsT.json !== undefined && settingsT.json.total !== '0') {\n        var liSearch = $('<li></li>').addClass('paginate_button page-item pageSearch searchPaginator align-self-center');\n        var textPagina = jQuery.rup.i18nTemplate(settingsT.oLanguage, 'pagina', settingsT.json.total);\n        var toPagina = jQuery.rup.i18nTemplate(settingsT.oLanguage, 'toPagina', settingsT.json.total);\n        var input = $('<input/>').attr({\n          type: 'text',\n          size: '3',\n          value: settingsT.json.page,\n          maxlength: '3'\n        }).addClass('ui-pg-input text-center');\n        liSearch.append(textPagina);\n        liSearch.append(input);\n        liSearch.append(toPagina);\n        $('#' + tabla[0].id + '_previous').after(liSearch);\n        input.keypress(function (e) {\n          if (e.which === 13) // the enter key code\n            {\n              var page = parseInt(this.value);\n\n              if ($.rup_utils.isNumeric(page) && page > 0) {\n                tabla.dataTable().fnPageChange(page - 1);\n              }\n\n              return false;\n            }\n        });\n      } else {//Sacar un error\n      } // Añade iconos para versiones moviles/tablets\n\n\n      $('<i class=\"mdi mdi-page-first d-sm-none\"></i>').insertAfter($('#' + tabla[0].id + '_first').addClass('recolocatedPagination_iconButton').children('a').addClass('btn-material btn-material-sm btn-material-primary-low-emphasis d-none d-sm-block').wrapInner(function () {\n        return '<span></span>';\n      }));\n      $('<i class=\"mdi mdi-chevron-left d-sm-none\"></i>').insertAfter($('#' + tabla[0].id + '_previous').addClass('recolocatedPagination_iconButton').children('a').addClass('btn-material btn-material-sm btn-material-primary-low-emphasis d-none d-sm-block').wrapInner(function () {\n        return '<span></span>';\n      }));\n      $('<i class=\"mdi mdi-chevron-right d-sm-none\"></i>').insertAfter($('#' + tabla[0].id + '_next').addClass('recolocatedPagination_iconButton').children('a').addClass('btn-material btn-material-sm btn-material-primary-low-emphasis d-none d-sm-block').wrapInner(function () {\n        return '<span></span>';\n      }));\n      $('<i class=\"mdi mdi-page-last d-sm-none\"></i>').insertAfter($('#' + tabla[0].id + '_last').addClass('recolocatedPagination_iconButton').children('a').addClass('btn-material btn-material-sm btn-material-primary-low-emphasis d-none d-sm-block').wrapInner(function () {\n        return '<span></span>';\n      })); // Inserta la lista de botones de paginacion al div anteriormente creado\n\n      $('#' + tabla[0].id + '_paginate ul').detach().appendTo($('#' + tabla[0].id + '_paginate'));\n    },\n\n    /**\r\n     * Limpia el filtro\r\n     *\r\n     * @name _clearFilter\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     * @param {object} options Opciones del componente\r\n     *\r\n     */\n    _clearFilter: function _clearFilter(options) {\n      var $self = this;\n      $('#' + options.id).triggerHandler('tableFilterReset', options);\n      options.filter.$filterContainer.resetForm(); // Reinicia por completo los autocomplete ya que sino siguen filtrando\n\n      $.fn.resetAutocomplete('hidden', options.filter.$filterContainer); //si es Maestro-Detalle restaura el valor del padre.\n\n      if (options.masterDetail !== undefined) {\n        var tableMaster = $(options.masterDetail.master).DataTable();\n        var rowSelected = tableMaster.rows('.selected').indexes();\n        var row = tableMaster.rows(rowSelected).data();\n        var id = DataTable.Api().rupTable.getIdPk(row[0], tableMaster.context[0].oInit);\n        var $hiddenPKMaster = $('#' + options.id + '_filter_masterPK');\n        $hiddenPKMaster.val('' + id);\n      }\n\n      $self.DataTable().ajax.reload();\n      options.filter.$filterSummary.html(' <i></i>'); // Provoca un mal funcionamiento del filtrado de Maestro-Detalle en la tabla esclava, \n      // ya que elimina la referencia del padre y muestra todos los valores en vez de los relacionados.\n      //jQuery('input,textarea').val('');\n\n      jQuery.each($('select.rup_combo', options.filter.$filterContainer), function (index, elem) {\n        jQuery(elem).rup_combo('refresh');\n      });\n      $.rup_utils.populateForm([], options.filter.$filterContainer);\n    },\n\n    /**\r\n     * Metodo que realiza la configuración del plugin filter del componente RUP DataTable.\r\n     *\r\n     * @name preConfigureFilter\r\n     * @function\r\n     *\r\n     * @param {object} options - Parámetros de configuración del componente.\r\n     *\r\n     */\n    _initFeedback: function _initFeedback(options) {\n      var $self = this,\n          tableId = $self[0].id,\n          feedbackOpts = options.feedback;\n\n      if (feedbackOpts && feedbackOpts.id && $('#' + feedbackOpts.id).length > 0) {\n        feedbackOpts.$feedbackContainer = $('#' + feedbackOpts.id);\n        feedbackOpts.$feedbackContainer.rup_feedback(feedbackOpts);\n      } else {\n        feedbackOpts.id = 'rup_feedback_' + tableId;\n        feedbackOpts.$feedbackContainer = $('<div></div>').attr('id', feedbackOpts.id).insertBefore('#' + tableId);\n        feedbackOpts.$feedbackContainer.rup_feedback(options.feedback);\n      }\n    },\n\n    /**\r\n     * Metodo que realiza la configuración del plugin filter del componente RUP DataTable.\r\n     *\r\n     * @name preConfigureFilter\r\n     * @function\r\n     *\r\n     * @param {object} options - Parámetros de configuración del componente.\r\n     *\r\n     */\n    _initFilter: function _initFilter(options) {\n      var $self = this,\n          tableId = this[0].id,\n          filterOpts = options.filter,\n          toggleIcon1Tmpl,\n          toggleLabelTmpl,\n          filterSummaryTmpl,\n          toggleIcon2Tmpl,\n          $toggleIcon1,\n          $toggleLabel,\n          $filterSummary,\n          $toggleIcon2;\n      /*\r\n       * Inicialización de los identificadores y componentes por defecto de los componentes de filtrado\r\n       *\r\n       * Se almacena la referencia de los diferentes componentes:\r\n       *\r\n       * $filterContainer : Contenedor del formulario de filtrado\r\n       * $filterButton : Botón que realiza el filtrado\r\n       * $cleanLink : Enlace para limpiar el formulario\r\n       * $collapsableLayer : Capa que puede ser ocultada/mostrada\r\n       * $toggleIcon1Id : Control que oculta muestra el fomulario\r\n       * $filterSummary : Contenedor donde se especifican los criterios de filtrado\r\n       */\n      // Se define el selector del formulario de filtrado por preferencia \"JSP > JS > Default\"\n\n      if (options.filterForm) {\n        filterOpts.id = $(options.filterForm).attr('id');\n      } else if (!filterOpts.id) {\n        filterOpts.id = tableId + '_filter_form';\n      }\n\n      filterOpts.$filterContainer = jQuery('#' + filterOpts.id);\n      filterOpts.filterToolbarId = filterOpts.filterToolbar !== undefined ? filterOpts.filterToolbar : tableId + '_filter_toolbar';\n      filterOpts.$filterToolbar = jQuery('#' + filterOpts.filterToolbarId);\n\n      if (filterOpts.$filterContainer.length === 0) {\n        if (options.filterMessage === true) {\n          $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_table.plugins.filter.filterContainerError'));\n        }\n      } else if (filterOpts.$filterToolbar.length === 0) {\n        $.rup.errorGestor($.rup.i18nParse($.rup.i18n.base, 'rup_table.plugins.filter.filterToolbarError'));\n      } else {\n        filterOpts.collapsableLayerId = filterOpts.collapsableLayerId !== undefined ? filterOpts.collapsableLayerId : tableId + '_filter_fieldset';\n        filterOpts.toggleIcon1Id = filterOpts.toggleIcon1 !== undefined ? filterOpts.toggleIcon1 : tableId + '_filter_toggle_icon1';\n        filterOpts.toggleLabelId = filterOpts.toggleLabelId !== undefined ? filterOpts.toggleLabelId : tableId + '_filter_toggle_label';\n        filterOpts.filterSummaryId = filterOpts.filterSummaryId !== undefined ? filterOpts.filterSummaryId : tableId + '_filter_summary';\n        filterOpts.toggleIcon2Id = filterOpts.toggleIcon2 !== undefined ? filterOpts.toggleIcon2 : tableId + '_filter_toggle_icon2';\n        filterOpts.$filterButton = filterOpts.$filterContainer.find('#' + tableId + '_filter_filterButton');\n        filterOpts.$filterButton.on('click', function () {\n          var customFiltrar = options.validarFiltrar;\n\n          if (typeof customFiltrar === \"function\" && customFiltrar(options)) {\n            return false;\n          }\n\n          $self._doFilter(options);\n        });\n        filterOpts.$clearButton = filterOpts.$filterContainer.find('#' + tableId + '_filter_cleanButton');\n        filterOpts.$clearButton.on('click', function () {\n          $self._clearFilter(options);\n        });\n\n        if (filterOpts.showHidden === undefined || typeof filterOpts.showHidden !== \"boolean\") {\n          filterOpts.showHidden = false;\n        }\n\n        toggleIcon1Tmpl = \"<span id='{0}' class='collapse_icon mdi mdi-arrow-down-drop-circle'></span>\";\n        toggleLabelTmpl = \"<a id='{0}' class='text-primary text-decoration-underline font-weight-bold' href='#0'>{1}:</a>\";\n        filterSummaryTmpl = \"<span id='{0}'></span>\";\n        toggleIcon2Tmpl = \"<span id='{0}' class='collapse_icon_right mdi mdi-arrow-up-drop-circle'></span>\";\n        $toggleIcon1 = $($.rup_utils.format(toggleIcon1Tmpl, filterOpts.toggleIcon1Id));\n        $toggleLabel = $($.rup_utils.format(toggleLabelTmpl, filterOpts.toggleLabelId, $.rup.i18n.base.rup_jqtable.plugins.filter.filterCriteria));\n        $filterSummary = $($.rup_utils.format(filterSummaryTmpl, filterOpts.filterSummaryId));\n        $toggleIcon2 = $($.rup_utils.format(toggleIcon2Tmpl, filterOpts.toggleIcon2Id));\n        filterOpts.$filterToolbar.append($toggleIcon1).append($toggleLabel).append($filterSummary).append($toggleIcon2);\n        filterOpts.$filterContainer = jQuery('#' + filterOpts.id);\n        filterOpts.$collapsableLayer = jQuery('#' + filterOpts.collapsableLayerId);\n        filterOpts.$toggleIcon1 = $toggleIcon1;\n        filterOpts.$toggleLabel = $toggleLabel;\n        filterOpts.$filterSummary = $filterSummary;\n        filterOpts.$toggleIcon2 = $toggleIcon2; // Se asigna a la tecla ENTER la función de búsqueda\n\n        filterOpts.$collapsableLayer.on('keydown', function (evt) {\n          if (evt.keyCode === 13) {\n            var customFiltrar = options.validarFiltrar;\n\n            if (typeof customFiltrar === \"function\" && customFiltrar(options)) {\n              return false;\n            }\n\n            $self._doFilter(options);\n          }\n        });\n\n        filterOpts.showLayer = function () {\n          filterOpts.$collapsableLayer.show();\n          filterOpts.$toggleIcon1.removeClass('mdi-chevron-right').addClass('mdi-chevron-down');\n          filterOpts.$toggleIcon2.removeClass('mdi-arrow-up-drop-circle').addClass('mdi-arrow-down-drop-circle');\n          filterOpts.$filterToolbar.addClass('formulario_opened');\n          filterOpts.showHidden = false;\n        };\n\n        filterOpts.hideLayer = function () {\n          filterOpts.$collapsableLayer.hide();\n          filterOpts.$toggleIcon1.removeClass('mdi-chevron-down').addClass('mdi-chevron-right');\n          filterOpts.$toggleIcon2.removeClass('mdi-arrow-down-drop-circle').addClass('mdi-arrow-up-drop-circle');\n          filterOpts.$filterToolbar.removeClass('formulario_opened');\n          filterOpts.showHidden = true;\n        };\n\n        filterOpts.$filterToolbar.addClass('cursor_pointer').on({\n          'click': function click() {\n            if (filterOpts.showHidden === false) {\n              filterOpts.hideLayer();\n            } else {\n              filterOpts.showLayer();\n            }\n          }\n        });\n\n        if (filterOpts.showHidden === true) {\n          filterOpts.hideLayer();\n        } else {\n          filterOpts.showLayer();\n        } // Validaciones \n\n\n        if (filterOpts.rules) {\n          filterOpts.$filterContainer.rup_validate({\n            feedback: options.feedback.$feedbackContainer,\n            rules: filterOpts.rules\n          });\n        }\n      }\n    },\n\n    /**\r\n     * Actualiza el resumen de los criterios de filtrado a partir de los valores existentes en el formulario.\r\n     *\r\n     * @name showSearchCriteria\r\n     * @function\r\n     *\r\n     */\n    _showSearchCriteria: function _showSearchCriteria() {\n      var $self = this,\n          settings = $('#' + $self[0].id).data('settings' + $self[0].id),\n          searchString = ' ',\n          label,\n          numSelected,\n          field,\n          fieldId,\n          fieldName,\n          fieldValue,\n          aux = settings.filter.$filterContainer.serializeArray(),\n          searchForm = settings.filter.$filterContainer,\n          filterMulticombo = [];\n      var obj;\n      var fieldIteration = 0;\n      var isRadio;\n      var isCheckbox; //añadir arbol\n\n      var arboles = $('.jstree', settings.filter.$filterContainer);\n      $.each(arboles, function (index, item) {\n        obj = {};\n        obj.name = $(item).attr('name');\n        obj.value = $(item).rup_tree('getRupValue').length;\n        obj.type = 'rup_tree';\n        aux.push(obj);\n      });\n\n      var forEachDiv = function forEachDiv(index, item) {\n        if (item.name === field.attr('id')) {\n          if (item.value != 0) {\n            fieldValue += ' = ' + item.value;\n          }\n        } else {\n          fieldValue = '';\n        }\n      }; // Objeto auxiliar para contar repeticiones\n\n\n      var repeticiones = {}; // Crear un nuevo array de objetos manteniendo \"value\" original para valores únicos y actualizando \"value\" para valores repetidos\n\n      var nuevoArrayDeObjetos = aux.reduce(function (result, objeto) {\n        var name = objeto.name,\n            value = objeto.value;\n\n        if (!repeticiones[name]) {\n          repeticiones[name] = {\n            value: value,\n            count: 0\n          };\n        }\n\n        repeticiones[name].count++;\n\n        if (repeticiones[name].count === 1) {\n          result.push({\n            name: name,\n            value: value\n          });\n        } else {\n          result.find(function (item) {\n            return item.name === name;\n          }).value = 'Seleccionados ' + repeticiones[name].count;\n        }\n\n        return result;\n      }, []);\n      aux = nuevoArrayDeObjetos;\n\n      for (var i = 0; i < aux.length; i++) {\n        if (aux[i].value !== '' && $.inArray(aux[i].name, settings.filter.excludeSummary) !== 0) {\n          //CAMPO a tratar\n          field = $('[name=\\'' + aux[i].name + '\\']', searchForm); //Comprobar si se debe excluir el campo\n\n          if ($.inArray(field.attr('id'), settings.filter.filterExclude) !== -1) {\n            continue;\n          } //Seleccionar radio\n\n\n          if (field.length > 1) {\n            field = $('[name=\\'' + aux[i].name + '\\']:checked', searchForm);\n\n            switch (field.prop('type')) {\n              case 'radio':\n                isRadio = true;\n                break;\n\n              case 'checkbox':\n                isCheckbox = true;\n                break;\n            }\n          } //Omitir campos hidden\n\n\n          if ($(field).attr('type') === 'hidden') {\n            continue;\n          } //ID del campo\n\n\n          fieldId = $(field[fieldIteration++]).attr('id'); // Reinicia el contador porque ya se han iterado todos los campos\n\n          if (fieldIteration === field.length) {\n            fieldIteration = 0;\n          } //ID para elementos tipo rup.combo\n\n\n          if ($(field).attr('ruptype') === 'combo' && field.next('.ui-multiselect').length === 0) {\n            fieldId += '-button';\n          } //ID para elementos tipo rup.autocomplete\n\n\n          if ($(field).attr('ruptype') === 'autocomplete') {\n            fieldId = fieldId.substring(0, fieldId.indexOf('_label'));\n          } //NAME\n\n\n          label = $('label[for^=\\'' + fieldId + '\\']', searchForm);\n\n          if (isRadio && settings.adapter === 'table_material') {\n            fieldName = $('#' + fieldId).closest('.form-radioGroupMaterial').children('label').html();\n            isRadio = false;\n          } else if (isCheckbox && settings.adapter === 'table_material') {\n            fieldName = $('#' + fieldId).closest('.form-checkboxGroupMaterial').children('label').html();\n\n            if (searchString !== '' && searchString !== undefined && new RegExp(fieldName, 'i').test(searchString)) {\n              searchString = searchString.replace(/.{2}$/, \",\");\n              fieldName = '';\n            }\n\n            isCheckbox = false;\n          } else if (label.length > 0) {\n            fieldName = label.html();\n          } else {\n            if ($(field).attr('ruptype') !== 'combo') {\n              //Mirar si es masterDetail\n              fieldName = $('[name=\\'' + aux[i].name + '\\']', searchForm).prev('div').find('label').first().html();\n\n              if (settings.masterDetail !== undefined && settings.masterDetail.masterPrimaryKey === aux[i].name) {\n                var md = settings.masterDetail;\n                fieldName = md.masterPrimaryLabel !== undefined ? md.masterPrimaryLabel : md.masterPrimaryKey;\n              }\n            } else {\n              // Buscamos el label asociado al combo\n              // Primero por id\n              var $auxField = $('[name=\\'' + aux[i].name + '\\']', searchForm),\n                  $labelField;\n              $labelField = jQuery('[for=\\'' + $auxField.attr('id') + '\\']');\n\n              if ($labelField.length > 0) {\n                fieldName = $labelField.first().text();\n              } else {\n                fieldName = $('[name=\\'' + aux[i].name + '\\']', searchForm).parent().prev('div').find('label').first().html();\n              }\n            }\n          }\n\n          if (fieldName === null || fieldName === undefined) {\n            fieldName = '';\n          } //VALUE\n\n\n          fieldValue = ' = ';\n\n          switch ($(field)[0].tagName) {\n            case 'INPUT':\n              if ($(field)[0].type === 'checkbox' || $(field)[0].type === 'radio') {\n                fieldValue += label.html();\n              } else {\n                //Mirar si es masterDetail\n                if (settings.masterDetail !== undefined && settings.masterDetail.masterPrimaryKey === aux[i].name) {\n                  var _md = settings.masterDetail;\n                  fieldValue += _md.masterPrimaryNid ? field.data('nid') : $(field).val();\n                } else {\n                  fieldValue += $(field).val();\n                }\n              }\n\n              break;\n            //Rup-tree\n\n            case 'DIV':\n              $.each(aux, forEachDiv);\n\n              if (fieldValue === '') {\n                fieldName = '';\n              }\n\n              break;\n\n            case 'SELECT':\n              if (field.next('.ui-multiselect').length === 0) {\n                if ($('option[value=\\'' + aux[i].value + '\\']', field).html() == undefined) {\n                  fieldValue = fieldValue + aux[i].value;\n                } else {\n                  fieldValue = fieldValue + $('option[value=\\'' + aux[i].value + '\\']', field).html();\n                }\n              } else {\n                if ($.inArray($(field).attr('id'), filterMulticombo) === -1) {\n                  numSelected = field.rup_combo('value').length;\n\n                  if (numSelected !== 0) {\n                    fieldValue += numSelected;\n                  } else {\n                    fieldName = '';\n                    fieldValue = '';\n                  }\n\n                  filterMulticombo.push($(field).attr('id'));\n                } else {\n                  fieldName = '';\n                  fieldValue = '';\n                }\n              }\n\n              break;\n          } //Parsear NAME\n\n\n          var parseableChars = new Array(':', '=');\n\n          for (var j = 0; j < parseableChars.length; j++) {\n            if (fieldName !== '' && fieldName.indexOf(parseableChars[j]) !== -1) {\n              fieldName = fieldName.substring(0, fieldName.indexOf(parseableChars[j]));\n              break;\n            }\n          } //Controlar rup.combo con valor vacío\n\n\n          while (fieldValue.indexOf('&amp;nbsp;') !== -1) {\n            fieldValue = fieldValue.replace('&amp;nbsp;', '');\n          } //Si no tiene NAME sacar solo el valor\n\n\n          if (fieldName === '' && fieldValue.indexOf(' = ') !== -1) {\n            fieldValue = fieldValue.substring(2, fieldValue.length);\n          } //Si no tiene NAME ni VALUE omitir\n\n\n          if (fieldName === '' && fieldValue.trim() === '') {\n            continue;\n          }\n\n          searchString = searchString + fieldName + fieldValue + '; ';\n        }\n      } //Añadir criterios\n\n\n      if (settings.multiFilter !== undefined && typeof settings.multiFilter.fncFilterName === \"function\") {\n        searchString = settings.multiFilter.fncFilterName.bind($self, searchString)();\n      }\n\n      settings.filter.$filterSummary.html(' <i>' + searchString + '</i>');\n    },\n\n    /**\r\n     * Crea un evento para mantener la multiseleccion, el seeker y el select ya que accede a bbdd.\r\n     *\r\n     * @name createEventSelect\r\n     * @function\r\n     *\r\n     * @param {object} tabla - La configuración de la tabla.\r\n     *\r\n     */\n    _createEventSelect: function _createEventSelect(tabla) {\n      tabla.on('draw.dtSelect.dt select.dtSelect.dt', function () {\n        //Si lleva parametros es que estamos en la navegacion interna.\n        var ctx = tabla.context[0];\n\n        if (ctx.oInit.formEdit !== undefined && ctx.oInit.formEdit.$navigationBar !== undefined && ctx.oInit.formEdit.$navigationBar.funcionParams !== undefined && ctx.oInit.formEdit.$navigationBar.funcionParams.length > 0) {\n          var params = ctx.oInit.formEdit.$navigationBar.funcionParams; //Si hay selectAll, comprobar la linea ya que puede variar al no tener ningún selected.Se recorre el json.\n\n          if (ctx.multiselection.selectedAll) {\n            var linea = -1;\n\n            if (params[3] !== undefined && (params[3] === 'prev' || params[3] === 'last')) {\n              linea = ctx.json.rows.length;\n              params[2] = DataTable.Api().editForm.getLineByPageSelectedReverse(ctx, linea);\n            } else {\n              if (params[2] !== undefined && params[2] > 0) {\n                linea = params[2] - 1;\n              }\n\n              params[2] = DataTable.Api().editForm.getLineByPageSelected(ctx, linea); //Se inicia en -1 para que coja desde la primera linea.next y prev.\n            }\n          }\n\n          $.when(DataTable.editForm.fnOpenSaveDialog(params[0], params[1], params[2], ctx.oInit.formEdit.customTitle)).then(function () {\n            var row = ctx.json.rows[params[2]];\n            ctx.oInit.formEdit.$navigationBar.funcionParams = {};\n            var multiselection = ctx.multiselection;\n            var indexInArray = jQuery.inArray(DataTable.Api().rupTable.getIdPk(row, ctx.oInit), multiselection.selectedIds);\n\n            if (ctx.multiselection.selectedAll) {\n              //Si es selecAll recalcular el numero de los selects. Solo la primera vez es necesario.\n              indexInArray = ctx.oInit.formEdit.$navigationBar.numPosition;\n            }\n\n            if (indexInArray === undefined) {\n              indexInArray = 0;\n              ctx.oInit.formEdit.$navigationBar.numPosition = 0;\n            }\n\n            var numTotal = multiselection.numSelected;\n\n            if (ctx.oInit.multiSelect === undefined) {\n              numTotal = ctx.json.recordsTotal;\n              indexInArray = (Number(ctx.json.page) - 1) * ctx.aBaseJson.length;\n              indexInArray = indexInArray + params[2];\n            }\n\n            DataTable.Api().editForm.updateDetailPagination(ctx, indexInArray + 1, numTotal);\n          });\n        }\n      });\n    },\n\n    /**\r\n     * Metodo que inicialida las propiedades para el multiselect y el Select.\r\n     *\r\n     * @name initializeMultiselectionProps\r\n     * @function\r\n     * @since UDA 3.4.0 // Table 1.0.0\r\n     *\r\n     *\r\n     */\n    _initializeMultiselectionProps: function _initializeMultiselectionProps(ctx) {\n      var multi = {}; // Se almacenan en los settings internos las estructuras de control de los registros seleccionados\n\n      if (multi.multiselection === undefined) {\n        multi.multiselection = {};\n      } // Flag indicador de selección de todos los registros\n\n\n      multi.multiselection.selectedAll = false; // Numero de registros seleccionados\n\n      multi.multiselection.numSelected = 0; // Propiedades de selección de registros\n\n      multi.multiselection.selectedRowsPerPage = []; //$self.multiselection.selectedLinesPerPage = [];\n      //$self.multiselection.selectedRows = [];\n\n      multi.multiselection.selectedIds = [];\n      multi.multiselection.lastSelectedId = ''; //$self.multiselection.selectedPages = [];\n      // Propiedades de deselección de registros\n\n      multi.multiselection.deselectedRowsPerPage = []; //$self.multiselection.deselectedLinesPerPage = [];\n      //$self.multiselection.deselectedRows = [];\n\n      multi.multiselection.deselectedIds = [];\n      multi.multiselection.accion = ''; //uncheckAll,uncheck\n      //$self.multiselection.deselectedPages = [];\n\n      $('#contextMenu1 li.context-menu-icon-uncheck').addClass('disabledButtonsTable');\n      $('#contextMenu1 li.context-menu-icon-uncheck_all').addClass('disabledButtonsTable'); // Desmarcamos el check del tHead\n\n      $('#inputSelectTableHead' + ctx.sTableId).prop('checked', false);\n      DataTable.Api().rupTable.selectPencil(ctx, -1);\n\n      if (ctx.multiselection === undefined) {\n        ctx.multiselection = {};\n      }\n\n      ctx.multiselection = multi.multiselection;\n    },\n    _createTooltip: function _createTooltip(id) {\n      if (id !== undefined && id.text() !== undefined && id.text() !== '') {\n        id.rup_tooltip({\n          content: {\n            text: id.text()\n          },\n          show: {\n            event: 'mouseover'\n          },\n          position: {\n            viewport: $(window),\n            adjust: {\n              method: 'flip'\n            }\n          }\n        });\n      }\n    }\n  }); //*******************************\n  // MÉTODO DE INICIALIZACION\n  //*******************************\n\n  $.fn.rup_table('extend', {\n    _init: function _init(args) {\n      var _this = this;\n\n      global.initRupI18nPromise.then(function () {\n        var _options$seeker;\n\n        var $self = _this;\n\n        if (args[0].buttons != undefined && args[0].buttons.contextMenu === undefined) {\n          args[0].buttons.contextMenu = true;\n        } //si es maestro detalle el feedback se queda por defecto con goToTop a false.\n\n\n        if (args[0].masterDetail !== undefined) {\n          $.fn.rup_table.defaults.feedback.gotoTop = false;\n        }\n\n        var options = $.extend(true, {}, $.fn.rup_table.defaults, $self[0].dataset, args[0]); //Se valida que se haya definido una ordenacion de columnas, por defecto \n\n        if (!options.defaultOrder) {\n          options.order = [];\n        }\n\n        $self.triggerHandler('tableBeforeInit', options); // Se identifica el tipo de componente RUP mediante el valor en el atributo ruptype\n\n        $self.attr('ruptype', 'table');\n        $self.triggerHandler('tableInit', options);\n\n        if (args[0].primaryKey !== undefined) {\n          options.primaryKey = args[0].primaryKey.split(';');\n        } //Si vienen los columnsDefs con columnas ocultas,se asegura la clase para que no se vean.\n\n\n        if (options.columnDefs !== undefined && options.columnDefs.length > 0) {\n          $.each(options.columnDefs, function () {\n            if (this.visible === false) {\n              this.className = 'never';\n            }\n          });\n        } //Comprobar plugin dependientes\n\n\n        if (options.multiSelect !== undefined) {\n          var clase = 'select-checkbox';\n\n          if (options.multiSelect.hideMultiselect) {\n            clase = 'select-checkbox never';\n          }\n\n          options.columnDefs.unshift({\n            orderable: false,\n            className: clase,\n            targets: 0,\n            render: function render() {\n              return '<div class=\"checkbox-material checkbox-material-inline\"><input type=\"checkbox\"><label></label></div>';\n            }\n          }); //Modulo incompatible\n\n          options.select = undefined;\n        }\n\n        if (options.formEdit !== undefined) {\n          options.inlineEdit = undefined;\n        }\n\n        if (options.filter === undefined) {\n          options.multiFilter = undefined;\n        } // getDefault multifilter\n\n\n        if (options.multiFilter !== undefined && options.multiFilter.getDefault === undefined) {\n          var usuario;\n\n          if (options.multiFilter.userFilter != null) {\n            usuario = options.multiFilter.userFilter;\n          } else {\n            usuario = window.LOGGED_USER;\n          }\n\n          var ctx = {};\n          ctx.oInit = options;\n          ctx.sTableId = $self[0].id;\n          $.rup_ajax({\n            url: options.urlBase + options.multiFilter.url + '/getDefault?filterSelector=' + options.multiFilter.idFilter + '&user=' + usuario,\n            type: 'GET',\n            dataType: 'json',\n            showLoading: false,\n            contentType: 'application/json',\n            //async : false,\n            complete: function complete() {\n              $('#' + ctx.sTableId).triggerHandler('tableMultiFilterCompleteGetDefaultFilter', ctx);\n            },\n            success: function success(data) {\n              if (data != null) {\n                var valorFiltro = JSON.parse(data.filterValue);\n                DataTable.Api().multiFilter.fillForm(valorFiltro, ctx);\n\n                $self._doFilter(data);\n\n                $(options.filter.$filterSummary, 'i').prepend(data.filterName + '{');\n                $(options.filter.$filterSummary, 'i').append('}');\n              }\n\n              $('#' + ctx.sTableId).triggerHandler('tableMultiFilterSuccessGetDefaultFilter', ctx);\n            },\n            error: function error() {\n              $('#' + ctx.sTableId).triggerHandler('tableMultiFilterErrorGetDefaultFilter', ctx);\n            }\n          });\n        }\n\n        if (args[0].responsive === undefined) {\n          //si el usuario no cambia el selector\n          var responsive = {\n            details: {\n              type: 'column',\n              target: 'td span.openResponsive'\n            },\n            selectorResponsive: 'td span.dtr-data'\n          };\n          options.responsive = responsive;\n        } // Se añaden las clases CSS de los títulos y flechas de las columnas.\n\n\n        var displayStyle = {\n          'block': 'd-block',\n          'inline': 'd-inline ml-1',\n          'none': 'd-none',\n          'default': 'd-block'\n        };\n        var arrowsStyle = displayStyle[options.columnOrderArrows.display] || displayStyle['default'];\n        $.each($('#' + $self[0].id + ' thead th'), function () {\n          var $this = $(this); // Reubicar título de la columna.\n\n          var $columnTitle = $('<span></span>').addClass('d-inline').text($this.text()); // Si se activó la opción, se mostrarán únicamente las flechas que estén ordenando los datos.\n\n          if (options.columnOrderArrows.showOnlyActive) $this.addClass('sorting_active_only'); // Crear elementos para las flechas de ordenación.\n\n          var $columnDownArrow = $('<span></span>').addClass('mdi mdi-arrow-down mr-2 mr-xl-0');\n          var $columnUpArrow = $('<span></span>').addClass('mdi mdi-arrow-up');\n          var $columnArrowsContainer = $('<div></div>').addClass(arrowsStyle).append($columnDownArrow, $columnUpArrow);\n          $this.text('');\n          $this.append($columnTitle);\n          $this.append($columnArrowsContainer);\n        }); // Se completan las opciones de configuración del componente\n\n        $self._initOptions(options); // Se inicializa el feedback del componente\n\n\n        $self._initFeedback(options); // Se inicializa el filtro de la tabla\n\n\n        var filterOptions = args[0].filter;\n        var hasOptions = false;\n\n        if (filterOptions !== undefined && filterOptions !== 'noFilter') {\n          hasOptions = true;\n        } // Añadir filter por defecto o el definido por el usuario\n\n\n        $.fn.rup_table.defaults.filter = {\n          id: hasOptions ? filterOptions.id : $self[0].id + '_filter_form',\n          filterToolbar: hasOptions ? filterOptions.filterToolbar : $self[0].id + '_filter_toolbar',\n          collapsableLayerId: hasOptions ? filterOptions.collapsableLayerId : $self[0].id + '_filter_fieldset'\n        }; // Gestionar la inicialización del formulario de filtrado\n\n        if (filterOptions !== 'noFilter') {\n          // En caso de que no haya sido definido por el usuario, se usa el por defecto\n          if (filterOptions === undefined) {\n            options.filter = $.fn.rup_table.defaults.filter;\n          }\n\n          $self._initFilter(options);\n        } else if (filterOptions === 'noFilter' && options.filterForm !== undefined) {\n          // Garantizar la posibilidad del envío del parámetro HDIV_STATE cuando el formulario de filtrado no esté habilitado\n          options.filter = {};\n\n          if (options.filterForm) {\n            options.filter.id = $(options.filterForm).attr('id');\n          } else {\n            options.filter.id = $self[0].id + '_filter_form';\n          }\n\n          options.filter.$filterContainer = jQuery('#' + options.filter.id);\n        } else {\n          // Para casos en los que no se quiera usar el formulario de filtrado y Hdiv no esté activado\n          args[0].filter = undefined;\n        }\n\n        if (options.loadOnStartUp !== undefined && !options.loadOnStartUp) {\n          options.deferLoading = 0;\n        }\n\n        var tabla = $self.DataTable(options);\n        options.sTableId = $self[0].id; // Cuando el seeker esté activo, se mueve bajo la cabecera de la tabla (necesario desde DataTables 1.10.25).\n\n        if ((_options$seeker = options.seeker) !== null && _options$seeker !== void 0 && _options$seeker.activate) {\n          $('#' + options.sTableId + ' tfoot').insertBefore('#' + options.sTableId + ' tbody');\n        }\n\n        $self._initializeMultiselectionProps(tabla.context[0]);\n\n        if (options.createTooltipHead !== false) {\n          //Crear tooltips cabecera;\n          $.each($('#' + $self[0].id + ' thead th'), function () {\n            $self._createTooltip($(this));\n          });\n        }\n\n        tabla.on('draw', function (e, settingsTable) {\n          var ctx = tabla.context[0];\n\n          if (options.searchPaginator) {\n            //Mirar el crear paginador\n            $self._createSearchPaginator($(this), settingsTable); // Deshabilitamos los botones de paginacion si es necesario\n\n\n            $.each($('ul.pagination li.recolocatedPagination_iconButton'), function () {\n              if ($(this).hasClass('disabled')) {\n                $('#' + this.id + ' a').prop('tabindex', '-1');\n              } else {\n                $('#' + this.id + ' a').prop('tabindex', '0');\n              }\n            }); //Si el seeker esta vacio ocultarlo\n\n            if (settingsTable.seeker !== undefined && settingsTable.seeker.search !== undefined && settingsTable.seeker.search.$searchRow !== undefined) {\n              if (settingsTable._iRecordsDisplay > 0) {\n                settingsTable.seeker.search.$searchRow.show();\n              } else {\n                settingsTable.seeker.search.$searchRow.hide();\n              }\n            }\n          }\n\n          if (options.select !== undefined || options.multiSelect !== undefined) {\n            //AL repintar vigilar el select.\n            if (options.select !== undefined) {\n              //AL repintar vigilar el select.\n              if (settingsTable.select !== undefined && settingsTable.select.selectedRowsPerPage !== undefined) {\n                //viene de la navegacion buscar el id.\n                var line = 0;\n\n                if (settingsTable.select.selectedRowsPerPage.cambio === 'prev' || settingsTable.select.selectedRowsPerPage.cambio === 'last') {\n                  line = ctx.json.rows.length - 1;\n                } // Se añaden los parametros para que funcione bien la paginación\n\n\n                ctx.oInit.formEdit.$navigationBar.funcionParams = ['PUT', tabla, line, settingsTable.select.selectedRowsPerPage.cambio];\n                ctx.multiselection.selectedRowsPerPage = [];\n                var rowSelectAux = ctx.json.rows[line];\n                var id = DataTable.Api().rupTable.getIdPk(rowSelectAux, ctx.oInit);\n                ctx.multiselection.selectedRowsPerPage.push({\n                  line: line,\n                  page: ctx.select.selectedRowsPerPage.page,\n                  id: id\n                });\n                settingsTable.select.selectedRowsPerPage = undefined;\n                var numTotal = ctx.json.recordsTotal;\n                var index = (Number(ctx.json.page) - 1) * ctx.aBaseJson.length;\n                index = index + line + 1;\n                DataTable.Api().editForm.updateDetailPagination(ctx, index, numTotal);\n              }\n\n              if (ctx.multiselection.selectedRowsPerPage.length === 1) {\n                DataTable.Api().select.selectRowIndex(tabla, ctx.multiselection.selectedRowsPerPage[0].line, false);\n              }\n\n              if (tabla.context[0].oInit.inlineEdit !== undefined) {\n                DataTable.Api().inlineEdit.addchildIcons(tabla.context[0]);\n              }\n            }\n\n            if (settingsTable.seeker !== undefined && settingsTable.seeker.search !== undefined) {\n              if (settingsTable.seeker.search.funcionParams !== undefined && settingsTable.seeker.search.funcionParams.length > 0 && //Paginar para el seek y que siempre selecione\n              ctx.json.page !== settingsTable.seeker.search.funcionParams[settingsTable.seeker.search.pos].page && ctx.fnRecordsTotal() > 0) {\n                //ver si hay cambio de pagina.\n                DataTable.Api().seeker.selectSearch(tabla, ctx, settingsTable.seeker.search.funcionParams);\n              }\n            }\n          }\n\n          if (options.createTooltipBody !== false) {\n            //Crear tooltips tds;\n            $.each($('#' + settingsTable.sTableId + ' tbody td'), function () {\n              $self._createTooltip($(this));\n            });\n          }\n\n          if (settingsTable.inlineEdit !== undefined) {\n            DataTable.Api().inlineEdit.drawInlineEdit(tabla, ctx);\n\n            if (ctx.oInit.inlineEdit.rowDefault !== undefined) {\n              //editando cuando se pagina\n              if (ctx.oInit.inlineEdit.rowDefault.actionType === 'CLONE') {\n                DataTable.Api().inlineEdit.cloneLine(tabla, ctx, ctx.oInit.inlineEdit.rowDefault.line);\n              } //else{\n\n\n              DataTable.Api().inlineEdit.editInline(tabla, ctx, ctx.oInit.inlineEdit.rowDefault.line);\n              var count = tabla.columns().responsiveHidden().reduce(function (a, b) {\n                return b === false ? a + 1 : a;\n              }, 0);\n\n              if (count > 0) {\n                ctx.oInit.inlineEdit.rowDefault = 'cambioEstado';\n              } else {\n                ctx.oInit.inlineEdit.rowDefault = undefined;\n              } //\t}\n\n            } else if (ctx.oInit.select !== undefined && ctx.multiselection.selectedRowsPerPage.length > 0) {\n              var rowsBody = $(ctx.nTBody);\n              var $tr = $('tr:nth-child(1)', rowsBody);\n\n              if (DataTable.Api().rupTable.getIdPk(ctx.json.rows[0], ctx.oInit) === ctx.multiselection.selectedRowsPerPage[0].id) {\n                $tr.addClass('selected tr-highlight');\n              }\n            }\n          }\n\n          if (settingsTable.oInit.formEdit !== undefined && settingsTable.oInit.responsive !== undefined && settingsTable.oInit.responsive.selectorResponsive !== undefined) {\n            //si el selector es por defecto.selectorResponsive: 'td span.dtr-data'\n            DataTable.Api().editForm.addchildIcons(settingsTable);\n          }\n\n          if (options.inlineEdit === undefined && options.formEdit === undefined) {\n            DataTable.Api().editForm.addchildIcons(settingsTable);\n          }\n        });\n        tabla.on('responsive-resize.dt', function (event, dt) {\n          var ctx = dt.context[0];\n\n          if (ctx.oInit.formEdit !== undefined && ctx.oInit.responsive !== undefined && ctx.oInit.responsive.selectorResponsive !== undefined) {\n            //si el selector es por defecto.selectorResponsive: 'td span.dtr-data'\n            DataTable.Api().editForm.addchildIcons(ctx);\n          }\n\n          if (options.inlineEdit === undefined && options.formEdit === undefined) {\n            DataTable.Api().editForm.addchildIcons(ctx);\n          }\n        });\n        tabla.on('destroy', function (e, settingsTable) {\n          if (options.filter && options.filter.$filterToolbar) {\n            options.filter.$filterToolbar.empty();\n          }\n\n          $('#' + settingsTable.sTableId + '_detail_navigation').empty();\n        }); // En caso de reordenación se revisa para mantener los iconos.\n\n        tabla.on('column-reorder', function (e, settings, details) {\n          if (settings._multiSelect !== undefined && settings.multiselection.numSelected > 0) {\n            tabla.ajax.reload();\n          } else {\n            DataTable.Api().editForm.addchildIcons(settings);\n          }\n        });\n\n        if (options.inlineEdit !== undefined) {\n          DataTable.Api().inlineEdit.onResponsiveResize(tabla);\n        }\n\n        if (options.multiSelect !== undefined || options.select !== undefined) {\n          $self._createEventSelect(tabla);\n        } // Se almacena el objeto settings para facilitar su acceso desde los métodos del componente.\n\n\n        $self.data('settings' + $self[0].id, options);\n        $self.triggerHandler('tableAfterInit', tabla.context[0]);\n\n        if (options.inlineEdit === undefined && options.formEdit === undefined && options.multiselect === undefined && options.select === undefined) {\n          $(window).on('resize.dtr', DataTable.util.throttle(function () {\n            //Se calcula el responsive\n            DataTable.Api().editForm.addchildIcons(tabla.context[0]);\n          }));\n        } //Se audita el componente\n\n\n        $.rup.auditComponent('rup_table', 'init');\n      })[\"catch\"](function (error) {\n        console.error('Error al inicializar el componente:\\n', error);\n      });\n    }\n  }); //******************************************************\n  // DEFINICIÓN DE LA CONFIGURACION POR DEFECTO DEL PATRON\n  //******************************************************\n\n  $.fn.rup_table.defaults = {\n    foobar: false,\n    headerContextMenu: {\n      show: true,\n      selectAllPage: true,\n      deselectAllPage: true,\n      separator: true,\n      selectAll: true,\n      deselectAll: true,\n      items: {}\n    },\n    fixedHeader: {\n      header: false,\n      footer: true\n    },\n    feedback: {\n      closeLink: true,\n      delay: 2000,\n      block: false\n    },\n    responsive: {\n      details: {\n        type: 'column',\n        target: 'tr'\n      },\n      selectorResponsive: 'td span.dtr-data'\n    },\n    dom: //i: Info, t: table, p:pagination, r: procesing , l:length \n    't<\"container-fluid paginationContainer\"' + '<\"row\"' + '<\"col-6 order-3 text-right align-self-center col-sm-5 order-sm-2 col-xl-2 order-xl-1 text-xl-left\">' + '<\"order-1 align-self-center col-sm-12 order-sm-1 col-xl-7 order-xl-2\"p>' + '<\"col-12 order-2 text-center align-self-center col-sm-2 order-sm-3 col-xl-1 p-0\"l>' + '<\"col-6 order-4 text-left align-self-center col-sm-5 order-sm-4 col-xl-2 text-xl-center\"i>' + '>' + '>' + 'r',\n    multiplePkToken: '~',\n    primaryKey: ['id'],\n    blockPKeditForm: true,\n    enableDynamicForms: false,\n    selectFilaDer: true,\n    searchPaginator: true,\n    pagingType: 'full',\n    createdRow: function createdRow(row) {\n      var ctx = $('#' + this[0].id).rup_table('getContext');\n\n      if (ctx.oInit.select != undefined || ctx.oInit.multiSelect != undefined && ctx.oInit.multiSelect.hideMultiselect) {\n        $(row).attr('tabindex', '0');\n      }\n    },\n    columnDefs: [],\n    columnOrderArrows: {\n      showOnlyActive: false,\n      display: 'block'\n    },\n    adapter: 'table_material',\n    order: [[1, 'asc']],\n    ordering: true,\n    defaultOrder: true,\n    showMultiSelectedZero: true,\n    filterMessage: true,\n    noEdit: false\n  };\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! ./../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.masterDetail.js":
/*!*************************************************!*\
  !*** ./src/rup_table/rup.table.masterDetail.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Módulo que permite toda la seleción simple\r\n *\r\n * @summary \t\tExtensión del componente RUP Datatable\r\n * @module\t\t\t\"rup.table.masterDetail\"\r\n * @version     1.0.0\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n *\r\n */\n\n/*global define */\n\n/*global jQuery */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Version information for debugger\n\n  DataTable.masterDetail = {};\n  DataTable.masterDetail.version = '1.2.4';\n  /**\r\n  * Se inicializa el componente select\r\n  *\r\n  * @name init\r\n  * @function\r\n  * @since UDA 3.4.0 // Table 1.0.0\r\n  * \r\n  * @param {object} dt - Es el objeto table.\r\n  *\r\n  */\n\n  DataTable.masterDetail.init = function (dt) {\n    var ctx = dt.settings()[0]; //se crear el hidden en el formulario. \n\n    var masterPKInputId = '#' + ctx.sTableId + '_filter_masterPK';\n    var $hiddenPKMaster = $(masterPKInputId);\n\n    if ($hiddenPKMaster.length === 0) {\n      var msgError = jQuery.rup.i18nTemplate(jQuery.rup.i18n.base, 'rup_table.errors.noMasterPKField.msg', ctx.oInit.filter.$filterContainer.attr('id'), masterPKInputId);\n      $.rup_messages('msgError', {\n        title: jQuery.rup.i18nTemplate(jQuery.rup.i18n.base, 'rup_table.errors.noMasterPKField.title'),\n        message: msgError\n      });\n      throw msgError;\n    }\n\n    var rowsBody = $(ctx.oInit.masterDetail.master + ' > tbody');\n    var tableMaster = $(ctx.oInit.masterDetail.master).DataTable(); //Se edita el row/fila.\n\n    rowsBody.on('click.DT', 'tr:not(.group)', function () {\n      //var tableMaster = $(ctx.oInit.masterDetail.master).DataTable();\n      var rowSelected = tableMaster.rows('.selected').indexes();\n\n      if (rowSelected[0] !== undefined) {\n        //Se ha deseleccionado, no entrar.\n        var row = tableMaster.rows(rowSelected).data();\n        var id = DataTable.Api().rupTable.getIdPk(row[0], tableMaster.context[0].oInit);\n        $hiddenPKMaster.data('nid', row[0].nid);\n        $hiddenPKMaster.val('' + id);\n        $('#' + ctx.sTableId + '_filter_filterButton').click();\n      } else {\n        //se deselecciona\n        _deselectMaster(dt, ctx, $hiddenPKMaster);\n      }\n    }); //Se filtra.\n\n    tableMaster.on('tableAfterReorderData', function () {\n      var multi = tableMaster.context[0].multiselection;\n\n      if (multi.selectedIds.length === 0) {\n        _deselectMaster(dt, ctx, $hiddenPKMaster);\n      } else {\n        $hiddenPKMaster.val('' + multi.selectedIds[0]);\n        $('#' + ctx.sTableId + '_filter_filterButton').click();\n      }\n    });\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n  * Local functions\r\n  */\n\n\n  function _deselectMaster(dt, ctx, $hiddenPKMaster) {\n    $hiddenPKMaster.val('-1');\n    $hiddenPKMaster.data('nid', undefined);\n    $('#' + ctx.sTableId + ' > tbody tr').remove();\n    var asStripeClasses = ctx.asStripeClasses;\n    var iStripes = asStripeClasses.length;\n    var numberVisibles = dt.columns().responsiveHidden().reduce(function (a, b) {\n      return b === true ? a + 1 : a;\n    }, 0);\n    var $tr = $('<tr></tr>', {\n      'class': iStripes ? asStripeClasses[0] : ''\n    }).append($('<td></td>', {\n      'valign': 'top',\n      'colSpan': numberVisibles,\n      'class': ctx.oClasses.sRowEmpty\n    }).html(ctx.oLanguage.sZeroRecords))[0];\n    $('#' + ctx.sTableId + ' > tbody').append($tr);\n    ctx.seeker.search.$searchRow.hide();\n    $('#' + ctx.sTableId + 'addButton_1').prop('disabled', true);\n    DataTable.Api().select.deselect(ctx);\n  }\n  /**\r\n  * Devuelve un objeto json con la clave primaria del registro correspondiente de la tabla maestra.\r\n  *\r\n  * @function getMasterTablePkObject\r\n  * @param {object} options - Opciones de configuración de la acción de inserción.\r\n  * @return {object} - Objeto json con la clave primaria del registro correspondiente de la tabla maestra\r\n  *\r\n  */\n\n\n  function _getMasterTablePkObject(ctx) {\n    var masterPkValue = $('#' + ctx.sTableId + '_filter_masterPK').val();\n    var masterPkName = ctx.oInit.masterDetail.masterPrimaryKey;\n\n    function nestJSON(key, value) {\n      var retObj = {};\n      var splitedKey = key.split('.');\n\n      if (splitedKey.length === 1) {\n        retObj[key] = value;\n        return retObj;\n      } else {\n        retObj[splitedKey[0]] = nestJSON(key.substr(key.indexOf('.') + 1), value);\n        return retObj;\n      }\n    } //Inicio compatibilidad con masterPrimaryKey compuestas\n\n\n    if (Array.isArray(masterPkName) && masterPkName.length > 0 && masterPkValue !== undefined) {\n      var multiplePkToken = ctx.oInit.masterDetail.multiplePkToken;\n      var splitedMasterPkValue = masterPkValue.split(multiplePkToken);\n      var retPkObj = {};\n\n      if (splitedMasterPkValue.length === masterPkName.length) {\n        $.each(masterPkName, function (index, value) {\n          jQuery.extend(true, retPkObj, nestJSON(value, splitedMasterPkValue[index]));\n        });\n      }\n\n      return retPkObj; //Fin compatibilidad con masterPrimaryKey compuestas\n    } else {\n      if (masterPkValue !== undefined) {\n        return nestJSON(masterPkName, masterPkValue);\n      } else if (masterPkValue === undefined) {\n        return null;\n      }\n    }\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n  * DataTables selectors\r\n  */\n\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n  * DataTables API\r\n  *\r\n  * For complete documentation, please refer to the docs/api directory or the\r\n  * DataTables site\r\n  */\n  // Local variables to improve compression\n\n\n  var apiRegister = DataTable.Api.register;\n  apiRegister('masterDetail()', function () {\n    return this.iterator('table', function (ctx) {\n      DataTable.masterDetail.init(new DataTable.Api(ctx));\n    });\n  });\n  apiRegister('masterDetail.getMasterTablePkObject()', function (ctx) {\n    return _getMasterTablePkObject(ctx);\n  }); // Common events with suitable namespaces\n\n  function namespacedEvents(config) {\n    var unique = config._eventNamespace;\n    return 'draw.dt.DT' + unique + ' select.dt.DT' + unique + ' deselect.dt.DT' + unique;\n  }\n  /* * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n  * Initialisation\r\n  */\n  // DataTables creation - check if select has been defined in the options. Note\n  // this required that the table be in the document! If it isn't then something\n  // needs to trigger this method unfortunately. The next major release of\n  // DataTables will rework the events and address this.\n\n\n  $(document).on('preInit.dt.dtSelect', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (ctx.oInit.masterDetail !== undefined) {\n      DataTable.masterDetail.init(new DataTable.Api(ctx));\n    }\n  });\n  return DataTable.masterDetail;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.masterDetail.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.multiFilter.js":
/*!************************************************!*\
  !*** ./src/rup_table/rup.table.multiFilter.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\n * Módulo que permite toda multiFilter\n *\n * @summary \t\tExtensión del componente RUP Datatable\n * @module\t\t\t\"rup.table.multiFilter\"\n * @version     1.0.0\n * @license\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\n * Solo podrá usarse esta obra si se respeta la Licencia.\n * Puede obtenerse una copia de la Licencia en\n *\n *      http://ec.europa.eu/idabc/eupl.html\n *\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\n * que establece la Licencia.\n * @copyright   Copyright 2018 E.J.I.E., S.A.\n *\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Version information for debugger\n\n  DataTable.multiFilter = {};\n  DataTable.multiFilter.version = '1.2.4';\n  /**\n   * Se inicializa el componente multiFilter\n   *\n   * @name init\n   * @function\n   * @since UDA 3.4.0 // Table 1.0.0\n   * \n   * @param {object} dt - Es el objeto table.\n   *\n   */\n\n  DataTable.multiFilter.init = function (dt) {\n    var ctx = dt.settings()[0]; //se preConfigura el filtro. \n\n    preConfigureMultifilter(ctx);\n    postConfigureMultifilter(ctx);\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * Local functions\n   */\n\n  /**\n   * Metodo que realiza la pre-configuración del plugin de filtrado múltiple del componente RUP Table.\n   * Este método se ejecuta antes de la incialización del plugin.\n   *\n   * @name preConfigureMultifilter\n   * @function\n   * @param {object} settings - Parámetros de configuración del componente.\n   */\n\n\n  function preConfigureMultifilter(ctx) {\n    var settings = ctx.oInit;\n    var $dropdownDiaglogTemplate; //definincion de variables con los selectores\n\n    settings.multiFilter.$dropdownDialog = $('#' + ctx.sTableId + '_multifilter_dropdownDialog'); //definicion de variables con ids\n\n    settings.multiFilter.dropdownDialogId = ctx.sTableId + '_multifilter_dropdownDialog';\n    $dropdownDiaglogTemplate = getMultifilterDialogTemplate(ctx);\n    settings.filter.$filterContainer.after($dropdownDiaglogTemplate);\n    $('#' + ctx.sTableId).triggerHandler('tableMultiFilterBeforeConfigureMultifilter', ctx);\n    configureMultifilter(ctx);\n    $('#' + ctx.sTableId).triggerHandler('tableMultiFilterAfterConfigureMultifilter', ctx); // configuracion del resumen del filtro para que\n    // apareza el nombre del filtro\n\n    settings.multiFilter.fncFilterName = function (searchString) {\n      if (settings.multiFilter.$comboLabel === undefined) {\n        if (settings.multiFilter.$filterDefaultName !== undefined) searchString = settings.multiFilter.$filterDefaultName + '  {' + searchString + '}   ';\n      } else if (settings.multiFilter.$comboLabel !== undefined && settings.$firstStartUp) {\n        if (settings.multiFilter.$comboLabel.val() === '' && settings.multiFilter.$filterDefaultName !== undefined) {\n          searchString = settings.multiFilter.$filterDefaultName + '  {' + searchString + '}   ';\n        }\n      } else if (settings.multiFilter.$comboLabel.val() !== '' && settings.multiFilter.$filterWithName) {\n        settings.multiFilter.$filterWithName = false;\n        searchString = settings.multiFilter.$comboLabel.val() + '  {' + searchString + '}   ';\n      }\n\n      return searchString;\n    };\n  }\n  /**\n   * Metodo que realiza la post-configuración del plugin de filtrado múltiple del componente RUP Table.\n   * Este método se ejecuta antes de la inicialización del plugin.\n   *\n   * @name postConfigureMultifilter\n   * @function\n   * @fires module:rup_table#rupTable_multifilter_fillForm\n   * @param {object} settings - Parámetros de configuración del componente.\n   */\n\n\n  function postConfigureMultifilter(ctx) {\n    var settings = ctx.oInit;\n    var $self = this,\n        dropdownButtonConfig;\n    dropdownButtonConfig = $.rup.adapter[jQuery.fn.rup_table.defaults.adapter].multifilter.dropdown;\n    $('#' + ctx.sTableId + '_filter_filterButton').rup_button({\n      dropdown: {\n        dropdownIcon: dropdownButtonConfig.dropdownIcon,\n        dropdownDialog: settings.multiFilter.dropdownDialogId,\n        dropdownDialogConfig: {\n          title: dropdownButtonConfig.dropdownDialogConfig.title + $.rup.i18n.base.rup_table.plugins.multifilter.tittle,\n          width: '450px',\n          buttons: [{\n            id: ctx.sTableId + '_multifilter_BtnSave',\n            text: $.rup.i18n.base.rup_table.plugins.multifilter.save,\n            click: function click() {\n              if (_checkLabel(ctx)) {\n                // creo objeto Filter con los datos del formulario del filtro\n                var filter = _createFilterFromForm(ctx);\n\n                var bfr = _validForm(ctx);\n\n                if (bfr === false || bfr === 'stop') {\n                  settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.errorValidate, 'error');\n                  return;\n                } // añado el filtro\n\n\n                $('#' + ctx.sTableId).triggerHandler('tableMultiFilterBeforeAddFilter', ctx);\n\n                _addFilter(filter, ctx);\n\n                $('#' + ctx.sTableId).triggerHandler('tableMultiFilterAfterAddFilter', ctx);\n              }\n            }\n          }, {\n            id: ctx.sTableId + '_multifilter_BtnApply',\n            text: $.rup.i18n.base.rup_table.plugins.multifilter.apply,\n            click: function click() {\n              //Deshabilitar el nombre del filtro en el filterSummary una vez que ha terminado el filtro por defecto\n              if (settings.$firstStartUp) {\n                settings.$firstStartUp = false;\n              }\n\n              if (_checkLabel(ctx)) {\n                settings.multiFilter.$filterWithName = true;\n\n                var valorFiltro = _searchFilterInCombo(ctx);\n\n                if (valorFiltro !== undefined) {\n                  //limpiamos el filtro\n                  $('#' + ctx.sTableId).triggerHandler('tableMultiFilterBeforeCleanFilterForm', ctx);\n\n                  _cleanFilterForm(ctx);\n\n                  $('#' + ctx.sTableId).triggerHandler('tableMultiFilterAfterCleanFilterForm', ctx); //Cargamos de nuevo el filtro en el formulario del filtro\n                  // rellenar el formulario del filtro\n\n                  _fillForm(valorFiltro, ctx);\n\n                  $('#' + ctx.sTableId + '_filter_filterButton').click();\n                  settings.multiFilter.$closeDialog.click();\n                } else {\n                  settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.errorNoexiste, 'error');\n                }\n              }\n            }\n          }, {\n            id: ctx.sTableId + '_multifilter_BtnRemove',\n            text: $.rup.i18n.base.rup_table.plugins.multifilter.remove,\n            click: function click() {\n              if (_checkLabel(ctx)) {\n                // creo objeto Filter con los datos del formulario del filtro\n                var filter = _createFilterFromForm(ctx); // borro el filtro\n\n\n                $('#' + ctx.sTableId).triggerHandler('tableMultiFilterBeforeDeleteFilter', ctx);\n                deleteFilter(filter, ctx);\n                $('#' + ctx.sTableId).triggerHandler('tableMultiFilterAfterDeleteFilter', ctx);\n              }\n            }\n          }, {\n            text: $.rup.i18n.base.rup_table.plugins.multifilter.cancel,\n            click: function click() {\n              var filtroAnterior = settings.multiFilter.filtroAnterior;\n\n              if (filtroAnterior !== null) {\n                _fillForm(filtroAnterior, ctx);\n              } //limpio el filtro del dropdownDIalog\n\n\n              settings.multiFilter.$comboLabel.val('');\n              settings.multiFilter.$closeDialog.click();\n            },\n            btnType: $.rup.dialog.LINK\n          }]\n        }\n      }\n    }); //definincion de variables con los selectores\n\n    settings.multiFilter.$dropdownButton = $('#' + ctx.sTableId + '_filter_filterButton_dropdown');\n    settings.multiFilter.$combo = $('#' + ctx.sTableId + '_multifilter_combo');\n    settings.multiFilter.$comboLabel = $('#' + ctx.sTableId + '_multifilter_combo_label');\n    settings.multiFilter.$comboButton = $('#' + ctx.sTableId + '_multifilter_dropdownDialog .rup-combobox-toggle');\n    settings.multiFilter.$defaultCheck = $('#' + ctx.sTableId + '_multifilter_defaultFilter');\n    settings.multiFilter.$feedback = $('#' + ctx.sTableId + '_multifilter_dropdownDialog_feedback');\n    settings.multiFilter.$closeDialog = $('#' + ctx.sTableId + '_multifilter_dropdownDialog_close'); // dialog modal para no cambiar el filtro mientras\n    // se gestionan los mismos\n\n    $('#' + settings.multiFilter.dropdownDialogId).rup_dialog('setOption', 'modal', true);\n    $('#' + settings.multiFilter.dropdownDialogId).rup_dialog('setOption', 'draggable', false);\n    $('#' + settings.multiFilter.dropdownDialogId).rup_dialog('setOption', 'resizable', false);\n    $('#' + settings.multiFilter.dropdownDialogId).parent().css('width', '500px');\n    settings.multiFilter.$dropdownButton.on('click', function () {\n      //guardo el filtroAnterior\n      var valorFiltro = form2object(settings.filter.$filterContainer[0]);\n      var xhrArray = $.rup_utils.jsontoarray(valorFiltro);\n      settings.multiFilter.filtroAnterior = valorFiltro; //Foco al label al entrar al dialog\n\n      settings.multiFilter.$comboLabel.focus();\n    });\n\n    _configCombo(ctx);\n\n    settings.multiFilter.$feedback.rup_feedback({\n      block: false,\n      delay: 2000\n    }); //gesión por filtroPorDefecto\n    //bug IE que al cerrar el dialog con el combo desplegado , la lista del combo sigue abierta\n\n    $('.rup-dropdown-dialog').on('dialogclose', function () {\n      settings.multiFilter.$comboLabel.autocomplete('widget').hide();\n    }); //la primera vez que cancelas el filtroAnterior es el filtroPorDefecto\n\n    var valorFiltro = form2object(settings.filter.$filterContainer[0]);\n    var xhrArray = $.rup_utils.jsontoarray(valorFiltro);\n    settings.multiFilter.filtroAnterior = valorFiltro;\n    /*\n    $self.on({\n    \t'rupTable_beforeAdd.multifilter.validate': function(){\n    \n    \t\t//filterSettings.$filterContainer.rup_validate(\"resetForm\");\n    \t\tif (multifilterSettings!==undefined){\n    \t\t\tif(!settings.$firstStartUp){\n    \t\t\t\treturn settings.filter.$filterContainer.valid();\n    \t\t\t}else{\n    \t\t\t\treturn null;\n    \t\t\t}\n    \t\t}else{\n    \t\t\treturn settings.filter.$filterContainer.valid();\n    \t\t}\n    \t}\n    \n    });*/\n  }\n  /**\n   * Función que elimina un filtro del multifiltro.\n   *\n   * @function  deleteFilter\n   * @param {object} filter - Objeto json con la información del filtro a eliminar.\n   * @example\n   * deleteFilter, filter\n   */\n\n\n  function deleteFilter(filter, ctx) {\n    var settings = ctx.oInit; //reiniciar filter salvado\n\n    settings.multiFilter.$savedFilterName = undefined;\n    settings.multiFilter.$savedFilterValue = undefined;\n\n    if (settings.multiFilter.idFilter != null) {\n      filter.filtro.filterSelector = settings.multiFilter.idFilter;\n    } // delete\n\n\n    $.rup_ajax({\n      url: settings.urlBase + '/multiFilter/delete',\n      type: 'DELETE',\n      data: $.toJSON(filter),\n      dataType: 'json',\n      showLoading: false,\n      contentType: 'application/json',\n      async: false,\n      success: function success(data, status, xhr) {\n        settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.ok, 'ok');\n        settings.multiFilter.$combo.rup_autocomplete('set', '', '');\n        settings.multiFilter.$comboLabel.data('tmp.loadObjects.term', null);\n        settings.multiFilter.$comboLabel.data('loadObjects', {});\n        settings.multiFilter.$comboLabel.data('tmp.data', {});\n\n        if (settings.multiFilter.$comboLabel.autocomplete('widget').is(':visible')) {\n          settings.multiFilter.$comboLabel.autocomplete('widget').hide();\n        }\n\n        if (data.filterFeedback == 'no_records') {\n          settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.noRecords, 'error');\n        }\n\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterSuccessDeleteFilter', ctx);\n      },\n      complete: function complete() {\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterCompleteDeleteFilter', ctx);\n      },\n      error: function error(xhr, ajaxOptions, thrownError) {\n        settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.error, 'error');\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterErrorDeleteFilter', ctx);\n      }\n    });\n  }\n  /**\n   * Función que añade un filtro al multifiltro\n   *\n   * @function  addFilter\n   * @param {object} filter - Objeto json con la información del filtro a añadir.\n   * @fires module:rup_table#rupTable_multifilter_beforeAdd\n   * @example\n   * \n   */\n\n\n  function _addFilter(filter, ctx) {\n    var settings = ctx.oInit;\n\n    if (settings.multiFilter.idFilter != null) {\n      filter.filtro.filterSelector = settings.multiFilter.idFilter;\n    } // add Filter\n\n\n    $.rup_ajax({\n      url: settings.urlBase + '/multiFilter/add',\n      type: 'POST',\n      data: $.toJSON(filter),\n      dataType: 'json',\n      showLoading: false,\n      contentType: 'application/json',\n      async: false,\n      beforeSend: function beforeSend(xhr, options) {\n        return $('#' + ctx.sTableId).triggerHandler('rupTable_multifilter_beforeAdd', [xhr, options]);\n      },\n      success: function success(data, status, xhr) {\n        settings.multiFilter.$savedFilterName = data.filterName;\n        settings.multiFilter.$savedFilterValue = data.filterValue;\n        settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.ok, 'ok');\n        settings.multiFilter.$comboLabel.data('tmp.loadObjects.term', null);\n        settings.multiFilter.$comboLabel.data('loadObjects', {});\n        settings.multiFilter.$comboLabel.data('tmp.data', {});\n\n        if (settings.multiFilter.$comboLabel.autocomplete('widget').is(':visible')) {\n          settings.multiFilter.$comboLabel.autocomplete('widget').hide();\n        }\n\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterSuccessAddFilter', ctx);\n      },\n      complete: function complete() {\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterCompleteAddFilter', ctx);\n      },\n      error: function error(xhr, ajaxOptions, thrownError) {\n        settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.error, 'error');\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterErrorAddFilter', ctx);\n      }\n    });\n  }\n\n  function _validForm(ctx) {\n    var settings = ctx.oInit;\n\n    if (settings.multiFilter !== undefined) {\n      if (!settings.$firstStartUp) {\n        return settings.filter.$filterContainer.valid();\n      } else {\n        return null;\n      }\n    } else {\n      return settings.filter.$filterContainer.valid();\n    }\n  }\n  /**\n   * Genera el objeto json de datos de filtrado correspondiente al formulario empleado.\n   *\n   * @function _createFilterFromForm\n   * @private\n   * @param {object} settings - Propiedades de configuración del componente.\n   * @return {object} - Objeto json con la información de filtrado del formulario.\n   * @example\n   * $self._createFilterFromForm(settings);\n   */\n\n\n  function _createFilterFromForm(ctx) {\n    var settings = ctx.oInit;\n    var dataForm = form2object(settings.filter.$filterContainer[0]); //cambiar la fecha a milisegundos para guardar en bd\n\n    var fecha;\n    $.each($('[ruptype=\\'date\\']', settings.filter.$filterContainer), function (index, item) {\n      fecha = $(item).datepicker('getDate');\n      if (fecha != null) dataForm[item.name] = fecha.getTime().toString();\n    });\n    filter.filterValue = $.toJSON(dataForm);\n    var objetoJSON = JSON.parse(filter.filterValue);\n\n    if (hdivStateParamValue !== '') {\n      var clave = settings.primaryKey[0];\n      var $select = $('[name=' + clave + ']');\n\n      if ($('#' + $select[0].id).attr('ruptype') === 'select') {\n        var label = $('#' + $select[0].id).rup_select(\"label\");\n        objetoJSON[clave] = label;\n      }\n    } // Crear una nueva cadena con comillas simples por dentro\n\n\n    var nuevaCadena = '' + Object.keys(objetoJSON).map(function (key) {\n      return key + ':' + objetoJSON[key];\n    }).join(', ');\n    filter.filterValue = nuevaCadena;\n    var dataFormJson = $.toJSON(dataForm);\n    var usuario;\n\n    if (settings.multiFilter.userFilter != null) {\n      usuario = settings.multiFilter.userFilter;\n    } else {\n      usuario = LOGGED_USER;\n    }\n\n    var filter = {\n      filtro: {\n        filterSelector: ctx.sTableId,\n        filterName: settings.multiFilter.$comboLabel.val(),\n        filterValue: dataFormJson,\n        filterDefault: settings.multiFilter.$defaultCheck.is(':checked'),\n        filterUser: usuario\n      }\n    };\n    return filter;\n  }\n  /**\n   * Valida el label que se introduce asociado al filtrado que se va a añadir.\n   *\n   * @function _checkLabel\n   * @private\n   * @param {object} settings - Propiedades de configuración del componente.\n   * @return {boolean} - Devuelve si es válido o no el nombre introducido para el filtro.\n   * @example\n   * $self._configCombo(settings);\n   */\n\n\n  function _checkLabel(ctx) {\n    var settings = ctx.oInit;\n\n    if (settings.multiFilter.$comboLabel.val().trim() === '') {\n      settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.emptyName, 'error');\n      return false;\n    } else if (settings.multiFilter.$comboLabel.val().length > settings.multiFilter.labelSize) {\n      settings.multiFilter.$feedback.rup_feedback('set', $.rup.i18n.base.rup_table.plugins.multifilter.tooLong, 'error');\n      return false;\n    }\n\n    return true;\n  }\n  /**\n   * Inicializa los campos del formulario con los valores correspondientes al filtro seleccionado.\n   *\n   * @function _fillForm\n   * @private\n   * @param {object} filtroNuevo - Objeto json con los valores de filtrado.\n   * @example\n   * $self._fillForm(data);\n   */\n\n\n  function _fillForm(filtroNuevo, ctx) {\n    var settings = ctx.oInit;\n    $('#' + ctx.sTableId).triggerHandler('tableMultiFilterFillForm', ctx); //cambiar milisengudos a fecha (el formato de bd del  fecha es milisegundos)\n\n    $('[ruptype=\\'date\\']', settings.filter.$filterContainer).each(function (index, elem) {\n      var $campo = jQuery(elem);\n      var fechaString;\n      var jsonFecha = filtroNuevo[elem.name];\n\n      if (jsonFecha !== undefined) {\n        if (jsonFecha.search('/') == -1) {\n          var dateFromJson = new Date(parseInt(jsonFecha));\n          var dateFormat = $campo.data('datepicker').settings.dateFormat;\n\n          if ($campo.data('datepicker').settings.datetimepicker) {\n            // Cuando es fecha-hora\n            var dateObj = {\n              hour: dateFromJson.getHours(),\n              minute: dateFromJson.getMinutes(),\n              second: dateFromJson.getSeconds()\n            };\n            fechaString = $.datepicker.formatDate(dateFormat, dateFromJson) + ' ' + $.timepicker._formatTime(dateObj, 'hh:mm:ss');\n          } else {\n            // Solo fecha\n            fechaString = $.datepicker.formatDate(dateFormat, dateFromJson);\n          }\n\n          filtroNuevo[elem.name] = fechaString;\n        }\n      }\n    }); // Formatear datos\n\n    var xhrArray = $.rup_utils.jsontoarray(filtroNuevo); // rellenar el formulario\n\n    $.rup_utils.populateForm(xhrArray, $('#' + ctx.sTableId + '_filter_form'));\n  }\n  /**\n   * Inicializa el combo de selección de filtrado a aplicar en el formulario.\n   *\n   * @function _configCombo\n   * @private\n   * @param {object} settings - Propiedades de configuración del componente.\n   * @example\n   * $self._configCombo(settings);\n   */\n\n\n  function _configCombo(ctx) {\n    var settings = ctx.oInit;\n    settings.multiFilter.$comboLabel.on('change', function () {\n      settings.filter.$filterSummary.html('<i></i>');\n    }); // si el filtro es el predefinido que aparezca en negrita\n\n    if (settings.multiFilter.$comboLabel.data('uiAutocomplete') !== undefined) {\n      settings.multiFilter.$comboLabel.data('uiAutocomplete')._renderItem = function (ul, item) {\n        /*if (item.value) {\n        \treturn $('<li></li>').data(\n        \t\t'item.autocomplete', item).append(\n        \t\t'<a><b>' + item.label + '</b></a>')\n        \t\t.appendTo(ul);\n        } else {*/\n        return $('<li></li>').data('item.autocomplete', item).append('<a>' + item.label + '</a>').appendTo(ul);\n      };\n    }\n\n    jQuery('#' + ctx.sTableId + '_multifilter_combo_label').on('rupAutocomplete_loadComplete', function (event, data) {\n      var count = -1;\n      var objeto = $.grep(data, function (obj, i) {\n        if (obj.filterDefault) {\n          count = i;\n          return obj;\n        }\n      });\n\n      if (objeto !== undefined) {\n        var link = $('#' + ctx.sTableId + '_multifilter_combo_menu a').eq(count);\n        link.css('font-weight', 'bold');\n      }\n    });\n    settings.multiFilter.$comboLabel.off('blur click');\n    settings.multiFilter.$comboLabel.attr('placeholder', $.rup.i18n.base.rup_table.plugins.multifilter.input);\n    settings.multiFilter.$comboLabel.on('blur', function (event) {\n      // Obtener datos de si viene de\n      // seleccionar elemento o si el\n      // menú de selección está\n      // desplegado\n      var selected = settings.multiFilter.$combo.data('selected'),\n          isShowingMenu = $('.ui-autocomplete:visible').length > 0 ? true : false; // Borrar índicador de que viene\n      // de seleccionar elemento\n\n      settings.multiFilter.$combo.data('selected', false); // Si es un evento de teclado\n      // pero no es ENTER, omitir esta\n      // función\n\n      if (event.type === 'keydown' && event.keyCode !== 13) {\n        return true;\n      }\n\n      if (isShowingMenu === true && event.type === 'keydown') {\n        settings.multiFilter.$combo.focus();\n        event.stopPropagation();\n        return true;\n      }\n\n      var autoCompObject = $(event.currentTarget),\n          loadObjects = settings.multiFilter.$comboLabel.data('loadObjects');\n\n      if (settings.getText === true) {\n        settings.multiFilter.$combo.val(autoCompObject.val());\n        settings.multiFilter.$combo.attr('rup_autocomplete_label', autoCompObject.val());\n      } else {\n        if (loadObjects[autoCompObject.val()] !== undefined) {\n          settings.multiFilter.$combo.val(loadObjects[autoCompObject.val()]);\n          settings.multiFilter.$combo.attr('rup_autocomplete_label', loadObjects[autoCompObject.val()]);\n        } else {\n          autoCompObject.autocomplete('close');\n        }\n      } // Si el evento es ENTER y viene\n      // de seleccionar un elemento o\n      // el menú se estaba mostrando,\n      // omitir resto de funciones\n      // (ej. buscar)\n\n\n      if (event.type === 'keydown' && event.keyCode === 13 && (selected || isShowingMenu)) {\n        return false;\n      }\n    });\n    settings.multiFilter.$comboButton.off('click mousedown');\n    settings.multiFilter.$comboButton.on('blur', function () {\n      if (settings.multiFilter.$comboLabel.autocomplete('widget').is(':visible')) {\n        settings.multiFilter.$comboLabel.autocomplete('widget').hide();\n      }\n    });\n    settings.multiFilter.$comboButton.on('click', function () {\n      if (settings.multiFilter.$comboLabel.autocomplete('widget').is(':visible')) {\n        settings.multiFilter.$comboLabel.autocomplete('widget').hide();\n      } else {\n        settings.multiFilter.$comboLabel.autocomplete('search', '');\n        settings.multiFilter.$comboLabel.autocomplete('widget').show();\n        settings.multiFilter.$comboLabel.autocomplete('widget').trigger('focus');\n      }\n    });\n  }\n  /**\n   * Devuelve la template html empleada para renderizar los controles del formulario de filtrado múltiple.\n   *\n   * @function  getMultifilterDialogTemplate\n   * @param {object} settings - Propiedades de configuración del componente.\n   * @return {object} - Objeto jQuery con el contenido html de la template.\n   * @example\n   * \n   */\n\n\n  function getMultifilterDialogTemplate(ctx) {\n    var settings = ctx.oInit;\n    var multifilterSettings = settings.multiFilter;\n    var $dropdownDiaglogTemplate = jQuery('<div id=\"' + multifilterSettings.dropdownDialogId + '\" style=\"display:none\" class=\"dialog-content-material\">' + '<div id=\"' + multifilterSettings.dropdownDialogId + '_feedback\"></div>' + '<form>' + '<div class=\"form-row\">' + '<div id=\"' + multifilterSettings.dropdownDialogId + '_lineaCombo\"  class=\"' + $.rup.adapter[$.fn.rup_table.defaults.adapter].multifilter.classes.container + ' col-12\">' + '<input id=\"' + ctx.sTableId + '_multifilter_combo\" class=\"rup_multifilter_selector\" />' + '<label for=\"' + ctx.sTableId + '_multifilter_combo\" class=\"' + $.rup.adapter[$.fn.rup_table.defaults.adapter].multifilter.classes.label + '\">' + $.rup.i18n.base.rup_table.plugins.multifilter.filters + '</label>' + '</div>' + '</div>' + '<div  class=\"form-row\">' + '<div id=\"' + multifilterSettings.dropdownDialogId + '_lineaDefault\" class=\"' + $.rup.adapter[$.fn.rup_table.defaults.adapter].multifilter.classes.defaultFilter.container + ' col-12\">' + '<input type=\"checkbox\" id=\"' + ctx.sTableId + '_multifilter_defaultFilter\" class=\"' + $.rup.adapter[$.fn.rup_table.defaults.adapter].multifilter.classes.defaultFilter.checkBox + '\"/>' + '<label for=\"' + ctx.sTableId + '_multifilter_defaultFilter\" class=\"' + $.rup.adapter[$.fn.rup_table.defaults.adapter].multifilter.classes.label + '\">' + $.rup.i18n.base.rup_table.plugins.multifilter.defaultFilter + '</label>' + '</div>' + '</form>' + '</div>');\n    return $dropdownDiaglogTemplate;\n  }\n  /**\n   * Realiza la configuración interna del plugin multifilter a partir de las propiedades de configuración indicadas.\n   *\n   * @function  configureMultifilter\n   * @param {object} settings - Propiedades de configuración del componente.\n   * @example\n   * $(\"#idComponente\").rup_table(\"configureMultifilter\", settings);\n   */\n\n\n  function configureMultifilter(ctx) {\n    var settings = ctx.oInit;\n    settings.multiFilter.$filterForm = $('#' + settings.sTableId + '_filter_form');\n    var selector;\n\n    if (settings.multiFilter.idFilter != null) {\n      selector = settings.multiFilter.idFilter;\n    } else {\n      selector = ctx.sTableId;\n    }\n\n    var usuario;\n\n    if (settings.multiFilter.userFilter != null) {\n      usuario = settings.multiFilter.userFilter;\n    } else {\n      usuario = LOGGED_USER;\n    }\n\n    var getDefault;\n\n    if (settings.multiFilter.getDefault != null) {\n      getDefault = settings.multiFilter.getDefault;\n    } else {\n      getDefault = true;\n    }\n\n    jQuery('#' + ctx.sTableId + '_multifilter_combo').rup_autocomplete({\n      source: settings.urlBase + '/multiFilter/getAll?filterSelector=' + selector + '&user=' + usuario,\n      sourceParam: {\n        label: 'filterName',\n        value: 'filterDefault',\n        data: 'filterValue',\n        category: 'filter'\n      },\n      method: 'GET',\n      contains: false,\n      combobox: true,\n      menuAppendTo: $('#' + settings.multiFilter.dropdownDialogId).parent(),\n      appendTo: $('#' + settings.multiFilter.dropdownDialogId).parent(),\n      select: function select() {\n        var valorFiltro = _searchFilterInCombo(ctx); //limpiar Filtro\n\n\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterBeforeCleanFilterForm', ctx);\n\n        _cleanFilterForm(ctx);\n\n        $('#' + ctx.sTableId).triggerHandler('tableMultiFilterAfterCleanFilterForm', ctx); // rellenar el formulario del filtro\n\n        _fillForm(valorFiltro, ctx);\n      }\n    });\n    jQuery('#' + ctx.sTableId + '_multifilter_combo_label').on('autocompleteopen', function () {\n      $(this).data('uiAutocomplete').menu.element.css('zIndex', Number($('#' + settings.multiFilter.dropdownDialogId).parent().css('zIndex')) + 1);\n\n      if ($(this).data('tmp.data') !== undefined) {\n        var data = $(this).data('tmp.data');\n        var count = -1;\n        var objeto = $.grep(data, function (obj, i) {\n          if (obj.filterDefault) {\n            count = i;\n            return obj;\n          }\n        });\n\n        if (objeto !== undefined) {\n          var link = $('#' + ctx.sTableId + '_multifilter_combo_menu a').eq(count);\n          link.css('font-weight', 'bold');\n        }\n      }\n    });\n    $('.jstree').on('rup_filter_treeLoaded', function (event, data) {\n      $(this).rup_tree('setRupValue', data);\n    });\n    $('#' + ctx.sTableId + '_filter_cleanButton').on('click', function () {\n      settings.multiFilter.$combo.rup_autocomplete('set', '', '');\n      settings.filter.$filterSummary.html('<i></i>');\n    });\n  }\n  /**\n   * Limpia el filtro\n   *\n   * @name _clearFilter\n   * @function\n   * @since UDA 3.4.0 // Table 1.0.0\n   *\n   * @param {object} options Opciones del componente\n   *\n   */\n\n\n  function _cleanFilterForm(ctx) {\n    var options = ctx.oInit;\n    options.filter.$filterContainer.resetForm();\n    options.filter.$filterSummary.html(' <i></i>');\n    jQuery('input,textarea', options.filter.$filterContainer).val('');\n    jQuery('.ui-selectmenu-status', '.rup-table-filter-fieldset').text('--');\n    $.rup_utils.populateForm([], options.filter.$filterContainer);\n  }\n  /**\n   * Devuelve el json de filtrado asociado al filtro seleccionado en el combo.\n   *\n   * @function _searchFilterInCombo\n   * @private\n   * @param {object} settings - Propiedades de configuración del componente.\n   * @return {object} - Json de filtrado asociado al filtro seleccionado en el combo.\n   * @example\n   * $self._searchFilterInCombo(settings);\n   */\n\n\n  function _searchFilterInCombo(ctx) {\n    var settings = ctx.oInit;\n    var name = $('#' + ctx.sTableId + '_multifilter_combo_label').val();\n    var listaFiltros = $('#' + ctx.sTableId + '_multifilter_combo_label').data('tmp.data'); // Verificamos si la lista esta vacia. En caso de estarla sera necesario pedirsela al servidor.\n\n    if ($.isEmptyObject(listaFiltros)) {\n      // Parametros consulta\n      var selector = settings.multiFilter.idFilter;\n      var usuario = settings.multiFilter.userFilter;\n      $.rup_ajax({\n        url: settings.urlBase + '/multiFilter/getAll?filterSelector=' + selector + '&user=' + usuario,\n        type: 'GET',\n        async: false,\n        success: function success(data) {\n          // Añadimos a la lista todos los filtros del usuario\n          listaFiltros = JSON.parse(data);\n        }\n      });\n    } // Busco el valor del filtro\n\n\n    var objFiltro = $.grep(listaFiltros, function (obj, i) {\n      if (obj.filterName === name) return obj;\n    });\n    var sourceParam = {\n      label: 'filterName',\n      value: 'filterDefault',\n      data: 'filterValue'\n    };\n\n    if (sourceParam !== undefined) {\n      if (sourceParam.label !== undefined) {\n        objFiltro[0].label = objFiltro[0][sourceParam.label];\n      }\n\n      if (sourceParam.data !== undefined) {\n        objFiltro[0].data = objFiltro[0][sourceParam.data];\n      }\n\n      if (sourceParam.value !== undefined) {\n        objFiltro[0].value = objFiltro[0][sourceParam.value];\n      }\n    } // si es filtro por defecto,\n    // checkeo el check \"Filtro\n    // por defecto\"\n\n\n    if (objFiltro.length !== 0) {\n      settings.multiFilter.$defaultCheck.attr('checked', objFiltro[0].value);\n      var valorFiltro = JSON.parse(objFiltro[0].data);\n      var xhrArray = $.rup_utils.jsontoarray(valorFiltro);\n    }\n\n    if (valorFiltro === undefined && settings.multiFilter.$savedFilterName !== undefined && settings.multiFilter.$savedFilterName === name) {\n      valorFiltro = JSON.parse(settings.multiFilter.$savedFilterValue);\n    }\n\n    return valorFiltro;\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * DataTables selectors\n   */\n\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * DataTables API\n   *\n   * For complete documentation, please refer to the docs/api directory or the\n   * DataTables site\n   */\n  // Local variables to improve compression\n\n\n  var apiRegister = DataTable.Api.register;\n  apiRegister('multiFilter()', function () {\n    return this.iterator('table', function (ctx) {\n      DataTable.multiFilter.init(new DataTable.Api(ctx));\n    });\n  });\n  apiRegister('multiFilter.fillForm()', function (valorFiltro, ctx) {\n    return _fillForm(valorFiltro, ctx);\n  }); // Common events with suitable namespaces\n\n  function namespacedEvents(config) {\n    var unique = config._eventNamespace;\n    return 'draw.dt.DT' + unique + ' select.dt.DT' + unique + ' deselect.dt.DT' + unique;\n  }\n  /* * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n   * Initialisation\n   */\n  // DataTables creation - check if select has been defined in the options. Note\n  // this required that the table be in the document! If it isn't then something\n  // needs to trigger this method unfortunately. The next major release of\n  // DataTables will rework the events and address this.\n\n\n  $(document).on('preInit.dt.dtSelect', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (ctx.oInit.multiFilter !== undefined && ctx.oInit.multiFilter.activate !== false) {\n      DataTable.multiFilter.init(new DataTable.Api(ctx));\n    }\n  });\n  return DataTable.multiFilter;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.multiFilter.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.multiSelect.js":
/*!************************************************!*\
  !*** ./src/rup_table/rup.table.multiSelect.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/* eslint-disable no-mixed-spaces-and-tabs */\n\n/**\r\n * Módulo que permite toda la multiseleción\r\n *\r\n * @summary \t\tExtensión del componente RUP Datatable\r\n * @module\t\t\t\"rup.table.multiSelect\"\r\n * @version     1.0.0\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n *\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\"), __webpack_require__(/*! ../rup.contextMenu */ \"./src/rup.contextMenu.js\"), __webpack_require__(/*! ../rup.feedback */ \"./src/rup.feedback.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Version information for debugger\n\n  DataTable.multiSelect = {};\n  DataTable.multiSelect.version = '1.2.4';\n  /**\r\n   * Se inicializa el componente multiselect\r\n   *\r\n   * @name init\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n  DataTable.multiSelect.init = function (dt) {\n    var ctx = dt.settings()[0];\n    var init = ctx.oInit.multiSelect;\n    var defaults = DataTable.defaults.multiSelect;\n    var opts = init === undefined ? defaults : init; // Set defaults\n\n    var items = 'row';\n    var style = 'api';\n    var info = true;\n    var selector = 'td';\n    var className = 'selected tr-highlight';\n    var setStyle = false;\n    ctx._multiSelect = {};\n\n    if (init.hideMultiselect === undefined) {\n      init.hideMultiselect = false;\n    }\n\n    if (init.enableMouseSelection === undefined) {\n      init.enableMouseSelection = true;\n    }\n\n    if (init.enableKeyboardSelection === undefined) {\n      init.enableKeyboardSelection = true;\n    } //se Inicializa las propiedades de los select.\n    //ctx.multiselection = $self._initializeMultiselectionProps();\n\n\n    _paintCheckboxSelect(ctx); // Initialisation customisations\n\n\n    if (opts === true) {\n      style = 'os';\n      setStyle = true;\n    } else if (typeof opts === 'string') {\n      style = opts;\n      setStyle = true;\n    } else if ($.isPlainObject(opts)) {\n      if (opts.info !== undefined) {\n        info = opts.info;\n      }\n\n      if (opts.items !== undefined) {\n        items = opts.items;\n      }\n\n      if (opts.style !== undefined) {\n        style = opts.style;\n        setStyle = true;\n      }\n\n      if (ctx.oInit.selector !== undefined) {\n        selector = opts.selector;\n      }\n\n      if (opts.className !== undefined) {\n        className = opts.className;\n      }\n    }\n\n    dt.multiSelect.selector(selector);\n    dt.multiSelect.items(items);\n    dt.multiSelect.style(style);\n    dt.multiSelect.info(info);\n    ctx._multiSelect.className = className; // Sort table based on selected rows. Requires Select Datatables extension\n\n    $.fn.dataTable.ext.order['select-checkbox'] = function (settings, col) {\n      return this.api().column(col, {\n        order: 'index'\n      }).nodes().map(function (td) {\n        if (settings._multiSelect.items === 'row') {\n          return $(td).parent().hasClass(settings._multiSelect.className);\n        } else if (settings._multiSelect.items === 'cell') {\n          return $(td).hasClass(settings._multiSelect.className);\n        }\n\n        return false;\n      });\n    }; // If the init options haven't enabled select, but there is a selectable\n    // class name, then enable\n\n\n    if (!setStyle && $(dt.table().node()).hasClass('selectable')) {\n      dt.smultiSelect.style('os');\n    }\n  };\n\n  function _selectRowIndex(dt, index, tr) {\n    var ctx = dt.settings()[0];\n    ctx.multiselection.selectedRowsPerPage = [];\n    ctx.oInit.multiSelect.funcionParams = '';\n    var rowsBody = $(ctx.nTBody);\n\n    if (tr.hasClass('tr-highlight')) {\n      tr.removeClass('selected tr-highlight');\n\n      if (tr.next('.child').length >= 1) {\n        tr.next('.child').removeClass('selected tr-highlight');\n      }\n\n      ctx.multiselection.numSelected = 0;\n      ctx.multiselection.selectedIds = [];\n      ctx.multiselection.lastSelectedId = ''; // Si es en edicion en linea, no hacer nada\n\n      if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined && DataTable.Api().inlineEdit.editSameLine(ctx, index)) {\n        // Seleccionar la fila otra vez.\n        _selectRowIndex(dt, index, tr);\n      }\n    } else {\n      $('tr', rowsBody).removeClass('selected tr-highlight');\n      tr.addClass('selected tr-highlight');\n\n      if (tr.next('.child').length >= 1) {\n        tr.next('.child').addClass('selected tr-highlight');\n      }\n\n      tr.triggerHandler('tableHighlightRowAsSelected');\n      var row = ctx.json.rows[index];\n\n      if (row !== undefined) {\n        var arra = {\n          id: DataTable.Api().rupTable.getIdPk(row, ctx.oInit),\n          page: dt.page() + 1,\n          line: index\n        };\n        ctx.multiselection.selectedRowsPerPage.splice(0, 0, arra);\n        ctx.multiselection.numSelected = 1;\n        ctx.multiselection.selectedIds = [DataTable.Api().rupTable.getIdPk(row, ctx.oInit)];\n        ctx.multiselection.lastSelectedId = DataTable.Api().rupTable.getIdPk(row, ctx.oInit);\n      } // Si es en edicion en linea\n\n\n      if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined && ctx.inlineEdit.lastRow !== undefined && ctx.inlineEdit.lastRow.idx !== index) {\n        DataTable.Api().inlineEdit.restaurarFila(ctx, true);\n      }\n    }\n\n    if (ctx.oInit.buttons !== undefined) {\n      DataTable.Api().buttons.displayRegex(ctx);\n    }\n  }\n  /*\r\n  Select is a collection of API methods, event handlers, event emitters and\r\n  buttons (for the `Buttons` extension) for DataTables. It provides the following\r\n  features, with an overview of how they are implemented:\r\n  ## Selection of rows, columns and cells. Whether an item is selected or not is\r\n  stored in:\r\n  * rows: a `_select_selected` property which contains a boolean value of the\r\n  DataTables' `aoData` object for each row\r\n  * columns: a `_select_selected` property which contains a boolean value of the\r\n  DataTables' `aoColumns` object for each column\r\n  * cells: a `_selected_cells` property which contains an array of boolean values\r\n  of the `aoData` object for each row. The array is the same length as the\r\n  columns array, with each element of it representing a cell.\r\n  This method of using boolean flags allows Select to operate when nodes have not\r\n  been created for rows / cells (DataTables' defer rendering feature).\r\n  ## API methods\r\n  A range of API methods are available for triggering selection and de-selection\r\n  of rows. Methods are also available to configure the selection events that can\r\n  be triggered by an end user (such as which items are to be selected). To a large\r\n  extent, these of API methods *is* Select. It is basically a collection of helper\r\n  functions that can be used to select items in a DataTable.\r\n  Configuration of select is held in the object `_select` which is attached to the\r\n  DataTables settings object on initialisation. Select being available on a table\r\n  is not optional when Select is loaded, but its default is for selection only to\r\n  be available via the API - so the end user wouldn't be able to select rows\r\n  without additional configuration.\r\n  The `_select` object contains the following properties:\r\n  ```\r\n  {\r\n  items:string     - Can be `rows`, `columns` or `cells`. Defines what item\r\n                  will be selected if the user is allowed to activate row\r\n                  selection using the mouse.\r\n  style:string     - Can be `none`, `single`, `multi` or `os`. Defines the\r\n                  interaction style when selecting items\r\n  info:boolean     - If the selection summary should be shown in the table\r\n                  information elements\r\n  }\r\n  ```\r\n  In addition to the API methods, Select also extends the DataTables selector\r\n  options for rows, columns and cells adding a `selected` option to the selector\r\n  options object, allowing the developer to select only selected items or\r\n  unselected items.\r\n  ## Mouse selection of items\r\n  Clicking on items can be used to select items. This is done by a simple event\r\n  handler that will select the items using the API methods.\r\n  */\n\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Local functions\r\n   */\n\n  /**\r\n   * Add one or more cells to the selection when shift clicking in OS selection\r\n   * style cell selection.\r\n   *\r\n   * Cell range is more complicated than row and column as we want to select\r\n   * in the visible grid rather than by index in sequence. For example, if you\r\n   * click first in cell 1-1 and then shift click in 2-2 - cells 1-2 and 2-1\r\n   * should also be selected (and not 1-3, 1-4. etc)\r\n   *\r\n   * @name cellRange\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0 \r\n   * \r\n   * @param  {DataTable.Api} dt   DataTable\r\n   * @param  {object}        idx  Cell index to select to\r\n   * @param  {object}        last Cell index to select from\r\n   * \r\n   */\n\n\n  function cellRange(dt, idx, last) {\n    var indexes;\n    var columnIndexes;\n    var rowIndexes;\n\n    var selectColumns = function selectColumns(start, end) {\n      if (start > end) {\n        var tmp = end;\n        end = start;\n        start = tmp;\n      }\n\n      var record = false;\n      return dt.columns(':visible').indexes().filter(function (i) {\n        if (i === start) {\n          record = true;\n        }\n\n        if (i === end) {\n          // not else if, as start might === end\n          record = false;\n          return true;\n        }\n\n        return record;\n      });\n    };\n\n    var selectRows = function selectRows(start, end) {\n      var indexes = dt.rows({\n        search: 'applied'\n      }).indexes(); // Which comes first - might need to swap\n\n      if (indexes.indexOf(start) > indexes.indexOf(end)) {\n        var tmp = end;\n        end = start;\n        start = tmp;\n      }\n\n      var record = false;\n      return indexes.filter(function (i) {\n        if (i === start) {\n          record = true;\n        }\n\n        if (i === end) {\n          record = false;\n          return true;\n        }\n\n        return record;\n      });\n    };\n\n    if (!dt.cells({\n      selected: true\n    }).any() && !last) {\n      // select from the top left cell to this one\n      columnIndexes = selectColumns(0, idx.column);\n      rowIndexes = selectRows(0, idx.row);\n    } else {\n      // Get column indexes between old and new\n      columnIndexes = selectColumns(last.column, idx.column);\n      rowIndexes = selectRows(last.row, idx.row);\n    }\n\n    indexes = dt.cells(rowIndexes, columnIndexes).flatten();\n\n    if (!dt.cells(idx, {\n      selected: true\n    }).any()) {\n      // Select range\n      dt.cells(indexes).select();\n    } else {\n      // Deselect range\n      dt.cells(indexes).deselect();\n    }\n  }\n  /**\r\n   * Attach mouse listeners to the table to allow mouse selection of items\r\n   *\r\n   * @name enableMouseSelection\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   * \r\n   * @param {DataTable.Api} dt DataTable\r\n   * \r\n   */\n\n\n  function enableMouseSelection(dt) {\n    var ctx = dt.settings()[0];\n    var container = $(ctx.nTBody);\n\n    if (ctx.oInit.selectFilaDer) {\n      container.on('click contextmenu', function (event) {\n        if (event.target !== undefined && event.target.className.indexOf('openResponsive') > -1) {\n          return false;\n        }\n\n        var ctx = dt.settings()[0];\n        var row = $(event.target);\n        row.triggerHandler('tableSelectBeforeSelectRow', ctx);\n\n        if ((event.shiftKey || event.ctrlKey || event.shiftKey && event.which === 32) && ctx.multiselection.selectedRowsPerPage.length > 0) {\n          rangeSelection(dt, event);\n        } else if (ctx.multiselection.lastSelectedIsRange) {\n          if (event.target.type !== 'checkbox') {\n            deselectAllPage(dt);\n            dt.row($(event.target).closest('tr').index()).multiSelect();\n          } else {\n            $(event.target).parent('').find('input').prop('checked', function () {\n              return !this.checked;\n            });\n          }\n        } else {\n          if (event.target.type !== 'checkbox') {\n            rowSelection(dt, event);\n          } else if (!$(event.target).hasClass('editable')) {\n            $(event.target).parent('').find('input').prop('checked', function () {\n              return !this.checked;\n            });\n          }\n        }\n\n        row.triggerHandler('tableSelectAfterSelectRow', ctx);\n      });\n    } else {\n      container.on('click.dtSelect', function (event) {\n        if (event.target !== undefined && event.target.className.indexOf('openResponsive') > -1) {\n          return false;\n        }\n\n        var ctx = dt.settings()[0];\n        var row = $(event.target);\n        row.triggerHandler('tableSelectBeforeSelectRow', ctx);\n\n        if ((event.shiftKey || event.ctrlKey || event.shiftKey && event.which === 32) && ctx.multiselection.selectedRowsPerPage.length > 0) {\n          rangeSelection(dt, event);\n        } else if (ctx.multiselection.lastSelectedIsRange) {\n          if (event.target.type !== 'checkbox') {\n            deselectAllPage(dt);\n            dt.row($(event.target).closest('tr').index()).multiSelect();\n          } else {\n            $(event.target).parent('').find('input').prop('checked', function () {\n              return !this.checked;\n            });\n          }\n        } else {\n          if (event.target.type !== 'checkbox') {\n            rowSelection(dt, event);\n          } else if (!$(event.target).hasClass('editable')) {\n            $(event.target).parent('').find('input').prop('checked', function () {\n              return !this.checked;\n            });\n          }\n        }\n\n        row.triggerHandler('tableSelectAfterSelectRow', ctx);\n      });\n    }\n  }\n  /**\r\n   * Attach keyboard listeners to the table to allow keyboard selection of items\r\n   *\r\n   * @name enableKeyboardSelection\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   * \r\n   * @param {DataTable.Api} dt DataTable\r\n   * \r\n   */\n\n\n  function enableKeyboardSelection(dt) {\n    var ctx = dt.settings()[0];\n    var container = $(ctx.nTBody);\n    container.on('keydown.dtSelect', function (event) {\n      if (event.which === 32) {\n        if (event.target !== undefined && event.target.className.indexOf('openResponsive') > -1) {\n          return false;\n        }\n\n        var ctx = dt.settings()[0];\n        var row = $(event.target);\n        row.triggerHandler('tableSelectBeforeSelectRow', ctx);\n\n        if (event.shiftKey && event.which === 32 || event.ctrlKey && event.which === 32) {\n          rangeSelection(dt, event);\n        } else if (ctx.multiselection.lastSelectedIsRange) {\n          deselectAllPage(dt);\n          dt.row($(event.target).closest('tr').index()).multiSelect();\n        } else {\n          // Se selecciona una fila si la propiedad 'hideMultiselect' es true\n          if (ctx.oInit.multiSelect.hideMultiselect) {\n            // Solo selecciona si se pulsa sobre la barra espaciadora\n            if (event.which === 32) {\n              if (event.target.className.indexOf('openResponsive') > -1 || row.hasClass('editable')) {\n                return false;\n              }\n\n              var idRow = row.index(); // Se deselecciona\n\n              if (row.hasClass('tr-highlight')) {\n                ctx.multiselection.accion = 'uncheck';\n                dt.row(idRow).deselect();\n              } // Se selecciona\n              else {\n                dt.row(idRow).multiSelect();\n              }\n            }\n          }\n\n          rowSelection(dt, event);\n        }\n\n        row.triggerHandler('tableSelectAfterSelectRow', ctx);\n      }\n    });\n  }\n  /**\r\n   * Select a range of rows in a DataTable\r\n   *\r\n   * @name rangeSelection\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   * \r\n   * @param  {DataTable.Api} dt   DataTable\r\n   * \r\n   */\n\n\n  function rangeSelection(dt, event) {\n    var ctx = dt.settings()[0];\n\n    if (event.ctrlKey) {\n      var cell = dt.cell($(event.target).closest('td, th'));\n      var idx = cell.index().row;\n      var isSelected = dt.row(idx, {\n        selected: true\n      }).any();\n      dt.row(idx).multiSelect(!isSelected);\n    } else {\n      // Desde / Hasta\n      var fromIndex;\n\n      if (dt.rows({\n        selected: true\n      }).any()) {\n        fromIndex = ctx.multiselection.selectedRowsPerPage[$.inArray(ctx.multiselection.lastSelectedId, ctx.multiselection.selectedIds)].line;\n      } else {\n        fromIndex = $(event.target).closest('tr').index();\n      }\n\n      var toIndex = $(event.target).closest('tr').index(); // Guardar id desde\n\n      var idBase = ctx.multiselection.lastSelectedId;\n      deselectAllPage(dt);\n\n      if (fromIndex < toIndex) {\n        toIndex++;\n\n        for (var i = fromIndex; i < toIndex; i++) {\n          dt.row(i).multiSelect();\n        }\n      } else if (fromIndex > toIndex) {\n        toIndex--;\n\n        for (var _i = fromIndex; _i > toIndex; _i--) {\n          dt.row(_i).multiSelect();\n        }\n      } else {\n        dt.row(fromIndex).multiSelect();\n        idBase = ctx.multiselection.lastSelectedId;\n      }\n\n      ctx.multiselection.lastSelectedId = idBase;\n      ctx.multiselection.lastSelectedIsRange = true;\n    }\n  }\n  /**\r\n   * Select a row in a DataTable\r\n   *\r\n   * @name rowSelection\r\n   * @function\r\n   * @since UDA 4.2.0 // Table 1.0.0\r\n   * \r\n   * @param  {DataTable.Api} dt   DataTable\r\n   * @param  {object}        event  Event information\r\n   * \r\n   */\n\n\n  function rowSelection(dt, event) {\n    var ctx = dt.settings()[0];\n    var items = dt.multiSelect.items(); // If text was selected (click and drag), then we shouldn't change\n    // the row's selected state\n\n    if (window.getSelection) {\n      var selection = window.getSelection(); // If the element that contains the selection is not in the table, we can ignore it\n      // This can happen if the developer selects text from the click event\n\n      if (!selection.anchorNode || $(selection.anchorNode).closest('table')[0] === dt.table().node()) {\n        if (selection.toString().trim() !== '') {\n          return;\n        }\n      }\n    } // Ignore clicks inside a sub-table\n\n\n    if ($(event.target).closest('div.dataTables_wrapper')[0] != dt.table().container()) {\n      return;\n    }\n\n    var cell = dt.cell($(event.target).closest('td, th')); // Check the cell actually belongs to the host DataTable (so child\n    // rows, etc, are ignored)\n\n    if (!cell.any()) {\n      return;\n    }\n\n    var newEvent = $.Event('user-select.dt');\n    eventTrigger(dt, newEvent, [items, cell, newEvent]);\n\n    if (event.isDefaultPrevented()) {\n      return;\n    }\n\n    var cellIndex = cell.index();\n    var idx = cellIndex.row;\n    var isSelected = dt.row(idx, {\n      selected: true\n    }).any();\n    dt.row(idx).multiSelect(!isSelected);\n    ctx._multiSelect_lastCell = cellIndex;\n  }\n  /**\r\n   * Trigger an event on a DataTable\r\n   *\r\n   * @name eventTrigger\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {DataTable.Api} api      DataTable to trigger events on\r\n   * @param  {boolean}      selected true if selected, false if deselected\r\n   * @param  {string}       type     Item type acting on\r\n   * @param  {boolean}      any      Require that there are values before triggering\r\n   * \r\n   */\n\n\n  function eventTrigger(api, type, args, any) {\n    if (any && !api.flatten().length) {\n      return;\n    }\n\n    if (typeof type === 'string') {\n      type = type + '.dt';\n    }\n\n    args.unshift(api);\n    $(api.table().node()).trigger(type, args);\n  }\n  /**\r\n   * Update the information element of the DataTable showing information about the\r\n   * items selected. This is done by adding tags to the existing text\r\n   *\r\n   * @name info\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {DataTable.Api} api DataTable to update\r\n   * \r\n   */\n\n\n  function info(api) {\n    var ctx = api.settings()[0];\n\n    if (!ctx._multiSelect.info || !ctx.aanFeatures.i) {\n      return;\n    }\n\n    if (api.multiSelect.style() === 'api') {\n      return;\n    }\n\n    var rows = api.rows({\n      selected: true\n    }).flatten().length;\n\n    var add = function add(el, name, num) {\n      name = jQuery.rup.i18nTemplate(ctx.oLanguage, 'rup_table.fila');\n      var sels = jQuery.rup.i18nTemplate(ctx.oLanguage, 'rup_table.seleccionadas');\n      var sel = jQuery.rup.i18nTemplate(ctx.oLanguage, 'rup_table.seleccionada');\n\n      if (ctx.oInit.showMultiSelectedZero) {\n        //se muestra el mensaje\n        if ($.rup.lang !== 'eu') {\n          el.append($('<span class=\"select-item\"></span>').append(api.i18n('select.filas', {\n            _: '%d ' + name + 's ' + sels + '',\n            1: '1 ' + name + ' ' + sel + ''\n          }, num)));\n        } else {\n          el.append($('<span class=\"select-item\"></span>').append(api.i18n('select.filas', {\n            _: sel + ' %d ' + name,\n            0: sel + ' inongo ' + name + 'rik',\n            1: sel + ' ' + name + ' 1'\n          }, num)));\n          el.attr(\"style\", \"white-space: nowrap;\");\n        }\n      } else {\n        // nose muestra.\n        if ($.rup.lang !== 'eu') {\n          el.append($('<span class=\"select-item\"></span>').append(api.i18n('select.filas', {\n            _: '%d ' + name + 's ' + sels + '',\n            0: '',\n            1: '1 ' + name + ' ' + sel + ''\n          }, num)));\n        } else {\n          el.append($('<span class=\"select-item\"></span>').append(api.i18n('select.filas', {\n            _: sel + ' %d ' + name,\n            0: '',\n            1: sel + ' ' + name + ' 1'\n          }, num)));\n        }\n      }\n    };\n\n    rows = ctx.multiselection.numSelected; //Antes de mostrar la info se ha de ordenar.\n    // Internal knowledge of DataTables to loop over all information elements\n\n    $.each(ctx.aanFeatures.i, function (i, el) {\n      el = $('#' + ctx.sTableId + 'PaginationContainer > div > div:first-child');\n      var output = $('<span class=\"select-info\"></span>');\n      add(output, 'row', rows);\n      var existing = el.children('span.select-info');\n\n      if (existing.length) {\n        existing.remove();\n      }\n\n      if (output.text() !== '') {\n        el.append(output);\n      }\n    });\n    $('#' + ctx.sTableId).triggerHandler('tableMultiSelectionRowNumberUpdate', ctx);\n  }\n  /**\r\n   * Initialisation of a new table. Attach event handlers and callbacks to allow\r\n   * Select to operate correctly.\r\n   *\r\n   * This will occur _after_ the initial DataTables initialisation, although\r\n   * before Ajax data is rendered, if there is ajax data\r\n   *\r\n   * @name init\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param  {DataTable.settings} ctx Settings object to operate on\r\n   * \r\n   */\n\n\n  function init(ctx) {\n    var api = new DataTable.Api(ctx); //Se añade el context, al pagination container\n\n    if ($('#' + ctx.sTableId).next($('div.paginationContainer')).length === 1) {\n      $('#' + ctx.sTableId).next($('div.paginationContainer')).attr('id', ctx.sTableId + 'PaginationContainer');\n    } // Row callback so that classes can be added to rows and cells if the item\n    // was selected before the element was created. This will happen with the\n    // `deferRender` option enabled.\n    //\n    // This method of attaching to `aoRowCreatedCallback` is a hack until\n    // DataTables has proper events for row manipulation If you are reviewing\n    // this code to create your own plug-ins, please do not do this!\n\n\n    ctx.aoRowCreatedCallback.push({\n      fn: function fn(row, data, index) {\n        var i, ien;\n        var d = ctx.aoData[index]; // Row\n\n        if (d._multiSelect_selected) {\n          $(row).addClass(ctx._multiSelect.className);\n\n          if (api.row(index).child() !== undefined) {\n            api.row(index).child().addClass(ctx._multiSelect.className);\n          }\n        } // Cells and columns - if separated out, we would need to do two\n        // loops, so it makes sense to combine them into a single one\n\n\n        for (i = 0, ien = ctx.aoColumns.length; i < ien; i++) {\n          if (ctx.aoColumns[i]._multiSelect_selected || d._selected_cells && d._selected_cells[i]) {\n            $(d.anCells[i]).addClass(ctx._multiSelect.className);\n          }\n        }\n      },\n      sName: 'select-deferRender'\n    }); // On Ajax reload we want to reselect all rows which are currently selected,\n    // if there is an rowId (i.e. a unique value to identify each row with)\n\n    api.on('preXhr.dt.dtSelect', function () {\n      // note that column selection doesn't need to be cached and then\n      // reselected, as they are already selected\n      var rows = api.rows({\n        selected: true\n      }).ids(true).filter(function (d) {\n        return d !== undefined;\n      });\n      var cells = api.cells({\n        selected: true\n      }).eq(0).map(function (cellIdx) {\n        var id = api.row(cellIdx.row).id(true);\n        return id ? {\n          row: id,\n          column: cellIdx.column\n        } : undefined;\n      }).filter(function (d) {\n        return d !== undefined;\n      }); // On the next draw, reselect the currently selected items\n\n      api.one('draw.dt.dtSelect', function () {\n        api.rows(rows).multiSelect(); // `cells` is not a cell index selector, so it needs a loop\n\n        if (cells.any()) {\n          cells.each(function (id) {\n            api.cells(id.row, id.column).multiSelect();\n          });\n        }\n      });\n    }); // Update the table information element with selected item summary\n\n    api.on('draw.dtSelect.dt select.dtSelect.dt deselect.dtSelect.dt info.dt', function () {\n      info(api);\n\n      _drawSelectId(api, ctx); //Comprobar si hay algun feedback activado\n\n\n      var feedback = ctx.oInit.feedback.$feedbackContainer;\n\n      if (feedback.type !== undefined && feedback.type === 'eliminar') {\n        feedback.rup_feedback('set', feedback.msgFeedBack, 'ok');\n        feedback.rup_feedback('show');\n      }\n    });\n\n    if (ctx.oInit.inlineEdit === undefined && ctx.oInit.formEdit === undefined) {\n      $(window).on('resize.dtr', DataTable.util.throttle(function () {\n        //Se calcula el responsive\n        DataTable.Api().editForm.addchildIcons(ctx);\n      }));\n    }\n  }\n  /**\r\n   * Pinta los elementos selecionables, porque tiene los ids almacenados y mete la clase que se le indica.\r\n   *\r\n   *\r\n   * This will occur _after_ the initial DataTables initialisation, although\r\n   * before Ajax data is rendered\r\n   *\r\n   * @name drawSelectId\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param  {DataTable.api} ctx\r\n   * \r\n   */\n\n\n  function _drawSelectId(api, ctx) {\n    var DataTable = $.fn.dataTable;\n    var pos = -1;\n    $.each(ctx.multiselection.selectedIds, function (index, value) {\n      var idx = -1;\n      $.each(api.context[0].json.rows, function (indexData, valueData) {\n        if (value === DataTable.Api().rupTable.getIdPk(valueData, ctx.oInit)) {\n          idx = indexData;\n          return false;\n        }\n      });\n\n      if (idx >= 0) {\n        api.context[0].aoData[idx]._multiSelect_selected = true;\n        $(api.context[0].aoData[idx].nTr).addClass(api.context[0]._multiSelect.className);\n\n        if (api.row(idx).child() !== undefined) {\n          api.row(idx).child().addClass(ctx._multiSelect.className);\n        } // Marcamos el checkbox\n\n\n        $($(ctx.aoData[idx].anCells).filter('.select-checkbox')).find(':input').prop('checked', true);\n        $(api.context[0].aoData[idx].nTr).triggerHandler('tableHighlightRowAsSelected', ctx);\n\n        if ($.fn.getStaticHdivID(ctx.multiselection.lastSelectedId) === $.fn.getStaticHdivID(value)) {\n          pos = idx;\n        }\n\n        if (pos === -1 && ctx.multiselection.lastSelectedId === '') {\n          //En caso de que no hay ninguna coincidencia se pone el ultimo.\n          pos = idx;\n        }\n      }\n    });\n\n    if (pos >= 0) {\n      //si hay mas columnas porque aun no ha refrescado al crear y clonar.\n      if (ctx._iDisplayLength < ctx.json.rows.length && !$('#' + ctx.sTableId + ' tbody tr').hasClass('new')) {\n        pos--;\n      }\n\n      DataTable.Api().rupTable.selectPencil(api.context[0], pos);\n    }\n  }\n  /**\r\n   * Pinta la cabecera y pie del table con el checkbox all.\r\n   *\r\n   * @name paintCheckboxexSelect\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param  {DataTable.ctx} ctx Settings object to operate on\r\n   *\r\n   */\n\n\n  function _paintCheckboxSelect(ctx) {\n    var columnDefs = ctx.oInit.aoColumnDefs;\n\n    if (columnDefs !== undefined && columnDefs[0].className !== undefined && columnDefs[0].className.indexOf('select-checkbox') > -1) {\n      //Se rellena todo, la columna select.\n      //si metes esta propiedad se oculta el div:\n      if (ctx.oInit.multiSelect === undefined || !ctx.oInit.multiSelect.hideMultiselect) {\n        var input = $('<div>').attr('id', 'divSelectTableHead_' + ctx.sTableId).attr('class', 'divSelectTableHead checkbox-material checkbox-material-inline').append($('<input/>').attr('id', 'inputSelectTableHead_' + ctx.sTableId).attr('type', 'checkbox')).append($('<label></label>'));\n        var link = $('<a></a>').addClass('ui-icon rup-table_checkmenu_arrow').attr('id', 'linkSelectTableHead' + ctx.sTableId);\n        input.click(function () {\n          var dt = new DataTable.Api(ctx);\n\n          if ($(this).find('input').is(':checked')) {\n            deselectAllPage(dt);\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', false);\n          } else {\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', true);\n            selectAllPage(dt);\n          }\n        });\n        link.click(function () {\n          var dt = new DataTable.Api(ctx); //Marcar todos\n\n          if (ctx.multiselection.selectedAll && ctx.multiselection.deselectedIds.length === 0) {\n            $('#contextMenu1 li.context-menu-icon-check').addClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-check_all').addClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-uncheck').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-uncheck_all').removeClass('disabledButtonsTable'); // Marcamos el check del tHead\n\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', true);\n          } //Desmarcar todos\n\n\n          if (!ctx.multiselection.selectedAll && ctx.multiselection.selectedIds.length === 0) {\n            $('#contextMenu1 li.context-menu-icon-check').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-check_all').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-uncheck').addClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-uncheck_all').addClass('disabledButtonsTable'); // Desmarcamos el check del tHead\n\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', false);\n          }\n\n          if (ctx.multiselection.selectedIds.length > 0) {\n            $('#contextMenu1 li.context-menu-icon-uncheck_all').removeClass('disabledButtonsTable');\n          }\n\n          if (ctx.multiselection.deselectedIds.length > 0) {\n            $('#contextMenu1 li.context-menu-icon-check_all').removeClass('disabledButtonsTable');\n          } //Si la pagina esta completamente seleccionada\n\n\n          if (checkPageSelectedAll(dt, true)) {\n            $('#contextMenu1 li.context-menu-icon-uncheck_all').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-uncheck').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-check').addClass('disabledButtonsTable'); // Marcamos el check del tHead\n\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', true);\n          } else {\n            $('#contextMenu1 li.context-menu-icon-check_all').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-check').removeClass('disabledButtonsTable'); // Desmarcamos el check del tHead\n\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', false);\n          } //Si la pagina esta completamente deseleccionada\n\n\n          if (checkPageSelectedAll(dt, false)) {\n            $('#contextMenu1 li.context-menu-icon-check_all').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-check').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-uncheck').addClass('disabledButtonsTable'); // Desmarcamos el check del tHead\n\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', false);\n          } else {\n            $('#contextMenu1 li.context-menu-icon-uncheck_all').removeClass('disabledButtonsTable');\n            $('#contextMenu1 li.context-menu-icon-uncheck').removeClass('disabledButtonsTable'); // Marcamos el check del tHead\n\n            $('#inputSelectTableHead' + ctx.sTableId).prop('checked', true);\n          }\n        });\n\n        if (ctx.nTable.tHead !== null) {\n          var th = $(ctx.nTable.tHead.rows[0].cells[0]);\n          th.append(input, link);\n        }\n\n        if (ctx.oInit.headerContextMenu.show) {\n          //Se mira si se quiere mostrar el menuContext\n          _createContexMenuSelect(link[0].id, ctx);\n        }\n      } //Se aseguro que no sea orderable\n\n\n      columnDefs[0].orderable = false;\n    }\n  }\n  /**\r\n   * Metodo que comprueba que todos los checks de la página están seleccionados\r\n   *\r\n   * @name checkPageSelectedAll\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {boolean} selected - Es true o false para saber cual de los 2 quieres buscar.\r\n   *\r\n   */\n\n\n  function checkPageSelectedAll(dt, selected) {\n    var count = 0;\n    $.each(dt.rows().nodes().flatten(), function (idx, value) {\n      if (selected && value.className.indexOf('selected') >= 0) {\n        count++;\n      } else if (!selected && value.className.indexOf('selected') < 0) {\n        count++;\n      }\n    });\n\n    if (dt.rows().nodes().flatten().length === count) {\n      return true;\n    }\n\n    return false;\n  }\n  /**\r\n   * Metodo que crea el contexMenu de la tabla\r\n   *\r\n   * @name createContexMenuSelect\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {string} id - Es el identificador del table.\r\n   * @param {object} ctx - table.settings.\r\n   *\r\n   */\n\n\n  function _createContexMenuSelect(id, ctx) {\n    var items = {};\n    var options = ctx.oInit;\n    var dt = new DataTable.Api(ctx);\n\n    if (options.headerContextMenu.selectAllPage) {\n      jQuery.extend(items, {\n        'selectAllPage': {\n          name: $.rup.i18nParse($.rup.i18n.base, 'rup_table.plugins.multiselection.selectAllPage'),\n          icon: 'check',\n          disabled: function disabled() {},\n          callback: function callback() {\n            selectAllPage(dt);\n          }\n        }\n      });\n    }\n\n    if (options.headerContextMenu.deselectAllPage) {\n      jQuery.extend(items, {\n        'deselectAllPage': {\n          name: $.rup.i18nParse($.rup.i18n.base, 'rup_table.plugins.multiselection.deselectAllPage'),\n          icon: 'uncheck',\n          disabled: function disabled() {},\n          callback: function callback() {\n            deselectAllPage(dt);\n          }\n        }\n      });\n    }\n\n    if (options.headerContextMenu.separator) {\n      jQuery.extend(items, {\n        'separator': ''\n      });\n    }\n\n    if (options.headerContextMenu.selectAll) {\n      jQuery.extend(items, {\n        'selectAll': {\n          name: $.rup.i18nParse($.rup.i18n.base, 'rup_table.plugins.multiselection.selectAll'),\n          icon: 'check_all',\n          disabled: function disabled() {},\n          callback: function callback() {\n            selectAll(dt);\n          }\n        }\n      });\n    }\n\n    if (options.headerContextMenu.deselectAll) {\n      $.extend(items, {\n        'deselectAll': {\n          name: $.rup.i18nParse($.rup.i18n.base, 'rup_table.plugins.multiselection.deselectAll'),\n          icon: 'uncheck_all',\n          disabled: function disabled() {},\n          callback: function callback() {\n            deselectAll(dt);\n          }\n        }\n      });\n    }\n\n    dt.on('init.dt', function () {\n      $('#' + id).rup_contextMenu({\n        selector: '#' + id,\n        trigger: 'left',\n        items: items,\n        position: function position(contextMenu) {\n          contextMenu.$menu.css({\n            top: this.parent().offset().top + this.parent().height(),\n            left: this.parent().parent().offset().left\n          });\n        }\n      });\n    });\n  }\n  /**\r\n   * Metodo que selecciona todos los elementos de una misma página.\r\n   *\r\n   * @name selectAllPage\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Datatable.\r\n   *\r\n   */\n\n\n  function selectAllPage(dt) {\n    var ctx = dt.settings()[0];\n    ctx.multiselection.accion = 'checkAll';\n    dt.rows().multiSelect();\n    $('#contextMenu1 li.context-menu-icon-check').addClass('disabledButtonsTable'); // Marcamos el check del tHead\n\n    $('#inputSelectTableHead' + ctx.sTableId).prop('checked', true); //FeedBack\n\n    var countPage = dt.page() + 1;\n    var selectMsg = jQuery.rup.i18nTemplate(jQuery.rup.i18n.base, 'rup_table.selectMsg', '<span class=\"font-weight-bold\">' + dt.rows()[0].length + '</span>', '<span class=\"font-weight-bold\">' + countPage + '</span>');\n    var countRegister = ctx.json.recordsTotal - ctx.multiselection.selectedIds.length;\n    var selectRestMsg = jQuery.rup.i18nTemplate(jQuery.rup.i18n.base, 'rup_table.selectRestMsg', countRegister);\n    var remainingSelectButton = '<button id=\\'rup_table_' + dt.context[0].sTableId + '_selectAll\\' class=\\'btn-material btn-material-secondary-low-emphasis\\'><span>' + selectRestMsg + '</span></button>';\n\n    if (countRegister > 0 && !ctx.multiselection.selectedAll || ctx.multiselection.selectedAll && ctx.multiselection.deselectedIds.length > 0) {\n      ctx.oInit.feedback.$feedbackContainer.rup_feedback('set', selectMsg + remainingSelectButton, 'alert');\n      ctx.oInit.feedback.type = 'fijo';\n      $('#' + ctx.sTableId).triggerHandler('tableMultiSelectFeedbackSelectAll', ctx);\n    }\n\n    $('#' + $(remainingSelectButton)[0].id).on('click', function () {\n      selectAll(dt);\n    }); //Se deja marcado el primero de la pagina.\n\n    ctx.multiselection.lastSelectedId = dt.data()[0].id;\n    DataTable.Api().rupTable.selectPencil(ctx, 0);\n  }\n  /**\r\n   * Metodo que deselecciona todos los elementos de una misma página.\r\n   *\r\n   * @name deselectAllPage\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Datatable.\r\n   *\r\n   */\n\n\n  function deselectAllPage(dt) {\n    var ctx = dt.settings()[0];\n    ctx.multiselection.accion = 'uncheck';\n    dt.rows().deselect();\n    $('#contextMenu1 li.context-menu-icon-uncheck').addClass('disabledButtonsTable'); // Desmarcamos el check del tHead\n\n    $('#inputSelectTableHead' + ctx.sTableId).prop('checked', false); //FeedBack\n\n    var countPage = dt.page() + 1;\n    var deselectMsg = jQuery.rup.i18nTemplate(jQuery.rup.i18n.base, 'rup_table.deselectMsg', '<span class=\"font-weight-bold\">' + dt.rows()[0].length + '</span>', '<span class=\"font-weight-bold\">' + countPage + '</span>');\n    var selectRestMsg = jQuery.rup.i18nTemplate(jQuery.rup.i18n.base, 'rup_table.deselectRestMsg', ctx.multiselection.numSelected);\n    var remainingDeselectButton = '<button id=\\'rup_table_' + dt.context[0].sTableId + '_deselectAll\\' class=\\'btn-material btn-material-secondary-low-emphasis\\'><span>' + selectRestMsg + '</span></button>';\n\n    if (ctx.multiselection.numSelected > 0) {\n      ctx.oInit.feedback.$feedbackContainer.rup_feedback('set', deselectMsg + remainingDeselectButton, 'alert');\n      ctx.oInit.feedback.$feedbackContainer.rup_feedback('show');\n      ctx.oInit.feedback.$feedbackContainer.type = 'fijo';\n      $('#' + ctx.sTableId).triggerHandler('tableMultiSelectFeedbackDeselectAll', ctx);\n    }\n\n    $('#' + $(remainingDeselectButton)[0].id).on('click', function () {\n      deselectAll(dt);\n    });\n    $('#' + ctx.sTableId + ' tbody tr td.select-checkbox i.selected-pencil').remove();\n    ctx.multiselection.lastSelectedIsRange = false;\n  }\n  /**\r\n   * Metodo que selecciona todos los elementos.\r\n   *\r\n   * @name selectAll\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Datatable.\r\n   *\r\n   */\n\n\n  function selectAll(dt) {\n    var ctx = dt.settings()[0];\n    ctx.multiselection.selectedAll = true;\n    ctx.multiselection.deselectedIds = [];\n    ctx.multiselection.deselectedRowsPerPage = [];\n    ctx.multiselection.numSelected = ctx.json.recordsTotal;\n    ctx.multiselection.accion = 'checkAll';\n    $('#contextMenu1 li.context-menu-icon-check_all').addClass('disabledButtonsTable');\n    $('#contextMenu1 li.context-menu-icon-check').addClass('disabledButtonsTable'); // Marcamos el check del tHead\n\n    $('#inputSelectTableHead' + ctx.sTableId).prop('checked', true);\n    dt.rows().multiSelect();\n\n    if (dt.page() === 0) {\n      DataTable.Api().rupTable.selectPencil(ctx, 0);\n      ctx.multiselection.lastSelectedId = DataTable.Api().rupTable.getIdPk(dt.data()[0], ctx.oInit);\n    } else {\n      DataTable.Api().rupTable.selectPencil(ctx, -1);\n      ctx.multiselection.lastSelectedId = '';\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableMultiSelectSelectAll', ctx);\n  }\n  /**\r\n   * Metodo que deselecciona todos los elementos.\r\n   *\r\n   * @name deselectAll\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * @param {object} dt - Datatable.\r\n   *\r\n   */\n\n\n  function deselectAll(dt) {\n    var ctx = dt.settings()[0];\n    ctx.multiselection = _initializeMultiselectionProps(ctx);\n    ctx.multiselection.accion = 'uncheckAll';\n    $('#' + ctx.sTableId + ' tbody tr td.select-checkbox i.selected-pencil').remove();\n    dt.rows().deselect();\n    $('#' + ctx.sTableId).trigger('rupTable_deselectAll', ctx);\n  }\n  /**\r\n   * Add one or more items (rows or columns) to the selection when shift clicking\r\n   * in OS selection style\r\n   *\r\n   * @name rowColumnRange\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param  {DataTable.Api} dt   DataTable\r\n   * @param  {string}        type Row or column range selector\r\n   * @param  {object}        idx  Item index to select to\r\n   * @param  {object}        last Item index to select from\r\n   * \r\n   */\n\n\n  function rowColumnRange(dt, type, idx, last) {\n    // Add a range of rows from the last selected row to this one\n    var indexes = dt[type + 's']({\n      search: 'applied'\n    }).indexes();\n    var idx1 = $.inArray(last, indexes);\n    var idx2 = $.inArray(idx, indexes);\n\n    if (!dt[type + 's']({\n      selected: true\n    }).any() && idx1 === -1) {\n      // select from top to here - slightly odd, but both Windows and Mac OS\n      // do this\n      indexes.splice($.inArray(idx, indexes) + 1, indexes.length);\n    } else {\n      // reverse so we can shift click 'up' as well as down\n      if (idx1 > idx2) {\n        var tmp = idx2;\n        idx2 = idx1;\n        idx1 = tmp;\n      }\n\n      indexes.splice(idx2 + 1, indexes.length);\n      indexes.splice(0, idx1);\n    }\n\n    if (!dt[type](idx, {\n      selected: true\n    }).any()) {\n      // Select range\n      dt[type + 's'](indexes).select();\n    } else {\n      // Deselect range - need to keep the clicked on row selected\n      indexes.splice($.inArray(idx, indexes), 1);\n      dt[type + 's'](indexes).deselect();\n    }\n  }\n  /**\r\n   * Clear all selected items\r\n   *\r\n   * @name clear\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param  {DataTable.settings} ctx Settings object of the host DataTable\r\n   * @param  {boolean} [force=false] Force the de-selection to happen, regardless\r\n   *     of selection style\r\n   * \r\n   */\n\n\n  function clear(ctx, force) {\n    if (force || ctx._multiSelect.style === 'single') {\n      var api = new DataTable.Api(ctx);\n      api.rows({\n        selected: true\n      }).deselect();\n      api.columns({\n        selected: true\n      }).deselect();\n      api.cells({\n        selected: true\n      }).deselect();\n    }\n  }\n  /**\r\n   * Metodo que inicializa las propiedades para el multiselect.\r\n   *\r\n   * @name initializeMultiselectionProps\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   *\r\n   */\n\n\n  function _initializeMultiselectionProps(ctx) {\n    var $self = {}; // Se almacenan en los settings internos las estructuras de control de los registros seleccionados\n\n    if ($self.multiselection === undefined) {\n      $self.multiselection = {};\n    } // Flag indicador de selección de todos los registros\n\n\n    $self.multiselection.selectedAll = false; // Numero de registros seleccionados\n\n    $self.multiselection.numSelected = 0; // Propiedades de selección de registros\n\n    $self.multiselection.selectedRowsPerPage = [];\n    $self.multiselection.selectedIds = [];\n    $self.multiselection.lastSelectedId = '';\n    $self.multiselection.deselectedRowsPerPage = [];\n    $self.multiselection.deselectedIds = [];\n    $self.multiselection.accion = ''; //uncheckAll,uncheck\n\n    $('#contextMenu1 li.context-menu-icon-uncheck').addClass('disabledButtonsTable');\n    $('#contextMenu1 li.context-menu-icon-uncheck_all').addClass('disabledButtonsTable'); // Desmarcamos el check del tHead\n\n    $('#inputSelectTableHead' + ctx.sTableId).prop('checked', false);\n    DataTable.Api().rupTable.selectPencil(ctx, -1);\n    return $self.multiselection;\n  }\n  /**\r\n   * Metodo que añade y quita los seleccionados.\r\n   *\r\n   * @name maintIdsRows\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param  {DataTables.Api}     DataTable   DataTable\r\n   * @param  {string}     id   - id seleccionado\r\n   * @param  {boolean}    select   si es seleccionado o no\r\n   * @param  {integer}    pagina   página en la que se encuentra el seleccionado\r\n   * @param  {integer}    line   linea en la que se encuentra el seleccionado\r\n   *\r\n   */\n  //1 select, 0 deselect\n\n\n  function maintIdsRows(DataTable, id, select, pagina, line, ctx) {\n    var indexInArray = -1;\n\n    if (select) {\n      // se elimina de los deselecionados\n      indexInArray = jQuery.inArray(id, ctx.multiselection.deselectedIds);\n\n      if (indexInArray > -1 && !pagina) {\n        //Si se encuentra y además no se está paginando.\n        ctx.multiselection.deselectedIds.splice(indexInArray, 1);\n        ctx.multiselection.deselectedRowsPerPage.splice(indexInArray, 1);\n\n        if (ctx.multiselection.numSelected === ctx.json.recordsTotal) {\n          ctx.multiselection.selectedAll = true;\n        }\n      }\n\n      if (id !== undefined && ctx.multiselection.selectedIds.indexOf(id) < 0) {\n        var pos = 0;\n        var arra = {\n          id: id,\n          page: Number(ctx.json.page),\n          line: line\n        }; //Inicio de ordenacion, Se ordena los selected ids.\n\n        $.each(ctx.multiselection.selectedRowsPerPage, function (index, p) {\n          if (arra.page < p.page) {\n            pos = index;\n            return false;\n          } else if (arra.page === p.page) {\n            // mirar linea\n            if (arra.line < p.line) {\n              pos = index;\n              return false;\n            } else {\n              pos = index + 1; //Posible\n            }\n          } else if (arra.page > p.page) {\n            pos = index + 1; //Posible\n          }\n        });\n        ctx.multiselection.selectedIds.splice(pos, 0, id);\n        ctx.multiselection.selectedRowsPerPage.splice(pos, 0, arra); //Fin ordenacion\n      }\n    } else {\n      //Deselect\n      indexInArray = jQuery.inArray(id, ctx.multiselection.selectedIds); //Se elimina el ids\n\n      if (indexInArray > -1) {\n        //se borra\n        ctx.multiselection.selectedIds.splice(indexInArray, 1);\n        ctx.multiselection.selectedRowsPerPage.splice(indexInArray, 1);\n\n        if (ctx.multiselection.lastSelectedId === id) {\n          ctx.multiselection.lastSelectedId = getLastSelectedId(ctx.multiselection.selectedRowsPerPage);\n        }\n\n        DataTable.Api().rupTable.selectPencil(ctx, -1);\n\n        if (ctx.multiselection.numSelected === 0) {\n          ctx.multiselection.selectedAll = false;\n        }\n      } //Se mete el id para mantener el selectAll o no.\n\n\n      if (id !== undefined && ctx.multiselection.deselectedIds.indexOf(id) < 0) {\n        if (line === undefined) {\n          $.each(ctx.json.rows, function (index, value) {\n            if (DataTable.Api().rupTable.getIdPk(value, ctx.oInit) === id) {\n              line = index;\n              return false;\n            }\n          });\n        }\n\n        var posDeselect = 0;\n        var arraDeselect = {\n          id: id,\n          page: Number(ctx.json.page),\n          line: line\n        }; //Inicio de ordenacion, Se ordena los selected ids.\n\n        $.each(ctx.multiselection.deselectedRowsPerPage, function (index, p) {\n          if (arraDeselect.page < p.page) {\n            posDeselect = index;\n            return false;\n          } else if (arraDeselect.page === p.page) {\n            // mirar linea\n            if (arraDeselect.line < p.line) {\n              posDeselect = index;\n              return false;\n            } else {\n              posDeselect = index + 1; //Posible\n            }\n          } else if (arraDeselect.page > p.page) {\n            posDeselect = index + 1; //Posible\n          }\n        });\n        ctx.multiselection.deselectedIds.splice(posDeselect, 0, id);\n        ctx.multiselection.deselectedRowsPerPage.splice(posDeselect, 0, arraDeselect);\n\n        if (ctx.multiselection.lastSelectedId === id) {\n          ctx.multiselection.lastSelectedId = '';\n        }\n\n        DataTable.Api().rupTable.selectPencil(ctx, -1);\n      }\n    }\n  }\n  /**\r\n   * Devuelve el identificador de la última fila seleccionada.\r\n   *\r\n   * @function getLastSelectedId\r\n   * @since UDA 5.0.4\r\n   * @param {Object[]} selectedRowsPerPage - Array de las filas seleccionadas.\r\n   * @return {string} Identificador del último registro seleccionado.\r\n   */\n\n\n  function getLastSelectedId(selectedRowsPerPage) {\n    var _selectedRowsPerPage$;\n\n    var lastElementId = (_selectedRowsPerPage$ = selectedRowsPerPage[0]) === null || _selectedRowsPerPage$ === void 0 ? void 0 : _selectedRowsPerPage$.id;\n    return lastElementId ? lastElementId : '';\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables selectors\r\n   */\n  // row and column are basically identical just assigned to different properties\n  // and checking a different array, so we can dynamically create the functions to\n  // reduce the code size\n\n\n  $.each([{\n    type: 'row',\n    prop: 'aoData'\n  }, {\n    type: 'column',\n    prop: 'aoColumns'\n  }], function (i, o) {\n    DataTable.ext.selector[o.type].push(function (settings, opts, indexes) {\n      var selected = opts.selected;\n      var data;\n      var out = [];\n\n      if (selected === undefined) {\n        return indexes;\n      }\n\n      for (var i = 0, ien = indexes.length; i < ien; i++) {\n        data = settings[o.prop][indexes[i]];\n\n        if (selected === true && data._multiSelect_selected === true || selected === false && !data._multiSelect_selected) {\n          out.push(indexes[i]);\n        }\n      }\n\n      return out;\n    });\n  });\n  DataTable.ext.selector.cell.push(function (settings, opts, cells) {\n    var selected = opts.selected;\n    var rowData;\n    var out = [];\n\n    if (selected === undefined) {\n      return cells;\n    }\n\n    for (var i = 0, ien = cells.length; i < ien; i++) {\n      rowData = settings.aoData[cells[i].row];\n\n      if (selected === true && rowData._selected_cells && rowData._selected_cells[cells[i].column] === true || selected === false && (!rowData._selected_cells || !rowData._selected_cells[cells[i].column])) {\n        out.push(cells[i]);\n      }\n    }\n\n    return out;\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables API\r\n   *\r\n   * For complete documentation, please refer to the docs/api directory or the\r\n   * DataTables site\r\n   */\n  // Local variables to improve compression\n\n  var apiRegister = DataTable.Api.register;\n  var apiRegisterPlural = DataTable.Api.registerPlural;\n  apiRegister('multiSelect()', function () {\n    return this.iterator('table', function (ctx) {\n      DataTable.multiSelect.init(new DataTable.Api(ctx));\n    });\n  });\n  apiRegister('multiSelect.info()', function (flag) {\n    if (info === undefined) {\n      return this.context[0]._multiSelect.info;\n    }\n\n    return this.iterator('table', function (ctx) {\n      ctx._multiSelect.info = flag;\n    });\n  });\n  apiRegister('multiSelect.items()', function (items) {\n    if (items === undefined) {\n      return this.context[0]._multiSelect.items;\n    }\n\n    return this.iterator('table', function (ctx) {\n      ctx._multiSelect.items = items;\n      eventTrigger(new DataTable.Api(ctx), 'selectItems', [items]);\n    });\n  }); // Takes effect from the _next_ selection. None disables future selection, but\n  // does not clear the current selection. Use the `deselect` methods for that\n\n  apiRegister('multiSelect.style()', function (style) {\n    if (style === undefined) {\n      return this.context[0]._multiSelect.style;\n    }\n\n    return this.iterator('table', function (ctx) {\n      ctx._multiSelect.style = style;\n\n      if (!ctx._multiSelect_init) {\n        init(ctx);\n      } // Add mouse event handlers. They aren't required when only\n      // API selection is available\n\n\n      var dt = new DataTable.Api(ctx);\n\n      if (style !== 'api') {\n        if (ctx.oInit.multiSelect.enableMouseSelection) {\n          enableMouseSelection(dt, ctx);\n        }\n\n        if (ctx.oInit.multiSelect.enableKeyboardSelection) {\n          enableKeyboardSelection(dt);\n        }\n      }\n\n      $('#' + ctx.sTableId).trigger('selectStyle', [style, ctx]);\n    });\n  });\n  apiRegister('multiSelect.selector()', function (selector) {\n    if (selector === undefined) {\n      return this.context[0]._multiSelect.selector;\n    }\n\n    return this.iterator('table', function (ctx) {\n      ctx._multiSelect.selector = selector;\n    });\n  });\n  apiRegister('multiSelect.deselectAll()', function (dt) {\n    deselectAll(dt);\n  });\n  apiRegister('multiSelect.defaultsIds()', function (ctx) {\n    var defaultsIds = ctx.oInit.multiSelect.defaultsIds; //defaultsIds[0] Lista de IDS\n    //defaultsIds[1] Lista si se filtra siempre o solo la primera vez(true/false)\n\n    if (defaultsIds !== undefined) {\n      if (defaultsIds[0] !== undefined) {\n        var listIds = defaultsIds[0];\n        var always = defaultsIds[1];\n\n        if (always === true) {\n          $.each(listIds, function () {\n            var id = this;\n            var indexInArray = jQuery.inArray(id, ctx.multiselection.selectedIds);\n\n            if (indexInArray < 0) {\n              //no esta ya seleccioando\n              ctx.multiselection.selectedIds.push(id);\n            }\n          });\n        }\n\n        if (always === false || always === undefined) {\n          $.each(listIds, function () {\n            var id = this;\n            var indexInArray = jQuery.inArray(id, ctx.multiselection.selectedIds);\n\n            if (indexInArray < 0) {\n              //no esta ya seleccioando\n              ctx.multiselection.selectedIds.push(id);\n            }\n          });\n          ctx.oInit.multiSelect.defaultsIds[1] = null;\n        }\n      }\n    }\n  });\n  apiRegisterPlural('rows().multiSelect()', 'row().multiSelect()', function (multiSelect) {\n    var api = this;\n    var DataTable = $.fn.dataTable;\n    var pagina = true;\n    var ctx = api.context[0];\n\n    if (ctx.multiselection === undefined) {\n      return false;\n    } //Al pagina comprobar el checkGeneral.\n    //Se mira si hay feedback y en ese caso se elimina.\n\n\n    var feedBack = ctx.oInit.feedback;\n\n    if (feedBack.$feedbackContainer.children().length > 1 && feedBack.type && feedBack.type === 'fijo') {\n      feedBack.$feedbackContainer.rup_feedback('hide');\n    }\n\n    if (multiSelect === false) {\n      maintIdsRows(DataTable, DataTable.Api().rupTable.getIdPk(api.data(), ctx.oInit), 0, pagina, 0, ctx); //Cuando se resta de 1 en 1 la accion es empty\n\n      ctx.multiselection.accion = '';\n      var deselectes = this.deselect();\n      return deselectes;\n    }\n\n    this.iterator('row', function (ctx, idx) {\n      // si es en edicion en linea,\n      if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined && ctx.inlineEdit.lastRow !== undefined && ctx.inlineEdit.lastRow.idx !== idx) {\n        DataTable.Api().inlineEdit.restaurarFila(ctx, true);\n      }\n\n      $(ctx.aoData[idx].nTr).triggerHandler('tableMultiSelectBeforeSelectRow', ctx);\n      clear(ctx);\n      pagina = false;\n      ctx.aoData[idx]._multiSelect_selected = true; // Añadimos el fondo amarillo\n\n      $(ctx.aoData[idx].nTr).addClass(ctx._multiSelect.className);\n\n      if (api.row(idx).child() !== undefined) {\n        api.row(idx).child().addClass(ctx._multiSelect.className);\n      } // Marcamos el checkbox\n\n\n      $($(ctx.aoData[idx].anCells).filter('.select-checkbox')).find(':input').prop('checked', true);\n      var id = DataTable.Api().rupTable.getIdPk(ctx.aoData[idx]._aData, ctx.oInit); //Se mira el contador para sumar seleccionados\n\n      if (ctx.multiselection !== undefined && ctx.json !== undefined) {\n        if (ctx.multiselection.numSelected < ctx.json.recordsTotal && id !== undefined && ctx.multiselection.selectedIds.indexOf(id) < 0) {\n          ctx.multiselection.numSelected++;\n        }\n      } //para seleccionar todos los de la pagina actual.\n\n\n      maintIdsRows(DataTable, id, 1, pagina, idx, ctx); //Se marca el ultimo.\n\n      ctx.multiselection.lastSelectedId = id;\n      $(ctx.aoData[idx].nTr).triggerHandler('tableMultiSelectAfterSelectRow', ctx);\n    });\n\n    if (pagina) {\n      //Cuando se pagina, se filtra, o se reordena.\n      if (ctx.multiselection.selectedAll) {\n        //Si pagina y están todos sleccionados se pintan.\n        var _ctx = api.settings()[0];\n        $.each(api.context[0].aoData, function (idx) {\n          var id = DataTable.Api().rupTable.getIdPk(_ctx.aoData[idx]._aData, _ctx.oInit); //Si esta en la lista de deselecionados, significa que no debería marcarse.\n\n          if (jQuery.inArray(id, _ctx.multiselection.deselectedIds) === -1) {\n            _ctx.aoData[idx]._multiSelect_selected = true; // Añadimos el fondo amarillo\n\n            $(_ctx.aoData[idx].nTr).addClass(_ctx._multiSelect.className);\n\n            if (api.row(idx).child() !== undefined) {\n              api.row(idx).child().addClass(_ctx._multiSelect.className);\n            } // Marcamos el checkbox\n\n\n            $($(_ctx.aoData[idx].anCells).filter('.select-checkbox')).find(':input').prop('checked', true); //para seleccionar todos los de la pagina actual.\n\n            maintIdsRows(DataTable, id, 1, pagina, 0, _ctx);\n          }\n        });\n      }\n\n      if (ctx.oInit.buttons !== undefined) {\n        //Mirar la propiedad para el contextMenu y dejar la clase marcada.\n        $('#' + ctx.sTableId + ' > tbody > tr').addClass('context-menu-cursor');\n      }\n    }\n\n    this.iterator('table', function (ctx, i) {\n      eventTrigger(api, 'select', ['row', api[i]], true);\n    }); //al paginar\n\n    var input = $(ctx.nTable.tHead.rows[0].cells[0]).find(':input');\n\n    if (checkPageSelectedAll(api, true)) {\n      input.prop('checked', true);\n    } else {\n      input.prop('checked', false);\n    }\n\n    return this;\n  });\n  apiRegisterPlural('columns().multiSelect()', 'column().multiSelect()', function (multiSelect) {\n    var api = this;\n\n    if (multiSelect === false) {\n      return this.deselect();\n    }\n\n    this.iterator('column', function (ctx, idx) {\n      clear(ctx);\n      ctx.aoColumns[idx]._multiSelect_selected = true;\n      var column = new DataTable.Api(ctx).column(idx);\n      $(column.header()).addClass(ctx._multiSelect.className);\n      $(column.footer()).addClass(ctx._multiSelect.className);\n      column.nodes().to$().addClass(ctx._multiSelect.className);\n    });\n    this.iterator('table', function (ctx, i) {\n      eventTrigger(api, 'multiSelect', ['column', api[i]], true);\n    });\n    return this;\n  });\n  apiRegisterPlural('cells().multiSelect()', 'cell().multiSelect()', function (multiSelect) {\n    var api = this;\n\n    if (multiSelect === false) {\n      return this.deselect();\n    }\n\n    this.iterator('cell', function (ctx, rowIdx, colIdx) {\n      clear(ctx);\n      var data = ctx.aoData[rowIdx];\n\n      if (data._selected_cells === undefined) {\n        data._selected_cells = [];\n      }\n\n      data._selected_cells[colIdx] = true;\n\n      if (data.anCells) {\n        $(data.anCells[colIdx]).addClass(ctx._multiSelect.className);\n      }\n    });\n    this.iterator('table', function (ctx, i) {\n      eventTrigger(api, 'multiSelect', ['cell', api[i]], true);\n    });\n    return this;\n  });\n  apiRegisterPlural('rows().deselect()', 'row().deselect()', function () {\n    var api = this;\n    var DataTable = $.fn.dataTable;\n    var ctx = api.context[0]; //Se mira si hay feedback y en ese caso se elimina.\n\n    var feedback = ctx.oInit.feedback;\n\n    if (feedback.$feedbackContainer.children().length > 1 && feedback.type && feedback.type === 'fijo') {\n      feedback.$feedbackContainer.rup_feedback('hide');\n    }\n\n    this.iterator('row', function (ctx, idx) {\n      ctx.aoData[idx]._multiSelect_selected = false; // Quitamos el fondo amarillo\n\n      $(ctx.aoData[idx].nTr).removeClass(ctx._multiSelect.className);\n\n      if (api.row(idx).child() !== undefined) {\n        api.row(idx).child().removeClass(ctx._multiSelect.className);\n      } // Desmarcamos el checkbox (salvo cuando ha sido definido que esten ocultos)\n\n\n      if (!ctx.oInit.multiSelect.hideMultiselect) {\n        $($(ctx.aoData[idx].anCells).filter('.select-checkbox')).find(':input').prop('checked', false);\n      }\n\n      var id = DataTable.Api().rupTable.getIdPk(ctx.aoData[idx]._aData, ctx.oInit); //Se mira el contador para restar deselecionados.\n\n      if (ctx.multiselection.numSelected > 0 && id !== undefined && ctx.multiselection.deselectedIds.indexOf(id) < 0) {\n        ctx.multiselection.numSelected--;\n      } //para deseleccionar todos los de la pagina actual.\n\n\n      if (ctx.multiselection.numSelected > 0 && ctx.multiselection.accion === 'uncheckAll' || ctx.multiselection.numSelected >= 0 && ctx.multiselection.accion === 'uncheck') {\n        maintIdsRows(DataTable, id, 0, false, 0, ctx);\n      } else if (ctx.multiselection.accion === '') {\n        //es que se resta uno solo.\n        ctx.multiselection.numSelected--;\n      } //Si es en edicion en linea, no hacer nada\n\n\n      if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined && DataTable.Api().inlineEdit.editSameLine(ctx, idx)) {\n        //Seleccionar la fila otra vez.\n        api.rows(idx).multiSelect();\n      }\n    });\n    this.iterator('table', function (ctx, i) {\n      eventTrigger(api, 'deselect', ['row', api[i]], true);\n    }); //al paginar\n\n    var input = $(ctx.nTable.tHead.rows[0].cells[0]).find(':input');\n\n    if (checkPageSelectedAll(api, true)) {\n      input.prop('checked', true);\n    } else {\n      input.prop('checked', false);\n    }\n\n    return this;\n  });\n  apiRegisterPlural('columns().deselect()', 'column().deselect()', function () {\n    var api = this;\n    this.iterator('column', function (ctx, idx) {\n      ctx.aoColumns[idx]._multiSelect_selected = false;\n      var api = new DataTable.Api(ctx);\n      var column = api.column(idx);\n      $(column.header()).removeClass(ctx._multiSelect.className);\n      $(column.footer()).removeClass(ctx._multiSelect.className); // Need to loop over each cell, rather than just using\n      // `column().nodes()` as cells which are individually selected should\n      // not have the `selected` class removed from them\n\n      api.cells(null, idx).indexes().each(function (cellIdx) {\n        var data = ctx.aoData[cellIdx.row];\n        var cellSelected = data._selected_cells;\n\n        if (data.anCells && (!cellSelected || !cellSelected[cellIdx.column])) {\n          $(data.anCells[cellIdx.column]).removeClass(ctx._multiSelect.className);\n        }\n      });\n    });\n    this.iterator('table', function (ctx, i) {\n      eventTrigger(api, 'deselect', ['column', api[i]], true);\n    });\n    return this;\n  });\n  apiRegisterPlural('cells().deselect()', 'cell().deselect()', function () {\n    var api = this;\n    this.iterator('cell', function (ctx, rowIdx, colIdx) {\n      var data = ctx.aoData[rowIdx];\n      data._selected_cells[colIdx] = false; // Remove class only if the cells exist, and the cell is not column\n      // selected, in which case the class should remain (since it is selected\n      // in the column)\n\n      if (data.anCells && !ctx.aoColumns[colIdx]._multiSelect_selected) {\n        $(data.anCells[colIdx]).removeClass(ctx._multiSelect.className);\n      }\n    });\n    this.iterator('table', function (ctx, i) {\n      eventTrigger(api, 'deselect', ['cell', api[i]], true);\n    });\n    return this;\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Buttons\r\n   */\n\n  function i18n(label, def) {\n    return function (dt) {\n      return dt.i18n('buttons.' + label, def);\n    };\n  } // Common events with suitable namespaces\n\n\n  function namespacedEvents(config) {\n    var unique = config._eventNamespace;\n    return 'draw.dt.DT' + unique + ' multiSelect.dt.DT' + unique + ' deselect.dt.DT' + unique;\n  }\n\n  var _buttonNamespace = 0;\n  $.extend(DataTable.ext.buttons, {\n    selected: {\n      text: i18n('selected', 'Selected'),\n      className: 'buttons-selected',\n      init: function init(dt, node, config) {\n        var that = this;\n        config._eventNamespace = '.multiSelect' + _buttonNamespace++; // .DT namespace listeners are removed by DataTables automatically\n        // on table destroy\n\n        dt.on(namespacedEvents(config), function () {\n          var enable = that.rows({\n            selected: true\n          }).any() || that.columns({\n            selected: true\n          }).any() || that.cells({\n            selected: true\n          }).any();\n          that.enable(enable);\n        });\n        this.disable();\n      },\n      destroy: function destroy(dt, node, config) {\n        dt.off(config._eventNamespace);\n      }\n    },\n    selectedSingle: {\n      text: i18n('selectedSingle', 'Selected single'),\n      className: 'buttons-selected-single',\n      init: function init(dt, node, config) {\n        var that = this;\n        config._eventNamespace = '.multiSelect' + _buttonNamespace++;\n        dt.on(namespacedEvents(config), function () {\n          var count = dt.rows({\n            selected: true\n          }).flatten().length + dt.columns({\n            selected: true\n          }).flatten().length + dt.cells({\n            selected: true\n          }).flatten().length;\n          that.enable(count === 1);\n        });\n        this.disable();\n      },\n      destroy: function destroy(dt, node, config) {\n        dt.off(config._eventNamespace);\n      }\n    },\n    selectAll: {\n      text: i18n('selectAll', 'Select all'),\n      className: 'buttons-select-all',\n      action: function action() {\n        var items = this.multiSelect.items();\n        this[items + 's']().select();\n      }\n    },\n    selectNone: {\n      text: i18n('selectNone', 'Deselect all'),\n      className: 'buttons-select-none',\n      action: function action() {\n        clear(this.settings()[0], true);\n      },\n      init: function init(dt, node, config) {\n        var that = this;\n        config._eventNamespace = '.multiSelect' + _buttonNamespace++;\n        dt.on(namespacedEvents(config), function () {\n          var count = dt.rows({\n            selected: true\n          }).flatten().length + dt.columns({\n            selected: true\n          }).flatten().length + dt.cells({\n            selected: true\n          }).flatten().length;\n          that.enable(count > 0);\n        });\n        this.disable();\n      },\n      destroy: function destroy(dt, node, config) {\n        dt.off(config._eventNamespace);\n      }\n    }\n  });\n  $.each(['Row', 'Column', 'Cell'], function (i, item) {\n    var lc = item.toLowerCase();\n    DataTable.ext.buttons['multiSelect' + item + 's'] = {\n      text: i18n('multiSelect' + item + 's', 'multiSelect ' + lc + 's'),\n      className: 'buttons-select-' + lc + 's',\n      action: function action() {\n        this.select.items(lc);\n      },\n      init: function init(dt) {\n        var that = this;\n        dt.on('selectItems.dt.DT', function (e, ctx, items) {\n          that.active(items === lc);\n        });\n      }\n    };\n  });\n  /* * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Initialisation\r\n   */\n  // DataTables creation - check if select has been defined in the options. Note\n  // this required that the table be in the document! If it isn't then something\n  // needs to trigger this method unfortunately. The next major release of\n  // DataTables will rework the events and address this.\n\n  $(document).on('preInit.dt.dtSelect', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (ctx.oInit.multiSelect !== undefined && ctx.oInit.multiSelect.activate !== false) {\n      DataTable.multiSelect.init(new DataTable.Api(ctx));\n    }\n  });\n  return DataTable.multiSelect;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.multiSelect.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.request.js":
/*!********************************************!*\
  !*** ./src/rup_table/rup.table.request.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n  * Encargado de mapear el objeto de base de datos al multiSelect\r\n  *\r\n  * @summary \t\tExtensión del componente RUP Datatable\r\n  * @module\t\t\t\"rup.table.request\"\r\n  * @version     1.0.0\r\n  * @license\r\n  * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n  * Solo podrá usarse esta obra si se respeta la Licencia.\r\n  * Puede obtenerse una copia de la Licencia en\r\n  *\r\n  *      http://ec.europa.eu/idabc/eupl.html\r\n  *\r\n  * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n  * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n  * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n  * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n  * que establece la Licencia.\r\n  * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n  *\r\n  */\n\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(typeof self !== 'undefined' ? self : this, function () {\n  var TableRequest = function TableRequest(data) {\n    var start = data.start,\n        length = data.length,\n        page = start / length + 1,\n        sidx = '',\n        sord = '';\n\n    if (data.order.length == 1) {\n      sidx = data.columns[data.order[0].column].colSidx || data.columns[data.order[0].column].data;\n      sord = data.order[0].dir;\n      delete data.columns[data.order[0].column].colSidx;\n    } else if (data.order.length > 1) {\n      for (var i = 0; i < data.order.length; i++) {\n        sidx += data.columns[data.order[i].column].colSidx || data.columns[data.order[i].column].data;\n        sord += data.order[i].dir;\n\n        if (i < data.order.length - 1) {\n          sidx += ' ,';\n          sord += ' ,';\n        }\n\n        delete data.columns[data.order[i].column].colSidx;\n      }\n    } // super(length, (start / length) + 1, 'id', 'asc');\n\n\n    this._data = data;\n    this._start = start;\n    this._length = length;\n    this._filter = data.filter;\n    this._rows = length;\n    this._page = page;\n    this._sidx = sidx;\n    this._sord = sord;\n    this._filter = data.filter;\n  };\n\n  TableRequest.prototype = {\n    set rows(rows) {\n      this._rows = rows;\n    },\n\n    get rows() {\n      return this._rows;\n    },\n\n    set page(page) {\n      this._page = page;\n    },\n\n    get page() {\n      return this._page;\n    },\n\n    set sidx(sidx) {\n      this._sidx = sidx;\n    },\n\n    get sidx() {\n      return this._sidx;\n    },\n\n    set sord(sord) {\n      this._sord = sord;\n    },\n\n    get sord() {\n      return this._sord;\n    },\n\n    set filter(filter) {\n      this._filter = filter;\n    },\n\n    get filter() {\n      return this._filter;\n    }\n\n  };\n  /**\r\n      * Obtiene el objeto a mapear en el multiselect.\r\n      *\r\n      * @name getData\r\n      * @function\r\n      * @since UDA 3.4.0 // Table 1.0.0\r\n      *\r\n      * @return {TableRequest}\r\n      *\r\n    */\n\n  TableRequest.prototype.getData = function () {\n    return {\n      rows: this._rows,\n      page: this._page,\n      sidx: this._sidx,\n      sord: this._sord,\n      filter: this._filter,\n      nd: Date.now(),\n      core: {\n        pkToken: '~',\n        pkNames: ['id']\n      }\n    };\n  };\n\n  return TableRequest;\n});\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.request.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.responsive.js":
/*!***********************************************!*\
  !*** ./src/rup_table/rup.table.responsive.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Módulo que permite a la tabla adaptarse dinámicamente al ancho disponible.\r\n * \r\n * @summary     Extensión del componente Responsive\r\n * @version     1.0.0\r\n * @file        rup.table.responsive.js\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2019 E.J.I.E., S.A.\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\"), __webpack_require__(/*! datatables.net-bs4 */ \"./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs\"), __webpack_require__(/*! datatables.net-responsive */ \"./node_modules/datatables.net-responsive/js/dataTables.responsive.js\"), __webpack_require__(/*! datatables.net-responsive-bs4 */ \"./node_modules/datatables.net-responsive-bs4/js/responsive.bootstrap4.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable;\n\n  DataTable.Responsive.prototype._detailsObj = function (rowIdx) {\n    var that = this;\n    var dt = this.s.dt;\n    return $.map(this.s.columns, function (col, i) {\n      // Never and control columns should not be passed to the renderer\n      if (col.never || col.control) {\n        return;\n      }\n\n      return {\n        title: dt.settings()[0].aoColumns[i].sTitle.substring(dt.settings()[0].aoColumns[i].sTitle.indexOf('<span>'), dt.settings()[0].aoColumns[i].sTitle.indexOf('</span>') + 7),\n        data: dt.cell(rowIdx, i).render(that.c.orthogonal),\n        hidden: dt.column(i).visible() && !that.s.current[i],\n        columnIndex: i,\n        rowIndex: rowIdx\n      };\n    });\n  };\n});\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.responsive.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.rowGroup.js":
/*!*********************************************!*\
  !*** ./src/rup_table/rup.table.rowGroup.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/*! RowGroup 1.0.2\r\n * ©2017 SpryMedia Ltd - datatables.net/license\r\n */\n\n/**\r\n * @summary     RowGroup\r\n * @description RowGrouping for DataTables\r\n * @version     1.0.2\r\n * @file        rup.table.rowGroup.js\r\n * @author      SpryMedia Ltd (www.sprymedia.co.uk)\r\n * @contact     datatables.net\r\n * @copyright   Copyright 2017 SpryMedia Ltd.\r\n *\r\n * This source file is free software, available under the following license:\r\n *   MIT license - http://datatables.net/license/mit\r\n *\r\n * This source file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\r\n *\r\n * For details please refer to: http://www.datatables.net\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable;\n\n  var RowGroup = function RowGroup(dt, opts) {\n    // Sanity check that we are using DataTables 1.10 or newer\n    if (!DataTable.versionCheck || !DataTable.versionCheck('1.10.8')) {\n      throw 'RowGroup requires DataTables 1.10.8 or newer';\n    } // User and defaults configuration object\n\n\n    this.c = $.extend(true, {}, DataTable.defaults.rowGroup, RowGroup.defaults, opts); // Internal settings\n\n    this.s = {\n      dt: new DataTable.Api(dt),\n      dataFn: DataTable.ext.oApi._fnGetObjectDataFn(this.c.dataSrc)\n    }; // DOM items\n\n    this.dom = {}; // Check if row grouping has already been initialised on this table\n\n    var settings = this.s.dt.settings()[0];\n    var existing = settings.rowGroup;\n\n    if (existing) {\n      return existing;\n    }\n\n    settings.rowGroup = this;\n\n    this._constructor();\n  };\n\n  $.extend(RowGroup.prototype, {\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n     * API methods for DataTables API interface\r\n     */\n\n    /**\r\n     * Get/set the grouping data source - need to call draw after this is\r\n     * executed as a setter\r\n     * @returns string~RowGroup\r\n     */\n    dataSrc: function dataSrc(val) {\n      if (val === undefined) {\n        return this.c.dataSrc;\n      }\n\n      var dt = this.s.dt;\n      this.c.dataSrc = val;\n      this.s.dataFn = DataTable.ext.oApi._fnGetObjectDataFn(this.c.dataSrc);\n      $(dt.table().node()).triggerHandler('rowgroup-datasrc.dt', [dt, val]);\n      return this;\n    },\n\n    /**\r\n     * Disable - need to call draw after this is executed\r\n     * @returns RowGroup\r\n     */\n    disable: function disable() {\n      this.c.enable = false;\n      return this;\n    },\n\n    /**\r\n     * Enable - need to call draw after this is executed\r\n     * @returns RowGroup\r\n     */\n    enable: function enable(flag) {\n      if (flag === false) {\n        return this.disable();\n      }\n\n      this.c.enable = true;\n      return this;\n    },\n\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n     * Constructor\r\n     */\n    _constructor: function _constructor() {\n      var that = this;\n      var dt = this.s.dt;\n      dt.on('draw.dtrg', function () {\n        if (that.c.enable) {\n          that._draw();\n        }\n      });\n      dt.on('column-visibility.dt.dtrg responsive-resize.dt.dtrg', function () {\n        that._adjustColspan();\n      });\n      dt.on('destroy', function () {\n        dt.off('.dtrg');\n      });\n    },\n\n    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n     * Private methods\r\n     */\n\n    /**\r\n     * Adjust column span when column visibility changes\r\n     * @private\r\n     */\n    _adjustColspan: function _adjustColspan() {\n      $('tr.' + this.c.className, this.s.dt.table().body()).attr('colspan', this._colspan());\n    },\n\n    /**\r\n     * Get the number of columns that a grouping row should span\r\n     * @private\r\n     */\n    _colspan: function _colspan() {\n      return this.s.dt.columns().visible().reduce(function (a, b) {\n        return a + b;\n      }, 0);\n    },\n\n    /**\r\n     * Update function that is called whenever we need to draw the grouping rows\r\n     * @private\r\n     */\n    _draw: function _draw() {\n      var that = this;\n      var dt = this.s.dt;\n      var ctx = dt.context[0];\n      var rows = dt.rows({\n        page: 'current'\n      });\n      var groupedRows = [];\n      var last, display;\n      rows.every(function () {\n        var d = this.data();\n        var group = that.s.dataFn(d);\n\n        if (last === undefined || group !== last) {\n          groupedRows.push([]);\n          last = group;\n        }\n\n        groupedRows[groupedRows.length - 1].push(this.index());\n      });\n\n      for (var i = 0, ien = groupedRows.length; i < ien; i++) {\n        var group = groupedRows[i];\n        var firstRow = dt.row(group[0]);\n        var groupName = this.s.dataFn(firstRow.data());\n        var span = $('<span></span>').addClass('ui-icon tree-wrap-ltr ui-icon-circlesmall-minus');\n        span.attr('identificador', i);\n\n        if (this.c.startRender) {\n          display = this.c.startRender.call(this, dt.rows(group), groupName);\n\n          var trCreate = this._rowWrap(display, this.c.startClassName);\n\n          trCreate.insertBefore(firstRow.node());\n          $('td', trCreate).prepend(span);\n          trCreate.click(function () {\n            var span = $(this).find('span')[0];\n            var position = Number(span.getAttribute(\"identificador\"));\n\n            if ($(span).hasClass('ui-icon-circlesmall-minus')) {\n              DataTable.Api().rowGroup().collapse(ctx, position, span, \"next\");\n            } else {\n              DataTable.Api().rowGroup().expand(ctx, position, span, \"next\");\n            }\n          });\n        }\n\n        if (this.c.endRender) {\n          display = this.c.endRender.call(this, dt.rows(group), groupName);\n\n          var trCreate = this._rowWrap(display, this.c.endClassName);\n\n          trCreate.insertAfter(dt.row(group[group.length - 1]).node());\n          $('td', trCreate).prepend(span);\n          trCreate.click(function () {\n            var span = $(this).find('span')[0];\n            var position = Number(span.getAttribute(\"identificador\"));\n\n            if ($(span).hasClass('ui-icon-circlesmall-minus')) {\n              DataTable.Api().rowGroup().collapse(ctx, position, span, \"prev\");\n            } else {\n              DataTable.Api().rowGroup().expand(ctx, position, span, \"prev\");\n            }\n          });\n        }\n      }\n\n      if (ctx.oInit.rowGroup.hiddenDefault) {\n        DataTable.Api().rowGroup().collapse(ctx);\n      }\n    },\n\n    /**\r\n     * Take a rendered value from an end user and make it suitable for display\r\n     * as a row, by wrapping it in a row, or detecting that it is a row.\r\n     * @param [node|jQuery|string] display Display value\r\n     * @param [string] className Class to add to the row\r\n     * @private\r\n     */\n    _rowWrap: function _rowWrap(display, className) {\n      var row;\n\n      if (_typeof(display) === 'object' && display.nodeName && display.nodeName.toLowerCase() === 'tr') {\n        row = $(display);\n      } else if (display instanceof $ && display.length && display[0].nodeName.toLowerCase() === 'tr') {\n        row = display;\n      } else {\n        row = $('<tr></tr>').append($('<td></td>').attr('colspan', this._colspan()).append(display));\n      }\n\n      return row.addClass(this.c.className).addClass(className);\n    },\n\n    /*\r\n     * Get the rows of a group.\r\n     * @param [object] group Group parent row\r\n     * @param [string] direction Sets the direction in which elements will be selected\r\n     * @private \r\n     */\n    _getRowsByGroup: function _getRowsByGroup(group, direction) {\n      var rows = [];\n\n      if (direction === \"prev\") {\n        $.each(group.prevAll(), function () {\n          if ($(this).hasClass(\"group\")) {\n            return false;\n          }\n\n          rows.push(this);\n        });\n      } else {\n        $.each(group.nextAll(), function () {\n          if ($(this).hasClass(\"group\")) {\n            return false;\n          }\n\n          rows.push(this);\n        });\n      }\n\n      return rows;\n    }\n  });\n  /**\r\n   * RowGroup default settings for initialisation\r\n   *\r\n   * @namespace\r\n   * @name RowGroup.defaults\r\n   * @static\r\n   */\n\n  RowGroup.defaults = {\n    /**\r\n     * Class to apply to grouping rows - applied to both the start and\r\n     * end grouping rows.\r\n     * @type string\r\n     */\n    className: 'cursor_pointer group',\n\n    /**\r\n     * Data property from which to read the grouping information\r\n     * @type string|integer\r\n     */\n    dataSrc: 0,\n\n    /**\r\n     * Initial enablement state\r\n     * @boolean\r\n     */\n    enable: true,\n\n    /**\r\n     * Class name to give to the end grouping row\r\n     * @type string\r\n     */\n    endClassName: 'group-end',\n\n    /**\r\n     * End grouping label function\r\n     * @function\r\n     */\n    endRender: null,\n\n    /**\r\n     * Class name to give to the start grouping row\r\n     * @type string\r\n     */\n    startClassName: 'group-start',\n\n    /**\r\n     * Start grouping label function\r\n     * @function\r\n     */\n    startRender: function startRender(rows, group) {\n      return group;\n    }\n  };\n  RowGroup.version = '1.0.2';\n  $.fn.dataTable.RowGroup = RowGroup;\n  $.fn.DataTable.RowGroup = RowGroup;\n  DataTable.Api.register('rowGroup()', function () {\n    return this;\n  });\n  DataTable.Api.register('rowGroup().disable()', function () {\n    return this.iterator('table', function (ctx) {\n      if (ctx.rowGroup) {\n        ctx.rowGroup.enable(false);\n      }\n    });\n  });\n  DataTable.Api.register('rowGroup().enable()', function (opts) {\n    return this.iterator('table', function (ctx) {\n      if (ctx.rowGroup) {\n        ctx.rowGroup.enable(opts === undefined ? true : opts);\n      }\n    });\n  });\n  DataTable.Api.register('rowGroup().dataSrc()', function (val) {\n    if (val === undefined) {\n      return this.context[0].rowGroup.dataSrc();\n    }\n\n    return this.iterator('table', function (ctx) {\n      if (ctx.rowGroup) {\n        ctx.rowGroup.dataSrc(val);\n      }\n    });\n  });\n  DataTable.Api.register('rowGroup().expand()', function (ctx, position, span, direction) {\n    // Si es undefined es que quiere expandir todos\n    if (position === undefined) {\n      var selectorRowPadre = $(ctx.nTBody).find(\"tr.group span\");\n      $(ctx.nTBody).find(\"tr:not(.group)\").show();\n      selectorRowPadre.addClass('ui-icon-circlesmall-minus');\n      selectorRowPadre.removeClass('ui-icon-circlesmall-plus');\n    } else {\n      if (span === undefined) {\n        span = $(ctx.nTBody).find(\"[identificador=\" + position + \"]\")[0];\n      }\n\n      var rows = ctx.rowGroup._getRowsByGroup($(span.parentNode.parentElement), direction);\n\n      $.each(rows, function () {\n        $(this).show();\n      });\n      $(span).addClass('ui-icon-circlesmall-minus');\n      $(span).removeClass('ui-icon-circlesmall-plus');\n      $(span).triggerHandler('tablaGroupingClickGroupExpand', ctx);\n    }\n  });\n  DataTable.Api.register('rowGroup().collapse()', function (ctx, position, span, direction) {\n    // Si es undefined es que quiere colapsar todos\n    if (position === undefined) {\n      var selectorRowPadre = $(ctx.nTBody).find(\"tr.group span\");\n      $(ctx.nTBody).find(\"tr:not(.group)\").hide();\n      selectorRowPadre.addClass('ui-icon-circlesmall-plus');\n      selectorRowPadre.removeClass('ui-icon-circlesmall-minus');\n    } else {\n      if (span === undefined) {\n        span = $(ctx.nTBody).find(\"[identificador=\" + position + \"]\")[0];\n      }\n\n      var rows = ctx.rowGroup._getRowsByGroup($(span.parentNode.parentElement), direction);\n\n      $.each(rows, function () {\n        $(this).hide();\n      });\n      $(span).addClass('ui-icon-circlesmall-plus');\n      $(span).removeClass('ui-icon-circlesmall-minus');\n      $(span).triggerHandler('tablaGroupingClickGroup', ctx);\n    }\n  }); // Attach a listener to the document which listens for DataTables initialisation\n  // events so we can automatically initialise\n\n  $(document).on('preInit.dt.dtrg', function (e, settings, json) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    var init = settings.oInit.rowGroup;\n    var defaults = DataTable.defaults.rowGroup;\n\n    if (init || defaults) {\n      var opts = $.extend({}, defaults, init);\n\n      if (init !== false) {\n        new RowGroup(settings, opts);\n      }\n    }\n  });\n  return RowGroup;\n});\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.rowGroup.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.seeker.js":
/*!*******************************************!*\
  !*** ./src/rup_table/rup.table.seeker.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Buscador interno del table\r\n *\r\n * @summary \t\tExtensión del componente RUP Datatable\r\n * @module\t\t\t\"rup.table.seeker\"\r\n * @version     1.0.0\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n *\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Version information for debugger\n\n  DataTable.seeker = {};\n  DataTable.seeker.version = '1.2.4';\n  /**\r\n   * \r\n   * Se inicializa el componente seeker\r\n   *\r\n   * @name init\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n  DataTable.seeker.init = function (dt) {\n    var ctx = dt.settings()[0]; //Se inicializa por cada instancia 1 tabla 1 instancia\n\n    ctx.seeker = {};\n\n    _createFilterColumn(dt, ctx);\n\n    var ajaxOptions = {\n      url: ctx.oInit.urlBase + '/search',\n      accepts: {\n        '*': '*/*',\n        'html': 'text/html',\n        'json': 'application/json, text/javascript',\n        'script': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript',\n        'text': 'text/plain',\n        'xml': 'application/xml, text/xml'\n      },\n      type: 'POST',\n      data: _getDatos(ctx),\n      dataType: 'json',\n      showLoading: false,\n      contentType: 'application/json',\n      async: true,\n      success: function success(data, status, xhr) {\n        $('#' + ctx.sTableId).triggerHandler('tableSeekerSearchSuccess', ctx);\n        ctx.seeker.search.funcionParams = data;\n        ctx.seeker.search.pos = 0; // se inicializa por cada busqueda.\n\n        _processData(dt, ctx, data);\n      },\n      error: function error(xhr, ajaxOptions, thrownError) {\n        ctx.oInit.feedback.$feedbackContainer.rup_feedback('set', thrownError + ': ' + xhr.responseText, 'error');\n        ctx.oInit.feedback.$feedbackContainer.rup_feedback('show');\n        $('#' + ctx.sTableId).triggerHandler('tableSeekerSearchError', ctx);\n      },\n      complete: function complete(xhr, status) {\n        $('#' + ctx.sTableId).triggerHandler('tableSeekerSearchComplete', ctx);\n      }\n    };\n    ctx.seeker.ajaxOption = ajaxOptions; //Ver el buscador interno de la tabla.\n\n    if (ctx.fnRecordsTotal() === 0) {\n      ctx.seeker.search.$searchRow.hide();\n    } else {\n      ctx.seeker.search.$searchRow.show();\n    }\n\n    $('#' + ctx.sTableId).triggerHandler('tableSeekerAfterCreateToolbar', ctx);\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Local functions\r\n   */\n\n\n  function _eventTrigger(api, type, args, any) {\n    if (any && !api.flatten().length) {\n      return;\n    }\n\n    if (typeof type === 'string') {\n      type = type + '.dt';\n    }\n\n    args.unshift(api);\n    $(api.table().node()).trigger(type, args);\n  }\n  /**\r\n   * Crea los componentes principales del buscador.\r\n   *\r\n   * @name createFilterColumn\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {object} ctx - Es el contecto del table donde esta la configuración del mismo.\r\n   *\r\n   */\n\n\n  function _createFilterColumn(dt, ctx) {\n    var idTabla = ctx.sTableId;\n    $('#' + idTabla + ' tfoot').css('display', 'table-header-group');\n    $('#' + idTabla + ' tfoot th').each(function () {\n      var title = this.innerText;\n      var index = $(this).index();\n      var colModel = ctx.oInit.colModel;\n\n      if (index > 0 || ctx.oInit.multiSelect === undefined) {\n        var _result$0$searchoptio;\n\n        var position = index + 1;\n        var nombre = $('#' + idTabla + ' thead th:nth-child(' + position + ')').attr('data-col-prop');\n        var result = $.grep(colModel, function (v) {\n          return v.index.toUpperCase() === nombre.toUpperCase();\n        }); // Comprobamos si queremos deshabilitar la búsqueda de la columna\n\n        if (colModel != undefined && result[0].hidden) {\n          $(this).empty();\n        } else if (result[0].rupType == 'select' || ((_result$0$searchoptio = result[0].searchoptions) === null || _result$0$searchoptio === void 0 ? void 0 : _result$0$searchoptio.rupType) == 'select') {\n          $(this).html('<select name=\"' + nombre + '\" id=\"' + nombre + '_' + idTabla + '_seeker\"></select>');\n        } else {\n          $(this).html('<input type=\"text\" placeholder=\"' + title + '\" name=\"' + nombre + '\" id=\"' + nombre + '_' + idTabla + '_seeker\"/>');\n        }\n      }\n    });\n    dt.columns().eq(0).each(function (colIdx) {\n      if (colIdx > 0 || ctx.oInit.multiSelect === undefined) {\n        //evitar el checkbox\n        var celda = $('#' + idTabla + ' tfoot')[0].rows[0].cells[colIdx];\n\n        if (celda !== undefined) {\n          $('input', celda).on('keypress', function (ev) {\n            this.focus();\n\n            if (ev.keyCode === 13 && this.value !== '') {\n              //Se hace la llamada de busqueda.\n              var customBuscar = ctx.oInit.validarBuscar;\n\n              if (typeof customBuscar === \"function\" && customBuscar(ctx)) {\n                return false;\n              }\n\n              ctx.seeker.ajaxOption.data = _getDatos(ctx);\n              var ajaxOptions = $.extend(true, [], ctx.seeker.ajaxOption);\n              $('#' + ctx.sTableId).triggerHandler('tableSeekerBeforeSearch', ctx);\n\n              if (!jQuery.isEmptyObject(ajaxOptions.data.search)) {\n                $('#' + idTabla + '_search_searchForm').rup_form();\n                $('#' + idTabla + '_search_searchForm').rup_form('ajaxSubmit', ajaxOptions);\n              }\n\n              $('#' + ctx.sTableId).triggerHandler('tableSeekerAfterSearch', ctx);\n            }\n          });\n        }\n      }\n    });\n\n    _createSearchRow(dt, ctx);\n\n    ctx.seeker.searchForm = $('#' + idTabla + ' tfoot tr:nth-child(2)');\n    ctx.seeker.searchForm.hide();\n\n    _createRupComponent(dt, ctx);\n  }\n  /**\r\n   * Genera la barra de controles para gestionar la búsqueda..\r\n   *\r\n   * @name createSearchRow\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {object} ctx - Es el contexto del table donde esta la configuración del mismo.\r\n   *\r\n   */\n\n\n  function _createSearchRow(dt, ctx) {\n    var idTabla = ctx.sTableId;\n    var $gridHead = jQuery('tfoot', '#' + idTabla),\n        // Templates\n    searchRowHeaderTmpl = \"<th class='search_row_header' colspan='{0}'></th>\",\n        collapseLayerTmpl = \"<div id='{0}' class='search_collapse_layer'></div>\",\n        collapseIconTmpl = \"<span id='{0}' class='collapse_icon mdi mdi-chevron-right'></span>\",\n        collapseLabelTmpl = \"<a id='{0}' class='text-primary text-decoration-underline' href='#0'>{1}:</a>\",\n        matchedLayerTmpl = \"<div id='{0}' class='matched_layer mr-3'></div>\",\n        matchedLabelTmpl = \"<span id='{0}' class='ml-2'>{1}</span>\",\n        navLayerTmpl = \"<div id='{0}' class='search_nav_layer row no-gutters'></div>\",\n        navButtonTmpl = \"<button id='{0}' class='btn-material btn-material-sm btn-material-secondary-low-emphasis col-3 col-sm-auto mr-sm-2' type='button' alt='{1}' disabled>{1}</button>\",\n        navClearButtonTmpl = \"<button id='{0}' class='btn-material btn-material-sm btn-material-primary-low-emphasis col-5 ml-4 mt-2 col-sm-auto ml-sm-0 mt-sm-auto mr-sm-2' type='button' alt='{1}'><i class='mdi mdi-eraser'></i><span class='ui-button-text'>{1}</span></button>\",\n        navSearchButtonTmpl = \"<button id='{0}' class='btn-material btn-material-sm btn-material-primary-low-emphasis col-5 ml-4 mt-2 col-sm-auto ml-sm-0 mt-sm-auto mr-sm-2' type='button'><i class='mdi mdi-magnify'></i><span class='ui-button-text'>{1}</span></button>\",\n        // Objetos\n    $searchRow = $(\"<tr class='search_row'></tr>\"),\n        $searchRowHeader = $($.rup_utils.format(searchRowHeaderTmpl, $gridHead.find('th').length)),\n        // Capa que controla el colapso del formulario\n    $collapseLayer = $($.rup_utils.format(collapseLayerTmpl, 'searchCollapseLayer_' + idTabla)),\n        $collapseIcon = $($.rup_utils.format(collapseIconTmpl, 'searchCollapseIcon_' + idTabla)),\n        $collapseLabel = $($.rup_utils.format(collapseLabelTmpl, 'searchCollapsLabel_' + idTabla, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.plugins.search.searchCriteria'))),\n        // Capa que muestra el número de ocurrencias\n    $matchedLayer = $($.rup_utils.format(matchedLayerTmpl, 'matchedLayer_' + idTabla)),\n        $matchedLabel = $($.rup_utils.format(matchedLabelTmpl, 'matchedLabel_' + idTabla, $.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.plugins.search.matchedRecords'), 0))),\n        // Capa que controla la navegación entre las diferentes ocurrencias\n    $navLayer = $($.rup_utils.format(navLayerTmpl, 'searchNavLayer_' + idTabla)),\n        $firstNavButton = $($.rup_utils.format(navButtonTmpl, 'search_nav_first_' + idTabla, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.first'))),\n        $backNavButton = $($.rup_utils.format(navButtonTmpl, 'search_nav_back_' + idTabla, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.previous'))),\n        $forwardNavButton = $($.rup_utils.format(navButtonTmpl, 'search_nav_forward_' + idTabla, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.next'))),\n        $lastNavButton = $($.rup_utils.format(navButtonTmpl, 'search_nav_last_' + idTabla, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.last'))),\n        $navClearButton = $($.rup_utils.format(navClearButtonTmpl, 'search_nav_clear_button' + idTabla, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.search.Reset'))),\n        $navSearchButton = $($.rup_utils.format(navSearchButtonTmpl, 'search_nav_button_' + idTabla, jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.search.Find'))); // Construcción del objeto final\n\n    $collapseLayer.append($collapseIcon).append($collapseLabel);\n    $matchedLayer.append($matchedLabel);\n    $navLayer.append($firstNavButton).append($backNavButton).append($forwardNavButton).append($lastNavButton).append($navClearButton).append($navSearchButton);\n    $searchRowHeader.append($collapseLayer);\n    $searchRowHeader.append($matchedLayer);\n    $searchRowHeader.append($navLayer);\n    $searchRow.append($searchRowHeader);\n    $gridHead.prepend($searchRow);\n    jQuery('tfoot tr.search_row', '#' + idTabla + '').addClass('ui-state-default');\n    ctx.seeker.search = ctx.seeker.search || {};\n    ctx.seeker.search.created = false;\n    ctx.seeker.search.$collapseIcon = $collapseIcon;\n    ctx.seeker.search.$searchRow = $searchRow;\n    ctx.seeker.search.$matchedLabel = $matchedLabel;\n    ctx.seeker.search.$firstNavButton = $firstNavButton;\n    ctx.seeker.search.$backNavButton = $backNavButton;\n    ctx.seeker.search.$forwardNavButton = $forwardNavButton;\n    ctx.seeker.search.$lastNavButton = $lastNavButton; // Creacion del enlace de mostrar/ocultar el formulario\n\n    $collapseIcon.add($collapseLabel).on('click', function () {\n      if (!ctx.seeker.search.created) {\n        ctx.seeker.search.$collapseIcon.removeClass('mdi-chevron-right');\n        ctx.seeker.search.$collapseIcon.addClass('mdi-chevron-down');\n        ctx.seeker.search.created = true;\n        ctx.seeker.searchForm.show();\n        $navLayer.show();\n      } else {\n        ctx.seeker.search.$collapseIcon.removeClass('mdi-chevron-down');\n        ctx.seeker.search.$collapseIcon.addClass('mdi-chevron-right');\n        ctx.seeker.search.created = false;\n        ctx.seeker.searchForm.hide();\n        $navLayer.hide();\n      }\n    }); // Evento de búsqueda asociado al botón\n\n    $navSearchButton.on('click', function () {\n      $('#' + ctx.sTableId).triggerHandler('tableSeekerBeforeSearch', ctx);\n      var customBuscar = ctx.oInit.validarBuscar;\n\n      if (typeof customBuscar === \"function\" && customBuscar(ctx)) {\n        return false;\n      }\n\n      ctx.seeker.ajaxOption.data = _getDatos(ctx);\n      var ajaxOptions = $.extend(true, [], ctx.seeker.ajaxOption);\n      $('#' + ctx.sTableId).triggerHandler('tableSeekerBeforeSearch', ctx);\n\n      if (!jQuery.isEmptyObject(ajaxOptions.data.search)) {\n        $('#' + idTabla + '_search_searchForm').rup_form();\n        var tmp = ajaxOptions.success;\n\n        ajaxOptions.success = function () {\n          tmp(arguments[0], arguments[1], arguments[2]);\n          ajaxOptions.success = tmp;\n          $('#' + ctx.sTableId).triggerHandler('tableSeekerAfterSearch', ctx);\n        };\n\n        $('#' + idTabla + '_search_searchForm').rup_form('ajaxSubmit', ajaxOptions);\n      }\n    }); // Evento asociado a limpiar el fomulario de búsqueda\n\n    $navClearButton.on('click', function () {\n      _limpiarSeeker(dt, ctx);\n    });\n    $navLayer.hide();\n\n    function doSearchButtonNavigation($button, buttonId) {\n      if (!$button.prop('disabled')) {\n        $self.rup_jqtable('navigateToMatchedRow', buttonId);\n      }\n    } // Elemento primero\n\n\n    $firstNavButton.on('click', function () {\n      ctx.seeker.search.pos = 0;\n\n      _processData(dt, ctx, ctx.seeker.search.funcionParams);\n    }); // Elemento anterior\n\n    $backNavButton.on('click', function () {\n      ctx.seeker.search.pos--;\n\n      _processData(dt, ctx, ctx.seeker.search.funcionParams);\n    }); // Elemento siguiente\n\n    $forwardNavButton.on('click', function () {\n      ctx.seeker.search.accion = 'next';\n      ctx.seeker.search.pos++;\n\n      _processData(dt, ctx, ctx.seeker.search.funcionParams);\n    }); // Elemento ultimo\n\n    $lastNavButton.on('click', function () {\n      ctx.seeker.search.pos = ctx.seeker.search.funcionParams.length - 1;\n\n      _processData(dt, ctx, ctx.seeker.search.funcionParams);\n    }); // Se recubre con un form\n\n    var $searchForm = jQuery('<form>').attr('id', idTabla + '_search_searchForm');\n    $('#' + idTabla).wrapAll($searchForm);\n    ctx.seeker.search.$searchForm = $('#' + idTabla + '_search_searchForm');\n    ctx.seeker.search.$searchRow.hide();\n    ctx.seeker.search.pos = 0;\n    ctx.seeker.search.accion = '';\n  }\n  /**\r\n   * Selecciona con la lupa los rows seleccionados. Una vez se han encontrado.\r\n   *\r\n   * @name selectSearch\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {object} ctx - Es el contecto del table donde esta la configuración del mismo.\r\n   * @param {object} rows - Filas del table de la página actual.\r\n   *\r\n   */\n\n\n  function _selectSearch(dt, ctx, rows) {\n    //Se limina el lapicero indicador.\n    $('#' + ctx.sTableId + ' tbody tr td.select-checkbox i.filtered-row').remove();\n    $('#' + ctx.sTableId + ' tbody tr td i.filtered-row').remove(); //se añade el span con la lupa\n\n    if (rows.length > 0 && ctx.fnRecordsTotal() > 0) {\n      //Se selecciona el primero y se limpian los datos.\n      var rowSelected = '';\n      $.each(ctx.json.rows, function (idx, value) {\n        if (rows[ctx.seeker.search.pos].pageLine - 1 === idx) {\n          rowSelected = dt.rows().nodes()[idx];\n        }\n\n        var result = $.grep(rows, function (v) {\n          return DataTable.Api().rupTable.comparePKs(v.pk, value);\n        });\n\n        if (result.length === 1) {\n          var searchIcon = $('<i></i>').addClass('mdi mdi-magnify ui-icon-rupInfoCol filtered-row');\n          $($('#' + ctx.sTableId + ' tbody tr td:nth-child(1)')[idx]).append(searchIcon);\n        }\n      });\n      var rowUnique = rows[ctx.seeker.search.pos];\n      var rowList = ctx.json.rows[rowUnique.pageLine - 1];\n\n      if (rowSelected !== '' && rowSelected.className.indexOf('selected') < 0 && rowUnique.page === Number(ctx.json.page) && DataTable.Api().rupTable.comparePKs(rowUnique.pk, rowList) && (ctx.oInit.formEdit === undefined || ctx.oInit.formEdit.$navigationBar.funcionParams === undefined || ctx.oInit.formEdit.$navigationBar.funcionParams.length === undefined)) {\n        //si no esta ya seleccionada.\n        if (ctx.oInit.multiSelect !== undefined) {\n          dt['row'](rowUnique.pageLine - 1).multiSelect();\n        } else if (ctx.oInit.select !== undefined) {\n          DataTable.Api().select.selectRowIndex(dt, rowUnique.pageLine - 1, true);\n        }\n      }\n\n      ctx.seeker.search.accion = '';\n    }\n\n    $('#' + ctx.sTableId).trigger('selected.rup.dt', ctx);\n  }\n  /**\r\n   * Metodo para saber si hay que paginar o no.\r\n   *\r\n   * @name paginar\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} ctx - Es el contexto del table donde esta la configuración del mismo.\r\n   * @param {object} dato - Son los datos de las filas que viene del controller..\r\n   *\r\n   */\n\n\n  function _paginar(ctx, dato) {\n    var paginar = false;\n\n    if (dato !== undefined && dato.page !== Number(ctx.json.page)) {\n      paginar = true;\n    }\n\n    return paginar;\n  }\n  /**\r\n   * Actualiza la navegación del seeker.\r\n   *\r\n   * @name updateDetailSeekPagination\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {integer} currentRowNum - Número de la posción actual del registro selecionado.\r\n   * @param {integer} totalRowNum - Número total de registros seleccionados.\r\n   *\r\n   */\n\n\n  function _updateDetailSeekPagination(currentRowNum, totalRowNum, ctx) {\n    if (currentRowNum === 1) {\n      ctx.seeker.search.$firstNavButton.prop('disabled', true);\n      ctx.seeker.search.$backNavButton.prop('disabled', true);\n    } else {\n      ctx.seeker.search.$firstNavButton.prop('disabled', false);\n      ctx.seeker.search.$backNavButton.prop('disabled', false);\n    }\n\n    if (currentRowNum === totalRowNum) {\n      ctx.seeker.search.$forwardNavButton.prop('disabled', true);\n      ctx.seeker.search.$lastNavButton.prop('disabled', true);\n    } else {\n      ctx.seeker.search.$forwardNavButton.prop('disabled', false);\n      ctx.seeker.search.$lastNavButton.prop('disabled', false);\n    }\n\n    ctx.seeker.search.$matchedLabel.html($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.plugins.search.matchedRecordsCount'), Number(currentRowNum), Number(totalRowNum)));\n  }\n  /**\r\n   * Metodo para procesar los datos provinientes del controller.\r\n   *\r\n   * @name processData\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {object} ctx - Es el contecto del table donde esta la configuración del mismo.\r\n   * @param {object} dato - Son los datos de las filas que viene del controller.\r\n   *\r\n   */\n\n\n  function _processData(dt, ctx, data) {\n    if (ctx.oInit.multiSelect !== undefined) {\n      DataTable.Api().multiSelect.deselectAll(dt);\n    } else if (ctx.oInit.select !== undefined) {\n      DataTable.Api().select.deselect(ctx);\n    }\n\n    if (!_paginar(ctx, data[ctx.seeker.search.pos])) {\n      _selectSearch(dt, ctx, data);\n    } else {\n      var tabla = $('#' + ctx.sTableId);\n      tabla.dataTable().fnPageChange(data[ctx.seeker.search.pos].page - 1);\n    }\n\n    if (data.length === 0) {\n      ctx.seeker.search.$firstNavButton.add(ctx.seeker.search.$backNavButton).add(ctx.seeker.search.$forwardNavButton).add(ctx.seeker.search.$lastNavButton).prop('disabled', true);\n      ctx.seeker.search.$matchedLabel.html($.rup_utils.format(jQuery.rup.i18nParse(jQuery.rup.i18n.base, 'rup_table.plugins.search.matchedRecords'), '0'));\n    } else {\n      _updateDetailSeekPagination(ctx.seeker.search.pos + 1, data.length, ctx);\n    }\n  }\n  /**\r\n   * Se obtienen los datos del formulario del seeker.\r\n   *\r\n   * @name getDatos\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} ctx - Es el contexto del table donde esta la configuración del mismo.\r\n   * \r\n   * @return {object} Devuelve el objeto mapeado de todos los campos.\r\n   *\r\n   */\n\n\n  function _getDatos(ctx) {\n    var datos = ctx.aBaseJson;\n\n    if (datos !== undefined && ctx.seeker.search.$searchForm[0] !== undefined) {\n      datos.search = form2object(ctx.seeker.search.$searchForm[0]);\n    }\n\n    return datos;\n  }\n  /**\r\n   * Partiendo de los inputs del seeker, se convierten en componentes rup dependiendo del tipo.\r\n   *\r\n   * @name createRupComponent\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   * @param {object} ctx - Es el contecto del table donde esta la configuración del mismo.\r\n   *\r\n   */\n\n\n  function _createRupComponent(dt, ctx) {\n    var colModel = ctx.oInit.colModel,\n        searchEditOptions;\n\n    if (colModel !== undefined) {\n      var idTabla = ctx.sTableId;\n      $('#' + idTabla + ' tfoot tr').eq(1).find('th:not(.select-checkbox)').each(function () {\n        // El primer tr corresponde al desplegable de filtros\n        // Se añade la clase necesaria para mostrar los inputs con estilos material\n        $(this).addClass('form-groupMaterial');\n        var nombre = $(this).find('input, select').attr('name');\n        var cellColModel = $.grep(colModel, function (v) {\n          return v.index.toUpperCase() === nombre.toUpperCase();\n        });\n\n        if (cellColModel !== undefined) {\n          cellColModel = cellColModel[0];\n          var searchRupType = cellColModel.searchoptions !== undefined && cellColModel.searchoptions.rupType !== undefined ? cellColModel.searchoptions.rupType : cellColModel.rupType;\n          var colModelName = cellColModel.name;\n          var $elem = $('[name=\\'' + colModelName + '\\']', ctx.seeker.searchForm);\n\n          if ($elem.length == 1) {\n            // Se añade el title de los elementos de acuerdo al colname\n            $elem.attr({\n              'title': $('#' + cellColModel.name + '_' + idTabla + '_seeker').attr('placeholder'),\n              'class': 'editable customelement form-control-customer'\n            }).removeAttr('readOnly'); // Añadir label oculto que se usará principalmente para la gestión de los combos enlazados.\n\n            $('<label></label>', {\n              'for': $elem.attr('id'),\n              'class': \"d-none\",\n              'text': $elem.attr('placeholder')\n            }).insertAfter($elem); // En caso de tratarse de un componente rup, se inicializa de acuerdo a la configuracón especificada en el colModel\n\n            if (searchRupType !== undefined && cellColModel.searchoptions) {\n              searchEditOptions = cellColModel.searchoptions; // Invocación al componente RUP\n\n              $elem['rup_' + searchRupType](searchEditOptions);\n            }\n          }\n        }\n      });\n    }\n  }\n\n  function _limpiarSeeker(dt, ctx) {\n    $('#' + ctx.sTableId).triggerHandler('tableSeekerBeforeClear', ctx);\n    var $form = $('#' + ctx.sTableId + '_search_searchForm'); // Reinicia el formulario.\n\n    $form.resetForm(); // Limpia los rup_autocomplete, rup_combo y rup_select.\n\n    jQuery.each($('input[rupType=autocomplete], select.rup_combo, select[rupType=select]', $form), function (index, elem) {\n      var elemSettings = jQuery(elem).data('settings');\n\n      if (elemSettings != undefined) {\n        var elemRuptype = jQuery(elem).attr('ruptype');\n\n        if (elemSettings.parent == undefined) {\n          if (elemRuptype == 'autocomplete') {\n            jQuery(elem).rup_autocomplete('setRupValue', '');\n          } else if (elemRuptype == 'combo') {\n            jQuery(elem).rup_combo('reload');\n          } else if (elemRuptype == 'select') {\n            jQuery(elem).rup_select('clear');\n          }\n        }\n\n        if (elemRuptype == 'select') {\n          // Necesario para garantizar que pierda el foco.\n          jQuery(elem).rup_select('reload');\n        }\n      }\n    });\n    ctx.seeker.search.funcionParams = {};\n    ctx.seeker.search.pos = 0;\n\n    _processData(dt, ctx, []);\n\n    $('#' + ctx.sTableId).triggerHandler('tableSeekerAfterClear', ctx);\n  }\n\n  function _enabledButtons(ctx) {\n    if (ctx.seeker !== undefined) {\n      $.each($('#' + ctx.sTableId + ' tfoot [id*=\"seeker\"]:not(a)'), function (key, id) {\n        if ($(this).attr('ruptype') === 'date') {\n          $(this).rup_date('disable');\n          $(this).next().addClass('form-control-customer');\n        } else if ($(this).attr('ruptype') === 'combo') {\n          $(this).rup_combo('disable');\n          $(this).next().find('a').addClass('form-control-customer').attr('readonly', true);\n        } else if ($(this).attr('ruptype') === 'time') {\n          $(this).rup_time('disable');\n        } else {\n          $(this).prop('disabled', true);\n        }\n      });\n    }\n  }\n\n  function _disabledButtons(ctx) {\n    if (ctx.seeker !== undefined) {\n      $.each($('#' + ctx.sTableId + ' tfoot [id*=\"seeker\"]:not(a)'), function (key, id) {\n        if ($(this).attr('ruptype') === 'date') {\n          $(this).rup_date('enable');\n        } else if ($(this).attr('ruptype') === 'combo') {\n          $(this).rup_combo('enable');\n          $(this).next().find('a').attr('readonly', false);\n        } else if ($(this).attr('ruptype') === 'time') {\n          $(this).rup_time('enable');\n        } else {\n          $(this).prop('disabled', false);\n        }\n      });\n    }\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables API\r\n   *\r\n   * For complete documentation, please refer to the docs/api directory or the\r\n   * DataTables site\r\n   */\n  // Local variables to improve compression\n\n\n  var apiRegister = DataTable.Api.register;\n  apiRegister('seeker.eventTrigger()', function (api, type, args, any) {\n    DataTable.seeker._eventTrigger(api, type, args, any);\n  });\n  apiRegister('seeker.selectSearch()', function (dt, ctx, rows) {\n    _selectSearch(dt, ctx, rows);\n  });\n  apiRegister('seeker.limpiarSeeker()', function (dt, ctx) {\n    _limpiarSeeker(dt, ctx);\n  });\n  apiRegister('seeker.updateDetailSeekPagination()', function (currentRowNum, totalRowNum, ctx) {\n    _updateDetailSeekPagination(currentRowNum, totalRowNum, ctx);\n  });\n  apiRegister('seeker.disabledButtons()', function (ctx) {\n    _disabledButtons(ctx);\n  });\n  apiRegister('seeker.enabledButtons()', function (ctx) {\n    _enabledButtons(ctx);\n  });\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Initialization\r\n   */\n  // DataTables creation - check if select has been defined in the options. Note\n  // this required that the table be in the document! If it isn't then something\n  // needs to trigger this method unfortunately. The next major release of\n  // DataTables will rework the events and address this.\n\n  $(document).on('plugin-init.dt', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (ctx.oInit.seeker !== undefined && ctx.oInit.seeker.activate !== false) {\n      DataTable.seeker.init(new DataTable.Api(ctx));\n    } else {\n      $('tfoot').hide();\n    }\n  });\n  return DataTable.seeker;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.seeker.js?");

/***/ }),

/***/ "./src/rup_table/rup.table.select.js":
/*!*******************************************!*\
  !*** ./src/rup_table/rup.table.select.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(jQuery) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n/**\r\n * Módulo que permite toda la seleción simple\r\n *\r\n * @summary \t\tExtensión del componente RUP Datatable\r\n * @module\t\t\t\"rup.table.select\"\r\n * @version     1.0.0\r\n * @license\r\n * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);\r\n * Solo podrá usarse esta obra si se respeta la Licencia.\r\n * Puede obtenerse una copia de la Licencia en\r\n *\r\n *      http://ec.europa.eu/idabc/eupl.html\r\n *\r\n * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,\r\n * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,\r\n * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.\r\n * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones\r\n * que establece la Licencia.\r\n * @copyright   Copyright 2018 E.J.I.E., S.A.\r\n *\r\n */\n(function (factory) {\n  if (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\"), __webpack_require__(/*! ../rup.contextMenu */ \"./src/rup.contextMenu.js\"), __webpack_require__(/*! ../rup.feedback */ \"./src/rup.feedback.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n      return factory($, window, document);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function ($, window, document, undefined) {\n  'use strict';\n\n  var DataTable = $.fn.dataTable; // Version information for debugger\n\n  DataTable.select = {};\n  DataTable.select.version = '1.2.4';\n  /**\r\n   * Se inicializa el componente select\r\n   *\r\n   * @name init\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   * \r\n   * @param {object} dt - Es el objeto table.\r\n   *\r\n   */\n\n  DataTable.select.init = function (dt) {\n    var ctx = dt.settings()[0];\n    ctx.select = [];\n    var rowsBody = $(ctx.nTBody); // Se selecciona una fila\n\n    if (ctx.oInit.selectFilaDer) {\n      rowsBody.on('click.DT keydown contextmenu', 'tr:not(.group)', function (e) {\n        // Solo selecciona si se pulsa sobre la barra espaciadora o se hace click izquierdo col raton\n        if (e.which == 1 || e.which == 32 || e.which == 3) {\n          if (e.target.className.indexOf('openResponsive') > -1 || $(this).hasClass('editable')) {// no hacer nada\n            //no se devuelve nada para los checkbox funcionen.\n          } else {\n            //selecionar\n            $(this).triggerHandler('tableSelectBeforeSelectRow', ctx);\n            var idRow = this._DT_RowIndex;\n\n            _selectRowIndex(dt, idRow, $(this));\n\n            $(this).triggerHandler('tableSelectAfterSelectRow', ctx);\n          }\n        }\n      });\n    } else {\n      rowsBody.on('click.DT keydown', 'tr:not(.group)', function (e) {\n        // Solo selecciona si se pulsa sobre la barra espaciadora o se hace click izquierdo col raton\n        if (e.which == 1 || e.which == 32) {\n          if (e.target.className.indexOf('openResponsive') > -1 || $(this).hasClass('editable')) {// no hacer nada\n            //no se devuelve nada para los checkbox funcionen.\n          } else {\n            //selecionar\n            $(this).triggerHandler('tableSelectBeforeSelectRow', ctx);\n            var idRow = this._DT_RowIndex;\n\n            _selectRowIndex(dt, idRow, $(this));\n\n            $(this).triggerHandler('tableSelectAfterSelectRow', ctx);\n          }\n        }\n      });\n    }\n\n    if (ctx.oInit.inlineEdit === undefined && ctx.oInit.formEdit === undefined) {\n      $(window).on('resize.dtr', DataTable.util.throttle(function () {\n        //Se calcula el responsive\n        DataTable.Api().editForm.addchildIcons(ctx);\n      }));\n    }\n  };\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Local functions\r\n   */\n\n  /**\r\n   * Pinta los elementos selecionables, porque tiene los ids almacenados y mete la clase que se le indica.\r\n   *\r\n   *\r\n   * This will occur _after_ the initial DataTables initialisation, although\r\n   * before Ajax data is rendered\r\n   *\r\n   * @name drawSelectId\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * \r\n   */\n\n\n  function _drawSelectId(ctx) {\n    if (ctx.multiselection.selectedRowsPerPage.length === 1) {\n      var row = ctx.multiselection.selectedRowsPerPage[0];\n      var rowSelectAux = ctx.json.rows[row.line];\n\n      if (rowSelectAux !== undefined && row.id === DataTable.Api().rupTable.getIdPk(rowSelectAux, ctx.oInit)) {\n        var rowsBody = $(ctx.nTBody);\n        $('tr:not(.group)', rowsBody).eq(row.line).addClass('selected tr-highlight');\n      }\n    }\n  }\n  /**\r\n   * Pinta los elementos selecionables, porque tiene los ids almacenados y mete la clase que se le indica.\r\n   *\r\n   *\r\n   * This will occur _after_ the initial DataTables initialisation, although\r\n   * before Ajax data is rendered\r\n   *\r\n   * @name drawSelectId\r\n   * @function\r\n   * @since UDA 3.4.0 // Table 1.0.0\r\n   *\r\n   * \r\n   */\n\n\n  function _selectRowIndex(dt, index, tr) {\n    var ctx = dt.settings()[0];\n    ctx.multiselection.selectedRowsPerPage = [];\n    ctx.oInit.select.funcionParams = '';\n    var rowsBody = $(ctx.nTBody);\n\n    if (tr.hasClass('tr-highlight')) {\n      //se deselecciona\n      tr.removeClass('selected tr-highlight');\n\n      if (tr.next('.child').length >= 1) {\n        tr.next('.child').removeClass('selected tr-highlight');\n      }\n\n      ctx.multiselection.numSelected = 0;\n      ctx.multiselection.selectedIds = [];\n      ctx.multiselection.lastSelectedId = ''; //Si es en edicion en linea, no hacer nada\n\n      if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined && DataTable.Api().inlineEdit.editSameLine(ctx, index)) {\n        //Seleccionar la fila otra vez.\n        _selectRowIndex(dt, index, tr);\n      }\n    } else {\n      //se selecciona\n      $('tr', rowsBody).removeClass('selected tr-highlight');\n      tr.addClass('selected tr-highlight');\n\n      if (tr.next('.child').length >= 1) {\n        tr.next('.child').addClass('selected tr-highlight');\n      }\n\n      tr.triggerHandler('tableHighlightRowAsSelected', ctx);\n      var row = ctx.json.rows[index];\n\n      if (row !== undefined) {\n        var arra = {\n          id: DataTable.Api().rupTable.getIdPk(row, ctx.oInit),\n          page: dt.page() + 1,\n          line: index\n        };\n        ctx.multiselection.selectedRowsPerPage.splice(0, 0, arra);\n        ctx.multiselection.numSelected = 1;\n        ctx.multiselection.selectedIds = [DataTable.Api().rupTable.getIdPk(row, ctx.oInit)];\n        ctx.multiselection.lastSelectedId = DataTable.Api().rupTable.getIdPk(row, ctx.oInit);\n      } // si es en edicion en linea,\n\n\n      if (!ctx.oInit.noEdit && ctx.oInit.inlineEdit !== undefined && ctx.inlineEdit.lastRow !== undefined && ctx.inlineEdit.lastRow.idx !== index) {\n        DataTable.Api().inlineEdit.restaurarFila(ctx, true);\n      }\n    }\n\n    if (ctx.oInit.buttons !== undefined) {\n      DataTable.Api().buttons.displayRegex(ctx);\n    }\n  }\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables selectors\r\n   */\n\n  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * DataTables API\r\n   *\r\n   * For complete documentation, please refer to the docs/api directory or the\r\n   * DataTables site\r\n   */\n  // Local variables to improve compression\n\n\n  var apiRegister = DataTable.Api.register;\n  apiRegister('select()', function () {\n    return this.iterator('table', function (ctx) {\n      DataTable.select.init(new DataTable.Api(ctx));\n    });\n  });\n  apiRegister('select.drawSelectId()', function (ctx) {\n    _drawSelectId(ctx);\n  });\n  apiRegister('select.deselect()', function (ctx) {\n    var rowsBody = $(ctx.nTBody);\n    $('tr', rowsBody).removeClass('selected tr-highlight');\n    ctx.multiselection.numSelected = 0;\n    ctx.multiselection.selectedIds = [];\n    DataTable.Api().buttons.displayRegex(ctx);\n    $('#' + ctx.sTableId).trigger('rupTable_deselect', ctx);\n  });\n  apiRegister('select.selectRowIndex()', function (dt, index, isDoubleClick) {\n    var ctx = dt.settings()[0];\n    var rowsBody = $(ctx.nTBody);\n    var countTr = index;\n\n    if (isDoubleClick !== undefined) {\n      countTr = countTr + 1;\n    }\n\n    _selectRowIndex(dt, index, $('tr:not(.group)', rowsBody).eq(index));\n  });\n  apiRegister('select.defaultId()', function (ctx) {\n    var defaultId = ctx.oInit.select.defaultId;\n\n    if (defaultId !== undefined) {\n      var indexInArray = jQuery.inArray(defaultId, ctx.multiselection.selectedIds);\n\n      if (indexInArray < 0) {\n        //no esta ya seleccioando\n        ctx.multiselection.selectedIds.push(defaultId);\n        ctx.oInit.select.defaultId = undefined;\n      }\n    }\n  }); // Common events with suitable namespaces\n\n  function namespacedEvents(config) {\n    var unique = config._eventNamespace;\n    return 'draw.dt.DT' + unique + ' select.dt.DT' + unique + ' deselect.dt.DT' + unique;\n  }\n  /* * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n   * Initialisation\r\n   */\n  // DataTables creation - check if select has been defined in the options. Note\n  // this required that the table be in the document! If it isn't then something\n  // needs to trigger this method unfortunately. The next major release of\n  // DataTables will rework the events and address this.\n\n\n  $(document).on('preInit.dt.dtSelect', function (e, ctx) {\n    if (e.namespace !== 'dt') {\n      return;\n    }\n\n    if (ctx.oInit.select !== undefined && ctx.oInit.select.activate !== false) {\n      DataTable.select.init(new DataTable.Api(ctx));\n    }\n  });\n  return DataTable.select;\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack://rup/./src/rup_table/rup.table.select.js?");

/***/ }),

/***/ "./src/templates.js":
/*!**************************!*\
  !*** ./src/templates.js ***!
  \**************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n(function (factory) {\n  if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! handlebars */ \"./node_modules/handlebars/dist/cjs/handlebars.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n})(function (Handlebars) {\n  this[\"Rup\"] = this[\"Rup\"] || {};\n  this[\"Rup\"][\"Templates\"] = this[\"Rup\"][\"Templates\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"] = this[\"Rup\"][\"Templates\"][\"rup\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"button\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"button\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"button\"][\"dropdownButton\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<button id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 12\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 18\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"classes\") || (depth0 != null ? lookupProperty(depth0, \"classes\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"classes\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 27\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 38\n          }\n        }\n      }) : helper)) + \"\\\" type=\\\"button\\\">\\r\\n  <i class=\\\"mdi mdi-menu-down\\\" aria-hidden=\\\"true\\\"></i>\\r\\n</button>\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"button\"][\"mbutton-container\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 9\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 15\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"classes\") || (depth0 != null ? lookupProperty(depth0, \"classes\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"classes\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 24\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 35\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n  <ul role=\\\"menu\\\" aria-activedescendant=\\\"active-menuitem\\\" aria-labelledby=\\\"active-menuitem\\\">\\r\\n    <li style=\\\"display: block;\\\">\\r\\n      <button type=\\\"button\\\" class=\\\"btn-material btn-material-primary-high-emphasis rup-toolbar_button rup-button rup-toolbar_menuButtonElement\\\" id=\\\"toolbar##mbuton1##nuevo\\\">\\r\\n        <span class=\\\"mdi mdi-plus\\\"></span>\\r\\n        <span class=\\\"rup-ui-button-text\\\">\\r\\n        \t\" + alias4((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"rup_button.new\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 9\n          },\n          \"end\": {\n            \"line\": 7,\n            \"column\": 34\n          }\n        }\n      })) + \"\\r\\n        </span>\\r\\n      </button>\\r\\n    </li>\\r\\n  </ul>\\r\\n</div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"button\"][\"mbutton\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<button id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 12\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 18\n          }\n        }\n      }) : helper)) + \"\\\"\\r\\n  class=\\\"btn-material btn-material-primary-high-emphasis rup-toolbar_menuButton rup-toolbar_menuButtonSlided\\\"\\r\\n  role=\\\"button\\\"\\r\\n  href=\\\"#\\\">\\r\\n  \t\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 5,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 5,\n            \"column\": 12\n          }\n        }\n      }) : helper)) + \"\\r\\n  \t<span class=\\\"mdi \" + alias4((helper = (helper = lookupProperty(helpers, \"iconClasses\") || (depth0 != null ? lookupProperty(depth0, \"iconClasses\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"iconClasses\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 35\n          }\n        }\n      }) : helper)) + \"\\\" aria-hidden=\\\"true\\\"></span>\\r\\n</button>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"dashboard\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"dashboard\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"dashboard\"][\"item\"] = Handlebars.template({\n    \"1\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \" data-gs-min-width=\\\"\" + container.escapeExpression((helper = (helper = lookupProperty(helpers, \"minWidth\") || (depth0 != null ? lookupProperty(depth0, \"minWidth\") : depth0)) != null ? helper : container.hooks.helperMissing, typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, {\n        \"name\": \"minWidth\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 41\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 53\n          }\n        }\n      }) : helper)) + \"\\\" \";\n    },\n    \"3\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \" data-gs-max-width=\\\"\" + container.escapeExpression((helper = (helper = lookupProperty(helpers, \"maxWidth\") || (depth0 != null ? lookupProperty(depth0, \"maxWidth\") : depth0)) != null ? helper : container.hooks.helperMissing, typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, {\n        \"name\": \"maxWidth\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 41\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 53\n          }\n        }\n      }) : helper)) + \"\\\" \";\n    },\n    \"5\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \" data-gs-min-height=\\\"\" + container.escapeExpression((helper = (helper = lookupProperty(helpers, \"minHeight\") || (depth0 != null ? lookupProperty(depth0, \"minHeight\") : depth0)) != null ? helper : container.hooks.helperMissing, typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, {\n        \"name\": \"minHeight\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 43\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 56\n          }\n        }\n      }) : helper)) + \"\\\" \";\n    },\n    \"7\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \" data-gs-max-height=\\\"\" + container.escapeExpression((helper = (helper = lookupProperty(helpers, \"maxHeight\") || (depth0 != null ? lookupProperty(depth0, \"maxHeight\") : depth0)) != null ? helper : container.hooks.helperMissing, typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, {\n        \"name\": \"maxHeight\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 5,\n            \"column\": 43\n          },\n          \"end\": {\n            \"line\": 5,\n            \"column\": 56\n          }\n        }\n      }) : helper)) + \"\\\" \";\n    },\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var stack1,\n          helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div class=\\\"grid-stack-item\\\"  \\r\\n     \" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"minWidth\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(1, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 5\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 62\n          }\n        }\n      })) != null ? stack1 : \"\") + \"\\r\\n     \" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"maxWidth\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(3, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 5\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 62\n          }\n        }\n      })) != null ? stack1 : \"\") + \"\\r\\n     \" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"minHeight\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(5, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 5\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 65\n          }\n        }\n      })) != null ? stack1 : \"\") + \"\\r\\n     \" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"maxHeight\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(7, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 5,\n            \"column\": 5\n          },\n          \"end\": {\n            \"line\": 5,\n            \"column\": 65\n          }\n        }\n      })) != null ? stack1 : \"\") + \"\\r\\n     data-rup-widget-type=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"type\") || (depth0 != null ? lookupProperty(depth0, \"type\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"type\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 27\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 35\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n\\r\\n    <div class=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"itemClass\") || (depth0 != null ? lookupProperty(depth0, \"itemClass\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"itemClass\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 16\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 29\n          }\n        }\n      }) : helper)) + \"\\\" >\\r\\n\\r\\n    </div>\\r\\n</div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"detail\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"detail\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"detail\"][\"navigation\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"detail\"][\"navigation\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"detail\"][\"navigation\"][\"bootstrap\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\\\"pagination_\" + alias4((helper = (helper = lookupProperty(helpers, \"jqtableId\") || (depth0 != null ? lookupProperty(depth0, \"jqtableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"jqtableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 33\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"rup-jqtable-detail-info\\\">\\r\\n  <i class=\\\"mdi mdi-view-list\\\" aria-hidden=\\\"true\\\" title=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"resultNumText\") || (depth0 != null ? lookupProperty(depth0, \"resultNumText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"resultNumText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 57\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 74\n          }\n        }\n      }) : helper)) + \"\\\"></i>\\r\\n  <span id=\\\"rup_jqtable_selectedElements_\" + alias4((helper = (helper = lookupProperty(helpers, \"jqtableId\") || (depth0 != null ? lookupProperty(depth0, \"jqtableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"jqtableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 41\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 54\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"rup-jqtable-detail-currentElement\\\" >\\r\\n    \" + alias4((helper = (helper = lookupProperty(helpers, \"numResult\") || (depth0 != null ? lookupProperty(depth0, \"numResult\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"numResult\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 4\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 17\n          }\n        }\n      }) : helper)) + \"\\r\\n  </span>\\r\\n</div>\\r\\n<div id=\\\"pag_\" + alias4((helper = (helper = lookupProperty(helpers, \"jqtableId\") || (depth0 != null ? lookupProperty(depth0, \"jqtableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"jqtableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 7,\n            \"column\": 26\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"rup-jqtable-detail-navigation\\\">\\r\\n    <button type=\\\"button\\\" id=\\\"first_\" + alias4((helper = (helper = lookupProperty(helpers, \"jqtableId\") || (depth0 != null ? lookupProperty(depth0, \"jqtableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"jqtableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 36\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 49\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelFirst\") || (depth0 != null ? lookupProperty(depth0, \"labelFirst\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelFirst\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 88\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 102\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelFirst\") || (depth0 != null ? lookupProperty(depth0, \"labelFirst\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelFirst\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 104\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 118\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"back_\" + alias4((helper = (helper = lookupProperty(helpers, \"jqtableId\") || (depth0 != null ? lookupProperty(depth0, \"jqtableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"jqtableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 35\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 48\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelPrev\") || (depth0 != null ? lookupProperty(depth0, \"labelPrev\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelPrev\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 87\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 100\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelPrev\") || (depth0 != null ? lookupProperty(depth0, \"labelPrev\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelPrev\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 102\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 115\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"forward_\" + alias4((helper = (helper = lookupProperty(helpers, \"jqtableId\") || (depth0 != null ? lookupProperty(depth0, \"jqtableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"jqtableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 38\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 51\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelNext\") || (depth0 != null ? lookupProperty(depth0, \"labelNext\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelNext\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 90\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 103\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelNext\") || (depth0 != null ? lookupProperty(depth0, \"labelNext\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelNext\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 105\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 118\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"last_\" + alias4((helper = (helper = lookupProperty(helpers, \"jqtableId\") || (depth0 != null ? lookupProperty(depth0, \"jqtableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"jqtableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 35\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 48\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelLast\") || (depth0 != null ? lookupProperty(depth0, \"labelLast\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelLast\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 87\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 100\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelLast\") || (depth0 != null ? lookupProperty(depth0, \"labelLast\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelLast\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 102\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 115\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n  </div>\\r\\n  <div class=\\\"rup-jqtable-detail-separator separador\\\"></div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"pager\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"pager\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"pager\"][\"bootstrap\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"\\r\\n  <div id=\\\"pg_\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 14\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 20\n          }\n        }\n      }) : helper)) + \"_pager\\\" class=\\\"ui-pager-control rup_jqtable_pager\\\" role=\\\"group\\\">\\r\\n    <div id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"idPager\") || (depth0 != null ? lookupProperty(depth0, \"idPager\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"idPager\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 24\n          }\n        }\n      }) : helper)) + \"_left\\\" class=\\\"pager_left\\\"></div>\\r\\n    <div id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"idPager\") || (depth0 != null ? lookupProperty(depth0, \"idPager\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"idPager\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 24\n          }\n        }\n      }) : helper)) + \"_center\\\" class=\\\"pager_center\\\">\\r\\n      <div id=\\\"first_\" + alias4((helper = (helper = lookupProperty(helpers, \"idPager\") || (depth0 != null ? lookupProperty(depth0, \"idPager\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"idPager\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 5,\n            \"column\": 21\n          },\n          \"end\": {\n            \"line\": 5,\n            \"column\": 32\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n        <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"firstPageText\") || (depth0 != null ? lookupProperty(depth0, \"firstPageText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"firstPageText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 60\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 77\n          }\n        }\n      }) : helper)) + \"</a>\\r\\n      </div>\\r\\n      <div id=\\\"prev_\" + alias4((helper = (helper = lookupProperty(helpers, \"idPager\") || (depth0 != null ? lookupProperty(depth0, \"idPager\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"idPager\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 31\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n        <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"prevPageText\") || (depth0 != null ? lookupProperty(depth0, \"prevPageText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"prevPageText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 60\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 76\n          }\n        }\n      }) : helper)) + \"</a>\\r\\n      </div>\\r\\n      <div id=\\\"next_\" + alias4((helper = (helper = lookupProperty(helpers, \"idPager\") || (depth0 != null ? lookupProperty(depth0, \"idPager\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"idPager\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 31\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n        <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"nextPageText\") || (depth0 != null ? lookupProperty(depth0, \"nextPageText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"nextPageText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 12,\n            \"column\": 60\n          },\n          \"end\": {\n            \"line\": 12,\n            \"column\": 76\n          }\n        }\n      }) : helper)) + \"</a>\\r\\n      </div>\\r\\n      <div id=\\\"last_\" + alias4((helper = (helper = lookupProperty(helpers, \"idPager\") || (depth0 != null ? lookupProperty(depth0, \"idPager\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"idPager\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 14,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 14,\n            \"column\": 31\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n        <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"lastPageText\") || (depth0 != null ? lookupProperty(depth0, \"lastPageText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"lastPageText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 15,\n            \"column\": 60\n          },\n          \"end\": {\n            \"line\": 15,\n            \"column\": 76\n          }\n        }\n      }) : helper)) + \"</a>\\r\\n      </div>\\r\\n\\r\\n    </div>\\r\\n    <div id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"table_pager\") || (depth0 != null ? lookupProperty(depth0, \"table_pager\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"table_pager\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 19,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 19,\n            \"column\": 28\n          }\n        }\n      }) : helper)) + \"_right\\\" class=\\\"pager_right\\\">\\r\\n      <div class=\\\"ui-paging-info\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"resultText\") || (depth0 != null ? lookupProperty(depth0, \"resultText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"resultText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 20,\n            \"column\": 34\n          },\n          \"end\": {\n            \"line\": 20,\n            \"column\": 48\n          }\n        }\n      }) : helper)) + \"</div>\\r\\n    </div>\\r\\n  </div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"pager\"][\"jqueryui\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      return \"<div id=\\\"table_pager\\\" class=\\\"ui-state-default ui-jqgrid-pager ui-corner-bottom\\\" dir=\\\"ltr\\\" style=\\\"width: 100%; height: auto;\\\">\\r\\n  <div id=\\\"pg_table_pager\\\" class=\\\"ui-pager-control\\\" role=\\\"group\\\">\\r\\n    <table cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" border=\\\"0\\\" class=\\\"ui-pg-table\\\" style=\\\"width:100%;table-layout:fixed;height:100%;\\\" role=\\\"row\\\">\\r\\n      <tbody>\\r\\n        <tr>\\r\\n          <td id=\\\"table_pager_left\\\" align=\\\"left\\\" class=\\\"pager_left\\\"></td>\\r\\n          <td id=\\\"table_pager_center\\\" align=\\\"center\\\" style=\\\"white-space: pre; width: 305px;\\\" class=\\\"pager_center\\\">\\r\\n            <table cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" border=\\\"0\\\" style=\\\"table-layout:auto;\\\" class=\\\"ui-pg-table\\\">\\r\\n              <tbody>\\r\\n                <tr>\\r\\n                  <td id=\\\"first_table_pager\\\" class=\\\"ui-corner-all pagControls ui-state-disabled\\\">\\r\\n                    <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">Primera Página</a>\\r\\n                  </td>\\r\\n                  <td id=\\\"prev_table_pager\\\" class=\\\"ui-corner-all pagControls ui-state-disabled\\\">\\r\\n                    <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">Anterior</a>\\r\\n                  </td>\\r\\n                  <td class=\\\"ui-pg-button ui-state-disabled pagControls\\\" style=\\\"width:4px;\\\">\\r\\n                    <span class=\\\"ui-separator\\\"></span>\\r\\n                  </td>\\r\\n                  <td dir=\\\"ltr\\\" class=\\\"pagControls\\\">\\r\\n                    Página\\r\\n                    <input class=\\\"ui-pg-input\\\" type=\\\"text\\\" size=\\\"2\\\" maxlength=\\\"7\\\" value=\\\"0\\\" role=\\\"textbox\\\" data-hasqtip=\\\"1\\\" oldtitle=\\\"Página actual\\\" title=\\\"\\\" aria-describedby=\\\"qtip-1\\\"> de <span id=\\\"sp_1_table_pager\\\">100</span>\\r\\n                  </td>\\r\\n                  <td class=\\\"ui-pg-button ui-state-disabled pagControls\\\" style=\\\"width:4px;\\\">\\r\\n                    <span class=\\\"ui-separator\\\"></span>\\r\\n                  </td>\\r\\n                  <td id=\\\"next_table_pager\\\" class=\\\"ui-corner-all pagControls\\\">\\r\\n                    <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">Siguiente</a>\\r\\n                  </td>\\r\\n                  <td id=\\\"last_table_pager\\\" class=\\\"ui-corner-all pagControls\\\">\\r\\n                    <a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">Última Página</a>\\r\\n                  </td>\\r\\n                  <td dir=\\\"ltr\\\" class=\\\"pagControls\\\">\\r\\n                    <select class=\\\"ui-pg-selbox\\\" role=\\\"listbox\\\" data-hasqtip=\\\"0\\\" oldtitle=\\\"Número de elementos por página\\\" title=\\\"\\\" aria-describedby=\\\"qtip-0\\\">\\r\\n                      <option role=\\\"option\\\" value=\\\"10\\\" selected=\\\"selected\\\">10</option>\\r\\n                      <option role=\\\"option\\\" value=\\\"20\\\">20</option>\\r\\n                      <option role=\\\"option\\\" value=\\\"30\\\">30</option>\\r\\n                    </select>\\r\\n                  </td>\\r\\n                </tr>\\r\\n              </tbody>\\r\\n            </table>\\r\\n          </td>\\r\\n          <td id=\\\"table_pager_right\\\" align=\\\"right\\\" class=\\\"pager_right\\\">\\r\\n            <div dir=\\\"ltr\\\" style=\\\"text-align:right\\\" class=\\\"ui-paging-info\\\">Mostrando 1 - 10 de 1.000</div>\\r\\n          </td>\\r\\n        </tr>\\r\\n      </tbody>\\r\\n    </table>\\r\\n  </div>\\r\\n</div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"pager\"][\"link\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"pager\"][\"link\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"jqtable\"][\"pager\"][\"link\"][\"bootstrap\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 52\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 61\n          }\n        }\n      }) : helper)) + \"</a>\\r\\n<i class=\\\"iconPaginacion \" + alias4((helper = (helper = lookupProperty(helpers, \"icon\") || (depth0 != null ? lookupProperty(depth0, \"icon\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"icon\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 25\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 33\n          }\n        }\n      }) : helper)) + \"\\\"></i></td>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"detail\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"detail\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"detail\"][\"navigation\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"detail\"][\"navigation\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"detail\"][\"navigation\"][\"bootstrap\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\\\"pagination_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 31\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"col-sm-4 text-center text-sm-left\\\">\\r\\n  \t<i class=\\\"mdi mdi-view-list\\\" aria-hidden=\\\"true\\\" title=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"resultNumText\") || (depth0 != null ? lookupProperty(depth0, \"resultNumText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"resultNumText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 58\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 75\n          }\n        }\n      }) : helper)) + \"\\\"></i>\\r\\n  \t<span id=\\\"rup_table_selectedElements_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 40\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 51\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"ml-1\\\" >\\r\\n    \t\" + alias4((helper = (helper = lookupProperty(helpers, \"resultNumText\") || (depth0 != null ? lookupProperty(depth0, \"resultNumText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"resultNumText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 5\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 22\n          }\n        }\n      }) : helper)) + \"\\r\\n  \t</span>\\r\\n</div>\\r\\n<div id=\\\"pag_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 7,\n            \"column\": 24\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"col-sm-8 text-center text-sm-right mt-3 mt-sm-0\\\">\\r\\n    <button type=\\\"button\\\" id=\\\"first_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 36\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 47\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelFirst\") || (depth0 != null ? lookupProperty(depth0, \"labelFirst\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelFirst\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 86\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 100\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelFirst\") || (depth0 != null ? lookupProperty(depth0, \"labelFirst\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelFirst\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 102\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 116\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"back_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 35\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelPrev\") || (depth0 != null ? lookupProperty(depth0, \"labelPrev\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelPrev\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 85\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 98\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelPrev\") || (depth0 != null ? lookupProperty(depth0, \"labelPrev\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelPrev\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 100\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 113\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"forward_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 38\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 49\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelNext\") || (depth0 != null ? lookupProperty(depth0, \"labelNext\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelNext\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 88\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 101\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelNext\") || (depth0 != null ? lookupProperty(depth0, \"labelNext\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelNext\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 103\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 116\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"last_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 35\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-sm btn-outline-dark\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelLast\") || (depth0 != null ? lookupProperty(depth0, \"labelLast\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelLast\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 85\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 98\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelLast\") || (depth0 != null ? lookupProperty(depth0, \"labelLast\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelLast\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 100\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 113\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n</div>\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"detail\"][\"navigation\"][\"material\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\\\"pagination_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 31\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"col-sm-4 text-center text-sm-left\\\">\\r\\n\t<i class=\\\"mdi mdi-view-list\\\" aria-hidden=\\\"true\\\" title=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"resultNumText\") || (depth0 != null ? lookupProperty(depth0, \"resultNumText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"resultNumText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 56\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 73\n          }\n        }\n      }) : helper)) + \"\\\"></i>\\r\\n  \t<span id=\\\"rup_table_selectedElements_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 40\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 51\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"ml-1\\\" >\\r\\n    \t\" + alias4((helper = (helper = lookupProperty(helpers, \"resultNumText\") || (depth0 != null ? lookupProperty(depth0, \"resultNumText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"resultNumText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 5\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 22\n          }\n        }\n      }) : helper)) + \"\\r\\n  \t</span>\\r\\n</div>\\r\\n<div id=\\\"pag_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 7,\n            \"column\": 24\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"col-sm-8 text-center text-sm-right mt-3 mt-sm-0\\\">\\r\\n    <button type=\\\"button\\\" id=\\\"first_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 36\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 47\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-material btn-material-sm btn-material-secondary-low-emphasis\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelFirst\") || (depth0 != null ? lookupProperty(depth0, \"labelFirst\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelFirst\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 127\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 141\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelFirst\") || (depth0 != null ? lookupProperty(depth0, \"labelFirst\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelFirst\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 143\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 157\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"back_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 35\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-material btn-material-sm btn-material-secondary-low-emphasis\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelPrev\") || (depth0 != null ? lookupProperty(depth0, \"labelPrev\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelPrev\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 126\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 139\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelPrev\") || (depth0 != null ? lookupProperty(depth0, \"labelPrev\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelPrev\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 141\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 154\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"forward_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 38\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 49\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-material btn-material-sm btn-material-secondary-low-emphasis\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelNext\") || (depth0 != null ? lookupProperty(depth0, \"labelNext\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelNext\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 129\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 142\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelNext\") || (depth0 != null ? lookupProperty(depth0, \"labelNext\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelNext\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 144\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 157\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n    <button type=\\\"button\\\" id=\\\"last_\" + alias4((helper = (helper = lookupProperty(helpers, \"tableId\") || (depth0 != null ? lookupProperty(depth0, \"tableId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"tableId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 35\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-material btn-material-sm btn-material-secondary-low-emphasis\\\" alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"labelLast\") || (depth0 != null ? lookupProperty(depth0, \"labelLast\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelLast\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 126\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 139\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"labelLast\") || (depth0 != null ? lookupProperty(depth0, \"labelLast\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"labelLast\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 141\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 154\n          }\n        }\n      }) : helper)) + \"</button>\\r\\n</div>\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"pager\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"pager\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"pager\"][\"link\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"pager\"][\"link\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"pager\"][\"link\"][\"bootstrap\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<a href=\\\"javascript:void(0)\\\" class=\\\"linkPaginacion\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 52\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 61\n          }\n        }\n      }) : helper)) + \"</a>\\r\\n<i class=\\\"iconPaginacion \" + alias4((helper = (helper = lookupProperty(helpers, \"icon\") || (depth0 != null ? lookupProperty(depth0, \"icon\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"icon\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 25\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 33\n          }\n        }\n      }) : helper)) + \"\\\"></i></td>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"table\"][\"pager\"][\"link\"][\"material\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<button type=\\\"button\\\" class=\\\"btn-material btn-material-sm btn-material-secondary-low-emphasis\\\">\\r\\n\t<i class=\\\"iconPaginacion \" + alias4((helper = (helper = lookupProperty(helpers, \"icon\") || (depth0 != null ? lookupProperty(depth0, \"icon\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"icon\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 26\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 34\n          }\n        }\n      }) : helper)) + \"\\\"></i>\\r\\n\t<span>\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 7\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 16\n          }\n        }\n      }) : helper)) + \"<span>\\r\\n</button>\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"tabs\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"tabs\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"tabs\"][\"container\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      return \"<ul>\\r\\n\\r\\n</ul>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"tabs\"][\"subtab\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\" + alias4((helper = (helper = lookupProperty(helpers, \"rupRandomLayerId\") || (depth0 != null ? lookupProperty(depth0, \"rupRandomLayerId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"rupRandomLayerId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 8\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 28\n          }\n        }\n      }) : helper)) + \" class=\\\"rupRandomLayerId ssss\\\">\\r\\n  <div id=\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 16\n          }\n        }\n      }) : helper)) + \" actualTab=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"actualTab\") || (depth0 != null ? lookupProperty(depth0, \"actualTab\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"actualTab\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 28\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 41\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n\\r\\n  </div>\\r\\n</div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"tabs\"][\"tab\"] = Handlebars.template({\n    \"1\": function _(container, depth0, helpers, partials, data) {\n      return \"        <span class=\\\"ui-icon ui-icon-close\\\" role=\\\"presentation\\\">Remove Tab</span>\\r\\n\";\n    },\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var stack1,\n          helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<li>\\r\\n  <a  id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 16\n          }\n        }\n      }) : helper)) + \"\\\"\\r\\n      href=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"href\") || (depth0 != null ? lookupProperty(depth0, \"href\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"href\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 12\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 20\n          }\n        }\n      }) : helper)) + \"\\\"\\r\\n      rupLevel=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"rupLevel\") || (depth0 != null ? lookupProperty(depth0, \"rupLevel\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"rupLevel\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 16\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 28\n          }\n        }\n      }) : helper)) + \"\\\"\\r\\n      title=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"title\") || (depth0 != null ? lookupProperty(depth0, \"title\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"title\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 5,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 5,\n            \"column\": 22\n          }\n        }\n      }) : helper)) + \"\\\"\\r\\n      alt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"alt\") || (depth0 != null ? lookupProperty(depth0, \"alt\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"alt\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 11\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 18\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n\\r\\n      <div class=\\\"rup-tabs_title\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 34\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 43\n          }\n        }\n      }) : helper)) + \"</div>\\r\\n      <span class=\\\"rup-tabs_loading\\\"> </span>\\r\\n\" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"btnClose\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(1, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 6\n          },\n          \"end\": {\n            \"line\": 12,\n            \"column\": 13\n          }\n        }\n      })) != null ? stack1 : \"\") + \"  </a>\\r\\n\\r\\n</li>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"button\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"button\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"button\"][\"bootstrap\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"\\r\\n<button type=\\\"button\\\" id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 26\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 32\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"rup-button\\\">\\r\\n\t\t<i class=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"css\") || (depth0 != null ? lookupProperty(depth0, \"css\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"css\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 12\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 19\n          }\n        }\n      }) : helper)) + \"\\\" aria-hidden=\\\"true\\\"></i>\\r\\n    <span class=\\\"rup-ui-button-text\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 37\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"</span>\\r\\n</button>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"button\"][\"jqueryui\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<button id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 12\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 18\n          }\n        }\n      }) : helper)) + \"\\\" type=\\\"button\\\" class=\\\"rup-toolbar_button\\\">\\r\\n    <span class=\\\"ui-button-icon ui-icon \" + alias4((helper = (helper = lookupProperty(helpers, \"css\") || (depth0 != null ? lookupProperty(depth0, \"css\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"css\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 40\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 47\n          }\n        }\n      }) : helper)) + \"\\\"></span>\\r\\n    <span class=\\\"ui-button-icon-space\\\"> </span>\\r\\n    <span class=\\\"rup-ui-button-text\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 37\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"</span>\\r\\n</button>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"button\"][\"material\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"\\r\\n<button type=\\\"button\\\" id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 26\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 32\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"btn-material btn-material-primary-high-emphasis rup-button\\\">\\r\\n\t<i class=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"css\") || (depth0 != null ? lookupProperty(depth0, \"css\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"css\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 11\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 18\n          }\n        }\n      }) : helper)) + \"\\\" aria-hidden=\\\"true\\\"></i>\\r\\n    <span class=\\\"rup-ui-button-text\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 37\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"</span>\\r\\n</button>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"mbutton\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"mbutton\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"mbutton\"][\"bootstrap\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 9\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 15\n          }\n        }\n      }) : helper)) + \"-mbutton-group\\\" class=\\\"rup-mbutton \" + alias4((helper = (helper = lookupProperty(helpers, \"groupClasses\") || (depth0 != null ? lookupProperty(depth0, \"groupClasses\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"groupClasses\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 50\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 66\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n\t\t<button type=\\\"button\\\" data-mbutton=\\\"true\\\" id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 48\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 54\n          }\n        }\n      }) : helper)) + \"\\\" data-mbutton=\\\"true\\\" class=\\\"ui-button ui-corner-all ui-widget rup-button\\\">\\r\\n\t\t\t<i class=\\\"mdi mdi-settings\\\" aria-hidden=\\\"true\\\"></i>\\r\\n\t\t\t<span class=\\\"rup-ui-button-text\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 36\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 45\n          }\n        }\n      }) : helper)) + \"</span>\\r\\n\t\t</button>\\r\\n\t\t<ul id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 16\n          }\n        }\n      }) : helper)) + \"-mbutton-container\\\" class=\\\"rup-mbutton-container\\\" aria-labelledby=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 83\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 89\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n\\r\\n\t\t</ul>\\r\\n</div>\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"toolbar\"][\"mbutton\"][\"material\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 9\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 15\n          }\n        }\n      }) : helper)) + \"-mbutton-group\\\" class=\\\"rup-mbutton \" + alias4((helper = (helper = lookupProperty(helpers, \"groupClasses\") || (depth0 != null ? lookupProperty(depth0, \"groupClasses\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"groupClasses\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 50\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 66\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n\t\t<button type=\\\"button\\\" data-mbutton=\\\"true\\\" id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 48\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 54\n          }\n        }\n      }) : helper)) + \"\\\" data-mbutton=\\\"true\\\" class=\\\"btn-material btn-material-primary-high-emphasis rup-button\\\">\\r\\n\t\t\t<i class=\\\"mdi mdi-settings\\\" aria-hidden=\\\"true\\\"></i>\\r\\n\t\t\t<span class=\\\"rup-ui-button-text\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"label\") || (depth0 != null ? lookupProperty(depth0, \"label\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"label\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 36\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 45\n          }\n        }\n      }) : helper)) + \"</span>\\r\\n\t\t</button>\\r\\n\t\t<ul id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 16\n          }\n        }\n      }) : helper)) + \"-mbutton-container\\\" class=\\\"rup-mbutton-container\\\" aria-labelledby=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"id\") || (depth0 != null ? lookupProperty(depth0, \"id\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"id\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 83\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 89\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n\\r\\n\t\t</ul>\\r\\n</div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"upload\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"upload\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"upload\"][\"downloadTemplate\"] = Handlebars.template({\n    \"1\": function _(container, depth0, helpers, partials, data) {\n      var stack1,\n          helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"    <li class=\\\"list-group-item template-download \" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"error\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(2, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 49\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 74\n          }\n        }\n      })) != null ? stack1 : \"\") + \"\\\">\\r\\n      <div class=\\\"row\\\">\\r\\n\\r\\n\\r\\n          <div class=\\\"col-xs-6 col-md-3\\\">\\r\\n            <p class=\\\"name text-xs-left\\\"><b>\" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"error\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(4, data, 0),\n        \"inverse\": container.program(6, data, 0),\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 44\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 110\n          }\n        }\n      })) != null ? stack1 : \"\") + \"</b></p>\\r\\n            <span class=\\\"name text-xs-left\\\"><span class=\\\"type\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"type\") || (depth0 != null ? lookupProperty(depth0, \"type\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"type\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 63\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 71\n          }\n        }\n      }) : helper)) + \"</span></span>\\r\\n\\r\\n            <p class=\\\"name text-xs-left error-text error\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"error\") || (depth0 != null ? lookupProperty(depth0, \"error\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"error\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 12,\n            \"column\": 58\n          },\n          \"end\": {\n            \"line\": 12,\n            \"column\": 67\n          }\n        }\n      }) : helper)) + \"</p>\\r\\n\\r\\n          </div>\\r\\n\\r\\n\" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"error\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(8, data, 0),\n        \"inverse\": container.program(10, data, 0),\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 16,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 31,\n            \"column\": 15\n          }\n        }\n      })) != null ? stack1 : \"\") + \"      </div>\\r\\n    </li>\\r\\n\";\n    },\n    \"2\": function _(container, depth0, helpers, partials, data) {\n      return \"error\";\n    },\n    \"4\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return container.escapeExpression((helper = (helper = lookupProperty(helpers, \"name\") || (depth0 != null ? lookupProperty(depth0, \"name\") : depth0)) != null ? helper : container.hooks.helperMissing, typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, {\n        \"name\": \"name\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 57\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 65\n          }\n        }\n      }) : helper));\n    },\n    \"6\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<a href=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"url\") || (depth0 != null ? lookupProperty(depth0, \"url\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"url\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 82\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 89\n          }\n        }\n      }) : helper)) + \"\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"name\") || (depth0 != null ? lookupProperty(depth0, \"name\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"name\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 9,\n            \"column\": 91\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 99\n          }\n        }\n      }) : helper)) + \"</a>\";\n    },\n    \"8\": function _(container, depth0, helpers, partials, data) {\n      return \"\\r\\n\";\n    },\n    \"10\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"            <div class=\\\"col-xs-6 col-md-4 fileupload-buttonbar\\\">\\r\\n\t\t\t\t<a href=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"url\") || (depth0 != null ? lookupProperty(depth0, \"url\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"url\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 20,\n            \"column\": 13\n          },\n          \"end\": {\n            \"line\": 20,\n            \"column\": 20\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n               \t\t<span  class=\\\"btn-material btn-material-primary-high-emphasis download\\\">\\r\\n                \t\t<i class=\\\"mdi mdi-download\\\" aria-hidden=\\\"true\\\"></i>\\r\\n                \t\t<span>\" + alias4((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"rup_upload.openUploaded\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 23,\n            \"column\": 24\n          },\n          \"end\": {\n            \"line\": 23,\n            \"column\": 58\n          }\n        }\n      })) + \"</span>\\r\\n                \t</span>\\r\\n                </a>\\r\\n                <span class=\\\"btn-material btn-material-secondary-high-emphasis delete\\\" data-type=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"delete_type\") || (depth0 != null ? lookupProperty(depth0, \"delete_type\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"delete_type\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 26,\n            \"column\": 98\n          },\n          \"end\": {\n            \"line\": 26,\n            \"column\": 113\n          }\n        }\n      }) : helper)) + \"\\\" data-url=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"delete_url\") || (depth0 != null ? lookupProperty(depth0, \"delete_url\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"delete_url\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 26,\n            \"column\": 125\n          },\n          \"end\": {\n            \"line\": 26,\n            \"column\": 139\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n                \t<i class=\\\"mdi mdi-delete\\\" aria-hidden=\\\"true\\\"></i>\\r\\n                \t<span>\" + alias4((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"rup_upload.deleteUploaded\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 28,\n            \"column\": 23\n          },\n          \"end\": {\n            \"line\": 28,\n            \"column\": 59\n          }\n        }\n      })) + \"</span>\\r\\n                </span>\\r\\n            </div>\\r\\n\";\n    },\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var stack1,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"\\r\\n\\r\\n\" + ((stack1 = lookupProperty(helpers, \"each\").call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? lookupProperty(depth0, \"files\") : depth0, {\n        \"name\": \"each\",\n        \"hash\": {},\n        \"fn\": container.program(1, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 2\n          },\n          \"end\": {\n            \"line\": 34,\n            \"column\": 11\n          }\n        }\n      })) != null ? stack1 : \"\");\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"upload\"][\"uploadTemplate\"] = Handlebars.template({\n    \"1\": function _(container, depth0, helpers, partials, data, blockParams, depths) {\n      var stack1,\n          helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"    <li class=\\\"list-group-item template-upload\\\">\\r\\n      <div class=\\\"row\\\">\\r\\n        <div class=\\\"col-xs-6 col-md-3\\\">\\r\\n          <p class=\\\"name text-xs-left\\\"><b>\" + alias4((helper = (helper = lookupProperty(helpers, \"name\") || (depth0 != null ? lookupProperty(depth0, \"name\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"name\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 42\n          },\n          \"end\": {\n            \"line\": 7,\n            \"column\": 50\n          }\n        }\n      }) : helper)) + \"</b></p>\\r\\n          <span class=\\\"name text-xs-left\\\"><span class=\\\"type-text type\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"type\") || (depth0 != null ? lookupProperty(depth0, \"type\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"type\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 71\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 79\n          }\n        }\n      }) : helper)) + \"</span><span class=\\\"name text-xs-left size-text size\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"size\") || (depth0 != null ? lookupProperty(depth0, \"size\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"size\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 133\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 141\n          }\n        }\n      }) : helper)) + \"</span></span>\\r\\n          <p class=\\\"name text-xs-left error-text error\\\"></p>\\r\\n\\r\\n\\r\\n        </div>\\r\\n\\r\\n        <div class=\\\"col-xs-6 col-md-4 fileupload-buttonbar\\\">\\r\\n\" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depths[1] != null ? lookupProperty(depths[1], \"notSubmitInForm\") : depths[1], {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(2, data, 0, blockParams, depths),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 15,\n            \"column\": 12\n          },\n          \"end\": {\n            \"line\": 21,\n            \"column\": 19\n          }\n        }\n      })) != null ? stack1 : \"\") + \"\\r\\n                <button class=\\\"btn-material btn-material-secondary-high-emphasis cancel\\\">\\r\\n                    <i class=\\\"mdi mdi-close-circle\\\" aria-hidden=\\\"true\\\"></i>\\r\\n                    <span>\" + alias4((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"rup_upload.cancelUpload\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 25,\n            \"column\": 26\n          },\n          \"end\": {\n            \"line\": 25,\n            \"column\": 60\n          }\n        }\n      })) + \"</span>\\r\\n                </button>\\r\\n        </div>\\r\\n\\r\\n      </div>\\r\\n\\r\\n    </li>\\r\\n\";\n    },\n    \"2\": function _(container, depth0, helpers, partials, data) {\n      var lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"                <button class=\\\"btn-material btn-material-primary-high-emphasis start\\\" disabled=\\\"true\\\">\\r\\n                    <i class=\\\"mdi mdi-upload\\\" aria-hidden=\\\"true\\\"></i>\\r\\n                    <span>\" + container.escapeExpression((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || container.hooks.helperMissing).call(depth0 != null ? depth0 : container.nullContext || {}, \"rup_upload.startUpload\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 18,\n            \"column\": 26\n          },\n          \"end\": {\n            \"line\": 18,\n            \"column\": 59\n          }\n        }\n      })) + \"</span>\\r\\n                </button>\\r\\n\\r\\n\";\n    },\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data, blockParams, depths) {\n      var stack1,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"\\r\\n\\r\\n\" + ((stack1 = lookupProperty(helpers, \"each\").call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? lookupProperty(depth0, \"files\") : depth0, {\n        \"name\": \"each\",\n        \"hash\": {},\n        \"fn\": container.program(1, data, 0, blockParams, depths),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 2\n          },\n          \"end\": {\n            \"line\": 32,\n            \"column\": 11\n          }\n        }\n      })) != null ? stack1 : \"\");\n    },\n    \"useData\": true,\n    \"useDepths\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"] = this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"] || {};\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"][\"base\"] = Handlebars.template({\n    \"1\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"          <span id=\\\"widgetClose-\" + alias3((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, typeof helper === \"function\" ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 32\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 40\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"widget-icon widget-icon-right mdi mdi-delete\\\" data-toggle=\\\"tooltip\\\" data-placement=\\\"top\\\" title=\\\"\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.eliminar\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 145\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 170\n          }\n        }\n      })) + \"\\\"></span>\\r\\n\";\n    },\n    \"3\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"          <span id=\\\"widgetReload-\" + alias3((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, typeof helper === \"function\" ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 33\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 41\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"widget-icon widget-icon-right mdi mdi-refresh\\\" data-toggle=\\\"tooltip\\\" data-placement=\\\"top\\\" title=\\\"\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.refrescar\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 147\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 173\n          }\n        }\n      })) + \"\\\"></span>\\r\\n\";\n    },\n    \"5\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"          <span id=\\\"widgetResizeFull-\" + alias3((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, typeof helper === \"function\" ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 14,\n            \"column\": 37\n          },\n          \"end\": {\n            \"line\": 14,\n            \"column\": 45\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"widget-icon widget-icon-right mdi mdi-window-maximize\\\" data-toggle=\\\"tooltip\\\" data-placement=\\\"top\\\" title=\\\"\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.maximizar\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 14,\n            \"column\": 159\n          },\n          \"end\": {\n            \"line\": 14,\n            \"column\": 185\n          }\n        }\n      })) + \"\\\"></span>\\r\\n\";\n    },\n    \"7\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"          <span id=\\\"widgetConfig-\" + alias3((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, typeof helper === \"function\" ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 18,\n            \"column\": 33\n          },\n          \"end\": {\n            \"line\": 18,\n            \"column\": 41\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"widget-icon widget-icon-right mdi mdi-settings\\\" data-toggle=\\\"tooltip\\\" data-placement=\\\"top\\\" title=\\\"\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.configuracion\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 18,\n            \"column\": 148\n          },\n          \"end\": {\n            \"line\": 18,\n            \"column\": 178\n          }\n        }\n      })) + \"\\\" ></span>\\r\\n\";\n    },\n    \"9\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"          <span id=\\\"widgetInfo-\" + alias4((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 21,\n            \"column\": 31\n          },\n          \"end\": {\n            \"line\": 21,\n            \"column\": 39\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"widget-icon widget-icon-right mdi mdi-comment-question-outline\\\" data-toggle=\\\"tooltip\\\" data-placement=\\\"bottom\\\" title=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"infoTextNew\") || (depth0 != null ? lookupProperty(depth0, \"infoTextNew\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"infoTextNew\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 21,\n            \"column\": 165\n          },\n          \"end\": {\n            \"line\": 21,\n            \"column\": 180\n          }\n        }\n      }) : helper)) + \"\\\" tttt=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"infoText\") || (depth0 != null ? lookupProperty(depth0, \"infoText\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"infoText\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 21,\n            \"column\": 188\n          },\n          \"end\": {\n            \"line\": 21,\n            \"column\": 200\n          }\n        }\n      }) : helper)) + \"\\\"></span>\\r\\n\";\n    },\n    \"11\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"          <span id=\\\"widgetShow-\" + alias3((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, typeof helper === \"function\" ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 24,\n            \"column\": 31\n          },\n          \"end\": {\n            \"line\": 24,\n            \"column\": 39\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"widget-icon widget-icon-right mdi mdi-toggle-switch\\\" data-toggle=\\\"tooltip\\\" data-placement=\\\"top\\\" title=\\\"\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.mostrarOcultar\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 24,\n            \"column\": 151\n          },\n          \"end\": {\n            \"line\": 24,\n            \"column\": 182\n          }\n        }\n      })) + \"\\\"></span>\\r\\n\";\n    },\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var stack1,\n          helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div class=\\\"widget rssBottom\\\" id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 34\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 42\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n    <div class=\\\"widget-header\\\">\\r\\n        <div>\\r\\n          <span class=\\\"widget-header-title\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"title\") || (depth0 != null ? lookupProperty(depth0, \"title\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"title\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 44\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 53\n          }\n        }\n      }) : helper)) + \"</span>\\r\\n        </div>\\r\\n        <div class=\\\"widget-header-controls\\\">\\r\\n\" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, (stack1 = depth0 != null ? lookupProperty(depth0, \"buttons\") : depth0) != null ? lookupProperty(stack1, \"btnClose\") : stack1, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(1, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 17\n          }\n        }\n      })) != null ? stack1 : \"\") + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, (stack1 = depth0 != null ? lookupProperty(depth0, \"buttons\") : depth0) != null ? lookupProperty(stack1, \"btnReload\") : stack1, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(3, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 12,\n            \"column\": 17\n          }\n        }\n      })) != null ? stack1 : \"\") + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, (stack1 = depth0 != null ? lookupProperty(depth0, \"buttons\") : depth0) != null ? lookupProperty(stack1, \"btnResizeFull\") : stack1, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(5, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 13,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 15,\n            \"column\": 17\n          }\n        }\n      })) != null ? stack1 : \"\") + \"          <span id=\\\"widgetResizeSmall-\" + alias4((helper = (helper = lookupProperty(helpers, \"uuid\") || (depth0 != null ? lookupProperty(depth0, \"uuid\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"uuid\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 16,\n            \"column\": 38\n          },\n          \"end\": {\n            \"line\": 16,\n            \"column\": 46\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"widget-icon widget-icon-right mdi mdi-window-minimize\\\" data-toggle=\\\"tooltip\\\" data-placement=\\\"top\\\" title=\\\"\" + alias4((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.minimizar\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 16,\n            \"column\": 160\n          },\n          \"end\": {\n            \"line\": 16,\n            \"column\": 186\n          }\n        }\n      })) + \"\\\"></span>\\r\\n\" + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, (stack1 = depth0 != null ? lookupProperty(depth0, \"buttons\") : depth0) != null ? lookupProperty(stack1, \"btnConfig\") : stack1, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(7, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 17,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 19,\n            \"column\": 17\n          }\n        }\n      })) != null ? stack1 : \"\") + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"infoText\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(9, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 20,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 22,\n            \"column\": 17\n          }\n        }\n      })) != null ? stack1 : \"\") + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, (stack1 = depth0 != null ? lookupProperty(depth0, \"buttons\") : depth0) != null ? lookupProperty(stack1, \"btnShow\") : stack1, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(11, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 23,\n            \"column\": 10\n          },\n          \"end\": {\n            \"line\": 25,\n            \"column\": 17\n          }\n        }\n      })) != null ? stack1 : \"\") + \"        </div>\\r\\n    </div>\\r\\n    <div class=\\\"widget-feedback\\\">\\r\\n    </div>\\r\\n    <div class=\\\"widget-body\\\">\\r\\n\\r\\n    </div>\\r\\n</div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"][\"close\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      return \"\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"][\"configRequired\"] = Handlebars.template({\n    \"1\": function _(container, depth0, helpers, partials, data) {\n      var stack1,\n          helper,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<br/>\" + ((stack1 = (helper = (helper = lookupProperty(helpers, \"urlConsulta\") || (depth0 != null ? lookupProperty(depth0, \"urlConsulta\") : depth0)) != null ? helper : container.hooks.helperMissing, typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, {\n        \"name\": \"urlConsulta\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 52\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 69\n          }\n        }\n      }) : helper)) != null ? stack1 : \"\");\n    },\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var stack1,\n          helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<div id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"idModal\") || (depth0 != null ? lookupProperty(depth0, \"idModal\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"idModal\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 9\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 20\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"config-required-modal\\\">\\r\\n    <div>\\r\\n        <div>\\r\\n            <span>\" + alias4((helper = (helper = lookupProperty(helpers, \"titulo\") || (depth0 != null ? lookupProperty(depth0, \"titulo\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"titulo\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 18\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 28\n          }\n        }\n      }) : helper)) + ((stack1 = lookupProperty(helpers, \"if\").call(alias1, depth0 != null ? lookupProperty(depth0, \"urlConsulta\") : depth0, {\n        \"name\": \"if\",\n        \"hash\": {},\n        \"fn\": container.program(1, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 28\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 76\n          }\n        }\n      })) != null ? stack1 : \"\") + \"</span><br>\\r\\n            <button id=\\\"btnConfigRequired\\\" type=\\\"button\\\" class=\\\"btn-material btn-material-primary-high-emphasis\\\">\\r\\n                <span class=\\\"mdi mdi-settings\\\" aria-hidden=\\\"true\\\"></span>\" + alias4((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.configuracion\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 73\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 103\n          }\n        }\n      })) + \"</button>\\r\\n            <button id=\\\"btnDelete\\\" type=\\\"button\\\" class=\\\"btn-material btn-material-warning-dark-high-emphasis\\\">\\r\\n                <span class=\\\"mdi mdi-delete\\\" aria-hidden=\\\"true\\\"></span>\" + alias4((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"title.eliminar\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 8,\n            \"column\": 71\n          },\n          \"end\": {\n            \"line\": 8,\n            \"column\": 96\n          }\n        }\n      })) + \"</button>\\r\\n            \\r\\n        </div>\\r\\n    </div>\\r\\n</div>\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"][\"help\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"\\r\\n<p class=\\\"help_widget_intro\\\">\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"help.parrafo1\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 29\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 53\n          }\n        }\n      })) + \"</p>\\r\\n\\r\\n<div class=\\\"help_block add_widget_action\\\">\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"help.addWidget\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 5,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 5,\n            \"column\": 28\n          }\n        }\n      })) + \"</p>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"help.addWidgetText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 32\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\\r\\n<div class=\\\"help_block config_widget_action\\\">\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"help.configura\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 10,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 10,\n            \"column\": 28\n          }\n        }\n      })) + \"</p>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"help.configuraText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 32\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\\r\\n<div class=\\\"help_block help_widget_action\\\">\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"help.ayuda\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 15,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 15,\n            \"column\": 24\n          }\n        }\n      })) + \"</p>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"help.ayudaText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 16,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 16,\n            \"column\": 28\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"][\"rss\"] = Handlebars.template({\n    \"1\": function _(container, depth0, helpers, partials, data) {\n      var stack1,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"    <div class=\\\"list-group\\\">\\r\\n\" + ((stack1 = lookupProperty(helpers, \"each\").call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? lookupProperty(depth0, \"items\") : depth0, {\n        \"name\": \"each\",\n        \"hash\": {},\n        \"fn\": container.program(2, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 7\n          },\n          \"end\": {\n            \"line\": 9,\n            \"column\": 17\n          }\n        }\n      })) != null ? stack1 : \"\") + \"    </div>\\r\\n\";\n    },\n    \"2\": function _(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"          <a href=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"link\") || (depth0 != null ? lookupProperty(depth0, \"link\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"link\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 19\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 27\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"list-group-item\\\" data-source=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"source\") || (depth0 != null ? lookupProperty(depth0, \"source\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"source\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 66\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 76\n          }\n        }\n      }) : helper)) + \"\\\" data-url=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"link\") || (depth0 != null ? lookupProperty(depth0, \"link\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"link\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 88\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 96\n          }\n        }\n      }) : helper)) + \"\\\" data-comments=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"comments\") || (depth0 != null ? lookupProperty(depth0, \"comments\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"comments\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 113\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 125\n          }\n        }\n      }) : helper)) + \"\\\" target=\\\"_blank\\\">\\r\\n            <h5 class=\\\"list-group-item-heading\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"title\") || (depth0 != null ? lookupProperty(depth0, \"title\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"title\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 5,\n            \"column\": 48\n          },\n          \"end\": {\n            \"line\": 5,\n            \"column\": 57\n          }\n        }\n      }) : helper)) + \"</h5>\\r\\n            <p class=\\\"list-group-item-text\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"content\") || (depth0 != null ? lookupProperty(depth0, \"content\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"content\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 44\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 55\n          }\n        }\n      }) : helper)) + \"</p>\\r\\n            <p class=\\\"list-group-item-text\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"pubDate\") || (depth0 != null ? lookupProperty(depth0, \"pubDate\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"pubDate\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 44\n          },\n          \"end\": {\n            \"line\": 7,\n            \"column\": 55\n          }\n        }\n      }) : helper)) + \"</p>\\r\\n          </a>\\r\\n\";\n    },\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var stack1,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return ((stack1 = lookupProperty(helpers, \"each\").call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? lookupProperty(depth0, \"channel\") : depth0, {\n        \"name\": \"each\",\n        \"hash\": {},\n        \"fn\": container.program(1, data, 0),\n        \"inverse\": container.noop,\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 0\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 9\n          }\n        }\n      })) != null ? stack1 : \"\") + \"\\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"][\"search\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var helper,\n          alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = \"function\",\n          alias4 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<form>\\r\\n    <div class=\\\"form-group\\\">\\r\\n        <label for=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"fieldId\") || (depth0 != null ? lookupProperty(depth0, \"fieldId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"fieldId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 20\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 31\n          }\n        }\n      }) : helper)) + \"\\\" class=\\\"control-label\\\">\" + alias4((helper = (helper = lookupProperty(helpers, \"fieldLabel\") || (depth0 != null ? lookupProperty(depth0, \"fieldLabel\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"fieldLabel\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 3,\n            \"column\": 55\n          },\n          \"end\": {\n            \"line\": 3,\n            \"column\": 69\n          }\n        }\n      }) : helper)) + \"</label>\\r\\n        <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"fieldId\") || (depth0 != null ? lookupProperty(depth0, \"fieldId\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"fieldId\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 52\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 63\n          }\n        }\n      }) : helper)) + \"\\\" placeholder=\\\"\" + alias4((helper = (helper = lookupProperty(helpers, \"fieldPlaceholder\") || (depth0 != null ? lookupProperty(depth0, \"fieldPlaceholder\") : depth0)) != null ? helper : alias2, _typeof(helper) === alias3 ? helper.call(alias1, {\n        \"name\": \"fieldPlaceholder\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 4,\n            \"column\": 78\n          },\n          \"end\": {\n            \"line\": 4,\n            \"column\": 98\n          }\n        }\n      }) : helper)) + \"\\\">\\r\\n    </div>\\r\\n    <div class=\\\"form-group\\\">\\r\\n        <button type=\\\"button\\\" class=\\\"btn-material btn-material-primary-high-emphasis\\\">\\r\\n            <span class=\\\"mdi mdi-magnify\\\"></span>\\r\\n            Consultar</button>\\r\\n        <button type=\\\"button\\\" class=\\\"btn-material btn-material-primary-high-emphasis\\\">\\r\\n            <span class=\\\"mdi mdi-settings\\\"></span>\\r\\n            Tramitar</button>\\r\\n    </div>\\r\\n</form> \\r\\n\";\n    },\n    \"useData\": true\n  });\n  this[\"Rup\"][\"Templates\"][\"rup\"][\"widget\"][\"welcome\"] = Handlebars.template({\n    \"compiler\": [8, \">= 4.3.0\"],\n    \"main\": function main(container, depth0, helpers, partials, data) {\n      var alias1 = depth0 != null ? depth0 : container.nullContext || {},\n          alias2 = container.hooks.helperMissing,\n          alias3 = container.escapeExpression,\n          lookupProperty = container.lookupProperty || function (parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n\n        return undefined;\n      };\n\n      return \"<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.parrafo1\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 30\n          }\n        }\n      })) + \"</p>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.parrafo2\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 2,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 2,\n            \"column\": 30\n          }\n        }\n      })) + \"</p>\\r\\n\\r\\n\\r\\n<div class=\\\"help_herramienta bienvenida_1 noborder_widget\\\">\\r\\n<h2>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.seleccionActivo\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 6,\n            \"column\": 4\n          },\n          \"end\": {\n            \"line\": 6,\n            \"column\": 38\n          }\n        }\n      })) + \"</h2>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.seleccionActivoText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 7,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 7,\n            \"column\": 41\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\\r\\n<div class=\\\"help_herramienta bienvenida_2\\\">\\r\\n<h2>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.opcionConfiguracion\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 11,\n            \"column\": 4\n          },\n          \"end\": {\n            \"line\": 11,\n            \"column\": 42\n          }\n        }\n      })) + \"</h2>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.opcionConfiguracionText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 12,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 12,\n            \"column\": 45\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\\r\\n<div class=\\\"help_herramienta bienvenida_3\\\">\\r\\n<h2>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.addWidget\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 16,\n            \"column\": 4\n          },\n          \"end\": {\n            \"line\": 16,\n            \"column\": 32\n          }\n        }\n      })) + \"</h2>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.addWidgetText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 17,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 17,\n            \"column\": 35\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\\r\\n<div class=\\\"help_herramienta bienvenida_4\\\">\\r\\n<h2>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.accesoFamilias\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 21,\n            \"column\": 4\n          },\n          \"end\": {\n            \"line\": 21,\n            \"column\": 37\n          }\n        }\n      })) + \"</h2>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.accesoFamiliasText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 22,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 22,\n            \"column\": 40\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\\r\\n<div class=\\\"help_herramienta bienvenida_5\\\">\\r\\n<h2>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.herramientas\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 26,\n            \"column\": 4\n          },\n          \"end\": {\n            \"line\": 26,\n            \"column\": 35\n          }\n        }\n      })) + \"</h2>\\r\\n<p>\" + alias3((lookupProperty(helpers, \"i18n\") || depth0 && lookupProperty(depth0, \"i18n\") || alias2).call(alias1, \"welcome.herramientasText\", {\n        \"name\": \"i18n\",\n        \"hash\": {},\n        \"data\": data,\n        \"loc\": {\n          \"start\": {\n            \"line\": 27,\n            \"column\": 3\n          },\n          \"end\": {\n            \"line\": 27,\n            \"column\": 38\n          }\n        }\n      })) + \"</p>\\r\\n</div>\\r\\n\\r\\n\";\n    },\n    \"useData\": true\n  });\n  return this['Rup'];\n});\n\n//# sourceURL=webpack://rup/./src/templates.js?");

/***/ }),

/***/ 0:
/*!********************************************!*\
  !*** multi @babel/polyfill ./src/index.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("__webpack_require__(/*! @babel/polyfill */\"./node_modules/@babel/polyfill/lib/index.js\");\nmodule.exports = __webpack_require__(/*! C:\\aplic\\x21aVersiones\\4.x.x\\udaDemoApp\\udaRUP/src/index.js */\"./src/index.js\");\n\n\n//# sourceURL=webpack://rup/multi_@babel/polyfill_./src/index.js?");

/***/ })

/******/ });
});